Re: mmc_core: question on mmc_do_erase function

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 13/10/10 11:35, Dong, Chuanxiao wrote:
-----Original Message-----
From: Adrian Hunter [mailto:adrian.hunter@xxxxxxxxx]
Sent: Wednesday, October 13, 2010 3:56 PM
To: Dong, Chuanxiao
Cc: linux-mmc@xxxxxxxxxxxxxxx; Gao, Yunpeng
Subject: Re: mmc_core: question on mmc_do_erase function

On 12/10/10 16:11, Dong, Chuanxiao wrote:
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.

I don't know SDHCI.  Can you disable the timeout altogether and use a
timer?

OK, thanks. If hardware can disable the timeout interrupt, I will try
use a timer. But if the host controllers cannot disable the their
timeout interrupt, what should they do?

The block driver currently sets max_discard_sectors to UINT_MAX i.e.
unlimited.  This could instead be based on a value from the driver
in the same way that max_sectors is.  Refer to mmc_init_queue()
in card/queue.c


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?

Where is the erase coming from?  A file system?  The discard ioctl?
Erase command comes from the discard ioctl.

It is possible to set a maximum size for the discard but it pays
no attention to alignment, so you can get very sub-optimal erases.



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


[Index of Archives]     [Linux USB Devel]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux