From: Stephen Warren Date: Thu, 5 Dec 2013 19:08:09 +0000 (-0700) Subject: time: fix usec_to_tick() X-Git-Tag: v2014.01-rc2~28 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=2cd1b57220697ac47e4a63fb6a0a79eda2217f9d;p=oweals%2Fu-boot.git time: fix usec_to_tick() Commit 8dfafdde88eb ("Introduce common timer functions") created a common definition of usec_to_tick() which had a couple problems: static unsigned long long usec_to_tick(unsigned long usec) { uint64_t tick = usec * get_tbclk(); That likely overflows. usec *= get_tbclk(); That was an attempt to fix it by performing the multiply after the promotion of usec to 64-bit, but was applied to the wrong variable, which was never used. This patch fixes these issues. A user-visible symptom of the problem was the e.g. "dhcp zImage" using an ASIX USB Ethernet dongle would print: Waiting for Ethernet connection... unable to connect. ... with no delay before "unable to connect". There are likely other symptoms. Signed-off-by: Stephen Warren Acked-by: Rob Herring --- diff --git a/lib/time.c b/lib/time.c index 09bb05a24d..8085aa40d1 100644 --- a/lib/time.c +++ b/lib/time.c @@ -71,8 +71,8 @@ unsigned long __weak notrace timer_get_us(void) } static unsigned long long usec_to_tick(unsigned long usec) { - uint64_t tick = usec * get_tbclk(); - usec *= get_tbclk(); + uint64_t tick = usec; + tick *= get_tbclk(); do_div(tick, 1000000); return tick; }