diff options
author | Thomas Bushnell <thomas@gnu.org> | 1999-04-26 05:35:47 +0000 |
---|---|---|
committer | Thomas Bushnell <thomas@gnu.org> | 1999-04-26 05:35:47 +0000 |
commit | 3a4e8f5c1c60f87e1c9e0878ddb6cf7dac8c59c0 (patch) | |
tree | 50b56b8570e175dbcff43b5f0d61103b6fea5906 /i386/i386at/gpl/linux/linux_irq.c | |
parent | 002b9c7d51f7fdb0fe222d4a6023655687c6e501 (diff) | |
download | gnumach-3a4e8f5c1c60f87e1c9e0878ddb6cf7dac8c59c0.tar.gz gnumach-3a4e8f5c1c60f87e1c9e0878ddb6cf7dac8c59c0.tar.bz2 gnumach-3a4e8f5c1c60f87e1c9e0878ddb6cf7dac8c59c0.zip |
1998-11-06 OKUJI Yoshinori <okuji@kuicr.kyoto-u.ac.jp>
* i386/i386at/gpl/linux: Moved to ...
* linuxdev: ... here.
* i386/Makefrag: Linux drivers specific code moved to ...
* linuxdev/Makefrag: ... here.
* i386/Files: Recreated.
* i386/Subdirs: Likewise.
* linuxdev/drivers: New directory.
* linuxdev/arch: Likewise.
* linuxdev/arch/i386: Likewise.
* linuxdev/{block,scsi,net,pci}: Moved to ...
* linuxdev/drivers/{block,scsi,net,pci}: ... here.
* i386/{Drivers.in,device-drivers.h.in,driverlist.in}: Moved to ...
* linuxdev/{Drivers.in,device-drivers.h.in,driverlist.in}: ... here.
* linuxdev/{linux_emul.h,linux_*.c}: Moved to ...
* linuxdev/arch/i386/{linux_emul.h,linux_*.c}: ... here.
* linuxdev/arch/i386/linux_block.c: Include <linux_emul.h>, instead
of <i386at/gpl/linux/linux_emul.h>.
* linuxdev/arch/i386/linux_init.c: Likewise.
* linuxdev/arch/i386/linux_kmem.c: Likewise.
* linuxdev/arch/i386/linux_misc.c: Likewise.
* linuxdev/arch/i386/linux_net.c: Likewise.
* linuxdev/arch/i386/linux_sched.c: Likewise.
* device/ds_routines.c: Include <linuxdev/device-drivers.h>, instead
of <i386/device-drivers.h>.
* linuxdev/arch/i386/linux_init.c: Likewise.
* linuxdev/include/linux/autoconf.h: Likewise.
* Makefile.in: Include $(srcdir)/linuxdev/Makefrag.
* linuxdev/Drivers.in (AC_INIT): Use include/linux/autoconf.h,
instead of i386/i386asm.sym.
Diffstat (limited to 'i386/i386at/gpl/linux/linux_irq.c')
-rw-r--r-- | i386/i386at/gpl/linux/linux_irq.c | 246 |
1 files changed, 0 insertions, 246 deletions
diff --git a/i386/i386at/gpl/linux/linux_irq.c b/i386/i386at/gpl/linux/linux_irq.c deleted file mode 100644 index d04e0531..00000000 --- a/i386/i386at/gpl/linux/linux_irq.c +++ /dev/null @@ -1,246 +0,0 @@ -/* - * Linux IRQ management. - * Copyright (C) 1995 Shantanu Goel. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -/* - * linux/arch/i386/kernel/irq.c - * - * Copyright (C) 1992 Linus Torvalds - */ - -#include <sys/types.h> - -#include <kern/assert.h> - -#include <i386/machspl.h> -#include <i386/ipl.h> -#include <i386/pic.h> - -#define MACH_INCLUDE -#include <linux/sched.h> -#include <linux/interrupt.h> -#include <linux/ptrace.h> -#include <linux/errno.h> -#include <linux/delay.h> -#include <linux/kernel_stat.h> - -#include <asm/system.h> -#include <asm/bitops.h> -#include <asm/irq.h> - -/* - * Priority at which a Linux handler should be called. - * This is used at the time of an IRQ allocation. It is - * set by emulation routines for each class of device. - */ -spl_t linux_intr_pri; - -/* - * Flag indicating an interrupt is being handled. - */ -unsigned long intr_count = 0; - -/* - * List of Linux interrupt handlers. - */ -static void (*linux_handlers[16])(int, struct pt_regs *); - -extern spl_t curr_ipl; -extern int curr_pic_mask; -extern int pic_mask[]; - -extern int intnull(), prtnull(); - -/* - * Generic interrupt handler for Linux devices. - * Set up a fake `struct pt_regs' then call the real handler. - */ -static int -linux_intr(irq) - int irq; -{ - struct pt_regs regs; - - kstat.interrupts[irq]++; - intr_count++; - (*linux_handlers[irq])(irq, ®s); - intr_count--; -} - -/* - * Mask an IRQ. - */ -void -disable_irq(irq) - unsigned int irq; -{ - int i, flags; - - assert (irq < NR_IRQS); - - save_flags(flags); - cli(); - for (i = 0; i < intpri[irq]; i++) - pic_mask[i] |= 1 << irq; - if (curr_pic_mask != pic_mask[curr_ipl]) { - curr_pic_mask = pic_mask[curr_ipl]; - outb(PIC_MASTER_OCW, curr_pic_mask); - outb(PIC_SLAVE_OCW, curr_pic_mask >> 8); - } - restore_flags(flags); -} - -/* - * Unmask an IRQ. - */ -void -enable_irq(irq) - unsigned int irq; -{ - int mask, i, flags; - - assert (irq < NR_IRQS); - - mask = 1 << irq; - if (irq >= 8) - mask |= 1 << 2; - save_flags(flags); - cli(); - for (i = 0; i < intpri[irq]; i++) - pic_mask[i] &= ~mask; - if (curr_pic_mask != pic_mask[curr_ipl]) { - curr_pic_mask = pic_mask[curr_ipl]; - outb(PIC_MASTER_OCW, curr_pic_mask); - outb(PIC_SLAVE_OCW, curr_pic_mask >> 8); - } - restore_flags(flags); -} - -/* - * Attach a handler to an IRQ. - */ -int -request_irq(unsigned int irq, void (*handler)(int, struct pt_regs *), - unsigned long flags, const char *device) -{ - assert(irq < 16); - - if (ivect[irq] == intnull || ivect[irq] == prtnull) { - if (!handler) - return (-LINUX_EINVAL); - linux_handlers[irq] = handler; - ivect[irq] = linux_intr; - iunit[irq] = irq; - intpri[irq] = linux_intr_pri; - enable_irq(irq); - return (0); - } - return (-LINUX_EBUSY); -} - -/* - * Deallocate an irq. - */ -void -free_irq(unsigned int irq) -{ - if (irq > 15) - panic("free_irq: bad irq number"); - - disable_irq(irq); - ivect[irq] = (irq == 7) ? prtnull : intnull; - iunit[irq] = irq; - intpri[irq] = SPL0; -} - -/* - * IRQ probe interrupt handler. - */ -void -probe_intr(irq) - int irq; -{ - disable_irq(irq); -} - -/* - * Set for an irq probe. - */ -unsigned long -probe_irq_on() -{ - unsigned i, irqs = 0; - unsigned long delay; - - assert (curr_ipl == 0); - - /* - * Allocate all available IRQs. - */ - for (i = 15; i > 0; i--) - if (request_irq(i, probe_intr, 0, "probe") == 0) - irqs |= 1 << i; - - /* - * Wait for spurious interrupts to mask themselves out. - */ - for (delay = jiffies + 2; delay > jiffies; ) - ; - - /* - * Free IRQs that caused spurious interrupts. - */ - for (i = 15; i > 0; i--) { - if (irqs & (1 << i) & pic_mask[0]) { - irqs ^= 1 << i; - free_irq(i); - } - } - - return (irqs); -} - -/* - * Return the result of an irq probe. - */ -int -probe_irq_off(unsigned long irqs) -{ - unsigned i, irqs_save = irqs; - - assert (curr_ipl == 0); - - irqs &= pic_mask[0]; - - /* - * Deallocate IRQs. - */ - for (i = 15; i > 0; i--) - if (irqs_save & (1 << i)) - free_irq(i); - - /* - * Return IRQ number. - */ - if (!irqs) - return (0); - i = ffz(~irqs); - if (irqs != (irqs & (1 << i))) - i = -i; - return (i); -} |