diff options
Diffstat (limited to 'pfinet/linux-src/include/linux/interrupt.h')
-rw-r--r-- | pfinet/linux-src/include/linux/interrupt.h | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/pfinet/linux-src/include/linux/interrupt.h b/pfinet/linux-src/include/linux/interrupt.h new file mode 100644 index 00000000..3e3edd8b --- /dev/null +++ b/pfinet/linux-src/include/linux/interrupt.h @@ -0,0 +1,84 @@ +/* interrupt.h */ +#ifndef _LINUX_INTERRUPT_H +#define _LINUX_INTERRUPT_H + +#include <linux/kernel.h> +#include <asm/bitops.h> +#include <asm/atomic.h> + +struct irqaction { + void (*handler)(int, void *, struct pt_regs *); + unsigned long flags; + unsigned long mask; + const char *name; + void *dev_id; + struct irqaction *next; +}; + +extern volatile unsigned char bh_running; + +extern atomic_t bh_mask_count[32]; +extern unsigned long bh_active; +extern unsigned long bh_mask; +extern void (*bh_base[32])(void); + +asmlinkage void do_bottom_half(void); + +/* Who gets which entry in bh_base. Things which will occur most often + should come first - in which case NET should be up the top with SERIAL/TQUEUE! */ + +enum { + TIMER_BH = 0, + CONSOLE_BH, + TQUEUE_BH, + DIGI_BH, + SERIAL_BH, + RISCOM8_BH, + SPECIALIX_BH, + AURORA_BH, + ESP_BH, + NET_BH, + SCSI_BH, + IMMEDIATE_BH, + KEYBOARD_BH, + CYCLADES_BH, + CM206_BH, + JS_BH, + MACSERIAL_BH, + ISICOM_BH +}; + +#include <asm/hardirq.h> +#include <asm/softirq.h> + +/* + * Autoprobing for irqs: + * + * probe_irq_on() and probe_irq_off() provide robust primitives + * for accurate IRQ probing during kernel initialization. They are + * reasonably simple to use, are not "fooled" by spurious interrupts, + * and, unlike other attempts at IRQ probing, they do not get hung on + * stuck interrupts (such as unused PS2 mouse interfaces on ASUS boards). + * + * For reasonably foolproof probing, use them as follows: + * + * 1. clear and/or mask the device's internal interrupt. + * 2. sti(); + * 3. irqs = probe_irq_on(); // "take over" all unassigned idle IRQs + * 4. enable the device and cause it to trigger an interrupt. + * 5. wait for the device to interrupt, using non-intrusive polling or a delay. + * 6. irq = probe_irq_off(irqs); // get IRQ number, 0=none, negative=multiple + * 7. service the device to clear its pending interrupt. + * 8. loop again if paranoia is required. + * + * probe_irq_on() returns a mask of allocated irq's. + * + * probe_irq_off() takes the mask as a parameter, + * and returns the irq number which occurred, + * or zero if none occurred, or a negative irq number + * if more than one irq occurred. + */ +extern unsigned long probe_irq_on(void); /* returns 0 on failure */ +extern int probe_irq_off(unsigned long); /* returns 0 or negative on failure */ + +#endif |