]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
mmc: mtk-sd: Add support for ignoring cmd response CRC
authorAndy-ld Lu <andy-ld.lu@mediatek.com>
Tue, 26 Nov 2024 12:48:23 +0000 (20:48 +0800)
committerUlf Hansson <ulf.hansson@linaro.org>
Tue, 10 Dec 2024 10:18:45 +0000 (11:18 +0100)
The current process flow does not handle MMC requests that are indicated
to ignore the command response CRC. For instance, cmd12 and cmd48 from
mmc_cqe_recovery() are marked to ignore CRC, but they are not matched to
the appropriate response type in msdc_cmd_find_resp(). As a result, they
are defaulted to 'MMC_RSP_NONE', which means no response is expected.

This commit applies the flag 'MMC_RSP_R1B_NO_CRC' to fix the response type
setting in msdc_cmd_find_resp() and adds the logic to ignore CRC in
msdc_cmd_done().

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Signed-off-by: Andy-ld Lu <andy-ld.lu@mediatek.com>
Message-ID: <20241126125041.16071-3-andy-ld.lu@mediatek.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/host/mtk-sd.c

index efb0d2d5716b966e08465ef267f419f0cc569c6d..e2c385853eef8224f0480e51ed2118586e94cf90 100644 (file)
@@ -1097,11 +1097,12 @@ static inline u32 msdc_cmd_find_resp(struct msdc_host *host,
        u32 resp;
 
        switch (mmc_resp_type(cmd)) {
-               /* Actually, R1, R5, R6, R7 are the same */
+       /* Actually, R1, R5, R6, R7 are the same */
        case MMC_RSP_R1:
                resp = 0x1;
                break;
        case MMC_RSP_R1B:
+       case MMC_RSP_R1B_NO_CRC:
                resp = 0x7;
                break;
        case MMC_RSP_R2:
@@ -1351,7 +1352,8 @@ static bool msdc_cmd_done(struct msdc_host *host, int events,
                         * CRC error.
                         */
                        msdc_reset_hw(host);
-               if (events & MSDC_INT_RSPCRCERR) {
+               if (events & MSDC_INT_RSPCRCERR &&
+                   mmc_resp_type(cmd) != MMC_RSP_R1B_NO_CRC) {
                        cmd->error = -EILSEQ;
                        host->error |= REQ_CMD_EIO;
                } else if (events & MSDC_INT_CMDTMO) {