On Gwe, 2005-03-11 at 03:36, Peter Chubb wrote:
> +static irqreturn_t irq_proc_irq_handler(int irq, void *vidp, struct pt_regs 
> *regs)
> +{
> +     struct irq_proc *idp = (struct irq_proc *)vidp;
> + 
> +     BUG_ON(idp->irq != irq);
> +     disable_irq_nosync(irq);
> +     atomic_inc(&idp->count);
> +     wake_up(&idp->q);
> +     return IRQ_HANDLED;

You just deadlocked the machine in many configurations. You can't use
disable_irq for this trick you have to tell the kernel how to handle it.
I posted a proposal for this sometime ago because X has some uses for
it. The idea being you'd pass a struct that describes

1.      What tells you an IRQ occurred on this device
2.      How to clear it
3.      How to enable/disable it.

Something like

        struct {
                u8 type;                /* 8, 16, 32  I/O or MMIO */
                u8 bar;                 /* PCI bar to use */
                u32 offset;             /* Into bar */
                u32 mask;               /* Bits to touch/compare */
                u32 value;              /* Value to check against/set */
        }


-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to