[PATCH 1/2] mmc: Introduce mmc_send_stop_transmission()
Peng Fan
peng.fan at oss.nxp.com
Wed Jun 14 11:53:44 CEST 2023
On 6/10/2023 7:23 PM, Marek Vasut wrote:
> From: Hai Pham <hai.pham.ud at renesas.com>
>
> If a tuning command times out, the card could still be processing it,
> which will cause problems for recovery. The eMMC specification section
> 6.6 Data transfer mode (cont’d) claims that CMD12 can be used to stop
> CMD21:
> "
> The relationship between the various data transfer modes is summarized (see Figure 27):
> - All data read commands can be aborted any time by the stop command (CMD12).
> The data transfer will terminate and the Device will return to the Transfer State.
> The read commands are: ... send tuning block (CMD21) ....
> "
> Add a function that does that.
>
> Based on Linux commit [1] and [2].
>
> [1] e711f0309109 ("mmc: mmc: Introduce mmc_abort_tuning()")
> [2] 21adc2e45f4e ("mmc: Improve function name when aborting a tuning
> cmd")
>
> Reviewed-by: Takeshi Kihara <takeshi.kihara.df at renesas.com>
> Reviewed-by: Marek Vasut <marek.vasut+renesas at mailbox.org>
> Signed-off-by: Hai Pham <hai.pham.ud at renesas.com>
> Signed-off-by: Marek Vasut <marek.vasut+renesas at mailbox.org>
> [Marek: Update commit message, quote relevant part of the specification.
> Rename to mmc_send_stop_transmission().
> Remove tuning opcode check, this is controller driver specific.
> Deduplicate part of mmc_read_blocks() using this function.]
> ---
> Cc: "Ying-Chun Liu (PaulLiu)" <paul.liu at linaro.org>
> Cc: Hai Pham <hai.pham.ud at renesas.com>
> Cc: Jaehoon Chung <jh80.chung at samsung.com>
> Cc: Loic Poulain <loic.poulain at linaro.org>
> Cc: Peng Fan <peng.fan at nxp.com>
> Cc: Simon Glass <sjg at chromium.org>
> Cc: Takeshi Kihara <takeshi.kihara.df at renesas.com>
> ---
> drivers/mmc/mmc.c | 16 ++++++++++++----
> include/mmc.h | 2 ++
> 2 files changed, 14 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
> index 1af6af82e6b..68a76aa3e94 100644
> --- a/drivers/mmc/mmc.c
> +++ b/drivers/mmc/mmc.c
> @@ -398,6 +398,17 @@ int mmc_send_tuning(struct mmc *mmc, u32 opcode, int *cmd_error)
> }
> #endif
>
> +int mmc_send_stop_transmission(struct mmc *mmc)
> +{
> + struct mmc_cmd cmd;
> +
> + cmd.cmdidx = MMC_CMD_STOP_TRANSMISSION;
> + cmd.cmdarg = 0;
> + cmd.resp_type = MMC_RSP_R1;
Should R1 and R1b both supported based on Read/Write access?
Thanks,
Peng.
> +
> + return mmc_send_cmd(mmc, &cmd, NULL);
> +}
> +
> static int mmc_read_blocks(struct mmc *mmc, void *dst, lbaint_t start,
> lbaint_t blkcnt)
> {
> @@ -425,10 +436,7 @@ static int mmc_read_blocks(struct mmc *mmc, void *dst, lbaint_t start,
> return 0;
>
> if (blkcnt > 1) {
> - cmd.cmdidx = MMC_CMD_STOP_TRANSMISSION;
> - cmd.cmdarg = 0;
> - cmd.resp_type = MMC_RSP_R1b;
> - if (mmc_send_cmd(mmc, &cmd, NULL)) {
> + if (mmc_send_stop_transmission(mmc)) {
> #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
> pr_err("mmc fail to send stop cmd\n");
> #endif
> diff --git a/include/mmc.h b/include/mmc.h
> index b8fbff150de..a413dc2af4d 100644
> --- a/include/mmc.h
> +++ b/include/mmc.h
> @@ -558,6 +558,8 @@ int mmc_deferred_probe(struct mmc *mmc);
> int mmc_reinit(struct mmc *mmc);
> int mmc_get_b_max(struct mmc *mmc, void *dst, lbaint_t blkcnt);
> int mmc_hs400_prepare_ddr(struct mmc *mmc);
> +int mmc_send_stop_transmission(struct mmc *mmc);
> +
> #else
> struct mmc_ops {
> int (*send_cmd)(struct mmc *mmc,
More information about the U-Boot
mailing list