Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d30aae6d authored by Boris Brezillon's avatar Boris Brezillon
Browse files

mtd: onenand: use mtd_ooblayout_xxx() helpers where appropriate



The mtd_ooblayout_xxx() helper functions have been added to avoid direct
accesses to the ecclayout field, and thus ease for future reworks.
Use these helpers in all places where the oobfree[] and eccpos[] arrays
where directly accessed.

Signed-off-by: default avatarBoris Brezillon <boris.brezillon@free-electrons.com>
parent aa02fcf5
Loading
Loading
Loading
Loading
+15 −60
Original line number Original line Diff line number Diff line
@@ -1024,34 +1024,15 @@ static int onenand_transfer_auto_oob(struct mtd_info *mtd, uint8_t *buf, int col
				int thislen)
				int thislen)
{
{
	struct onenand_chip *this = mtd->priv;
	struct onenand_chip *this = mtd->priv;
	struct nand_oobfree *free;
	int ret;
	int readcol = column;

	int readend = column + thislen;
	this->read_bufferram(mtd, ONENAND_SPARERAM, this->oob_buf, 0,
	int lastgap = 0;
			     mtd->oobsize);
	unsigned int i;
	ret = mtd_ooblayout_get_databytes(mtd, buf, this->oob_buf,
	uint8_t *oob_buf = this->oob_buf;
					  column, thislen);
	if (ret)
		return ret;


	free = this->ecclayout->oobfree;
	for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES && free->length; i++, free++) {
		if (readcol >= lastgap)
			readcol += free->offset - lastgap;
		if (readend >= lastgap)
			readend += free->offset - lastgap;
		lastgap = free->offset + free->length;
	}
	this->read_bufferram(mtd, ONENAND_SPARERAM, oob_buf, 0, mtd->oobsize);
	free = this->ecclayout->oobfree;
	for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES && free->length; i++, free++) {
		int free_end = free->offset + free->length;
		if (free->offset < readend && free_end > readcol) {
			int st = max_t(int,free->offset,readcol);
			int ed = min_t(int,free_end,readend);
			int n = ed - st;
			memcpy(buf, oob_buf + st, n);
			buf += n;
		} else if (column == 0)
			break;
	}
	return 0;
	return 0;
}
}


@@ -1808,34 +1789,7 @@ static int onenand_panic_write(struct mtd_info *mtd, loff_t to, size_t len,
static int onenand_fill_auto_oob(struct mtd_info *mtd, u_char *oob_buf,
static int onenand_fill_auto_oob(struct mtd_info *mtd, u_char *oob_buf,
				  const u_char *buf, int column, int thislen)
				  const u_char *buf, int column, int thislen)
{
{
	struct onenand_chip *this = mtd->priv;
	return mtd_ooblayout_set_databytes(mtd, buf, oob_buf, column, thislen);
	struct nand_oobfree *free;
	int writecol = column;
	int writeend = column + thislen;
	int lastgap = 0;
	unsigned int i;

	free = this->ecclayout->oobfree;
	for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES && free->length; i++, free++) {
		if (writecol >= lastgap)
			writecol += free->offset - lastgap;
		if (writeend >= lastgap)
			writeend += free->offset - lastgap;
		lastgap = free->offset + free->length;
	}
	free = this->ecclayout->oobfree;
	for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES && free->length; i++, free++) {
		int free_end = free->offset + free->length;
		if (free->offset < writeend && free_end > writecol) {
			int st = max_t(int,free->offset,writecol);
			int ed = min_t(int,free_end,writeend);
			int n = ed - st;
			memcpy(oob_buf + st, buf, n);
			buf += n;
		} else if (column == 0)
			break;
	}
	return 0;
}
}


/**
/**
@@ -4037,10 +3991,11 @@ int onenand_scan(struct mtd_info *mtd, int maxchips)
	 * The number of bytes available for a client to place data into
	 * The number of bytes available for a client to place data into
	 * the out of band area
	 * the out of band area
	 */
	 */
	mtd->oobavail = 0;
	ret = mtd_ooblayout_count_freebytes(mtd);
	for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES &&
	if (ret < 0)
	    this->ecclayout->oobfree[i].length; i++)
		ret = 0;
		mtd->oobavail += this->ecclayout->oobfree[i].length;

	mtd->oobavail = ret;


	mtd->ecclayout = this->ecclayout;
	mtd->ecclayout = this->ecclayout;
	mtd->ecc_strength = 1;
	mtd->ecc_strength = 1;