Commit ef3d2322 authored by Adrian Hunter's avatar Adrian Hunter Committed by Ulf Hansson

mmc: mmc: Relax checking for switch errors after HS200 switch

The JEDEC specification indicates CMD13 can be used after a HS200 switch
to check for errors. However in practice some boards experience CRC errors
in the CMD13 response. Consequently, for HS200, CRC errors are not a
reliable way to know the switch failed. If there really is a problem, we
would expect tuning will fail and the result ends up the same. So change
the error condition to ignore CRC errors in that case.
Signed-off-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
Acked-by: default avatarJaehoon Chung <jh80.chung@samsung.com>
Reviewed-by: default avatarShawn Lin <shawn.lin@rock-chips.com>
Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
parent db52d4f8
...@@ -1240,7 +1240,12 @@ int mmc_hs400_to_hs200(struct mmc_card *card) ...@@ -1240,7 +1240,12 @@ int mmc_hs400_to_hs200(struct mmc_card *card)
mmc_set_timing(host, MMC_TIMING_MMC_HS200); mmc_set_timing(host, MMC_TIMING_MMC_HS200);
err = mmc_switch_status(card); /*
* For HS200, CRC errors are not a reliable way to know the switch
* failed. If there really is a problem, we would expect tuning will
* fail and the result ends up the same.
*/
err = __mmc_switch_status(card, false);
if (err) if (err)
goto out_err; goto out_err;
...@@ -1403,7 +1408,13 @@ static int mmc_select_hs200(struct mmc_card *card) ...@@ -1403,7 +1408,13 @@ static int mmc_select_hs200(struct mmc_card *card)
old_timing = host->ios.timing; old_timing = host->ios.timing;
mmc_set_timing(host, MMC_TIMING_MMC_HS200); mmc_set_timing(host, MMC_TIMING_MMC_HS200);
err = mmc_switch_status(card); /*
* For HS200, CRC errors are not a reliable way to know the
* switch failed. If there really is a problem, we would expect
* tuning will fail and the result ends up the same.
*/
err = __mmc_switch_status(card, false);
/* /*
* mmc_select_timing() assumes timing has not changed if * mmc_select_timing() assumes timing has not changed if
* it is a switch error. * it is a switch error.
......
...@@ -431,18 +431,25 @@ static int mmc_switch_status_error(struct mmc_host *host, u32 status) ...@@ -431,18 +431,25 @@ static int mmc_switch_status_error(struct mmc_host *host, u32 status)
} }
/* Caller must hold re-tuning */ /* Caller must hold re-tuning */
int mmc_switch_status(struct mmc_card *card) int __mmc_switch_status(struct mmc_card *card, bool crc_err_fatal)
{ {
u32 status; u32 status;
int err; int err;
err = mmc_send_status(card, &status); err = mmc_send_status(card, &status);
if (!crc_err_fatal && err == -EILSEQ)
return 0;
if (err) if (err)
return err; return err;
return mmc_switch_status_error(card->host, status); return mmc_switch_status_error(card->host, status);
} }
int mmc_switch_status(struct mmc_card *card)
{
return __mmc_switch_status(card, true);
}
static int mmc_poll_for_busy(struct mmc_card *card, unsigned int timeout_ms, static int mmc_poll_for_busy(struct mmc_card *card, unsigned int timeout_ms,
bool send_status, bool retry_crc_err) bool send_status, bool retry_crc_err)
{ {
......
...@@ -28,6 +28,7 @@ int mmc_bus_test(struct mmc_card *card, u8 bus_width); ...@@ -28,6 +28,7 @@ int mmc_bus_test(struct mmc_card *card, u8 bus_width);
int mmc_send_hpi_cmd(struct mmc_card *card, u32 *status); int mmc_send_hpi_cmd(struct mmc_card *card, u32 *status);
int mmc_can_ext_csd(struct mmc_card *card); int mmc_can_ext_csd(struct mmc_card *card);
int mmc_switch_status(struct mmc_card *card); int mmc_switch_status(struct mmc_card *card);
int __mmc_switch_status(struct mmc_card *card, bool crc_err_fatal);
int __mmc_switch(struct mmc_card *card, u8 set, u8 index, u8 value, int __mmc_switch(struct mmc_card *card, u8 set, u8 index, u8 value,
unsigned int timeout_ms, unsigned char timing, unsigned int timeout_ms, unsigned char timing,
bool use_busy_signal, bool send_status, bool retry_crc_err); bool use_busy_signal, bool send_status, bool retry_crc_err);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment