diff -u --recursive --new-file v2.0.4/linux/CREDITS linux/CREDITS
--- v2.0.4/linux/CREDITS	Sat Jul  6 14:51:22 1996
+++ linux/CREDITS	Wed Jul 10 13:11:15 1996
@@ -26,9 +26,11 @@
 S: Switzerland
 
 N: H. Peter Anvin
-E: Peter.Anvin@linux.org 
+E: hpa@zytor.com
+W: http://www.zytor.com/~hpa/
+P: 2047/2A960705 BA 03 D3 2C 14 A8 A8 BD  1E DF FE 69 EE 35 BD 74
 D: Author of the SYSLINUX boot loader, maintainer of the linux.* news
-D: hierarchy, responsible for various console and other hacks
+D: hierarchy and the Linux Device List; various kernel hacks
 S: 4390 Albany Dr. #46
 S: San Jose CA 95129
 S: USA
@@ -886,11 +888,11 @@
 
 N: Nigel Metheringham
 E: Nigel.Metheringham@ThePLAnet.net
+P: 1024/31455639 B7 99 BD B8 00 17 BD 46  C1 15 B8 AB 87 BC 25 FA
 D: IP Masquerading work and minor fixes
 S: Planet Online
 S: The White House, Melbourne Street, LEEDS
 S: LS2  7PS,   UK
-P: 1024/31455639 B7 99 BD B8 00 17 BD 46  C1 15 B8 AB 87 BC 25 FA
 
 N: Craig Metz
 E: cmetz@tjhsst.edu
@@ -1242,8 +1244,8 @@
 
 N: Leo Spiekman
 E: spiekman@et.tudelft.nl
-D: Optics Storage 8000AT cdrom driver
 W: http://dutettk.et.tudelft.nl/~spiekman
+D: Optics Storage 8000AT cdrom driver
 S: Utrecht
 S: The Netherlands
 
@@ -1258,13 +1260,13 @@
 S: Denmark
 
 N: Drew Sullivan
-W: http://www.ss.org/
 E: drew@ss.org
+W: http://www.ss.org/
+P: 1024/ACFFA969 5A 9C 42 AB E4 24 82 31  99 56 00 BF D3 2B 25 46
 D: iBCS2 developer
 S: 22 Irvington Cres.
 S: Willowdale, Ontario
 S: Canada M2N 2Z1
-P: 1024/ACFFA969 5A 9C 42 AB E4 24 82 31  99 56 00 BF D3 2B 25 46
 
 N: Tommy Thorn
 E: Tommy.Thorn@irisa.fr
diff -u --recursive --new-file v2.0.4/linux/Documentation/devices.tex linux/Documentation/devices.tex
--- v2.0.4/linux/Documentation/devices.tex	Wed Jul  3 22:05:06 1996
+++ linux/Documentation/devices.tex	Wed Jul 10 13:11:40 1996
@@ -42,7 +42,7 @@
 %
 \title{{\bf Linux Allocated Devices}}
 \author{Maintained by H. Peter Anvin $<$hpa@zytor.com$>$}
-\date{Last revised: June 9, 1996}
+\date{Last revised: July 9, 1996}
 \maketitle
 %
 \noindent
@@ -64,7 +64,9 @@
 where that applies (e.g.\ busmice), please contact me with the
 appropriate device information.  Also, if you have additional
 information regarding any of the devices listed below, or if I have
-made a mistake, I would greatly appreciate a note.
+made a mistake, I would greatly appreciate a note.  When sending me
+mail, please include the word ``device'' in the subject so your mail
+won't accidentally get buried!
 
 Allocations marked (68k/Amiga) apply to Linux/68k on the Amiga
 platform only.  Allocations marked (68k/Atari) apply to Linux/68k on
@@ -163,6 +165,7 @@
 \major{40}{}{char }{Matrox Meteor frame grabber}
 \major{  }{}{block}{Syquest EZ135 parallel port removable drive}
 \major{41}{}{char }{Yet Another Micro Monitor}
+\major{  }{}{block}{MicroSolutions BackPack parallel port CD-ROM}
 \major{42}{}{}{Demo/sample use}
 \major{43}{}{char }{isdn4linux virtual modem}
 \major{44}{}{char }{isdn4linux virtual modem -- alternate devices}
@@ -175,7 +178,8 @@
 \major{51}{}{char }{Baycom radio modem}
 \major{52}{}{char }{Spellcaster DataComm/BRI ISDN card}
 \major{53}{}{char }{BDM interface for remote debugging MC683xx microcontrollers}
-\major{54}{--59}{}{Unallocated}
+\major{54}{}{char }{Electrocardiognosis Holter serial card}
+\major{55}{--59}{}{Unallocated}
 \major{60}{--63}{}{Local/experimental use}
 \major{64}{--119}{}{Unallocated}
 \major{120}{--127}{}{Local/experimental use}
@@ -460,6 +464,7 @@
 	\minor{136}{/dev/qcam0}{QuickCam on {\file lp0}}
 	\minor{137}{/dev/qcam1}{QuickCam on {\file lp1}}
 	\minor{138}{/dev/qcam2}{QuickCam on {\file lp2}}
+	\minor{139}{/dev/openprom}{SPARC OpenBoot PROM}
 \end{devicelist}
 
 \noindent
@@ -989,6 +994,9 @@
 \begin{devicelist}
 \major{41}{}{char }{Yet Another Micro Monitor}
 	\minor{0}{/dev/yamm}{Yet Another Micro Monitor}
+\\
+\major{  }{}{block}{MicroSolutions BackPack parallel port CD-ROM}
+	\minor{0}{/dev/bpcd}{BackPack CD-ROM}
 \end{devicelist}
 
 \begin{devicelist}
@@ -1096,7 +1104,19 @@
 commercial interface by P\&E.
 
 \begin{devicelist}
-\major{54}{--59}{}{Unallocated}
+\major{54}{Electrocardiognosis Holter serial card}
+	\minor{0}{/dev/holter0}{First Holter port}
+	\minor{1}{/dev/holter1}{Second Holter port}
+	\minor{2}{/dev/holter2}{Third Holter port}
+\end{devicelist}
+
+\noindent
+A custom serial card used by Electrocardiognosis SRL
+$<$mseritan@ottonel.pub.ro$>$ to transfer data from Holter 24-hour
+heart monitoring equipment.
+
+\begin{devicelist}
+\major{55}{--59}{}{Unallocated}
 \end{devicelist}
 
 \begin{devicelist}
diff -u --recursive --new-file v2.0.4/linux/Documentation/devices.txt linux/Documentation/devices.txt
--- v2.0.4/linux/Documentation/devices.txt	Wed Jul  3 22:05:06 1996
+++ linux/Documentation/devices.txt	Wed Jul 10 13:11:44 1996
@@ -2,7 +2,7 @@
 
 	     Maintained by H. Peter Anvin <hpa@zytor.com>
 
-		      Last revised: June 9, 1996
+		     Last revised: July 9, 1996
 
 This list is the successor to Rick Miller's Linux Device List, which
 he stopped maintaining when he got busy with other things in 1993.  It
@@ -21,7 +21,9 @@
 where that applies (e.g. busmice), please contact me with the
 appropriate device information.  Also, if you have additional
 information regarding any of the devices listed below, or if I have
-made a mistake, I would greatly appreciate a note.
+made a mistake, I would greatly appreciate a note.  When sending me
+mail, please include the word "device" in the subject so your mail
+won't accidentally get buried!
 
 Allocations marked (68k/Amiga) apply to Linux/68k on the Amiga
 platform only.  Allocations marked (68k/Atari) apply to Linux/68k on
@@ -278,6 +280,7 @@
 		136 = /dev/qcam0	QuickCam on lp0
 		137 = /dev/qcam1	QuickCam on lp1
 		138 = /dev/qcam2	QuickCam on lp2
+		139 = /dev/openprom	SPARC OpenBoot PROM
 
  11 char	Raw keyboard device
 		  0 = /dev/kbd		Raw keyboard device
@@ -689,6 +692,8 @@
 
  41 char	Yet Another Micro Monitor
 		  0 = /dev/yamm		Yet Another Micro Monitor
+    block	MicroSolutions BackPack parallel port CD-ROM
+		  0 = /dev/bpcd		BackPack CD-ROM
 
  42		Demo/sample use
 
@@ -771,7 +776,16 @@
 		Domain Interface and ICD is the commercial interface
 		by P&E.
 
- 54-59		UNALLOCATED
+ 54 char	Electrocardiognosis Holter serial card
+		  0 = /dev/holter0	First Holter port
+		  1 = /dev/holter1	Second Holter port
+		  2 = /dev/holter2	Third Holter port
+
+		A custom serial card used by Electrocardiognosis SRL
+		<mseritan@ottonel.pub.ro> to transfer data from Holter
+		24-hour heart monitoring equipment.
+
+ 55-59		UNALLOCATED
 
  60-63		LOCAL/EXPERIMENTAL USE
 		Allocated for local/experimental use.  For devices not
diff -u --recursive --new-file v2.0.4/linux/Makefile linux/Makefile
--- v2.0.4/linux/Makefile	Mon Jul  8 16:09:50 1996
+++ linux/Makefile	Mon Jul  8 16:10:46 1996
@@ -1,6 +1,6 @@
 VERSION = 2
 PATCHLEVEL = 0
-SUBLEVEL = 4
+SUBLEVEL = 5
 
 ARCH = i386
 
diff -u --recursive --new-file v2.0.4/linux/arch/alpha/boot/Makefile linux/arch/alpha/boot/Makefile
--- v2.0.4/linux/arch/alpha/boot/Makefile	Sat Mar 16 13:52:12 1996
+++ linux/arch/alpha/boot/Makefile	Tue Jul  9 08:37:20 1996
@@ -56,7 +56,7 @@
 
 vmlinux: $(TOPDIR)/vmlinux
 	cp $(TOPDIR)/vmlinux vmlinux
-	quickstrip vmlinux
+	strip vmlinux
 
 tools/lxboot: tools/build
 	tools/build > tools/lxboot
diff -u --recursive --new-file v2.0.4/linux/arch/alpha/config.in linux/arch/alpha/config.in
--- v2.0.4/linux/arch/alpha/config.in	Sat Jul  6 12:07:12 1996
+++ linux/arch/alpha/config.in	Tue Jul  9 08:08:18 1996
@@ -82,7 +82,7 @@
 	define_bool CONFIG_ALPHA_AVANTI y
 fi
 
-bool 'Echo console messages on /dev/ttyS1' CONFIG_SERIAL_ECHO
+bool 'Echo console messages on /dev/ttyS0 (COM1)' CONFIG_SERIAL_ECHO
 if [ "$CONFIG_PCI" = "y" ]; then
   bool 'TGA Console Support' CONFIG_TGA_CONSOLE
   if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
diff -u --recursive --new-file v2.0.4/linux/arch/alpha/kernel/apecs.c linux/arch/alpha/kernel/apecs.c
--- v2.0.4/linux/arch/alpha/kernel/apecs.c	Wed Jun  5 10:41:27 1996
+++ linux/arch/alpha/kernel/apecs.c	Tue Jul  9 08:08:18 1996
@@ -491,27 +491,30 @@
 			 struct pt_regs * regs)
 {
 	struct el_common *mchk_header;
+	struct el_procdata *mchk_procdata;
 	struct el_apecs_sysdata_mcheck *mchk_sysdata;
+	unsigned long *ptr;
+	int i;
 
-	mchk_header = (struct el_common *)la_ptr;
 
+	mchk_header = (struct el_common *)la_ptr;
+	mchk_procdata = (struct el_procdata *)
+	  (la_ptr + mchk_header->proc_offset - sizeof(mchk_procdata->paltemp));
 	mchk_sysdata = 
 	  (struct el_apecs_sysdata_mcheck *)(la_ptr + mchk_header->sys_offset);
 
-	DBG(("apecs_machine_check: vector=0x%lx la_ptr=0x%lx\n", vector, la_ptr));
-	DBG(("                     pc=0x%lx size=0x%x procoffset=0x%x sysoffset 0x%x\n",
-	     regs->pc, mchk_header->size, mchk_header->proc_offset, mchk_header->sys_offset));
-	DBG(("apecs_machine_check: expected %d DCSR 0x%lx PEAR 0x%lx\n",
-	     apecs_mcheck_expected, mchk_sysdata->epic_dcsr, mchk_sysdata->epic_pear));
 #ifdef DEBUG
-	{
-	    unsigned long *ptr;
-	    int i;
-
-	    ptr = (unsigned long *)la_ptr;
-	    for (i = 0; i < mchk_header->size / sizeof(long); i += 2) {
+	printk("apecs_machine_check: vector=0x%lx la_ptr=0x%lx\n",
+	       vector, la_ptr);
+	printk("        pc=0x%lx size=0x%x procoffset=0x%x sysoffset 0x%x\n",
+	       regs->pc, mchk_header->size, mchk_header->proc_offset,
+	       mchk_header->sys_offset);
+	printk("apecs_machine_check: expected %d DCSR 0x%lx PEAR 0x%lx\n",
+	       apecs_mcheck_expected, mchk_sysdata->epic_dcsr,
+	       mchk_sysdata->epic_pear);
+	ptr = (unsigned long *)la_ptr;
+	for (i = 0; i < mchk_header->size / sizeof(long); i += 2) {
 		printk(" +%lx %lx %lx\n", i*sizeof(long), ptr[i], ptr[i+1]);
-	    }
 	}
 #endif /* DEBUG */
 
@@ -520,9 +523,13 @@
 	 * ignore the machine check.
 	 */
 #ifdef CONFIG_ALPHA_MIKASA
-	/* for now on MIKASA, if it was expected, ignore it */
-	/* we need the details of the mcheck frame to really know... */
-	if (apecs_mcheck_expected) {
+#define MCHK_NO_DEVSEL 0x205L
+#define MCHK_NO_TABT 0x204L
+	if (apecs_mcheck_expected &&
+	    (((unsigned int)mchk_procdata->paltemp[0] == MCHK_NO_DEVSEL) ||
+	     ((unsigned int)mchk_procdata->paltemp[0] == MCHK_NO_TABT))
+	    )
+	{
 #else
 	if (apecs_mcheck_expected && (mchk_sysdata->epic_dcsr && 0x0c00UL)) {
 #endif
@@ -534,7 +541,33 @@
 		wrmces(0x7);
 		mb();
 		draina();
+		DBG(("apecs_machine_check: EXPECTED\n"));
+	}
+	else if (vector == 0x620 || vector == 0x630) {
+		wrmces(0x1f); /* disable correctable from now on */
+		mb();
+		draina();
+		printk("apecs_machine_check: HW correctable (0x%lx)\n", vector);
+	}
+	else {
+		printk("APECS machine check:\n");
+		printk("  vector=0x%lx la_ptr=0x%lx\n",
+		       vector, la_ptr);
+		printk("  pc=0x%lx size=0x%x procoffset=0x%x sysoffset 0x%x\n",
+		       regs->pc, mchk_header->size, mchk_header->proc_offset,
+		       mchk_header->sys_offset);
+		printk("  expected %d DCSR 0x%lx PEAR 0x%lx\n",
+		       apecs_mcheck_expected, mchk_sysdata->epic_dcsr,
+		       mchk_sysdata->epic_pear);
+
+		ptr = (unsigned long *)la_ptr;
+		for (i = 0; i < mchk_header->size / sizeof(long); i += 2) {
+		    printk(" +%lx %lx %lx\n", i*sizeof(long), ptr[i], ptr[i+1]);
+		}
+#if 0
+		/* doesn't work with MILO */
+		show_regs(regs);
+#endif
 	}
 }
-
 #endif /* CONFIG_ALPHA_APECS */
diff -u --recursive --new-file v2.0.4/linux/arch/alpha/kernel/irq.c linux/arch/alpha/kernel/irq.c
--- v2.0.4/linux/arch/alpha/kernel/irq.c	Wed Jul  3 22:05:07 1996
+++ linux/arch/alpha/kernel/irq.c	Tue Jul  9 08:08:18 1996
@@ -446,6 +446,41 @@
 	restore_flags(flags);
 }
 
+static inline void mikasa_device_interrupt(unsigned long vector,
+					   struct pt_regs * regs)
+{
+	unsigned long pld;
+	unsigned int i;
+	unsigned long flags;
+
+	save_flags(flags);
+	cli();
+
+        /* read the interrupt summary registers */
+        pld = (((unsigned long) (~inw(0x534)) & 0x0000ffffUL) << 16) |
+	       (((unsigned long) inb(0xa0))  <<  8) |
+	       ((unsigned long) inb(0x20));
+
+#if 0
+        printk("[0x%08lx]", pld);
+#endif
+
+        /*
+         * Now for every possible bit set, work through them and call
+         * the appropriate interrupt handler.
+         */
+        while (pld) {
+		i = ffz(~pld);
+		pld &= pld - 1; /* clear least bit set */
+		if (i < 16) {
+			isa_device_interrupt(vector, regs);
+		} else {
+			device_interrupt(i, i, regs);
+		}
+        }
+	restore_flags(flags);
+}
+
 static inline void eb66_and_eb64p_device_interrupt(unsigned long vector,
 						   struct pt_regs * regs)
 {
@@ -622,12 +657,10 @@
 			srm_device_interrupt(vector, &regs);
 #elif NR_IRQS == 33
 			cabriolet_and_eb66p_device_interrupt(vector, &regs);
+#elif defined(CONFIG_ALPHA_MIKASA)
+			mikasa_device_interrupt(vector, &regs);
 #elif NR_IRQS == 32
-# ifdef CONFIG_ALPHA_MIKASA
-#	error  we got a problem here Charlie MIKASA should be SRM console
-# else
 			eb66_and_eb64p_device_interrupt(vector, &regs);
-# endif
 #elif NR_IRQS == 16
 			isa_device_interrupt(vector, &regs);
 #endif
diff -u --recursive --new-file v2.0.4/linux/arch/i386/boot/tools/build.c linux/arch/i386/boot/tools/build.c
--- v2.0.4/linux/arch/i386/boot/tools/build.c	Sat Mar  9 13:31:43 1996
+++ linux/arch/i386/boot/tools/build.c	Wed Jul 10 13:10:59 1996
@@ -19,6 +19,7 @@
 /*
  * Changes by tytso to allow root device specification
  * High loaded stuff by Hans Lermen & Werner Almesberger, Feb. 1996
+ * Cross compiling fixes by Gertjan van Wingerde, July 1996
  */
 
 #include <stdio.h>	/* fprintf */
@@ -56,6 +57,7 @@
 #define STRINGIFY(x) #x
 
 typedef union {
+	int i;
 	long l;
 	short s[2];
 	char b[4];
@@ -72,6 +74,17 @@
 	return t.l;
 }
 
+int intel_int(int i)
+{
+	conv t;
+
+	t.b[0] = i & 0xff; i >>= 8;
+        t.b[1] = i & 0xff; i >>= 8;
+        t.b[2] = i & 0xff; i >>= 8;
+        t.b[3] = i & 0xff; i >>= 8;
+        return t.i;
+}
+
 short intel_short(short l)
 {
 	conv t;
@@ -94,8 +107,8 @@
 
 int main(int argc, char ** argv)
 {
-	int i,c,id, sz;
-	unsigned long sys_size;
+	int i,c,id,sz,tmp_int;
+	unsigned long sys_size, tmp_long;
 	char buf[1024];
 #ifndef __BFD__
 	struct exec *ex = (struct exec *)buf;
@@ -180,12 +193,17 @@
 #ifdef __BIG_KERNEL__
 	{
 		if (!i) {
-			if (*((long *)(&buf[2])) != 0x53726448 )
+			/* Working with memcpy because of alignment constraints
+			   on Sparc - Gertjan */
+			memcpy(&tmp_long, &buf[2], sizeof(long));
+			if (tmp_long != intel_long(0x53726448) )
 				die("Wrong magic in loader header of 'setup'");
-			if (*((int *)(&buf[6])) < 0x200 )
+			memcpy(&tmp_int, &buf[6], sizeof(int));
+			if (tmp_int < intel_int(0x200))
 				die("Wrong version of loader header of 'setup'");
 			buf[0x11] = 1; /* LOADED_HIGH */
-			*((long *)(&buf[0x14])) = 0x100000; /* code32_start */
+			tmp_long = intel_long(0x100000);
+			memcpy(&buf[0x14], &tmp_long, sizeof(long));  /* code32_start */
 		}
 #endif
 		if (write(1,buf,c)!=c)
diff -u --recursive --new-file v2.0.4/linux/drivers/block/ide-cd.c linux/drivers/block/ide-cd.c
--- v2.0.4/linux/drivers/block/ide-cd.c	Mon Jul  8 16:09:52 1996
+++ linux/drivers/block/ide-cd.c	Wed Jul 10 13:11:15 1996
@@ -104,6 +104,7 @@
  *                        from Ben Galliart <bgallia@luc.edu> with 
  *                        special help from Jeff Lightfoot 
  *                        <jeffml@netcom.com>
+ * 3.15a July 9, 1996 -- Improved Sanyo 3 CD changer identification
  *
  * NOTE: Direct audio reads will only work on some types of drive.
  * So far, i've received reports of success for Sony and Toshiba drives.
@@ -2657,7 +2658,8 @@
 
 		/* Sanyo 3 CD changer uses a non-standard command 
                    for CD changing */
-                else if (strcmp (drive->id->model, "CD-ROM CDR-C3 G") == 0) {
+                else if ((strcmp(drive->id->model, "CD-ROM CDR-C3 G") == 0) ||
+                         (strcmp(drive->id->model, "CD-ROM CDR-C3G") == 0)) {
 			/* uses CD in slot 0 when value is set to 3 */
 			CDROM_STATE_FLAGS (drive)->sanyo_slot = 3;
 		}
diff -u --recursive --new-file v2.0.4/linux/drivers/cdrom/cdrom.c linux/drivers/cdrom/cdrom.c
--- v2.0.4/linux/drivers/cdrom/cdrom.c	Mon May 13 23:02:47 1996
+++ linux/drivers/cdrom/cdrom.c	Wed Jul 10 13:10:59 1996
@@ -457,7 +457,7 @@
                 }
                 case CDROMPLAYMSF: {
                         struct cdrom_msf msf;
-                        GETARG(struct cdrom_mdf, msf);
+                        GETARG(struct cdrom_msf, msf);
                         return cdo->audio_ioctl(dev, cmd, &msf);
                 }
                 case CDROMPLAYTRKIND: {
@@ -467,13 +467,13 @@
                 }
                 case CDROMVOLCTRL: {
                         struct cdrom_volctrl volume;
-                        GETARG(struct cdrom_volctl, volume);
+                        GETARG(struct cdrom_volctrl, volume);
                         return cdo->audio_ioctl(dev, cmd, &volume);
                 }
                 case CDROMVOLREAD: {
                         struct cdrom_volctrl volume;
                         if (!cdo->audio_ioctl(dev, cmd, &volume)) {
-                                PUTARG(struct cdrom_volctl, volume);
+                                PUTARG(struct cdrom_volctrl, volume);
                                 return 0;
                         }
                         return -EINVAL;
diff -u --recursive --new-file v2.0.4/linux/drivers/net/de4x5.c linux/drivers/net/de4x5.c
--- v2.0.4/linux/drivers/net/de4x5.c	Wed Jul  3 22:05:10 1996
+++ linux/drivers/net/de4x5.c	Tue Jul  9 08:08:18 1996
@@ -1918,12 +1918,8 @@
 	break;
 	
       case NC:
-#ifndef __alpha__
+	/* default to TP for all */
 	reset_init_sia(dev, 0x8f01, 0xffff, 0x0000);
-#else
-	/* JAE: for Alpha, default to BNC/AUI, *not* TP */
-	reset_init_sia(dev, 0x8f09, 0x0705, 0x0006);
-#endif  /* i386 */
 	if (lp->media != lp->c_media) {
 	    de4x5_dbg_media(dev);
 	    lp->c_media = lp->media;
diff -u --recursive --new-file v2.0.4/linux/drivers/scsi/README.ncr53c8xx linux/drivers/scsi/README.ncr53c8xx
--- v2.0.4/linux/drivers/scsi/README.ncr53c8xx	Sat Jul  6 14:51:24 1996
+++ linux/drivers/scsi/README.ncr53c8xx	Wed Jul 10 13:11:16 1996
@@ -29,6 +29,7 @@
 14. Control commands under linux-1.2.13
 15. Known problems
       15.1 Tagged commands with Iomega Jaz device
+      15.2 Tagged command queueing cannot be disabled at run time
 
 ===============================================================================
 
@@ -189,8 +190,9 @@
 
 The profiling informations are updated upon completion of scsi commands.
 The data structure is allocated and zeroed when the host adapter is 
-attached. So, if the driver is a module you can reset the profiling data 
-by unloading and reloading the driver.
+attached. So, if the driver is a module, the profile counters are cleared each 
+time the driver is loaded.
+The "clearprof" command allow to clear these counters at any time.
 
 The following counters are available:
 ("num" prefix means "number of", "ms" means milli-seconds)
@@ -290,6 +292,7 @@
     target:    target number
     tags:      number of concurrent tagged commands
                must not be greater than SCSI_NCR_MAX_TAGS (default: 4)
+               must not be lower that 1 (see: known problems)
 
 8.4 Set order type for tagged command
 
@@ -316,10 +319,10 @@
 	tiny:    print minimal debugging informations
 	timing:  print timing informations of the ncr chip.
 	nego:    print informations about scsi negotiations
-        phase:   printf informations on script interruptions
+	phase:   print informations on script interruptions
 
 
-8.5 Clear profile counters
+8.6 Clear profile counters
 
     clearprof
 
@@ -555,6 +558,13 @@
 The other problems that may appear are timeouts. The only way to avoid timeouts 
 seems to edit linux/drivers/scsi/sd.c and to increase the current timeout 
 values.
+
+15.2 Tagged command queuing cannot be disabled at run time
+
+Once Tagged command queuing has been enabled, the driver will not allow to 
+disable this feature ("settags <target> 0" is not supported).
+This problem is due to some limitations of the code added to the Linux version 
+of the driver.
 
 ===============================================================================
 End of NCR53C8XX driver README file
diff -u --recursive --new-file v2.0.4/linux/drivers/scsi/eata.c linux/drivers/scsi/eata.c
--- v2.0.4/linux/drivers/scsi/eata.c	Fri Apr 19 10:07:59 1996
+++ linux/drivers/scsi/eata.c	Wed Jul 10 08:05:27 1996
@@ -1,6 +1,9 @@
 /*
  *      eata.c - Low-level driver for EATA/DMA SCSI host adapters.
  *
+ *      09 Jul 1996 rev. 2.11 for linux 2.0.4
+ *          Number of internal retries is now limited.
+ *
  *      16 Apr 1996 rev. 2.10 for linux 1.3.90
  *          New argument "reset_flags" to the reset routine.
  *
@@ -156,6 +159,7 @@
 #define MAX_BOARDS 18
 #define MAX_MAILBOXES 64
 #define MAX_SGLIST 64
+#define MAX_INTERNAL_RETRIES 64
 #define MAX_CMD_PER_LUN 2
 
 #define FALSE 0
@@ -313,6 +317,8 @@
    int in_reset;                        /* True if board is doing a reset */
    int target_time_out[MAX_TARGET];     /* N. of timeout errors on target */
    int target_reset[MAX_TARGET];        /* If TRUE redo operation on target */
+   unsigned int retries;                /* Number of internal retries */
+   unsigned long last_retried_pid;      /* Pid of last retried command */
    unsigned char subversion;            /* Bus type, either ISA or ESA */
    unsigned char protocol_rev;          /* EATA 2.0 rev., 'A' or 'B' or 'C' */
    struct mssp sp[MAX_MAILBOXES];       /* Returned status for this board */
@@ -802,6 +808,8 @@
       return SCSI_RESET_ERROR;
       }
 
+   HD(j)->retries = 0;
+
    for (k = 0; k < MAX_TARGET; k++) HD(j)->target_reset[k] = TRUE;
 
    for (k = 0; k < MAX_TARGET; k++) HD(j)->target_time_out[k] = 0;
@@ -1008,6 +1016,8 @@
    
 		  HD(j)->target_time_out[SCpnt->target] = 0;
    
+                  if (HD(j)->last_retried_pid == SCpnt->pid) HD(j)->retries = 0;
+
 		  break;
 	       case ASST:     /* Selection Time Out */
 	       case 0x02:     /* Command Time Out   */
@@ -1020,17 +1030,23 @@
 		     }
    
 		  break;
+
+               /* Perform a limited number of internal retries */
 	       case 0x03:     /* SCSI Bus Reset Received */
 	       case 0x04:     /* Initial Controller Power-up */
    
-		  if (SCpnt->device->type != TYPE_TAPE)
-		     status = DID_BUS_BUSY << 16;
-		  else
-		     status = DID_ERROR << 16;
-   
 		  for (k = 0; k < MAX_TARGET; k++) 
 		     HD(j)->target_reset[k] = TRUE;
    
+	          if (SCpnt->device->type != TYPE_TAPE
+                      && HD(j)->retries < MAX_INTERNAL_RETRIES) {
+		     status = DID_BUS_BUSY << 16;
+		     HD(j)->retries++;
+                     HD(j)->last_retried_pid = SCpnt->pid;
+                     }
+	          else 
+		     status = DID_ERROR << 16;
+
 		  break;
 	       case 0x07:     /* Bus Parity Error */
 	       case 0x0c:     /* Controller Ram Parity */
@@ -1058,7 +1074,7 @@
 		 spp->adapter_status != ASST && HD(j)->iocount <= 1000) ||
 		do_trace)
 #endif
-	       printk("%s: ihdlr, mbox %d, err 0x%x:%x,"\
+	       printk("%s: ihdlr, mbox %2d, err 0x%x:%x,"\
 		      " target %d:%d, pid %ld, count %d.\n",
 		      BN(j), i, spp->adapter_status, spp->target_status,
 		      SCpnt->target, SCpnt->lun, SCpnt->pid, HD(j)->iocount);
diff -u --recursive --new-file v2.0.4/linux/drivers/scsi/eata.h linux/drivers/scsi/eata.h
--- v2.0.4/linux/drivers/scsi/eata.h	Sun May  5 08:52:00 1996
+++ linux/drivers/scsi/eata.h	Wed Jul 10 08:05:27 1996
@@ -11,7 +11,7 @@
 int eata2x_abort(Scsi_Cmnd *);
 int eata2x_reset(Scsi_Cmnd *, unsigned int);
 
-#define EATA_VERSION "2.10.00"
+#define EATA_VERSION "2.11.00"
 
 
 #define EATA {                                                 \
diff -u --recursive --new-file v2.0.4/linux/drivers/scsi/ncr53c8xx.c linux/drivers/scsi/ncr53c8xx.c
--- v2.0.4/linux/drivers/scsi/ncr53c8xx.c	Mon Jul  8 16:09:54 1996
+++ linux/drivers/scsi/ncr53c8xx.c	Wed Jul 10 13:11:15 1996
@@ -8165,7 +8165,7 @@
 #endif
 	}
 	else {
-		if (*start)
+		if (start)
 			*start = buffer;
 		retv = ncr_host_info(ncb, buffer, offset, length);
 	}
diff -u --recursive --new-file v2.0.4/linux/drivers/scsi/qlogicisp.c linux/drivers/scsi/qlogicisp.c
--- v2.0.4/linux/drivers/scsi/qlogicisp.c	Wed Jul  3 22:05:11 1996
+++ linux/drivers/scsi/qlogicisp.c	Wed Jul 10 13:11:25 1996
@@ -63,7 +63,7 @@
    the latest firmware provided by QLogic.  This may be an earlier/later
    revision than supplied by your board. */
 
-#define RELOAD_FIRMWARE		0
+#define RELOAD_FIRMWARE		1
 
 /* Set the following macro to 1 to reload the ISP1020's defaults from nvram.
    If you are not sure of your settings, leave this alone, the driver will
diff -u --recursive --new-file v2.0.4/linux/drivers/scsi/scsi.c linux/drivers/scsi/scsi.c
--- v2.0.4/linux/drivers/scsi/scsi.c	Mon Jul  8 16:09:55 1996
+++ linux/drivers/scsi/scsi.c	Wed Jul 10 13:11:25 1996
@@ -92,7 +92,7 @@
 static void print_inquiry(unsigned char *data);
 static void scsi_times_out (Scsi_Cmnd * SCpnt);
 static int scan_scsis_single (int channel,int dev,int lun,int * max_scsi_dev ,
-                 Scsi_Device ** SDpnt, Scsi_Cmnd * SCpnt,
+                 int * sparse_lun, Scsi_Device ** SDpnt, Scsi_Cmnd * SCpnt,
                  struct Scsi_Host *shpnt, char * scsi_result);
 void scsi_build_commandblocks(Scsi_Device * SDpnt);
 
@@ -226,6 +226,7 @@
 #define BLIST_KEY       0x08
 #define BLIST_SINGLELUN 0x10
 #define BLIST_NOTQ	0x20
+#define BLIST_SPARSELUN 0x40
 
 struct dev_info{
     const char * vendor;
@@ -292,7 +293,8 @@
 {"NRC","MBR-7","*", BLIST_FORCELUN | BLIST_SINGLELUN},
 {"PIONEER","CD-ROM DRM-602X","*", BLIST_FORCELUN | BLIST_SINGLELUN},
 {"PIONEER","CD-ROM DRM-604X","*", BLIST_FORCELUN | BLIST_SINGLELUN},
-{"EMULEX","MD21/S2     ESDI","*",BLIST_SINGLELUN},
+{"EMULEX","MD21/S2     ESDI","*", BLIST_SINGLELUN},
+{"CANON","IPUBJD","*", BLIST_SPARSELUN},
 /*
  * Must be at end of list...
  */
@@ -415,7 +417,7 @@
   unsigned char scsi_result0[256];
   unsigned char *scsi_result;
   Scsi_Device *SDpnt;
-  int max_dev_lun;
+  int max_dev_lun, sparse_lun;
   Scsi_Cmnd *SCpnt;
 
   SCpnt = (Scsi_Cmnd *) scsi_init_malloc (sizeof (Scsi_Cmnd), GFP_ATOMIC | GFP_DMA);
@@ -449,8 +451,8 @@
     if(dev >= shpnt->max_id) goto leave;
     lun = hlun;
     if(lun >= shpnt->max_lun) goto leave;
-    scan_scsis_single (channel, dev, lun, &max_dev_lun,
-                   &SDpnt, SCpnt, shpnt, scsi_result);
+    scan_scsis_single (channel, dev, lun, &max_dev_lun, &sparse_lun,
+		       &SDpnt, SCpnt, shpnt, scsi_result);
     if(SDpnt!=oldSDpnt) {
 
 	/* it could happen the blockdevice hasn't yet been inited */
@@ -483,9 +485,12 @@
            */
           max_dev_lun = (max_scsi_luns < shpnt->max_lun ?
                          max_scsi_luns : shpnt->max_lun);
+	  sparse_lun = 0;
           for (lun = 0; lun < max_dev_lun; ++lun) {
             if (!scan_scsis_single (channel, dev, lun, &max_dev_lun,
-                                    &SDpnt, SCpnt, shpnt, scsi_result))
+				    &sparse_lun, &SDpnt, SCpnt, shpnt,
+				    scsi_result)
+		&& !sparse_lun)
               break; /* break means don't probe further for luns!=0 */
           }                     /* for lun ends */
         }                       /* if this_id != id ends */
@@ -528,8 +533,8 @@
  * Global variables used : scsi_devices(linked list)
  */
 int scan_scsis_single (int channel, int dev, int lun, int *max_dev_lun,
-    Scsi_Device **SDpnt2, Scsi_Cmnd * SCpnt, struct Scsi_Host * shpnt, 
-    char *scsi_result)
+    int *sparse_lun, Scsi_Device **SDpnt2, Scsi_Cmnd * SCpnt,
+    struct Scsi_Host * shpnt, char *scsi_result)
 {
   unsigned char scsi_cmd[12];
   struct Scsi_Device_Template *sdtpnt;
@@ -794,6 +799,16 @@
    */
   if (bflags & BLIST_SINGLELUN)
     SDpnt->single_lun = 1;
+
+  /*
+   * If this device is known to support sparse multiple units, override the
+   * other settings, and scan all of them.
+   */
+  if (bflags & BLIST_SPARSELUN) {
+    *max_dev_lun = 8;
+    *sparse_lun = 1;
+    return 1;
+  }
 
   /*
    * If this device is known to support multiple units, override the other
diff -u --recursive --new-file v2.0.4/linux/drivers/scsi/sd.c linux/drivers/scsi/sd.c
--- v2.0.4/linux/drivers/scsi/sd.c	Mon Jul  8 16:09:55 1996
+++ linux/drivers/scsi/sd.c	Tue Jul  9 08:08:18 1996
@@ -1054,7 +1054,7 @@
 	     * Issue command to spin up drive for these cases. */
 	    if(the_result && !rscsi_disks[i].device->removable && 
 	       SCpnt->sense_buffer[2] == NOT_READY) {
-		int time1;
+		unsigned long time1;
 		if(!spintime){
 		    printk( "sd%c: Spinning up disk...", 'a' + i );
 		    cmd[0] = START_STOP;
@@ -1081,8 +1081,8 @@
 		    spintime = jiffies;
 		}
 		
-		time1 = jiffies;
-		while(jiffies < time1 + HZ); /* Wait 1 second for next try */
+		time1 = jiffies + HZ;
+		while(jiffies < time1); /* Wait 1 second for next try */
 		printk( "." );
 	    }
 	} while(the_result && spintime && spintime+100*HZ > jiffies);
diff -u --recursive --new-file v2.0.4/linux/drivers/scsi/u14-34f.c linux/drivers/scsi/u14-34f.c
--- v2.0.4/linux/drivers/scsi/u14-34f.c	Fri Apr 19 10:08:01 1996
+++ linux/drivers/scsi/u14-34f.c	Wed Jul 10 08:05:27 1996
@@ -1,6 +1,10 @@
 /*
  *      u14-34f.c - Low-level driver for UltraStor 14F/34F SCSI host adapters.
  *
+ *      09 Jul 1996 rev. 2.11 for linux 2.0.4
+ *          "Data over/under-run" no longer implies a redo on all targets.
+ *          Number of internal retries is now limited.
+ *
  *      16 Apr 1996 rev. 2.10 for linux 1.3.90
  *          New argument "reset_flags" to the reset routine.
  *
@@ -199,6 +203,7 @@
 #define MAX_MAILBOXES 16
 #define MAX_SGLIST 32
 #define MAX_SAFE_SGLIST 16
+#define MAX_INTERNAL_RETRIES 64
 #define MAX_CMD_PER_LUN 2
 
 #define FALSE 0
@@ -280,6 +285,8 @@
    int in_reset;                        /* True if board is doing a reset */
    int target_time_out[MAX_TARGET];     /* N. of timeout errors on target */
    int target_reset[MAX_TARGET];        /* If TRUE redo operation on target */
+   unsigned int retries;                /* Number of internal retries */
+   unsigned long last_retried_pid;      /* Pid of last retried command */
    unsigned char subversion;            /* Bus type, either ISA or ESA */
    unsigned char heads;
    unsigned char sectors;
@@ -763,6 +770,8 @@
       return SCSI_RESET_ERROR;
       }
 
+   HD(j)->retries = 0;
+
    for (k = 0; k < MAX_TARGET; k++) HD(j)->target_reset[k] = TRUE;
 
    for (k = 0; k < MAX_TARGET; k++) HD(j)->target_time_out[k] = 0;
@@ -972,6 +981,8 @@
 
 	       HD(j)->target_time_out[SCpnt->target] = 0;
 
+               if (HD(j)->last_retried_pid == SCpnt->pid) HD(j)->retries = 0;
+
 	       break;
 	    case ASST:     /* Selection Time Out */
 
@@ -983,20 +994,27 @@
 		  }
 
 	       break;
-	    case 0x92:     /* Data over/under-run */
+
+            /* Perform a limited number of internal retries */
 	    case 0x93:     /* Unexpected bus free */
 	    case 0x94:     /* Target bus phase sequence failure */
 	    case 0x96:     /* Illegal SCSI command */
 	    case 0xa3:     /* SCSI bus reset error */
 
-	       if (SCpnt->device->type != TYPE_TAPE)
-		  status = DID_BUS_BUSY << 16;
-	       else
-		  status = DID_ERROR << 16;
-
 	       for (k = 0; k < MAX_TARGET; k++) 
 		  HD(j)->target_reset[k] = TRUE;
 
+	    case 0x92:     /* Data over/under-run */
+
+	       if (SCpnt->device->type != TYPE_TAPE
+                   && HD(j)->retries < MAX_INTERNAL_RETRIES) {
+		  status = DID_BUS_BUSY << 16;
+		  HD(j)->retries++;
+                  HD(j)->last_retried_pid = SCpnt->pid;
+                  }
+	       else 
+		  status = DID_ERROR << 16;
+
 	       break;
 	    case 0x01:     /* Invalid command */
 	    case 0x02:     /* Invalid parameters */
