Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+5 −26
Original line number Diff line number Diff line
@@ -623,7 +623,6 @@ 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 */

		send_cmd(host, command, false);
@@ -639,32 +638,12 @@ 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)
		if (column >= mtd->writesize)
			/* call ourself to read a page */
				mxc_nand_command(mtd, NAND_CMD_READ0, 0,
						page_addr);
			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 */
			if (mtd->writesize == 512)
				send_cmd(host, NAND_CMD_READ0, false);
		}

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