[Linux-stm32] [PATCH v2 01/12] mmc: mmci: Clear busy_status when starting command
Ulf Hansson
ulf.hansson at linaro.org
Mon Apr 17 13:06:51 UTC 2023
On Sun, 9 Apr 2023 at 00:00, Linus Walleij <linus.walleij at linaro.org> wrote:
>
> If we are starting a command which can generate a busy
> response, then clear the variable host->busy_status
> if the variant is using a ->busy_complete callback.
>
> We are lucky that the member is zero by default and
> hopefully always gets cleared in the ->busy_complete
> callback even on errors, but it's just fragile so
> make sure it is always initialized to zero.
>
> Signed-off-by: Linus Walleij <linus.walleij at linaro.org>
> ---
> ChangeLog v1->v2:
> - Unconditionally clear host->busy_status if we get a
> busy response.
> ---
> drivers/mmc/host/mmci.c | 22 +++++++++++++---------
> 1 file changed, 13 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c
> index b9e5dfe74e5c..9b48df842425 100644
> --- a/drivers/mmc/host/mmci.c
> +++ b/drivers/mmc/host/mmci.c
> @@ -1238,17 +1238,21 @@ mmci_start_command(struct mmci_host *host, struct mmc_command *cmd, u32 c)
> c |= host->variant->cmdreg_srsp;
> }
>
> - if (host->variant->busy_timeout && cmd->flags & MMC_RSP_BUSY) {
> - if (!cmd->busy_timeout)
> - cmd->busy_timeout = 10 * MSEC_PER_SEC;
> + if (cmd->flags & MMC_RSP_BUSY) {
> + host->busy_status = 0;
To be even more safe, I don't think we should check "cmd->flags &
MMC_RSP_BUSY". Let's just reset it always instead.
>
> - if (cmd->busy_timeout > host->mmc->max_busy_timeout)
> - clks = (unsigned long long)host->mmc->max_busy_timeout * host->cclk;
> - else
> - clks = (unsigned long long)cmd->busy_timeout * host->cclk;
> + if (host->variant->busy_timeout) {
> + if (!cmd->busy_timeout)
> + cmd->busy_timeout = 10 * MSEC_PER_SEC;
>
> - do_div(clks, MSEC_PER_SEC);
> - writel_relaxed(clks, host->base + MMCIDATATIMER);
> + if (cmd->busy_timeout > host->mmc->max_busy_timeout)
> + clks = (unsigned long long)host->mmc->max_busy_timeout * host->cclk;
> + else
> + clks = (unsigned long long)cmd->busy_timeout * host->cclk;
> +
> + do_div(clks, MSEC_PER_SEC);
> + writel_relaxed(clks, host->base + MMCIDATATIMER);
> + }
> }
>
> if (host->ops->pre_sig_volt_switch && cmd->opcode == SD_SWITCH_VOLTAGE)
>
Kind regards
Uffe
More information about the Linux-stm32
mailing list