[MTD] OneNAND: Subpage write returned incorrect length written
authorAdrian Hunter <ext-adrian.hunter@nokia.com>
Wed, 7 Feb 2007 01:55:23 +0000 (10:55 +0900)
committerKyungmin Park <kyungmin.park@samsung.com>
Wed, 7 Feb 2007 01:55:23 +0000 (10:55 +0900)
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>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
drivers/mtd/onenand/onenand_base.c

index 553b24d93335ba3279c9e5c969f5b6131668ccb1..3d6f880cba9c85d0b512e853a6f6cc2a7fe7443d 100644 (file)
@@ -1051,40 +1051,37 @@ static int onenand_write(struct mtd_info *mtd, loff_t to, size_t len,
         }
 
        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 *mtd, loff_t to, size_t len,
                }
 
                written += thislen;
+
                if (written == len)
                        break;