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

Philip Rakity
2011-02-06T20:50:43Z

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.
>
> Cheers,
> Albert