On Tue, 14 Apr 2020 at 05:40, Yong Mao <yong.mao@xxxxxxxxxxxx> wrote: > > From: yong mao <yong.mao@xxxxxxxxxxxx> > > When mmc_sdio_resned_if_cond is invoked, it indicates the SDIO > device is not in the right state. In this condition, the previous > implementation of mmc_sdio_resend_if_cond can't make sure SDIO > device be back to idle state. mmc_power_cycle can reset the SDIO > device by HW and also make sure SDIO device enter to idle state > correctly. > > Signed-off-by: Yong Mao <yong.mao@xxxxxxxxxxxx> > --- > drivers/mmc/core/sdio.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/drivers/mmc/core/sdio.c b/drivers/mmc/core/sdio.c > index ebb387a..ada0a80 100644 > --- a/drivers/mmc/core/sdio.c > +++ b/drivers/mmc/core/sdio.c > @@ -546,6 +546,7 @@ static int mmc_sdio_init_uhs_card(struct mmc_card *card) > static void mmc_sdio_resend_if_cond(struct mmc_host *host, > struct mmc_card *card) > { > + mmc_power_cycle(host, host->card->ocr); This looks wrong to me. mmc_sdio_resend_if_cond() is called from two places. 1. In the case when mmc_set_uhs_voltage() fails in mmc_sdio_init_card(), which means a call to mmc_power_cycle() has already been done. 2. Wen sdio_read_cccr() fails and when we decide to retry the UHS-I voltage switch. Then perhaps it could make sense to run a power cycle. But if so, we better do it only for that path. I will continue to look a bit, as I think there are really more issues that we may want to look into while looking at this piece of code. However, allow me some more time before I can provide some more ideas of how to move forward. > sdio_reset(host); > mmc_go_idle(host); > mmc_send_if_cond(host, host->ocr_avail); > -- > 1.9.1 Kind regards Uffe