patch-2.4.5 linux/arch/ppc/amiga/amiints.c
Next file: linux/arch/ppc/amiga/amisound.c
Previous file: linux/arch/ppc/amiga/amiga_ksyms.c
Back to the patch index
Back to the overall index
- Lines: 128
- Date:
Mon May 21 17:04:46 2001
- Orig file:
v2.4.4/linux/arch/ppc/amiga/amiints.c
- Orig date:
Fri Feb 16 16:02:34 2001
diff -u --recursive --new-file v2.4.4/linux/arch/ppc/amiga/amiints.c linux/arch/ppc/amiga/amiints.c
@@ -1,4 +1,7 @@
/*
+ * BK Id: SCCS/s.amiints.c 1.8 05/21/01 00:48:24 cort
+ */
+/*
* linux/arch/m68k/amiga/amiints.c -- Amiga Linux interrupt handling code
*
* This file is subject to the terms and conditions of the GNU General Public
@@ -255,9 +258,10 @@
return;
}
- if (irq >= IRQ_AMIGA_AUTO)
+ if (irq >= IRQ_AMIGA_AUTO) {
sys_free_irq(irq - IRQ_AMIGA_AUTO, dev_id);
-
+ return;
+ }
if (irq >= IRQ_AMIGA_CIAA) {
cia_free_irq(irq, dev_id);
return;
@@ -295,7 +299,10 @@
return;
}
- if (--ami_ablecount[irq])
+ ami_ablecount[irq]--;
+ if (ami_ablecount[irq]<0)
+ ami_ablecount[irq]=0;
+ else if (ami_ablecount[irq])
return;
/* No action for auto-vector interrupts */
@@ -347,64 +354,16 @@
ami_irq_list[irq]->handler(irq, ami_irq_list[irq]->dev_id, fp);
}
-void amiga_do_irq_list(int irq, struct pt_regs *fp, struct irq_server *server)
+void amiga_do_irq_list(int irq, struct pt_regs *fp)
{
- irq_node_t *node, *slow_nodes;
- unsigned short intena;
- unsigned long flags;
+ irq_node_t *node;
kstat.irqs[0][SYS_IRQS + irq]++;
- if (server->count++)
- server->reentrance = 1;
-
- intena = ami_intena_vals[irq];
- custom.intreq = intena;
- /* serve first fast handlers - there can only be one of these */
- node = ami_irq_list[irq];
-
- /*
- * Timer interrupts show up like this
- */
- if (!node) {
- server->count--;
- return;
- }
+ custom.intreq = ami_intena_vals[irq];
- if (node && (node->flags & SA_INTERRUPT)) {
- save_flags(flags);
- cli();
+ for (node = ami_irq_list[irq]; node; node = node->next)
node->handler(irq, node->dev_id, fp);
- restore_flags(flags);
-
- server->count--;
- return;
- }
-
- /*
- * Disable the interrupt source in question and reenable all
- * other interrupts. No interrupt handler should ever touch
- * the intena flags directly!
- */
- custom.intena = intena;
- save_flags(flags);
- sti();
-
- slow_nodes = node;
- for (;;) {
- for (; node; node = node->next)
- node->handler(irq, node->dev_id, fp);
-
- if (!server->reentrance) {
- server->count--;
- restore_flags(flags);
- custom.intena = IF_SETCLR | intena;
- return;
- }
-
- server->reentrance = 0;
- node = slow_nodes;
- }
}
/*
@@ -437,7 +396,6 @@
static void ami_int3(int irq, void *dev_id, struct pt_regs *fp)
{
unsigned short ints = custom.intreqr & custom.intenar;
- static struct irq_server server = {0, 0};
/* if a blitter interrupt */
if (ints & IF_BLIT) {
@@ -453,7 +411,7 @@
/* if a vertical blank interrupt */
if (ints & IF_VERTB)
- amiga_do_irq_list(IRQ_AMIGA_VERTB, fp, &server);
+ amiga_do_irq_list(IRQ_AMIGA_VERTB, fp);
}
static void ami_int4(int irq, void *dev_id, struct pt_regs *fp)
@@ -512,7 +470,7 @@
and executes them in a loop. Having ami_badint at the end of the chain
is a bad idea. */
void (*amiga_default_handler[SYS_IRQS])(int, void *, struct pt_regs *) = {
- NULL, ami_int1, NULL, NULL /* FB expects to replace ami_int3*/,
+ NULL, ami_int1, NULL, ami_int3,
ami_int4, ami_int5, NULL, ami_int7
};
#else
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)