diff mbox

sdhci: do not program timer when tuning_count is zero

Message ID 1383821960-2533-1-git-send-email-arend@broadcom.com (mailing list archive)
State New, archived
Headers show

Commit Message

Arend van Spriel Nov. 7, 2013, 10:59 a.m. UTC
When the host->tuning_count is zero it means that the
retuning is disabled. Doing a mod_timer() with a zero
tuning_count does something else.

Signed-off-by: Arend van Spriel <arend@broadcom.com>
---
 drivers/mmc/host/sdhci.c |    3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

Comments

Aaron Lu Nov. 8, 2013, 6:50 a.m. UTC | #1
On 11/07/2013 06:59 PM, Arend van Spriel wrote:
> When the host->tuning_count is zero it means that the

If the tuning_count is zero, then the retuning timer shouldn't be
started in the first place and not possible to run code there. Or is the
tuning_count dynamically changed?

Thanks,
Aaron

> retuning is disabled. Doing a mod_timer() with a zero
> tuning_count does something else.
> 
> Signed-off-by: Arend van Spriel <arend@broadcom.com>
> ---
>  drivers/mmc/host/sdhci.c |    3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
> index 7a7fb4f..9803e7a 100644
> --- a/drivers/mmc/host/sdhci.c
> +++ b/drivers/mmc/host/sdhci.c
> @@ -2007,7 +2007,8 @@ out:
>  	} else {
>  		host->flags &= ~SDHCI_NEEDS_RETUNING;
>  		/* Reload the new initial value for timer */
> -		if (host->tuning_mode == SDHCI_TUNING_MODE_1)
> +		if (host->tuning_count &&
> +		    host->tuning_mode == SDHCI_TUNING_MODE_1)
>  			mod_timer(&host->tuning_timer, jiffies +
>  				host->tuning_count * HZ);
>  	}
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Arend van Spriel Nov. 8, 2013, 9:10 a.m. UTC | #2
On 11/08/2013 07:50 AM, Aaron Lu wrote:
> On 11/07/2013 06:59 PM, Arend van Spriel wrote:
>> When the host->tuning_count is zero it means that the
>
> If the tuning_count is zero, then the retuning timer shouldn't be
> started in the first place and not possible to run code there. Or is the
> tuning_count dynamically changed?

Actually, the sdhci_execute_tuning() must run once to do the initial 
tuning procedure. This is mandatory for SDR104. However, *re*tuning is 
not and a zero tuning_count disables it.

The function is executed initially. The 'if' statement above the patched 
'else' statement is actually responsible for programming the retuning 
timer for the first time. However, it requires tuning_count to be 
non-zero. The 'else' statement is actually for reloading the retuning 
timer, which is not the case. Adding the non-zero check assures the 
retuning timer is never started.

I guess the fact that this needs explaining indicates that the commit 
message should be updated. I will send a V2 for this.

Regards,
Arend

> Thanks,
> Aaron
>
>> retuning is disabled. Doing a mod_timer() with a zero
>> tuning_count does something else.
>>
>> Signed-off-by: Arend van Spriel <arend@broadcom.com>
>> ---
>>   drivers/mmc/host/sdhci.c |    3 ++-
>>   1 file changed, 2 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
>> index 7a7fb4f..9803e7a 100644
>> --- a/drivers/mmc/host/sdhci.c
>> +++ b/drivers/mmc/host/sdhci.c
>> @@ -2007,7 +2007,8 @@ out:
>>   	} else {
>>   		host->flags &= ~SDHCI_NEEDS_RETUNING;
>>   		/* Reload the new initial value for timer */
>> -		if (host->tuning_mode == SDHCI_TUNING_MODE_1)
>> +		if (host->tuning_count &&
>> +		    host->tuning_mode == SDHCI_TUNING_MODE_1)
>>   			mod_timer(&host->tuning_timer, jiffies +
>>   				host->tuning_count * HZ);
>>   	}
>>
>
>


--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Aaron Lu Nov. 8, 2013, 11:49 a.m. UTC | #3
On 11/08/2013 05:10 PM, Arend van Spriel wrote:
> On 11/08/2013 07:50 AM, Aaron Lu wrote:
>> On 11/07/2013 06:59 PM, Arend van Spriel wrote:
>>> When the host->tuning_count is zero it means that the
>>
>> If the tuning_count is zero, then the retuning timer shouldn't be
>> started in the first place and not possible to run code there. Or is the
>> tuning_count dynamically changed?
> 
> Actually, the sdhci_execute_tuning() must run once to do the initial 
> tuning procedure. This is mandatory for SDR104. However, *re*tuning is 
> not and a zero tuning_count disables it.

So the host in question doesn't need do retuning while in SDR104 mode?
It seems your host's retuning mode is mode_1.

> 
> The function is executed initially. The 'if' statement above the patched 
> 'else' statement is actually responsible for programming the retuning 
> timer for the first time. However, it requires tuning_count to be 
> non-zero. The 'else' statement is actually for reloading the retuning 
> timer, which is not the case. Adding the non-zero check assures the 
> retuning timer is never started.

OK, I see.
The SDHCI_USING_RETUNING_TIMER flag is supposed to mean if the host is
currently using retuning timer to do retuning, it could also be used to
decide if retuning timer needs be re-programmed.

Anyway, a host in retuning mode 1 does not have tuning_count set seems a
little odd to me...

Thanks,
Aaron

> 
> I guess the fact that this needs explaining indicates that the commit 
> message should be updated. I will send a V2 for this.
> 
> Regards,
> Arend
> 
>> Thanks,
>> Aaron
>>
>>> retuning is disabled. Doing a mod_timer() with a zero
>>> tuning_count does something else.
>>>
>>> Signed-off-by: Arend van Spriel <arend@broadcom.com>
>>> ---
>>>   drivers/mmc/host/sdhci.c |    3 ++-
>>>   1 file changed, 2 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
>>> index 7a7fb4f..9803e7a 100644
>>> --- a/drivers/mmc/host/sdhci.c
>>> +++ b/drivers/mmc/host/sdhci.c
>>> @@ -2007,7 +2007,8 @@ out:
>>>   	} else {
>>>   		host->flags &= ~SDHCI_NEEDS_RETUNING;
>>>   		/* Reload the new initial value for timer */
>>> -		if (host->tuning_mode == SDHCI_TUNING_MODE_1)
>>> +		if (host->tuning_count &&
>>> +		    host->tuning_mode == SDHCI_TUNING_MODE_1)
>>>   			mod_timer(&host->tuning_timer, jiffies +
>>>   				host->tuning_count * HZ);
>>>   	}
>>>
>>
>>
> 
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Arend van Spriel Nov. 8, 2013, 11:55 a.m. UTC | #4
On 11/08/2013 12:49 PM, Aaron Lu wrote:
> On 11/08/2013 05:10 PM, Arend van Spriel wrote:
>> On 11/08/2013 07:50 AM, Aaron Lu wrote:
>>> On 11/07/2013 06:59 PM, Arend van Spriel wrote:
>>>> When the host->tuning_count is zero it means that the
>>>
>>> If the tuning_count is zero, then the retuning timer shouldn't be
>>> started in the first place and not possible to run code there. Or is the
>>> tuning_count dynamically changed?
>>
>> Actually, the sdhci_execute_tuning() must run once to do the initial
>> tuning procedure. This is mandatory for SDR104. However, *re*tuning is
>> not and a zero tuning_count disables it.
>
> So the host in question doesn't need do retuning while in SDR104 mode?
> It seems your host's retuning mode is mode_1.
>
>>
>> The function is executed initially. The 'if' statement above the patched
>> 'else' statement is actually responsible for programming the retuning
>> timer for the first time. However, it requires tuning_count to be
>> non-zero. The 'else' statement is actually for reloading the retuning
>> timer, which is not the case. Adding the non-zero check assures the
>> retuning timer is never started.
>
> OK, I see.
> The SDHCI_USING_RETUNING_TIMER flag is supposed to mean if the host is
> currently using retuning timer to do retuning, it could also be used to
> decide if retuning timer needs be re-programmed.

True. I can go for that approach.

> Anyway, a host in retuning mode 1 does not have tuning_count set seems a
> little odd to me...

Looking at sdhci.h it actually seems sdhci code is missing support for 
the other modes:

	unsigned int		tuning_count;	/* Timer count for re-tuning */
	unsigned int		tuning_mode;	/* Re-tuning mode supported by host */
#define SDHCI_TUNING_MODE_1	0
	struct timer_list	tuning_timer;	/* Timer for tuning */

At least the other modes are not defined here.

Regards,
Arend

> Thanks,
> Aaron
>
>>
>> I guess the fact that this needs explaining indicates that the commit
>> message should be updated. I will send a V2 for this.
>>
>> Regards,
>> Arend
>>
>>> Thanks,
>>> Aaron
>>>
>>>> retuning is disabled. Doing a mod_timer() with a zero
>>>> tuning_count does something else.
>>>>
>>>> Signed-off-by: Arend van Spriel <arend@broadcom.com>
>>>> ---
>>>>    drivers/mmc/host/sdhci.c |    3 ++-
>>>>    1 file changed, 2 insertions(+), 1 deletion(-)
>>>>
>>>> diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
>>>> index 7a7fb4f..9803e7a 100644
>>>> --- a/drivers/mmc/host/sdhci.c
>>>> +++ b/drivers/mmc/host/sdhci.c
>>>> @@ -2007,7 +2007,8 @@ out:
>>>>    	} else {
>>>>    		host->flags &= ~SDHCI_NEEDS_RETUNING;
>>>>    		/* Reload the new initial value for timer */
>>>> -		if (host->tuning_mode == SDHCI_TUNING_MODE_1)
>>>> +		if (host->tuning_count &&
>>>> +		    host->tuning_mode == SDHCI_TUNING_MODE_1)
>>>>    			mod_timer(&host->tuning_timer, jiffies +
>>>>    				host->tuning_count * HZ);
>>>>    	}
>>>>
>>>
>>>
>>
>>
>
>


--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Aaron Lu Nov. 8, 2013, 1:19 p.m. UTC | #5
On 11/08/2013 07:55 PM, Arend van Spriel wrote:
> On 11/08/2013 12:49 PM, Aaron Lu wrote:
>> On 11/08/2013 05:10 PM, Arend van Spriel wrote:
>>> On 11/08/2013 07:50 AM, Aaron Lu wrote:
>>>> On 11/07/2013 06:59 PM, Arend van Spriel wrote:
>>>>> When the host->tuning_count is zero it means that the
>>>>
>>>> If the tuning_count is zero, then the retuning timer shouldn't be
>>>> started in the first place and not possible to run code there. Or is the
>>>> tuning_count dynamically changed?
>>>
>>> Actually, the sdhci_execute_tuning() must run once to do the initial
>>> tuning procedure. This is mandatory for SDR104. However, *re*tuning is
>>> not and a zero tuning_count disables it.
>>
>> So the host in question doesn't need do retuning while in SDR104 mode?
>> It seems your host's retuning mode is mode_1.
>>
>>>
>>> The function is executed initially. The 'if' statement above the patched
>>> 'else' statement is actually responsible for programming the retuning
>>> timer for the first time. However, it requires tuning_count to be
>>> non-zero. The 'else' statement is actually for reloading the retuning
>>> timer, which is not the case. Adding the non-zero check assures the
>>> retuning timer is never started.
>>
>> OK, I see.
>> The SDHCI_USING_RETUNING_TIMER flag is supposed to mean if the host is
>> currently using retuning timer to do retuning, it could also be used to
>> decide if retuning timer needs be re-programmed.
> 
> True. I can go for that approach.
> 
>> Anyway, a host in retuning mode 1 does not have tuning_count set seems a
>> little odd to me...
> 
> Looking at sdhci.h it actually seems sdhci code is missing support for 
> the other modes:
> 
> 	unsigned int		tuning_count;	/* Timer count for re-tuning */
> 	unsigned int		tuning_mode;	/* Re-tuning mode supported by host */
> #define SDHCI_TUNING_MODE_1	0
> 	struct timer_list	tuning_timer;	/* Timer for tuning */
> 
> At least the other modes are not defined here.

Right, only retuning mode 1 is implemented currently.

Thanks,
Aaron

> 
> Regards,
> Arend
> 
>> Thanks,
>> Aaron
>>
>>>
>>> I guess the fact that this needs explaining indicates that the commit
>>> message should be updated. I will send a V2 for this.
>>>
>>> Regards,
>>> Arend
>>>
>>>> Thanks,
>>>> Aaron
>>>>
>>>>> retuning is disabled. Doing a mod_timer() with a zero
>>>>> tuning_count does something else.
>>>>>
>>>>> Signed-off-by: Arend van Spriel <arend@broadcom.com>
>>>>> ---
>>>>>    drivers/mmc/host/sdhci.c |    3 ++-
>>>>>    1 file changed, 2 insertions(+), 1 deletion(-)
>>>>>
>>>>> diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
>>>>> index 7a7fb4f..9803e7a 100644
>>>>> --- a/drivers/mmc/host/sdhci.c
>>>>> +++ b/drivers/mmc/host/sdhci.c
>>>>> @@ -2007,7 +2007,8 @@ out:
>>>>>    	} else {
>>>>>    		host->flags &= ~SDHCI_NEEDS_RETUNING;
>>>>>    		/* Reload the new initial value for timer */
>>>>> -		if (host->tuning_mode == SDHCI_TUNING_MODE_1)
>>>>> +		if (host->tuning_count &&
>>>>> +		    host->tuning_mode == SDHCI_TUNING_MODE_1)
>>>>>    			mod_timer(&host->tuning_timer, jiffies +
>>>>>    				host->tuning_count * HZ);
>>>>>    	}
>>>>>
>>>>
>>>>
>>>
>>>
>>
>>
> 
> 

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

Patch

diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index 7a7fb4f..9803e7a 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -2007,7 +2007,8 @@  out:
 	} else {
 		host->flags &= ~SDHCI_NEEDS_RETUNING;
 		/* Reload the new initial value for timer */
-		if (host->tuning_mode == SDHCI_TUNING_MODE_1)
+		if (host->tuning_count &&
+		    host->tuning_mode == SDHCI_TUNING_MODE_1)
 			mod_timer(&host->tuning_timer, jiffies +
 				host->tuning_count * HZ);
 	}