Skip to content

Commit

Permalink
ALSA: ali5451: fix timeout handling in snd_ali_{codecs,timer}_ready()
Browse files Browse the repository at this point in the history
Modify loops in such way that the register value is checked also after
the timeout condition, just in case the heavy interrupt load etc. caused
the thread to sleep for the time period exceeding the timeout value.

While at it remove an extra ALI_STIMER read from snd_ali_stimer_ready().

Reported-by: Jack Byer <ojbyer@usa.net>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
  • Loading branch information
Bartlomiej Zolnierkiewicz authored and Takashi Iwai committed Aug 23, 2009
1 parent f065fab commit 70bdbd3
Showing 1 changed file with 12 additions and 6 deletions.
18 changes: 12 additions & 6 deletions sound/pci/ali5451/ali5451.c
Original file line number Diff line number Diff line change
Expand Up @@ -310,12 +310,16 @@ static int snd_ali_codec_ready(struct snd_ali *codec,
unsigned int res;

end_time = jiffies + msecs_to_jiffies(250);
do {

for (;;) {
res = snd_ali_5451_peek(codec,port);
if (!(res & 0x8000))
return 0;
if (!time_after_eq(end_time, jiffies))
break;
schedule_timeout_uninterruptible(1);
} while (time_after_eq(end_time, jiffies));
}

snd_ali_5451_poke(codec, port, res & ~0x8000);
snd_printdd("ali_codec_ready: codec is not ready.\n ");
return -EIO;
Expand All @@ -327,15 +331,17 @@ static int snd_ali_stimer_ready(struct snd_ali *codec)
unsigned long dwChk1,dwChk2;

dwChk1 = snd_ali_5451_peek(codec, ALI_STIMER);
dwChk2 = snd_ali_5451_peek(codec, ALI_STIMER);

end_time = jiffies + msecs_to_jiffies(250);
do {

for (;;) {
dwChk2 = snd_ali_5451_peek(codec, ALI_STIMER);
if (dwChk2 != dwChk1)
return 0;
if (!time_after_eq(end_time, jiffies))
break;
schedule_timeout_uninterruptible(1);
} while (time_after_eq(end_time, jiffies));
}

snd_printk(KERN_ERR "ali_stimer_read: stimer is not ready.\n");
return -EIO;
}
Expand Down

0 comments on commit 70bdbd3

Please sign in to comment.