svn commit: r244287 - projects/calloutng/sys/x86/isa
Alexander Motin
mav at FreeBSD.org
Sun Dec 16 11:16:14 UTC 2012
Author: mav
Date: Sun Dec 16 11:16:13 2012
New Revision: 244287
URL: http://svnweb.freebsd.org/changeset/base/244287
Log:
Mostly out of fun, teach i8254 eventtimer driver to program only LSB for
very short time intervals (<214us). This allows to get less then 22us
usleep(1) time from this anscient timer. It is even better then HPET time
now, just with much higher CPU usage.
Modified:
projects/calloutng/sys/x86/isa/clock.c
Modified: projects/calloutng/sys/x86/isa/clock.c
==============================================================================
--- projects/calloutng/sys/x86/isa/clock.c Sun Dec 16 10:12:40 2012 (r244286)
+++ projects/calloutng/sys/x86/isa/clock.c Sun Dec 16 11:16:13 2012 (r244287)
@@ -125,6 +125,7 @@ struct attimer_softc {
static struct attimer_softc *attimer_sc = NULL;
static int timer0_period = -2;
+static int timer0_last = 0xffff;
/* Values for timerX_state: */
#define RELEASED 0
@@ -433,11 +434,17 @@ set_i8254_freq(int mode, uint32_t period
outb(TIMER_CNTR0, new_count >> 8);
break;
case MODE_ONESHOT:
+ if (new_count < 256 && timer0_last < 256) {
+ outb(TIMER_MODE, TIMER_SEL0 | TIMER_INTTC | TIMER_LSB);
+ outb(TIMER_CNTR0, new_count & 0xff);
+ break;
+ }
outb(TIMER_MODE, TIMER_SEL0 | TIMER_INTTC | TIMER_16BIT);
outb(TIMER_CNTR0, new_count & 0xff);
outb(TIMER_CNTR0, new_count >> 8);
break;
}
+ timer0_last = new_count;
out:
mtx_unlock_spin(&clock_lock);
}
More information about the svn-src-projects
mailing list