From: Ivan Grokhotkov Date: Thu, 17 Aug 2017 16:25:17 +0000 (+0800) Subject: sdmmc: don't whitelist the opcodes when handling response timeout X-Git-Tag: v3.1-beta1~274^2~6 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5fc6fb58eabf5a5de0f12657517cfd5fd1b85365;p=esp-idf sdmmc: don't whitelist the opcodes when handling response timeout All the commands which do not have a response must have their flags set accordingly. Therefore the host will not send RTO interrupt if response is not expected. It is a bug in the code logic if it happens otherwise. --- diff --git a/components/driver/sdmmc_transaction.c b/components/driver/sdmmc_transaction.c index 78e3e28723..7039b74e72 100644 --- a/components/driver/sdmmc_transaction.c +++ b/components/driver/sdmmc_transaction.c @@ -287,18 +287,16 @@ static void process_command_response(uint32_t status, sdmmc_command_t* cmd) cmd->response[3] = 0; } } - - if ((status & SDMMC_INTMASK_RTO) && - cmd->opcode != MMC_ALL_SEND_CID && - cmd->opcode != MMC_SELECT_CARD && - cmd->opcode != MMC_STOP_TRANSMISSION) { + if (status & SDMMC_INTMASK_RTO) { + // response timeout is only possible when response is expected + assert(cmd->flags & SCF_RSP_PRESENT); cmd->error = ESP_ERR_TIMEOUT; } else if ((cmd->flags & SCF_RSP_CRC) && (status & SDMMC_INTMASK_RCRC)) { cmd->error = ESP_ERR_INVALID_CRC; } else if (status & SDMMC_INTMASK_RESP_ERR) { cmd->error = ESP_ERR_INVALID_RESPONSE; } - if (cmd->error != 0) { + if (cmd->error != ESP_OK) { if (cmd->data) { sdmmc_host_dma_stop(); }