From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jaehoon Chung Date: Mon, 14 Nov 2016 21:04:50 +0900 Subject: [U-Boot] [PATCH 1/4] mmc: Retry the switch command In-Reply-To: <9f1e3f62-e336-96a9-f08d-3e8eacf275f0@redhat.com> References: <7cc8b7905b6b69d6a9e5db49059fc39d44a1caf0.1478272627.git-series.maxime.ripard@free-electrons.com> <9f1e3f62-e336-96a9-f08d-3e8eacf275f0@redhat.com> Message-ID: <8a9e5f13-546d-e09d-5648-d333338bffdd@samsung.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de On 11/14/2016 03:50 AM, Hans de Goede wrote: > Hi, > > On 04-11-16 16:18, Maxime Ripard wrote: >> Some eMMC will fail at the first switch, but would succeed in a subsequent >> one. >> >> Make sure we try several times to cover those cases. The number of retries >> (and the behaviour) is currently what is being used in Linux. >> >> Signed-off-by: Maxime Ripard > > LGTM: > > Reviewed-by: Hans de Goede > > Pantelis or Tom, can you pick this up please ? Applied on u-boot-mmc. Thanks! Best Regards, Jaehoon Chung > > Regards, > > Hans > > >> --- >> drivers/mmc/mmc.c | 15 +++++++++++---- >> 1 file changed, 11 insertions(+), 4 deletions(-) >> >> diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c >> index 4380c7c195a6..d6b7e4f510c9 100644 >> --- a/drivers/mmc/mmc.c >> +++ b/drivers/mmc/mmc.c >> @@ -494,6 +494,7 @@ int mmc_switch(struct mmc *mmc, u8 set, u8 index, u8 value) >> { >> struct mmc_cmd cmd; >> int timeout = 1000; >> + int retries = 3; >> int ret; >> >> cmd.cmdidx = MMC_CMD_SWITCH; >> @@ -502,11 +503,17 @@ int mmc_switch(struct mmc *mmc, u8 set, u8 index, u8 value) >> (index << 16) | >> (value << 8); >> >> - ret = mmc_send_cmd(mmc, &cmd, NULL); >> + while (retries > 0) { >> + ret = mmc_send_cmd(mmc, &cmd, NULL); >> >> - /* Waiting for the ready status */ >> - if (!ret) >> - ret = mmc_send_status(mmc, timeout); >> + /* Waiting for the ready status */ >> + if (!ret) { >> + ret = mmc_send_status(mmc, timeout); >> + return ret; >> + } >> + >> + retries--; >> + } >> >> return ret; >> >> > > >