Skip to contentSkip to conversation

2nd problem with read_subpage() ?

DISCUSSION Artem Bityutskiy 2 participants 7 messages Jul 29, 2008 Memory technology devices (MTD)

lore
Share & tools
lore
#0 lore raw

Glance at nand_do_read_ops():

if (likely(sndcmd)) {
        chip->cmdfunc(mtd, NAND_CMD_READ0, 0x00, page);
        sndcmd = 0;
}

/* Now read the page into the buffer */
if (unlikely(ops->mode == MTD_OOB_RAW))

        ret = chip->ecc.read_page_raw(mtd, chip, bufpoi);
else if (!aligned && NAND_SUBPAGE_READ(chip) && !oob)
        ret = chip->ecc.read_subpage(mtd, chip, col, bytes, bufpoi);
else
        ret = chip->ecc.read_page(mtd, chip, bufpoi);
if (ret < 0)
        break;

What happens is that first NAND_CMD_READ0 command is sent, and the chip reads _full_ page 0. Then read_subpage() is called and chip reads the subpage again. Does it make any sense?

Signature · 2 lines
Best regards,
Artem Bityutskiy (Битюцкий Артём)
#1 lore raw
Quoted 7 lines · Artem Bityutskiy

Glance at nand_do_read_ops():

if (likely(sndcmd)) {
        chip->cmdfunc(mtd, NAND_CMD_READ0, 0x00, page);
        sndcmd = 0;
}

Alexey,

my investigation showed that this "random output" command is not supported by all flashes. ST-micro NANDs seems to support it (I checked 2 manuals), while Sumsung NANDs do not (checked manual for K9XXG08UXA). This means your implementation will break many systems and should be either fixed or reverted.

Signature · 2 lines
Best regards,
Artem Bityutskiy (Битюцкий Артём)
#2 lore raw
Quoted 9 lines · Artem Bityutskiy
Quoted 7 lines · Artem Bityutskiy

Glance at nand_do_read_ops():

if (likely(sndcmd)) {
        chip->cmdfunc(mtd, NAND_CMD_READ0, 0x00, page);
        sndcmd = 0;
}
Quoted 7 lines

Alexey,

my investigation showed that this "random output" command is not supported by all flashes. ST-micro NANDs seems to support it (I checked 2 manuals), while Sumsung NANDs do not (checked manual for K9XXG08UXA). This means your implementation will break many systems and should be either fixed or reverted.

Note, the Samsung NAND I referred is a large page device.

Signature · 2 lines
Best regards,
Artem Bityutskiy (Битюцкий Артём)
#3 lore raw

Hi Artem,

Quoted 12 lines · Artem Bityutskiy
Quoted 11 lines · Artem Bityutskiy
Quoted 7 lines

Glance at nand_do_read_ops():

if (likely(sndcmd)) {
        chip->cmdfunc(mtd, NAND_CMD_READ0, 0x00, page);
        sndcmd = 0;
}

Alexey,

Quoted 8 lines
Quoted 5 lines

my investigation showed that this "random output" command is not supported by all flashes. ST-micro NANDs seems to support it (I checked 2 manuals), while Sumsung NANDs do not (checked manual for K9XXG08UXA). This means your implementation will break many systems and should be either fixed or reverted.

Note, the Samsung NAND I referred is a large page device.

AFAIK this is a standard feature for LP NANDS. I glanced at spec for K9XXG08UXA - device supports subpage oprations.

To check it I did this.
Google -> K9XXG08UXA -> the first link -> open PDF page 41.

Thanks,
Alexey

#4 lore raw
Quoted 20 lines · Alexey Korolev

Hi Artem,

Quoted 18 lines · Artem Bityutskiy
Quoted 16 lines · Artem Bityutskiy
Quoted 7 lines

Glance at nand_do_read_ops():

if (likely(sndcmd)) {
        chip->cmdfunc(mtd, NAND_CMD_READ0, 0x00, page);
        sndcmd = 0;
}

Alexey,

my investigation showed that this "random output" command is not supported by all flashes. ST-micro NANDs seems to support it (I checked 2 manuals), while Sumsung NANDs do not (checked manual for K9XXG08UXA). This means your implementation will break many systems and should be either fixed or reverted.

