提交 91014e9b 编写于 作者: K Kyungmin Park 提交者: David Woodhouse

[MTD] [OneNAND] Use oob buffer instead of main one in oob functions

In oob functions, it is used main buffer instead of oob one. So fix it.
Signed-off-by: NKyungmin Park <kyungmin.park@samsung.com>
Signed-off-by: NDavid Woodhouse <dwmw2@infradead.org>
上级 74641d75
...@@ -1093,7 +1093,7 @@ int onenand_bbt_read_oob(struct mtd_info *mtd, loff_t from, ...@@ -1093,7 +1093,7 @@ int onenand_bbt_read_oob(struct mtd_info *mtd, loff_t from,
static int onenand_verify_oob(struct mtd_info *mtd, const u_char *buf, loff_t to) static int onenand_verify_oob(struct mtd_info *mtd, const u_char *buf, loff_t to)
{ {
struct onenand_chip *this = mtd->priv; struct onenand_chip *this = mtd->priv;
char *readp = this->page_buf + mtd->writesize; char oobbuf[64];
int status, i; int status, i;
this->command(mtd, ONENAND_CMD_READOOB, to, mtd->oobsize); this->command(mtd, ONENAND_CMD_READOOB, to, mtd->oobsize);
...@@ -1102,9 +1102,9 @@ static int onenand_verify_oob(struct mtd_info *mtd, const u_char *buf, loff_t to ...@@ -1102,9 +1102,9 @@ static int onenand_verify_oob(struct mtd_info *mtd, const u_char *buf, loff_t to
if (status) if (status)
return status; return status;
this->read_bufferram(mtd, ONENAND_SPARERAM, readp, 0, mtd->oobsize); this->read_bufferram(mtd, ONENAND_SPARERAM, oobbuf, 0, mtd->oobsize);
for(i = 0; i < mtd->oobsize; i++) for (i = 0; i < mtd->oobsize; i++)
if (buf[i] != 0xFF && buf[i] != readp[i]) if (buf[i] != 0xFF && buf[i] != oobbuf[i])
return -EBADMSG; return -EBADMSG;
return 0; return 0;
...@@ -1312,6 +1312,7 @@ static int onenand_do_write_oob(struct mtd_info *mtd, loff_t to, size_t len, ...@@ -1312,6 +1312,7 @@ static int onenand_do_write_oob(struct mtd_info *mtd, loff_t to, size_t len,
struct onenand_chip *this = mtd->priv; struct onenand_chip *this = mtd->priv;
int column, ret = 0, oobsize; int column, ret = 0, oobsize;
int written = 0; int written = 0;
u_char *oobbuf;
DEBUG(MTD_DEBUG_LEVEL3, "onenand_write_oob: to = 0x%08x, len = %i\n", (unsigned int) to, (int) len); DEBUG(MTD_DEBUG_LEVEL3, "onenand_write_oob: to = 0x%08x, len = %i\n", (unsigned int) to, (int) len);
...@@ -1331,7 +1332,7 @@ static int onenand_do_write_oob(struct mtd_info *mtd, loff_t to, size_t len, ...@@ -1331,7 +1332,7 @@ static int onenand_do_write_oob(struct mtd_info *mtd, loff_t to, size_t len,
} }
/* For compatibility with NAND: Do not allow write past end of page */ /* For compatibility with NAND: Do not allow write past end of page */
if (column + len > oobsize) { if (unlikely(column + len > oobsize)) {
printk(KERN_ERR "onenand_write_oob: " printk(KERN_ERR "onenand_write_oob: "
"Attempt to write past end of page\n"); "Attempt to write past end of page\n");
return -EINVAL; return -EINVAL;
...@@ -1348,6 +1349,8 @@ static int onenand_do_write_oob(struct mtd_info *mtd, loff_t to, size_t len, ...@@ -1348,6 +1349,8 @@ static int onenand_do_write_oob(struct mtd_info *mtd, loff_t to, size_t len,
/* Grab the lock and see if the device is available */ /* Grab the lock and see if the device is available */
onenand_get_device(mtd, FL_WRITING); onenand_get_device(mtd, FL_WRITING);
oobbuf = this->page_buf + mtd->writesize;
/* Loop until all data write */ /* Loop until all data write */
while (written < len) { while (written < len) {
int thislen = min_t(int, oobsize, len - written); int thislen = min_t(int, oobsize, len - written);
...@@ -1358,12 +1361,12 @@ static int onenand_do_write_oob(struct mtd_info *mtd, loff_t to, size_t len, ...@@ -1358,12 +1361,12 @@ static int onenand_do_write_oob(struct mtd_info *mtd, loff_t to, size_t len,
/* We send data to spare ram with oobsize /* We send data to spare ram with oobsize
* to prevent byte access */ * to prevent byte access */
memset(this->page_buf, 0xff, mtd->oobsize); memset(oobbuf, 0xff, mtd->oobsize);
if (mode == MTD_OOB_AUTO) if (mode == MTD_OOB_AUTO)
onenand_fill_auto_oob(mtd, this->page_buf, buf, column, thislen); onenand_fill_auto_oob(mtd, oobbuf, buf, column, thislen);
else else
memcpy(this->page_buf + column, buf, thislen); memcpy(oobbuf + column, buf, thislen);
this->write_bufferram(mtd, ONENAND_SPARERAM, this->page_buf, 0, mtd->oobsize); this->write_bufferram(mtd, ONENAND_SPARERAM, oobbuf, 0, mtd->oobsize);
this->command(mtd, ONENAND_CMD_PROGOOB, to, mtd->oobsize); this->command(mtd, ONENAND_CMD_PROGOOB, to, mtd->oobsize);
...@@ -1375,7 +1378,7 @@ static int onenand_do_write_oob(struct mtd_info *mtd, loff_t to, size_t len, ...@@ -1375,7 +1378,7 @@ static int onenand_do_write_oob(struct mtd_info *mtd, loff_t to, size_t len,
break; break;
} }
ret = onenand_verify_oob(mtd, this->page_buf, to); ret = onenand_verify_oob(mtd, oobbuf, to);
if (ret) { if (ret) {
printk(KERN_ERR "onenand_write_oob: verify failed %d\n", ret); printk(KERN_ERR "onenand_write_oob: verify failed %d\n", ret);
break; break;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册