Commit 5ea32021 authored by Sascha Hauer's avatar Sascha Hauer

mxc_nand: Fix OOB handling

The OOB handling in the mxc_nand driver is broken for v1 type
controllers (i.MX27/31) with 512 byte page size. This perhaps
did not show up because ubi does not use OOB.
Update the driver to always read/write a whole page even if
only OOB is requested. With this patch the driver passes the
mtd_oobtest on i.MX27 with 512 byte page size. Also tested
with 2048 byte page size and on i.MX35 (v2 type controller)
Signed-off-by: default avatarSascha Hauer <s.hauer@pengutronix.de>
Reported-by: default avatarWolfram Sang <w.sang@pengutronix.de>
Tested-by: default avatarBaruch Siach <baruch@tkos.co.il>
parent d2195d52
...@@ -623,8 +623,7 @@ static void mxc_nand_command(struct mtd_info *mtd, unsigned command, ...@@ -623,8 +623,7 @@ static void mxc_nand_command(struct mtd_info *mtd, unsigned command,
else else
host->buf_start = column + mtd->writesize; host->buf_start = column + mtd->writesize;
if (mtd->writesize > 512) command = NAND_CMD_READ0; /* only READ0 is valid */
command = NAND_CMD_READ0; /* only READ0 is valid */
send_cmd(host, command, false); send_cmd(host, command, false);
mxc_do_addr_cycle(mtd, column, page_addr); mxc_do_addr_cycle(mtd, column, page_addr);
...@@ -639,31 +638,11 @@ static void mxc_nand_command(struct mtd_info *mtd, unsigned command, ...@@ -639,31 +638,11 @@ static void mxc_nand_command(struct mtd_info *mtd, unsigned command,
break; break;
case NAND_CMD_SEQIN: case NAND_CMD_SEQIN:
if (column >= mtd->writesize) { if (column >= mtd->writesize)
/* /* call ourself to read a page */
* FIXME: before send SEQIN command for write OOB, mxc_nand_command(mtd, NAND_CMD_READ0, 0, page_addr);
* We must read one page out.
* For K9F1GXX has no READ1 command to set current HW
* pointer to spare area, we must write the whole page
* including OOB together.
*/
if (mtd->writesize > 512)
/* call ourself to read a page */
mxc_nand_command(mtd, NAND_CMD_READ0, 0,
page_addr);
host->buf_start = column;
/* Set program pointer to spare region */
if (mtd->writesize == 512)
send_cmd(host, NAND_CMD_READOOB, false);
} else {
host->buf_start = column;
/* Set program pointer to page start */ host->buf_start = column;
if (mtd->writesize == 512)
send_cmd(host, NAND_CMD_READ0, false);
}
send_cmd(host, command, false); send_cmd(host, command, false);
mxc_do_addr_cycle(mtd, column, page_addr); mxc_do_addr_cycle(mtd, column, page_addr);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment