
From: "John W. Linville" <linville@tuxdriver.com>

This fixes a "no sound" problem with Wolfenstein Enemy Territory and
(apparently) other games using the Quake3 engine.  It probably affects some
other OSS applications as well.

This recreates some code that had been removed from the i810_audio driver
around 5/2004.  (This is the 2.6-based version of this patch.)

Acked-by: Herbert Xu <herbert@gondor.apana.org.au>
Acked-by: Thomas Voegtle <tv@lio96.de>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 25-akpm/sound/oss/i810_audio.c |   10 ++++++++++
 1 files changed, 10 insertions(+)

diff -puN sound/oss/i810_audio.c~i810_audio-offset-lvi-from-civ-to-avoid-stalled-start sound/oss/i810_audio.c
--- 25/sound/oss/i810_audio.c~i810_audio-offset-lvi-from-civ-to-avoid-stalled-start	2005-01-22 18:51:24.994575608 -0800
+++ 25-akpm/sound/oss/i810_audio.c	2005-01-22 18:51:25.000574696 -0800
@@ -1196,10 +1196,20 @@ static void __i810_update_lvi(struct i81
 	if (count < fragsize)
 		return;
 
+	/* if we are currently stopped, then our CIV is actually set to our
+	 * *last* sg segment and we are ready to wrap to the next.  However,
+	 * if we set our LVI to the last sg segment, then it won't wrap to
+	 * the next sg segment, it won't even get a start.  So, instead, when
+	 * we are stopped, we set both the LVI value and also we increment
+	 * the CIV value to the next sg segment to be played so that when
+	 * we call start, things will operate properly
+	 */
 	if (!dmabuf->enable && dmabuf->ready) {
 		if (!(dmabuf->trigger & trigger))
 			return;
 
+		CIV_TO_LVI(state->card, port, 1);
+
 		start(state);
 		while (!(I810_IOREADB(state->card, port + OFF_CR) & ((1<<4) | (1<<2))))
 			;
_
