From: Victor Shih <victorshihgli@gmail.com>
To: ulf.hansson@linaro.org, adrian.hunter@intel.com
Cc: linux-mmc@vger.kernel.org, linux-kernel@vger.kernel.org,
benchuanggli@gmail.com, HL.Liu@genesyslogic.com.tw,
Greg.tu@genesyslogic.com.tw, takahiro.akashi@linaro.org,
dlunev@chromium.org, Victor Shih <victorshihgli@gmail.com>,
Ben Chuang <ben.chuang@genesyslogic.com.tw>,
Victor Shih <victor.shih@genesyslogic.com.tw>
Subject: [PATCH V16 08/23] mmc: core: Support UHS-II Auto Command Error Recovery
Date: Wed, 22 May 2024 19:08:54 +0800 [thread overview]
Message-ID: <20240522110909.10060-9-victorshihgli@gmail.com> (raw)
In-Reply-To: <20240522110909.10060-1-victorshihgli@gmail.com>
From: Victor Shih <victor.shih@genesyslogic.com.tw>
Add UHS-II Auto Command Error Recovery functionality
into the MMC request processing flow.
Signed-off-by: Ben Chuang <ben.chuang@genesyslogic.com.tw>
Signed-off-by: Victor Shih <victor.shih@genesyslogic.com.tw>
---
Updates in V16:
- Separate the Error Recovery mechanism from patch#7 to patch#8.
---
drivers/mmc/core/core.c | 4 ++
drivers/mmc/core/core.h | 1 +
drivers/mmc/core/sd_uhs2.c | 80 ++++++++++++++++++++++++++++++++++++++
include/linux/mmc/host.h | 6 +++
4 files changed, 91 insertions(+)
diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
index 68496c51a521..18642afc405f 100644
--- a/drivers/mmc/core/core.c
+++ b/drivers/mmc/core/core.c
@@ -403,6 +403,10 @@ void mmc_wait_for_req_done(struct mmc_host *host, struct mmc_request *mrq)
while (1) {
wait_for_completion(&mrq->completion);
+ if (host->ops->get_cd(host))
+ if (mrq->cmd->error || (mrq->data && mrq->data->error))
+ mmc_sd_uhs2_error_recovery(host, mrq);
+
cmd = mrq->cmd;
if (!cmd->error || !cmd->retries ||
diff --git a/drivers/mmc/core/core.h b/drivers/mmc/core/core.h
index 920323faa834..259d47c8bb19 100644
--- a/drivers/mmc/core/core.h
+++ b/drivers/mmc/core/core.h
@@ -82,6 +82,7 @@ int mmc_attach_mmc(struct mmc_host *host);
int mmc_attach_sd(struct mmc_host *host);
int mmc_attach_sdio(struct mmc_host *host);
int mmc_attach_sd_uhs2(struct mmc_host *host);
+void mmc_sd_uhs2_error_recovery(struct mmc_host *mmc, struct mmc_request *mrq);
/* Module parameters */
extern bool use_spi_crc;
diff --git a/drivers/mmc/core/sd_uhs2.c b/drivers/mmc/core/sd_uhs2.c
index 85939a2582dc..d5acb4e6ccac 100644
--- a/drivers/mmc/core/sd_uhs2.c
+++ b/drivers/mmc/core/sd_uhs2.c
@@ -1324,3 +1324,83 @@ int mmc_attach_sd_uhs2(struct mmc_host *host)
return err;
}
+
+static void sd_uhs2_abort_trans(struct mmc_host *mmc)
+{
+ struct mmc_request mrq = {};
+ struct mmc_command cmd = {0};
+ struct uhs2_command uhs2_cmd = {};
+ int err;
+
+ mrq.cmd = &cmd;
+ mmc->ongoing_mrq = &mrq;
+
+ uhs2_cmd.header = UHS2_NATIVE_PACKET | UHS2_PACKET_TYPE_CCMD |
+ mmc->card->uhs2_config.node_id;
+ uhs2_cmd.arg = ((UHS2_DEV_CMD_TRANS_ABORT & 0xFF) << 8) |
+ UHS2_NATIVE_CMD_WRITE |
+ (UHS2_DEV_CMD_TRANS_ABORT >> 8);
+
+ sd_uhs2_cmd_assemble(&cmd, &uhs2_cmd, 0, 0);
+ err = mmc_wait_for_cmd(mmc, &cmd, 0);
+
+ if (err)
+ pr_err("%s: %s: UHS2 CMD send fail, err= 0x%x!\n",
+ mmc_hostname(mmc), __func__, err);
+}
+
+static void sd_uhs2_abort_status_read(struct mmc_host *mmc)
+{
+ struct mmc_request mrq = {};
+ struct mmc_command cmd = {0};
+ struct uhs2_command uhs2_cmd = {};
+ int err;
+
+ mrq.cmd = &cmd;
+ mmc->ongoing_mrq = &mrq;
+
+ uhs2_cmd.header = UHS2_NATIVE_PACKET |
+ UHS2_PACKET_TYPE_CCMD |
+ mmc->card->uhs2_config.node_id;
+ uhs2_cmd.arg = ((UHS2_DEV_STATUS_REG & 0xFF) << 8) |
+ UHS2_NATIVE_CMD_READ |
+ UHS2_NATIVE_CMD_PLEN_4B |
+ (UHS2_DEV_STATUS_REG >> 8);
+
+ sd_uhs2_cmd_assemble(&cmd, &uhs2_cmd, 0, 0);
+ err = mmc_wait_for_cmd(mmc, &cmd, 0);
+
+ if (err)
+ pr_err("%s: %s: UHS2 CMD send fail, err= 0x%x!\n",
+ mmc_hostname(mmc), __func__, err);
+}
+
+void mmc_sd_uhs2_error_recovery(struct mmc_host *mmc, struct mmc_request *mrq)
+{
+ mmc->ops->uhs2_reset_cmd_data(mmc);
+
+ if (mrq->data) {
+ if (mrq->data->error && mmc_card_uhs2(mmc)) {
+ if (mrq->cmd) {
+ switch (mrq->cmd->error) {
+ case ETIMEDOUT:
+ case EILSEQ:
+ case EIO:
+ sd_uhs2_abort_trans(mmc);
+ sd_uhs2_abort_status_read(mmc);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ } else {
+ if (mrq->cmd) {
+ switch (mrq->cmd->error) {
+ case ETIMEDOUT:
+ sd_uhs2_abort_trans(mmc);
+ break;
+ }
+ }
+ }
+}
diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h
index fc9520b3bfa4..c914a58f7e1e 100644
--- a/include/linux/mmc/host.h
+++ b/include/linux/mmc/host.h
@@ -271,6 +271,12 @@ struct mmc_host_ops {
* negative errno in case of a failure or zero for success.
*/
int (*uhs2_control)(struct mmc_host *host, enum sd_uhs2_operation op);
+
+ /*
+ * The uhs2_reset_cmd_data callback is used to excute reset
+ * when a auto command error occurs.
+ */
+ void (*uhs2_reset_cmd_data)(struct mmc_host *host);
};
struct mmc_cqe_ops {
--
2.25.1
next prev parent reply other threads:[~2024-05-22 11:09 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-05-22 11:08 [PATCH V16 00/23] Add support UHS-II for GL9755 and GL9767 Victor Shih
2024-05-22 11:08 ` [PATCH V16 01/23] mmc: core: Cleanup printing of speed mode at card insertion Victor Shih
2024-05-22 11:08 ` [PATCH V16 02/23] mmc: core: Prepare to support SD UHS-II cards Victor Shih
2024-05-22 11:08 ` [PATCH V16 03/23] mmc: core: Announce successful insertion of an SD UHS-II card Victor Shih
2024-05-22 11:08 ` [PATCH V16 04/23] mmc: core: Extend support for mmc regulators with a vqmmc2 Victor Shih
2024-05-22 11:08 ` [PATCH V16 05/23] mmc: core: Add definitions for SD UHS-II cards Victor Shih
2024-05-22 11:08 ` [PATCH V16 06/23] mmc: core: Add New function to re-factoring the code Victor Shih
2024-05-22 11:08 ` [PATCH V16 07/23] mmc: core: Support UHS-II card control and access Victor Shih
2024-05-22 11:08 ` Victor Shih [this message]
2024-05-24 6:54 ` [PATCH V16 08/23] mmc: core: Support UHS-II Auto Command Error Recovery Adrian Hunter
2024-05-31 10:31 ` Victor Shih
2024-05-31 11:23 ` Adrian Hunter
2024-06-09 18:40 ` Victor Shih
2024-06-17 5:04 ` Adrian Hunter
2024-06-18 10:47 ` Victor Shih
2024-06-18 11:13 ` Adrian Hunter
2024-06-20 10:39 ` Victor Shih
2024-05-22 11:08 ` [PATCH V16 09/23] mmc: sdhci: add UHS-II related definitions in headers Victor Shih
2024-05-22 11:08 ` [PATCH V16 10/23] mmc: sdhci: add UHS-II module and add a kernel configuration Victor Shih
2024-05-22 11:08 ` [PATCH V16 11/23] mmc: sdhci-uhs2: dump UHS-II registers Victor Shih
2024-05-22 11:08 ` [PATCH V16 12/23] mmc: sdhci-uhs2: add reset function function Victor Shih
2024-05-24 7:23 ` Adrian Hunter
2024-05-31 10:32 ` Victor Shih
2024-05-31 11:25 ` Adrian Hunter
2024-06-20 10:39 ` Victor Shih
2024-05-22 11:08 ` [PATCH V16 13/23] mmc: sdhci-uhs2: add set_power() to support vdd2 Victor Shih
2024-05-22 11:09 ` [PATCH V16 14/23] mmc: sdhci-uhs2: add set_timeout() Victor Shih
2024-05-22 11:09 ` [PATCH V16 15/23] mmc: sdhci-uhs2: add set_ios() Victor Shih
2024-05-22 11:09 ` [PATCH V16 16/23] mmc: sdhci-uhs2: add uhs2_control() to initialise the interface Victor Shih
2024-05-22 11:09 ` [PATCH V16 17/23] mmc: sdhci-uhs2: add request() and others Victor Shih
2024-05-22 11:09 ` [PATCH V16 18/23] mmc: sdhci-uhs2: add irq() " Victor Shih
2024-05-22 11:09 ` [PATCH V16 19/23] mmc: sdhci-uhs2: add add_host() and others to set up the driver Victor Shih
2024-05-22 11:09 ` [PATCH V16 20/23] mmc: sdhci-uhs2: add pre-detect_init hook Victor Shih
2024-05-22 11:09 ` [PATCH V16 21/23] mmc: sdhci-pci: add UHS-II support framework Victor Shih
2024-05-22 11:09 ` [PATCH V16 22/23] mmc: sdhci-pci-gli: enable UHS-II mode for GL9755 Victor Shih
2024-05-22 11:09 ` [PATCH V16 23/23] mmc: sdhci-pci-gli: enable UHS-II mode for GL9767 Victor Shih
2024-05-23 17:08 ` Adrian Hunter
2024-06-20 10:39 ` Victor Shih
2024-05-23 17:09 ` Adrian Hunter
2024-06-20 10:39 ` Victor Shih
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240522110909.10060-9-victorshihgli@gmail.com \
--to=victorshihgli@gmail.com \
--cc=Greg.tu@genesyslogic.com.tw \
--cc=HL.Liu@genesyslogic.com.tw \
--cc=adrian.hunter@intel.com \
--cc=ben.chuang@genesyslogic.com.tw \
--cc=benchuanggli@gmail.com \
--cc=dlunev@chromium.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mmc@vger.kernel.org \
--cc=takahiro.akashi@linaro.org \
--cc=ulf.hansson@linaro.org \
--cc=victor.shih@genesyslogic.com.tw \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox