Index: alsa-kernel/core/init.c =================================================================== RCS file: /suse/tiwai/cvs/alsa/alsa-kernel/core/init.c,v retrieving revision 1.35 diff -u -r1.35 init.c --- alsa-kernel/core/init.c 23 Oct 2003 17:00:13 -0000 1.35 +++ alsa-kernel/core/init.c 23 Oct 2003 17:55:43 -0000 @@ -679,6 +679,7 @@ int snd_power_wait(snd_card_t *card, unsigned int power_state, struct file *file) { wait_queue_t wait; + int result = 0; /* fastpath */ if (snd_power_get_state(card) == power_state) @@ -686,18 +687,22 @@ init_waitqueue_entry(&wait, current); add_wait_queue(&card->power_sleep, &wait); while (1) { - if (card->shutdown) - return -ENODEV; - if (snd_power_get_state(card) == power_state) { - remove_wait_queue(&card->power_sleep, &wait); - return 0; + if (card->shutdown) { + result = -ENODEV; + break; + } + if (snd_power_get_state(card) == power_state) + break; + if (file && (file->f_flags & O_NONBLOCK)) { + result = -EAGAIN; + break; } - if (file && (file->f_flags & O_NONBLOCK)) - return -EAGAIN; set_current_state(TASK_UNINTERRUPTIBLE); snd_power_unlock(card); schedule_timeout(30 * HZ); snd_power_lock(card); } + remove_wait_queue(&card->power_sleep, &wait); + return result; } #endif /* CONFIG_PM */