diff options
Diffstat (limited to 'fs/yaffs2/yaffs_nand.c')
| -rw-r--r-- | fs/yaffs2/yaffs_nand.c | 148 | 
1 files changed, 67 insertions, 81 deletions
| diff --git a/fs/yaffs2/yaffs_nand.c b/fs/yaffs2/yaffs_nand.c index ce048cc18..165d01004 100644 --- a/fs/yaffs2/yaffs_nand.c +++ b/fs/yaffs2/yaffs_nand.c @@ -1,7 +1,7 @@  /*   * YAFFS: Yet Another Flash File System. A NAND-flash specific file system.   * - * Copyright (C) 2002-2007 Aleph One Ltd. + * Copyright (C) 2002-2011 Aleph One Ltd.   *   for Toby Churchill Ltd and Brightstar Engineering   *   * Created by Charles Manning <charles@aleph1.co.uk> @@ -11,124 +11,110 @@   * published by the Free Software Foundation.   */ -/* XXX U-BOOT XXX */ -#include <common.h> - -const char *yaffs_nand_c_version = -    "$Id: yaffs_nand.c,v 1.7 2007/02/14 01:09:06 wookey Exp $"; -  #include "yaffs_nand.h"  #include "yaffs_tagscompat.h" -#include "yaffs_tagsvalidity.h" +#include "yaffs_getblockinfo.h" +#include "yaffs_summary.h" -int yaffs_ReadChunkWithTagsFromNAND(yaffs_Device * dev, int chunkInNAND, -					   __u8 * buffer, -					   yaffs_ExtendedTags * tags) +int yaffs_rd_chunk_tags_nand(struct yaffs_dev *dev, int nand_chunk, +			     u8 *buffer, struct yaffs_ext_tags *tags)  {  	int result; -	yaffs_ExtendedTags localTags; +	struct yaffs_ext_tags local_tags; +	int flash_chunk = nand_chunk - dev->chunk_offset; -	int realignedChunkInNAND = chunkInNAND - dev->chunkOffset; +	dev->n_page_reads++; -	/* If there are no tags provided, use local tags to get prioritised gc working */ -	if(!tags) -		tags = &localTags; +	/* If there are no tags provided use local tags. */ +	if (!tags) +		tags = &local_tags; -	if (dev->readChunkWithTagsFromNAND) -		result = dev->readChunkWithTagsFromNAND(dev, realignedChunkInNAND, buffer, -						      tags); +	if (dev->param.read_chunk_tags_fn) +		result = +		    dev->param.read_chunk_tags_fn(dev, flash_chunk, buffer, +						  tags);  	else -		result = yaffs_TagsCompatabilityReadChunkWithTagsFromNAND(dev, -									realignedChunkInNAND, -									buffer, -									tags); -	if(tags && -	   tags->eccResult > YAFFS_ECC_RESULT_NO_ERROR){ +		result = yaffs_tags_compat_rd(dev, +					      flash_chunk, buffer, tags); +	if (tags && tags->ecc_result > YAFFS_ECC_RESULT_NO_ERROR) { -		yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, chunkInNAND/dev->nChunksPerBlock); -		yaffs_HandleChunkError(dev,bi); +		struct yaffs_block_info *bi; +		bi = yaffs_get_block_info(dev, +					  nand_chunk / +					  dev->param.chunks_per_block); +		yaffs_handle_chunk_error(dev, bi);  	} -  	return result;  } -int yaffs_WriteChunkWithTagsToNAND(yaffs_Device * dev, -						   int chunkInNAND, -						   const __u8 * buffer, -						   yaffs_ExtendedTags * tags) +int yaffs_wr_chunk_tags_nand(struct yaffs_dev *dev, +				int nand_chunk, +				const u8 *buffer, struct yaffs_ext_tags *tags)  { -	chunkInNAND -= dev->chunkOffset; +	int result; +	int flash_chunk = nand_chunk - dev->chunk_offset; +	dev->n_page_writes++;  	if (tags) { -		tags->sequenceNumber = dev->sequenceNumber; -		tags->chunkUsed = 1; -		if (!yaffs_ValidateTags(tags)) { -			T(YAFFS_TRACE_ERROR, -			  (TSTR("Writing uninitialised tags" TENDSTR))); -			YBUG(); -		} -		T(YAFFS_TRACE_WRITE, -		  (TSTR("Writing chunk %d tags %d %d" TENDSTR), chunkInNAND, -		   tags->objectId, tags->chunkId)); +		tags->seq_number = dev->seq_number; +		tags->chunk_used = 1; +		yaffs_trace(YAFFS_TRACE_WRITE, +			"Writing chunk %d tags %d %d", +			nand_chunk, tags->obj_id, tags->chunk_id);  	} else { -		T(YAFFS_TRACE_ERROR, (TSTR("Writing with no tags" TENDSTR))); -		YBUG(); +		yaffs_trace(YAFFS_TRACE_ERROR, "Writing with no tags"); +		BUG(); +		return YAFFS_FAIL;  	} -	if (dev->writeChunkWithTagsToNAND) -		return dev->writeChunkWithTagsToNAND(dev, chunkInNAND, buffer, -						     tags); +	if (dev->param.write_chunk_tags_fn) +		result = dev->param.write_chunk_tags_fn(dev, flash_chunk, +							buffer, tags);  	else -		return yaffs_TagsCompatabilityWriteChunkWithTagsToNAND(dev, -								       chunkInNAND, -								       buffer, -								       tags); +		result = yaffs_tags_compat_wr(dev, flash_chunk, buffer, tags); + +	yaffs_summary_add(dev, tags, nand_chunk); + +	return result;  } -int yaffs_MarkBlockBad(yaffs_Device * dev, int blockNo) +int yaffs_mark_bad(struct yaffs_dev *dev, int block_no)  { -	blockNo -= dev->blockOffset; +	block_no -= dev->block_offset; +	if (dev->param.bad_block_fn) +		return dev->param.bad_block_fn(dev, block_no); -; -	if (dev->markNANDBlockBad) -		return dev->markNANDBlockBad(dev, blockNo); -	else -		return yaffs_TagsCompatabilityMarkNANDBlockBad(dev, blockNo); +	return yaffs_tags_compat_mark_bad(dev, block_no);  } -int yaffs_QueryInitialBlockState(yaffs_Device * dev, -						 int blockNo, -						 yaffs_BlockState * state, -						 int *sequenceNumber) +int yaffs_query_init_block_state(struct yaffs_dev *dev, +				 int block_no, +				 enum yaffs_block_state *state, +				 u32 *seq_number)  { -	blockNo -= dev->blockOffset; +	block_no -= dev->block_offset; +	if (dev->param.query_block_fn) +		return dev->param.query_block_fn(dev, block_no, state, +						 seq_number); -	if (dev->queryNANDBlock) -		return dev->queryNANDBlock(dev, blockNo, state, sequenceNumber); -	else -		return yaffs_TagsCompatabilityQueryNANDBlock(dev, blockNo, -							     state, -							     sequenceNumber); +	return yaffs_tags_compat_query_block(dev, block_no, state, seq_number);  } - -int yaffs_EraseBlockInNAND(struct yaffs_DeviceStruct *dev, -				  int blockInNAND) +int yaffs_erase_block(struct yaffs_dev *dev, int flash_block)  {  	int result; -	blockInNAND -= dev->blockOffset; - - -	dev->nBlockErasures++; -	result = dev->eraseBlockInNAND(dev, blockInNAND); - +	flash_block -= dev->block_offset; +	dev->n_erasures++; +	result = dev->param.erase_fn(dev, flash_block);  	return result;  } -int yaffs_InitialiseNAND(struct yaffs_DeviceStruct *dev) +int yaffs_init_nand(struct yaffs_dev *dev)  { -	return dev->initialiseNAND(dev); +	if (dev->param.initialise_flash_fn) +		return dev->param.initialise_flash_fn(dev); +	return YAFFS_OK;  } |