diff options
author | joerg <joerg@FreeBSD.org> | 1996-07-21 08:20:51 +0000 |
---|---|---|
committer | joerg <joerg@FreeBSD.org> | 1996-07-21 08:20:51 +0000 |
commit | cc3250aa71545430de9fb5259f6fc809b22665a4 (patch) | |
tree | 6e30c3a9d9a1b96452be3e55f3296da271b4a384 | |
parent | bcad0209e6c4cfa426c601e93ccdcdd5cb52ceef (diff) | |
download | FreeBSD-src-cc3250aa71545430de9fb5259f6fc809b22665a4.zip FreeBSD-src-cc3250aa71545430de9fb5259f6fc809b22665a4.tar.gz |
Post-commit review by Bruce. Mostly stylistic changes.
Submitted by: bde
-rw-r--r-- | sys/amd64/amd64/tsc.c | 107 | ||||
-rw-r--r-- | sys/amd64/isa/clock.c | 107 | ||||
-rw-r--r-- | sys/i386/i386/tsc.c | 107 | ||||
-rw-r--r-- | sys/i386/isa/clock.c | 107 | ||||
-rw-r--r-- | sys/isa/atrtc.c | 107 |
5 files changed, 280 insertions, 255 deletions
diff --git a/sys/amd64/amd64/tsc.c b/sys/amd64/amd64/tsc.c index 87658c3..58678a6 100644 --- a/sys/amd64/amd64/tsc.c +++ b/sys/amd64/amd64/tsc.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * from: @(#)clock.c 7.2 (Berkeley) 5/12/91 - * $Id: clock.c,v 1.63 1996/07/17 11:26:05 bde Exp $ + * $Id: clock.c,v 1.64 1996/07/20 18:47:23 joerg Exp $ */ /* @@ -88,7 +88,7 @@ #define TIMER0_LATCH_COUNT 20 /* - * Maximal frequency that we are willing to allow for timer0. Must be + * Maximum frequency that we are willing to allow for timer0. Must be * low enough to guarantee that the timer interrupt handler returns * before the next timer interrupt. Must result in a lower TIMER_DIV * value than TIMER0_LATCH_COUNT so that we don't have to worry about @@ -110,6 +110,11 @@ unsigned long i586_avg_tick; #endif int statclock_disable; u_int stat_imask = SWI_CLOCK_MASK; +#ifdef TIMER_FREQ +u_int timer_freq = TIMER_FREQ; +#else +u_int timer_freq = 1193182; +#endif int timer0_max_count; u_int timer0_overflow_threshold; u_int timer0_prescaler_count; @@ -128,17 +133,12 @@ static void (*new_function) __P((struct clockframe *frame)); static u_int new_rate; static u_char rtc_statusa = RTCSA_DIVIDER | RTCSA_NOPROF; static u_char rtc_statusb = RTCSB_24HR | RTCSB_PINTR; -#ifdef TIMER_FREQ -static u_int timer_freq = TIMER_FREQ; -#else -static u_int timer_freq = 1193182; -#endif /* Values for timerX_state: */ -#define RELEASED 0 -#define RELEASE_PENDING 1 -#define ACQUIRED 2 -#define ACQUIRE_PENDING 3 +#define RELEASED 0 +#define RELEASE_PENDING 1 +#define ACQUIRED 2 +#define ACQUIRE_PENDING 3 static u_char timer0_state; static u_char timer2_state; @@ -149,9 +149,11 @@ clkintr(struct clockframe frame) { timer_func(&frame); switch (timer0_state) { + case RELEASED: setdelayed(); break; + case ACQUIRED: if ((timer0_prescaler_count += timer0_max_count) >= hardclock_max_count) { @@ -160,6 +162,7 @@ clkintr(struct clockframe frame) timer0_prescaler_count -= hardclock_max_count; } break; + case ACQUIRE_PENDING: setdelayed(); timer0_max_count = TIMER_DIV(new_rate); @@ -174,6 +177,7 @@ clkintr(struct clockframe frame) timer_func = new_function; timer0_state = ACQUIRED; break; + case RELEASE_PENDING: if ((timer0_prescaler_count += timer0_max_count) >= hardclock_max_count) { @@ -205,7 +209,7 @@ clkintr(struct clockframe frame) } /* - * The following functions must be called at ipl >= splclock. + * The acquire and release functions must be called at ipl >= splclock(). */ int acquire_timer0(int rate, void (*function) __P((struct clockframe *frame))) @@ -214,26 +218,26 @@ acquire_timer0(int rate, void (*function) __P((struct clockframe *frame))) if (rate <= 0 || rate > TIMER0_MAX_FREQ) return (-1); - switch (timer0_state) { - case RELEASED: - timer0_state = ACQUIRE_PENDING; - break; - - case RELEASE_PENDING: - if (rate != old_rate) - return (-1); - /* - * The timer has been released recently, but is - * re-acquired before the release got complete. In - * this case, we simply reclaim it as if it had not - * been released at all. - */ - timer0_state = ACQUIRED; - break; - - default: - return (-1); /* busy */ + + case RELEASED: + timer0_state = ACQUIRE_PENDING; + break; + + case RELEASE_PENDING: + if (rate != old_rate) + return (-1); + /* + * The timer has been released recently, but is being + * re-acquired before the release completed. In this + * case, we simply reclaim it as if it had not been + * released at all. + */ + timer0_state = ACQUIRED; + break; + + default: + return (-1); /* busy */ } new_function = function; old_rate = new_rate = rate; @@ -243,15 +247,20 @@ acquire_timer0(int rate, void (*function) __P((struct clockframe *frame))) int acquire_timer2(int mode) { - u_long eflags; if (timer2_state != RELEASED) return (-1); timer2_state = ACQUIRED; - eflags = read_eflags(); - disable_intr(); - outb(TIMER_MODE, TIMER_SEL2 | (mode &0x3f)); - write_eflags(eflags); + + /* + * This access to the timer registers is as atomic as possible + * because it is a single instruction. We could do better if we + * knew the rate. Use of splclock() limits glitches to 10-100us, + * and this is probably good enough for timer2, so we aren't as + * careful with it as with timer0. + */ + outb(TIMER_MODE, TIMER_SEL2 | (mode & 0x3f)); + return (0); } @@ -259,17 +268,18 @@ int release_timer0() { switch (timer0_state) { - case ACQUIRED: - timer0_state = RELEASE_PENDING; - break; - case ACQUIRE_PENDING: - /* Nothing happened yet, release quickly. */ - timer0_state = RELEASED; - break; + case ACQUIRED: + timer0_state = RELEASE_PENDING; + break; + + case ACQUIRE_PENDING: + /* Nothing happened yet, release quickly. */ + timer0_state = RELEASED; + break; - default: - return (-1); + default: + return (-1); } return (0); } @@ -277,16 +287,11 @@ release_timer0() int release_timer2() { - u_long eflags; if (timer2_state != ACQUIRED) return (-1); timer2_state = RELEASED; - eflags = read_eflags(); - disable_intr(); - outb(TIMER_MODE, TIMER_SEL2|TIMER_SQWAVE|TIMER_16BIT); - write_eflags(eflags); - enable_intr(); + outb(TIMER_MODE, TIMER_SEL2 | TIMER_SQWAVE | TIMER_16BIT); return (0); } diff --git a/sys/amd64/isa/clock.c b/sys/amd64/isa/clock.c index 87658c3..58678a6 100644 --- a/sys/amd64/isa/clock.c +++ b/sys/amd64/isa/clock.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * from: @(#)clock.c 7.2 (Berkeley) 5/12/91 - * $Id: clock.c,v 1.63 1996/07/17 11:26:05 bde Exp $ + * $Id: clock.c,v 1.64 1996/07/20 18:47:23 joerg Exp $ */ /* @@ -88,7 +88,7 @@ #define TIMER0_LATCH_COUNT 20 /* - * Maximal frequency that we are willing to allow for timer0. Must be + * Maximum frequency that we are willing to allow for timer0. Must be * low enough to guarantee that the timer interrupt handler returns * before the next timer interrupt. Must result in a lower TIMER_DIV * value than TIMER0_LATCH_COUNT so that we don't have to worry about @@ -110,6 +110,11 @@ unsigned long i586_avg_tick; #endif int statclock_disable; u_int stat_imask = SWI_CLOCK_MASK; +#ifdef TIMER_FREQ +u_int timer_freq = TIMER_FREQ; +#else +u_int timer_freq = 1193182; +#endif int timer0_max_count; u_int timer0_overflow_threshold; u_int timer0_prescaler_count; @@ -128,17 +133,12 @@ static void (*new_function) __P((struct clockframe *frame)); static u_int new_rate; static u_char rtc_statusa = RTCSA_DIVIDER | RTCSA_NOPROF; static u_char rtc_statusb = RTCSB_24HR | RTCSB_PINTR; -#ifdef TIMER_FREQ -static u_int timer_freq = TIMER_FREQ; -#else -static u_int timer_freq = 1193182; -#endif /* Values for timerX_state: */ -#define RELEASED 0 -#define RELEASE_PENDING 1 -#define ACQUIRED 2 -#define ACQUIRE_PENDING 3 +#define RELEASED 0 +#define RELEASE_PENDING 1 +#define ACQUIRED 2 +#define ACQUIRE_PENDING 3 static u_char timer0_state; static u_char timer2_state; @@ -149,9 +149,11 @@ clkintr(struct clockframe frame) { timer_func(&frame); switch (timer0_state) { + case RELEASED: setdelayed(); break; + case ACQUIRED: if ((timer0_prescaler_count += timer0_max_count) >= hardclock_max_count) { @@ -160,6 +162,7 @@ clkintr(struct clockframe frame) timer0_prescaler_count -= hardclock_max_count; } break; + case ACQUIRE_PENDING: setdelayed(); timer0_max_count = TIMER_DIV(new_rate); @@ -174,6 +177,7 @@ clkintr(struct clockframe frame) timer_func = new_function; timer0_state = ACQUIRED; break; + case RELEASE_PENDING: if ((timer0_prescaler_count += timer0_max_count) >= hardclock_max_count) { @@ -205,7 +209,7 @@ clkintr(struct clockframe frame) } /* - * The following functions must be called at ipl >= splclock. + * The acquire and release functions must be called at ipl >= splclock(). */ int acquire_timer0(int rate, void (*function) __P((struct clockframe *frame))) @@ -214,26 +218,26 @@ acquire_timer0(int rate, void (*function) __P((struct clockframe *frame))) if (rate <= 0 || rate > TIMER0_MAX_FREQ) return (-1); - switch (timer0_state) { - case RELEASED: - timer0_state = ACQUIRE_PENDING; - break; - - case RELEASE_PENDING: - if (rate != old_rate) - return (-1); - /* - * The timer has been released recently, but is - * re-acquired before the release got complete. In - * this case, we simply reclaim it as if it had not - * been released at all. - */ - timer0_state = ACQUIRED; - break; - - default: - return (-1); /* busy */ + + case RELEASED: + timer0_state = ACQUIRE_PENDING; + break; + + case RELEASE_PENDING: + if (rate != old_rate) + return (-1); + /* + * The timer has been released recently, but is being + * re-acquired before the release completed. In this + * case, we simply reclaim it as if it had not been + * released at all. + */ + timer0_state = ACQUIRED; + break; + + default: + return (-1); /* busy */ } new_function = function; old_rate = new_rate = rate; @@ -243,15 +247,20 @@ acquire_timer0(int rate, void (*function) __P((struct clockframe *frame))) int acquire_timer2(int mode) { - u_long eflags; if (timer2_state != RELEASED) return (-1); timer2_state = ACQUIRED; - eflags = read_eflags(); - disable_intr(); - outb(TIMER_MODE, TIMER_SEL2 | (mode &0x3f)); - write_eflags(eflags); + + /* + * This access to the timer registers is as atomic as possible + * because it is a single instruction. We could do better if we + * knew the rate. Use of splclock() limits glitches to 10-100us, + * and this is probably good enough for timer2, so we aren't as + * careful with it as with timer0. + */ + outb(TIMER_MODE, TIMER_SEL2 | (mode & 0x3f)); + return (0); } @@ -259,17 +268,18 @@ int release_timer0() { switch (timer0_state) { - case ACQUIRED: - timer0_state = RELEASE_PENDING; - break; - case ACQUIRE_PENDING: - /* Nothing happened yet, release quickly. */ - timer0_state = RELEASED; - break; + case ACQUIRED: + timer0_state = RELEASE_PENDING; + break; + + case ACQUIRE_PENDING: + /* Nothing happened yet, release quickly. */ + timer0_state = RELEASED; + break; - default: - return (-1); + default: + return (-1); } return (0); } @@ -277,16 +287,11 @@ release_timer0() int release_timer2() { - u_long eflags; if (timer2_state != ACQUIRED) return (-1); timer2_state = RELEASED; - eflags = read_eflags(); - disable_intr(); - outb(TIMER_MODE, TIMER_SEL2|TIMER_SQWAVE|TIMER_16BIT); - write_eflags(eflags); - enable_intr(); + outb(TIMER_MODE, TIMER_SEL2 | TIMER_SQWAVE | TIMER_16BIT); return (0); } diff --git a/sys/i386/i386/tsc.c b/sys/i386/i386/tsc.c index 87658c3..58678a6 100644 --- a/sys/i386/i386/tsc.c +++ b/sys/i386/i386/tsc.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * from: @(#)clock.c 7.2 (Berkeley) 5/12/91 - * $Id: clock.c,v 1.63 1996/07/17 11:26:05 bde Exp $ + * $Id: clock.c,v 1.64 1996/07/20 18:47:23 joerg Exp $ */ /* @@ -88,7 +88,7 @@ #define TIMER0_LATCH_COUNT 20 /* - * Maximal frequency that we are willing to allow for timer0. Must be + * Maximum frequency that we are willing to allow for timer0. Must be * low enough to guarantee that the timer interrupt handler returns * before the next timer interrupt. Must result in a lower TIMER_DIV * value than TIMER0_LATCH_COUNT so that we don't have to worry about @@ -110,6 +110,11 @@ unsigned long i586_avg_tick; #endif int statclock_disable; u_int stat_imask = SWI_CLOCK_MASK; +#ifdef TIMER_FREQ +u_int timer_freq = TIMER_FREQ; +#else +u_int timer_freq = 1193182; +#endif int timer0_max_count; u_int timer0_overflow_threshold; u_int timer0_prescaler_count; @@ -128,17 +133,12 @@ static void (*new_function) __P((struct clockframe *frame)); static u_int new_rate; static u_char rtc_statusa = RTCSA_DIVIDER | RTCSA_NOPROF; static u_char rtc_statusb = RTCSB_24HR | RTCSB_PINTR; -#ifdef TIMER_FREQ -static u_int timer_freq = TIMER_FREQ; -#else -static u_int timer_freq = 1193182; -#endif /* Values for timerX_state: */ -#define RELEASED 0 -#define RELEASE_PENDING 1 -#define ACQUIRED 2 -#define ACQUIRE_PENDING 3 +#define RELEASED 0 +#define RELEASE_PENDING 1 +#define ACQUIRED 2 +#define ACQUIRE_PENDING 3 static u_char timer0_state; static u_char timer2_state; @@ -149,9 +149,11 @@ clkintr(struct clockframe frame) { timer_func(&frame); switch (timer0_state) { + case RELEASED: setdelayed(); break; + case ACQUIRED: if ((timer0_prescaler_count += timer0_max_count) >= hardclock_max_count) { @@ -160,6 +162,7 @@ clkintr(struct clockframe frame) timer0_prescaler_count -= hardclock_max_count; } break; + case ACQUIRE_PENDING: setdelayed(); timer0_max_count = TIMER_DIV(new_rate); @@ -174,6 +177,7 @@ clkintr(struct clockframe frame) timer_func = new_function; timer0_state = ACQUIRED; break; + case RELEASE_PENDING: if ((timer0_prescaler_count += timer0_max_count) >= hardclock_max_count) { @@ -205,7 +209,7 @@ clkintr(struct clockframe frame) } /* - * The following functions must be called at ipl >= splclock. + * The acquire and release functions must be called at ipl >= splclock(). */ int acquire_timer0(int rate, void (*function) __P((struct clockframe *frame))) @@ -214,26 +218,26 @@ acquire_timer0(int rate, void (*function) __P((struct clockframe *frame))) if (rate <= 0 || rate > TIMER0_MAX_FREQ) return (-1); - switch (timer0_state) { - case RELEASED: - timer0_state = ACQUIRE_PENDING; - break; - - case RELEASE_PENDING: - if (rate != old_rate) - return (-1); - /* - * The timer has been released recently, but is - * re-acquired before the release got complete. In - * this case, we simply reclaim it as if it had not - * been released at all. - */ - timer0_state = ACQUIRED; - break; - - default: - return (-1); /* busy */ + + case RELEASED: + timer0_state = ACQUIRE_PENDING; + break; + + case RELEASE_PENDING: + if (rate != old_rate) + return (-1); + /* + * The timer has been released recently, but is being + * re-acquired before the release completed. In this + * case, we simply reclaim it as if it had not been + * released at all. + */ + timer0_state = ACQUIRED; + break; + + default: + return (-1); /* busy */ } new_function = function; old_rate = new_rate = rate; @@ -243,15 +247,20 @@ acquire_timer0(int rate, void (*function) __P((struct clockframe *frame))) int acquire_timer2(int mode) { - u_long eflags; if (timer2_state != RELEASED) return (-1); timer2_state = ACQUIRED; - eflags = read_eflags(); - disable_intr(); - outb(TIMER_MODE, TIMER_SEL2 | (mode &0x3f)); - write_eflags(eflags); + + /* + * This access to the timer registers is as atomic as possible + * because it is a single instruction. We could do better if we + * knew the rate. Use of splclock() limits glitches to 10-100us, + * and this is probably good enough for timer2, so we aren't as + * careful with it as with timer0. + */ + outb(TIMER_MODE, TIMER_SEL2 | (mode & 0x3f)); + return (0); } @@ -259,17 +268,18 @@ int release_timer0() { switch (timer0_state) { - case ACQUIRED: - timer0_state = RELEASE_PENDING; - break; - case ACQUIRE_PENDING: - /* Nothing happened yet, release quickly. */ - timer0_state = RELEASED; - break; + case ACQUIRED: + timer0_state = RELEASE_PENDING; + break; + + case ACQUIRE_PENDING: + /* Nothing happened yet, release quickly. */ + timer0_state = RELEASED; + break; - default: - return (-1); + default: + return (-1); } return (0); } @@ -277,16 +287,11 @@ release_timer0() int release_timer2() { - u_long eflags; if (timer2_state != ACQUIRED) return (-1); timer2_state = RELEASED; - eflags = read_eflags(); - disable_intr(); - outb(TIMER_MODE, TIMER_SEL2|TIMER_SQWAVE|TIMER_16BIT); - write_eflags(eflags); - enable_intr(); + outb(TIMER_MODE, TIMER_SEL2 | TIMER_SQWAVE | TIMER_16BIT); return (0); } diff --git a/sys/i386/isa/clock.c b/sys/i386/isa/clock.c index 87658c3..58678a6 100644 --- a/sys/i386/isa/clock.c +++ b/sys/i386/isa/clock.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * from: @(#)clock.c 7.2 (Berkeley) 5/12/91 - * $Id: clock.c,v 1.63 1996/07/17 11:26:05 bde Exp $ + * $Id: clock.c,v 1.64 1996/07/20 18:47:23 joerg Exp $ */ /* @@ -88,7 +88,7 @@ #define TIMER0_LATCH_COUNT 20 /* - * Maximal frequency that we are willing to allow for timer0. Must be + * Maximum frequency that we are willing to allow for timer0. Must be * low enough to guarantee that the timer interrupt handler returns * before the next timer interrupt. Must result in a lower TIMER_DIV * value than TIMER0_LATCH_COUNT so that we don't have to worry about @@ -110,6 +110,11 @@ unsigned long i586_avg_tick; #endif int statclock_disable; u_int stat_imask = SWI_CLOCK_MASK; +#ifdef TIMER_FREQ +u_int timer_freq = TIMER_FREQ; +#else +u_int timer_freq = 1193182; +#endif int timer0_max_count; u_int timer0_overflow_threshold; u_int timer0_prescaler_count; @@ -128,17 +133,12 @@ static void (*new_function) __P((struct clockframe *frame)); static u_int new_rate; static u_char rtc_statusa = RTCSA_DIVIDER | RTCSA_NOPROF; static u_char rtc_statusb = RTCSB_24HR | RTCSB_PINTR; -#ifdef TIMER_FREQ -static u_int timer_freq = TIMER_FREQ; -#else -static u_int timer_freq = 1193182; -#endif /* Values for timerX_state: */ -#define RELEASED 0 -#define RELEASE_PENDING 1 -#define ACQUIRED 2 -#define ACQUIRE_PENDING 3 +#define RELEASED 0 +#define RELEASE_PENDING 1 +#define ACQUIRED 2 +#define ACQUIRE_PENDING 3 static u_char timer0_state; static u_char timer2_state; @@ -149,9 +149,11 @@ clkintr(struct clockframe frame) { timer_func(&frame); switch (timer0_state) { + case RELEASED: setdelayed(); break; + case ACQUIRED: if ((timer0_prescaler_count += timer0_max_count) >= hardclock_max_count) { @@ -160,6 +162,7 @@ clkintr(struct clockframe frame) timer0_prescaler_count -= hardclock_max_count; } break; + case ACQUIRE_PENDING: setdelayed(); timer0_max_count = TIMER_DIV(new_rate); @@ -174,6 +177,7 @@ clkintr(struct clockframe frame) timer_func = new_function; timer0_state = ACQUIRED; break; + case RELEASE_PENDING: if ((timer0_prescaler_count += timer0_max_count) >= hardclock_max_count) { @@ -205,7 +209,7 @@ clkintr(struct clockframe frame) } /* - * The following functions must be called at ipl >= splclock. + * The acquire and release functions must be called at ipl >= splclock(). */ int acquire_timer0(int rate, void (*function) __P((struct clockframe *frame))) @@ -214,26 +218,26 @@ acquire_timer0(int rate, void (*function) __P((struct clockframe *frame))) if (rate <= 0 || rate > TIMER0_MAX_FREQ) return (-1); - switch (timer0_state) { - case RELEASED: - timer0_state = ACQUIRE_PENDING; - break; - - case RELEASE_PENDING: - if (rate != old_rate) - return (-1); - /* - * The timer has been released recently, but is - * re-acquired before the release got complete. In - * this case, we simply reclaim it as if it had not - * been released at all. - */ - timer0_state = ACQUIRED; - break; - - default: - return (-1); /* busy */ + + case RELEASED: + timer0_state = ACQUIRE_PENDING; + break; + + case RELEASE_PENDING: + if (rate != old_rate) + return (-1); + /* + * The timer has been released recently, but is being + * re-acquired before the release completed. In this + * case, we simply reclaim it as if it had not been + * released at all. + */ + timer0_state = ACQUIRED; + break; + + default: + return (-1); /* busy */ } new_function = function; old_rate = new_rate = rate; @@ -243,15 +247,20 @@ acquire_timer0(int rate, void (*function) __P((struct clockframe *frame))) int acquire_timer2(int mode) { - u_long eflags; if (timer2_state != RELEASED) return (-1); timer2_state = ACQUIRED; - eflags = read_eflags(); - disable_intr(); - outb(TIMER_MODE, TIMER_SEL2 | (mode &0x3f)); - write_eflags(eflags); + + /* + * This access to the timer registers is as atomic as possible + * because it is a single instruction. We could do better if we + * knew the rate. Use of splclock() limits glitches to 10-100us, + * and this is probably good enough for timer2, so we aren't as + * careful with it as with timer0. + */ + outb(TIMER_MODE, TIMER_SEL2 | (mode & 0x3f)); + return (0); } @@ -259,17 +268,18 @@ int release_timer0() { switch (timer0_state) { - case ACQUIRED: - timer0_state = RELEASE_PENDING; - break; - case ACQUIRE_PENDING: - /* Nothing happened yet, release quickly. */ - timer0_state = RELEASED; - break; + case ACQUIRED: + timer0_state = RELEASE_PENDING; + break; + + case ACQUIRE_PENDING: + /* Nothing happened yet, release quickly. */ + timer0_state = RELEASED; + break; - default: - return (-1); + default: + return (-1); } return (0); } @@ -277,16 +287,11 @@ release_timer0() int release_timer2() { - u_long eflags; if (timer2_state != ACQUIRED) return (-1); timer2_state = RELEASED; - eflags = read_eflags(); - disable_intr(); - outb(TIMER_MODE, TIMER_SEL2|TIMER_SQWAVE|TIMER_16BIT); - write_eflags(eflags); - enable_intr(); + outb(TIMER_MODE, TIMER_SEL2 | TIMER_SQWAVE | TIMER_16BIT); return (0); } diff --git a/sys/isa/atrtc.c b/sys/isa/atrtc.c index 87658c3..58678a6 100644 --- a/sys/isa/atrtc.c +++ b/sys/isa/atrtc.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * from: @(#)clock.c 7.2 (Berkeley) 5/12/91 - * $Id: clock.c,v 1.63 1996/07/17 11:26:05 bde Exp $ + * $Id: clock.c,v 1.64 1996/07/20 18:47:23 joerg Exp $ */ /* @@ -88,7 +88,7 @@ #define TIMER0_LATCH_COUNT 20 /* - * Maximal frequency that we are willing to allow for timer0. Must be + * Maximum frequency that we are willing to allow for timer0. Must be * low enough to guarantee that the timer interrupt handler returns * before the next timer interrupt. Must result in a lower TIMER_DIV * value than TIMER0_LATCH_COUNT so that we don't have to worry about @@ -110,6 +110,11 @@ unsigned long i586_avg_tick; #endif int statclock_disable; u_int stat_imask = SWI_CLOCK_MASK; +#ifdef TIMER_FREQ +u_int timer_freq = TIMER_FREQ; +#else +u_int timer_freq = 1193182; +#endif int timer0_max_count; u_int timer0_overflow_threshold; u_int timer0_prescaler_count; @@ -128,17 +133,12 @@ static void (*new_function) __P((struct clockframe *frame)); static u_int new_rate; static u_char rtc_statusa = RTCSA_DIVIDER | RTCSA_NOPROF; static u_char rtc_statusb = RTCSB_24HR | RTCSB_PINTR; -#ifdef TIMER_FREQ -static u_int timer_freq = TIMER_FREQ; -#else -static u_int timer_freq = 1193182; -#endif /* Values for timerX_state: */ -#define RELEASED 0 -#define RELEASE_PENDING 1 -#define ACQUIRED 2 -#define ACQUIRE_PENDING 3 +#define RELEASED 0 +#define RELEASE_PENDING 1 +#define ACQUIRED 2 +#define ACQUIRE_PENDING 3 static u_char timer0_state; static u_char timer2_state; @@ -149,9 +149,11 @@ clkintr(struct clockframe frame) { timer_func(&frame); switch (timer0_state) { + case RELEASED: setdelayed(); break; + case ACQUIRED: if ((timer0_prescaler_count += timer0_max_count) >= hardclock_max_count) { @@ -160,6 +162,7 @@ clkintr(struct clockframe frame) timer0_prescaler_count -= hardclock_max_count; } break; + case ACQUIRE_PENDING: setdelayed(); timer0_max_count = TIMER_DIV(new_rate); @@ -174,6 +177,7 @@ clkintr(struct clockframe frame) timer_func = new_function; timer0_state = ACQUIRED; break; + case RELEASE_PENDING: if ((timer0_prescaler_count += timer0_max_count) >= hardclock_max_count) { @@ -205,7 +209,7 @@ clkintr(struct clockframe frame) } /* - * The following functions must be called at ipl >= splclock. + * The acquire and release functions must be called at ipl >= splclock(). */ int acquire_timer0(int rate, void (*function) __P((struct clockframe *frame))) @@ -214,26 +218,26 @@ acquire_timer0(int rate, void (*function) __P((struct clockframe *frame))) if (rate <= 0 || rate > TIMER0_MAX_FREQ) return (-1); - switch (timer0_state) { - case RELEASED: - timer0_state = ACQUIRE_PENDING; - break; - - case RELEASE_PENDING: - if (rate != old_rate) - return (-1); - /* - * The timer has been released recently, but is - * re-acquired before the release got complete. In - * this case, we simply reclaim it as if it had not - * been released at all. - */ - timer0_state = ACQUIRED; - break; - - default: - return (-1); /* busy */ + + case RELEASED: + timer0_state = ACQUIRE_PENDING; + break; + + case RELEASE_PENDING: + if (rate != old_rate) + return (-1); + /* + * The timer has been released recently, but is being + * re-acquired before the release completed. In this + * case, we simply reclaim it as if it had not been + * released at all. + */ + timer0_state = ACQUIRED; + break; + + default: + return (-1); /* busy */ } new_function = function; old_rate = new_rate = rate; @@ -243,15 +247,20 @@ acquire_timer0(int rate, void (*function) __P((struct clockframe *frame))) int acquire_timer2(int mode) { - u_long eflags; if (timer2_state != RELEASED) return (-1); timer2_state = ACQUIRED; - eflags = read_eflags(); - disable_intr(); - outb(TIMER_MODE, TIMER_SEL2 | (mode &0x3f)); - write_eflags(eflags); + + /* + * This access to the timer registers is as atomic as possible + * because it is a single instruction. We could do better if we + * knew the rate. Use of splclock() limits glitches to 10-100us, + * and this is probably good enough for timer2, so we aren't as + * careful with it as with timer0. + */ + outb(TIMER_MODE, TIMER_SEL2 | (mode & 0x3f)); + return (0); } @@ -259,17 +268,18 @@ int release_timer0() { switch (timer0_state) { - case ACQUIRED: - timer0_state = RELEASE_PENDING; - break; - case ACQUIRE_PENDING: - /* Nothing happened yet, release quickly. */ - timer0_state = RELEASED; - break; + case ACQUIRED: + timer0_state = RELEASE_PENDING; + break; + + case ACQUIRE_PENDING: + /* Nothing happened yet, release quickly. */ + timer0_state = RELEASED; + break; - default: - return (-1); + default: + return (-1); } return (0); } @@ -277,16 +287,11 @@ release_timer0() int release_timer2() { - u_long eflags; if (timer2_state != ACQUIRED) return (-1); timer2_state = RELEASED; - eflags = read_eflags(); - disable_intr(); - outb(TIMER_MODE, TIMER_SEL2|TIMER_SQWAVE|TIMER_16BIT); - write_eflags(eflags); - enable_intr(); + outb(TIMER_MODE, TIMER_SEL2 | TIMER_SQWAVE | TIMER_16BIT); return (0); } |