Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 27 Jun 2002 15:19:47 -0600
From:      Scott Long <scott_long@btc.adaptec.com>
To:        freebsd-multimedia@freebsd.org, cg@freebsd.org, orion@freebsd.org
Subject:   ICH calibration under 5-CURRENT
Message-ID:  <20020627211947.GA18048@hollin.btc.adaptec.com>

next in thread | raw e-mail | index | archive | help

--h31gzZEtNLTqOjlF
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

All,

I noticed that with my ICH3/CS4205 sound setup, if I load the ich
driver at boot or compile it into the kernel, it incorrectly
sets the ac97 sample rate.  However, if I load the driver *after*
boot, it's correct.  This is due to ich_calibrate() running
before the system clock is itslef calibrated.  I see that there are
a few hacks and sysctl's for dealing with this, but the attached
patch should settle this issue.  It puts ich_calibrate() into a
config_intrhook, forcing it to run after the system clock is
calibrated.  If there are no objections, I'd like to commit it
to 5-CURRENT.  I haven't looked into 4-STABLE, so comments there
are welcome also.

Scott


--h31gzZEtNLTqOjlF
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="ich.patch"

Index: ich.c
===================================================================
RCS file: /usr/ncvs/src/sys/dev/sound/pci/ich.c,v
retrieving revision 1.21
diff -u -r1.21 ich.c
--- ich.c	5 May 2002 15:37:09 -0000	1.21
+++ ich.c	27 Jun 2002 21:07:13 -0000
@@ -85,6 +85,7 @@
 	struct sc_chinfo ch[3];
 	int ac97rate;
 	struct ich_desc *dtbl;
+	struct intr_config_hook	intrhook;
 };
 
 /* -------------------------------------------------------------------- */
@@ -455,13 +456,19 @@
 /* Calibrate card (some boards are overclocked and need scaling) */
 
 static
-unsigned int ich_calibrate(struct sc_info *sc)
+void ich_calibrate(void *arg)
 {
-	struct sc_chinfo *ch = &sc->ch[1];
+	struct sc_info *sc;
+	struct sc_chinfo *ch;
 	struct timeval t1, t2;
 	u_int8_t ociv, nciv;
 	u_int32_t wait_us, actual_48k_rate, bytes;
 
+	sc = (struct sc_info *)arg;
+	ch = &sc->ch[1];
+
+	config_intrhook_disestablish(&sc->intrhook);
+
 	/*
 	 * Grab audio from input for fixed interval and compare how
 	 * much we actually get with what we expect.  Interval needs
@@ -516,7 +523,7 @@
 
 	if (nciv == ociv) {
 		device_printf(sc->dev, "ac97 link rate calibration timed out after %d us\n", wait_us);
-		return 0;
+		return;
 	}
 
 	actual_48k_rate = (bytes * 250000) / wait_us;
@@ -534,7 +541,7 @@
 	 	printf("\n");
 	}
 
-	return sc->ac97rate;
+	return;
 }
 
 /* -------------------------------------------------------------------- */
@@ -708,7 +715,13 @@
 	pcm_setstatus(dev, status);
 
 	ich_initsys(sc);
-	ich_calibrate(sc);
+
+	sc->intrhook.ich_func = ich_calibrate;
+	sc->intrhook.ich_arg = sc;
+	if (config_intrhook_establish(&sc->intrhook) != 0) {
+		device_printf(dev, "Cannot establish calibration hook, will calibrate now\n");
+		ich_calibrate(sc);
+	}
 
 	return 0;
 

--h31gzZEtNLTqOjlF--

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-multimedia" in the body of the message




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