THis still needs the drivers to cooperate.
Signed-off-by: Charles Manning <cdhmanning@gmail.com>
}
void yaffs_handle_chunk_error(struct yaffs_dev *dev,
}
void yaffs_handle_chunk_error(struct yaffs_dev *dev,
- struct yaffs_block_info *bi)
+ struct yaffs_block_info *bi,
+ enum yaffs_ecc_result err_type)
- if (!bi->gc_prioritise) {
- bi->gc_prioritise = 1;
- dev->has_pending_prioritised_gc = 1;
+ if (bi->gc_prioritise)
+ return;
+
+ /* We need to refresh this data by gc'ing the block soon. */
+ bi->gc_prioritise = 1;
+ dev->has_pending_prioritised_gc = 1;
+
+ /* If it was more than just refresh request then consider retirement. */
+ if (err_type > YAFFS_ECC_RESULT_REFRESH) {
bi->chunk_error_strikes++;
if (bi->chunk_error_strikes > 3) {
bi->chunk_error_strikes++;
if (bi->chunk_error_strikes > 3) {
int flash_block = nand_chunk / dev->param.chunks_per_block;
struct yaffs_block_info *bi = yaffs_get_block_info(dev, flash_block);
int flash_block = nand_chunk / dev->param.chunks_per_block;
struct yaffs_block_info *bi = yaffs_get_block_info(dev, flash_block);
- yaffs_handle_chunk_error(dev, bi);
+ yaffs_handle_chunk_error(dev, bi, YAFFS_ECC_RESULT_FIXED);
if (erased_ok) {
/* Was an actual write failure,
if (erased_ok) {
/* Was an actual write failure,
enum yaffs_ecc_result {
YAFFS_ECC_RESULT_UNKNOWN,
YAFFS_ECC_RESULT_NO_ERROR,
enum yaffs_ecc_result {
YAFFS_ECC_RESULT_UNKNOWN,
YAFFS_ECC_RESULT_NO_ERROR,
+ YAFFS_ECC_RESULT_REFRESH,
YAFFS_ECC_RESULT_FIXED,
YAFFS_ECC_RESULT_UNFIXED
};
YAFFS_ECC_RESULT_FIXED,
YAFFS_ECC_RESULT_UNFIXED
};
int lyn);
int yaffs_check_ff(u8 *buffer, int n_bytes);
void yaffs_handle_chunk_error(struct yaffs_dev *dev,
int lyn);
int yaffs_check_ff(u8 *buffer, int n_bytes);
void yaffs_handle_chunk_error(struct yaffs_dev *dev,
- struct yaffs_block_info *bi);
+ struct yaffs_block_info *bi,
+ enum yaffs_ecc_result err_type);
u8 *yaffs_get_temp_buffer(struct yaffs_dev *dev);
void yaffs_release_temp_buffer(struct yaffs_dev *dev, u8 *buffer);
u8 *yaffs_get_temp_buffer(struct yaffs_dev *dev);
void yaffs_release_temp_buffer(struct yaffs_dev *dev, u8 *buffer);
bi = yaffs_get_block_info(dev,
nand_chunk /
dev->param.chunks_per_block);
bi = yaffs_get_block_info(dev,
nand_chunk /
dev->param.chunks_per_block);
- yaffs_handle_chunk_error(dev, bi);
+ yaffs_handle_chunk_error(dev, bi, tags->ecc_result);