From 13e4ab6421ba80bd9dd150563575ac2ea5e8c6ac Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Fri, 4 Mar 2011 21:56:45 +0000 Subject: 2011-03-04 Joel Sherrill * timer/timer.c: Retry up to 5 times when the calibration loop fails. --- c/src/lib/libbsp/i386/pc386/ChangeLog | 4 ++++ c/src/lib/libbsp/i386/pc386/timer/timer.c | 31 +++++++++++++++++++++++-------- 2 files changed, 27 insertions(+), 8 deletions(-) (limited to 'c') diff --git a/c/src/lib/libbsp/i386/pc386/ChangeLog b/c/src/lib/libbsp/i386/pc386/ChangeLog index c49ddb8dd8..38e41a3606 100644 --- a/c/src/lib/libbsp/i386/pc386/ChangeLog +++ b/c/src/lib/libbsp/i386/pc386/ChangeLog @@ -1,3 +1,7 @@ +2011-03-04 Joel Sherrill + + * timer/timer.c: Retry up to 5 times when the calibration loop fails. + 2011-02-11 Ralf Corsépius * include/bsp.h, include/tm27.h: diff --git a/c/src/lib/libbsp/i386/pc386/timer/timer.c b/c/src/lib/libbsp/i386/pc386/timer/timer.c index f22f20ad94..a806fe6871 100644 --- a/c/src/lib/libbsp/i386/pc386/timer/timer.c +++ b/c/src/lib/libbsp/i386/pc386/timer/timer.c @@ -334,13 +334,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 */ @@ -384,8 +390,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; /* @@ -395,14 +404,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; -- cgit v1.2.3