static int aml_ops_read_page(struct aml_nftl_info_t * aml_nftl_info, addr_blk_t blk_addr, addr_page_t page_addr, 
								unsigned char *data_buf, unsigned char *nftl_oob_buf, int oob_len)
{
	struct mtd_info *mtd = aml_nftl_info->mtd;
	//struct mtd_oob_ops aml_oob_ops;
	loff_t from;
	size_t len, retlen;
	int ret;

	struct mtd_oob_ops *aml_oob_ops;
	aml_oob_ops = aml_nftl_malloc(sizeof(struct mtd_oob_ops));
	
	if(aml_oob_ops== NULL){
		printk("%s,%d malloc failed\n",__func__,__LINE__);
		return -ENOMEM;;
	}
	
	from = mtd->erasesize;
	from *= blk_addr;
	from += page_addr * mtd->writesize;

	len = mtd->writesize;
	aml_oob_ops->mode = MTD_OOB_AUTO;
	aml_oob_ops->len = mtd->writesize;
	aml_oob_ops->ooblen = oob_len;
	aml_oob_ops->ooboffs = mtd->ecclayout->oobfree[0].offset;
	aml_oob_ops->datbuf = data_buf;
	aml_oob_ops->oobbuf = nftl_oob_buf;

	if (nftl_oob_buf)
		ret = mtd->read_oob(mtd, from, aml_oob_ops);
	else
		ret = mtd->read(mtd, from, len, &retlen, data_buf);

	if (ret == -EUCLEAN) {
		//if (mtd->ecc_stats.corrected >= 10)
			//do read err 
		ret = 0;
	}
	if (ret)
		aml_nftl_dbg("aml_ops_read_page failed: %llx %d %d\n", from, blk_addr, page_addr);
	
	aml_nftl_free(aml_oob_ops);
	return ret;
}
Exemplo n.º 2
0
static int aml_ops_read_page_oob(struct aml_nftl_info_t *aml_nftl_info, addr_blk_t blk_addr,
										addr_page_t page_addr, unsigned char *nftl_oob_buf, int oob_len)
{
	struct mtd_info *mtd = aml_nftl_info->mtd;
//	struct mtd_oob_ops aml_oob_ops;
//	struct mtd_ecc_stats stats;
	loff_t from;
	int ret;

	struct mtd_oob_ops *aml_oob_ops;
	aml_oob_ops = aml_nftl_malloc(sizeof(struct mtd_oob_ops));

	if(aml_oob_ops== NULL){
		printk("%s,%d malloc failed\n",__func__,__LINE__);
		return -ENOMEM;;
	}
	//stats = mtd->ecc_stats;
	from = mtd->erasesize;
	from *= blk_addr;
	from += page_addr * mtd->writesize;

	aml_oob_ops->mode = MTD_OPS_AUTO_OOB;
	aml_oob_ops->len = 0;
	aml_oob_ops->ooblen = oob_len;
	aml_oob_ops->ooboffs = mtd->ecclayout->oobfree[0].offset;
	aml_oob_ops->datbuf = NULL;
	aml_oob_ops->oobbuf = nftl_oob_buf;

	ret = mtd->read_oob(mtd, from, aml_oob_ops);

	if (ret == -EUCLEAN) {
		//if (mtd->ecc_stats.corrected >= 10)
			//do read err
		ret = 0;
	}
	aml_nftl_free(aml_oob_ops);
	return ret;
}
Exemplo n.º 3
0
static int aml_ops_write_page(struct aml_nftl_info_t * aml_nftl_info, addr_blk_t blk_addr, addr_page_t page_addr,
								unsigned char *data_buf, unsigned char *nftl_oob_buf, int oob_len)
{
	struct mtd_info *mtd = aml_nftl_info->mtd;
	//struct mtd_oob_ops aml_oob_ops;
	loff_t from;
	size_t len, retlen;
	int ret;

	struct mtd_oob_ops *aml_oob_ops;
	aml_oob_ops = aml_nftl_malloc(sizeof(struct mtd_oob_ops));

	if(aml_oob_ops== NULL){
		printk("%s,%d malloc failed\n",__func__,__LINE__);
		return -ENOMEM;;
	}

	from = mtd->erasesize;
	from *= blk_addr;
	from += page_addr * mtd->writesize;

	len = mtd->writesize;
	aml_oob_ops->mode = MTD_OPS_AUTO_OOB;
	aml_oob_ops->len = mtd->writesize;
	aml_oob_ops->ooblen = oob_len;
	aml_oob_ops->ooboffs = mtd->ecclayout->oobfree[0].offset;
	aml_oob_ops->datbuf = data_buf;
	aml_oob_ops->oobbuf = nftl_oob_buf;

	if (nftl_oob_buf)
		ret = mtd->write_oob(mtd, from, aml_oob_ops);
	else
		ret = mtd->write(mtd, from, len, &retlen, data_buf);
	aml_nftl_free(aml_oob_ops);
	return ret;
}