diff mbox

Possible bug in onenand_base ?

Message ID u2v70c9a9111004300305n4c86774bm7ed70161ad72d830@mail.gmail.com
State New, archived
Headers show

Commit Message

Enric Balletbo Serra April 30, 2010, 10:05 a.m. UTC
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

---
 			/* Make the even block number */
---

Comments

Artem Bityutskiy May 5, 2010, 5:56 a.m. UTC | #1
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/
Kyungmin Park May 6, 2010, 3:46 a.m. UTC | #2
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/
>
Enric Balletbo Serra May 6, 2010, 11:22 a.m. UTC | #3
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/
>>
>
Kyungmin Park May 6, 2010, 11:44 a.m. UTC | #4
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
>
Enric Balletbo Serra May 6, 2010, 1:02 p.m. UTC | #5
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
>>
>
Enric Balletbo Serra May 12, 2010, 10:29 a.m. UTC | #6
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
>>>
>>
>
Enric Balletbo Serra May 12, 2010, 1:16 p.m. UTC | #7
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
>>>>
>>>
>>
>
Enric Balletbo Serra July 8, 2010, 9:55 a.m. UTC | #8
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
>>>>>
>>>>
>>>
>>
>
Artem Bityutskiy July 8, 2010, 9:58 a.m. UTC | #9
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?
Enric Balletbo Serra July 8, 2010, 10:11 a.m. UTC | #10
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 (Артём Битюцкий)
>
>
Artem Bityutskiy July 8, 2010, 10:22 a.m. UTC | #11
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 mbox

Patch

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)) {