/* MTD methods which simply translate the effective address and pass through to the  */
static int part_read(struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf)
/* MTD methods which simply translate the effective address and pass through to the  */
static int part_read(struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf)
{
	struct mtd_ecc_stats stats;
	int res;
	stats = mtd->parent->ecc_stats;
	res = mtd->parent->_read(mtd->parent, from + mtd->offset, len,
				 retlen, buf);
	if (unlikely(mtd_is_eccerr(res)))
		mtd->ecc_stats.failed +=
			mtd->parent->ecc_stats.failed - stats.failed;
	else
		mtd->ecc_stats.corrected +=
			mtd->parent->ecc_stats.corrected - stats.corrected;
	return res;
}