[MTD] OneNAND: fix onenand_wait bug in read ecc error

2007-01-22 Thread Linux Kernel Mailing List
Gitweb: 
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=2fd32d4af83f4535d12d3f6dd23189352a9596fa
Commit: 2fd32d4af83f4535d12d3f6dd23189352a9596fa
Parent: 61a7e1983e773b93aac172dadc97f1eb484536b4
Author: Kyungmin Park <[EMAIL PROTECTED]>
AuthorDate: Fri Dec 29 11:51:40 2006 +0900
Committer:  Artem Bityutskiy <[EMAIL PROTECTED]>
CommitDate: Wed Jan 10 14:40:16 2007 +0200

[MTD] OneNAND: fix onenand_wait bug in read ecc error

Even though there is ECC error. OneNAND driver updates the buffram as valid

Signed-off-by: Kyungmin Park <[EMAIL PROTECTED]>
---
 drivers/mtd/onenand/onenand_base.c |5 +++--
 1 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/mtd/onenand/onenand_base.c 
b/drivers/mtd/onenand/onenand_base.c
index 0037cee..e80857b 100644
--- a/drivers/mtd/onenand/onenand_base.c
+++ b/drivers/mtd/onenand/onenand_base.c
@@ -298,7 +298,7 @@ static int onenand_wait(struct mtd_info *mtd, int state)
unsigned long timeout;
unsigned int flags = ONENAND_INT_MASTER;
unsigned int interrupt = 0;
-   unsigned int ctrl, ecc;
+   unsigned int ctrl;
 
/* The 20 msec is enough */
timeout = jiffies + msecs_to_jiffies(20);
@@ -324,7 +324,7 @@ static int onenand_wait(struct mtd_info *mtd, int state)
}
 
