diff -u --recursive --new-file v1.2.6/linux/Makefile linux/Makefile
--- v1.2.6/linux/Makefile	Fri Apr 28 11:10:53 1995
+++ linux/Makefile	Fri Apr 28 14:05:34 1995
@@ -1,6 +1,6 @@
 VERSION = 1
 PATCHLEVEL = 2
-SUBLEVEL = 6
+SUBLEVEL = 7
 
 ARCH = i386
 
diff -u --recursive --new-file v1.2.6/linux/arch/alpha/config.in linux/arch/alpha/config.in
--- v1.2.6/linux/arch/alpha/config.in	Wed Feb 15 10:50:55 1995
+++ linux/arch/alpha/config.in	Fri Apr 28 11:17:56 1995
@@ -43,10 +43,10 @@
 
 comment 'SCSI support type (disk, tape, CDrom)'
 
-bool 'Scsi disk support' CONFIG_BLK_DEV_SD y
-bool 'Scsi tape support' CONFIG_CHR_DEV_ST n
-bool 'Scsi CDROM support' CONFIG_BLK_DEV_SR n
-bool 'Scsi generic support' CONFIG_CHR_DEV_SG n
+bool 'SCSI disk support' CONFIG_BLK_DEV_SD y
+bool 'SCSI tape support' CONFIG_CHR_DEV_ST n
+bool 'SCSI CDROM support' CONFIG_BLK_DEV_SR n
+bool 'SCSI generic support' CONFIG_CHR_DEV_SG n
 
 comment 'SCSI low-level drivers'
 
@@ -233,5 +233,5 @@
   int ' Profile shift count' CONFIG_PROFILE_SHIFT 2
 fi
 if [ "$CONFIG_SCSI" = "y" ]; then
-bool 'Verbose scsi error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS y
+bool 'Verbose SCSI error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS y
 fi
diff -u --recursive --new-file v1.2.6/linux/arch/i386/config.in linux/arch/i386/config.in
--- v1.2.6/linux/arch/i386/config.in	Fri Apr 28 11:10:53 1995
+++ linux/arch/i386/config.in	Fri Apr 28 11:17:56 1995
@@ -69,10 +69,10 @@
 
 comment 'SCSI support type (disk, tape, CDrom)'
 
-bool 'Scsi disk support' CONFIG_BLK_DEV_SD y
-bool 'Scsi tape support' CONFIG_CHR_DEV_ST n
-bool 'Scsi CDROM support' CONFIG_BLK_DEV_SR n
-bool 'Scsi generic support' CONFIG_CHR_DEV_SG n
+bool 'SCSI disk support' CONFIG_BLK_DEV_SD y
+bool 'SCSI tape support' CONFIG_CHR_DEV_ST n
+bool 'SCSI CDROM support' CONFIG_BLK_DEV_SR n
+bool 'SCSI generic support' CONFIG_CHR_DEV_SG n
 
 comment 'Some SCSI devices (e.g. CD jukebox) support multiple LUNs'
 
@@ -267,5 +267,5 @@
   int ' Profile shift count' CONFIG_PROFILE_SHIFT 2
 fi
 if [ "$CONFIG_SCSI" = "y" ]; then
-bool 'Verbose scsi error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS y
+bool 'Verbose SCSI error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS y
 fi
