From: Andy P. <at...@us...> - 2002-04-10 18:36:09
|
Update of /cvsroot/linux-vax/kernel-2.4/arch/m68k/q40 In directory usw-pr-cvs1:/tmp/cvs-serv13561/m68k/q40 Modified Files: README config.c q40ints.c Log Message: synch 2.4.15 commit 37 Index: README =================================================================== RCS file: /cvsroot/linux-vax/kernel-2.4/arch/m68k/q40/README,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -r1.1.1.1 -r1.2 --- README 14 Jan 2001 19:41:59 -0000 1.1.1.1 +++ README 10 Apr 2002 14:34:37 -0000 1.2 @@ -3,43 +3,48 @@ You may try http://www.geocities.com/SiliconValley/Bay/2602/ for some up to date information. Booter and other tools will be also -available from this place and ftp.uni-erlangen.de/linux/680x0/q40/ +available from this place or ftp.uni-erlangen.de/linux/680x0/q40/ and mirrors. Hints to documentation usually refer to the linux source tree in /usr/src/linux/Documentation unless URL given. -It seems IRQ unmasking can't be safely done on a Q40. Autoprobing is -not yet implemented - do not try it! (See below) +It seems IRQ unmasking can't be safely done on a Q40. IRQ probing +is not implemented - do not try it! (See below) -For a list of kernel commandline options read the documentation for the +For a list of kernel command-line options read the documentation for the particular device drivers. The floppy imposes a very high interrupt load on the CPU, approx 30K/s. When something blocks interrupts (HD) it will loose some of them, so far -this is not known to have caused any data loss. On hihgly loaded systems -it can make the floppy very slow or practicaly stop. Other Q40 OS' simply +this is not known to have caused any data loss. On highly loaded systems +it can make the floppy very slow or practically stop. Other Q40 OS' simply poll the floppy for this reason - something that can't be done in Linux. -Only possible cure is getting a 82072 contoler with fifo instead of -the 8272A +Only possible cure is getting a 82072 controller with fifo instead of +the 8272A. -drivers used by the Q40, appart from the very obvious (console etc.): +drivers used by the Q40, apart from the very obvious (console etc.): drivers/char/q40_keyb.c # use PC keymaps for national keyboards serial.c # normal PC driver - any speed lp.c # printer driver - char/joystick/* # most of this should work + genrtc.c # RTC + char/joystick/* # most of this should work, not + # in default config.in block/q40ide.c # startup for ide ide* # see Documentation/ide.txt floppy.c # normal PC driver, DMA emu in asm/floppy.h # and arch/m68k/kernel/entry.S # see drivers/block/README.fd + net/ne.c video/q40fb.c - misc/parport_pc.c + parport/* + sound/dmasound_core.c + dmasound_q40.c Various other PC drivers can be enabled simply by adding them to arch/m68k/config.in, especially 8 bit devices should be without any problems. For cards using 16bit io/mem more care is required, like -checking byteorder issues, hacking memcpy_*_io etc. +checking byte order issues, hacking memcpy_*_io etc. Debugging @@ -47,7 +52,7 @@ Upon startup the kernel will usually output "ABCQGHIJ" into the SRAM, preceded by the booter signature. This is a trace just in case something -went wrong during earliest setup stages. +went wrong during earliest setup stages of head.S. **Changed** to preserve SRAM contents by default, this is only done when requested - SRAM must start with '%LX$' signature to do this. '-d' option to 'lxx' loader enables this. @@ -55,13 +60,15 @@ SRAM can also be used as additional console device, use debug=mem. This will save kernel startup msgs into SRAM, the screen will display only the penguin - and shell prompt if it gets that far.. +Unfortunately only 2000 bytes are available. Serial console works and can also be used for debugging, see loader_txt Most problems seem to be caused by fawlty or badly configured io-cards or -harddrives anyway..there are so many things that can go wrong here. -Make sure to configure the parallel port as SPP for first testing..the -Q40 may have trouble with parallel interrupts. +hard drives anyway. +Make sure to configure the parallel port as SPP and remove IRQ/DMA jumpers +for first testing. The Q40 does not support DMA and may have trouble with +parallel ports version of interrupts. Q40 Hardware Description @@ -71,30 +78,27 @@ questions. The Q40 consists of a 68040@40 MHz, 1MB video RAM, up to 32MB RAM, AT-style -keyboard interface, 1 Programmable LED, 2 8bit DACs and up to 1MB ROM, 1MB +keyboard interface, 1 Programmable LED, 2x8bit DACs and up to 1MB ROM, 1MB shadow ROM. +The Q60 has any of 68060 or 68LC060 and up to 128 MB RAM. -Most interfacing like floppy, hd, serial, parallel ports is done via ISA +Most interfacing like floppy, IDE, serial and parallel ports is done via ISA slots. The ISA io and mem range is mapped (sparse&byteswapped!) into separate regions of the memory. The main interrupt register IIRQ_REG will indicate whether an IRQ was internal or from some ISA devices, EIRQ_REG can distinguish up to 8 ISA IRQs. The Q40 custom chip is programmable to provide 2 periodic timers: - - 50 or 200 Hz - level 2, - - 10 or 20 KHz - level 4 - !!THIS CANT BE DISABLED!! - + - 50 or 200 Hz - level 2, !!THIS CANT BE DISABLED!! + - 10 or 20 KHz - level 4, used for dma-sound + Linux uses the 200 Hz interrupt for timer and beep by default. Interrupts ========== -q40 master chip handles only level triggered interrupts :-(( - -IRQ sharing is not yet implemented but this should be only a minor -problem.. +q40 master chip handles only a subset of level triggered interrupts. Linux has some requirements wrt interrupt architecture, these are to my knowledge: @@ -103,31 +107,32 @@ (b) working enable/disable_irq Luckily these requirements are only important for drivers shared -with other architectures - ide,serial,parallel, ethernet.. +with other architectures - ide,serial,parallel, ethernet. q40ints.c now contains a trivial hack for (a), (b) is more difficult -because only irq's 4-15 can be disabled - and only all o them at once. +because only irq's 4-15 can be disabled - and only all of them at once. Thus disable_irq() can effectively block the machine if the driver goes asleep. -One thing to keep in minde when hacking around the interrupt code is -that there is no way to find out which IRQ caused a request. +One thing to keep in mind when hacking around the interrupt code is +that there is no way to find out which IRQ caused a request, [EI]IRQ_REG +displays current state of the various IRQ lines. Keyboard ======== q40 receives AT make/break codes from the keyboard, these are translated to the PC scancodes x86 Linux uses. So by theory every national keyboard should -work just by loading the apropriate x86 keytable - see any national-HOWTO. +work just by loading the appropriate x86 keytable - see any national-HOWTO. Unfortunately the AT->PC translation isn't quite trivial and even worse, my documentation of it is absolutely minimal - thus some exotic keys may not behave exactly as expected. There is still hope that it can be fixed completely though. If you encounter -problems, email me idealy this: +problems, email me ideally this: - exact keypress/release sequence - 'showkey -s' run on q40, non-X session - 'showkey -s' run on a PC, non-X session - - AT codes as displayed by the q40 debuging ROM + - AT codes as displayed by the q40 debugging ROM btw if the showkey output from PC and Q40 doesn't differ then you have some classic configuration problem - don't send me anything in this case Index: config.c =================================================================== RCS file: /cvsroot/linux-vax/kernel-2.4/arch/m68k/q40/config.c,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -r1.1.1.1 -r1.2 --- config.c 14 Jan 2001 19:42:01 -0000 1.1.1.1 +++ config.c 10 Apr 2002 14:34:37 -0000 1.2 @@ -13,11 +13,9 @@ */ #include <linux/config.h> -#include <stdarg.h> #include <linux/types.h> #include <linux/kernel.h> #include <linux/mm.h> -#include <linux/kd.h> #include <linux/tty.h> #include <linux/console.h> #include <linux/linkage.h> @@ -25,6 +23,7 @@ #include <linux/major.h> #include <linux/serial_reg.h> +#include <asm/io.h> #include <asm/rtc.h> #include <asm/bootinfo.h> #include <asm/system.h> @@ -32,6 +31,7 @@ #include <asm/setup.h> #include <asm/irq.h> #include <asm/traps.h> +#include <asm/rtc.h> #include <asm/machdep.h> #include <asm/q40_master.h> #include <asm/keyboard.h> @@ -39,6 +39,8 @@ extern void floppy_eject(void); extern void floppy_setup(char *str, int *ints); +extern int q40kbd_translate(unsigned char scancode, unsigned char *keycode, + char raw_mode); extern void q40_process_int (int level, struct pt_regs *regs); extern void (*q40_sys_default_handler[]) (int, void *, struct pt_regs *); /* added just for debugging */ extern void q40_init_IRQ (void); @@ -50,16 +52,17 @@ static int q40_get_hardware_list(char *buffer); extern int q40_request_irq(unsigned int irq, void (*handler)(int, void *, struct pt_regs *), unsigned long flags, const char *devname, void *dev_id); extern void q40_sched_init(void (*handler)(int, void *, struct pt_regs *)); -extern int q40_keyb_init(void); -extern int q40_kbdrate (struct kbd_repeat *); + extern unsigned long q40_gettimeoffset (void); extern void q40_gettod (int *year, int *mon, int *day, int *hour, int *min, int *sec); extern int q40_hwclk (int, struct hwclk_time *); extern int q40_set_clock_mmss (unsigned long); extern void q40_reset (void); +void q40_halt(void); extern void q40_waitbut(void); void q40_set_vectors (void); + extern void (*kd_mksound)(unsigned int, unsigned int); void q40_mksound(unsigned int /*freq*/, unsigned int /*ticks*/ ); @@ -67,16 +70,9 @@ extern char m68k_debug_device[]; static void q40_mem_console_write(struct console *co, const char *b, unsigned int count); -#if 0 -extern int ql_ticks=0; -extern int sound_ticks=0; -#endif extern int ql_ticks; -static unsigned char bcd2bin (unsigned char b); -static unsigned char bin2bcd (unsigned char b); - static int q40_wait_key(struct console *co){return 0;} static struct console q40_console_driver = { name: "debug", @@ -90,11 +86,13 @@ extern char *q40_mem_cptr; /*=(char *)0xff020000;*/ static int _cpleft; +#if 0 int q40_kbd_translate(unsigned char keycode, unsigned char *keycodep, char raw_mode) { *keycodep = keycode; return 1; } +#endif static void q40_mem_console_write(struct console *co, const char *s, unsigned int count) @@ -130,13 +128,36 @@ } #endif -void q40_reset() +static int halted=0; + +#ifdef CONFIG_HEARTBEAT +static void q40_heartbeat(int on) { + if (halted) return; + if (on) + Q40_LED_ON(); + else + Q40_LED_OFF(); +} +#endif + +void q40_reset() +{ + halted=1; printk ("\n\n*******************************************\n" "Called q40_reset : press the RESET button!! \n" "*******************************************\n"); - + Q40_LED_ON(); + while(1) ; +} +void q40_halt() +{ + halted=1; + printk ("\n\n*******************\n" + " Called q40_halt\n" + "*******************\n"); + Q40_LED_ON(); while(1) ; } @@ -202,17 +223,17 @@ void __init config_q40(void) { - mach_sched_init = q40_sched_init; /* ok */ - /*mach_kbdrate = q40_kbdrate;*/ /* unneeded ?*/ - mach_keyb_init = q40_keyb_init; /* OK */ - mach_kbd_translate = q40_kbd_translate; + mach_sched_init = q40_sched_init; + + mach_keyb_init = q40kbd_init_hw; + mach_kbd_translate = q40kbd_translate; mach_init_IRQ = q40_init_IRQ; mach_gettimeoffset = q40_gettimeoffset; mach_gettod = q40_gettod; mach_hwclk = q40_hwclk; mach_set_clock_mmss = q40_set_clock_mmss; -/* mach_mksound = q40_mksound; */ - mach_reset = q40_reset; /* use reset button instead !*/ + + mach_reset = q40_reset; mach_free_irq = q40_free_irq; mach_process_int = q40_process_int; mach_get_irq_list = q40_get_irq_list; @@ -220,26 +241,28 @@ enable_irq = q40_enable_irq; disable_irq = q40_disable_irq; mach_default_handler = &q40_sys_default_handler; - mach_get_model = q40_get_model; /* no use..*/ - mach_get_hardware_list = q40_get_hardware_list; /* no use */ + mach_get_model = q40_get_model; + mach_get_hardware_list = q40_get_hardware_list; kd_mksound = q40_mksound; - /*mach_kbd_leds = q40kbd_leds;*/ + #ifdef CONFIG_MAGIC_SYSRQ mach_sysrq_key = 0x54; #endif - conswitchp = &dummy_con; -#if 0 /*def CONFIG_BLK_DEV_FD*/ - mach_floppy_setup = floppy_setup; - mach_floppy_eject = floppy_eject; - /**/ +#ifdef CONFIG_HEARTBEAT + mach_heartbeat = q40_heartbeat; #endif + mach_halt = q40_halt; + conswitchp = &dummy_con; + /* disable a few things that SMSQ might have left enabled */ q40_disable_irqs(); - mach_max_dma_address = 32*1024*1024; /* no DMA at all, but ide-scsi requires it.. */ + /* no DMA at all, but ide-scsi requires it.. make sure + * all physical RAM fits into the boundary - otherwise + * allocator may play costly and useless tricks */ + mach_max_dma_address = 1024*1024*1024; -/* userfull for early debuging stages writes kernel messages into SRAM */ - + /* useful for early debugging stages - writes kernel messages into SRAM */ if (!strncmp( m68k_debug_device,"mem",3 )) { /*printk("using NVRAM debug, q40_mem_cptr=%p\n",q40_mem_cptr);*/ @@ -252,109 +275,24 @@ int q40_parse_bootinfo(const struct bi_record *rec) { - return 1; /* unknown */ + return 1; } -#if 0 -#define DAC_LEFT ((unsigned char *)0xff008000) -#define DAC_RIGHT ((unsigned char *)0xff008004) -void q40_mksound(unsigned int hz, unsigned int ticks) -{ - /* for now ignore hz, except that hz==0 switches off sound */ - /* simply alternate the ampl 0-255-0-.. at 200Hz */ - if (hz==0) - { - if (sound_ticks) - sound_ticks=1; /* atomic - no irq spinlock used */ - - *DAC_LEFT=0; - *DAC_RIGHT=0; - return; - } - /* sound itself is done in q40_timer_int */ - if (sound_ticks == 0) sound_ticks=1000; /* pretty long beep */ - sound_ticks=ticks<<1; -} - -static void (*q40_timer_routine)(int, void *, struct pt_regs *); -static short rtc_oldsecs=0; -unsigned rtc_irq_flags=0; -unsigned rtc_irq_ctrl=0; - -static void q40_timer_int (int irq, void *dev_id, struct pt_regs *fp) -{ -#if (HZ==10000) - master_outb(-1,SAMPLE_CLEAR_REG); -#else /* must be 50 or 100 */ - master_outb(-1,FRAME_CLEAR_REG); -#endif - -#if (HZ==100) - ql_ticks = ql_ticks ? 0 : 1; - if (sound_ticks) - { - unsigned char sval=(sound_ticks & 1) ? 0 : 255; - sound_ticks--; - *DAC_LEFT=sval; - *DAC_RIGHT=sval; - } -#ifdef CONFIG_Q40RTC - if (rtc_irq_ctrl && (rtc_oldsecs != RTC_SECS)) - { - rtc_oldsecs = RTC_SECS; - rtc_irq_flags = RTC_UIE; - rtc_interrupt(); - } -#endif - if (ql_ticks) return; -#endif - q40_timer_routine(irq, dev_id, fp); +static inline unsigned char bcd2bin (unsigned char b) +{ + return ((b>>4)*10 + (b&15)); } -#endif -#if 0 -extern void (*q40_timer_routine)(int, void *, struct pt_regs *); -extern void q40_timer_int(); - -void q40_sched_init (void (*timer_routine)(int, void *, struct pt_regs *)) +static inline unsigned char bin2bcd (unsigned char b) { - int timer_irq; - - q40_timer_routine = timer_routine; - -#if (HZ==10000) - timer_irq=Q40_IRQ_TIMER; -#else - timer_irq=Q40_IRQ_FRAME; -#endif - - /*printk("registering sched/timer IRQ %d\n", timer_irq);*/ - - if (request_irq(timer_irq, q40_timer_int, 0, - "timer", q40_timer_int)) - panic ("Couldn't register timer int"); - -#if (HZ==10000) - master_outb(SAMPLE_LOW,SAMPLE_RATE_REG); - master_outb(-1,SAMPLE_CLEAR_REG); - master_outb(1,SAMPLE_ENABLE_REG); -#else - master_outb(-1,FRAME_CLEAR_REG); /* not necessary ? */ -#if (HZ==100) - master_outb( 1,FRAME_RATE_REG); -#endif -#endif + return (((b/10)*16) + (b%10)); } -#endif + unsigned long q40_gettimeoffset (void) { -#if (HZ==100) return 5000*(ql_ticks!=0); -#else - return 0; -#endif } extern void q40_gettod (int *year, int *mon, int *day, int *hour, @@ -362,7 +300,7 @@ { RTC_CTRL |= RTC_READ; *year = bcd2bin (RTC_YEAR); - *mon = bcd2bin (RTC_MNTH)-1; + *mon = bcd2bin (RTC_MNTH); *day = bcd2bin (RTC_DATE); *hour = bcd2bin (RTC_HOUR); *min = bcd2bin (RTC_MINS); @@ -371,15 +309,6 @@ } -static unsigned char bcd2bin (unsigned char b) -{ - return ((b>>4)*10 + (b&15)); -} - -static unsigned char bin2bcd (unsigned char b) -{ - return (((b/10)*16) + (b%10)); -} /* @@ -439,8 +368,6 @@ /* * Set the minutes and seconds from seconds value 'nowtime'. Fail if * clock is out by > 30 minutes. Logic lifted from atari code. - * Algorithm is to wait for the 10ms register to change, and then to - * wait a short while, and then set it. */ int q40_set_clock_mmss (unsigned long nowtime) @@ -469,18 +396,3 @@ return retval; } -extern void q40kbd_init_hw(void); - -int q40_keyb_init (void) -{ - q40kbd_init_hw(); - return 0; -} - -#if 0 -/* dummy to cause */ -void q40_slow_io() -{ - return; -} -#endif Index: q40ints.c =================================================================== RCS file: /cvsroot/linux-vax/kernel-2.4/arch/m68k/q40/q40ints.c,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -r1.1.1.1 -r1.2 --- q40ints.c 14 Jan 2001 19:42:03 -0000 1.1.1.1 +++ q40ints.c 10 Apr 2002 14:34:37 -0000 1.2 @@ -1,7 +1,7 @@ /* * arch/m68k/q40/q40ints.c * - * Copyright (C) 1999 Richard Zidlicky + * Copyright (C) 1999,2001 Richard Zidlicky * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of this archive @@ -44,7 +44,7 @@ void q40_irq2_handler (int, void *, struct pt_regs *fp); -extern void (*q40_sys_default_handler[]) (int, void *, struct pt_regs *); /* added just for debugging */ +extern void (*q40_sys_default_handler[]) (int, void *, struct pt_regs *); static void q40_defhand (int irq, void *dev_id, struct pt_regs *fp); static void sys_default_handler(int lev, void *dev_id, struct pt_regs *regs); @@ -97,9 +97,9 @@ sys_request_irq(IRQ2,q40_irq2_handler, 0, "q40 ISA and master chip", NULL); /* now enable some ints.. */ - master_outb(1,EXT_ENABLE_REG); /* hm, aint that too early? */ + master_outb(1,EXT_ENABLE_REG); /* ISA IRQ 5-15 */ - /* would be spurious ints by now, q40kbd_init_hw() does that */ + /* make sure keyboard IRQ is disabled */ master_outb(0,KEY_IRQ_ENABLE_REG); } @@ -139,7 +139,7 @@ if (dev_id==NULL) { printk("WARNING: dev_id == NULL in request_irq\n"); - dev_id=1; + dev_id=(void*)1; } irq_tab[irq].handler = handler; irq_tab[irq].flags = flags; @@ -202,7 +202,8 @@ /* * this stuff doesn't really belong here.. */ -int ql_ticks=0; + +int ql_ticks=0; /* 200Hz ticks since last jiffie */ static int sound_ticks=0; #define SVOL 45 @@ -214,7 +215,7 @@ if (hz==0) { if (sound_ticks) - sound_ticks=1; /* atomic - no irq spinlock used */ + sound_ticks=1; *DAC_LEFT=128; *DAC_RIGHT=128; @@ -227,14 +228,9 @@ } static void (*q40_timer_routine)(int, void *, struct pt_regs *); -static short rtc_oldsecs=0; -unsigned rtc_irq_flags=0; -unsigned rtc_irq_ctrl=0; static void q40_timer_int (int irq, void * dev, struct pt_regs * regs) { - - #if (HZ==100) ql_ticks = ql_ticks ? 0 : 1; if (sound_ticks) @@ -244,12 +240,12 @@ *DAC_LEFT=sval; *DAC_RIGHT=sval; } -#ifdef CONFIG_Q40RTC - if (rtc_irq_ctrl && (rtc_oldsecs != RTC_SECS)) +#if defined(CONFIG_Q40RTC) || defined(CONFIG_GEN_RTC) + if (gen_rtc_irq_ctrl && (q40rtc_oldsecs != RTC_SECS)) { - rtc_oldsecs = RTC_SECS; - rtc_irq_flags = RTC_UIE; - rtc_interrupt(); + q40rtc_oldsecs = RTC_SECS; + gen_rtc_irq_flags = RTC_UIE; + gen_rtc_interrupt(0); } #endif if (ql_ticks) return; @@ -322,16 +318,14 @@ static int ccleirq=60; /* ISA dev IRQ's*/ /*static int cclirq=60;*/ /* internal */ -/* FIX: add shared ints,mask,unmask,probing.... */ - +/* FIXME: add shared ints,mask,unmask,probing.... */ #define IRQ_INPROGRESS 1 /*static unsigned short saved_mask;*/ static int do_tint=0; #define DEBUG_Q40INT -#define IP_USE_DISABLE /* would be nice, but crashes ???? */ -/*static int dd_count=0;*/ +/*#define IP_USE_DISABLE *//* would be nice, but crashes ???? */ static int mext_disabled=0; /* ext irq disabled by master chip? */ static int aliased_irq=0; /* how many times inside handler ?*/ @@ -404,40 +398,36 @@ if ( disabled ) { #ifdef IP_USE_DISABLE - if (irq>4){ - disabled=0; - /*dd_count--;*/ - enable_irq(irq);} + if (irq>4){ + disabled=0; + enable_irq(irq);} #else - disabled=0; + disabled=0; /*printk("reenabling irq %d\n",irq); */ -#if 0 - fp->sr = ((fp->sr) & (~0x700)); /* unneeded ?! */ -#endif #endif } goto repeat; /* return; */ } } - if (mer && ccleirq>0 && !aliased_irq) + if (mer && ccleirq>0 && !aliased_irq) printk("ISA interrupt from unknown source? EIRQ_REG = %x\n",mer),ccleirq--; } iirq: - mir=master_inb(IIRQ_REG); - if (mir&IRQ_FRAME_MASK) + mir=master_inb(IIRQ_REG); + if (mir&IRQ_FRAME_MASK) { - do_tint++; - master_outb(-1,FRAME_CLEAR_REG); - } - for(;do_tint>0;do_tint--) - { - irq_tab[Q40_IRQ_FRAME].count++; - irq_tab[Q40_IRQ_FRAME].handler(Q40_IRQ_FRAME,irq_tab[Q40_IRQ_FRAME].dev_id,fp); - } - if (mir&IRQ_KEYB_MASK) /* may handle it even if actually disabled*/ - { - irq_tab[Q40_IRQ_KEYBOARD].count++; - irq_tab[Q40_IRQ_KEYBOARD].handler(Q40_IRQ_KEYBOARD,irq_tab[Q40_IRQ_KEYBOARD].dev_id,fp); + do_tint++; + master_outb(-1,FRAME_CLEAR_REG); + } + for(;do_tint>0;do_tint--) + { + irq_tab[Q40_IRQ_FRAME].count++; + irq_tab[Q40_IRQ_FRAME].handler(Q40_IRQ_FRAME,irq_tab[Q40_IRQ_FRAME].dev_id,fp); + } + if (mir&IRQ_KEYB_MASK) /* may handle it even if actually disabled*/ + { + irq_tab[Q40_IRQ_KEYBOARD].count++; + irq_tab[Q40_IRQ_KEYBOARD].handler(Q40_IRQ_KEYBOARD,irq_tab[Q40_IRQ_KEYBOARD].dev_id,fp); } } @@ -499,7 +489,7 @@ void q40_disable_irq (unsigned int irq) { /* disable ISA iqs : only do something if the driver has been - * verified to be Q40 "compatible" - right now only IDE + * verified to be Q40 "compatible" - right now IDE, NE2K * Any driver should not attempt to sleep accross disable_irq !! */ |