| From 61dcf20b19d956ad21f69743f862f76481ce984f Mon Sep 17 00:00:00 2001 |
| From: Ulf Hansson <ulf.hansson@linaro.org> |
| Date: Wed, 11 Mar 2020 10:20:36 +0100 |
| Subject: [PATCH] mmc: core: Respect MMC_CAP_NEED_RSP_BUSY for eMMC sleep |
| command |
| |
| commit 18d200460cd73636d4f20674085c39e32b4e0097 upstream. |
| |
| The busy timeout for the CMD5 to put the eMMC into sleep state, is specific |
| to the card. Potentially the timeout may exceed the host->max_busy_timeout. |
| If that becomes the case, mmc_sleep() converts from using an R1B response |
| to an R1 response, as to prevent the host from doing HW busy detection. |
| |
| However, it has turned out that some hosts requires an R1B response no |
| matter what, so let's respect that via checking MMC_CAP_NEED_RSP_BUSY. Note |
| that, if the R1B gets enforced, the host becomes fully responsible of |
| managing the needed busy timeout, in one way or the other. |
| |
| Suggested-by: Sowjanya Komatineni <skomatineni@nvidia.com> |
| Cc: <stable@vger.kernel.org> |
| Link: https://lore.kernel.org/r/20200311092036.16084-1-ulf.hansson@linaro.org |
| Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c |
| index c8804895595f..b7159e243323 100644 |
| --- a/drivers/mmc/core/mmc.c |
| +++ b/drivers/mmc/core/mmc.c |
| @@ -1911,9 +1911,12 @@ static int mmc_sleep(struct mmc_host *host) |
| * If the max_busy_timeout of the host is specified, validate it against |
| * the sleep cmd timeout. A failure means we need to prevent the host |
| * from doing hw busy detection, which is done by converting to a R1 |
| - * response instead of a R1B. |
| + * response instead of a R1B. Note, some hosts requires R1B, which also |
| + * means they are on their own when it comes to deal with the busy |
| + * timeout. |
| */ |
| - if (host->max_busy_timeout && (timeout_ms > host->max_busy_timeout)) { |
| + if (!(host->caps & MMC_CAP_NEED_RSP_BUSY) && host->max_busy_timeout && |
| + (timeout_ms > host->max_busy_timeout)) { |
| cmd.flags = MMC_RSP_R1 | MMC_CMD_AC; |
| } else { |
| cmd.flags = MMC_RSP_R1B | MMC_CMD_AC; |
| -- |
| 2.7.4 |
| |