diff -u --recursive --new-file v1.2.6/linux/arch/i386/kernel/signal.c linux/arch/i386/kernel/signal.c
--- v1.2.6/linux/arch/i386/kernel/signal.c	Tue Feb  7 11:56:41 1995
+++ linux/arch/i386/kernel/signal.c	Thu Apr 27 14:55:29 1995
@@ -151,10 +151,10 @@
 	struct sigaction * sa;
 
 	while ((signr = current->signal & mask)) {
-		__asm__("bsf %2,%1\n\t"
+		__asm__("bsf %3,%1\n\t"
 			"btrl %1,%0"
 			:"=m" (current->signal),"=r" (signr)
-			:"1" (signr));
+			:"0" (current->signal), "1" (signr));
 		sa = current->sigaction + signr;
 		signr++;
 		if ((current->flags & PF_PTRACED) && signr != SIGKILL) {
diff -u --recursive --new-file v1.2.6/linux/arch/mips/config.in linux/arch/mips/config.in
--- v1.2.6/linux/arch/mips/config.in	Wed Feb 15 10:50:55 1995
+++ linux/arch/mips/config.in	Fri Apr 28 11:17:56 1995
@@ -63,10 +63,10 @@
 
 comment 'SCSI support type (disk, tape, CDrom)'
 
-bool 'Scsi disk support' CONFIG_BLK_DEV_SD y
-bool 'Scsi tape support' CONFIG_CHR_DEV_ST y
-bool 'Scsi CDROM support' CONFIG_BLK_DEV_SR y
-bool 'Scsi generic support' CONFIG_CHR_DEV_SG y
+bool 'SCSI disk support' CONFIG_BLK_DEV_SD y
+bool 'SCSI tape support' CONFIG_CHR_DEV_ST y
+bool 'SCSI CDROM support' CONFIG_BLK_DEV_SR y
+bool 'SCSI generic support' CONFIG_CHR_DEV_SG y
 
 comment 'SCSI low-level drivers'
 
@@ -252,5 +252,5 @@
   int ' Profile shift count' CONFIG_PROFILE_SHIFT 2
 fi
 if [ "$CONFIG_SCSI" = "y" ]; then
-bool 'Verbose scsi error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS y
+bool 'Verbose SCSI error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS y
 fi
diff -u --recursive --new-file v1.2.6/linux/arch/sparc/config.in linux/arch/sparc/config.in
--- v1.2.6/linux/arch/sparc/config.in	Sun Feb 26 20:46:20 1995
+++ linux/arch/sparc/config.in	Fri Apr 28 11:17:56 1995
@@ -50,10 +50,10 @@
 
 comment 'SCSI support type (disk, tape, CDrom)'
 
-bool 'Scsi disk support' CONFIG_BLK_DEV_SD y
-bool 'Scsi tape support' CONFIG_CHR_DEV_ST n
-bool 'Scsi CDROM support' CONFIG_BLK_DEV_SR n
-bool 'Scsi generic support' CONFIG_CHR_DEV_SG n
+bool 'SCSI disk support' CONFIG_BLK_DEV_SD y
+bool 'SCSI tape support' CONFIG_CHR_DEV_ST n
+bool 'SCSI CDROM support' CONFIG_BLK_DEV_SR n
+bool 'SCSI generic support' CONFIG_CHR_DEV_SG n
 
 comment 'SCSI low-level drivers'
 
@@ -242,5 +242,5 @@
   int ' Profile shift count' CONFIG_PROFILE_SHIFT 2
 fi
 if [ "$CONFIG_SCSI" = "y" ]; then
-bool 'Verbose scsi error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS y
+bool 'Verbose SCSI error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS y
 fi
diff -u --recursive --new-file v1.2.6/linux/drivers/block/ide-cd.c linux/drivers/block/ide-cd.c
--- v1.2.6/linux/drivers/block/ide-cd.c	Sun Jan 15 00:54:27 1995
+++ linux/drivers/block/ide-cd.c	Fri Apr 28 11:17:56 1995
@@ -1,5 +1,5 @@
 /*
- * linux/drivers/block/ide-cd.c  (BETA)
+ * linux/drivers/block/ide-cd.c
  *
  * 1.00  Oct 31, 1994 -- Initial version.
  * 1.01  Nov  2, 1994 -- Fixed problem with starting request in
@@ -20,10 +20,17 @@
  * 2.03  Jan 10, 1995 -- Rewrite block read routines to handle block sizes
  *                       other than 2k and to move multiple sectors in a
  *                       single transaction.
+ * 2.04  Apr 21, 1995 -- Add work-around for Creative Labs CD220E drives.
+ *                       Thanks to Nick Saw <cwsaw@pts7.pts.mot.com> for
+ *                       help in figuring this out.  Ditto for Acer and
+ *                       Aztech drives, which seem to have the same problem.
+ *                       
  *
  * ATAPI cd-rom driver.  To be used with ide.c.
  *
  * Copyright (C) 1994, 1995  scott snyder  <snyder@fnald0.fnal.gov>
+ * May be copied or modified under the terms of the GNU General Public License
+ * (../../COPYING).
  */
 
 #include <linux/cdrom.h>
@@ -88,7 +95,8 @@
 
   unsigned media_changed : 1; /* Driver has noticed a media change. */
   unsigned toc_valid     : 1; /* Saved TOC information is current. */
-  unsigned reserved : 4;
+  unsigned no_lba_toc    : 1; /* Drive cannot return TOC info in LBA format */
+  unsigned reserved : 3;
 };
 
 #define CDROM_FLAGS(dev) ((struct ide_cd_flags *)&((dev)->bios_sect))
@@ -1094,6 +1102,7 @@
 static int
 cdrom_read_toc (ide_dev_t *dev)
 {
+  int msf_flag;
   int stat, ntracks, i;
   struct atapi_toc *toc = cdrom_info[dev->hwif][dev->select.b.drive].toc;
 
@@ -1118,8 +1127,11 @@
 
   if (CDROM_FLAGS (dev)->toc_valid) return 0;
 
+  /* Some drives can't return TOC data in LBA format. */
+  msf_flag = (CDROM_FLAGS (dev)->no_lba_toc);
+
   /* First read just the header, so we know how long the TOC is. */
-  stat = cdrom_read_tocentry (dev, 0, 0, (char *)toc,
+  stat = cdrom_read_tocentry (dev, 0, msf_flag, (char *)toc,
                               sizeof (struct atapi_toc_header) +
                               sizeof (struct atapi_toc_entry));
   if (stat) return stat;
@@ -1129,13 +1141,21 @@
   if (ntracks > MAX_TRACKS) ntracks = MAX_TRACKS;
 
   /* Now read the whole schmeer. */
-  stat = cdrom_read_tocentry (dev, 0, 0, (char *)toc,
+  stat = cdrom_read_tocentry (dev, 0, msf_flag, (char *)toc,
                               sizeof (struct atapi_toc_header) +
                               (ntracks+1) * sizeof (struct atapi_toc_entry));
   if (stat) return stat;
   byte_swap_word (&toc->hdr.toc_length);
   for (i=0; i<=ntracks; i++)
-    byte_swap_long (&toc->ent[i].lba);
+    {
+      if (msf_flag)
+	{
+	  byte *adr = (byte *)&(toc->ent[i].lba);
+	  toc->ent[i].lba = msf_to_lba (adr[1], adr[2], adr[3]);
+	}
+      else
+	byte_swap_long (&toc->ent[i].lba);
+    }
 
   /* Remember that we've read this stuff. */
   CDROM_FLAGS (dev)->toc_valid = 1;
@@ -1618,7 +1638,19 @@
   CDROM_FLAGS (dev)->toc_valid     = 0;
 
   CDROM_FLAGS (dev)->no_playaudio12 = 0;
+  CDROM_FLAGS (dev)->no_lba_toc = 0;
   CDROM_FLAGS (dev)->drq_interrupt = ((dev->id->config & 0x0060) == 0x20);
+
+  /* Accommodate some broken drives... */
+  if (strcmp (dev->id->model, "CD220E") == 0)  /* Creative Labs */
+    CDROM_FLAGS (dev)->no_lba_toc = 1;
+
+  else if (strcmp (dev->id->model, "TO-ICSLYAL") == 0 ||  /* Acer CD525E */
+           strcmp (dev->id->model, "OTI-SCYLLA") == 0)
+    CDROM_FLAGS (dev)->no_lba_toc = 1;
+
+  else if (strcmp (dev->id->model, "CDA26803I SE") == 0) /* Aztech */
+    CDROM_FLAGS (dev)->no_lba_toc = 1;
 
   cdrom_info[dev->hwif][dev->select.b.drive].toc               = NULL;
   cdrom_info[dev->hwif][dev->select.b.drive].sector_buffer     = NULL;
diff -u --recursive --new-file v1.2.6/linux/drivers/char/ChangeLog linux/drivers/char/ChangeLog
--- v1.2.6/linux/drivers/char/ChangeLog	Fri Apr 28 11:10:53 1995
+++ linux/drivers/char/ChangeLog	Fri Apr 28 11:17:57 1995
@@ -1,3 +1,16 @@
+Wed Apr 26 10:23:44 1995  Theodore Y. Ts'o  <tytso@localhost>
+
+	* tty_io.c (release_dev): Try to shutdown the line discpline
+		*before* decrementing the tty count variable; this removes
+		a potential race condition which occurs when the line
+		discpline close blocks, and another process then tries
+		open the same serial port.
+
+	* serial.c (rs_hangup): When hanging up, flush the output buffer
+		befure shutting down the UART.  Otherwise the line
+		discpline close blocks waiting for the characters to get
+		flushed, which never happens until the serial port gets reused.
+
 Wed Apr 12 08:06:16 1995  Theodore Y. Ts'o  <tytso@localhost>
 
 	* serial.c (do_serial_hangup, do_softint, check_modem_status,
diff -u --recursive --new-file v1.2.6/linux/drivers/char/serial.c linux/drivers/char/serial.c
--- v1.2.6/linux/drivers/char/serial.c	Fri Apr 28 11:10:53 1995
+++ linux/drivers/char/serial.c	Fri Apr 28 11:17:57 1995
@@ -2090,6 +2090,7 @@
 	if (serial_paranoia_check(info, tty->device, "rs_hangup"))
 		return;
 	
+	rs_flush_buffer(tty);
 	shutdown(info);
 	info->event = 0;
 	info->count = 0;
diff -u --recursive --new-file v1.2.6/linux/drivers/char/tty_io.c linux/drivers/char/tty_io.c
--- v1.2.6/linux/drivers/char/tty_io.c	Sat Mar 18 12:45:46 1995
+++ linux/drivers/char/tty_io.c	Fri Apr 28 11:17:57 1995
@@ -1006,6 +1006,22 @@
 			tty->link->count = 0;
 		}
 	}
+	if (tty->count <= 1) {
+		/*
+		 * Shutdown the current line discipline, and reset it
+		 * to N_TTY.
+		 */
+		if (tty->ldisc.close)
+			(tty->ldisc.close)(tty);
+		tty->ldisc = ldiscs[N_TTY];
+		tty->termios->c_line = N_TTY;
+		if (o_tty && o_tty->count <= 0) {
+			if (o_tty->ldisc.close)
+				(o_tty->ldisc.close)(o_tty);
+			o_tty->ldisc = ldiscs[N_TTY];
+			o_tty->termios->c_line = N_TTY;
+		}
+	}
 	if (--tty->count < 0) {
 		printk("release_dev: bad tty->count (%d) for %s\n",
 		       tty->count, tty_name(tty));
@@ -1039,23 +1055,6 @@
 			(*p)->tty = NULL;
 	}
 
-	/*
-	 * Shutdown the current line discipline, and reset it to
-	 * N_TTY.
-	 */
-	if (tty->ldisc.close)
-		(tty->ldisc.close)(tty);
-	tty->ldisc = ldiscs[N_TTY];
-	tty->termios->c_line = N_TTY;
-	if (o_tty) {
-		if (o_tty->ldisc.close)
-			(o_tty->ldisc.close)(o_tty);
-		o_tty->ldisc = ldiscs[N_TTY];
-#if 0 /* No way! We just released the termios struct! */
-		o_tty->termios->c_line = N_TTY;
-#endif
-	}
-	
 	tty->driver.table[idx] = NULL;
 	if (tty->driver.flags & TTY_DRIVER_RESET_TERMIOS) {
 		tty->driver.termios[idx] = NULL;
diff -u --recursive --new-file v1.2.6/linux/drivers/net/3c503.c linux/drivers/net/3c503.c
--- v1.2.6/linux/drivers/net/3c503.c	Mon Feb 27 11:06:24 1995
+++ linux/drivers/net/3c503.c	Fri Apr 28 16:56:52 1995
@@ -317,6 +317,7 @@
     outb(EGACFR_IRQOFF, E33G_GACFR);	/* disable interrupts. */
 
     NS8390_init(dev, 0);
+    dev->start = 0;
 
     return 0;
 }
diff -u --recursive --new-file v1.2.6/linux/drivers/net/8390.c linux/drivers/net/8390.c
--- v1.2.6/linux/drivers/net/8390.c	Mon Jan 23 10:38:28 1995
+++ linux/drivers/net/8390.c	Sat Apr 29 09:49:58 1995
@@ -15,6 +15,11 @@
   This is the chip-specific code for many 8390-based ethernet adaptors.
   This is not a complete driver, it must be combined with board-specific
   code such as ne.c, wd.c, 3c503.c, etc.
+
+  13/04/95 -- Don't blindly swallow ENISR_RDC interrupts for non-shared
+  memory cards. We need to follow these closely for neX000 cards.
+  Plus other minor cleanups.   -- Paul Gortmaker
+
   */
 
 static char *version =
@@ -83,7 +88,7 @@
 #endif
 
 /* Max number of packets received at one Intr.
-   Current this may only be examined by a kernel debugger. */
+   Currently this may only be examined by a kernel debugger. */
 static int high_water_mark = 0;
 
 /* Index to functions. */
@@ -124,16 +129,18 @@
     int e8390_base = dev->base_addr;
     struct ei_device *ei_local = (struct ei_device *) dev->priv;
     int length, send_length;
+    unsigned long flags;
     
-	/* We normally shouldn't be called if dev->tbusy is set, but the
-	   existing code does anyway.
-	   If it has been too long (> 100 or 150ms.) since the last Tx we assume
-	   the board has died and kick it. */
-
+/*
+ *  We normally shouldn't be called if dev->tbusy is set, but the
+ *  existing code does anyway. If it has been too long since the
+ *  last Tx, we assume the board has died and kick it.
+ */
+ 
     if (dev->tbusy) {	/* Do timeouts, just like the 8003 driver. */
 		int txsr = inb(e8390_base+EN0_TSR), isr;
 		int tickssofar = jiffies - dev->trans_start;
-		if (tickssofar < 10	||	(tickssofar < 15 && ! (txsr & ENTSR_PTX))) {
+		if (tickssofar < TX_TIMEOUT ||	(tickssofar < (TX_TIMEOUT+5) && ! (txsr & ENTSR_PTX))) {
 			return 1;
 		}
 		isr = inb(e8390_base+EN0_ISR);
@@ -170,15 +177,22 @@
     if (skb->len <= 0)
 		return 0;
 
-	/* Block a timer-based transmit from overlapping. */
-	if (set_bit(0, (void*)&dev->tbusy) != 0) {
-		printk("%s: Transmitter access conflict.\n", dev->name);
-		return 1;
-	}
+    save_flags(flags);
+    cli();
+
+    /* Block a timer-based transmit from overlapping. */
+    if ((set_bit(0, (void*)&dev->tbusy) != 0) || ei_local->irqlock) {
+	printk("%s: Tx access conflict. irq=%d lock=%d tx1=%d tx2=%d last=%d\n",
+		dev->name, dev->interrupt, ei_local->irqlock, ei_local->tx1,
+		ei_local->tx2, ei_local->lasttx);
+	restore_flags(flags);
+	return 1;
+    }
 
     /* Mask interrupts from the ethercard. */
-    outb(0x00,	e8390_base + EN0_IMR);
+    outb(0x00, e8390_base + EN0_IMR);
     ei_local->irqlock = 1;
+    restore_flags(flags);
 
     send_length = ETH_ZLEN < length ? length : ETH_ZLEN;
 
@@ -200,28 +214,30 @@
 					   ei_local->txing);
 		} else {	/* We should never get here. */
 			if (ei_debug)
-				printk("%s: No packet buffer space for ping-pong use.\n",
-					   dev->name);
+				printk("%s: No Tx buffers free. irq=%d tx1=%d tx2=%d last=%d\n",
+					dev->name, dev->interrupt, ei_local->tx1, 
+					ei_local->tx2, ei_local->lasttx);
 			ei_local->irqlock = 0;
 			dev->tbusy = 1;
-			outb_p(ENISR_ALL,  e8390_base + EN0_IMR);
+			outb_p(ENISR_ALL, e8390_base + EN0_IMR);
 			return 1;
 		}
 		ei_block_output(dev, length, skb->data, output_page);
 		if (! ei_local->txing) {
+			ei_local->txing = 1;
 			NS8390_trigger_send(dev, send_length, output_page);
 			dev->trans_start = jiffies;
 			if (output_page == ei_local->tx_start_page)
 				ei_local->tx1 = -1, ei_local->lasttx = -1;
 			else
 				ei_local->tx2 = -1, ei_local->lasttx = -2;
-			ei_local->txing = 1;
 		} else
 			ei_local->txqueue++;
 
 		dev->tbusy = (ei_local->tx1  &&  ei_local->tx2);
     } else {  /* No pingpong, just a single Tx buffer. */
 		ei_block_output(dev, length, skb->data, ei_local->tx_start_page);
+		ei_local->txing = 1;
 		NS8390_trigger_send(dev, send_length, ei_local->tx_start_page);
 		dev->trans_start = jiffies;
 		dev->tbusy = 1;
@@ -242,7 +258,7 @@
 {
     struct device *dev = (struct device *)(irq2dev_map[irq]);
     int e8390_base;
-    int interrupts, boguscount = 0;
+    int interrupts, nr_serviced = 0;
     struct ei_device *ei_local;
     
     if (dev == NULL) {
@@ -253,7 +269,6 @@
     ei_local = (struct ei_device *) dev->priv;
     if (dev->interrupt || ei_local->irqlock) {
 		/* The "irqlock" check is only for testing. */
-		sti();
 		printk(ei_local->irqlock
 			   ? "%s: Interrupted while interrupts are masked! isr=%#2x imr=%#2x.\n"
 			   : "%s: Reentering the interrupt handler! isr=%#2x imr=%#2x.\n",
@@ -263,7 +278,6 @@
     }
     
     dev->interrupt = 1;
-    sti(); /* Allow other interrupts. */
     
     /* Change to page 0 and read the intr status reg. */
     outb_p(E8390_NODMA+E8390_PAGE0, e8390_base + E8390_CMD);
@@ -273,16 +287,12 @@
     
     /* !!Assumption!! -- we stay in page 0.	 Don't break this. */
     while ((interrupts = inb_p(e8390_base + EN0_ISR)) != 0
-		   && ++boguscount < 9) {
+		   && ++nr_serviced < MAX_SERVICE) {
 		if (dev->start == 0) {
 			printk("%s: interrupt from stopped card\n", dev->name);
 			interrupts = 0;
 			break;
 		}
-		if (interrupts & ENISR_RDC) {
-			/* Ack meaningless DMA complete. */
-			outb_p(ENISR_RDC, e8390_base + EN0_ISR);
-		}
 		if (interrupts & ENISR_OVER) {
 			ei_rx_overrun(dev);
 		} else if (interrupts & (ENISR_RX+ENISR_RX_ERR)) {
@@ -303,17 +313,25 @@
 		if (interrupts & ENISR_TX_ERR) {
 			outb_p(ENISR_TX_ERR, e8390_base + EN0_ISR); /* Ack intr. */
 		}
+
+		if (interrupts & ENISR_RDC) {
+			if (dev->mem_start)
+				outb_p(ENISR_RDC, e8390_base + EN0_ISR);
+		}
+
 		outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, e8390_base + E8390_CMD);
     }
     
-    if (interrupts && ei_debug) {
-		if (boguscount == 9)
+    if ((interrupts & ~ENISR_RDC) && ei_debug) {
+		outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, e8390_base + E8390_CMD);
+		if (nr_serviced == MAX_SERVICE) {
 			printk("%s: Too much work at interrupt, status %#2.2x\n",
 				   dev->name, interrupts);
-		else
+			outb_p(ENISR_ALL, e8390_base + EN0_ISR); /* Ack. most intrs. */
+		} else {
 			printk("%s: unknown interrupt %#2x\n", dev->name, interrupts);
-		outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, e8390_base + E8390_CMD);
-		outb_p(0xff, e8390_base + EN0_ISR); /* Ack. all intrs. */
+			outb_p(0xff, e8390_base + EN0_ISR); /* Ack. all intrs. */
+		}
     }
     dev->interrupt = 0;
     return;
@@ -338,9 +356,9 @@
 			ei_local->tx1 = 0;
 			dev->tbusy = 0;
 			if (ei_local->tx2 > 0) {
+				ei_local->txing = 1;
 				NS8390_trigger_send(dev, ei_local->tx2, ei_local->tx_start_page + 6);
 				dev->trans_start = jiffies;
-				ei_local->txing = 1;
 				ei_local->tx2 = -1,
 				ei_local->lasttx = 2;
 			} else
@@ -352,9 +370,9 @@
 			ei_local->tx2 = 0;
 			dev->tbusy = 0;
 			if (ei_local->tx1 > 0) {
+				ei_local->txing = 1;
 				NS8390_trigger_send(dev, ei_local->tx1, ei_local->tx_start_page);
 				dev->trans_start = jiffies;
-				ei_local->txing = 1;
 				ei_local->tx1 = -1;
 				ei_local->lasttx = 1;
 			} else
@@ -402,7 +420,7 @@
 		rxing_page = inb_p(e8390_base + EN1_CURPAG);
 		outb_p(E8390_NODMA+E8390_PAGE0, e8390_base + E8390_CMD);
 		
-		/* Remove one frame from the ring.  Boundary is alway a page behind. */
+		/* Remove one frame from the ring.  Boundary is always a page behind. */
 		this_frame = inb_p(e8390_base + EN0_BOUNDARY) + 1;
 		if (this_frame >= ei_local->stop_page)
 			this_frame = ei_local->rx_start_page;
@@ -475,12 +493,12 @@
 		
 		/* This _should_ never happen: it's here for avoiding bad clones. */
 		if (next_frame >= ei_local->stop_page) {
-			printk("%s: next frame inconsistency, %#2x..", dev->name,
+			printk("%s: next frame inconsistency, %#2x\n", dev->name,
 				   next_frame);
 			next_frame = ei_local->rx_start_page;
 		}
 		ei_local->current_page = next_frame;
-		outb(next_frame-1, e8390_base+EN0_BOUNDARY);
+		outb_p(next_frame-1, e8390_base+EN0_BOUNDARY);
     }
     /* If any worth-while packets have been received, dev_rint()
        has done a mark_bh(NET_BH) for us and will work on them
@@ -539,6 +557,9 @@
     short ioaddr = dev->base_addr;
     struct ei_device *ei_local = (struct ei_device *) dev->priv;
     
+    /* If the card is stopped, just return the present stats. */
+    if (dev->start == 0) return &ei_local->stat;
+
     /* Read the counter registers, assuming we are in page 0. */
     ei_local->stat.rx_frame_errors += inb_p(ioaddr + EN0_COUNTER0);
     ei_local->stat.rx_crc_errors   += inb_p(ioaddr + EN0_COUNTER1);
@@ -610,6 +631,7 @@
     struct ei_device *ei_local = (struct ei_device *) dev->priv;
     int i;
     int endcfg = ei_local->word16 ? (0x48 | ENDCFG_WTS) : 0x48;
+    unsigned long flags;
     
     /* Follow National Semi's recommendations for initing the DP83902. */
     outb_p(E8390_NODMA+E8390_PAGE0+E8390_STOP, e8390_base); /* 0x21 */
@@ -633,6 +655,7 @@
     
     /* Copy the station address into the DS8390 registers,
        and set the multicast hash bitmap to receive all multicasts. */
+    save_flags(flags);
     cli();
     outb_p(E8390_NODMA + E8390_PAGE1 + E8390_STOP, e8390_base); /* 0x61 */
     for(i = 0; i < 6; i++) {
@@ -645,7 +668,7 @@
     
     outb_p(ei_local->rx_start_page,	 e8390_base + EN1_CURPAG);
     outb_p(E8390_NODMA+E8390_PAGE0+E8390_STOP, e8390_base);
-    sti();
+    restore_flags(flags);
     dev->tbusy = 0;
     dev->interrupt = 0;
     ei_local->tx1 = ei_local->tx2 = 0;
@@ -667,7 +690,6 @@
 {
     int e8390_base = dev->base_addr;
     
-    ei_status.txing = 1;
     outb_p(E8390_NODMA+E8390_PAGE0, e8390_base);
     
     if (inb_p(e8390_base) & E8390_TRANS) {
diff -u --recursive --new-file v1.2.6/linux/drivers/net/8390.h linux/drivers/net/8390.h
--- v1.2.6/linux/drivers/net/8390.h	Mon Jan 16 07:17:36 1995
+++ linux/drivers/net/8390.h	Fri Apr 28 16:56:52 1995
@@ -44,14 +44,13 @@
   unsigned open:1;
   unsigned word16:1;  /* We have the 16-bit (vs 8-bit) version of the card. */
   unsigned txing:1;		/* Transmit Active */
-  unsigned dmaing:2;		/* Remote DMA Active */
   unsigned irqlock:1;		/* 8390's intrs disabled when '1'. */
   unsigned pingpong:1;		/* Using the ping-pong driver */
   unsigned char tx_start_page, rx_start_page, stop_page;
   unsigned char current_page;	/* Read pointer in buffer  */
   unsigned char interface_num;	/* Net port (AUI, 10bT.) to use. */
   unsigned char txqueue;	/* Tx Packet buffer queue length. */
-  unsigned char in_interrupt;
+  unsigned char dmaing;		/* Remote DMA (Tx/Rx/Active) */
   short tx1, tx2;		/* Packet lengths for ping-pong tx. */
   short lasttx;			/* Alpha version consistency check. */
   unsigned char reg0;		/* Register '0' in a WD8013 */
@@ -60,6 +59,12 @@
   /* The new statistics table. */
   struct enet_statistics stat;
 };
+
+/* The maximum number of 8390 interrupt serivce routines called per IRQ. */
+#define MAX_SERVICE 12
+
+/* The maximum number of jiffies waited before assuming a Tx failed. */
+#define TX_TIMEOUT 20 
 
 #define ei_status (*(struct ei_device *)(dev->priv))
 
diff -u --recursive --new-file v1.2.6/linux/drivers/net/Makefile linux/drivers/net/Makefile
--- v1.2.6/linux/drivers/net/Makefile	Thu Feb 23 13:51:27 1995
+++ linux/drivers/net/Makefile	Tue Apr 25 07:27:16 1995
@@ -11,8 +11,8 @@
 MODULES :=
 
 NETDRV_OBJS := Space.o auto_irq.o net_init.o loopback.o
-CFLAGS := $(CFLAGS) -I../../net/inet
-CPP := $(CPP) -I../../net/inet
+override CFLAGS := $(CFLAGS) -I../../net/inet
+override CPP := $(CPP) -I../../net/inet
 
 .c.o:
 	$(CC) $(CFLAGS) -c $<
diff -u --recursive --new-file v1.2.6/linux/drivers/net/ne.c linux/drivers/net/ne.c
--- v1.2.6/linux/drivers/net/ne.c	Fri Apr 28 11:10:53 1995
+++ linux/drivers/net/ne.c	Sat Apr 29 09:49:58 1995
@@ -1,4 +1,3 @@
-#define rw_bugfix
 /* ne.c: A general non-shared-memory NS8390 ethernet driver for linux. */
 /*
     Written 1992-94 by Donald Becker.
@@ -14,8 +13,16 @@
         Code 930.5, Goddard Space Flight Center, Greenbelt MD 20771
 
     This driver should work with many programmed-I/O 8390-based ethernet
-    boards.  Currently it support the NE1000, NE2000, many clones,
+    boards.  Currently it supports the NE1000, NE2000, many clones,
     and some Cabletron products.
+
+    13/04/95 -- Change in philosophy. We now monitor ENISR_RDC for
+    handshaking the Tx PIO xfers. If we don't get a RDC within a
+    reasonable period of time, we know the 8390 has gone south, and we
+    kick the board before it locks the system. Also use set_bit() to
+    create atomic locks on the PIO xfers, and added some defines
+    that the end user can play with to save memory.	-- Paul Gortmaker
+
 */
 
 /* Routines for the NatSemi-based designs (NE[12]000). */
@@ -31,6 +38,20 @@
 
 #include <linux/netdevice.h>
 #include "8390.h"
+
+/* Some defines that people can play with if so inclined. */
+
+/* Do we support clones that don't adhere to 14,15 of the SAprom ? */
+#define CONFIG_NE_BAD_CLONES
+
+/* Do we perform extra sanity checks on stuff ? */
+/* #define CONFIG_NE_SANITY */
+
+/* Do we implement the read before write bugfix ? */
+/* #define CONFIG_NE_RW_BUGFIX */
+
+/* ---- No user-servicable parts below ---- */
+
 extern struct device *init_etherdev(struct device *dev, int sizeof_private,
 				    unsigned long *mem_startp);
 
@@ -39,6 +60,7 @@
 static unsigned int netcard_portlist[] =
 { 0x300, 0x280, 0x320, 0x340, 0x360, 0};
 
+#ifdef CONFIG_NE_BAD_CLONES
 /* A list of bad clones that we none-the-less recognize. */
 static struct { char *name8, *name16; unsigned char SAprefix[4];}
 bad_clone_list[] = {
@@ -46,8 +68,12 @@
     {"DE120", "DE220", {0x00, 0x80, 0xc8,}},
     {"DFI1000", "DFI2000", {'D', 'F', 'I',}}, /* Original, eh?  */
     {"EtherNext UTP8", "EtherNext UTP16", {0x00, 0x00, 0x79}},
+    {"NE1000","NE2000-invalid", {0x00, 0x00, 0xd8}}, /* Ancient real NE1000. */
+    {"NN1000", "NN2000",  {0x08, 0x03, 0x08}}, /* Outlaw no-name clone. */
+    {"4-DIM8","4-DIM16", {0x00,0x00,0x4d,}},  /* Outlaw 4-Dimension cards. */
     {0,}
 };
+#endif
 
 #define NE_BASE	 (dev->base_addr)
 #define NE_CMD	 	0x00
@@ -60,6 +86,8 @@
 #define NESM_START_PG	0x40	/* First page of TX buffer */
 #define NESM_STOP_PG	0x80	/* Last page +1 of RX ring */
 
+#define NE_RDC_TIMEOUT	0x03	/* Max wait in jiffies for Tx RDC */
+
 int ne_probe(struct device *dev);
 static int ne_probe1(struct device *dev, int ioaddr);
 
@@ -126,9 +154,9 @@
     char *name = NULL;
     int start_page, stop_page;
     int neX000, ctron;
-    int reg0 = inb(ioaddr);
+    int reg0 = inb_p(ioaddr);
 
-    if ( reg0 == 0xFF)
+    if (reg0 == 0xFF)
 	return ENODEV;
 
     /* Do a preliminary verification that we have a 8390. */
@@ -140,7 +168,7 @@
 	inb_p(ioaddr + EN0_COUNTER0); /* Clear the counter by reading. */
 	if (inb_p(ioaddr + EN0_COUNTER0) != 0) {
 	    outb_p(reg0, ioaddr);
-	    outb(regd, ioaddr + 0x0d);	/* Restore the old values. */
+	    outb_p(regd, ioaddr + 0x0d);	/* Restore the old values. */
 	    return ENODEV;
 	}
     }
@@ -169,6 +197,7 @@
 	};
 	for (i = 0; i < sizeof(program_seq)/sizeof(program_seq[0]); i++)
 	    outb_p(program_seq[i].value, ioaddr + program_seq[i].offset);
+
     }
     for(i = 0; i < 32 /*sizeof(SA_prom)*/; i+=2) {
 	SA_prom[i] = inb(ioaddr + NE_DATAPORT);
@@ -208,6 +237,7 @@
 	start_page = 0x01;
 	stop_page = (wordlength == 2) ? 0x40 : 0x20;
     } else {
+#ifdef CONFIG_NE_BAD_CLONES
 	/* Ack!  Well, there might be a *bad* NE*000 clone there.
 	   Check for total bogus addresses. */
 	for (i = 0; bad_clone_list[i].name8; i++) {
@@ -227,6 +257,11 @@
 		   SA_prom[14], SA_prom[15]);
 	    return ENXIO;
 	}
+#else
+	printk(" not found.\n");
+	return ENXIO;
+#endif
+
     }
 
 
@@ -242,7 +277,7 @@
 	outb_p(0x00, ioaddr + EN0_IMR); 		/* Mask it again. */
 	dev->irq = autoirq_report(0);
 	if (ei_debug > 2)
-	    printk(" autoirq is %d", dev->irq);
+	    printk(" autoirq is %d\n", dev->irq);
     } else if (dev->irq == 2)
 	/* Fixup for users that don't know that IRQ 2 is really IRQ 9,
 	   or don't know which one to set. */
@@ -251,7 +286,7 @@
     /* Snarf the interrupt now.  There's no point in waiting since we cannot
        share and the board will usually be enabled. */
     {
-	int irqval = request_irq (dev->irq, ei_interrupt, 0, "ne");
+	int irqval = request_irq (dev->irq, ei_interrupt, 0, wordlength==2 ? "ne2000":"ne1000");
 	if (irqval) {
 	    printk (" unable to get IRQ %d (irqval=%d).\n", dev->irq, irqval);
 	    return EAGAIN;
@@ -260,7 +295,7 @@
 
     dev->base_addr = ioaddr;
 
-    request_region(ioaddr, NE_IO_EXTENT,"ne2000");
+    request_region(ioaddr, NE_IO_EXTENT, wordlength==2 ? "ne2000":"ne1000");
 
     for(i = 0; i < ETHER_ADDR_LEN; i++)
 	dev->dev_addr[i] = SA_prom[i];
@@ -318,10 +353,13 @@
 static int
 ne_block_input(struct device *dev, int count, char *buf, int ring_offset)
 {
+#ifdef CONFIG_NE_SANITY
     int xfer_count = count;
+#endif
     int nic_base = dev->base_addr;
 
-    if (ei_status.dmaing) {
+    /* This *shouldn't* happen. If it does, it's the last thing you'll see */
+    if (set_bit(0,(void*)&ei_status.dmaing)) {
 	if (ei_debug > 0)
 	    printk("%s: DMAing conflict in ne_block_input "
 		   "[DMAstat:%d][irqlock:%d][intr:%d].\n",
@@ -329,7 +367,7 @@
 		   dev->interrupt);
 	return 0;
     }
-    ei_status.dmaing |= 0x01;
+    ei_status.dmaing |= 0x02;
     outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, nic_base+ NE_CMD);
     outb_p(count & 0xff, nic_base + EN0_RCNTLO);
     outb_p(count >> 8, nic_base + EN0_RCNTHI);
@@ -338,14 +376,18 @@
     outb_p(E8390_RREAD+E8390_START, nic_base + NE_CMD);
     if (ei_status.word16) {
       insw(NE_BASE + NE_DATAPORT,buf,count>>1);
-      if (count & 0x01)
-	buf[count-1] = inb(NE_BASE + NE_DATAPORT), xfer_count++;
+      if (count & 0x01) {
+	buf[count-1] = inb(NE_BASE + NE_DATAPORT);
+#ifdef CONFIG_NE_SANITY
+	xfer_count++;
+#endif
+      }
     } else {
 	insb(NE_BASE + NE_DATAPORT, buf, count);
     }
 
     /* This was for the ALPHA version only, but enough people have
-       encountering problems that it is still here.  If you see
+       been encountering problems so it is still here.  If you see
        this message you either 1) have a slightly incompatible clone
        or 2) have noise/speed problems with your bus. */
 #ifdef CONFIG_NE_SANITY
@@ -353,7 +395,7 @@
 	int addr, tries = 20;
 	do {
 	    /* DON'T check for 'inb_p(EN0_ISR) & ENISR_RDC' here
-	       -- it's broken! Check the "DMA" address instead. */
+	       -- it's broken for Rx on some cards! */
 	    int high = inb_p(nic_base + EN0_RSARHI);
 	    int low = inb_p(nic_base + EN0_RSARLO);
 	    addr = (high << 8) + low;
@@ -366,7 +408,8 @@
 		   dev->name, ring_offset + xfer_count, addr);
     }
 #endif
-    ei_status.dmaing &= ~0x01;
+    outb_p(ENISR_RDC, nic_base + EN0_ISR);	/* Ack intr. */
+    ei_status.dmaing &= ~0x03;
     return ring_offset + count;
 }
 
@@ -374,15 +417,20 @@
 ne_block_output(struct device *dev, int count,
 		const unsigned char *buf, const int start_page)
 {
+#ifdef CONFIG_NE_SANITY
     int retries = 0;
+#endif
     int nic_base = NE_BASE;
+    unsigned long dma_start;
 
     /* Round the count up for word writes.  Do we need to do this?
        What effect will an odd byte count have on the 8390?
        I should check someday. */
     if (ei_status.word16 && (count & 0x01))
       count++;
-    if (ei_status.dmaing) {
+
+    /* This *shouldn't* happen. If it does, it's the last thing you'll see */
+    if (set_bit(0,(void*)&ei_status.dmaing)) {
 	if (ei_debug > 0)
 	    printk("%s: DMAing conflict in ne_block_output."
 		   "[DMAstat:%d][irqlock:%d][intr:%d]\n",
@@ -390,12 +438,15 @@
 		   dev->interrupt);
 	return;
     }
-    ei_status.dmaing |= 0x02;
+    ei_status.dmaing |= 0x04;
     /* We should already be in page 0, but to be safe... */
     outb_p(E8390_PAGE0+E8390_START+E8390_NODMA, nic_base + NE_CMD);
 
+#ifdef CONFIG_NE_SANITY
  retry:
-#if defined(rw_bugfix)
+#endif
+
+#ifdef CONFIG_NE_RW_BUGFIX 
     /* Handle the read-before-write bug the same way as the
        Crynwr packet driver -- the NatSemi method doesn't work.
        Actually this doesn't always work either, but if you have
@@ -411,6 +462,9 @@
     SLOW_DOWN_IO;
 #endif  /* rw_bugfix */
 
+    dma_start = jiffies;
+    outb_p(ENISR_RDC, nic_base + EN0_ISR);
+
    /* Now the normal output. */
     outb_p(count & 0xff, nic_base + EN0_RCNTLO);
     outb_p(count >> 8,   nic_base + EN0_RCNTHI);
@@ -426,12 +480,10 @@
 
 #ifdef CONFIG_NE_SANITY
     /* This was for the ALPHA version only, but enough people have
-       encountering problems that it is still here. */
+       been encountering problems so it is still here. */
     if (ei_debug > 1) {		/* DMA termination address check... */
 	int addr, tries = 20;
 	do {
-	    /* DON'T check for 'inb_p(EN0_ISR) & ENISR_RDC' here
-	       -- it's broken! Check the "DMA" address instead. */
 	    int high = inb_p(nic_base + EN0_RSARHI);
 	    int low = inb_p(nic_base + EN0_RSARLO);
 	    addr = (high << 8) + low;
@@ -447,7 +499,17 @@
 	}
     }
 #endif
-    ei_status.dmaing &= ~0x02;
+
+    while ((inb_p(nic_base + EN0_ISR) & ENISR_RDC) == 0)
+	if (jiffies - dma_start > NE_RDC_TIMEOUT) {
+		printk("%s: timeout waiting for Tx RDC.\n", dev->name);
+		ne_reset_8390(dev);
+		NS8390_init(dev,1);
+		break;
+	}
+
+    outb_p(ENISR_RDC, nic_base + EN0_ISR);	/* Ack intr. */
+    ei_status.dmaing &= ~0x05;
     return;
 }
 
diff -u --recursive --new-file v1.2.6/linux/drivers/net/wd.c linux/drivers/net/wd.c
--- v1.2.6/linux/drivers/net/wd.c	Mon Jan  9 07:56:29 1995
+++ linux/drivers/net/wd.c	Fri Apr 28 16:56:53 1995
@@ -368,6 +368,7 @@
 	if (ei_debug > 1)
 		printk("%s: Shutting down ethercard.\n", dev->name);
 	NS8390_init(dev, 0);
+	dev->start = 0;
 
 	/* Change from 16-bit to 8-bit shared memory so reboot works. */
 	outb(ei_status.reg5, wd_cmdreg + WD_CMDREG5 );
diff -u --recursive --new-file v1.2.6/linux/drivers/scsi/53c7,8xx.c linux/drivers/scsi/53c7,8xx.c
--- v1.2.6/linux/drivers/scsi/53c7,8xx.c	Fri Apr 28 11:10:54 1995
+++ linux/drivers/scsi/53c7,8xx.c	Fri Apr 28 11:17:57 1995
@@ -740,7 +740,7 @@
        So, we stick it past the end of our hostdata structure.
 
        ASSUMPTION : 
-       	 Irregardless of how many simultaenous SCSI commands we allow,
+       	 Regardless of how many simultaneous SCSI commands we allow,
          the probe code only executes a _single_ instruction at a time,
 	 so we only need one here, and don't need to allocate NCR53c7x0_cmd
 	 structures for each target until we are no longer in scan_scsis
@@ -2304,8 +2304,8 @@
 /*
  * Function static struct NCR53c7x0_cmd *create_cmd (Scsi_Cmnd *cmd) 
  *
- * Purpose : If we have not allready allocated enough NCR53c7x0_cmd
- *	structures to satisfy any allowable number of simultaenous 
+ * Purpose : If we have not already allocated enough NCR53c7x0_cmd
+ *	structures to satisfy any allowable number of simultaneous 
  *	commands for this host; do so (using either scsi_malloc()
  *	or kmalloc() depending on configuration), and add them to the 
  *	hostdata free list.  Take the first structure off the free list, 
@@ -2339,9 +2339,9 @@
     unsigned long flags;
     NCR53c7x0_local_setup(cmd->host);
 
-/* FIXME : when we start doing multiple simultaenous commands per LUN, 
+/* FIXME : when we start doing multiple simultaneous commands per LUN, 
    we will need to either
-    	- Do an attach_slave() and detach_slave() the right way (alocate
+    	- Do an attach_slave() and detach_slave() the right way (allocate
     	  memory in attach_slave() as we do in scsi_register).
     	- Make sure this code works
     with the former being cleaner.  At the same time, we can also go with
@@ -2355,7 +2355,7 @@
     	!(hostdata->cmd_allocated[cmd->target] & (1 << cmd->lun))) {
     	for (i = host->hostt->cmd_per_lun - 1; i >= 0  --i) {
 #ifdef SCSI_MALLOC
-    /* scsi_malloc must allocate with a 512 byte granularity, but allways
+    /* scsi_malloc must allocate with a 512 byte granularity, but always
        returns buffers which are aligned on a 512 boundary */
 	    size = (hostdata->max_cmd_size + 511) / 512 * 512;
 	    tmp = (struct NCR53c7x0_cmd *) scsi_malloc (size);
@@ -3815,7 +3815,7 @@
     save_flags(flags);
     halt (host);
     NCR53c7x0_write8(SCNTL1_REG, SCNTL1_RST);
-    udelay(25);	/* Minimum ammount of time to assert RST */
+    udelay(25);	/* Minimum amount of time to assert RST */
     NCR53c7x0_write8(SCNTL1_REG, SCNTL1_RST);
     for (c = (struct NCR53c7x0_cmd *) hostdata->running_list, found = 0; c; 
     	c = (struct NCR53c7x0_cmd *) c->next)  {
@@ -3899,7 +3899,7 @@
  *	reset.  
  */
     NCR53c7x0_write8(SCNTL1_REG, SCNTL1_RST);
-    udelay(25);	/* Minimum ammount of time to assert RST */
+    udelay(25);	/* Minimum amount of time to assert RST */
     NCR53c7x0_write8(SCNTL1_REG, SCNTL1_RST);
     restore_flags (flags);
     return 0;
diff -u --recursive --new-file v1.2.6/linux/drivers/scsi/53c7,8xx.h linux/drivers/scsi/53c7,8xx.h
--- v1.2.6/linux/drivers/scsi/53c7,8xx.h	Fri Apr 28 11:10:54 1995
+++ linux/drivers/scsi/53c7,8xx.h	Fri Apr 28 11:17:57 1995
@@ -59,7 +59,7 @@
 #endif
 
 #define NCR53c7xx {NULL, NULL, "NCR53c{7,8}xx (rel 4)", NCR53c7xx_detect, 	\
-    	NULL, /* info */ NULL, /* command, depricated */ NULL, 		\
+    	NULL, /* info */ NULL, /* command, deprecated */ NULL, 		\
 	NCR53c7xx_queue_command, NCR53c7xx_abort, NCR53c7xx_reset,	\
         NULL /* slave attach */, scsicam_bios_param, /* can queue */ 1, \
 	/* id */ 7, 127 /* old SG_ALL */, /* cmd per lun */ 1 , 	\
diff -u --recursive --new-file v1.2.6/linux/drivers/scsi/ChangeLog linux/drivers/scsi/ChangeLog
--- v1.2.6/linux/drivers/scsi/ChangeLog	Fri Apr 28 11:10:55 1995
+++ linux/drivers/scsi/ChangeLog	Fri Apr 28 11:17:56 1995
@@ -89,7 +89,7 @@
 	* 53c7,8xx.c: crash on AEN fixed, SCSI reset is no longer a NOP,
 	  NULL pointer panic on odd UDCs fixed, two bugs in diagnostic output 
 	  fixed, should initialize correctly if left running, now loadable, 
- 	  new memory allocation, extraneous diagnostic output supressed,
+ 	  new memory allocation, extraneous diagnostic output suppressed,
 	  splx() replaced with save/restore flags. [ Drew ]
 
 	* hosts.c, hosts.h, scsi_ioctl.c, sd.c, sd_ioctl.c, sg.c, sr.c,
@@ -111,7 +111,7 @@
 	* sr.c: More photo-cd hacks to make sure we get the xa stuff right.
 	* sr.h, sr.c: Change is_xa to xa_flags field.
 
-	* st.c: Diable retries for write operations.
+	* st.c: Disable retries for write operations.
 
 Wed Feb 15 10:52:56 1995  Eric Youngdale  (eric@andante)
 
@@ -181,7 +181,7 @@
 
 	* Linux 1.1.89 released.
 
-	* Makefile, u14-34f.c: Modulariz.e
+	* Makefile, u14-34f.c: Modularize.
 
 	* Makefile, eata.c: Modularize.  Now version 1.14
 
@@ -202,7 +202,7 @@
 
 	* scsi.h: Define QUEUE_FULL condition.
 
-	* sd.c: Do not check for non-existant partition until after
+	* sd.c: Do not check for non-existent partition until after
 	new media check.
 
 	* sg.c: Undo previous change which was wrong.
@@ -281,7 +281,7 @@
 
 	* scsi.c: Make RECOVERED_ERROR a SUGGEST_IS_OK.
 
-	* sd.c: Fail if we are opening a non-existant partition.
+	* sd.c: Fail if we are opening a non-existent partition.
 
 	* sr.c: Bump SR_TIMEOUT to 15000.
 	Do not probe for media size at boot time(hard on changers).
diff -u --recursive --new-file v1.2.6/linux/fs/buffer.c linux/fs/buffer.c
--- v1.2.6/linux/fs/buffer.c	Thu Mar  9 20:37:35 1995
+++ linux/fs/buffer.c	Fri Apr 28 11:30:17 1995
@@ -1849,7 +1849,7 @@
 		/* If there are still a lot of dirty buffers around, skip the sleep
 		   and flush some more */
 		
-		if(nr_buffers_type[BUF_DIRTY] < (nr_buffers - nr_buffers_type[BUF_SHARED]) * 
+		if(nr_buffers_type[BUF_DIRTY] <= (nr_buffers - nr_buffers_type[BUF_SHARED]) * 
 		   bdf_prm.b_un.nfract/100) {
 		   	if (current->signal & (1 << (SIGKILL-1))) {
 				bdflush_running--;
diff -u --recursive --new-file v1.2.6/linux/include/asm-alpha/byteorder.h linux/include/asm-alpha/byteorder.h
--- v1.2.6/linux/include/asm-alpha/byteorder.h	Fri Apr 28 11:10:56 1995
+++ linux/include/asm-alpha/byteorder.h	Sat Apr 29 10:20:21 1995
@@ -6,8 +6,13 @@
 #undef htonl
 #undef htons
 
+#ifndef LITTLE_ENDIAN
 #define LITTLE_ENDIAN
+#endif
+
+#ifndef LITTLE_ENDIAN_BITFIELD
 #define LITTLE_ENDIAN_BITFIELD
+#endif
 
 extern unsigned long int	ntohl(unsigned long int);
 extern unsigned short int	ntohs(unsigned short int);
diff -u --recursive --new-file v1.2.6/linux/include/asm-i386/byteorder.h linux/include/asm-i386/byteorder.h
--- v1.2.6/linux/include/asm-i386/byteorder.h	Fri Apr 28 11:10:56 1995
+++ linux/include/asm-i386/byteorder.h	Sat Apr 29 10:19:32 1995
@@ -6,8 +6,13 @@
 #undef htonl
 #undef htons
 
+#ifndef LITTLE_ENDIAN
 #define LITTLE_ENDIAN 1234
+#endif
+
+#ifndef LITTLE_ENDIAN_BITFIELD
 #define LITTLE_ENDIAN_BITFIELD
+#endif
 
 extern unsigned long int	ntohl(unsigned long int);
 extern unsigned short int	ntohs(unsigned short int);