@@ -1023,7 +1041,7 @@
 	      spp->adapter_status != ASST && HD(j)->iocount <= 1000) ||
 	     do_trace)
 #endif
-	    printk("%s: ihdlr, mbox %d, err 0x%x:%x,"\
+	    printk("%s: ihdlr, mbox %2d, err 0x%x:%x,"\
 		   " target %d:%d, pid %ld, count %d.\n",
 		   BN(j), i, spp->adapter_status, spp->target_status,
 		   SCpnt->target, SCpnt->lun, SCpnt->pid, HD(j)->iocount);
diff -u --recursive --new-file v2.0.4/linux/drivers/scsi/u14-34f.h linux/drivers/scsi/u14-34f.h
--- v2.0.4/linux/drivers/scsi/u14-34f.h	Fri Apr 19 10:08:01 1996
+++ linux/drivers/scsi/u14-34f.h	Wed Jul 10 08:05:27 1996
@@ -10,7 +10,7 @@
 int u14_34f_reset(Scsi_Cmnd *, unsigned int);
 int u14_34f_biosparam(Disk *, kdev_t, int *);
 
-#define U14_34F_VERSION "2.10.00"
+#define U14_34F_VERSION "2.11.00"
 
 #define ULTRASTOR_14_34F {                                            \
 		NULL, /* Ptr for modules */                           \
diff -u --recursive --new-file v2.0.4/linux/drivers/sound/gus_wave.c linux/drivers/sound/gus_wave.c
--- v2.0.4/linux/drivers/sound/gus_wave.c	Sat Jul  6 14:51:26 1996
+++ linux/drivers/sound/gus_wave.c	Wed Jul 10 13:11:15 1996
@@ -1549,7 +1549,7 @@
       gus_write_addr (0x02, sample_ptrs[sample] + samples[sample].loop_start,
 		      samples[sample].fractions & 0x0f,
 		      is16bits);	/* Loop start location */
-      gus_write_addr (0x04, sample_ptrs[sample] + samples[sample].len,
+      gus_write_addr (0x04, sample_ptrs[sample] + samples[sample].loop_end,
 		      (samples[sample].fractions >> 4) & 0x0f,
 		      is16bits);	/* Loop end location */
     }
@@ -1560,7 +1560,7 @@
       voices[voice].loop_irq_parm = 1;
       gus_write_addr (0x02, sample_ptrs[sample],
 		      0, is16bits);	/* Loop start location */
-      gus_write_addr (0x04, sample_ptrs[sample] + samples[sample].loop_end - 1,
+      gus_write_addr (0x04, sample_ptrs[sample] + samples[sample].len - 1,
 		      (samples[sample].fractions >> 4) & 0x0f,
 		      is16bits);	/* Loop end location */
     }
diff -u --recursive --new-file v2.0.4/linux/drivers/sound/sb_common.c linux/drivers/sound/sb_common.c
--- v2.0.4/linux/drivers/sound/sb_common.c	Mon Jul  8 16:09:56 1996
+++ linux/drivers/sound/sb_common.c	Wed Jul 10 13:11:25 1996
@@ -130,14 +130,14 @@
 
   sb_devc        *devc = irq2devc[irq];
 
-  devc->irq_ok = 1;
-
   if (devc == NULL || devc->irq != irq)
     {
       DEB (printk ("sbintr: Bogus interrupt IRQ%d\n", irq));
       return;
     }
 
+  devc->irq_ok = 1;
+
   if (devc->model == MDL_SB16)
     {
 
@@ -671,10 +671,14 @@
   devc->dev = num_audiodevs;
   devc->caps = hw_config->driver_use_1;
 
+  irq2devc[hw_config->irq] = devc;
+  devc->irq_ok = 0;
+
   if (snd_set_irq_handler (hw_config->irq,
 			   sbintr, "sound blaster", devc->osp) < 0)
     {
       printk ("SB: Can't allocate IRQ%d\n", hw_config->irq);
+      irq2devc[hw_config->irq] = NULL;
       return;
     }
 
@@ -697,9 +701,6 @@
 	  }
     }
 
