Blame view

fs/yaffs2/yaffs_nand.c 2.94 KB
0e8cc8bd9   William Juul   YAFFS2 import
1
2
3
  /*
   * YAFFS: Yet Another Flash File System. A NAND-flash specific file system.
   *
753ac6108   Charles Manning   u-boot: Update ya...
4
   * Copyright (C) 2002-2011 Aleph One Ltd.
0e8cc8bd9   William Juul   YAFFS2 import
5
6
7
8
9
10
11
12
   *   for Toby Churchill Ltd and Brightstar Engineering
   *
   * Created by Charles Manning <charles@aleph1.co.uk>
   *
   * 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.
   */
4b0708093   Wolfgang Denk   Coding Style clea...
13

0e8cc8bd9   William Juul   YAFFS2 import
14
15
  #include "yaffs_nand.h"
  #include "yaffs_tagscompat.h"
0e8cc8bd9   William Juul   YAFFS2 import
16

753ac6108   Charles Manning   u-boot: Update ya...
17
18
  #include "yaffs_getblockinfo.h"
  #include "yaffs_summary.h"
0e8cc8bd9   William Juul   YAFFS2 import
19

753ac6108   Charles Manning   u-boot: Update ya...
20
21
  int yaffs_rd_chunk_tags_nand(struct yaffs_dev *dev, int nand_chunk,
  			     u8 *buffer, struct yaffs_ext_tags *tags)
0e8cc8bd9   William Juul   YAFFS2 import
22
23
  {
  	int result;
753ac6108   Charles Manning   u-boot: Update ya...
24
25
  	struct yaffs_ext_tags local_tags;
  	int flash_chunk = nand_chunk - dev->chunk_offset;
4b0708093   Wolfgang Denk   Coding Style clea...
26

753ac6108   Charles Manning   u-boot: Update ya...
27
  	dev->n_page_reads++;
4b0708093   Wolfgang Denk   Coding Style clea...
28

753ac6108   Charles Manning   u-boot: Update ya...
29
30
31
  	/* If there are no tags provided use local tags. */
  	if (!tags)
  		tags = &local_tags;
0e8cc8bd9   William Juul   YAFFS2 import
32

753ac6108   Charles Manning   u-boot: Update ya...
33
34
35
36
  	if (dev->param.read_chunk_tags_fn)
  		result =
  		    dev->param.read_chunk_tags_fn(dev, flash_chunk, buffer,
  						  tags);
0e8cc8bd9   William Juul   YAFFS2 import
37
  	else
753ac6108   Charles Manning   u-boot: Update ya...
38
39
40
41
42
43
44
45
46
  		result = yaffs_tags_compat_rd(dev,
  					      flash_chunk, buffer, tags);
  	if (tags && tags->ecc_result > YAFFS_ECC_RESULT_NO_ERROR) {
  
  		struct yaffs_block_info *bi;
  		bi = yaffs_get_block_info(dev,
  					  nand_chunk /
  					  dev->param.chunks_per_block);
  		yaffs_handle_chunk_error(dev, bi);
0e8cc8bd9   William Juul   YAFFS2 import
47
  	}
0e8cc8bd9   William Juul   YAFFS2 import
48
49
  	return result;
  }
753ac6108   Charles Manning   u-boot: Update ya...
50
51
52
  int yaffs_wr_chunk_tags_nand(struct yaffs_dev *dev,
  				int nand_chunk,
  				const u8 *buffer, struct yaffs_ext_tags *tags)
