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

Commit d974541e authored by Boris Brezillon's avatar Boris Brezillon Committed by Miquel Raynal
Browse files

mtd: rawnand: Move all page cache related fields to a sub-struct



Looking at the field names it's hard to tell what ->data_buf, ->pagebuf
and ->pagebuf_bitflips are for. Clarify that by moving those fields
in a sub-struct named pagecache.

Signed-off-by: default avatarBoris Brezillon <bbrezillon@kernel.org>
Signed-off-by: default avatarMiquel Raynal <miquel.raynal@bootlin.com>
Reviewed-by: default avatarFrieder Schrempf <frieder.schrempf@kontron.de>
parent eeab7174
Loading
Loading
Loading
Loading
+14 −14
Original line number Diff line number Diff line
@@ -459,8 +459,8 @@ static int nand_do_write_oob(struct nand_chip *chip, loff_t to,
	}

	/* Invalidate the page cache, if we write to the cached page */
	if (page == chip->pagebuf)
		chip->pagebuf = -1;
	if (page == chip->pagecache.page)
		chip->pagecache.page = -1;

	nand_fill_oob(chip, ops->oobbuf, ops->ooblen, ops);

@@ -3173,7 +3173,7 @@ static int nand_do_read_ops(struct nand_chip *chip, loff_t from,
			use_bufpoi = 0;

		/* Is the current page in the buffer? */
		if (realpage != chip->pagebuf || oob) {
		if (realpage != chip->pagecache.page || oob) {
			bufpoi = use_bufpoi ? chip->data_buf : buf;

			if (use_bufpoi && aligned)
@@ -3199,7 +3199,7 @@ static int nand_do_read_ops(struct nand_chip *chip, loff_t from,
			if (ret < 0) {
				if (use_bufpoi)
					/* Invalidate page cache */
					chip->pagebuf = -1;
					chip->pagecache.page = -1;
				break;
			}

@@ -3208,11 +3208,11 @@ static int nand_do_read_ops(struct nand_chip *chip, loff_t from,
				if (!NAND_HAS_SUBPAGE_READ(chip) && !oob &&
				    !(mtd->ecc_stats.failed - ecc_failures) &&
				    (ops->mode != MTD_OPS_RAW)) {
					chip->pagebuf = realpage;
					chip->pagebuf_bitflips = ret;
					chip->pagecache.page = realpage;
					chip->pagecache.bitflips = ret;
				} else {
					/* Invalidate page cache */
					chip->pagebuf = -1;
					chip->pagecache.page = -1;
				}
				memcpy(buf, chip->data_buf + col, bytes);
			}
@@ -3252,7 +3252,7 @@ static int nand_do_read_ops(struct nand_chip *chip, loff_t from,
			memcpy(buf, chip->data_buf + col, bytes);
			buf += bytes;
			max_bitflips = max_t(unsigned int, max_bitflips,
					     chip->pagebuf_bitflips);
					     chip->pagecache.bitflips);
		}

		readlen -= bytes;
@@ -3973,9 +3973,9 @@ static int nand_do_write_ops(struct nand_chip *chip, loff_t to,
	page = realpage & chip->pagemask;

	/* Invalidate the page cache, when we write to the cached page */
	if (to <= ((loff_t)chip->pagebuf << chip->page_shift) &&
	    ((loff_t)chip->pagebuf << chip->page_shift) < (to + ops->len))
		chip->pagebuf = -1;
	if (to <= ((loff_t)chip->pagecache.page << chip->page_shift) &&
	    ((loff_t)chip->pagecache.page << chip->page_shift) < (to + ops->len))
		chip->pagecache.page = -1;

	/* Don't allow multipage oob writes with offset */
	if (oob && ops->ooboffs && (ops->ooboffs + ops->ooblen > oobmaxlen)) {
@@ -4196,9 +4196,9 @@ int nand_erase_nand(struct nand_chip *chip, struct erase_info *instr,
		 * Invalidate the page cache, if we erase the block which
		 * contains the current cached page.
		 */
		if (page <= chip->pagebuf && chip->pagebuf <
		if (page <= chip->pagecache.page && chip->pagecache.page <
		    (page + pages_per_block))
			chip->pagebuf = -1;
			chip->pagecache.page = -1;

		ret = nand_erase_op(chip, (page & chip->pagemask) >>
				    (chip->phys_erase_shift - chip->page_shift));
@@ -5782,7 +5782,7 @@ static int nand_scan_tail(struct nand_chip *chip)
	chip->subpagesize = mtd->writesize >> mtd->subpage_sft;

	/* Invalidate the pagebuffer reference */
	chip->pagebuf = -1;
	chip->pagecache.page = -1;

	/* Large page NAND with SOFT_ECC should support subpage reads */
	switch (ecc->mode) {
+11 −7
Original line number Diff line number Diff line
@@ -1007,10 +1007,10 @@ struct nand_legacy {
 * @chipsize:		[INTERN] the size of one chip for multichip arrays
 * @pagemask:		[INTERN] page number mask = number of (pages / chip) - 1
 * @data_buf:		[INTERN] buffer for data, size is (page size + oobsize).
 * @pagebuf:		[INTERN] holds the pagenumber which is currently in
 *			data_buf.
 * @pagebuf_bitflips:	[INTERN] holds the bitflip count for the page which is
 *			currently in data_buf.
 * @pagecache:		Structure containing page cache related fields
 * @pagecache.bitflips:	Number of bitflips of the cached page
 * @pagecache.page:	Page number currently in the cache. -1 means no page is
 *			currently cached
 * @subpagesize:	[INTERN] holds the subpagesize
 * @id:			[INTERN] holds NAND ID
 * @parameters:		[INTERN] holds generic parameters under an easily
@@ -1060,8 +1060,12 @@ struct nand_chip {
	uint64_t chipsize;
	int pagemask;
	u8 *data_buf;
	int pagebuf;
	unsigned int pagebuf_bitflips;

	struct {
		unsigned int bitflips;
		int page;
	} pagecache;

	int subpagesize;
	uint8_t bits_per_cell;
	uint16_t ecc_strength_ds;
@@ -1366,7 +1370,7 @@ void nand_deselect_target(struct nand_chip *chip);
 */
static inline void *nand_get_data_buf(struct nand_chip *chip)
{
	chip->pagebuf = -1;
	chip->pagecache.page = -1;

	return chip->data_buf;
}