summaryrefslogtreecommitdiff
path: root/linux/dev/arch/i386/kernel/irq.c
diff options
context:
space:
mode:
Diffstat (limited to 'linux/dev/arch/i386/kernel/irq.c')
-rw-r--r--linux/dev/arch/i386/kernel/irq.c90
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);