0e8cc8bd9   William Juul   YAFFS2 import
53
  {
753ac6108   Charles Manning   u-boot: Update ya...
54
55
  	int result;
  	int flash_chunk = nand_chunk - dev->chunk_offset;
0e8cc8bd9   William Juul   YAFFS2 import
56

753ac6108   Charles Manning   u-boot: Update ya...
57
  	dev->n_page_writes++;
4b0708093   Wolfgang Denk   Coding Style clea...
58

0e8cc8bd9   William Juul   YAFFS2 import
59
  	if (tags) {
753ac6108   Charles Manning   u-boot: Update ya...
60
61
62
63
64
  		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);
0e8cc8bd9   William Juul   YAFFS2 import
65
  	} else {
753ac6108   Charles Manning   u-boot: Update ya...
66
67
68
  		yaffs_trace(YAFFS_TRACE_ERROR, "Writing with no tags");
  		BUG();
  		return YAFFS_FAIL;
0e8cc8bd9   William Juul   YAFFS2 import
69
  	}
753ac6108   Charles Manning   u-boot: Update ya...
70
71
72
  	if (dev->param.write_chunk_tags_fn)
  		result = dev->param.write_chunk_tags_fn(dev, flash_chunk,
  							buffer, tags);
0e8cc8bd9   William Juul   YAFFS2 import
73
  	else
753ac6108   Charles Manning   u-boot: Update ya...
74
75
76
77
78
  		result = yaffs_tags_compat_wr(dev, flash_chunk, buffer, tags);
  
  	yaffs_summary_add(dev, tags, nand_chunk);
  
  	return result;
0e8cc8bd9   William Juul   YAFFS2 import
79
  }
753ac6108   Charles Manning   u-boot: Update ya...
80
  int yaffs_mark_bad(struct yaffs_dev *dev, int block_no)
0e8cc8bd9   William Juul   YAFFS2 import
81
  {
753ac6108   Charles Manning   u-boot: Update ya...
82
83
84
  	block_no -= dev->block_offset;
  	if (dev->param.bad_block_fn)
  		return dev->param.bad_block_fn(dev, block_no);
0e8cc8bd9   William Juul   YAFFS2 import
85

753ac6108   Charles Manning   u-boot: Update ya...
86
  	return yaffs_tags_compat_mark_bad(dev, block_no);
0e8cc8bd9   William Juul   YAFFS2 import
87
  }
753ac6108   Charles Manning   u-boot: Update ya...
88
89
90
91
  int yaffs_query_init_block_state(struct yaffs_dev *dev,
  				 int block_no,
  				 enum yaffs_block_state *state,
  				 u32 *seq_number)
0e8cc8bd9   William Juul   YAFFS2 import
92
  {
753ac6108   Charles Manning   u-boot: Update ya...
93
94
95
96
  	block_no -= dev->block_offset;
  	if (dev->param.query_block_fn)
  		return dev->param.query_block_fn(dev, block_no, state,
  						 seq_number);
0e8cc8bd9   William Juul   YAFFS2 import
97

753ac6108   Charles Manning   u-boot: Update ya...
98
  	return yaffs_tags_compat_query_block(dev, block_no, state, seq_number);
0e8cc8bd9   William Juul   YAFFS2 import
99
  }
753ac6108   Charles Manning   u-boot: Update ya...
100
  int yaffs_erase_block(struct yaffs_dev *dev, int flash_block)
0e8cc8bd9   William Juul   YAFFS2 import
101
102
  {
  	int result;
753ac6108   Charles Manning   u-boot: Update ya...
103
104
105
  	flash_block -= dev->block_offset;
  	dev->n_erasures++;
  	result = dev->param.erase_fn(dev, flash_block);
0e8cc8bd9   William Juul   YAFFS2 import
106
107
  	return result;
  }
753ac6108   Charles Manning   u-boot: Update ya...
108
  int yaffs_init_nand(struct yaffs_dev *dev)
0e8cc8bd9   William Juul   YAFFS2 import
109
  {
753ac6108   Charles Manning   u-boot: Update ya...
110
111
112
  	if (dev->param.initialise_flash_fn)
  		return dev->param.initialise_flash_fn(dev);
  	return YAFFS_OK;
0e8cc8bd9   William Juul   YAFFS2 import
113
  }