* [PATCH] [MTD] OneNAND: Subpage write returned incorrect length written
@ 2007-02-06 14:25 Adrian Hunter
0 siblings, 0 replies; only message in thread
From: Adrian Hunter @ 2007-02-06 14:25 UTC (permalink / raw)
To: linux-mtd
>From 9559cd696b16e392572b34aa95b656637ac3241d Mon Sep 17 00:00:00 2001
From: Adrian Hunter <ext-adrian.hunter@nokia.com>
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.
Signed-off-by: Adrian Hunter <ext-adrian.hunter@nokia.com>
---
drivers/mtd/onenand/onenand_base.c | 20 +++++++++-----------
1 files changed, 9 insertions(+), 11 deletions(-)
diff --git a/drivers/mtd/onenand/onenand_base.c b/drivers/mtd/onenand/onenand_base.c
index 553b24d..3d6f880 100644
--- a/drivers/mtd/onenand/onenand_base.c
+++ b/drivers/mtd/onenand/onenand_base.c
@@ -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;
--
1.4.3
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2007-02-06 14:27 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-02-06 14:25 [PATCH] [MTD] OneNAND: Subpage write returned incorrect length written Adrian Hunter
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox