wait_event and interrupts

Rune Torgersen runet at innovsys.com
Wed Sep 21 03:56:02 EST 2005


Hi
I have a driver that roughly does something like:

int driver_read(int cs, int addr, void *buf, int len)
{
    hw_done = 0;
    /* init_hw */

    if (!hw_done)
    {
        ret = wait_event_interruptible_timeout(inq, hw_done, TIMEOUT);
        if (ret == 0)
        {
            if (hw_done)
                goto hw_finished;
			
            return -EIO;
        }
    }
hw_finished:
    return len;
}

static irqreturn_t myinterrupt(int irq, void * dev_id, struct pt_regs *
regs)
{
    hw_done = 1;
    schedule_work(&tqueue);

    return IRQ_HANDLED;
}

static void do_softint(void *private_)
{
    wake_up_interruptible(&inq);

}

I have a problem however with this, because in about 10% of my cases,
the interrupt triggers very fast, and ends up being served between the
check for hw_done and the wait_event call. This cause the wait to
timeout instead of getting waked up.

Is there a better way of doing this?
I do not want to do a busy wait, because the hardware can take up to
several 100's of ms to return, but most often returns within 20us.




More information about the Linuxppc-embedded mailing list