+ Adrian On Fri, 18 Jun 2021 at 10:23, Wolfram Sang <wsa+renesas@xxxxxxxxxxxxxxxxxxxx> wrote: > > When we use the alive callback, we expect a command to fail if the card > is not present. We should not trigger a retune then which will confuse > users with a failed retune on a removed card: > > mmc2: tuning execution failed: -5 > mmc2: card 0001 removed > > Disable retuning in this code path. > > Reported-by: Ulrich Hecht <uli+renesas@xxxxxxxx> > Signed-off-by: Wolfram Sang <wsa+renesas@xxxxxxxxxxxxxxxxxxxx> > --- > drivers/mmc/core/core.c | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c > index 54f0814f110c..eb792dd845a3 100644 > --- a/drivers/mmc/core/core.c > +++ b/drivers/mmc/core/core.c > @@ -2088,6 +2088,9 @@ int _mmc_detect_card_removed(struct mmc_host *host) > if (!host->card || mmc_card_removed(host->card)) > return 1; > > + /* we expect a failure if the card is removed */ > + mmc_retune_disable(host); > + Some controllers require a retune after it has been runtime suspended. In the above path, when called via the bus_ops->detect() callback, it could be that the controller may have been runtime suspended and then got resumed by the call to mmc_get_card(). I think we need something more clever here, to make sure we don't end up in that situation. I have looped in Adrian, to see if has some ideas for how this can be fixed. > ret = host->bus_ops->alive(host); > > /* > @@ -2107,6 +2110,8 @@ int _mmc_detect_card_removed(struct mmc_host *host) > pr_debug("%s: card remove detected\n", mmc_hostname(host)); > } > > + mmc_retune_enable(host); > + > return ret; > } > > -- > 2.30.2 > Kind regards Uffe