if (interrupt & ONENAND_INT_READ) {
-   ecc = this->read_word(this->base + ONENAND_REG_ECC_STATUS);
+   int ecc = this->read_word(this->base + ONENAND_REG_ECC_STATUS);
if (ecc) {
DEBUG(MTD_DEBUG_LEVEL0, "onenand_wait: ECC error = 
0x%04x\n", ecc);
if (ecc & ONENAND_ECC_2BIT_ALL)
@@ -332,6 +332,7 @@ static int onenand_wait(struct mtd_info *mtd, int state)
else if (ecc & ONENAND_ECC_1BIT_ALL)
mtd->ecc_stats.corrected++;
}
+   return ecc;
}
 
return 0;
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[MTD] OneNAND: fix onenand_wait bug

2007-01-22 Thread Linux Kernel Mailing List
Gitweb: 
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=f62724873652ddb19edf7f92843e9456fe3be3ea
Commit: f62724873652ddb19edf7f92843e9456fe3be3ea
Parent: 85de3d9bc779c198f8667cffc291b0ecad082b5e
Author: Kyungmin Park <[EMAIL PROTECTED]>
AuthorDate: Fri Dec 22 16:02:50 2006 +0900
Committer:  Artem Bityutskiy <[EMAIL PROTECTED]>
CommitDate: Wed Jan 10 14:34:42 2007 +0200

[MTD] OneNAND: fix onenand_wait bug

Fix onenand_wait error reporting

Signed-off-by: Kyungmin Park <[EMAIL PROTECTED]>
---
 drivers/mtd/onenand/onenand_base.c |   38 ++-
 drivers/mtd/onenand/onenand_bbt.c  |3 +-
 2 files changed, 17 insertions(+), 24 deletions(-)

diff --git a/drivers/mtd/onenand/onenand_base.c 
b/drivers/mtd/onenand/onenand_base.c
index 63ca61b..3fab4d1 100644
--- a/drivers/mtd/onenand/onenand_base.c
+++ b/drivers/mtd/onenand/onenand_base.c
@@ -318,15 +318,10 @@ static int onenand_wait(struct mtd_info *mtd, int state)
ctrl = this->read_word(this->base + ONENAND_REG_CTRL_STATUS);
 
if (ctrl & ONENAND_CTRL_ERROR) {
-   /* It maybe occur at initial bad block */
DEBUG(MTD_DEBUG_LEVEL0, "onenand_wait: controller error = 
0x%04x\n", ctrl);
-   /* Clear other interrupt bits for preventing ECC error */
-   interrupt &= ONENAND_INT_MASTER;
-   }
-
-   if (ctrl & ONENAND_CTRL_LOCK) {
-   DEBUG(MTD_DEBUG_LEVEL0, "onenand_wait: it's locked error = 
0x%04x\n", ctrl);
-   return -EACCES;
+   if (ctrl & ONENAND_CTRL_LOCK)
+   DEBUG(MTD_DEBUG_LEVEL0, "onenand_wait: it's locked 
error.\n");
+   return ctrl;
}
 
if (interrupt & ONENAND_INT_READ) {
@@ -750,21 +745,21 @@ static int onenand_read(struct mtd_info *mtd, loff_t 
from, size_t len,
 
ret = this->wait(mtd, FL_READING);
/* First copy data and check return value for ECC 
handling */
-   onenand_update_bufferram(mtd, from, 1);
+   onenand_update_bufferram(mtd, from, !ret);
}
 
this->read_bufferram(mtd, ONENAND_DATARAM, buf, column, 
thislen);
 
-   read += thislen;
-
-   if (read == len)
-   break;
-
if (ret) {
DEBUG(MTD_DEBUG_LEVEL0, "onenand_read: read failed = 
%d\n", ret);
goto out;
}
 
+   read += thislen;
+
+   if (read == len)
+   break;
+
from += thislen;
buf += thislen;
}
@@ -832,16 +827,16 @@ int onenand_do_read_oob(struct mtd_info *mtd, loff_t 
from, size_t len,
 
this->read_bufferram(mtd, ONENAND_SPARERAM, buf, column, 
thislen);
 
+   if (ret) {
+   DEBUG(MTD_DEBUG_LEVEL0, "onenand_read_oob: read failed 
= 0x%x\n", ret);
+   goto out;
+   }
+
read += thislen;
 
if (read == len)
break;
 
-   if (ret) {
-   DEBUG(MTD_DEBUG_LEVEL0, "onenand_read_oob: read failed 
= %d\n", ret);
-   goto out;
-   }
-
buf += thislen;
 
/* Read more? */
@@ -1199,10 +1194,7 @@ static int onenand_erase(struct mtd_info *mtd, struct 
erase_info *instr)
ret = this->wait(mtd, FL_ERASING);
/* Check, if it is write protected */
if (ret) {
-   if (ret == -EPERM)
-   DEBUG(MTD_DEBUG_LEVEL0, "onenand_erase: Device 
is write protected!!!\n");
-   else
-   DEBUG(MTD_DEBUG_LEVEL0, "onenand_erase: Failed 
erase, block %d\n", (unsigned) (addr >> this->erase_shift));
+   DEBUG(MTD_DEBUG_LEVEL0, "onenand_erase: Failed erase, 
block %d\n", (unsigned) (addr >> this->erase_shift));
instr->state = MTD_ERASE_FAILED;
instr->fail_addr = addr;
goto erase_exit;
diff --git a/drivers/mtd/onenand/onenand_bbt.c 
b/drivers/mtd/onenand/onenand_bbt.c
index 6cceeca..98f8fd1 100644
--- a/drivers/mtd/onenand/onenand_bbt.c
+++ b/drivers/mtd/onenand/onenand_bbt.c
@@ -93,7 +93,8 @@ static int create_bbt(struct mtd_info *mtd, uint8_t *buf, 
struct nand_bbt_descr
ret = onenand_do_read_oob(mtd, from + j * 
mtd->writesize + bd->offs,
  readlen, &retlen, &buf[0]);
 
-   if (ret)
+   /* If it is a