diff options
Diffstat (limited to 'drivers/mtd/mtdcore.c')
| -rw-r--r-- | drivers/mtd/mtdcore.c | 14 | 
1 files changed, 13 insertions, 1 deletions
| diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c index 49c08145a..deda5f244 100644 --- a/drivers/mtd/mtdcore.c +++ b/drivers/mtd/mtdcore.c @@ -217,11 +217,23 @@ int mtd_erase(struct mtd_info *mtd, struct erase_info *instr)  int mtd_read(struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen,  	     u_char *buf)  { +	int ret_code;  	if (from < 0 || from > mtd->size || len > mtd->size - from)  		return -EINVAL;  	if (!len)  		return 0; -	return mtd->_read(mtd, from, len, retlen, buf); + +	/* +	 * In the absence of an error, drivers return a non-negative integer +	 * representing the maximum number of bitflips that were corrected on +	 * any one ecc region (if applicable; zero otherwise). +	 */ +	ret_code = mtd->_read(mtd, from, len, retlen, buf); +	if (unlikely(ret_code < 0)) +		return ret_code; +	if (mtd->ecc_strength == 0) +		return 0;	/* device lacks ecc */ +	return ret_code >= mtd->bitflip_threshold ? -EUCLEAN : 0;  }  int mtd_write(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, |