Skip to content

Commit

Permalink
mxc_nand: Fix OOB handling
Browse files Browse the repository at this point in the history
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: Sascha Hauer <s.hauer@pengutronix.de>
Reported-by: Wolfram Sang <w.sang@pengutronix.de>
Tested-by: Baruch Siach <baruch@tkos.co.il>
  • Loading branch information
Sascha Hauer committed Jul 26, 2010
1 parent d2195d5 commit 5ea3202
Showing 1 changed file with 5 additions and 26 deletions.
31 changes: 5 additions & 26 deletions drivers/mtd/nand/mxc_nand.c
Original file line number Diff line number Diff line change
Expand Up @@ -623,8 +623,7 @@ static void mxc_nand_command(struct mtd_info *mtd, unsigned command,
else
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);
mxc_do_addr_cycle(mtd, column, page_addr);
Expand All @@ -639,31 +638,11 @@ static void mxc_nand_command(struct mtd_info *mtd, unsigned command,
break;

case NAND_CMD_SEQIN:
if (column >= mtd->writesize) {
/*
* FIXME: before send SEQIN command for write OOB,
* 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;
if (column >= mtd->writesize)
/* call ourself to read a page */
mxc_nand_command(mtd, NAND_CMD_READ0, 0, page_addr);

/* Set program pointer to page start */
if (mtd->writesize == 512)
send_cmd(host, NAND_CMD_READ0, false);
}
host->buf_start = column;

send_cmd(host, command, false);
mxc_do_addr_cycle(mtd, column, page_addr);
Expand Down

0 comments on commit 5ea3202

Please sign in to comment.