[U-Boot] [PATCH v2] mmc: omap: timeout counter fix

Reinhard Meyer u-boot at emk-elektronik.de
Tue Oct 26 08:01:46 CEST 2010


Dear Wolfgang Denk,
> Dear Reinhard Meyer,
>
> In message<4CC66A67.4000608 at emk-elektronik.de>  you wrote:
>>
>>> It fails in case the timer wraps around.
>>>
>>> Assume 32 bit counters, start time = 0xFFFFFFF0, delay = 0x20. It
>>> will compute end = 0x10, the while codition is immediately false, and
>>> you don't have any delay at all, which most probably generates a
>>> false error condition.
>>
>> I used and assumed a 64 bit counter, that will not wrap around while
>> our civilization still exists...
>
>
> The code is still wrong, and as a simple correct implementation exists
> there is no excuse for using such incorrect code.
>
> Please fix that!

Agreed here. People are invited to dig through u-boot and find all
those places.

>
>> If get_ticks() is only 32 bits worth, both methods will misbehave
>> at a 32 bit wrap over.
>
> No.
>
>>> 	start = time();
>>> 	while ((time() - start)<   delay)
>>> 		...
>>>
>>> This works much better (assuming unsigned arithmetics).
>>
>> True, provided the underlying timer is really 64 bits, otherwise
>> this fails, too...
 > You are wrong. Try for example this:
 >
 > --------------------- snip -------------------
 > #include <stdio.h>
 >
 > int main(void)
 > {
 > 	unsigned int time = 0xFFFFFFF0;
 > 	unsigned int delay = 0x20;
 > 	unsigned int start;

You are wrong here, because you take it out of context.
My "demo" is using the (declared as) 64 bit function get_ticks().
I mentioned above that this function MUST be truly returning 64
bits worth of (incrementing) value to make any version work.
If get_ticks() just returns a 32 bit counter value neither method will work
reliably. Just check all implementations that this function is implemented
correctly.


More information about the U-Boot mailing list