Hi adrian

I got some questions about MMC driver erase function. Help you can give me some 
suggestion. My host controller is a kind of SDHCI host controller. And testing 
below code by using HD micro SD card.
+       memset(&cmd, 0, sizeof(struct mmc_command));
+       cmd.opcode = MMC_ERASE;
+       cmd.arg = arg;
+       cmd.flags = MMC_RSP_SPI_R1B | MMC_RSP_R1B | MMC_CMD_AC;
+       mmc_set_erase_timeout(card, &cmd, arg, qty);
+       err = mmc_wait_for_cmd(card->host, &cmd, 0);
+       if (err) {
+               printk(KERN_ERR "mmc_erase: erase error %d, status %#x\n",
+                      err, cmd.resp[0]);
+               err = -EIO;
+               goto out;
+       }
As MMC 4.4 standard said, CMD38 need R1B response. So when SDHCI host 
controller got a SDHCI_INT_RESPONSE interrupt, driver will ignore this and keep 
on waiting for a SDHCI_INT_DATA_END interrupt to finish MMC_ERASE command. Then 
I got problems....My host controller will got a DATA_TIMEOUT interrupt if host 
controller cannot generate any interrupt during its waiting time, unfortunately 
the max waiting time for my SDHCI host controller is 5s. So if any ERASE 
operation need more than 5s seconds to finish, my controller will not finish 
the ERASE operation and only generate a DATA_TIMEOUT interrupt. The ERASE will 
be failed. Another, MMC driver also has a 10s timer to keep watch over the 
interrupt, if ERASE operation need more than 10s to finish, this timer also can 
report a TIMEOUT error.
I think cmd->erase_timeout can help to set the timer expires, but how to deal 
with this issue for SDHCI host controller? How about split ERASE groups to be 
smaller ones?

+       if (mmc_host_is_spi(card->host))
+               goto out;
+
+       do {
+               memset(&cmd, 0, sizeof(struct mmc_command));
+               cmd.opcode = MMC_SEND_STATUS;
+               cmd.arg = card->rca << 16;
+               cmd.flags = MMC_RSP_R1 | MMC_CMD_AC;
+               /* Do not retry else we can't see errors */
+               err = mmc_wait_for_cmd(card->host, &cmd, 0);
+               if (err || (cmd.resp[0] & 0xFDF92000)) {
+                       printk(KERN_ERR "error %d requesting status %#x\n",
+                               err, cmd.resp[0]);
+                       err = -EIO;
+                       goto out;
+               }
+       } while (!(cmd.resp[0] & R1_READY_FOR_DATA) ||
+                R1_CURRENT_STATE(cmd.resp[0]) == 7);
+out:
+       return err;
+}
And can this code guarantee the card will finish the ERASE operation? If it 
can, what about send CMD38 with R1 response?(although doing this is against 
with MMC 4.4 standard....)

Best Regards
Chuanxiao Dong

--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to