2nd problem with read_subpage() ?
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 (Битюцкий Артём)
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 (Битюцкий Артём)
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 (Битюцкий Артём)
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
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 (Битюцкий Артём)
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 (Битюцкий Артём)
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_READ0command, - read from eraseblock 0, column 0. This is fine and seems to be called fromnand_do_read_ops():if (likely(sndcmd)) { chip->cmdfunc(mtd, NAND_CMD_READ0, 0x00, page); sndcmd = 0; }2. Then
NAND_CMD_RNDREADcommand is issued with column address0x828, which is completely weird. It is called fromnand_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/