--- i810_audio.c.07 Tue Dec 4 16:13:39 2001 +++ i810_audio.c.07b Tue Dec 4 16:13:00 2001 @@ -1530,30 +1530,24 @@ struct dmabuf *dmabuf = &state->dmabuf; unsigned long flags; unsigned int mask = 0; - DECLARE_WAITQUEUE(waita, current); + int count; if(!dmabuf->ready) return 0; - add_wait_queue(&dmabuf->wait, &waita); -again: + poll_wait(file, &dmabuf->wait, wait); spin_lock_irqsave(&state->card->lock, flags); i810_update_ptr(state); + count = dmabuf->count; + spin_unlock_irqrestore(&state->card->lock, flags); if (file->f_mode & FMODE_READ && dmabuf->enable & ADC_RUNNING) { - if (dmabuf->count >= (signed)dmabuf->userfragsize) + if (count >= (signed)dmabuf->userfragsize) mask |= POLLIN | POLLRDNORM; } if (file->f_mode & FMODE_WRITE && dmabuf->enable & DAC_RUNNING) { if ((signed)dmabuf->dmasize >= - dmabuf->count + (signed)dmabuf->userfragsize) + count + (signed)dmabuf->userfragsize) mask |= POLLOUT | POLLWRNORM; } - spin_unlock_irqrestore(&state->card->lock, flags); - if (mask == 0) { - poll_wait(file, &dmabuf->wait, wait); - goto again; - } - remove_wait_queue(&dmabuf->wait, &waita); - return mask; }