diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 2011-03-07 17:35:52 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 2011-03-07 17:35:52 +0000 |
commit | 46974aa75ce021be1964d5a264fde5a78059fdae (patch) | |
tree | 2793ea76b42583c58435b7ad72a1a350e011d35d /c | |
parent | 7869594e9725979994ad7b76ea4f3b2a90156b32 (diff) |
2011-03-07 Joel Sherrill <joel.sherrilL@OARcorp.com>
PR 1756/bsps
* timer/timer.c: Retry on timer calibration loop failure.
Diffstat (limited to 'c')
-rw-r--r-- | c/src/lib/libbsp/i386/pc386/ChangeLog | 5 | ||||
-rw-r--r-- | c/src/lib/libbsp/i386/pc386/timer/timer.c | 31 |
2 files changed, 28 insertions, 8 deletions
diff --git a/c/src/lib/libbsp/i386/pc386/ChangeLog b/c/src/lib/libbsp/i386/pc386/ChangeLog index bdc2672c28..7cc2102d4d 100644 --- a/c/src/lib/libbsp/i386/pc386/ChangeLog +++ b/c/src/lib/libbsp/i386/pc386/ChangeLog @@ -1,3 +1,8 @@ +2011-03-07 Joel Sherrill <joel.sherrilL@OARcorp.com> + + PR 1756/bsps + * timer/timer.c: Retry on timer calibration loop failure. + 2011-02-02 Ralf Corsépius <ralf.corsepius@rtems.org> * configure.ac: Require autoconf-2.68, automake-1.11.1. diff --git a/c/src/lib/libbsp/i386/pc386/timer/timer.c b/c/src/lib/libbsp/i386/pc386/timer/timer.c index ff3eb0040e..29a12119b4 100644 --- a/c/src/lib/libbsp/i386/pc386/timer/timer.c +++ b/c/src/lib/libbsp/i386/pc386/timer/timer.c @@ -333,13 +333,19 @@ Calibrate_loop_1ms(void) unsigned int targetClockBits, currentClockBits; unsigned int slowLoopGranularity, fastLoopGranularity; rtems_interrupt_level level; + int retries = 0; + rtems_interrupt_disable(level); + +retry: + if ( ++retries >= 5 ) { + printk( "Calibrate_loop_1ms: too many attempts. giving up!!\n" ); + while (1); + } #ifdef DEBUG_CALIBRATE printk("Calibrate_loop_1ms is starting, please wait (but not too long.)\n"); #endif targetClockBits = US_TO_TICK(1000); - - rtems_interrupt_disable(level); /* * Fill up the cache to get a correct offset */ @@ -383,8 +389,11 @@ Calibrate_loop_1ms(void) fastLoop (10000); res = readTimer0() - offset; if (res < emptyCall) { - printk("Problem #1 in offset computation in Calibrate_loop_1ms in file libbsp/i386/pc386/timer/timer.c\n"); - while (1); + printk( + "Problem #1 in offset computation in Calibrate_loop_1ms " + " in file libbsp/i386/pc386/timer/timer.c\n" + ); + goto retry; } fastLoopGranularity = (res - emptyCall) / 10000; /* @@ -394,14 +403,20 @@ Calibrate_loop_1ms(void) slowLoop(10); res = readTimer0(); if (res < offset + emptyCall) { - printk("Problem #2 in offset computation in Calibrate_loop_1ms in file libbsp/i386/pc386/timer/timer.c\n"); - while (1); + printk( + "Problem #2 in offset computation in Calibrate_loop_1ms " + " in file libbsp/i386/pc386/timer/timer.c\n" + ); + goto retry; } slowLoopGranularity = (res - offset - emptyCall)/ 10; if (slowLoopGranularity == 0) { - printk("Problem #3 in Calibrate_loop_1ms in file libbsp/i386/pc386/timer/timer.c\n"); - while (1); + printk( + "Problem #3 in offset computation in Calibrate_loop_1ms " + " in file libbsp/i386/pc386/timer/timer.c\n" + ); + goto retry; } targetClockBits += offset; |