Message ID | u2v70c9a9111004300305n4c86774bm7ed70161ad72d830@mail.gmail.com |
---|---|
State | New, archived |
Headers | show |
Probably Adrian could comment on this? On Fri, 2010-04-30 at 12:05 +0200, Enric Balletbò i Serra wrote: > Hello all, > > After commit 5988af2319781bc8e0ce418affec4e09cfa77907 (mtd: > Flex-OneNAND support) the onenand support for my device is broken. > > Before this commit when I run the nandtest program all is ok > --- > # nandtest /dev/mtd3 > ECC corrections: 0 > ECC failures : 0 > Bad blocks : 0 > BBT blocks : 0 > 002c0000: checking... > Finished pass 1 successfully > -- > > Introduced commit 5988af2319781bc8e0ce418affec4e09cfa7790 the nandtest > fails with: > --- > # nandtest /dev/mtd3 > ECC corrections: 0 > ECC failures : 0 > Bad blocks : 0 > BBT blocks : 0 > 00000000: reading... > [ 299.092041] onenand_wait: ECC error = 0x8488 > ( ... lots of ECC errors ... ) > [ 299.092041] onenand_wait: ECC error = 0x8488 > ECC failed at 00000000 > 00000000: checking... > compare failed. seed 1804289383 > Byte 0x1 is 5a should be da > Byte 0x3 is 82 should be 92 > Byte 0x4 is 10 should be 1a > ( ... ) > --- > > Investigating a little I see a significant difference introduced by > this patch. In line > > 347: page = (int) (addr - onenand_addr(this, block)) >> > this->page_shift; (patch applied) > > instead of > > 347: page = (int) (addr >> this->page_shift); (without patch) > > I applied commit 5988af2319781bc8e0ce418affec4e09cfa7790 and replaced > the line 347 and now works again. Fantastic, but I suspect this is not > the proper solution (probably this breaks other onenands devices, I > can't test). > > I'm just introducing in OneNAND devices so anyone can help me to > understand and solve the problem ? Note that my device is a Numonyx > 4-Gbit DDP (DUAL DIE PLAN) OneNAND flash memory ( 2 dice of 2Gb, 2KB > page ) > > Thanks in advance, > > ///:~Enric > > --- > diff --git a/drivers/mtd/onenand/onenand_base.c > b/drivers/mtd/onenand/onenand_base.c > index 081f97d..b1d50a3 100644 > --- a/drivers/mtd/onenand/onenand_base.c > +++ b/drivers/mtd/onenand/onenand_base.c > @@ -344,7 +344,7 @@ static int onenand_command(struct mtd_info *mtd, > int cmd, loff_t addr, size_t le > > default: > block = (int) onenand_block(this, addr); > - page = (int) (addr - onenand_addr(this, block)) >> this->page_shift; > + page = (int) (addr >> this->page_shift); > > if (ONENAND_IS_2PLANE(this)) { > /* Make the even block number */ > --- > > ______________________________________________________ > Linux MTD discussion mailing list > http://lists.infradead.org/mailman/listinfo/linux-mtd/
Hi, Can you add this statement at below the code? printk("%s[%d] page %d, %d, %d\n", __func__, __LINE__, page, (int) onenand_addr(this, block), ((int) addr >> this->page_shift) & this->page_mask); In my test environment, it displays the correct page number. (addr - onenand_addr(this, block) >> this->page_shift is same as '(addr >> this->page_shift) & this->page_mask'. Thank you, Kyungmin Park On Fri, Apr 30, 2010 at 7:05 PM, Enric Balletbò i Serra <eballetbo@gmail.com> wrote: > Hello all, > > After commit 5988af2319781bc8e0ce418affec4e09cfa77907 (mtd: > Flex-OneNAND support) the onenand support for my device is broken. > > Before this commit when I run the nandtest program all is ok > --- > # nandtest /dev/mtd3 > ECC corrections: 0 > ECC failures : 0 > Bad blocks : 0 > BBT blocks : 0 > 002c0000: checking... > Finished pass 1 successfully > -- > > Introduced commit 5988af2319781bc8e0ce418affec4e09cfa7790 the nandtest > fails with: > --- > # nandtest /dev/mtd3 > ECC corrections: 0 > ECC failures : 0 > Bad blocks : 0 > BBT blocks : 0 > 00000000: reading... > [ 299.092041] onenand_wait: ECC error = 0x8488 > ( ... lots of ECC errors ... ) > [ 299.092041] onenand_wait: ECC error = 0x8488 > ECC failed at 00000000 > 00000000: checking... > compare failed. seed 1804289383 > Byte 0x1 is 5a should be da > Byte 0x3 is 82 should be 92 > Byte 0x4 is 10 should be 1a > ( ... ) > --- > > Investigating a little I see a significant difference introduced by > this patch. In line > > 347: page = (int) (addr - onenand_addr(this, block)) >> > this->page_shift; (patch applied) > > instead of > > 347: page = (int) (addr >> this->page_shift); (without patch) > > I applied commit 5988af2319781bc8e0ce418affec4e09cfa7790 and replaced > the line 347 and now works again. Fantastic, but I suspect this is not > the proper solution (probably this breaks other onenands devices, I > can't test). > > I'm just introducing in OneNAND devices so anyone can help me to > understand and solve the problem ? Note that my device is a Numonyx > 4-Gbit DDP (DUAL DIE PLAN) OneNAND flash memory ( 2 dice of 2Gb, 2KB > page ) > > Thanks in advance, > > ///:~Enric > > --- > diff --git a/drivers/mtd/onenand/onenand_base.c > b/drivers/mtd/onenand/onenand_base.c > index 081f97d..b1d50a3 100644 > --- a/drivers/mtd/onenand/onenand_base.c > +++ b/drivers/mtd/onenand/onenand_base.c > @@ -344,7 +344,7 @@ static int onenand_command(struct mtd_info *mtd, > int cmd, loff_t addr, size_t le > > default: > block = (int) onenand_block(this, addr); > - page = (int) (addr - onenand_addr(this, block)) >> this->page_shift; > + page = (int) (addr >> this->page_shift); > > if (ONENAND_IS_2PLANE(this)) { > /* Make the even block number */ > --- > > ______________________________________________________ > Linux MTD discussion mailing list > http://lists.infradead.org/mailman/listinfo/linux-mtd/ >
Hi, 2010/5/6 Kyungmin Park <kyungmin.park@samsung.com>: > Hi, > > Can you add this statement at below the code? > printk("%s[%d] page %d, %d, %d\n", __func__, __LINE__, page, (int) > onenand_addr(this, block), ((int) addr >> this->page_shift) & > this->page_mask); Yes, With this code nandtest fails: onenand_base.c 377: default: block = onenand_block(this, addr); /* (line disabled) page = (int) (addr >> this->page_shift); */ page = (int) (addr - onenand_addr(this, block)) >> this->page_shift; printk("%s[%d] page %d, %d, %d\n", __func__, __LINE__, page, (int) onenand_addr(this, block), ((int) addr >> this->page_shift) & this->page_mask); if (ONENAND_IS_2PLANE(this)) { /* Make the even block number */ block &= ~1; /* Is it the odd plane? */ if (addr & this->writesize) block++; page >>= 1; } page &= this->page_mask; break; --- start log nandtest fail --- # nandtest -l 262144 /dev/mtd3 ECC corrections: 0 ECC failures : 0 Bad blocks : 0 BBT blocks : 0 00000000: writing... [ 243.144287] onenand_command[382] page 0, 2621440, 0 [ 243.150787] onenand_command[382] page 2, 2621440, 2 [ 243.156158] onenand_command[382] page 4, 2621440, 4 (...) [ 243.310729] onenand_command[382] page 60, 2621440, 60 [ 243.316223] onenand_command[382] page 62, 2621440, 62 [ 243.322204] onenand_command[382] page 0, 2752512, 0 [ 243.327636] onenand_command[382] page 2, 2752512, 2 [ 243.332977] onenand_command[382] page 4, 2752512, 4 (...) [ 243.487487] onenand_command[382] page 60, 2752512, 60 [ 243.493041] onenand_command[382] page 62, 2752512, 62 00000000: reading... [ 243.498535] onenand_command[382] page 0, 2621440, 0 [ 243.505249] onenand_wait: ECC error = 0x8488 [ 243.509552] onenand_command[382] page 1, 2621440, 1 [ 243.514587] onenand_wait: ECC error = 0x8488 [ 243.518890] onenand_command[382] page 2, 2621440, 2 (...) [ 244.089050] onenand_command[382] page 62, 2621440, 62 [ 244.094268] onenand_wait: ECC error = 0x8448 [ 244.098602] onenand_command[382] page 63, 2621440, 63 [ 244.103790] onenand_wait: ECC error = 0x8488 [ 244.109191] onenand_command[382] page 0, 2752512, 0 [ 244.114196] onenand_wait: ECC error = 0x8488 [ 244.118469] onenand_command[382] page 1, 2752512, 1 [ 244.123535] onenand_wait: ECC error = 0x8488 [ 244.127838] onenand_command[382] page 2, 2752512, 2 (...) [ 244.698150] onenand_command[382] page 62, 2752512, 62 [ 244.703369] onenand_wait: ECC error = 0x8448 [ 244.707672] onenand_command[382] page 63, 2752512, 63 [ 244.712890] onenand_wait: ECC error = 0x8488 ECC failed at 00000000 00000000: checking... compare failed. seed 1804289383 Byte 0x1 is 5a should be da Byte 0x3 is 82 should be 92 Byte 0x4 is 10 should be 1a Byte 0x5 is 21 should be b7 --- end log nandtest fail --- With this other code nandtest pass onenand_base.c 377: default: block = onenand_block(this, addr); page = (int) (addr >> this->page_shift); /* (line disabled) page = (int) (addr - onenand_addr(this, block)) >> this->page_shift; */ printk("%s[%d] page %d, %d, %d\n", __func__, __LINE__, page, (int) onenand_addr(this, block), ((int) addr >> this->page_shift) & this->page_mask); if (ONENAND_IS_2PLANE(this)) { /* Make the even block number */ block &= ~1; /* Is it the odd plane? */ if (addr & this->writesize) block++; page >>= 1; } page &= this->page_mask; break; --- start log nandtest pass --- # nandtest -l 262144 /dev/mtd3 ECC corrections: 0 ECC failures : 33 Bad blocks : 0 BBT blocks : 0 00000000: writing... [ 2024.624664] onenand_command[382] page 1280, 2621440, 0 [ 2024.631530] onenand_command[382] page 1282, 2621440, 2 [ 2024.637145] onenand_command[382] page 1284, 2621440, 4 (...) [ 2024.796813] onenand_command[382] page 1340, 2621440, 60 [ 2024.802520] onenand_command[382] page 1342, 2621440, 62 [ 2024.808593] onenand_command[382] page 1344, 2752512, 0 [ 2024.814239] onenand_command[382] page 1346, 2752512, 2 (...) [ 2024.979644] onenand_command[382] page 1404, 2752512, 60 [ 2024.985351] onenand_command[382] page 1406, 2752512, 62 00000000: reading... [ 2024.990997] onenand_command[382] page 1280, 2621440, 0 [ 2024.997985] onenand_command[382] page 1281, 2621440, 1 [ 2025.003295] onenand_command[382] page 1282, 2621440, 2 (...) [ 2025.326782] onenand_command[382] page 1342, 2621440, 62 [ 2025.332214] onenand_command[382] page 1343, 2621440, 63 [ 2025.338592] onenand_command[382] page 1344, 2752512, 0 [ 2025.343811] onenand_command[382] page 1345, 2752512, 1 [ 2025.349151] onenand_command[382] page 1346, 2752512, 2 (...) [ 2025.672576] onenand_command[382] page 1406, 2752512, 62 [ 2025.677978] onenand_command[382] page 1407, 2752512, 63 00000000: checking... Finished pass 1 successfully --- end log nandtest pass --- > > In my test environment, it displays the correct page number. > (addr - onenand_addr(this, block) >> this->page_shift is same as > '(addr >> this->page_shift) & this->page_mask'. > Looks like page number is wrong ? Cheers, Enric > Thank you, > Kyungmin Park > > On Fri, Apr 30, 2010 at 7:05 PM, Enric Balletbò i Serra > <eballetbo@gmail.com> wrote: >> Hello all, >> >> After commit 5988af2319781bc8e0ce418affec4e09cfa77907 (mtd: >> Flex-OneNAND support) the onenand support for my device is broken. >> >> Before this commit when I run the nandtest program all is ok >> --- >> # nandtest /dev/mtd3 >> ECC corrections: 0 >> ECC failures : 0 >> Bad blocks : 0 >> BBT blocks : 0 >> 002c0000: checking... >> Finished pass 1 successfully >> -- >> >> Introduced commit 5988af2319781bc8e0ce418affec4e09cfa7790 the nandtest >> fails with: >> --- >> # nandtest /dev/mtd3 >> ECC corrections: 0 >> ECC failures : 0 >> Bad blocks : 0 >> BBT blocks : 0 >> 00000000: reading... >> [ 299.092041] onenand_wait: ECC error = 0x8488 >> ( ... lots of ECC errors ... ) >> [ 299.092041] onenand_wait: ECC error = 0x8488 >> ECC failed at 00000000 >> 00000000: checking... >> compare failed. seed 1804289383 >> Byte 0x1 is 5a should be da >> Byte 0x3 is 82 should be 92 >> Byte 0x4 is 10 should be 1a >> ( ... ) >> --- >> >> Investigating a little I see a significant difference introduced by >> this patch. In line >> >> 347: page = (int) (addr - onenand_addr(this, block)) >> >> this->page_shift; (patch applied) >> >> instead of >> >> 347: page = (int) (addr >> this->page_shift); (without patch) >> >> I applied commit 5988af2319781bc8e0ce418affec4e09cfa7790 and replaced >> the line 347 and now works again. Fantastic, but I suspect this is not >> the proper solution (probably this breaks other onenands devices, I >> can't test). >> >> I'm just introducing in OneNAND devices so anyone can help me to >> understand and solve the problem ? Note that my device is a Numonyx >> 4-Gbit DDP (DUAL DIE PLAN) OneNAND flash memory ( 2 dice of 2Gb, 2KB >> page ) >> >> Thanks in advance, >> >> ///:~Enric >> >> --- >> diff --git a/drivers/mtd/onenand/onenand_base.c >> b/drivers/mtd/onenand/onenand_base.c >> index 081f97d..b1d50a3 100644 >> --- a/drivers/mtd/onenand/onenand_base.c >> +++ b/drivers/mtd/onenand/onenand_base.c >> @@ -344,7 +344,7 @@ static int onenand_command(struct mtd_info *mtd, >> int cmd, loff_t addr, size_t le >> >> default: >> block = (int) onenand_block(this, addr); >> - page = (int) (addr - onenand_addr(this, block)) >> this->page_shift; >> + page = (int) (addr >> this->page_shift); >> >> if (ONENAND_IS_2PLANE(this)) { >> /* Make the even block number */ >> --- >> >> ______________________________________________________ >> Linux MTD discussion mailing list >> http://lists.infradead.org/mailman/listinfo/linux-mtd/ >> >
Hi, What's your chip version? maybe some mis-probe it seems to be probed at 4KiB pagesize OneNAND. Thank you, Kyungmin Park On Thu, May 6, 2010 at 8:22 PM, Enric Balletbò i Serra <eballetbo@gmail.com> wrote: > Hi, > > 2010/5/6 Kyungmin Park <kyungmin.park@samsung.com>: >> Hi, >> >> Can you add this statement at below the code? >> printk("%s[%d] page %d, %d, %d\n", __func__, __LINE__, page, (int) >> onenand_addr(this, block), ((int) addr >> this->page_shift) & >> this->page_mask); > > Yes, > > With this code nandtest fails: > > onenand_base.c > > 377: default: > block = onenand_block(this, addr); > /* (line disabled) page = (int) (addr >> this->page_shift); */ > page = (int) (addr - onenand_addr(this, block)) >> > this->page_shift; > > printk("%s[%d] page %d, %d, %d\n", __func__, __LINE__, > page, (int) > onenand_addr(this, block), ((int) addr >> > this->page_shift) & > this->page_mask); > > if (ONENAND_IS_2PLANE(this)) { > /* Make the even block number */ > block &= ~1; > /* Is it the odd plane? */ > if (addr & this->writesize) > block++; > page >>= 1; > } > page &= this->page_mask; > break; > > > --- start log nandtest fail --- > # nandtest -l 262144 /dev/mtd3 > ECC corrections: 0 > ECC failures : 0 > Bad blocks : 0 > BBT blocks : 0 > 00000000: writing... > [ 243.144287] onenand_command[382] page 0, 2621440, 0 > [ 243.150787] onenand_command[382] page 2, 2621440, 2 > [ 243.156158] onenand_command[382] page 4, 2621440, 4 > (...) > [ 243.310729] onenand_command[382] page 60, 2621440, 60 > [ 243.316223] onenand_command[382] page 62, 2621440, 62 > [ 243.322204] onenand_command[382] page 0, 2752512, 0 > [ 243.327636] onenand_command[382] page 2, 2752512, 2 > [ 243.332977] onenand_command[382] page 4, 2752512, 4 > (...) > [ 243.487487] onenand_command[382] page 60, 2752512, 60 > [ 243.493041] onenand_command[382] page 62, 2752512, 62 > 00000000: reading... > [ 243.498535] onenand_command[382] page 0, 2621440, 0 > [ 243.505249] onenand_wait: ECC error = 0x8488 > [ 243.509552] onenand_command[382] page 1, 2621440, 1 > [ 243.514587] onenand_wait: ECC error = 0x8488 > [ 243.518890] onenand_command[382] page 2, 2621440, 2 > (...) > [ 244.089050] onenand_command[382] page 62, 2621440, 62 > [ 244.094268] onenand_wait: ECC error = 0x8448 > [ 244.098602] onenand_command[382] page 63, 2621440, 63 > [ 244.103790] onenand_wait: ECC error = 0x8488 > [ 244.109191] onenand_command[382] page 0, 2752512, 0 > [ 244.114196] onenand_wait: ECC error = 0x8488 > [ 244.118469] onenand_command[382] page 1, 2752512, 1 > [ 244.123535] onenand_wait: ECC error = 0x8488 > [ 244.127838] onenand_command[382] page 2, 2752512, 2 > (...) > [ 244.698150] onenand_command[382] page 62, 2752512, 62 > [ 244.703369] onenand_wait: ECC error = 0x8448 > [ 244.707672] onenand_command[382] page 63, 2752512, 63 > [ 244.712890] onenand_wait: ECC error = 0x8488 > > ECC failed at 00000000 > 00000000: checking... > compare failed. seed 1804289383 > Byte 0x1 is 5a should be da > Byte 0x3 is 82 should be 92 > Byte 0x4 is 10 should be 1a > Byte 0x5 is 21 should be b7 > > --- end log nandtest fail --- > > > With this other code nandtest pass > > onenand_base.c > > 377: default: > block = onenand_block(this, addr); > page = (int) (addr >> this->page_shift); > /* (line disabled) page = (int) (addr - onenand_addr(this, block)) >> > this->page_shift; */ > > printk("%s[%d] page %d, %d, %d\n", __func__, __LINE__, > page, (int) > onenand_addr(this, block), ((int) addr >> > this->page_shift) & > this->page_mask); > > if (ONENAND_IS_2PLANE(this)) { > /* Make the even block number */ > block &= ~1; > /* Is it the odd plane? */ > if (addr & this->writesize) > block++; > page >>= 1; > } > page &= this->page_mask; > break; > > --- start log nandtest pass --- > # nandtest -l 262144 /dev/mtd3 > ECC corrections: 0 > ECC failures : 33 > Bad blocks : 0 > BBT blocks : 0 > 00000000: writing... > [ 2024.624664] onenand_command[382] page 1280, 2621440, 0 > [ 2024.631530] onenand_command[382] page 1282, 2621440, 2 > [ 2024.637145] onenand_command[382] page 1284, 2621440, 4 > (...) > [ 2024.796813] onenand_command[382] page 1340, 2621440, 60 > [ 2024.802520] onenand_command[382] page 1342, 2621440, 62 > [ 2024.808593] onenand_command[382] page 1344, 2752512, 0 > [ 2024.814239] onenand_command[382] page 1346, 2752512, 2 > (...) > [ 2024.979644] onenand_command[382] page 1404, 2752512, 60 > [ 2024.985351] onenand_command[382] page 1406, 2752512, 62 > 00000000: reading... > [ 2024.990997] onenand_command[382] page 1280, 2621440, 0 > [ 2024.997985] onenand_command[382] page 1281, 2621440, 1 > [ 2025.003295] onenand_command[382] page 1282, 2621440, 2 > (...) > > [ 2025.326782] onenand_command[382] page 1342, 2621440, 62 > [ 2025.332214] onenand_command[382] page 1343, 2621440, 63 > [ 2025.338592] onenand_command[382] page 1344, 2752512, 0 > [ 2025.343811] onenand_command[382] page 1345, 2752512, 1 > [ 2025.349151] onenand_command[382] page 1346, 2752512, 2 > (...) > [ 2025.672576] onenand_command[382] page 1406, 2752512, 62 > [ 2025.677978] onenand_command[382] page 1407, 2752512, 63 > 00000000: checking... > Finished pass 1 successfully > --- end log nandtest pass --- > >> >> In my test environment, it displays the correct page number. >> (addr - onenand_addr(this, block) >> this->page_shift is same as >> '(addr >> this->page_shift) & this->page_mask'. >> > > Looks like page number is wrong ? > > Cheers, > > Enric > >> Thank you, >> Kyungmin Park >> >> On Fri, Apr 30, 2010 at 7:05 PM, Enric Balletbò i Serra >> <eballetbo@gmail.com> wrote: >>> Hello all, >>> >>> After commit 5988af2319781bc8e0ce418affec4e09cfa77907 (mtd: >>> Flex-OneNAND support) the onenand support for my device is broken. >>> >>> Before this commit when I run the nandtest program all is ok >>> --- >>> # nandtest /dev/mtd3 >>> ECC corrections: 0 >>> ECC failures : 0 >>> Bad blocks : 0 >>> BBT blocks : 0 >>> 002c0000: checking... >>> Finished pass 1 successfully >>> -- >>> >>> Introduced commit 5988af2319781bc8e0ce418affec4e09cfa7790 the nandtest >>> fails with: >>> --- >>> # nandtest /dev/mtd3 >>> ECC corrections: 0 >>> ECC failures : 0 >>> Bad blocks : 0 >>> BBT blocks : 0 >>> 00000000: reading... >>> [ 299.092041] onenand_wait: ECC error = 0x8488 >>> ( ... lots of ECC errors ... ) >>> [ 299.092041] onenand_wait: ECC error = 0x8488 >>> ECC failed at 00000000 >>> 00000000: checking... >>> compare failed. seed 1804289383 >>> Byte 0x1 is 5a should be da >>> Byte 0x3 is 82 should be 92 >>> Byte 0x4 is 10 should be 1a >>> ( ... ) >>> --- >>> >>> Investigating a little I see a significant difference introduced by >>> this patch. In line >>> >>> 347: page = (int) (addr - onenand_addr(this, block)) >> >>> this->page_shift; (patch applied) >>> >>> instead of >>> >>> 347: page = (int) (addr >> this->page_shift); (without patch) >>> >>> I applied commit 5988af2319781bc8e0ce418affec4e09cfa7790 and replaced >>> the line 347 and now works again. Fantastic, but I suspect this is not >>> the proper solution (probably this breaks other onenands devices, I >>> can't test). >>> >>> I'm just introducing in OneNAND devices so anyone can help me to >>> understand and solve the problem ? Note that my device is a Numonyx >>> 4-Gbit DDP (DUAL DIE PLAN) OneNAND flash memory ( 2 dice of 2Gb, 2KB >>> page ) >>> >>> Thanks in advance, >>> >>> ///:~Enric >>> >>> --- >>> diff --git a/drivers/mtd/onenand/onenand_base.c >>> b/drivers/mtd/onenand/onenand_base.c >>> index 081f97d..b1d50a3 100644 >>> --- a/drivers/mtd/onenand/onenand_base.c >>> +++ b/drivers/mtd/onenand/onenand_base.c >>> @@ -344,7 +344,7 @@ static int onenand_command(struct mtd_info *mtd, >>> int cmd, loff_t addr, size_t le >>> >>> default: >>> block = (int) onenand_block(this, addr); >>> - page = (int) (addr - onenand_addr(this, block)) >> this->page_shift; >>> + page = (int) (addr >> this->page_shift); >>> >>> if (ONENAND_IS_2PLANE(this)) { >>> /* Make the even block number */ >>> --- >>> >>> ______________________________________________________ >>> Linux MTD discussion mailing list >>> http://lists.infradead.org/mailman/listinfo/linux-mtd/ >>> >> > -- > To unsubscribe from this list: send the line "unsubscribe linux-omap" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html >
Hi, 2010/5/6 Kyungmin Park <kmpark@infradead.org>: > Hi, > > What's your chip version? maybe some mis-probe it seems to be probed > at 4KiB pagesize OneNAND. Is a 4-Gbit DDP OneNAND device from Numonyx composed of two 2-Gbit 2KB page dice stacked together, the device is equipped with two DataRAMs, and two-plane NAND Flash memory array, These two component enables simultaneous program of 4KiB ( CONFIG_MTD_ONENAND_2X_PROGRAM) Cheers, Enric > > Thank you, > Kyungmin Park > > On Thu, May 6, 2010 at 8:22 PM, Enric Balletbò i Serra > <eballetbo@gmail.com> wrote: >> Hi, >> >> 2010/5/6 Kyungmin Park <kyungmin.park@samsung.com>: >>> Hi, >>> >>> Can you add this statement at below the code? >>> printk("%s[%d] page %d, %d, %d\n", __func__, __LINE__, page, (int) >>> onenand_addr(this, block), ((int) addr >> this->page_shift) & >>> this->page_mask); >> >> Yes, >> >> With this code nandtest fails: >> >> onenand_base.c >> >> 377: default: >> block = onenand_block(this, addr); >> /* (line disabled) page = (int) (addr >> this->page_shift); */ >> page = (int) (addr - onenand_addr(this, block)) >> >> this->page_shift; >> >> printk("%s[%d] page %d, %d, %d\n", __func__, __LINE__, >> page, (int) >> onenand_addr(this, block), ((int) addr >> >> this->page_shift) & >> this->page_mask); >> >> if (ONENAND_IS_2PLANE(this)) { >> /* Make the even block number */ >> block &= ~1; >> /* Is it the odd plane? */ >> if (addr & this->writesize) >> block++; >> page >>= 1; >> } >> page &= this->page_mask; >> break; >> >> >> --- start log nandtest fail --- >> # nandtest -l 262144 /dev/mtd3 >> ECC corrections: 0 >> ECC failures : 0 >> Bad blocks : 0 >> BBT blocks : 0 >> 00000000: writing... >> [ 243.144287] onenand_command[382] page 0, 2621440, 0 >> [ 243.150787] onenand_command[382] page 2, 2621440, 2 >> [ 243.156158] onenand_command[382] page 4, 2621440, 4 >> (...) >> [ 243.310729] onenand_command[382] page 60, 2621440, 60 >> [ 243.316223] onenand_command[382] page 62, 2621440, 62 >> [ 243.322204] onenand_command[382] page 0, 2752512, 0 >> [ 243.327636] onenand_command[382] page 2, 2752512, 2 >> [ 243.332977] onenand_command[382] page 4, 2752512, 4 >> (...) >> [ 243.487487] onenand_command[382] page 60, 2752512, 60 >> [ 243.493041] onenand_command[382] page 62, 2752512, 62 >> 00000000: reading... >> [ 243.498535] onenand_command[382] page 0, 2621440, 0 >> [ 243.505249] onenand_wait: ECC error = 0x8488 >> [ 243.509552] onenand_command[382] page 1, 2621440, 1 >> [ 243.514587] onenand_wait: ECC error = 0x8488 >> [ 243.518890] onenand_command[382] page 2, 2621440, 2 >> (...) >> [ 244.089050] onenand_command[382] page 62, 2621440, 62 >> [ 244.094268] onenand_wait: ECC error = 0x8448 >> [ 244.098602] onenand_command[382] page 63, 2621440, 63 >> [ 244.103790] onenand_wait: ECC error = 0x8488 >> [ 244.109191] onenand_command[382] page 0, 2752512, 0 >> [ 244.114196] onenand_wait: ECC error = 0x8488 >> [ 244.118469] onenand_command[382] page 1, 2752512, 1 >> [ 244.123535] onenand_wait: ECC error = 0x8488 >> [ 244.127838] onenand_command[382] page 2, 2752512, 2 >> (...) >> [ 244.698150] onenand_command[382] page 62, 2752512, 62 >> [ 244.703369] onenand_wait: ECC error = 0x8448 >> [ 244.707672] onenand_command[382] page 63, 2752512, 63 >> [ 244.712890] onenand_wait: ECC error = 0x8488 >> >> ECC failed at 00000000 >> 00000000: checking... >> compare failed. seed 1804289383 >> Byte 0x1 is 5a should be da >> Byte 0x3 is 82 should be 92 >> Byte 0x4 is 10 should be 1a >> Byte 0x5 is 21 should be b7 >> >> --- end log nandtest fail --- >> >> >> With this other code nandtest pass >> >> onenand_base.c >> >> 377: default: >> block = onenand_block(this, addr); >> page = (int) (addr >> this->page_shift); >> /* (line disabled) page = (int) (addr - onenand_addr(this, block)) >> >> this->page_shift; */ >> >> printk("%s[%d] page %d, %d, %d\n", __func__, __LINE__, >> page, (int) >> onenand_addr(this, block), ((int) addr >> >> this->page_shift) & >> this->page_mask); >> >> if (ONENAND_IS_2PLANE(this)) { >> /* Make the even block number */ >> block &= ~1; >> /* Is it the odd plane? */ >> if (addr & this->writesize) >> block++; >> page >>= 1; >> } >> page &= this->page_mask; >> break; >> >> --- start log nandtest pass --- >> # nandtest -l 262144 /dev/mtd3 >> ECC corrections: 0 >> ECC failures : 33 >> Bad blocks : 0 >> BBT blocks : 0 >> 00000000: writing... >> [ 2024.624664] onenand_command[382] page 1280, 2621440, 0 >> [ 2024.631530] onenand_command[382] page 1282, 2621440, 2 >> [ 2024.637145] onenand_command[382] page 1284, 2621440, 4 >> (...) >> [ 2024.796813] onenand_command[382] page 1340, 2621440, 60 >> [ 2024.802520] onenand_command[382] page 1342, 2621440, 62 >> [ 2024.808593] onenand_command[382] page 1344, 2752512, 0 >> [ 2024.814239] onenand_command[382] page 1346, 2752512, 2 >> (...) >> [ 2024.979644] onenand_command[382] page 1404, 2752512, 60 >> [ 2024.985351] onenand_command[382] page 1406, 2752512, 62 >> 00000000: reading... >> [ 2024.990997] onenand_command[382] page 1280, 2621440, 0 >> [ 2024.997985] onenand_command[382] page 1281, 2621440, 1 >> [ 2025.003295] onenand_command[382] page 1282, 2621440, 2 >> (...) >> >> [ 2025.326782] onenand_command[382] page 1342, 2621440, 62 >> [ 2025.332214] onenand_command[382] page 1343, 2621440, 63 >> [ 2025.338592] onenand_command[382] page 1344, 2752512, 0 >> [ 2025.343811] onenand_command[382] page 1345, 2752512, 1 >> [ 2025.349151] onenand_command[382] page 1346, 2752512, 2 >> (...) >> [ 2025.672576] onenand_command[382] page 1406, 2752512, 62 >> [ 2025.677978] onenand_command[382] page 1407, 2752512, 63 >> 00000000: checking... >> Finished pass 1 successfully >> --- end log nandtest pass --- >> >>> >>> In my test environment, it displays the correct page number. >>> (addr - onenand_addr(this, block) >> this->page_shift is same as >>> '(addr >> this->page_shift) & this->page_mask'. >>> >> >> Looks like page number is wrong ? >> >> Cheers, >> >> Enric >> >>> Thank you, >>> Kyungmin Park >>> >>> On Fri, Apr 30, 2010 at 7:05 PM, Enric Balletbò i Serra >>> <eballetbo@gmail.com> wrote: >>>> Hello all, >>>> >>>> After commit 5988af2319781bc8e0ce418affec4e09cfa77907 (mtd: >>>> Flex-OneNAND support) the onenand support for my device is broken. >>>> >>>> Before this commit when I run the nandtest program all is ok >>>> --- >>>> # nandtest /dev/mtd3 >>>> ECC corrections: 0 >>>> ECC failures : 0 >>>> Bad blocks : 0 >>>> BBT blocks : 0 >>>> 002c0000: checking... >>>> Finished pass 1 successfully >>>> -- >>>> >>>> Introduced commit 5988af2319781bc8e0ce418affec4e09cfa7790 the nandtest >>>> fails with: >>>> --- >>>> # nandtest /dev/mtd3 >>>> ECC corrections: 0 >>>> ECC failures : 0 >>>> Bad blocks : 0 >>>> BBT blocks : 0 >>>> 00000000: reading... >>>> [ 299.092041] onenand_wait: ECC error = 0x8488 >>>> ( ... lots of ECC errors ... ) >>>> [ 299.092041] onenand_wait: ECC error = 0x8488 >>>> ECC failed at 00000000 >>>> 00000000: checking... >>>> compare failed. seed 1804289383 >>>> Byte 0x1 is 5a should be da >>>> Byte 0x3 is 82 should be 92 >>>> Byte 0x4 is 10 should be 1a >>>> ( ... ) >>>> --- >>>> >>>> Investigating a little I see a significant difference introduced by >>>> this patch. In line >>>> >>>> 347: page = (int) (addr - onenand_addr(this, block)) >> >>>> this->page_shift; (patch applied) >>>> >>>> instead of >>>> >>>> 347: page = (int) (addr >> this->page_shift); (without patch) >>>> >>>> I applied commit 5988af2319781bc8e0ce418affec4e09cfa7790 and replaced >>>> the line 347 and now works again. Fantastic, but I suspect this is not >>>> the proper solution (probably this breaks other onenands devices, I >>>> can't test). >>>> >>>> I'm just introducing in OneNAND devices so anyone can help me to >>>> understand and solve the problem ? Note that my device is a Numonyx >>>> 4-Gbit DDP (DUAL DIE PLAN) OneNAND flash memory ( 2 dice of 2Gb, 2KB >>>> page ) >>>> >>>> Thanks in advance, >>>> >>>> ///:~Enric >>>> >>>> --- >>>> diff --git a/drivers/mtd/onenand/onenand_base.c >>>> b/drivers/mtd/onenand/onenand_base.c >>>> index 081f97d..b1d50a3 100644 >>>> --- a/drivers/mtd/onenand/onenand_base.c >>>> +++ b/drivers/mtd/onenand/onenand_base.c >>>> @@ -344,7 +344,7 @@ static int onenand_command(struct mtd_info *mtd, >>>> int cmd, loff_t addr, size_t le >>>> >>>> default: >>>> block = (int) onenand_block(this, addr); >>>> - page = (int) (addr - onenand_addr(this, block)) >> this->page_shift; >>>> + page = (int) (addr >> this->page_shift); >>>> >>>> if (ONENAND_IS_2PLANE(this)) { >>>> /* Make the even block number */ >>>> --- >>>> >>>> ______________________________________________________ >>>> Linux MTD discussion mailing list >>>> http://lists.infradead.org/mailman/listinfo/linux-mtd/ >>>> >>> >> -- >> To unsubscribe from this list: send the line "unsubscribe linux-omap" in >> the body of a message to majordomo@vger.kernel.org >> More majordomo info at http://vger.kernel.org/majordomo-info.html >> >
Hello, I have a bit of time to investigate more. I have two boards with two different OneNAND chips populated. The first one is a dual Die Plan 4-Gbit (2 dice of 2-Gbit) [ 26.406890] Muxed OneNAND(DDP) 512MB 1.8V 16-bit (0x58) [ 26.412170] OneNAND version = 0x0031 [ 26.415771] Chip support all block unlock [ 26.419830] Chip has 2 plane The second is a single die of 2-Gbit. [ 32.897735] Muxed OneNAND 256MB 1.8V 16-bit (0x40) [ 32.902557] OneNAND version = 0x0031 [ 32.906188] Chip support all block unlock [ 32.910247] Chip has 2 plane As I understand the bit 3 of DEVICE_ID register indicates if package is a single-die or a dual-die, so - Muxed OneNAND(DDP) 512MB 1.8V 16-bit -> device id: 0x58 -> bit 3 is 1 -> dual-die - Muxed OneNAND 256MB 1.8V 16-bit -> device id: 0x40 -> bit 3 is 0 ->single-die The question is, why those devices are reporting 'Chip has 2 plane' ? Sorry if this is a trivial question but I'm not sure about DDP and '2 plane' concepts. Are the same ? Cheers, Enric 2010/5/6 Enric Balletbò i Serra <eballetbo@gmail.com>: > Hi, > > 2010/5/6 Kyungmin Park <kmpark@infradead.org>: >> Hi, >> >> What's your chip version? maybe some mis-probe it seems to be probed >> at 4KiB pagesize OneNAND. > > Is a 4-Gbit DDP OneNAND device from Numonyx composed of two 2-Gbit 2KB > page dice stacked together, the device is equipped with two DataRAMs, > and two-plane NAND Flash memory array, > > These two component enables simultaneous program of 4KiB ( > CONFIG_MTD_ONENAND_2X_PROGRAM) > > Cheers, > > Enric > >> >> Thank you, >> Kyungmin Park >> >> On Thu, May 6, 2010 at 8:22 PM, Enric Balletbò i Serra >> <eballetbo@gmail.com> wrote: >>> Hi, >>> >>> 2010/5/6 Kyungmin Park <kyungmin.park@samsung.com>: >>>> Hi, >>>> >>>> Can you add this statement at below the code? >>>> printk("%s[%d] page %d, %d, %d\n", __func__, __LINE__, page, (int) >>>> onenand_addr(this, block), ((int) addr >> this->page_shift) & >>>> this->page_mask); >>> >>> Yes, >>> >>> With this code nandtest fails: >>> >>> onenand_base.c >>> >>> 377: default: >>> block = onenand_block(this, addr); >>> /* (line disabled) page = (int) (addr >> this->page_shift); */ >>> page = (int) (addr - onenand_addr(this, block)) >> >>> this->page_shift; >>> >>> printk("%s[%d] page %d, %d, %d\n", __func__, __LINE__, >>> page, (int) >>> onenand_addr(this, block), ((int) addr >> >>> this->page_shift) & >>> this->page_mask); >>> >>> if (ONENAND_IS_2PLANE(this)) { >>> /* Make the even block number */ >>> block &= ~1; >>> /* Is it the odd plane? */ >>> if (addr & this->writesize) >>> block++; >>> page >>= 1; >>> } >>> page &= this->page_mask; >>> break; >>> >>> >>> --- start log nandtest fail --- >>> # nandtest -l 262144 /dev/mtd3 >>> ECC corrections: 0 >>> ECC failures : 0 >>> Bad blocks : 0 >>> BBT blocks : 0 >>> 00000000: writing... >>> [ 243.144287] onenand_command[382] page 0, 2621440, 0 >>> [ 243.150787] onenand_command[382] page 2, 2621440, 2 >>> [ 243.156158] onenand_command[382] page 4, 2621440, 4 >>> (...) >>> [ 243.310729] onenand_command[382] page 60, 2621440, 60 >>> [ 243.316223] onenand_command[382] page 62, 2621440, 62 >>> [ 243.322204] onenand_command[382] page 0, 2752512, 0 >>> [ 243.327636] onenand_command[382] page 2, 2752512, 2 >>> [ 243.332977] onenand_command[382] page 4, 2752512, 4 >>> (...) >>> [ 243.487487] onenand_command[382] page 60, 2752512, 60 >>> [ 243.493041] onenand_command[382] page 62, 2752512, 62 >>> 00000000: reading... >>> [ 243.498535] onenand_command[382] page 0, 2621440, 0 >>> [ 243.505249] onenand_wait: ECC error = 0x8488 >>> [ 243.509552] onenand_command[382] page 1, 2621440, 1 >>> [ 243.514587] onenand_wait: ECC error = 0x8488 >>> [ 243.518890] onenand_command[382] page 2, 2621440, 2 >>> (...) >>> [ 244.089050] onenand_command[382] page 62, 2621440, 62 >>> [ 244.094268] onenand_wait: ECC error = 0x8448 >>> [ 244.098602] onenand_command[382] page 63, 2621440, 63 >>> [ 244.103790] onenand_wait: ECC error = 0x8488 >>> [ 244.109191] onenand_command[382] page 0, 2752512, 0 >>> [ 244.114196] onenand_wait: ECC error = 0x8488 >>> [ 244.118469] onenand_command[382] page 1, 2752512, 1 >>> [ 244.123535] onenand_wait: ECC error = 0x8488 >>> [ 244.127838] onenand_command[382] page 2, 2752512, 2 >>> (...) >>> [ 244.698150] onenand_command[382] page 62, 2752512, 62 >>> [ 244.703369] onenand_wait: ECC error = 0x8448 >>> [ 244.707672] onenand_command[382] page 63, 2752512, 63 >>> [ 244.712890] onenand_wait: ECC error = 0x8488 >>> >>> ECC failed at 00000000 >>> 00000000: checking... >>> compare failed. seed 1804289383 >>> Byte 0x1 is 5a should be da >>> Byte 0x3 is 82 should be 92 >>> Byte 0x4 is 10 should be 1a >>> Byte 0x5 is 21 should be b7 >>> >>> --- end log nandtest fail --- >>> >>> >>> With this other code nandtest pass >>> >>> onenand_base.c >>> >>> 377: default: >>> block = onenand_block(this, addr); >>> page = (int) (addr >> this->page_shift); >>> /* (line disabled) page = (int) (addr - onenand_addr(this, block)) >> >>> this->page_shift; */ >>> >>> printk("%s[%d] page %d, %d, %d\n", __func__, __LINE__, >>> page, (int) >>> onenand_addr(this, block), ((int) addr >> >>> this->page_shift) & >>> this->page_mask); >>> >>> if (ONENAND_IS_2PLANE(this)) { >>> /* Make the even block number */ >>> block &= ~1; >>> /* Is it the odd plane? */ >>> if (addr & this->writesize) >>> block++; >>> page >>= 1; >>> } >>> page &= this->page_mask; >>> break; >>> >>> --- start log nandtest pass --- >>> # nandtest -l 262144 /dev/mtd3 >>> ECC corrections: 0 >>> ECC failures : 33 >>> Bad blocks : 0 >>> BBT blocks : 0 >>> 00000000: writing... >>> [ 2024.624664] onenand_command[382] page 1280, 2621440, 0 >>> [ 2024.631530] onenand_command[382] page 1282, 2621440, 2 >>> [ 2024.637145] onenand_command[382] page 1284, 2621440, 4 >>> (...) >>> [ 2024.796813] onenand_command[382] page 1340, 2621440, 60 >>> [ 2024.802520] onenand_command[382] page 1342, 2621440, 62 >>> [ 2024.808593] onenand_command[382] page 1344, 2752512, 0 >>> [ 2024.814239] onenand_command[382] page 1346, 2752512, 2 >>> (...) >>> [ 2024.979644] onenand_command[382] page 1404, 2752512, 60 >>> [ 2024.985351] onenand_command[382] page 1406, 2752512, 62 >>> 00000000: reading... >>> [ 2024.990997] onenand_command[382] page 1280, 2621440, 0 >>> [ 2024.997985] onenand_command[382] page 1281, 2621440, 1 >>> [ 2025.003295] onenand_command[382] page 1282, 2621440, 2 >>> (...) >>> >>> [ 2025.326782] onenand_command[382] page 1342, 2621440, 62 >>> [ 2025.332214] onenand_command[382] page 1343, 2621440, 63 >>> [ 2025.338592] onenand_command[382] page 1344, 2752512, 0 >>> [ 2025.343811] onenand_command[382] page 1345, 2752512, 1 >>> [ 2025.349151] onenand_command[382] page 1346, 2752512, 2 >>> (...) >>> [ 2025.672576] onenand_command[382] page 1406, 2752512, 62 >>> [ 2025.677978] onenand_command[382] page 1407, 2752512, 63 >>> 00000000: checking... >>> Finished pass 1 successfully >>> --- end log nandtest pass --- >>> >>>> >>>> In my test environment, it displays the correct page number. >>>> (addr - onenand_addr(this, block) >> this->page_shift is same as >>>> '(addr >> this->page_shift) & this->page_mask'. >>>> >>> >>> Looks like page number is wrong ? >>> >>> Cheers, >>> >>> Enric >>> >>>> Thank you, >>>> Kyungmin Park >>>> >>>> On Fri, Apr 30, 2010 at 7:05 PM, Enric Balletbò i Serra >>>> <eballetbo@gmail.com> wrote: >>>>> Hello all, >>>>> >>>>> After commit 5988af2319781bc8e0ce418affec4e09cfa77907 (mtd: >>>>> Flex-OneNAND support) the onenand support for my device is broken. >>>>> >>>>> Before this commit when I run the nandtest program all is ok >>>>> --- >>>>> # nandtest /dev/mtd3 >>>>> ECC corrections: 0 >>>>> ECC failures : 0 >>>>> Bad blocks : 0 >>>>> BBT blocks : 0 >>>>> 002c0000: checking... >>>>> Finished pass 1 successfully >>>>> -- >>>>> >>>>> Introduced commit 5988af2319781bc8e0ce418affec4e09cfa7790 the nandtest >>>>> fails with: >>>>> --- >>>>> # nandtest /dev/mtd3 >>>>> ECC corrections: 0 >>>>> ECC failures : 0 >>>>> Bad blocks : 0 >>>>> BBT blocks : 0 >>>>> 00000000: reading... >>>>> [ 299.092041] onenand_wait: ECC error = 0x8488 >>>>> ( ... lots of ECC errors ... ) >>>>> [ 299.092041] onenand_wait: ECC error = 0x8488 >>>>> ECC failed at 00000000 >>>>> 00000000: checking... >>>>> compare failed. seed 1804289383 >>>>> Byte 0x1 is 5a should be da >>>>> Byte 0x3 is 82 should be 92 >>>>> Byte 0x4 is 10 should be 1a >>>>> ( ... ) >>>>> --- >>>>> >>>>> Investigating a little I see a significant difference introduced by >>>>> this patch. In line >>>>> >>>>> 347: page = (int) (addr - onenand_addr(this, block)) >> >>>>> this->page_shift; (patch applied) >>>>> >>>>> instead of >>>>> >>>>> 347: page = (int) (addr >> this->page_shift); (without patch) >>>>> >>>>> I applied commit 5988af2319781bc8e0ce418affec4e09cfa7790 and replaced >>>>> the line 347 and now works again. Fantastic, but I suspect this is not >>>>> the proper solution (probably this breaks other onenands devices, I >>>>> can't test). >>>>> >>>>> I'm just introducing in OneNAND devices so anyone can help me to >>>>> understand and solve the problem ? Note that my device is a Numonyx >>>>> 4-Gbit DDP (DUAL DIE PLAN) OneNAND flash memory ( 2 dice of 2Gb, 2KB >>>>> page ) >>>>> >>>>> Thanks in advance, >>>>> >>>>> ///:~Enric >>>>> >>>>> --- >>>>> diff --git a/drivers/mtd/onenand/onenand_base.c >>>>> b/drivers/mtd/onenand/onenand_base.c >>>>> index 081f97d..b1d50a3 100644 >>>>> --- a/drivers/mtd/onenand/onenand_base.c >>>>> +++ b/drivers/mtd/onenand/onenand_base.c >>>>> @@ -344,7 +344,7 @@ static int onenand_command(struct mtd_info *mtd, >>>>> int cmd, loff_t addr, size_t le >>>>> >>>>> default: >>>>> block = (int) onenand_block(this, addr); >>>>> - page = (int) (addr - onenand_addr(this, block)) >> this->page_shift; >>>>> + page = (int) (addr >> this->page_shift); >>>>> >>>>> if (ONENAND_IS_2PLANE(this)) { >>>>> /* Make the even block number */ >>>>> --- >>>>> >>>>> ______________________________________________________ >>>>> Linux MTD discussion mailing list >>>>> http://lists.infradead.org/mailman/listinfo/linux-mtd/ >>>>> >>>> >>> -- >>> To unsubscribe from this list: send the line "unsubscribe linux-omap" in >>> the body of a message to majordomo@vger.kernel.org >>> More majordomo info at http://vger.kernel.org/majordomo-info.html >>> >> >
I answer to myself. DDP (dual die plane) not implies 'ONENAND_HAS_2PLANE'. A device with a single die can also have '2 planes'. I'm right ? Sorry for these newbie questions, I'm just introducing to OneNAND devices. Cheers, Enric 2010/5/12 Enric Balletbò i Serra <eballetbo@gmail.com>: > Hello, > > I have a bit of time to investigate more. > > I have two boards with two different OneNAND chips populated. > > The first one is a dual Die Plan 4-Gbit (2 dice of 2-Gbit) > > [ 26.406890] Muxed OneNAND(DDP) 512MB 1.8V 16-bit (0x58) > [ 26.412170] OneNAND version = 0x0031 > [ 26.415771] Chip support all block unlock > [ 26.419830] Chip has 2 plane > > The second is a single die of 2-Gbit. > > [ 32.897735] Muxed OneNAND 256MB 1.8V 16-bit (0x40) > [ 32.902557] OneNAND version = 0x0031 > [ 32.906188] Chip support all block unlock > [ 32.910247] Chip has 2 plane > > As I understand the bit 3 of DEVICE_ID register indicates if package > is a single-die or a dual-die, so > > - Muxed OneNAND(DDP) 512MB 1.8V 16-bit -> device id: 0x58 -> bit 3 is > 1 -> dual-die > - Muxed OneNAND 256MB 1.8V 16-bit -> device id: 0x40 -> bit 3 is 0 ->single-die > > The question is, why those devices are reporting 'Chip has 2 plane' ? > > Sorry if this is a trivial question but I'm not sure about DDP and '2 > plane' concepts. Are the same ? > > Cheers, > > Enric > > 2010/5/6 Enric Balletbò i Serra <eballetbo@gmail.com>: >> Hi, >> >> 2010/5/6 Kyungmin Park <kmpark@infradead.org>: >>> Hi, >>> >>> What's your chip version? maybe some mis-probe it seems to be probed >>> at 4KiB pagesize OneNAND. >> >> Is a 4-Gbit DDP OneNAND device from Numonyx composed of two 2-Gbit 2KB >> page dice stacked together, the device is equipped with two DataRAMs, >> and two-plane NAND Flash memory array, >> >> These two component enables simultaneous program of 4KiB ( >> CONFIG_MTD_ONENAND_2X_PROGRAM) >> >> Cheers, >> >> Enric >> >>> >>> Thank you, >>> Kyungmin Park >>> >>> On Thu, May 6, 2010 at 8:22 PM, Enric Balletbò i Serra >>> <eballetbo@gmail.com> wrote: >>>> Hi, >>>> >>>> 2010/5/6 Kyungmin Park <kyungmin.park@samsung.com>: >>>>> Hi, >>>>> >>>>> Can you add this statement at below the code? >>>>> printk("%s[%d] page %d, %d, %d\n", __func__, __LINE__, page, (int) >>>>> onenand_addr(this, block), ((int) addr >> this->page_shift) & >>>>> this->page_mask); >>>> >>>> Yes, >>>> >>>> With this code nandtest fails: >>>> >>>> onenand_base.c >>>> >>>> 377: default: >>>> block = onenand_block(this, addr); >>>> /* (line disabled) page = (int) (addr >> this->page_shift); */ >>>> page = (int) (addr - onenand_addr(this, block)) >> >>>> this->page_shift; >>>> >>>> printk("%s[%d] page %d, %d, %d\n", __func__, __LINE__, >>>> page, (int) >>>> onenand_addr(this, block), ((int) addr >> >>>> this->page_shift) & >>>> this->page_mask); >>>> >>>> if (ONENAND_IS_2PLANE(this)) { >>>> /* Make the even block number */ >>>> block &= ~1; >>>> /* Is it the odd plane? */ >>>> if (addr & this->writesize) >>>> block++; >>>> page >>= 1; >>>> } >>>> page &= this->page_mask; >>>> break; >>>> >>>> >>>> --- start log nandtest fail --- >>>> # nandtest -l 262144 /dev/mtd3 >>>> ECC corrections: 0 >>>> ECC failures : 0 >>>> Bad blocks : 0 >>>> BBT blocks : 0 >>>> 00000000: writing... >>>> [ 243.144287] onenand_command[382] page 0, 2621440, 0 >>>> [ 243.150787] onenand_command[382] page 2, 2621440, 2 >>>> [ 243.156158] onenand_command[382] page 4, 2621440, 4 >>>> (...) >>>> [ 243.310729] onenand_command[382] page 60, 2621440, 60 >>>> [ 243.316223] onenand_command[382] page 62, 2621440, 62 >>>> [ 243.322204] onenand_command[382] page 0, 2752512, 0 >>>> [ 243.327636] onenand_command[382] page 2, 2752512, 2 >>>> [ 243.332977] onenand_command[382] page 4, 2752512, 4 >>>> (...) >>>> [ 243.487487] onenand_command[382] page 60, 2752512, 60 >>>> [ 243.493041] onenand_command[382] page 62, 2752512, 62 >>>> 00000000: reading... >>>> [ 243.498535] onenand_command[382] page 0, 2621440, 0 >>>> [ 243.505249] onenand_wait: ECC error = 0x8488 >>>> [ 243.509552] onenand_command[382] page 1, 2621440, 1 >>>> [ 243.514587] onenand_wait: ECC error = 0x8488 >>>> [ 243.518890] onenand_command[382] page 2, 2621440, 2 >>>> (...) >>>> [ 244.089050] onenand_command[382] page 62, 2621440, 62 >>>> [ 244.094268] onenand_wait: ECC error = 0x8448 >>>> [ 244.098602] onenand_command[382] page 63, 2621440, 63 >>>> [ 244.103790] onenand_wait: ECC error = 0x8488 >>>> [ 244.109191] onenand_command[382] page 0, 2752512, 0 >>>> [ 244.114196] onenand_wait: ECC error = 0x8488 >>>> [ 244.118469] onenand_command[382] page 1, 2752512, 1 >>>> [ 244.123535] onenand_wait: ECC error = 0x8488 >>>> [ 244.127838] onenand_command[382] page 2, 2752512, 2 >>>> (...) >>>> [ 244.698150] onenand_command[382] page 62, 2752512, 62 >>>> [ 244.703369] onenand_wait: ECC error = 0x8448 >>>> [ 244.707672] onenand_command[382] page 63, 2752512, 63 >>>> [ 244.712890] onenand_wait: ECC error = 0x8488 >>>> >>>> ECC failed at 00000000 >>>> 00000000: checking... >>>> compare failed. seed 1804289383 >>>> Byte 0x1 is 5a should be da >>>> Byte 0x3 is 82 should be 92 >>>> Byte 0x4 is 10 should be 1a >>>> Byte 0x5 is 21 should be b7 >>>> >>>> --- end log nandtest fail --- >>>> >>>> >>>> With this other code nandtest pass >>>> >>>> onenand_base.c >>>> >>>> 377: default: >>>> block = onenand_block(this, addr); >>>> page = (int) (addr >> this->page_shift); >>>> /* (line disabled) page = (int) (addr - onenand_addr(this, block)) >> >>>> this->page_shift; */ >>>> >>>> printk("%s[%d] page %d, %d, %d\n", __func__, __LINE__, >>>> page, (int) >>>> onenand_addr(this, block), ((int) addr >> >>>> this->page_shift) & >>>> this->page_mask); >>>> >>>> if (ONENAND_IS_2PLANE(this)) { >>>> /* Make the even block number */ >>>> block &= ~1; >>>> /* Is it the odd plane? */ >>>> if (addr & this->writesize) >>>> block++; >>>> page >>= 1; >>>> } >>>> page &= this->page_mask; >>>> break; >>>> >>>> --- start log nandtest pass --- >>>> # nandtest -l 262144 /dev/mtd3 >>>> ECC corrections: 0 >>>> ECC failures : 33 >>>> Bad blocks : 0 >>>> BBT blocks : 0 >>>> 00000000: writing... >>>> [ 2024.624664] onenand_command[382] page 1280, 2621440, 0 >>>> [ 2024.631530] onenand_command[382] page 1282, 2621440, 2 >>>> [ 2024.637145] onenand_command[382] page 1284, 2621440, 4 >>>> (...) >>>> [ 2024.796813] onenand_command[382] page 1340, 2621440, 60 >>>> [ 2024.802520] onenand_command[382] page 1342, 2621440, 62 >>>> [ 2024.808593] onenand_command[382] page 1344, 2752512, 0 >>>> [ 2024.814239] onenand_command[382] page 1346, 2752512, 2 >>>> (...) >>>> [ 2024.979644] onenand_command[382] page 1404, 2752512, 60 >>>> [ 2024.985351] onenand_command[382] page 1406, 2752512, 62 >>>> 00000000: reading... >>>> [ 2024.990997] onenand_command[382] page 1280, 2621440, 0 >>>> [ 2024.997985] onenand_command[382] page 1281, 2621440, 1 >>>> [ 2025.003295] onenand_command[382] page 1282, 2621440, 2 >>>> (...) >>>> >>>> [ 2025.326782] onenand_command[382] page 1342, 2621440, 62 >>>> [ 2025.332214] onenand_command[382] page 1343, 2621440, 63 >>>> [ 2025.338592] onenand_command[382] page 1344, 2752512, 0 >>>> [ 2025.343811] onenand_command[382] page 1345, 2752512, 1 >>>> [ 2025.349151] onenand_command[382] page 1346, 2752512, 2 >>>> (...) >>>> [ 2025.672576] onenand_command[382] page 1406, 2752512, 62 >>>> [ 2025.677978] onenand_command[382] page 1407, 2752512, 63 >>>> 00000000: checking... >>>> Finished pass 1 successfully >>>> --- end log nandtest pass --- >>>> >>>>> >>>>> In my test environment, it displays the correct page number. >>>>> (addr - onenand_addr(this, block) >> this->page_shift is same as >>>>> '(addr >> this->page_shift) & this->page_mask'. >>>>> >>>> >>>> Looks like page number is wrong ? >>>> >>>> Cheers, >>>> >>>> Enric >>>> >>>>> Thank you, >>>>> Kyungmin Park >>>>> >>>>> On Fri, Apr 30, 2010 at 7:05 PM, Enric Balletbò i Serra >>>>> <eballetbo@gmail.com> wrote: >>>>>> Hello all, >>>>>> >>>>>> After commit 5988af2319781bc8e0ce418affec4e09cfa77907 (mtd: >>>>>> Flex-OneNAND support) the onenand support for my device is broken. >>>>>> >>>>>> Before this commit when I run the nandtest program all is ok >>>>>> --- >>>>>> # nandtest /dev/mtd3 >>>>>> ECC corrections: 0 >>>>>> ECC failures : 0 >>>>>> Bad blocks : 0 >>>>>> BBT blocks : 0 >>>>>> 002c0000: checking... >>>>>> Finished pass 1 successfully >>>>>> -- >>>>>> >>>>>> Introduced commit 5988af2319781bc8e0ce418affec4e09cfa7790 the nandtest >>>>>> fails with: >>>>>> --- >>>>>> # nandtest /dev/mtd3 >>>>>> ECC corrections: 0 >>>>>> ECC failures : 0 >>>>>> Bad blocks : 0 >>>>>> BBT blocks : 0 >>>>>> 00000000: reading... >>>>>> [ 299.092041] onenand_wait: ECC error = 0x8488 >>>>>> ( ... lots of ECC errors ... ) >>>>>> [ 299.092041] onenand_wait: ECC error = 0x8488 >>>>>> ECC failed at 00000000 >>>>>> 00000000: checking... >>>>>> compare failed. seed 1804289383 >>>>>> Byte 0x1 is 5a should be da >>>>>> Byte 0x3 is 82 should be 92 >>>>>> Byte 0x4 is 10 should be 1a >>>>>> ( ... ) >>>>>> --- >>>>>> >>>>>> Investigating a little I see a significant difference introduced by >>>>>> this patch. In line >>>>>> >>>>>> 347: page = (int) (addr - onenand_addr(this, block)) >> >>>>>> this->page_shift; (patch applied) >>>>>> >>>>>> instead of >>>>>> >>>>>> 347: page = (int) (addr >> this->page_shift); (without patch) >>>>>> >>>>>> I applied commit 5988af2319781bc8e0ce418affec4e09cfa7790 and replaced >>>>>> the line 347 and now works again. Fantastic, but I suspect this is not >>>>>> the proper solution (probably this breaks other onenands devices, I >>>>>> can't test). >>>>>> >>>>>> I'm just introducing in OneNAND devices so anyone can help me to >>>>>> understand and solve the problem ? Note that my device is a Numonyx >>>>>> 4-Gbit DDP (DUAL DIE PLAN) OneNAND flash memory ( 2 dice of 2Gb, 2KB >>>>>> page ) >>>>>> >>>>>> Thanks in advance, >>>>>> >>>>>> ///:~Enric >>>>>> >>>>>> --- >>>>>> diff --git a/drivers/mtd/onenand/onenand_base.c >>>>>> b/drivers/mtd/onenand/onenand_base.c >>>>>> index 081f97d..b1d50a3 100644 >>>>>> --- a/drivers/mtd/onenand/onenand_base.c >>>>>> +++ b/drivers/mtd/onenand/onenand_base.c >>>>>> @@ -344,7 +344,7 @@ static int onenand_command(struct mtd_info *mtd, >>>>>> int cmd, loff_t addr, size_t le >>>>>> >>>>>> default: >>>>>> block = (int) onenand_block(this, addr); >>>>>> - page = (int) (addr - onenand_addr(this, block)) >> this->page_shift; >>>>>> + page = (int) (addr >> this->page_shift); >>>>>> >>>>>> if (ONENAND_IS_2PLANE(this)) { >>>>>> /* Make the even block number */ >>>>>> --- >>>>>> >>>>>> ______________________________________________________ >>>>>> Linux MTD discussion mailing list >>>>>> http://lists.infradead.org/mailman/listinfo/linux-mtd/ >>>>>> >>>>> >>>> -- >>>> To unsubscribe from this list: send the line "unsubscribe linux-omap" in >>>> the body of a message to majordomo@vger.kernel.org >>>> More majordomo info at http://vger.kernel.org/majordomo-info.html >>>> >>> >> >
Hello, I made new tests regarding this issue. Looks like the problem is reading from the OneNAND device. TEST 1 # modprobe mtd_pagetest dev=4 [ 126.505340] [ 126.506866] ================================================= [ 126.512756] mtd_pagetest: MTD device: 4 [ 126.520477] mtd_pagetest: MTD device size 262668288, eraseblock size 262144, page size 4096, count of eraseblocks 1002, pages per eraseblock 64, OOB size 64 [ 126.535034] mtd_pagetest: scanning for bad eraseblocks [ 126.540771] mtd_pagetest: scanned 1002 eraseblocks, 0 are bad [ 126.546630] mtd_pagetest: erasing whole device [ 128.406890] mtd_pagetest: erased 1002 eraseblocks [ 128.411712] mtd_pagetest: writing whole device [ 128.451721] mtd_pagetest: written up to eraseblock 0 [ 137.443817] mtd_pagetest: written up to eraseblock 256 [ 146.440216] mtd_pagetest: written up to eraseblock 512 [ 155.430755] mtd_pagetest: written up to eraseblock 768 [ 163.618225] mtd_pagetest: written 1002 eraseblocks [ 163.623168] mtd_pagetest: verifying all eraseblocks [ 163.632965] onenand_wait: ECC error = 0x4488 [ 163.638031] onenand_wait: ECC error = 0x4884 [ 163.642486] onenand_wait: ECC error = 0x8888 [ 163.647247] onenand_wait: ECC error = 0x8888 [ 163.651733] mtd_pagetest: error: read failed at 0x0 [ 163.656890] mtd_pagetest: error -74 occurred [ 163.661224] ================================================= TEST 2 # nandtest -l 262144 /dev/mtd4 ECC corrections: 0 ECC failures : 260 Bad blocks : 0 BBT blocks : 0 00000000: reading...[ 837.103302] onenand_wait: ECC error = 0x8488 [ 837.109832] onenand_wait: ECC error = 0x8488 [ 837.114532] onenand_wait: ECC error = 0x8888 (...) [ 837.683624] onenand_wait: ECC error = 0x8448 [ 837.688079] onenand_wait: ECC error = 0x8488 ECC failed at 00000000 00000000: checking... compare failed. seed 1804289383 Byte 0x1 is 5a should be da Byte 0x3 is 82 should be 92 (...) I suspect currently OneNAND with 2 planes is broken. Someone with this type of device can try these tests ? Thanks in advance, Enric 2010/5/12 Enric Balletbò i Serra <eballetbo@gmail.com>: > I answer to myself. > > DDP (dual die plane) not implies 'ONENAND_HAS_2PLANE'. A device with > a single die can also have '2 planes'. I'm right ? > > Sorry for these newbie questions, I'm just introducing to OneNAND devices. > > Cheers, > > Enric > > 2010/5/12 Enric Balletbò i Serra <eballetbo@gmail.com>: >> Hello, >> >> I have a bit of time to investigate more. >> >> I have two boards with two different OneNAND chips populated. >> >> The first one is a dual Die Plan 4-Gbit (2 dice of 2-Gbit) >> >> [ 26.406890] Muxed OneNAND(DDP) 512MB 1.8V 16-bit (0x58) >> [ 26.412170] OneNAND version = 0x0031 >> [ 26.415771] Chip support all block unlock >> [ 26.419830] Chip has 2 plane >> >> The second is a single die of 2-Gbit. >> >> [ 32.897735] Muxed OneNAND 256MB 1.8V 16-bit (0x40) >> [ 32.902557] OneNAND version = 0x0031 >> [ 32.906188] Chip support all block unlock >> [ 32.910247] Chip has 2 plane >> >> As I understand the bit 3 of DEVICE_ID register indicates if package >> is a single-die or a dual-die, so >> >> - Muxed OneNAND(DDP) 512MB 1.8V 16-bit -> device id: 0x58 -> bit 3 is >> 1 -> dual-die >> - Muxed OneNAND 256MB 1.8V 16-bit -> device id: 0x40 -> bit 3 is 0 ->single-die >> >> The question is, why those devices are reporting 'Chip has 2 plane' ? >> >> Sorry if this is a trivial question but I'm not sure about DDP and '2 >> plane' concepts. Are the same ? >> >> Cheers, >> >> Enric >> >> 2010/5/6 Enric Balletbò i Serra <eballetbo@gmail.com>: >>> Hi, >>> >>> 2010/5/6 Kyungmin Park <kmpark@infradead.org>: >>>> Hi, >>>> >>>> What's your chip version? maybe some mis-probe it seems to be probed >>>> at 4KiB pagesize OneNAND. >>> >>> Is a 4-Gbit DDP OneNAND device from Numonyx composed of two 2-Gbit 2KB >>> page dice stacked together, the device is equipped with two DataRAMs, >>> and two-plane NAND Flash memory array, >>> >>> These two component enables simultaneous program of 4KiB ( >>> CONFIG_MTD_ONENAND_2X_PROGRAM) >>> >>> Cheers, >>> >>> Enric >>> >>>> >>>> Thank you, >>>> Kyungmin Park >>>> >>>> On Thu, May 6, 2010 at 8:22 PM, Enric Balletbò i Serra >>>> <eballetbo@gmail.com> wrote: >>>>> Hi, >>>>> >>>>> 2010/5/6 Kyungmin Park <kyungmin.park@samsung.com>: >>>>>> Hi, >>>>>> >>>>>> Can you add this statement at below the code? >>>>>> printk("%s[%d] page %d, %d, %d\n", __func__, __LINE__, page, (int) >>>>>> onenand_addr(this, block), ((int) addr >> this->page_shift) & >>>>>> this->page_mask); >>>>> >>>>> Yes, >>>>> >>>>> With this code nandtest fails: >>>>> >>>>> onenand_base.c >>>>> >>>>> 377: default: >>>>> block = onenand_block(this, addr); >>>>> /* (line disabled) page = (int) (addr >> this->page_shift); */ >>>>> page = (int) (addr - onenand_addr(this, block)) >> >>>>> this->page_shift; >>>>> >>>>> printk("%s[%d] page %d, %d, %d\n", __func__, __LINE__, >>>>> page, (int) >>>>> onenand_addr(this, block), ((int) addr >> >>>>> this->page_shift) & >>>>> this->page_mask); >>>>> >>>>> if (ONENAND_IS_2PLANE(this)) { >>>>> /* Make the even block number */ >>>>> block &= ~1; >>>>> /* Is it the odd plane? */ >>>>> if (addr & this->writesize) >>>>> block++; >>>>> page >>= 1; >>>>> } >>>>> page &= this->page_mask; >>>>> break; >>>>> >>>>> >>>>> --- start log nandtest fail --- >>>>> # nandtest -l 262144 /dev/mtd3 >>>>> ECC corrections: 0 >>>>> ECC failures : 0 >>>>> Bad blocks : 0 >>>>> BBT blocks : 0 >>>>> 00000000: writing... >>>>> [ 243.144287] onenand_command[382] page 0, 2621440, 0 >>>>> [ 243.150787] onenand_command[382] page 2, 2621440, 2 >>>>> [ 243.156158] onenand_command[382] page 4, 2621440, 4 >>>>> (...) >>>>> [ 243.310729] onenand_command[382] page 60, 2621440, 60 >>>>> [ 243.316223] onenand_command[382] page 62, 2621440, 62 >>>>> [ 243.322204] onenand_command[382] page 0, 2752512, 0 >>>>> [ 243.327636] onenand_command[382] page 2, 2752512, 2 >>>>> [ 243.332977] onenand_command[382] page 4, 2752512, 4 >>>>> (...) >>>>> [ 243.487487] onenand_command[382] page 60, 2752512, 60 >>>>> [ 243.493041] onenand_command[382] page 62, 2752512, 62 >>>>> 00000000: reading... >>>>> [ 243.498535] onenand_command[382] page 0, 2621440, 0 >>>>> [ 243.505249] onenand_wait: ECC error = 0x8488 >>>>> [ 243.509552] onenand_command[382] page 1, 2621440, 1 >>>>> [ 243.514587] onenand_wait: ECC error = 0x8488 >>>>> [ 243.518890] onenand_command[382] page 2, 2621440, 2 >>>>> (...) >>>>> [ 244.089050] onenand_command[382] page 62, 2621440, 62 >>>>> [ 244.094268] onenand_wait: ECC error = 0x8448 >>>>> [ 244.098602] onenand_command[382] page 63, 2621440, 63 >>>>> [ 244.103790] onenand_wait: ECC error = 0x8488 >>>>> [ 244.109191] onenand_command[382] page 0, 2752512, 0 >>>>> [ 244.114196] onenand_wait: ECC error = 0x8488 >>>>> [ 244.118469] onenand_command[382] page 1, 2752512, 1 >>>>> [ 244.123535] onenand_wait: ECC error = 0x8488 >>>>> [ 244.127838] onenand_command[382] page 2, 2752512, 2 >>>>> (...) >>>>> [ 244.698150] onenand_command[382] page 62, 2752512, 62 >>>>> [ 244.703369] onenand_wait: ECC error = 0x8448 >>>>> [ 244.707672] onenand_command[382] page 63, 2752512, 63 >>>>> [ 244.712890] onenand_wait: ECC error = 0x8488 >>>>> >>>>> ECC failed at 00000000 >>>>> 00000000: checking... >>>>> compare failed. seed 1804289383 >>>>> Byte 0x1 is 5a should be da >>>>> Byte 0x3 is 82 should be 92 >>>>> Byte 0x4 is 10 should be 1a >>>>> Byte 0x5 is 21 should be b7 >>>>> >>>>> --- end log nandtest fail --- >>>>> >>>>> >>>>> With this other code nandtest pass >>>>> >>>>> onenand_base.c >>>>> >>>>> 377: default: >>>>> block = onenand_block(this, addr); >>>>> page = (int) (addr >> this->page_shift); >>>>> /* (line disabled) page = (int) (addr - onenand_addr(this, block)) >> >>>>> this->page_shift; */ >>>>> >>>>> printk("%s[%d] page %d, %d, %d\n", __func__, __LINE__, >>>>> page, (int) >>>>> onenand_addr(this, block), ((int) addr >> >>>>> this->page_shift) & >>>>> this->page_mask); >>>>> >>>>> if (ONENAND_IS_2PLANE(this)) { >>>>> /* Make the even block number */ >>>>> block &= ~1; >>>>> /* Is it the odd plane? */ >>>>> if (addr & this->writesize) >>>>> block++; >>>>> page >>= 1; >>>>> } >>>>> page &= this->page_mask; >>>>> break; >>>>> >>>>> --- start log nandtest pass --- >>>>> # nandtest -l 262144 /dev/mtd3 >>>>> ECC corrections: 0 >>>>> ECC failures : 33 >>>>> Bad blocks : 0 >>>>> BBT blocks : 0 >>>>> 00000000: writing... >>>>> [ 2024.624664] onenand_command[382] page 1280, 2621440, 0 >>>>> [ 2024.631530] onenand_command[382] page 1282, 2621440, 2 >>>>> [ 2024.637145] onenand_command[382] page 1284, 2621440, 4 >>>>> (...) >>>>> [ 2024.796813] onenand_command[382] page 1340, 2621440, 60 >>>>> [ 2024.802520] onenand_command[382] page 1342, 2621440, 62 >>>>> [ 2024.808593] onenand_command[382] page 1344, 2752512, 0 >>>>> [ 2024.814239] onenand_command[382] page 1346, 2752512, 2 >>>>> (...) >>>>> [ 2024.979644] onenand_command[382] page 1404, 2752512, 60 >>>>> [ 2024.985351] onenand_command[382] page 1406, 2752512, 62 >>>>> 00000000: reading... >>>>> [ 2024.990997] onenand_command[382] page 1280, 2621440, 0 >>>>> [ 2024.997985] onenand_command[382] page 1281, 2621440, 1 >>>>> [ 2025.003295] onenand_command[382] page 1282, 2621440, 2 >>>>> (...) >>>>> >>>>> [ 2025.326782] onenand_command[382] page 1342, 2621440, 62 >>>>> [ 2025.332214] onenand_command[382] page 1343, 2621440, 63 >>>>> [ 2025.338592] onenand_command[382] page 1344, 2752512, 0 >>>>> [ 2025.343811] onenand_command[382] page 1345, 2752512, 1 >>>>> [ 2025.349151] onenand_command[382] page 1346, 2752512, 2 >>>>> (...) >>>>> [ 2025.672576] onenand_command[382] page 1406, 2752512, 62 >>>>> [ 2025.677978] onenand_command[382] page 1407, 2752512, 63 >>>>> 00000000: checking... >>>>> Finished pass 1 successfully >>>>> --- end log nandtest pass --- >>>>> >>>>>> >>>>>> In my test environment, it displays the correct page number. >>>>>> (addr - onenand_addr(this, block) >> this->page_shift is same as >>>>>> '(addr >> this->page_shift) & this->page_mask'. >>>>>> >>>>> >>>>> Looks like page number is wrong ? >>>>> >>>>> Cheers, >>>>> >>>>> Enric >>>>> >>>>>> Thank you, >>>>>> Kyungmin Park >>>>>> >>>>>> On Fri, Apr 30, 2010 at 7:05 PM, Enric Balletbò i Serra >>>>>> <eballetbo@gmail.com> wrote: >>>>>>> Hello all, >>>>>>> >>>>>>> After commit 5988af2319781bc8e0ce418affec4e09cfa77907 (mtd: >>>>>>> Flex-OneNAND support) the onenand support for my device is broken. >>>>>>> >>>>>>> Before this commit when I run the nandtest program all is ok >>>>>>> --- >>>>>>> # nandtest /dev/mtd3 >>>>>>> ECC corrections: 0 >>>>>>> ECC failures : 0 >>>>>>> Bad blocks : 0 >>>>>>> BBT blocks : 0 >>>>>>> 002c0000: checking... >>>>>>> Finished pass 1 successfully >>>>>>> -- >>>>>>> >>>>>>> Introduced commit 5988af2319781bc8e0ce418affec4e09cfa7790 the nandtest >>>>>>> fails with: >>>>>>> --- >>>>>>> # nandtest /dev/mtd3 >>>>>>> ECC corrections: 0 >>>>>>> ECC failures : 0 >>>>>>> Bad blocks : 0 >>>>>>> BBT blocks : 0 >>>>>>> 00000000: reading... >>>>>>> [ 299.092041] onenand_wait: ECC error = 0x8488 >>>>>>> ( ... lots of ECC errors ... ) >>>>>>> [ 299.092041] onenand_wait: ECC error = 0x8488 >>>>>>> ECC failed at 00000000 >>>>>>> 00000000: checking... >>>>>>> compare failed. seed 1804289383 >>>>>>> Byte 0x1 is 5a should be da >>>>>>> Byte 0x3 is 82 should be 92 >>>>>>> Byte 0x4 is 10 should be 1a >>>>>>> ( ... ) >>>>>>> --- >>>>>>> >>>>>>> Investigating a little I see a significant difference introduced by >>>>>>> this patch. In line >>>>>>> >>>>>>> 347: page = (int) (addr - onenand_addr(this, block)) >> >>>>>>> this->page_shift; (patch applied) >>>>>>> >>>>>>> instead of >>>>>>> >>>>>>> 347: page = (int) (addr >> this->page_shift); (without patch) >>>>>>> >>>>>>> I applied commit 5988af2319781bc8e0ce418affec4e09cfa7790 and replaced >>>>>>> the line 347 and now works again. Fantastic, but I suspect this is not >>>>>>> the proper solution (probably this breaks other onenands devices, I >>>>>>> can't test). >>>>>>> >>>>>>> I'm just introducing in OneNAND devices so anyone can help me to >>>>>>> understand and solve the problem ? Note that my device is a Numonyx >>>>>>> 4-Gbit DDP (DUAL DIE PLAN) OneNAND flash memory ( 2 dice of 2Gb, 2KB >>>>>>> page ) >>>>>>> >>>>>>> Thanks in advance, >>>>>>> >>>>>>> ///:~Enric >>>>>>> >>>>>>> --- >>>>>>> diff --git a/drivers/mtd/onenand/onenand_base.c >>>>>>> b/drivers/mtd/onenand/onenand_base.c >>>>>>> index 081f97d..b1d50a3 100644 >>>>>>> --- a/drivers/mtd/onenand/onenand_base.c >>>>>>> +++ b/drivers/mtd/onenand/onenand_base.c >>>>>>> @@ -344,7 +344,7 @@ static int onenand_command(struct mtd_info *mtd, >>>>>>> int cmd, loff_t addr, size_t le >>>>>>> >>>>>>> default: >>>>>>> block = (int) onenand_block(this, addr); >>>>>>> - page = (int) (addr - onenand_addr(this, block)) >> this->page_shift; >>>>>>> + page = (int) (addr >> this->page_shift); >>>>>>> >>>>>>> if (ONENAND_IS_2PLANE(this)) { >>>>>>> /* Make the even block number */ >>>>>>> --- >>>>>>> >>>>>>> ______________________________________________________ >>>>>>> Linux MTD discussion mailing list >>>>>>> http://lists.infradead.org/mailman/listinfo/linux-mtd/ >>>>>>> >>>>>> >>>>> -- >>>>> To unsubscribe from this list: send the line "unsubscribe linux-omap" in >>>>> the body of a message to majordomo@vger.kernel.org >>>>> More majordomo info at http://vger.kernel.org/majordomo-info.html >>>>> >>>> >>> >> >
On Thu, 2010-07-08 at 11:55 +0200, Enric Balletbò i Serra wrote: > Hello, > > I made new tests regarding this issue. Looks like the problem is > reading from the OneNAND device. Did you try older kernel and then bisecting who is responsible for the breakage?
Hello, 2010/7/8 Artem Bityutskiy <dedekind1@gmail.com>: > On Thu, 2010-07-08 at 11:55 +0200, Enric Balletbò i Serra wrote: >> Hello, >> >> I made new tests regarding this issue. Looks like the problem is >> reading from the OneNAND device. > > Did you try older kernel and then bisecting who is responsible for the > breakage? Yes, before commit 5988af2319781bc8e0ce418affec4e09cfa77907 (mtd: Flex-OneNAND support) http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=5988af2319781bc8e0ce418affec4e09cfa77907 my OneNAND is working, after the commit, the OneNAND support is broken. Cheers, Enric > > -- > Best Regards, > Artem Bityutskiy (Артём Битюцкий) > >
On Thu, 2010-07-08 at 12:11 +0200, Enric Balletbò i Serra wrote: > Hello, > > 2010/7/8 Artem Bityutskiy <dedekind1@gmail.com>: > > On Thu, 2010-07-08 at 11:55 +0200, Enric Balletbò i Serra wrote: > >> Hello, > >> > >> I made new tests regarding this issue. Looks like the problem is > >> reading from the OneNAND device. > > > > Did you try older kernel and then bisecting who is responsible for the > > breakage? > > Yes, before commit > > 5988af2319781bc8e0ce418affec4e09cfa77907 (mtd: Flex-OneNAND support) > > http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=5988af2319781bc8e0ce418affec4e09cfa77907 > > my OneNAND is working, after the commit, the OneNAND support is broken. Ok, we could revert it, but it is better to fix it. CCing the author of the commit.
diff --git a/drivers/mtd/onenand/onenand_base.c b/drivers/mtd/onenand/onenand_base.c index 081f97d..b1d50a3 100644 --- a/drivers/mtd/onenand/onenand_base.c +++ b/drivers/mtd/onenand/onenand_base.c @@ -344,7 +344,7 @@ static int onenand_command(struct mtd_info *mtd, int cmd, loff_t addr, size_t le default: block = (int) onenand_block(this, addr); - page = (int) (addr - onenand_addr(this, block)) >> this->page_shift; + page = (int) (addr >> this->page_shift); if (ONENAND_IS_2PLANE(this)) {