Re: [BUG] CMD52 sent as first command not CMD0

Nicolas Pitre
2011-02-07T00:55:56Z

On Sun, 6 Feb 2011, Philip Rakity wrote:

>
> On Feb 6, 2011, at 3:13 AM, Albert Herranz wrote:
>
> > Hi,
> >
> > On 02/06/2011 02:35 AM, Philip Rakity wrote:
> >>
> >> proposed solution: I cannot verify this fix until Monday.
> >> =====
> >>
> >> CMD52 is a reset for SDIO cards. CMD0 is not sufficient when
> >> the card is being re-initialized. Only send CMD52 if
> >> a) doing a reinitialize
> >> b) card is SDIO or SDIO_COMBO
> >>
> >> Signed-off-by: Philip Rakity <prakity@marvell.com>
> >> ---
> >> drivers/mmc/core/core.c | 7 ++++++-
> >> 1 files changed, 6 insertions(+), 1 deletions(-)
> >>
> >> diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
> >> index 30d4da4..f0ce6f6 100644
> >> --- a/drivers/mmc/core/core.c
> >> +++ b/drivers/mmc/core/core.c
> >> @@ -1521,7 +1521,12 @@ static int mmc_rescan_try_freq(struct mmc_host *host, unsigned freq)
> >> mmc_hostname(host), __func__, host->f_init);
> >> #endif
> >> mmc_power_up(host);
> >> - sdio_reset(host);
> >> +
> >> + /* reset sdio before CMD0 when card is being reinitialized */
> >> + if (host->card &&
> >> + (host->card->type == MMC_TYPE_SDIO ||
> >> + host->card->type == MMC_TYPE_SD_COMBO))
> >> + sdio_reset(host);
> >> mmc_go_idle(host);
> >> mmc_hwungate_clock(host);
> >>
> >
> > At least on the Nintendo Wii, a platform reset _does not_ reset the SDIO hardware, and there is no known way to power-off/power-on it.
> > So, in some cases like after a system reboot, we need to issue a CMD52 before a CMD0 (even if on that particular case host->card is NULL) to properly reset the Nintendo Wii SDIO-based Wireless LAN card from its previous state, otherwise the card is not detected.
> >
> > The proposed fix breaks this and makes the card unavailable after a system reboot.
> >
> > If you are concerned about unconditionally issuing a CMD52 then we can use a quirk to make sure that we always perform a SDIO reset at least for the Nintendo Wii.
>
> Would be happy with either a quirk or comment in the code. Comment seems easiest.
>
> /* sdhci_reset will generate CMD52 to reset card. SD/eMMC cards are ignore this */
>
> or something like that.

Indeed. If always issuing cmd52 doesn't bother other types of cards,
then I'd simply always send it without trying to be too smart. On some
other boards such as the SheevaPlug it is impossible to power off or
reset the card too.

Nicolas