[PATCH 4/5] [MTD/denali] Fixed ECC handler bug 1. when found ecc errors while reading, handler only process these errors =

Chuanxiao Dong chuanxiao.dong at intel.com
Mon Jun 21 06:46:10 EDT 2010


in MAIN area,
    just ignore these ecc errors in spare area
 2. corrected some wrong defines

Signed-off-by: Chuanxiao Dong <chuanxiao.dong at intel.com>
---
 drivers/mtd/nand/denali.c |   28 +++++++++++++++++-----------
 1 files changed, 17 insertions(+), 11 deletions(-)

diff --git a/drivers/mtd/nand/denali.c b/drivers/mtd/nand/denali.c
index 57818eb..1555921 100644
--- a/drivers/mtd/nand/denali.c
+++ b/drivers/mtd/nand/denali.c
@@ -1382,12 +1382,12 @@ bool is_erased(uint8_t *buf, int len)
 #define ECC_SECTOR(x)	(((x) & ECC_ERROR_ADDRESS__SECTOR_NR) >> 12)
 #define ECC_BYTE(x)	(((x) & ECC_ERROR_ADDRESS__OFFSET))
 #define ECC_CORRECTION_VALUE(x) ((x) & ERR_CORRECTION_INFO__BYTEMASK)
-#define ECC_ERROR_CORRECTABLE(x) (!((x) & ERR_CORRECTION_INFO))
-#define ECC_ERR_DEVICE(x)	((x) & ERR_CORRECTION_INFO__DEVICE_NR >> 8)
+#define ECC_ERROR_CORRECTABLE(x) (!((x) & ERR_CORRECTION_INFO__ERROR_TYPE)=
)
+#define ECC_ERR_DEVICE(x)	(((x) & ERR_CORRECTION_INFO__DEVICE_NR) >> 8)
 #define ECC_LAST_ERR(x)		((x) & ERR_CORRECTION_INFO__LAST_ERR_INFO)
=20
 static bool handle_ecc(struct denali_nand_info *denali, uint8_t *buf,
-			uint8_t *oobbuf, uint32_t irq_status)
+			uint32_t irq_status)
 {
 	bool check_erased_page =3D false;
=20
@@ -1412,13 +1412,19 @@ static bool handle_ecc(struct denali_nand_info *den=
ali, uint8_t *buf,
=20
 			if (ECC_ERROR_CORRECTABLE(err_correction_info)) {
 				/* offset in our buffer is computed as:
-				   sector number * sector size + offset in
-				   sector
-				 */
-				int offset =3D (err_sector * ECC_SECTOR_SIZE +
-						err_byte) * denali->devnum +
-						err_device;
-				if (offset < denali->mtd.writesize) {
+				 * sector number * sector size + offset in
+				 * sector + err_device
+				 * If err_byte is larger than ECC_SECTOR_SIZE,
+				 * means error happend in OOB, so we ignore
+				 * it. It's no need for us to correct it
+				 * */
+				if (err_byte < ECC_SECTOR_SIZE) {
+					int offset;
+					offset =3D (err_sector *
+							ECC_SECTOR_SIZE +
+							err_byte) *
+							denali->devnum +
+							err_device;
 					/* correct the ECC error */
 					buf[offset] ^=3D err_correction_value;
 					denali->mtd.ecc_stats.corrected++;
@@ -1604,7 +1610,7 @@ static int denali_read_page(struct mtd_info *mtd, str=
uct nand_chip *chip,
=20
 	memcpy(buf, denali->buf.buf, mtd->writesize);
=20
-	check_erased_page =3D handle_ecc(denali, buf, chip->oob_poi, irq_status);
+	check_erased_page =3D handle_ecc(denali, buf, irq_status);
 	denali_enable_dma(denali, false);
=20
 	if (check_erased_page) {
--=20
1.6.6.1


--_002_5D8008F58939784290FAB48F549751981D09B718B6shsmsx502ccrc_
Content-Type: application/octet-stream;
	name="0004-MTD-denali-Fixed-ECC-handler-bug.patch"
Content-Description: 0004-MTD-denali-Fixed-ECC-handler-bug.patch
Content-Disposition: attachment;
	filename="0004-MTD-denali-Fixed-ECC-handler-bug.patch"; size=2816;
	creation-date="Mon, 21 Jun 2010 18:56:23 GMT";
	modification-date="Mon, 21 Jun 2010 18:56:23 GMT"
Content-Transfer-Encoding: base64

RnJvbSBiNzAyMTNmYWE0NWZmZDQzMmQxN2IyZjNjNDVjNjg2MjFmMTUyODFiIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBDaHVhbnhpYW8gRG9uZyA8Y2h1YW54aWFvLmRvbmdAaW50ZWwu
Y29tPgpEYXRlOiBNb24sIDIxIEp1biAyMDEwIDE4OjQ2OjEwICswODAwClN1YmplY3Q6IFtQQVRD
SCA0LzVdIFtNVEQvZGVuYWxpXSBGaXhlZCBFQ0MgaGFuZGxlciBidWcKIDEuIHdoZW4gZm91bmQg
ZWNjIGVycm9ycyB3aGlsZSByZWFkaW5nLCBoYW5kbGVyIG9ubHkgcHJvY2VzcyB0aGVzZSBlcnJv
cnMgaW4gTUFJTiBhcmVhLAogICAganVzdCBpZ25vcmUgdGhlc2UgZWNjIGVycm9ycyBpbiBzcGFy
ZSBhcmVhCiAyLiBjb3JyZWN0ZWQgc29tZSB3cm9uZyBkZWZpbmVzCgpTaWduZWQtb2ZmLWJ5OiBD
aHVhbnhpYW8gRG9uZyA8Y2h1YW54aWFvLmRvbmdAaW50ZWwuY29tPgotLS0KIGRyaXZlcnMvbXRk
L25hbmQvZGVuYWxpLmMgfCAgIDI4ICsrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0KIDEgZmls
ZXMgY2hhbmdlZCwgMTcgaW5zZXJ0aW9ucygrKSwgMTEgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0
IGEvZHJpdmVycy9tdGQvbmFuZC9kZW5hbGkuYyBiL2RyaXZlcnMvbXRkL25hbmQvZGVuYWxpLmMK
aW5kZXggNTc4MThlYi4uMTU1NTkyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9kZW5h
bGkuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL2RlbmFsaS5jCkBAIC0xMzgyLDEyICsxMzgyLDEy
IEBAIGJvb2wgaXNfZXJhc2VkKHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbikKICNkZWZpbmUgRUNDX1NF
Q1RPUih4KQkoKCh4KSAmIEVDQ19FUlJPUl9BRERSRVNTX19TRUNUT1JfTlIpID4+IDEyKQogI2Rl
ZmluZSBFQ0NfQllURSh4KQkoKCh4KSAmIEVDQ19FUlJPUl9BRERSRVNTX19PRkZTRVQpKQogI2Rl
ZmluZSBFQ0NfQ09SUkVDVElPTl9WQUxVRSh4KSAoKHgpICYgRVJSX0NPUlJFQ1RJT05fSU5GT19f
QllURU1BU0spCi0jZGVmaW5lIEVDQ19FUlJPUl9DT1JSRUNUQUJMRSh4KSAoISgoeCkgJiBFUlJf
Q09SUkVDVElPTl9JTkZPKSkKLSNkZWZpbmUgRUNDX0VSUl9ERVZJQ0UoeCkJKCh4KSAmIEVSUl9D
T1JSRUNUSU9OX0lORk9fX0RFVklDRV9OUiA+PiA4KQorI2RlZmluZSBFQ0NfRVJST1JfQ09SUkVD
VEFCTEUoeCkgKCEoKHgpICYgRVJSX0NPUlJFQ1RJT05fSU5GT19fRVJST1JfVFlQRSkpCisjZGVm
aW5lIEVDQ19FUlJfREVWSUNFKHgpCSgoKHgpICYgRVJSX0NPUlJFQ1RJT05fSU5GT19fREVWSUNF
X05SKSA+PiA4KQogI2RlZmluZSBFQ0NfTEFTVF9FUlIoeCkJCSgoeCkgJiBFUlJfQ09SUkVDVElP
Tl9JTkZPX19MQVNUX0VSUl9JTkZPKQogCiBzdGF0aWMgYm9vbCBoYW5kbGVfZWNjKHN0cnVjdCBk
ZW5hbGlfbmFuZF9pbmZvICpkZW5hbGksIHVpbnQ4X3QgKmJ1ZiwKLQkJCXVpbnQ4X3QgKm9vYmJ1
ZiwgdWludDMyX3QgaXJxX3N0YXR1cykKKwkJCXVpbnQzMl90IGlycV9zdGF0dXMpCiB7CiAJYm9v
bCBjaGVja19lcmFzZWRfcGFnZSA9IGZhbHNlOwogCkBAIC0xNDEyLDEzICsxNDEyLDE5IEBAIHN0
YXRpYyBib29sIGhhbmRsZV9lY2Moc3RydWN0IGRlbmFsaV9uYW5kX2luZm8gKmRlbmFsaSwgdWlu
dDhfdCAqYnVmLAogCiAJCQlpZiAoRUNDX0VSUk9SX0NPUlJFQ1RBQkxFKGVycl9jb3JyZWN0aW9u
X2luZm8pKSB7CiAJCQkJLyogb2Zmc2V0IGluIG91ciBidWZmZXIgaXMgY29tcHV0ZWQgYXM6Ci0J
CQkJICAgc2VjdG9yIG51bWJlciAqIHNlY3RvciBzaXplICsgb2Zmc2V0IGluCi0JCQkJICAgc2Vj
dG9yCi0JCQkJICovCi0JCQkJaW50IG9mZnNldCA9IChlcnJfc2VjdG9yICogRUNDX1NFQ1RPUl9T
SVpFICsKLQkJCQkJCWVycl9ieXRlKSAqIGRlbmFsaS0+ZGV2bnVtICsKLQkJCQkJCWVycl9kZXZp
Y2U7Ci0JCQkJaWYgKG9mZnNldCA8IGRlbmFsaS0+bXRkLndyaXRlc2l6ZSkgeworCQkJCSAqIHNl
Y3RvciBudW1iZXIgKiBzZWN0b3Igc2l6ZSArIG9mZnNldCBpbgorCQkJCSAqIHNlY3RvciArIGVy
cl9kZXZpY2UKKwkJCQkgKiBJZiBlcnJfYnl0ZSBpcyBsYXJnZXIgdGhhbiBFQ0NfU0VDVE9SX1NJ
WkUsCisJCQkJICogbWVhbnMgZXJyb3IgaGFwcGVuZCBpbiBPT0IsIHNvIHdlIGlnbm9yZQorCQkJ
CSAqIGl0LiBJdCdzIG5vIG5lZWQgZm9yIHVzIHRvIGNvcnJlY3QgaXQKKwkJCQkgKiAqLworCQkJ
CWlmIChlcnJfYnl0ZSA8IEVDQ19TRUNUT1JfU0laRSkgeworCQkJCQlpbnQgb2Zmc2V0OworCQkJ
CQlvZmZzZXQgPSAoZXJyX3NlY3RvciAqCisJCQkJCQkJRUNDX1NFQ1RPUl9TSVpFICsKKwkJCQkJ
CQllcnJfYnl0ZSkgKgorCQkJCQkJCWRlbmFsaS0+ZGV2bnVtICsKKwkJCQkJCQllcnJfZGV2aWNl
OwogCQkJCQkvKiBjb3JyZWN0IHRoZSBFQ0MgZXJyb3IgKi8KIAkJCQkJYnVmW29mZnNldF0gXj0g
ZXJyX2NvcnJlY3Rpb25fdmFsdWU7CiAJCQkJCWRlbmFsaS0+bXRkLmVjY19zdGF0cy5jb3JyZWN0
ZWQrKzsKQEAgLTE2MDQsNyArMTYxMCw3IEBAIHN0YXRpYyBpbnQgZGVuYWxpX3JlYWRfcGFnZShz
dHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwKIAogCW1lbWNweShi
dWYsIGRlbmFsaS0+YnVmLmJ1ZiwgbXRkLT53cml0ZXNpemUpOwogCi0JY2hlY2tfZXJhc2VkX3Bh
Z2UgPSBoYW5kbGVfZWNjKGRlbmFsaSwgYnVmLCBjaGlwLT5vb2JfcG9pLCBpcnFfc3RhdHVzKTsK
KwljaGVja19lcmFzZWRfcGFnZSA9IGhhbmRsZV9lY2MoZGVuYWxpLCBidWYsIGlycV9zdGF0dXMp
OwogCWRlbmFsaV9lbmFibGVfZG1hKGRlbmFsaSwgZmFsc2UpOwogCiAJaWYgKGNoZWNrX2VyYXNl
ZF9wYWdlKSB7Ci0tIAoxLjYuNi4xCgo=

--_002_5D8008F58939784290FAB48F549751981D09B718B6shsmsx502ccrc_--



More information about the linux-mtd mailing list