Commit dfd247c1 authored by John W. Linville's avatar John W. Linville Committed by Linus Torvalds

[PATCH] i810_audio: offset LVI from CIV to avoid stalled start

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: default avatarHerbert Xu <herbert@gondor.apana.org.au>
Acked-by: default avatarThomas Voegtle <tv@lio96.de>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent e37bc39e
...@@ -1196,10 +1196,20 @@ static void __i810_update_lvi(struct i810_state *state, int rec) ...@@ -1196,10 +1196,20 @@ static void __i810_update_lvi(struct i810_state *state, int rec)
if (count < fragsize) if (count < fragsize)
return; 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->enable && dmabuf->ready) {
if (!(dmabuf->trigger & trigger)) if (!(dmabuf->trigger & trigger))
return; return;
CIV_TO_LVI(state->card, port, 1);
start(state); start(state);
while (!(I810_IOREADB(state->card, port + OFF_CR) & ((1<<4) | (1<<2)))) while (!(I810_IOREADB(state->card, port + OFF_CR) & ((1<<4) | (1<<2))))
; ;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment