| From 91cdf044b0187f042d045bc639b8e4d59372f253 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 14 Apr 2020 18:14:10 +0200 |
| Subject: mmc: via-sdmmc: Respect the cmd->busy_timeout from the mmc core |
| |
| From: Ulf Hansson <ulf.hansson@linaro.org> |
| |
| [ Upstream commit 966244ccd2919e28f25555a77f204cd1c109cad8 ] |
| |
| Using a fixed 1s timeout for all commands (and data transfers) is a bit |
| problematic. |
| |
| For some commands it means waiting longer than needed for the timer to |
| expire, which may not a big issue, but still. For other commands, like for |
| an erase (CMD38) that uses a R1B response, may require longer timeouts than |
| 1s. In these cases, we may end up treating the command as it failed, while |
| it just needed some more time to complete successfully. |
| |
| Fix the problem by respecting the cmd->busy_timeout, which is provided by |
| the mmc core. |
| |
| Cc: Bruce Chang <brucechang@via.com.tw> |
| Cc: Harald Welte <HaraldWelte@viatech.com> |
| Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> |
| Link: https://lore.kernel.org/r/20200414161413.3036-17-ulf.hansson@linaro.org |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/mmc/host/via-sdmmc.c | 7 ++++++- |
| 1 file changed, 6 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/mmc/host/via-sdmmc.c b/drivers/mmc/host/via-sdmmc.c |
| index a838bf5480d8..a863a345fc59 100644 |
| --- a/drivers/mmc/host/via-sdmmc.c |
| +++ b/drivers/mmc/host/via-sdmmc.c |
| @@ -323,6 +323,8 @@ struct via_crdr_mmc_host { |
| /* some devices need a very long delay for power to stabilize */ |
| #define VIA_CRDR_QUIRK_300MS_PWRDELAY 0x0001 |
| |
| +#define VIA_CMD_TIMEOUT_MS 1000 |
| + |
| static const struct pci_device_id via_ids[] = { |
| {PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_9530, |
| PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0,}, |
| @@ -555,14 +557,17 @@ static void via_sdc_send_command(struct via_crdr_mmc_host *host, |
| { |
| void __iomem *addrbase; |
| struct mmc_data *data; |
| + unsigned int timeout_ms; |
| u32 cmdctrl = 0; |
| |
| WARN_ON(host->cmd); |
| |
| data = cmd->data; |
| - mod_timer(&host->timer, jiffies + HZ); |
| host->cmd = cmd; |
| |
| + timeout_ms = cmd->busy_timeout ? cmd->busy_timeout : VIA_CMD_TIMEOUT_MS; |
| + mod_timer(&host->timer, jiffies + msecs_to_jiffies(timeout_ms)); |
| + |
| /*Command index*/ |
| cmdctrl = cmd->opcode << 8; |
| |
| -- |
| 2.25.1 |
| |