Skip to contentSkip to conversation

OneNAND: Subpage write returned incorrect length written

PATCH New Adrian Hunter 1 participant 1 message Feb 6, 2007 Memory technology devices (MTD)

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 OneNAND: Subpage write returned incorrect length written

Quoted 1 line

From 9559cd696b16e392572b34aa95b656637ac3241d Mon Sep 17 00:00:00 2001

From: Adrian Hunter <[email protected]>
Date: Tue, 6 Feb 2007 16:20:41 +0200
Subject: [MTD] OneNAND: Subpage write returned incorrect length written

When a write is done, the length written is returned. When a single subpage is written the length returned should be the subpage size, however the page size was being returned.

---
drivers/mtd/onenand/onenand_base.c | 20 +++++++++-----------

1 files changed, 9 insertions(+), 11 deletions(-)
drivers/mtd/onenand/onenand_base.c +0 -0
index 553b24d..3d6f880 100644
@@ -1051,40 +1051,37 @@ static int onenand_write(struct mtd_info
        }
 
	column = to & (mtd->writesize - 1);

- subpage = column || (len & (mtd->writesize - 1));

	/* Grab the lock and see if the device is available */
	onenand_get_device(mtd, FL_WRITING);

	/* Loop until all data write */
	while (written < len) {
-		int bytes = mtd->writesize;
-		int thislen = min_t(int, bytes, len - written);
+		int thislen = min_t(int, mtd->writesize - column, len - written);
		u_char *wbuf = (u_char *) buf;

		cond_resched();

- this->command(mtd, ONENAND_CMD_BUFFERRAM, to, bytes);
+ this->command(mtd, ONENAND_CMD_BUFFERRAM, to, thislen);

		/* Partial page write */
+		subpage = thislen < mtd->writesize;
		if (subpage) {
-			bytes = min_t(int, bytes - column, (int) len);
			memset(this->page_buf, 0xff, mtd->writesize);
-			memcpy(this->page_buf + column, buf, bytes);
+			memcpy(this->page_buf + column, buf, thislen);
			wbuf = this->page_buf;
-			/* Even though partial write, we need page size */
-			thislen = mtd->writesize;
		}

- this->write_bufferram(mtd, ONENAND_DATARAM, wbuf, 0, thislen);

+		this->write_bufferram(mtd, ONENAND_DATARAM, wbuf, 0, mtd->writesize);
		this->write_bufferram(mtd, ONENAND_SPARERAM, ffchars, 0, mtd->oobsize);

		this->command(mtd, ONENAND_CMD_PROG, to, mtd->writesize);

+ ret = this->wait(mtd, FL_WRITING);
+

		/* In partial page write we don't update bufferram */

- onenand_update_bufferram(mtd, to, !subpage);
+ onenand_update_bufferram(mtd, to, !ret && !subpage);

-		ret = this->wait(mtd, FL_WRITING);
		if (ret) {
			DEBUG(MTD_DEBUG_LEVEL0, "onenand_write: write filaed %d\n", ret);
			break;
@@ -1098,6 +1095,7 @@ static int onenand_write(struct mtd_info
		}

		written += thislen;
+
		if (written == len)
			break;
Signature · 1 line
1.4.3