Skip to contentSkip to conversation

Two bug fixes of Denali NAND controller driver

PATCH New Masahiro Yamada 3 participants 6 messages Oct 3, 2014 – Oct 9, 2014

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

cover Two bug fixes of Denali NAND controller driver

Masahiro Yamada (2):
mtd: denali: fix NAND_CMD_PARAM command
mtd: denali: support NAND_CMD_RNDOUT command

 drivers/mtd/nand/denali.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)
Signature · 1 line
1.9.1
#1 lore raw

PATCH 1/2 mtd: denali: fix NAND_CMD_PARAM command

NAND_CMD_PARAM (0xEC) command is not working on the Denali NAND controller driver.

Unlike NAND_CMD_READID (0x90), when the NAND_CMD_PARAM command is followed by an address cycle, the target device goes busy. (R/B# is deasserted)
Wait until the parameter data are ready.

In addition, unnecessary clear_interrupts() should be removed.

---

 drivers/mtd/nand/denali.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/mtd/nand/denali.c +3 -2
index ba3de1a..d9abc7e 100644
@@ -1059,9 +1059,8 @@ static void denali_cmdfunc(struct mtd_info *mtd, unsigned int cmd, int col,
 		addr = MODE_11 | BANK(denali->flash_bank);
 		index_addr(denali, addr | 0, cmd);
 		break;
-	case NAND_CMD_PARAM:
-		clear_interrupts(denali);
 	case NAND_CMD_READID:
+	case NAND_CMD_PARAM:
 		reset_buf(denali);
 		/* sometimes ManufactureId read from register is not right
 		 * e.g. some of Micron MT29F32G08QAA MLC NAND chips
@@ -1070,6 +1069,8 @@ static void denali_cmdfunc(struct mtd_info *mtd, unsigned int cmd, int col,
 		addr = MODE_11 | BANK(denali->flash_bank);
 		index_addr(denali, addr | 0, cmd);
 		index_addr(denali, addr | 1, col & 0xFF);
+		if (cmd == NAND_CMD_PARAM)
+			udelay(50);
 		break;
 	case NAND_CMD_READ0:
 	case NAND_CMD_SEQIN:
Signature · 1 line
1.9.1
#2 lore raw

PATCH 1/2 mtd: denali: fix NAND_CMD_PARAM command

Quoted 32 lines · Masahiro Yamada

NAND_CMD_PARAM (0xEC) command is not working on the Denali NAND controller driver.

Unlike NAND_CMD_READID (0x90), when the NAND_CMD_PARAM command is followed by an address cycle, the target device goes busy. (R/B# is deasserted)
Wait until the parameter data are ready.

In addition, unnecessary clear_interrupts() should be removed.

---

 drivers/mtd/nand/denali.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/mtd/nand/denali.c +1 -2
index ba3de1a..d9abc7e 100644
@@ -1059,9 +1059,8 @@ static void denali_cmdfunc(struct mtd_info *mtd, unsigned int cmd, int col,
 		addr = MODE_11 | BANK(denali->flash_bank);
 		index_addr(denali, addr | 0, cmd);
 		break;
-	case NAND_CMD_PARAM:
-		clear_interrupts(denali);
 	case NAND_CMD_READID:
+	case NAND_CMD_PARAM:
 		reset_buf(denali);
 		/* sometimes ManufactureId read from register is not right
 		 * e.g. some of Micron MT29F32G08QAA MLC NAND chips

drivers/mtd/nand/denali.c static void denali_cmdfunc(struct mtd_info *mtd, unsigned int cmd, int col, · line 1076

Quoted 8 lines
drivers/mtd/nand/denali.c +2 -0
@@ -1070,6 +1069,8 @@ static void denali_cmdfunc(struct mtd_info *mtd, unsigned int cmd, int col,
 		addr = MODE_11 | BANK(denali->flash_bank);
 		index_addr(denali, addr | 0, cmd);
 		index_addr(denali, addr | 1, col & 0xFF);
+		if (cmd == NAND_CMD_PARAM)
+			udelay(50);
 		break;
 	case NAND_CMD_READ0:
 	case NAND_CMD_SEQIN:
#3 lore raw

PATCH 2/2 mtd: denali: support NAND_CMD_RNDOUT command

In reply to Masahiro Yamada

The function nand_flash_detect_ext_param_page() requires NAND_CMD_RNDOUT command supported. It is necessary to detect some types of ONFi-compliant devices. Without it, the error message "unsupported command received 0x5" is shown.

Let's support this command on the Denali NAND controller driver.

---

 drivers/mtd/nand/denali.c | 7 +++++++
 1 file changed, 7 insertions(+)
drivers/mtd/nand/denali.c +7 -0
index d9abc7e..308b784 100644
@@ -1072,6 +1072,13 @@ static void denali_cmdfunc(struct mtd_info *mtd, unsigned int cmd, int col,
 		if (cmd == NAND_CMD_PARAM)
 			udelay(50);
 		break;
+	case NAND_CMD_RNDOUT:
+		addr = MODE_11 | BANK(denali->flash_bank);
+		index_addr(denali, addr | 0, cmd);
+		index_addr(denali, addr | 1, col & 0xFF);
+		index_addr(denali, addr | 1, col >> 8);
+		index_addr(denali, addr | 0, NAND_CMD_RNDOUTSTART);
+		break;
 	case NAND_CMD_READ0:
 	case NAND_CMD_SEQIN:
 		denali->page = page;
Signature · 1 line
1.9.1
#4 lore raw

PATCH 2/2 mtd: denali: support NAND_CMD_RNDOUT command

Quoted 21 lines · Masahiro Yamada

The function nand_flash_detect_ext_param_page() requires NAND_CMD_RNDOUT command supported. It is necessary to detect some types of ONFi-compliant devices. Without it, the error message "unsupported command received 0x5" is shown.

Let's support this command on the Denali NAND controller driver.

---

 drivers/mtd/nand/denali.c | 7 +++++++
 1 file changed, 7 insertions(+)
drivers/mtd/nand/denali.c +0 -0
index d9abc7e..308b784 100644
@@ -1072,6 +1072,13 @@ static void denali_cmdfunc(struct mtd_info *mtd, unsigned int cmd, int col,
 		if (cmd == NAND_CMD_PARAM)
 			udelay(50);
 		break;

drivers/mtd/nand/denali.c static void denali_cmdfunc(struct mtd_info *mtd, unsigned int cmd, int col, · line 1084

Quoted 10 lines
drivers/mtd/nand/denali.c +7 -0
+	case NAND_CMD_RNDOUT:
+		addr = MODE_11 | BANK(denali->flash_bank);
+		index_addr(denali, addr | 0, cmd);
+		index_addr(denali, addr | 1, col & 0xFF);
+		index_addr(denali, addr | 1, col >> 8);
+		index_addr(denali, addr | 0, NAND_CMD_RNDOUTSTART);
+		break;
 	case NAND_CMD_READ0:
 	case NAND_CMD_SEQIN:
 		denali->page = page;
#5 lore raw

PATCH 2/2 mtd: denali: support NAND_CMD_RNDOUT command

In reply to Masahiro Yamada
Quoted 18 lines · Masahiro Yamada

The function nand_flash_detect_ext_param_page() requires NAND_CMD_RNDOUT command supported. It is necessary to detect some types of ONFi-compliant devices. Without it, the error message "unsupported command received 0x5" is shown.

Let's support this command on the Denali NAND controller driver.

---

 drivers/mtd/nand/denali.c | 7 +++++++
 1 file changed, 7 insertions(+)
drivers/mtd/nand/denali.c +0 -0
index d9abc7e..308b784 100644

drivers/mtd/nand/denali.c static void denali_cmdfunc(struct mtd_info *mtd, unsigned int cmd, int col, · line 1081

Quoted 10 lines
drivers/mtd/nand/denali.c +7 -0
@@ -1072,6 +1072,13 @@ static void denali_cmdfunc(struct mtd_info *mtd, unsigned int cmd, int col,
 		if (cmd == NAND_CMD_PARAM)
 			udelay(50);
 		break;
+	case NAND_CMD_RNDOUT:
+		addr = MODE_11 | BANK(denali->flash_bank);
+		index_addr(denali, addr | 0, cmd);
+		index_addr(denali, addr | 1, col & 0xFF);
+		index_addr(denali, addr | 1, col >> 8);
+		index_addr(denali, addr | 0, NAND_CMD_RNDOUTSTART);
+		break;

This usage of RNDOUT is a regression for other drivers as well, such as fsl_ifc_nand... I really wish emulating a simple controller weren't the API used to talk to higher level drivers. :-(

-Scott