Quoted 7 lines
Quoted 2 lines

Note, the Samsung NAND I referred is a large page device.

AFAIK this is a standard feature for LP NANDS. I glanced at spec for K9XXG08UXA - device supports subpage oprations.

To check it I did this.
Google -> K9XXG08UXA -> the first link -> open PDF page 41.

Ops, right, sorry for the fake alarm.

Signature · 2 lines
Best regards,
Artem Bityutskiy (Битюцкий Артём)
#5 lore raw
In reply to Artem Bityutskiy
Quoted 9 lines · Artem Bityutskiy
Quoted 7 lines · Artem Bityutskiy

Glance at nand_do_read_ops():

if (likely(sndcmd)) {
        chip->cmdfunc(mtd, NAND_CMD_READ0, 0x00, page);
        sndcmd = 0;
}
Quoted 7 lines

Alexey,

my investigation showed that this "random output" command is not supported by all flashes. ST-micro NANDs seems to support it (I checked 2 manuals), while Sumsung NANDs do not (checked manual for K9XXG08UXA). This means your implementation will break many systems and should be either fixed or reverted.

I tried to implement this command in nandsim and test it with your patch and found that there is something wring with how you use it.

What I do is dd if=/dev/mtd0 of=file bs=512 count=1 - just read one sub-page. And in nandsim I see the following:

1. NAND_CMD_READ0 command, - read from eraseblock 0, column 0. This is fine and seems to be called from nand_do_read_ops():

if (likely(sndcmd)) {
	chip->cmdfunc(mtd, NAND_CMD_READ0, 0x00, page);
        sndcmd = 0;
}

2. Then NAND_CMD_RNDREAD command is issued with column address 0x828, which is completely weird. It is called from nand_read_subpage():

...
if (eccpos[(start_step + num_steps) * chip->ecc.bytes] & (busw - 1))

	aligned_len++;

chip->cmdfunc(mtd, NAND_CMD_RNDOUT, mtd->writesize + aligned_pos, -1); chip->read_buf(mtd, &chip->oob_poi[aligned_pos], aligned_len);
....

I do not understand what is going on.

Signature · 2 lines
Best regards,
Artem Bityutskiy (Битюцкий Артём)
#6 lore raw

Hi,

Oh thanks for explanation.
Now I understand what has puzzled you.

Nothing wrong is here.
Driver reads one subpage - then it needs to check ECC for the subpage - it jumps to position of ECC for that region and reads it. Then it checks if it is correct.

Quoted 55 lines · Artem Bityutskiy
Quoted 9 lines · Artem Bityutskiy
Quoted 7 lines

Glance at nand_do_read_ops():

if (likely(sndcmd)) {
        chip->cmdfunc(mtd, NAND_CMD_READ0, 0x00, page);
        sndcmd = 0;
}
Quoted 7 lines

Alexey,

my investigation showed that this "random output" command is not supported by all flashes. ST-micro NANDs seems to support it (I checked 2 manuals), while Sumsung NANDs do not (checked manual for K9XXG08UXA). This means your implementation will break many systems and should be either fixed or reverted.

I tried to implement this command in nandsim and test it with your patch and found that there is something wring with how you use it.

What I do is dd if=/dev/mtd0 of=file bs=512 count=1 - just read one sub-page. And in nandsim I see the following:

1. NAND_CMD_READ0 command, - read from eraseblock 0, column 0. This is fine and seems to be called from nand_do_read_ops():

if (likely(sndcmd)) {
	chip->cmdfunc(mtd, NAND_CMD_READ0, 0x00, page);
        sndcmd = 0;
}

2. Then NAND_CMD_RNDREAD command is issued with column address 0x828, which is completely weird. It is called from nand_read_subpage():

...
if (eccpos[(start_step + num_steps) * chip->ecc.bytes] & (busw - 1))

	aligned_len++;

chip->cmdfunc(mtd, NAND_CMD_RNDOUT, mtd->writesize + aligned_pos, -1); chip->read_buf(mtd, &chip->oob_poi[aligned_pos], aligned_len);
....

I do not understand what is going on.

Signature · 7 lines
Best regards,
Artem Bityutskiy (Битюцкий Артём)


______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/