diff -u --recursive --new-file v2.1.82/linux/Documentation/digiboard.txt linux/Documentation/digiboard.txt --- v2.1.82/linux/Documentation/digiboard.txt Sun Apr 13 10:18:20 1997 +++ linux/Documentation/digiboard.txt Fri Jan 30 13:52:57 1998 @@ -254,3 +254,35 @@ ;; par[0-2]) ----- End Makedev patch + +----------------------------------------------------------------------------- + +Changes v1.5.5: + +The ability to use the kernel's command line to pass in the configuration for +boards. Using LILO's APPEND command, a string of comma separated identifiers +or integers can be used. The 6 values in order are: + + Enable/Disable this card, + Type of card: PC/Xi(0), PC/Xe(1), PC/Xeve(2), PC/Xem(3) + Enable/Disable alternate pin arrangement, + Number of ports on this card, + I/O Port where card is configured (in HEX if using string identifiers), + Base of memory window (in HEX if using string identifiers), + +Samples: + append="digi=E,PC/Xi,D,16,200,D0000" + append="digi=1,0,0,16,512,(whatever D0000 is in base 10 :) + +Driver's minor device numbers are conserved. This means that instead of +each board getting a block of 16 minors pre-assigned, it gets however +many it should, with the next card following directly behind it. A +system with 4 2-port PC/Xi boards will use minor numbers 0-7. +This conserves some memory, and removes a few hard coded constants. + +NOTE!! NOTE!! NOTE!! +The definition of PC/Xem as a valid board type is the BEGINNING of support +for this device. The driver does not currently recognise the board, nor +does it want to initialize it. At least not the EISA version. + +Mike McLagan 5, April 1996. diff -u --recursive --new-file v2.1.82/linux/arch/i386/kernel/i386_ksyms.c linux/arch/i386/kernel/i386_ksyms.c --- v2.1.82/linux/arch/i386/kernel/i386_ksyms.c Fri Jan 30 11:28:06 1998 +++ linux/arch/i386/kernel/i386_ksyms.c Tue Jan 27 10:34:29 1998 @@ -74,6 +74,7 @@ /* Global SMP irq stuff */ EXPORT_SYMBOL(synchronize_irq); EXPORT_SYMBOL(synchronize_bh); +EXPORT_SYMBOL(global_bh_count); EXPORT_SYMBOL(global_bh_lock); EXPORT_SYMBOL(global_irq_holder); EXPORT_SYMBOL(__global_cli); diff -u --recursive --new-file v2.1.82/linux/arch/i386/kernel/irq.c linux/arch/i386/kernel/irq.c --- v2.1.82/linux/arch/i386/kernel/irq.c Fri Jan 30 11:28:06 1998 +++ linux/arch/i386/kernel/irq.c Fri Jan 30 11:16:03 1998 @@ -421,7 +421,19 @@ { int count = MAXCOUNT; - while (atomic_read(&global_irq_count)) { + for (;;) { + + /* + * Wait until all interrupts are gone. Wait + * for bottom half handlers unless we're + * already executing in one.. + */ + if (!atomic_read(&global_irq_count)) { + if (local_bh_count[cpu] || !atomic_read(&global_bh_count)) + break; + } + + /* Duh, we have to loop. Release the lock to avoid deadlocks */ clear_bit(0,&global_irq_lock); for (;;) { @@ -437,6 +449,8 @@ continue; if (global_irq_lock) continue; + if (!local_bh_count[cpu] && atomic_read(&global_bh_count)) + continue; if (!test_and_set_bit(0,&global_irq_lock)) break; } @@ -470,9 +484,11 @@ */ void synchronize_irq(void) { - /* Stupid approach */ - cli(); - sti(); + if (atomic_read(&global_irq_count)) { + /* Stupid approach */ + cli(); + sti(); + } } static inline void get_irqlock(int cpu) diff -u --recursive --new-file v2.1.82/linux/arch/i386/lib/checksum.c linux/arch/i386/lib/checksum.c --- v2.1.82/linux/arch/i386/lib/checksum.c Tue Oct 14 18:24:09 1997 +++ linux/arch/i386/lib/checksum.c Tue Jan 27 17:58:56 1998 @@ -208,7 +208,7 @@ # Exception handler: ################################################ # -.section .fixup, \"a\" # +.section .fixup, \"ax\" # # 6000: # # diff -u --recursive --new-file v2.1.82/linux/drivers/block/ide.c linux/drivers/block/ide.c --- v2.1.82/linux/drivers/block/ide.c Sat Jan 10 10:42:55 1998 +++ linux/drivers/block/ide.c Tue Jan 27 18:03:48 1998 @@ -2790,6 +2790,7 @@ EXPORT_SYMBOL(ide_fops); EXPORT_SYMBOL(ide_get_queue); EXPORT_SYMBOL(do_ide0_request); +EXPORT_SYMBOL(ide_add_generic_settings); #if MAX_HWIFS > 1 EXPORT_SYMBOL(do_ide1_request); #endif /* MAX_HWIFS > 1 */ diff -u --recursive --new-file v2.1.82/linux/drivers/net/Makefile linux/drivers/net/Makefile --- v2.1.82/linux/drivers/net/Makefile Mon Jan 5 01:41:01 1998 +++ linux/drivers/net/Makefile Tue Jan 27 11:36:53 1998 @@ -34,7 +34,7 @@ ifeq ($(CONFIG_ISDN),m) ifeq ($(CONFIG_ISDN_PPP),y) CONFIG_SLHC_MODULE = y - CONFIG_PPPDEF_BUILTIN = y + CONFIG_PPPDEF_MODULE = y endif endif endif @@ -185,8 +185,11 @@ endif endif +# bsd_comp.o is *always* a module, for some undocumented reason +# (perhaps licensing). ifeq ($(CONFIG_PPP),y) LX_OBJS += ppp.o +M_OBJS += bsd_comp.o CONFIG_SLHC_BUILTIN = y CONFIG_PPPDEF_BUILTIN = y else @@ -194,13 +197,10 @@ CONFIG_SLHC_MODULE = y CONFIG_PPPDEF_MODULE = y MX_OBJS += ppp.o + M_OBJS += bsd_comp.o endif endif -ifdef CONFIG_PPP - M_OBJS += bsd_comp.o ppp_deflate.o -endif - ifeq ($(CONFIG_SLIP),y) L_OBJS += slip.o ifeq ($(CONFIG_SLIP_COMPRESSED),y) @@ -563,9 +563,11 @@ endif # if anything built-in uses ppp_deflate, then build it into the kernel also. -# If not, but a module uses it, build as a module: +# If not, but a module uses it, build as a module. +# ... NO!!! ppp_deflate.o does not work as resident; +# it works only as a module! ifdef CONFIG_PPPDEF_BUILTIN -LX_OBJS += ppp_deflate.o +MX_OBJS += ppp_deflate.o else ifdef CONFIG_PPPDEF_MODULE MX_OBJS += ppp_deflate.o diff -u --recursive --new-file v2.1.82/linux/drivers/sound/dmabuf.c linux/drivers/sound/dmabuf.c --- v2.1.82/linux/drivers/sound/dmabuf.c Tue Jan 20 16:44:57 1998 +++ linux/drivers/sound/dmabuf.c Tue Jan 27 10:30:52 1998 @@ -117,35 +117,32 @@ static unsigned int default_set_bits(int dev, unsigned int bits) { mm_segment_t fs = get_fs(); - unsigned int r; set_fs(get_ds()); - r = audio_devs[dev]->d->ioctl(dev, SNDCTL_DSP_SETFMT, (caddr_t)&bits); + audio_devs[dev]->d->ioctl(dev, SNDCTL_DSP_SETFMT, (caddr_t)&bits); set_fs(fs); - return r; + return bits; } static int default_set_speed(int dev, int speed) { mm_segment_t fs = get_fs(); - int r; set_fs(get_ds()); - r = audio_devs[dev]->d->ioctl(dev, SNDCTL_DSP_SPEED, (caddr_t)&speed); + audio_devs[dev]->d->ioctl(dev, SNDCTL_DSP_SPEED, (caddr_t)&speed); set_fs(fs); - return r; + return speed; } static short default_set_channels(int dev, short channels) { int c = channels; mm_segment_t fs = get_fs(); - short r; set_fs(get_ds()); - r = audio_devs[dev]->d->ioctl(dev, SNDCTL_DSP_CHANNELS, (caddr_t)&c); + audio_devs[dev]->d->ioctl(dev, SNDCTL_DSP_CHANNELS, (caddr_t)&c); set_fs(fs); - return r; + return c; } static void check_driver(struct audio_driver *d) diff -u --recursive --new-file v2.1.82/linux/drivers/sound/local.h.master linux/drivers/sound/local.h.master --- v2.1.82/linux/drivers/sound/local.h.master Tue Dec 23 13:52:02 1997 +++ linux/drivers/sound/local.h.master Tue Jan 27 10:30:52 1998 @@ -19,10 +19,12 @@ defined(CONFIG_GUSMAX) || defined(CONFIG_MSS) || \ defined(CONFIG_SSCAPE) || defined(CONFIG_TRIX) || \ defined(CONFIG_MAD16) || defined(CONFIG_CS4232) || \ + defined(CONFIG_OPL3SA1) || \ defined(CONFIG_PSS_MODULE) || defined(CONFIG_GUS16_MODULE) || \ defined(CONFIG_GUSMAX_MODULE) || defined(CONFIG_MSS_MODULE) || \ defined(CONFIG_SSCAPE_MODULE) || defined(CONFIG_TRIX_MODULE) || \ - defined(CONFIG_MAD16_MODULE) || defined(CONFIG_CS4232_MODULE) + defined(CONFIG_MAD16_MODULE) || defined(CONFIG_CS4232_MODULE) || \ + defined(CONFIG_OPL3SA1_MODULE) # define CONFIG_AD1848 #endif @@ -96,13 +98,13 @@ defined(CONFIG_MPU401) || defined(CONFIG_PSS) || \ defined(CONFIG_SSCAPE) || defined(CONFIG_TRIX) || \ defined(CONFIG_MAD16) || defined(CONFIG_CS4232) || \ - defined(CONFIG_MAUI) || \ + defined(CONFIG_MAUI) || defined(CONFIG_OPL3SA1) || \ defined(CONFIG_PAS_MODULE) || defined(CONFIG_SB_MODULE) || \ defined(CONFIG_ADLIB_MODULE) || defined(CONFIG_GUS_MODULE) || \ defined(CONFIG_MPU401_MODULE) || defined(CONFIG_PSS_MODULE) || \ defined(CONFIG_SSCAPE_MODULE) || defined(CONFIG_TRIX_MODULE) || \ defined(CONFIG_MAD16_MODULE) || defined(CONFIG_CS4232_MODULE) || \ - defined(CONFIG_MAUI_MODULE) + defined(CONFIG_MAUI_MODULE) || defined(CONFIG_OPL3SA1_MODULE) # define CONFIG_SEQUENCER #endif diff -u --recursive --new-file v2.1.82/linux/fs/ext2/file.c linux/fs/ext2/file.c --- v2.1.82/linux/fs/ext2/file.c Tue Oct 21 08:57:29 1997 +++ linux/fs/ext2/file.c Tue Jan 27 09:22:46 1998 @@ -33,9 +33,6 @@ #define MIN(a,b) (((a)<(b))?(a):(b)) #define MAX(a,b) (((a)>(b))?(a):(b)) -#include -#include - static long long ext2_file_lseek(struct file *, long long, int); static ssize_t ext2_file_write (struct file *, const char *, size_t, loff_t *); static int ext2_release_file (struct inode *, struct file *); diff -u --recursive --new-file v2.1.82/linux/fs/proc/root.c linux/fs/proc/root.c --- v2.1.82/linux/fs/proc/root.c Fri Jan 30 11:28:09 1998 +++ linux/fs/proc/root.c Thu Jan 29 10:40:53 1998 @@ -499,7 +499,7 @@ S_IFREG | S_IRUGO, 1, 0, 0, 0, &proc_array_inode_operations }; -#ifdef CONFIG_PCI +#ifdef CONFIG_PCI_OLD_PROC static struct proc_dir_entry proc_root_pci = { PROC_PCI, 3, "pci", S_IFREG | S_IRUGO, 1, 0, 0, @@ -647,7 +647,7 @@ proc_register(&proc_root, &proc_root_meminfo); proc_register(&proc_root, &proc_root_kmsg); proc_register(&proc_root, &proc_root_version); -#ifdef CONFIG_PCI +#ifdef CONFIG_PCI_OLD_PROC proc_register(&proc_root, &proc_root_pci); #endif #ifdef CONFIG_ZORRO diff -u --recursive --new-file v2.1.82/linux/include/asm-i386/hardirq.h linux/include/asm-i386/hardirq.h --- v2.1.82/linux/include/asm-i386/hardirq.h Fri Jan 23 18:10:32 1998 +++ linux/include/asm-i386/hardirq.h Fri Jan 30 10:29:40 1998 @@ -4,7 +4,6 @@ #include extern unsigned int local_irq_count[NR_CPUS]; -#define in_interrupt() (local_irq_count[smp_processor_id()] != 0) #ifndef __SMP__ @@ -47,26 +46,10 @@ static inline int hardirq_trylock(int cpu) { - unsigned long flags; - - __save_flags(flags); - __cli(); - atomic_inc(&global_irq_count); - if (atomic_read(&global_irq_count) != 1 || test_bit(0,&global_irq_lock)) { - atomic_dec(&global_irq_count); - __restore_flags(flags); - return 0; - } - ++local_irq_count[cpu]; - return 1; + return !atomic_read(&global_irq_count) && !test_bit(0,&global_irq_lock); } -static inline void hardirq_endlock(int cpu) -{ - __cli(); - hardirq_exit(cpu); - __sti(); -} +#define hardirq_endlock(cpu) do { } while (0) extern void synchronize_irq(void); diff -u --recursive --new-file v2.1.82/linux/include/asm-i386/softirq.h linux/include/asm-i386/softirq.h --- v2.1.82/linux/include/asm-i386/softirq.h Fri Jan 30 11:28:09 1998 +++ linux/include/asm-i386/softirq.h Fri Jan 30 10:43:31 1998 @@ -5,7 +5,6 @@ #include extern unsigned int local_bh_count[NR_CPUS]; -#define in_bh() (local_bh_count[smp_processor_id()] != 0) #define get_active_bhs() (bh_mask & bh_active) #define clear_active_bhs(x) atomic_clear_mask((x),&bh_active) @@ -54,26 +53,20 @@ /* These are for the irq's testing the lock */ static inline int softirq_trylock(int cpu) { - unsigned long flags; - - __save_flags(flags); - __cli(); - atomic_inc(&global_bh_count); - if (atomic_read(&global_bh_count) != 1 || atomic_read(&global_bh_lock) != 0) { - atomic_dec(&global_bh_count); - __restore_flags(flags); - return 0; + if (!test_and_set_bit(0,&global_bh_count)) { + if (atomic_read(&global_bh_lock) == 0) { + ++local_bh_count[cpu]; + return 1; + } + clear_bit(0,&global_bh_count); } - ++local_bh_count[cpu]; - return 1; + return 0; } static inline void softirq_endlock(int cpu) { - __cli(); - atomic_dec(&global_bh_count); local_bh_count[cpu]--; - __sti(); + clear_bit(0,&global_bh_count); } #else @@ -91,8 +84,8 @@ } /* These are for the irq's testing the lock */ -#define softirq_trylock(cpu) (in_bh() ? 0 : (local_bh_count[smp_processor_id()]=1)) -#define softirq_endlock(cpu) (local_bh_count[smp_processor_id()] = 0) +#define softirq_trylock(cpu) (local_bh_count[cpu] ? 0 : (local_bh_count[cpu]=1)) +#define softirq_endlock(cpu) (local_bh_count[cpu] = 0) #define synchronize_bh() do { } while (0) #endif /* SMP */ diff -u --recursive --new-file v2.1.82/linux/include/linux/interrupt.h linux/include/linux/interrupt.h --- v2.1.82/linux/include/linux/interrupt.h Tue Jan 20 16:51:57 1998 +++ linux/include/linux/interrupt.h Fri Jan 30 10:43:31 1998 @@ -49,6 +49,12 @@ #include /* + * Are we in an interrupt context? Either doing bottom half + * or hardware interrupt processing? + */ +#define in_interrupt() (local_irq_count[smp_processor_id()] + local_bh_count[smp_processor_id()] != 0) + +/* * Autoprobing for irqs: * * probe_irq_on() and probe_irq_off() provide robust primitives diff -u --recursive --new-file v2.1.82/linux/kernel/sched.c linux/kernel/sched.c --- v2.1.82/linux/kernel/sched.c Mon Jan 12 14:46:27 1998 +++ linux/kernel/sched.c Thu Jan 29 18:08:28 1998 @@ -389,6 +389,8 @@ this_cpu = smp_processor_id(); if (local_irq_count[this_cpu]) goto scheduling_in_interrupt; + if (local_bh_count[this_cpu]) + goto scheduling_in_interrupt; release_kernel_lock(prev, this_cpu, lock_depth); if (bh_active & bh_mask) do_bottom_half();