-  irq2devc[hw_config->irq] = devc;
-  devc->irq_ok = 0;
-
   for (n = 0; n < 3 && devc->irq_ok == 0; n++)
     if (sb_dsp_command (devc, 0xf2))	/* Cause interrupt immediately */
       {
@@ -1173,7 +1174,7 @@
 	}
       hw_config->name = "Sound Blaster 16";
       hw_config->irq = -devc->irq;
-      sb16_set_mpu_port(devc, hw_config)
+      sb16_set_mpu_port(devc, hw_config);
       break;
 
     case MDL_ESS:
diff -u --recursive --new-file v2.0.4/linux/fs/ext2/namei.c linux/fs/ext2/namei.c
--- v2.0.4/linux/fs/ext2/namei.c	Wed Jul  3 22:05:18 1996
+++ linux/fs/ext2/namei.c	Wed Jul 10 13:11:15 1996
@@ -163,10 +163,12 @@
 		return -ENOENT;
 	if (!S_ISDIR(dir->i_mode)) {
 		iput (dir);
-		return -ENOENT;
+		return -ENOTDIR;
 	}
-	if (len > EXT2_NAME_LEN)
+	if (len > EXT2_NAME_LEN) {
+		iput (dir);
 		return -ENAMETOOLONG;
+	}
 	if (dcache_lookup(dir, name, len, &ino)) {
 		if (!ino) {
 			iput(dir);
@@ -407,8 +409,10 @@
 	if (!dir)
 		return -ENOENT;
 
-	if (len > EXT2_NAME_LEN)
+	if (len > EXT2_NAME_LEN) {
+		iput (dir);
 		return -ENAMETOOLONG;
+	}
 	bh = ext2_find_entry (dir, name, len, &de);
 	if (bh) {
 		brelse (bh);
@@ -472,8 +476,10 @@
 
 	if (!dir)
 		return -ENOENT;
-	if (len > EXT2_NAME_LEN)
+	if (len > EXT2_NAME_LEN) {
+		iput (dir);
 		return -ENAMETOOLONG;
+	}
 	bh = ext2_find_entry (dir, name, len, &de);
 	if (bh) {
 		brelse (bh);
@@ -611,8 +617,10 @@
 	if (!dir)
 		return -ENOENT;
 	inode = NULL;
-	if (len > EXT2_NAME_LEN)
+	if (len > EXT2_NAME_LEN) {
+		iput (dir);
 		return -ENAMETOOLONG;
+	}
 	bh = ext2_find_entry (dir, name, len, &de);
 	retval = -ENOENT;
 	if (!bh)
@@ -699,8 +707,10 @@
 		return -ENOENT;
 	retval = -ENOENT;
 	inode = NULL;
-	if (len > EXT2_NAME_LEN)
+	if (len > EXT2_NAME_LEN) {
+		iput (dir);
 		return -ENAMETOOLONG;
+	}
 	bh = ext2_find_entry (dir, name, len, &de);
 	if (!bh)
 		goto end_unlink;
diff -u --recursive --new-file v2.0.4/linux/fs/ncpfs/sock.c linux/fs/ncpfs/sock.c
--- v2.0.4/linux/fs/ncpfs/sock.c	Fri May 17 15:32:18 1996
+++ linux/fs/ncpfs/sock.c	Wed Jul 10 13:19:24 1996
@@ -599,7 +599,7 @@
 
 	if (server->has_subfunction != 0)
 	{
-		*(__u16 *)&(h->data[0]) = request_size - 2;
+		*(__u16 *)&(h->data[0]) = htons(request_size - 2);
 	}
 
 	h->type = NCP_REQUEST;
diff -u --recursive --new-file v2.0.4/linux/include/asm-alpha/apecs.h linux/include/asm-alpha/apecs.h
--- v2.0.4/linux/include/asm-alpha/apecs.h	Wed Jun  5 10:41:29 1996
+++ linux/include/asm-alpha/apecs.h	Tue Jul  9 08:08:18 1996
@@ -414,6 +414,7 @@
 /*
  * Data structure for handling APECS machine checks:
  */
+#ifdef CONFIG_ALPHA_MIKASA
 struct el_apecs_sysdata_mcheck {
     unsigned long coma_gcr;
     unsigned long coma_edsr;
@@ -425,9 +426,11 @@
     unsigned long coma_base0;
     unsigned long coma_base1;
     unsigned long coma_base2;
+    unsigned long coma_base3;
     unsigned long coma_cnfg0;
     unsigned long coma_cnfg1;
     unsigned long coma_cnfg2;
+    unsigned long coma_cnfg3;
     unsigned long epic_dcsr;
     unsigned long epic_pear;
     unsigned long epic_sear;
@@ -456,7 +459,100 @@
     unsigned long epic_data5;
     unsigned long epic_data6;
     unsigned long epic_data7;
+
+    unsigned long pceb_vid;
+    unsigned long pceb_did;
+    unsigned long pceb_revision;
+    unsigned long pceb_command;
+    unsigned long pceb_status;
+    unsigned long pceb_latency;
+    unsigned long pceb_control;
+    unsigned long pceb_arbcon;
+    unsigned long pceb_arbpri;
+
+    unsigned long esc_id;
+    unsigned long esc_revision;
+    unsigned long esc_int0;
+    unsigned long esc_int1;
+    unsigned long esc_elcr0;
+    unsigned long esc_elcr1;
+    unsigned long esc_last_eisa;
+    unsigned long esc_nmi_stat;
+
+    unsigned long pci_ir;
+    unsigned long pci_imr;
+    unsigned long svr_mgr;
 };
+#else /* CONFIG_ALPHA_MIKASA */
+/* this for the normal APECS machines */
+struct el_apecs_sysdata_mcheck {
+    unsigned long coma_gcr;
+    unsigned long coma_edsr;
+    unsigned long coma_ter;
+    unsigned long coma_elar;
+    unsigned long coma_ehar;
+    unsigned long coma_ldlr;
+    unsigned long coma_ldhr;
+    unsigned long coma_base0;
+    unsigned long coma_base1;
+    unsigned long coma_base2;
+    unsigned long coma_cnfg0;
+    unsigned long coma_cnfg1;
+    unsigned long coma_cnfg2;
+    unsigned long epic_dcsr;
+    unsigned long epic_pear;
+    unsigned long epic_sear;
+    unsigned long epic_tbr1;
+    unsigned long epic_tbr2;
+    unsigned long epic_pbr1;
+    unsigned long epic_pbr2;
+    unsigned long epic_pmr1;
+    unsigned long epic_pmr2;
+    unsigned long epic_harx1;
+    unsigned long epic_harx2;
+    unsigned long epic_pmlt;
+    unsigned long epic_tag0;
+    unsigned long epic_tag1;
+    unsigned long epic_tag2;
+    unsigned long epic_tag3;
+    unsigned long epic_tag4;
+    unsigned long epic_tag5;
+    unsigned long epic_tag6;
+    unsigned long epic_tag7;
+    unsigned long epic_data0;
+    unsigned long epic_data1;
+    unsigned long epic_data2;
+    unsigned long epic_data3;
+    unsigned long epic_data4;
+    unsigned long epic_data5;
+    unsigned long epic_data6;
+    unsigned long epic_data7;
+};
+#endif /* CONFIG_ALPHA_MIKASA */
+
+struct el_procdata {
+    unsigned long paltemp[32];  /* PAL TEMP REGS. */
+    /* EV4-specific fields */
+    unsigned long exc_addr;     /* Address of excepting instruction. */
+    unsigned long exc_sum;      /* Summary of arithmetic traps. */
+    unsigned long exc_mask;     /* Exception mask (from exc_sum). */
+    unsigned long iccsr;        /* IBox hardware enables. */
+    unsigned long pal_base;     /* Base address for PALcode. */
+    unsigned long hier;         /* Hardware Interrupt Enable. */
+    unsigned long hirr;         /* Hardware Interrupt Request. */
+    unsigned long csr;          /* D-stream fault info. */
+    unsigned long dc_stat;      /* D-cache status (ECC/Parity Err). */
+    unsigned long dc_addr;      /* EV3 Phys Addr for ECC/DPERR. */
+    unsigned long abox_ctl;     /* ABox Control Register. */
+    unsigned long biu_stat;     /* BIU Status. */
+    unsigned long biu_addr;     /* BUI Address. */
+    unsigned long biu_ctl;      /* BIU Control. */
+    unsigned long fill_syndrome;/* For correcting ECC errors. */
+    unsigned long fill_addr;    /* Cache block which was being read */
+    unsigned long va;           /* Effective VA of fault or miss. */
+    unsigned long bc_tag;       /* Backup Cache Tag Probe Results.*/
+};
+
 
 #define RTC_PORT(x)	(0x70 + (x))
 #define RTC_ADDR(x)	(0x80 | (x))
diff -u --recursive --new-file v2.0.4/linux/include/linux/dirent.h linux/include/linux/dirent.h
--- v2.0.4/linux/include/linux/dirent.h	Wed Jul  3 22:05:20 1996
+++ linux/include/linux/dirent.h	Wed Jul 10 07:38:08 1996
@@ -3,7 +3,7 @@
 
 struct dirent {
 	long		d_ino;
-	off_t		d_off;
+	__kernel_off_t	d_off;
 	unsigned short	d_reclen;
 	char		d_name[256]; /* We must not include limits.h! */
 };
diff -u --recursive --new-file v2.0.4/linux/include/linux/socket.h linux/include/linux/socket.h
--- v2.0.4/linux/include/linux/socket.h	Tue May 21 19:52:38 1996
+++ linux/include/linux/socket.h	Mon Jul  8 16:09:16 1996
@@ -102,6 +102,7 @@
 #define	IPTOS_LOWDELAY		0x10
 #define	IPTOS_THROUGHPUT	0x08
 #define	IPTOS_RELIABILITY	0x04
+#define	IPTOS_MINCOST		0x02
 #define IP_TTL		2
 #define IP_HDRINCL	3
 #define IP_OPTIONS	4
diff -u --recursive --new-file v2.0.4/linux/mm/vmscan.c linux/mm/vmscan.c
--- v2.0.4/linux/mm/vmscan.c	Wed Jul  3 22:05:23 1996
+++ linux/mm/vmscan.c	Wed Jul 10 14:27:31 1996
@@ -109,7 +109,7 @@
 			if (page_map->count != 1)
 				return 0;
 			if (!(entry = get_swap_page()))
-				return 0;
+				return -1;	/* Aieee!!! Out of swap space! */
 			vma->vm_mm->rss--;
 			flush_cache_page(vma, address);
 			set_pte(page_table, __pte(entry));
@@ -312,6 +312,8 @@
 		if (!--p->swap_cnt)
 			swap_task++;
 		switch (swap_out_process(p, dma, wait)) {
+			case -1:
+				return 0;
 			case 0:
 				if (p->swap_cnt)
 					swap_task++;
diff -u --recursive --new-file v2.0.4/linux/net/ipv4/ip_output.c linux/net/ipv4/ip_output.c
--- v2.0.4/linux/net/ipv4/ip_output.c	Wed Jul  3 22:05:23 1996
+++ linux/net/ipv4/ip_output.c	Tue Jul  9 14:28:32 1996
@@ -842,6 +842,8 @@
 						NULL, NULL, 0)>0)
 				skb->arp=1;
 		}
+		else
+			skb->arp = 1;
 		
 		/*
 		 *	Find where to start putting bytes.
diff -u --recursive --new-file v2.0.4/linux/net/ipv4/ip_sockglue.c linux/net/ipv4/ip_sockglue.c
--- v2.0.4/linux/net/ipv4/ip_sockglue.c	Tue May  7 16:22:41 1996
+++ linux/net/ipv4/ip_sockglue.c	Tue Jul  9 08:39:55 1996
@@ -178,17 +178,18 @@
 			  	kfree_s(old_opt, sizeof(struct optlen) + old_opt->optlen);
 			  return 0;
 		  }
-		case IP_TOS:		/* This sets both TOS and Precedence */
-			if (val<0 || val>63)	/* Reject setting of unused bits */
+		case IP_TOS:			/* This sets both TOS and Precedence */
+			if (val & ~0xfe)	/* Reject setting of unused bits */
 				return -EINVAL;
-			if ((val&7) > 4 && !suser())	/* Only root can set Prec>4 */
+			if ((val>>5) > 4 && !suser())	/* Only root can set Prec>4 */
 				return -EPERM;
 			sk->ip_tos=val;
-			switch (val & 0x38) {
+			switch (val & 0x1E) {
 				case IPTOS_LOWDELAY:
 					sk->priority=SOPRI_INTERACTIVE;
 					break;
 				case IPTOS_THROUGHPUT:
+				case IPTOS_MINCOST:
 					sk->priority=SOPRI_BACKGROUND;
 					break;
 				default:
@@ -270,7 +271,6 @@
  *	FIXME: Add/Del membership should have a semaphore protecting them from re-entry
  */
 			struct ip_mreq mreq;
-			__u32 route_src;
 			struct rtable *rt;
 			struct device *dev=NULL;
 			
@@ -295,9 +295,8 @@
 				 */
 				if((rt=ip_rt_route(mreq.imr_multiaddr.s_addr,0))!=NULL)
 				{
-					dev=rt->rt_dev;
-					route_src = rt->rt_src;
-					atomic_dec(&rt->rt_use);
+					dev=rt->u.dst.dev;
+					atomic_dec(&rt->u.dst.use);
 					ip_rt_put(rt);
 				}
 			}
@@ -328,7 +327,6 @@
 		{
 			struct ip_mreq mreq;
 			struct rtable *rt;
-			__u32 route_src;
 			struct device *dev=NULL;
 
 			/*
@@ -349,9 +347,8 @@
 			{
 				if((rt=ip_rt_route(mreq.imr_multiaddr.s_addr,0))!=NULL)
 			        {
-					dev=rt->rt_dev;
-					atomic_dec(&rt->rt_use);
-					route_src = rt->rt_src;
+					dev=rt->u.dst.dev;
+					atomic_dec(&rt->u.dst.use);
 					ip_rt_put(rt);
 				}
 			}
diff -u --recursive --new-file v2.0.4/linux/scripts/Menuconfig linux/scripts/Menuconfig
--- v2.0.4/linux/scripts/Menuconfig	Wed Jun  5 10:41:30 1996
+++ linux/scripts/Menuconfig	Wed Jul 10 07:48:35 1996
@@ -733,7 +733,7 @@
 # Create a menu item to load an alternate configuration file.
 #
 g_alt_config () {
-	echo -n "get_alt_config 'Load  an Alternate Configuration File' "\
+	echo -n "get_alt_config 'Load an Alternate Configuration File' "\
 		>>MCmenu
 }
 
@@ -742,6 +742,8 @@
 # configuration from it.
 #
 get_alt_config () {
+	set -f ## Switch file expansion OFF
+
 	while true
 	do
 		ALT_CONFIG="${ALT_CONFIG:-$DEFAULTS}"
@@ -759,9 +761,9 @@
 
 			[ "_" = "_$ALT_CONFIG" ] && break
 
-			if [ -r "$ALT_CONFIG" ]
+			if eval [ -r "$ALT_CONFIG" ]
 			then
-				load_config_file "$ALT_CONFIG"
+				eval load_config_file "$ALT_CONFIG"
 				break
 			else
 				echo -ne "\007"
@@ -789,6 +791,7 @@
 		fi
 	done
 
+	set +f ## Switch file expansion ON
 	rm -f help.out MCdialog.out
 }
 
@@ -796,7 +799,7 @@
 # Create a menu item to store an alternate config file.
 #
 s_alt_config () {
-	echo -n "save_alt_config 'Store an Alternate Configuration File' "\
+	echo -n "save_alt_config 'Save Configuration to an Alternate File' "\
 		 >>MCmenu
 }
 
@@ -805,6 +808,8 @@
 # configuration to it.
 #
 save_alt_config () {
+	set -f  ## Switch file expansion OFF
+			
 	while true
 	do
 		$DIALOG --backtitle "$backtitle" \
@@ -818,10 +823,10 @@
 			ALT_CONFIG=`cat MCdialog.out`
 
 			[ "_" = "_$ALT_CONFIG" ] && break
-			
-			if touch $ALT_CONFIG 2>/dev/null
+
+			if eval touch $ALT_CONFIG 2>/dev/null
 			then
-				save_configuration $ALT_CONFIG
+				eval save_configuration $ALT_CONFIG
 				load_functions  ## RELOAD
 				break
 			else
@@ -844,11 +849,12 @@
 leave this blank.
 EOM
 			$DIALOG	--backtitle "$backtitle"\
-				--title "Store Alternate Configuration"\
+				--title "Save Alternate Configuration"\
 				--textbox help.out $ROWS $COLS
 		fi
 	done
 
+	set +f  ## Switch file expansion ON
 	rm -f help.out MCdialog.out
 }
 
