ALSA: PCM - Don't check DMA time-out too shortly
When the PCM period size is set larger than 10 seconds, currently the PCM core may abort the operation with DMA-error due to the fixed timeout for 10 seconds. A similar problem is seen in the drain operation that has a fixed timeout of 10 seconds, too. This patch fixes the timeout length depending on the period size and rate, also including the consideration of no_period_wakeup flag. Reported-by: Raymond Yau <superquad.vortex2@gmail.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
@@ -1481,11 +1481,20 @@ static int snd_pcm_drain(struct snd_pcm_substream *substream,
|
||||
break; /* all drained */
|
||||
init_waitqueue_entry(&wait, current);
|
||||
add_wait_queue(&to_check->sleep, &wait);
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
snd_pcm_stream_unlock_irq(substream);
|
||||
up_read(&snd_pcm_link_rwsem);
|
||||
snd_power_unlock(card);
|
||||
tout = schedule_timeout(10 * HZ);
|
||||
if (runtime->no_period_wakeup)
|
||||
tout = MAX_SCHEDULE_TIMEOUT;
|
||||
else {
|
||||
tout = 10;
|
||||
if (runtime->rate) {
|
||||
long t = runtime->period_size * 2 / runtime->rate;
|
||||
tout = max(t, tout);
|
||||
}
|
||||
tout = msecs_to_jiffies(tout * 1000);
|
||||
}
|
||||
tout = schedule_timeout_interruptible(tout);
|
||||
snd_power_lock(card);
|
||||
down_read(&snd_pcm_link_rwsem);
|
||||
snd_pcm_stream_lock_irq(substream);
|
||||
|
Reference in New Issue
Block a user