From: Reinhard Meyer <u-boot@emk-elektronik.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v2] mmc: omap: timeout counter fix
Date: Tue, 26 Oct 2010 07:43:03 +0200 [thread overview]
Message-ID: <4CC66A67.4000608@emk-elektronik.de> (raw)
In-Reply-To: <20101026052856.3D467152451@gemini.denx.de>
Dear Wolfgang Denk,
> In message<4CC62B6C.30601@emk-elektronik.de> you wrote:
>>
>> In such cases I prefer to use:
>>
>> uint64_t etime;
>> ...
>> etime = get_ticks() + get_tbclk(); /* 1 second */
>> do {
>> whatever;
>> udelay (xx);
>> } while (condition&& get_ticks()<= etime);
>>
>> That is far more accurate than calling udelay() 100000 times.
>
> It may be more accuratre, but it may also be HORRIBLY WRONG!!
>
> Do NOT do that!! NEVER implement such a delay loop as
>
> end = time() + delay;
> while (time()< end)
> ...
>
> 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...
If get_ticks() is only 32 bits worth, both methods will misbehave
at a 32 bit wrap over.
>
>
> Correct implementation of a timeout like that should always look like
> that:
>
> 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...
Best would be to assign get_ticks() to a 32 bit unsigned and use
32 bit vars for start and delay as well.
The original udelay() implementation in AT91 would have failed
at a 32 bit wrap over, too (fixed in mainline). I hope other
implementations are done right, too...
Best regards,
Reinhard
next prev parent reply other threads:[~2010-10-26 5:43 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-10-26 1:02 [U-Boot] [PATCH v2] mmc: omap: timeout counter fix Nishanth Menon
2010-10-26 1:14 ` Reinhard Meyer
2010-10-26 1:18 ` Nishanth Menon
2010-10-26 5:29 ` Wolfgang Denk
2010-10-26 5:28 ` Wolfgang Denk
2010-10-26 5:34 ` Ghorai, Sukumar
2010-10-26 13:58 ` Nishanth Menon
2010-10-26 5:43 ` Reinhard Meyer [this message]
2010-10-26 5:48 ` Wolfgang Denk
2010-10-26 6:01 ` Reinhard Meyer
2010-10-26 7:00 ` [U-Boot] Timer implementations (was: Re: [PATCH v2] mmc: omap: timeout counter fix) Reinhard Meyer
2010-10-26 7:41 ` Wolfgang Denk
2010-10-26 7:57 ` [U-Boot] Timer implementations Reinhard Meyer
2010-10-26 9:33 ` Wolfgang Denk
2010-10-26 10:18 ` Reinhard Meyer
2010-10-26 13:05 ` Wolfgang Denk
2010-10-26 13:33 ` Reinhard Meyer
2010-10-26 21:19 ` J. William Campbell
2010-10-28 6:02 ` Reinhard Meyer
2010-11-01 13:47 ` J. William Campbell
2010-11-01 20:01 ` Reinhard Meyer
2010-11-01 20:15 ` Wolfgang Denk
2010-10-26 15:11 ` Nishanth Menon
2010-10-26 15:17 ` Wolfgang Denk
2010-10-26 15:22 ` Nishanth Menon
2010-10-26 16:26 ` Wolfgang Denk
2010-10-26 18:36 ` Reinhard Meyer
2010-10-26 7:03 ` [U-Boot] [PATCH v2] mmc: omap: timeout counter fix J. William Campbell
2010-10-26 7:36 ` Wolfgang Denk
2010-10-26 7:48 ` Reinhard Meyer
2010-10-26 4:36 ` Wolfgang Denk
2010-10-26 5:26 ` Ghorai, Sukumar
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4CC66A67.4000608@emk-elektronik.de \
--to=u-boot@emk-elektronik.de \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox