diff options
Diffstat (limited to 'linux/dev/arch/i386/kernel/irq.c')
-rw-r--r-- | linux/dev/arch/i386/kernel/irq.c | 90 |
1 files changed, 6 insertions, 84 deletions
diff --git a/linux/dev/arch/i386/kernel/irq.c b/linux/dev/arch/i386/kernel/irq.c index bc752013..1e911f33 100644 --- a/linux/dev/arch/i386/kernel/irq.c +++ b/linux/dev/arch/i386/kernel/irq.c @@ -90,49 +90,6 @@ static struct linux_action *irq_action[16] = }; /* - * Mask an IRQ. - */ -static inline void -mask_irq (unsigned int irq_nr) -{ - int new_pic_mask = curr_pic_mask | 1 << irq_nr; - - if (curr_pic_mask != new_pic_mask) - { - curr_pic_mask = new_pic_mask; - if (irq_nr < 8) - outb (curr_pic_mask & 0xff, PIC_MASTER_OCW); - else - outb (curr_pic_mask >> 8, PIC_SLAVE_OCW); - } -} - -/* - * Unmask an IRQ. - */ -static inline void -unmask_irq (unsigned int irq_nr) -{ - int mask; - int new_pic_mask; - - mask = 1 << irq_nr; - if (irq_nr >= 8) - mask |= 1 << 2; - - new_pic_mask = curr_pic_mask & ~mask; - - if (curr_pic_mask != new_pic_mask) - { - curr_pic_mask = new_pic_mask; - if (irq_nr < 8) - outb (curr_pic_mask & 0xff, PIC_MASTER_OCW); - else - outb (curr_pic_mask >> 8, PIC_SLAVE_OCW); - } -} - -/* * Generic interrupt handler for Linux devices. * Set up a fake `struct pt_regs' then call the real handler. */ @@ -157,7 +114,7 @@ linux_intr (int irq) // the current device. But I don't do it for now. if (action->user_intr) { - if (!deliver_user_intr(irq, action->user_intr)) + if (!deliver_user_intr(&irqtab, irq, action->user_intr)) { *prev = action->next; linux_kfree(action); @@ -184,43 +141,6 @@ linux_intr (int irq) intr_count--; } -/* Count how many subsystems requested to disable each IRQ */ -static unsigned ndisabled_irq[NR_IRQS]; - -/* These disable/enable IRQs for real after counting how many subsystems - * requested that */ -void -__disable_irq (unsigned int irq_nr) -{ - unsigned long flags; - - assert (irq_nr < NR_IRQS); - - save_flags (flags); - cli (); - ndisabled_irq[irq_nr]++; - assert (ndisabled_irq[irq_nr] > 0); - if (ndisabled_irq[irq_nr] == 1) - mask_irq (irq_nr); - restore_flags (flags); -} - -void -__enable_irq (unsigned int irq_nr) -{ - unsigned long flags; - - assert (irq_nr < NR_IRQS); - - save_flags (flags); - cli (); - assert (ndisabled_irq[irq_nr] > 0); - ndisabled_irq[irq_nr]--; - if (ndisabled_irq[irq_nr] == 0) - unmask_irq (irq_nr); - restore_flags (flags); -} - /* IRQ mask according to Linux drivers */ static unsigned linux_pic_mask; @@ -300,13 +220,15 @@ setup_x86_irq (int irq, struct linux_action *new) } int -install_user_intr_handler (unsigned int irq, unsigned long flags, +install_user_intr_handler (struct irqdev *dev, int id, unsigned long flags, user_intr_t *user_intr) { struct linux_action *action; struct linux_action *old; int retval; + unsigned int irq = dev->irq[id]; + assert (irq < 16); /* Test whether the irq handler has been set */ @@ -314,7 +236,7 @@ install_user_intr_handler (unsigned int irq, unsigned long flags, old = irq_action[irq]; while (old) { - if (old->user_intr && old->user_intr->dest == user_intr->dest) + if (old->user_intr && old->user_intr->dst_port == user_intr->dst_port) { printk ("The interrupt handler has already been installed on line %d", irq); return linux_to_mach_error (-EAGAIN); @@ -334,7 +256,7 @@ install_user_intr_handler (unsigned int irq, unsigned long flags, action->handler = NULL; action->next = NULL; action->dev_id = NULL; - action->flags = flags; + action->flags = SA_SHIRQ; action->user_intr = user_intr; retval = setup_x86_irq (irq, action); |