Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 16 Dec 2012 11:16:14 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r244287 - projects/calloutng/sys/x86/isa
Message-ID:  <201212161116.qBGBGEwn063983@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201212161116.qBGBGEwn063983>