Re: [PATCH] mmc: core: Restore parts of the polling policy when switch to HS/HS DDR

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Jan 13, 2017 at 12:05:03PM +0100, Ulf Hansson wrote:
> Regressions for not being able to detect an eMMC HS DDR mode card has been
> reported for the sdhci-esdhc-imx driver, but potentially other sdhci
> variants may suffer from the similar problem.
> 
> The commit e173f8911f09 ("mmc: core: Update CMD13 polling policy when
> switch to HS DDR mode"), is causing the problem. It seems that change moved
> one step to far, regarding changing the host's timing before polling for a
> busy card.
> 
> To fix this, let's move back to the behaviour when the host's timing is
> updated after the polling, but before the switch status is fetched and
> validated.
> 
> In cases when polling with CMD13, we keep validating the switch status at
> each attempt. However, to align with the other card busy detections
> mechanism, let's fetch and validate the switch status also after the host's
> timing is updated.
> 
> Reported-by: Clemens Gruber <clemens.gruber@xxxxxxxxxxxx>
> Reported-by: Gary Bisson <gary.bisson@xxxxxxxxxxxxxxxxxxx>
> Fixes: e173f8911f09 ("mmc: core: Update CMD13 polling policy when switch..")
> Cc: Shawn Lin <shawn.lin@xxxxxxxxxxxxxx>
> Cc: Dong Aisheng <aisheng.dong@xxxxxxx>
> Cc: Haibo Chen <haibo.chen@xxxxxxx>
> Signed-off-by: Ulf Hansson <ulf.hansson@xxxxxxxxxx>
> ---
>  drivers/mmc/core/mmc_ops.c | 25 ++++++++++++-------------
>  1 file changed, 12 insertions(+), 13 deletions(-)
> 
> diff --git a/drivers/mmc/core/mmc_ops.c b/drivers/mmc/core/mmc_ops.c
> index db2969f..fe80f26 100644
> --- a/drivers/mmc/core/mmc_ops.c
> +++ b/drivers/mmc/core/mmc_ops.c
> @@ -506,9 +506,6 @@ static int mmc_poll_for_busy(struct mmc_card *card, unsigned int timeout_ms,
>  		}
>  	} while (busy);
>  
> -	if (host->ops->card_busy && send_status)
> -		return mmc_switch_status(card);
> -
>  	return 0;
>  }
>  
> @@ -577,24 +574,26 @@ int __mmc_switch(struct mmc_card *card, u8 set, u8 index, u8 value,
>  	if (!use_busy_signal)
>  		goto out;
>  
> -	/* Switch to new timing before poll and check switch status. */
> -	if (timing)
> -		mmc_set_timing(host, timing);
> -
>  	/*If SPI or used HW busy detection above, then we don't need to poll. */
>  	if (((host->caps & MMC_CAP_WAIT_WHILE_BUSY) && use_r1b_resp) ||
> -		mmc_host_is_spi(host)) {
> -		if (send_status)
> -			err = mmc_switch_status(card);
> +		mmc_host_is_spi(host))
>  		goto out_tim;
> -	}
>  
>  	/* Let's try to poll to find out when the command is completed. */
>  	err = mmc_poll_for_busy(card, timeout_ms, send_status, retry_crc_err);
> +	if (err)
> +		goto out;
>  
>  out_tim:
> -	if (err && timing)
> -		mmc_set_timing(host, old_timing);
> +	/* Switch to new timing before check switch status. */
> +	if (timing)
> +		mmc_set_timing(host, timing);
> +
> +	if (send_status) {
> +		err = mmc_switch_status(card);
> +		if (err && timing)
> +			mmc_set_timing(host, old_timing);
> +	}
>  out:
>  	mmc_retune_release(host);
>  
> -- 
> 1.9.1
> 

Hi,

this patch fixes the boot problem on my i.MX6Q board!

Tested-by: Clemens Gruber <clemens.gruber@xxxxxxxxxxxx>

Thanks,
Clemens
--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux USB Devel]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux