diff -u --recursive --new-file v1.3.94/linux/CREDITS linux/CREDITS
--- v1.3.94/linux/CREDITS	Tue Apr 23 13:57:00 1996
+++ linux/CREDITS	Tue Apr 23 13:21:53 1996
@@ -410,6 +410,13 @@
 E: philipg@onsett.com
 D: Kernel / timekeeping stuff
 
+N: Dmitry S. Gorodchanin
+E: begemot@bgm.rosprint.net
+D: RISCom/8 driver, misc kernel fixes.
+S: 6/1 M.Koneva bl, apt #125 
+S: Poltava 314023
+S: Ukraine
+
 N: Grant Guenther
 E: grant@torque.net
 D: Iomega PPA / ZIP driver
@@ -555,7 +562,7 @@
 S: United Kingdom
 
 N: Michael K. Johnson
-E: johnsonm@sunsite.unc.edu
+E: johnsonm@redhat.com
 D: The Linux Documentation Project
 D: Kernel Hackers' Guide
 D: Procps
@@ -1365,10 +1372,3 @@
 S: 3078 Sulphur Spring Court
 S: San Jose, California 95148
 S: USA
-
-N: Dmitry S. Gorodchanin
-E: begemot@bgm.rosprint.net
-D: RISCom/8 driver, misc kernel fixes.
-S: 6/1 M.Koneva bl, apt #125 
-S: Poltava 314023
-S: Ukraine
diff -u --recursive --new-file v1.3.94/linux/Documentation/Configure.help linux/Documentation/Configure.help
--- v1.3.94/linux/Documentation/Configure.help	Tue Apr 23 13:57:00 1996
+++ linux/Documentation/Configure.help	Tue Apr 23 13:20:20 1996
@@ -16,7 +16,7 @@
 # does, only the first occurrence will be used by Configure. The lines
 # in a help text should be indented two positions. Lines starting with
 # `#' are ignored. To be nice to menuconfig, limit your lines to 70
-# chars. Use emacs' kfill.el to edit this file or you lose.
+# characters. Use emacs' kfill.el to edit this file or you lose.
 #
 # If you add a help text to this file, please try to be as gentle as
 # possible. Don't use unexplained acronyms and generally write for the
@@ -24,7 +24,7 @@
 # installed Linux and is now recompiling the kernel for the first
 # time. Tell them what to do if they're unsure. Technical information
 # should go in a README in the Documentation directory. Mention all 
-# the relevant READMEs in the help text.
+# the relevant READMEs and HOWTOs in the help text.
 #
 # All this was shamelessly stolen from several different sources. Many
 # thanks to all the contributors.  Feel free to use these help texts
@@ -557,7 +557,9 @@
   newer 1.3 kernel or one of the stable 1.2 versions. If you want to
   compile this as a module ( = code which can be inserted in and
   removed from the running kernel whenever you want), say M here and
-  read Documentation/modules.txt.
+  read Documentation/modules.txt. Saying M or N here is dangerous
+  because some crucial programs on your system might be in ELF
+  format. 
 
 Compile kernel as ELF - if your GCC is ELF-GCC
 CONFIG_KERNEL_ELF
@@ -585,7 +587,8 @@
   this older executable format. If you don't know what to answer at
   this point then answer Y. You may answer M for module support and
   later load the module when you find a program which needs a.out
-  format.
+  format. Saying M or N here is dangerous, because some crucial
+  programs on your system might be in A.OUT format.
 
 Processor type
 CONFIG_M386
@@ -655,9 +658,12 @@
   by itself, together with the user level daemon "kerneld".  Note that
   "kerneld" will also automatically unload all unused modules, so you
   don't have to use "rmmod" either.
-  There are some other "kernel callouts" that will be available
-  later on, such as a user level "beeper" and a generic screen blanker.
-  The "kerneld" daemon is included in "modules-1.2.8" and later.
+  kerneld will also provide support for different user-level beeper
+  and screen blanker programs later on.
+  The "kerneld" daemon is included in the package "modules-1.2.8" and
+  later. You will probably want to read the kerneld mini-HOWTO,
+  available via ftp (user: anonymous) from
+  sunsite.unc.edu:/pub/Linux/docs/HOWTO/mini. If unsure, say Y.
 
 ARP daemon support
 CONFIG_ARPD
@@ -1048,10 +1054,20 @@
 
 Bridging (test)
 CONFIG_BRIDGE
-  Enables bridge mode support in the box. This allows you to use a Linux
-  box (suitably configured) as an ethernet bridge including 802.1 spanning
-  tree support. This is in test. There are a small batch of changes before
-  final release but it should work nicely.
+  If you enable this, your Linux box will be able to act as an
+  ethernet bridge, which means that the different ethernet segments it
+  is connected to will appear as one ethernet to the
+  participants. Several such bridges can work together to create even
+  larger networks of ethernets using a cool spanning tree
+  algorithm. Note that if your box acts as a bridge, it probably
+  contains several ethernet devices, but the kernel is not able to
+  recognize more than one at boot time without help; for details read
+  the Multiple-Ethernet-mini-HOWTO, available via ftp (user:
+  anonymous) in sunsite.unc.edu:/pub/Linux/docs/HOWTO/mini. The
+  Bridging code is still in test. If unsure, say N.
+###
+### How to use?
+###
 
 Kernel/User network link driver(ALPHA)
 CONFIG_NETLINK
@@ -1213,19 +1229,29 @@
 BusLogic SCSI support
 CONFIG_SCSI_BUSLOGIC
   This is support for BusLogic MultiMaster SCSI Host Adaptors.
-  Consult the documentation in drivers/scsi/README.BusLogic for more
-  information.  BusLogic FlashPoint SCSI Host Adapters are not
-  supported by this driver.  If this driver does not work correctly
-  without modification, please consult the author.  This driver may
-  also be built as a module, but only a single instance may be loaded.
-  You might also want to read the SCSI-HOWTO, available via anonymous
-  ftp from sunsite.unc.edu:/pub/Linux/docs/HOWTO.
- 
+  Consult the SCSI-HOWTO, available via anonymous ftp from
+  sunsite.unc.edu:/pub/Linux/docs/HOWTO and the file
+  drivers/scsi/README.BusLogic for more information. BusLogic
+  FlashPoint SCSI Host Adapters are not supported by this driver, but
+  BusLogic has initiated an upgrade program which allows you to get a
+  better adaptor for few $$. Read about it in
+  drivers/scsi/README.FlashPoint.  If this driver does not work
+  correctly without modification, please contact the author.  You can
+  build this driver also as a module ( = code which can be inserted in
+  and removed from the running kernel whenever you want), but only a
+  single instance may be loaded. If you want to compile it as a
+  module, say M here and read Documentation/modules.txt.
+
 DTC3180/3280 SCSI support
 CONFIG_SCSI_DTC3280
-  This is support for DTC 3180/3280 SCSI Host Adaptors.  It does not
-  use IRQ's.  It does not support parity on the SCSI bus.
- 
+  This is support for DTC 3180/3280 SCSI Host Adaptors.  Please read
+  the SCSI-HOWTO, available via ftp (user: anonymous) at
+  sunsite.unc.edu:/pub/Linux/docs/HOWTO and the file
+  drivers/scsi/README.dtc3x80.  This driver is also available as a
+  module (= code which can be inserted in and removed from the running
+  kernel whenever you want). If you want to compile it as a module,
+  say M here and read Documentation/modules.txt.
+
 EATA-DMA (DPT, NEC, ATT, Olivetti for ISA, EISA, PCI) support
 CONFIG_SCSI_EATA_DMA
   This is support for the EATA-DMA protocol compliant SCSI Host Adaptors
@@ -1328,6 +1354,12 @@
   adaptor. Some systems have problems with that speed, so it's safest
   to say N here.
  
+allow DISCONNECT
+CONFIG_SCSI_NCR53C7xx_DISCONNECT
+###
+### Dunno
+###
+
 Always IN2000 SCSI support (test release)
 CONFIG_SCSI_IN2000
   Believe it or not, there is a SCSI host adaptor of that name. It is
@@ -1588,6 +1620,14 @@
   think you might get a Metricom radio in the future, there is no harm in
   saying yes to STRIP now, except that it makes the kernel a bit bigger.
 
+WIC (Radio IP bridge)
+CONFIG_WIC
+  Don't know what this is; has something to do with the parallel
+  port. Say N and that's that. But if you want to compile it as a
+  module ( = code which can be inserted in and removed from the
+  running kernel whenever you want), say M here and read
+  Documentation/modules.txt. :-)
+
 Z8530 SCC kiss emulation driver for AX.2
 CONFIG_SCC
   These cards are used to connect your Linux box to an amateur radio
@@ -1813,12 +1853,12 @@
 3c505 support
 CONFIG_ELPLUS
   Information about this network (ethernet) card can be found in
-  drivers/net/README.3c505. If you have a card of this type, say Y and
-  read the Ethernet-HOWTO, available via ftp (user: anonymous) in
-  sunsite.unc.edu:/pub/Linux/docs/HOWTO.  If you want to compile this
-  as a module ( = code which can be inserted in and removed from the
-  running kernel whenever you want), say M here and read
-  Documentation/modules.txt as well as
+  Documentation/networking/3c505.txt. If you have a card of this type,
+  say Y and read the Ethernet-HOWTO, available via ftp (user:
+  anonymous) in sunsite.unc.edu:/pub/Linux/docs/HOWTO.  If you want to
+  compile this as a module ( = code which can be inserted in and
+  removed from the running kernel whenever you want), say M here and
+  read Documentation/modules.txt as well as
   Documentation/networking/net-modules.txt. If you plan to use more
   than one network card under linux, read the
   Multiple-Ethernet-mini-HOWTO, available from
@@ -2199,19 +2239,18 @@
 DECchip Tulip (dc21x4x) PCI support
 CONFIG_DEC_ELCP
   This driver is developed for the SMC EtherPower series ethernet
-  cards and also works with the DECchip 21040/21041/21140
-  (Tulip series) based other cards.  If you have a network card of
-  this type, say Y and read the Ethernet-HOWTO, available via ftp
-  (user: anonymous) in sunsite.unc.edu:/pub/Linux/docs/HOWTO. More
-  specific information is contained in
-  Documentation/networking/tulip.txt. This driver is also available
-  as a module ( = code which can be inserted in and removed from
-  the running kernel whenever you want).  If you want to compile
+  cards and also works with cards based on the DECchip
+  21040/21041/21140 (Tulip series) chips. (If your card is NOT SMC
+  EtherPower 10/100 PCI (smc9332dst), you can also try the driver from
+  "DE425, DE434, DE435 support", above.) However, most people with a
+  network card of this type will say Y here. Do read the
+  Ethernet-HOWTO, available via ftp (user: anonymous) in
+  sunsite.unc.edu:/pub/Linux/docs/HOWTO. More specific information is
+  contained in Documentation/networking/tulip.txt. This driver is also
+  available as a module ( = code which can be inserted in and removed
+  from the running kernel whenever you want).  If you want to compile
   it as a module, say M here and read Documentation/modules.txt as
   well as Documentation/networking/net-modules.txt.
-  ******************************************************************
-      If your card is NOT SMC EtherPower 10/100 PCI (smc9332dst),
-      you can try the de4x5.c driver.
 
 Digi Intl. RightSwitch support
 CONFIG_DGRS
@@ -2478,14 +2517,13 @@
   N.B. options are case sensitive. 
   Read Documentation/cdrom/isp16 for details. 
 
-
 Quota support
 CONFIG_QUOTA
   If you say Y here, you will be able to set per user limits for disk
   usage (also called diskquotas). Currently, it works only for the
   ext2 filesystem; you need the software available via ftp (user:
-  anonymous) from
-  sunsite.unc.edu:/pub/Linux/system/Admin/quota_acct.tar.gz in order to
+  anonymous) in
+  ftp.funet.fi:/pub/Linux/People/Linux/subsystems/quota/ in order to
   use it. Probably this is only useful for multi user systems. If
   unsure, say N.
 
@@ -3023,7 +3061,7 @@
   the CPU becomes idle.  (On machines with more than one CPU, this option
   does nothing.)
 
-Black display
+Enable console blanking using APM
 CONFIG_APM_DISPLAY_BLANK
   Enable console blanking using the APM.  Some laptops can use this to
   turn off the LCD backlight when the VC screen blanker blanks the
@@ -3089,16 +3127,17 @@
 Enhanced Real Time Clock Support
 CONFIG_RTC
   If you enable this option and create a character special file
-  /dev/rtc with major number 10 and minor number 135 using mknod
-  ("man mknod"), you will get access to the real time clock built
-  into your computer. It can be used to generate signals from as
-  low as 1Hz up to 8192Hz, and can also be used as a 24 hour alarm.
-  It reports status information via the file /proc/rtc and its 
-  behaviour is set by various ioctls on /dev/rtc. People running
-  SMP versions of Linux should enable this option to read and set
-  the RTC clock in a SMP compatible fashion. If you think you
-  have a use for such a device (such as periodic data sampling), then 
-  say Y here, and go read the file Documentation/rtc.txt for details.
+  /dev/rtc with major number 10 and minor number 135 using mknod ("man
+  mknod"), you will get access to the real time clock built into your
+  computer. Every PC has such a clock built in. It can be used to
+  generate signals from as low as 1Hz up to 8192Hz, and can also be
+  used as a 24 hour alarm.  It reports status information via the file
+  /proc/rtc and its behaviour is set by various ioctls on
+  /dev/rtc. People running SMP (= multiprocessor) versions of Linux
+  should enable this option to read and set the RTC clock in a SMP
+  compatible fashion. If you think you have a use for such a device
+  (such as periodic data sampling), then say Y here, and go read the
+  file Documentation/rtc.txt for details.
 
 Sound card support
 CONFIG_SOUND
@@ -3148,7 +3187,7 @@
   modem emulator. Network devices support autodial, channel-bundling,
   callback and caller-authentication without having a daemon
   running. A reduced T.70 protocol is supported with tty's suitable
-  for German BTX. Currently Cards by Teles and compatibles and ICN are
+  for German BTX. Currently cards by Teles and compatibles and ICN are
   supported. On D-Channel, the protocols EDSS1 and 1TR6 are
   supported. See Documentation/isdn/README for more information.
 
@@ -3212,7 +3251,7 @@
 # LocalWords:  unc edu docs emu README kB BLK DEV FD Thinkpad fd MFM RLL IDE gz
 # LocalWords:  cdrom harddisk diskless netboot nfs xzvf ATAPI MB harddrives ide
 # LocalWords:  HD harddisks CDROMs IDECD NEC MITSUMI filesystem XT XD PCI bios
-# LocalWords:  ISA EISA Microchannel VESA BIOSes IPC SYSVIPC ipc Ctrl
+# LocalWords:  ISA EISA Microchannel VESA BIOSes IPC SYSVIPC ipc Ctrl dmesg hlt
 # LocalWords:  BINFMT Linkable http ac uk jo html GCC Sparc AVANTI CABRIOLET EB
 # LocalWords:  netscape gcc LD CC toplevel MODVERSIONS insmod rmmod modprobe IP
 # LocalWords:  genksyms INET loopback gatewaying ethernet internet PPP ARP Arp
@@ -3249,12 +3288,12 @@
 # LocalWords:  pppd Zilog ZS soundcards SRM bootloader ez mainmenu rarp ipfwadm
 # LocalWords:  RTNETLINK mknod xos MTU lwared Macs mac netatalk macs cs Wolff
 # LocalWords:  dartmouth flowerpt MultiMaster FlashPoint tudelft etherexpress
-# LocalWords:  ICL EtherTeam ETH IDESCSI TXC SmartRAID SmartCache
+# LocalWords:  ICL EtherTeam ETH IDESCSI TXC SmartRAID SmartCache httpd sjc dlp
 # LocalWords:  thesphere TwoServers BOOTP DHCP ncpfs BPQETHER BPQ chipsets MG
 # LocalWords:  bsd comp Sparcstation le SunOS ie Gracilis PackeTwin PT pt LU FX
 # LocalWords:  FX TEAC SoundBlaster CR CreativeLabs LCS mS ramdisk IDETAPE cmd
 # LocalWords:  Vertos Genoa Funai hsfs NCP NetWare tgz APM apm ioctls UltraLite
-# LocalWords:  TravelMate CDT LCD backlight VC RPC Mips DECStation AXP
+# LocalWords:  TravelMate CDT LCD backlight VC RPC Mips DECStation AXP barlow
 # LocalWords:  PMAX MILO Alphas Multia Tseng linuxelf endian mipsel mips drv HT
 # LocalWords:  KERNELD kerneld callouts AdvanSys advansys diskquotas Admin WDT
 # LocalWords:  wdt hdb hdc bugfix SiS vlb Acculogic CSA DTC dtc Holtek ht QDI
@@ -3270,4 +3309,6 @@
 # LocalWords:  FC DC dc PPA IOMEGA's ppa RNFS FMV Fujitsu ARPD arpd loran layes
 # LocalWords:  FRAD indiana framerelay DLCI DCLIs Sangoma SDLA mrouted sync sec
 # LocalWords:  Starmode Metricom MosquitoNet mosquitonet kbit nfsroot Digiboard
-# LocalWords:  DIGI Xe Xeve digiboard UMISC touchscreens
+# LocalWords:  DIGI Xe Xeve digiboard UMISC touchscreens mtu ethernets HBAs MEX
+# LocalWords:  Shifflett netcom js jshiffle WIC DECchip ELCP EtherPower dst RTC
+# LocalWords:  rtc SMP
diff -u --recursive --new-file v1.3.94/linux/Documentation/devices.txt linux/Documentation/devices.txt
--- v1.3.94/linux/Documentation/devices.txt	Sun Apr 21 19:21:59 1996
+++ linux/Documentation/devices.txt	Tue Apr 23 12:31:46 1996
@@ -9,7 +9,7 @@
 is a registry of allocated major device numbers, as well as the
 recommended /dev directory nodes for these devices.
 
-The lastest version of this list is included with the Linux kernel
+The latest version of this list is included with the Linux kernel
 sources in LaTeX and ASCII form.  In case of discrepancy, the LaTeX
 version is authoritative.
 
diff -u --recursive --new-file v1.3.94/linux/Documentation/isdn/README.pcbit linux/Documentation/isdn/README.pcbit
--- v1.3.94/linux/Documentation/isdn/README.pcbit	Sun Apr 21 19:21:59 1996
+++ linux/Documentation/isdn/README.pcbit	Tue Apr 23 12:31:46 1996
@@ -5,12 +5,12 @@
 The PCBIT is a Euro ISDN adapter manufactured in Portugal by Octal and
 developed in cooperation with Portugal Telecom and Inesc.
 The driver interfaces with the standard kernel isdn facilities
-originaly developed by Fritz Elfert in the isdn4linux project.
+originally developed by Fritz Elfert in the isdn4linux project.
 
 The common versions of the pcbit board require a firmware that is 
 distributed (and copyrighted) by the manufacturer. To load this
-firmware you need "pcbitctl" availiable on the standard isdn4k-utils
-package or in the pcbit package availiable in:
+firmware you need "pcbitctl" available on the standard isdn4k-utils
+package or in the pcbit package available in:
 
 ftp://ftp.di.fc.ul.pt/pub/systems/Linux/isdn
 
diff -u --recursive --new-file v1.3.94/linux/Documentation/isdn/syncPPP.FAQ linux/Documentation/isdn/syncPPP.FAQ
--- v1.3.94/linux/Documentation/isdn/syncPPP.FAQ	Sun Apr 21 19:21:59 1996
+++ linux/Documentation/isdn/syncPPP.FAQ	Tue Apr 23 12:31:46 1996
@@ -2,16 +2,16 @@
 
 Q: pppd,ipppd, syncPPP , asyncPPP .. what is that ?
   what should I use?
-A: The pppd is for asynchronous PPP .. asynchron means
+A: The pppd is for asynchronous PPP .. asynchronous means
 here, the framing is character based. (e.g when
 using ttyI* or tty* devices)
 
 The ipppd handles PPP packets coming in HDLC
 frames (bit based protocol) ... The PPP driver
-in isdn4linux pushs all IP packets direct
+in isdn4linux pushes all IP packets direct
 to the network layer and all PPP protocol
 frames to the /dev/ippp* device. 
-So, the ipppd is a simple externel network
+So, the ipppd is a simple external network
 protocol handler.
 
 If you login into a remote machine using the
@@ -23,7 +23,7 @@
 syncPPP machine .. use the network device part
 of isdn4linux with the 'syncppp' encapsulation
 and make sure, that the ipppd is running and 
-conneted to at least one /dev/ippp*. Check the 
+connected to at least one /dev/ippp*. Check the 
 isdn4linux manual on how to configure a network device.
 
 Q: when I start the ipppd .. I only get the
@@ -42,7 +42,7 @@
 Q: when I list the netdevices with ifconfig I see, that
    my ISDN interface has a HWaddr and IRQ=0 and Base 
    address = 0 
-A: The device is a fake ethernetdevice .. ignore IRQ and baseaddr
+A: The device is a fake ethernet device .. ignore IRQ and baseaddr
    You need the HWaddr only for ethernet encapsulation.
    
 
diff -u --recursive --new-file v1.3.94/linux/Makefile linux/Makefile
--- v1.3.94/linux/Makefile	Tue Apr 23 13:57:01 1996
+++ linux/Makefile	Wed Apr 24 16:40:03 1996
@@ -1,6 +1,6 @@
 VERSION = 1
 PATCHLEVEL = 3
-SUBLEVEL = 94
+SUBLEVEL = 95
 
 ARCH = i386
 
diff -u --recursive --new-file v1.3.94/linux/README linux/README
--- v1.3.94/linux/README	Fri Mar 15 11:01:45 1996
+++ linux/README	Wed Apr 24 07:40:36 1996
@@ -139,14 +139,10 @@
 
 COMPILING the kernel:
 
- - make sure you have gcc-2.5.8 or newer available.  It seems older gcc
+ - make sure you have gcc-2.6.3 or newer available.  It seems older gcc
    versions can have problems compiling newer versions of linux.  If you
    upgrade your compiler, remember to get the new binutils package too
-   (for as/ld/nm and company). Do not use gcc-2.6.0; it has a few serious
-   bugs.  Some problems have been reported occasionally with 2.6.3 as well,
-   so use that version at your own risk.  Specifying "-fno-strength-reduce" 
-   in the CFLAGS of the main Makefile may help to work around a known
-   bug in gcc.
+   (for as/ld/nm and company).
 
  - do a "make zImage" to create a compressed kernel image.  If you want
    to make a bootdisk (without root filesystem or lilo), insert a floppy
diff -u --recursive --new-file v1.3.94/linux/arch/alpha/defconfig linux/arch/alpha/defconfig
--- v1.3.94/linux/arch/alpha/defconfig	Tue Apr 23 13:57:01 1996
+++ linux/arch/alpha/defconfig	Tue Apr 23 16:43:27 1996
@@ -180,6 +180,7 @@
 CONFIG_ISO9660_FS=y
 # CONFIG_HPFS_FS is not set
 # CONFIG_SYSV_FS is not set
+# CONFIG_AFFS_FS is not set
 # CONFIG_UFS_FS is not set
 
 #
diff -u --recursive --new-file v1.3.94/linux/arch/alpha/kernel/entry.S linux/arch/alpha/kernel/entry.S
--- v1.3.94/linux/arch/alpha/kernel/entry.S	Mon Mar  4 11:46:31 1996
+++ linux/arch/alpha/kernel/entry.S	Wed Apr 24 16:30:19 1996
@@ -428,13 +428,13 @@
 .globl	sys_fork
 .ent	sys_fork
 sys_fork:
-	br $1,do_switch_stack
+	bsr $1,do_switch_stack
 	bis $31,SIGCHLD,$16
 	bis $31,$31,$17
 	bis $30,$30,$18
 	lda $27,alpha_clone
 	jsr $26,($27),alpha_clone
-	br $1,undo_switch_stack
+	bsr $1,undo_switch_stack
 	ret $31,($26),1
 .end	sys_fork
 
@@ -442,12 +442,12 @@
 .globl	sys_clone
 .ent	sys_clone
 sys_clone:
-	br $1,do_switch_stack
+	bsr $1,do_switch_stack
 	/* arg1 and arg2 come from the user */
 	bis $30,$30,$18
 	lda $27,alpha_clone
 	jsr $26,($27),alpha_clone
-	br $1,undo_switch_stack
+	bsr $1,undo_switch_stack
 	ret $31,($26),1
 .end	sys_clone
 
@@ -455,9 +455,9 @@
 .globl  alpha_switch_to
 .ent    alpha_switch_to
 alpha_switch_to:
-	br $1,do_switch_stack
+	bsr $1,do_switch_stack
 	call_pal PAL_swpctx
-	br $1,undo_switch_stack
+	bsr $1,undo_switch_stack
 	ret $31,($26),1
 .end alpha_switch_to
 
@@ -477,6 +477,13 @@
 	stq	$17,32($30)
 	stq	$18,40($30)
 	SAVE_ALL
+	/* FIXME: optimize */
+	lda	$1,current_set
+	ldq	$2,0($1)
+	ldq	$3,TASK_FLAGS($2)
+	and     $3,PF_PTRACED,$3
+	bne     $3,strace
+	/* end of strace */	
 	lda	$1,NR_SYSCALLS($31)
 	lda	$2,sys_call_table
 	lda	$27,do_entSys
@@ -523,6 +530,68 @@
 restore_all:
 	RESTORE_ALL
 	rti
+	
+	
+/* PTRACE syscall handler */	
+.align 3
+strace:
+	/* set up signal stack, call syscall_trace */
+	bsr	$1,do_switch_stack
+	lda     $27,syscall_trace
+	jsr     $26,($27),syscall_trace
+	bsr	$1,undo_switch_stack
+
+	/* get the system call number and the argments back.. */
+	ldq     $0,0($30)
+	ldq     $16,SP_OFF+24($30)
+	ldq     $17,SP_OFF+32($30)
+	ldq     $18,SP_OFF+40($30)
+	ldq     $19,72($30)
+	ldq     $20,80($30)
+	ldq     $21,88($30)
+
+	/* get the system call pointer.. */
+	lda	$1,NR_SYSCALLS($31)
+	lda	$2,sys_call_table
+	lda	$27,do_entSys
+	cmpult	$0,$1,$1
+	s8addq	$0,$2,$2
+	beq	$1,1f
+	ldq	$27,0($2)
+1:	jsr	$26,($27),do_entSys
+
+	/* check return.. */
+	blt	$0,strace_error	/* the call failed */
+	stq	$31,72($30)		/* a3=0 => no error */
+strace_success:
+	stq	$0,0($30)		/* save return value */
+
+	bsr	$1,do_switch_stack
+	lda     $27,syscall_trace
+	jsr     $26,($27),syscall_trace
+	bsr	$1,undo_switch_stack
+	br	$31,ret_from_sys_call
+
+	.align  3
+strace_error:
+	ldq	$9,0($30)	/* old syscall nr (zero if success) */
+	beq	$9,strace_success
+	ldq	$10,72($30)	/* .. and this a3 */
+
+	subq	$31,$0,$0	/* with error in v0 */
+	addq	$31,1,$1	/* set a3 for errno return */
+	stq	$0,0($30)
+	stq	$1,72($30)	/* a3 for return */
+
+	bsr	$1,do_switch_stack
+	lda     $27,syscall_trace
+	jsr     $26,($27),syscall_trace
+	bsr	$1,undo_switch_stack
+
+	bis	$31,$31,$26	/* tell "ret_from_sys_call" that we can restart */
+	bis	$9,$9,$19	/*  .. old syscall nr */
+	bis	$10,$10,$20	/*  .. old a3 */
+	br	$31,ret_from_sys_call
 
 	.align 3
 handle_bottom_half:
diff -u --recursive --new-file v1.3.94/linux/arch/alpha/kernel/ksyms.c linux/arch/alpha/kernel/ksyms.c
--- v1.3.94/linux/arch/alpha/kernel/ksyms.c	Fri Apr 12 15:51:45 1996
+++ linux/arch/alpha/kernel/ksyms.c	Tue Apr 23 12:49:55 1996
@@ -27,6 +27,7 @@
 static struct symbol_table arch_symbol_table = {
 #include <linux/symtab_begin.h>
 	/* platform dependent support */
+
 	X(_inb),
 	X(_inw),
 	X(_inl),
@@ -47,6 +48,10 @@
 	X(__remlu),
 	X(__divqu),
 	X(__remqu),
+	X(insl),
+	X(insw),
+	X(outsl),
+	X(outsw),
 	X(strcat),
 	X(strcmp),
 	X(strcpy),
diff -u --recursive --new-file v1.3.94/linux/arch/alpha/lib/Makefile linux/arch/alpha/lib/Makefile
--- v1.3.94/linux/arch/alpha/lib/Makefile	Fri Dec 22 08:22:05 1995
+++ linux/arch/alpha/lib/Makefile	Wed Apr 24 12:57:53 1996
@@ -8,6 +8,9 @@
 lib.a: $(OBJS)
 	$(AR) rcs lib.a $(OBJS)
 
+memset.o: memset.S
+	$(CC) -c -o memset.o memset.S
+
 __divqu.o: divide.S
 	$(CC) -DDIV -c -o __divqu.o divide.S
 
diff -u --recursive --new-file v1.3.94/linux/arch/alpha/lib/memset.S linux/arch/alpha/lib/memset.S
--- v1.3.94/linux/arch/alpha/lib/memset.S	Thu Jan  1 02:00:00 1970
+++ linux/arch/alpha/lib/memset.S	Tue Apr 23 20:49:01 1996
@@ -0,0 +1,106 @@
+/*
+ * linux/arch/alpha/memset.S
+ *
+ * This is an efficient (and small) implementation of the C library "memset()"
+ * function for the alpha.
+ *
+ *	(C) Copyright 1996 Linus Torvalds
+ *
+ * This routine is "moral-ware": you are free to use it any way you wish, and
+ * the only obligation I put on you is a moral one: if you make any improvements
+ * to the routine, please send me your improvements for me to use similarly.
+ *
+ * The scheduling comments are according to the EV5 documentation (and done by 
+ * hand, so they might well be incorrect, please do tell me about it..)
+ */
+
+	.set noat
+	.set noreorder
+.text
+	.globl __memset
+	.globl __constant_c_memset
+	.ent __memset
+.align 5
+__memset:
+	.frame $30,0,$26,0
+	.prologue 0
+
+	zapnot $17,1,$17	/* E0 */
+	sll $17,8,$1		/* E1 (p-c latency, next cycle) */
+	bis $17,$1,$17		/* E0 (p-c latency, next cycle) */
+	sll $17,16,$1		/* E1 (p-c latency, next cycle) */
+
+	bis $17,$1,$17		/* E0 (p-c latency, next cycle) */
+	sll $17,32,$1		/* E1 (p-c latency, next cycle) */
+	bis $17,$1,$17		/* E0 (p-c latency, next cycle) */
+	ldq_u $31,0($30)	/* .. E1 */
+
+.align 5
+__constant_c_memset:
+	addq $18,$16,$6		/* E0 */
+	bis $16,$16,$0		/* .. E1 */
+	xor $16,$6,$1		/* E0 */
+	ble $18,end		/* .. E1 */
+
+	bic $1,7,$1		/* E0 */
+	beq $1,within_one_quad	/* .. E1 (note EV5 zero-latency forwarding) */
+	and $16,7,$3		/* E0 */
+	beq $3,aligned		/* .. E1 (note EV5 zero-latency forwarding) */
+
+	ldq_u $4,0($16)		/* E0 */
+	bis $16,$16,$5		/* .. E1 */
+	insql $17,$16,$2	/* E0 */
+	subq $3,8,$3		/* .. E1 */
+
+	addq $18,$3,$18		/* E0		$18 is new count ($3 is negative) */
+	mskql $4,$16,$4		/* .. E1 (and possible load stall) */
+	subq $16,$3,$16		/* E0 		$16 is new aligned destination */
+	bis $2,$4,$1		/* .. E1 */
+
+	bis $31,$31,$31		/* E0 */
+	ldq_u $31,0($30)	/* .. E1 */
+	stq_u $1,0($5)		/* E0 */
+	bis $31,$31,$31		/* .. E1 */
+
+.align 4
+aligned:
+	sra $18,3,$3		/* E0 */
+	and $18,7,$18		/* .. E1 */
+	bis $16,$16,$5		/* E0 */
+	beq $3,no_quad		/* .. E1 */
+
+.align 3
+loop:
+	stq $17,0($5)		/* E0 */
+	subq $3,1,$3		/* .. E1 */
+	addq $5,8,$5		/* E0 */
+	bne $3,loop		/* .. E1 */
+
+no_quad:
+	bis $31,$31,$31		/* E0 */
+	beq $18,end		/* .. E1 */
+	ldq $7,0($5)		/* E0 */
+	mskqh $7,$6,$2		/* .. E1 (and load stall) */
+
+	insqh $17,$6,$4		/* E0 */
+	bis $2,$4,$1		/* .. E1 */
+	stq $1,0($5)		/* E0 */
+	ret $31,($26),1		/* .. E1 */
+
+.align 3
+within_one_quad:
+	ldq_u $1,0($16)		/* E0 */
+	insql $17,$16,$2	/* E1 */
+	mskql $1,$16,$4		/* E0 (after load stall) */
+	bis $2,$4,$2		/* E0 */
+
+	mskql $2,$6,$4		/* E0 */
+	mskqh $1,$6,$2		/* .. E1 */
+	bis $2,$4,$1		/* E0 */
+	stq_u $1,0($16)		/* E0 */
+
+end:
+	ret $31,($26),1		/* E1 */
+	.end __memset
+
+.weakext memset, __memset
diff -u --recursive --new-file v1.3.94/linux/arch/alpha/lib/memset.c linux/arch/alpha/lib/memset.c
--- v1.3.94/linux/arch/alpha/lib/memset.c	Fri Dec 22 08:22:05 1995
+++ linux/arch/alpha/lib/memset.c	Thu Jan  1 02:00:00 1970
@@ -1,46 +0,0 @@
-/*
- *  linux/arch/alpha/lib/memset.c
- *
- *  Copyright (C) 1995  Linus Torvalds
- */
-
-/*
- * These are only slightly optimized so far..
- */
-
-#include <linux/types.h>
-
-inline void * __constant_c_memset(void * s, unsigned long c, long count)
-{
-	unsigned long xs = (unsigned long) s;
-
-	/*
-	 * the first and last parts could be done with just one
-	 * unaligned load/store, but I don't want to think about it
-	 */
-	while (count > 0 && (xs & 7)) {
-		*(char *) xs = c;
-		count--; xs++;
-	}
-	while (count > 7) {
-		*(unsigned long *) xs = c;
-		count -=8; xs += 8;
-	}
-	while (count > 0) {
-		*(char *) xs = c;
-		count--; xs++;
-	}
-	return s;
-}
-
-void * __memset(void * s,char c,size_t count)
-{
-	__constant_c_memset(s,0x0101010101010101UL * (unsigned char) c, count);
-	return s;
-}
-
-/*
- * gcc-2.7.1 and newer generate calls to memset and memcpy.  So we
- * need to define that here:
- */
-asm (".weakext memset, __memset");
diff -u --recursive --new-file v1.3.94/linux/arch/i386/defconfig linux/arch/i386/defconfig
--- v1.3.94/linux/arch/i386/defconfig	Tue Apr 23 13:57:01 1996
+++ linux/arch/i386/defconfig	Tue Apr 23 13:41:49 1996
@@ -138,6 +138,7 @@
 CONFIG_ISO9660_FS=y
 # CONFIG_HPFS_FS is not set
 # CONFIG_SYSV_FS is not set
+# CONFIG_AFFS_FS is not set
 # CONFIG_UFS_FS is not set
 
 #
diff -u --recursive --new-file v1.3.94/linux/arch/m68k/fpsp040/README linux/arch/m68k/fpsp040/README
--- v1.3.94/linux/arch/m68k/fpsp040/README	Thu Jan  1 02:00:00 1970
+++ linux/arch/m68k/fpsp040/README	Wed Apr 24 07:36:50 1996
@@ -0,0 +1,30 @@
+
+MOTOROLA MICROPROCESSOR & MEMORY TECHNOLOGY GROUP
+M68000 Hi-Performance Microprocessor Division
+M68040 Software Package
+
+M68040 Software Package Copyright (c) 1993, 1994 Motorola Inc.
+All rights reserved.
+
+THE SOFTWARE is provided on an "AS IS" basis and without warranty.
+To the maximum extent permitted by applicable law,
+MOTOROLA DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A
+PARTICULAR PURPOSE and any warranty against infringement with
+regard to the SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF)
+and any accompanying written materials. 
+
+To the maximum extent permitted by applicable law,
+IN NO EVENT SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER
+(INCLUDING WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS
+PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR
+OTHER PECUNIARY LOSS) ARISING OF THE USE OR INABILITY TO USE THE
+SOFTWARE.  Motorola assumes no responsibility for the maintenance
+and support of the SOFTWARE.  
+
+You are hereby granted a copyright license to use, modify, and
+distribute the SOFTWARE so long as this entire notice is retained
+without alteration in any modified and/or redistributed versions,
+and that such modified versions are clearly identified as such.
+No licenses are granted by implication, estoppel or otherwise
+under any patents or trademarks of Motorola, Inc.
diff -u --recursive --new-file v1.3.94/linux/arch/sparc/boot/README linux/arch/sparc/boot/README
--- v1.3.94/linux/arch/sparc/boot/README	Sun Apr 21 19:21:59 1996
+++ linux/arch/sparc/boot/README	Tue Apr 23 12:31:35 1996
@@ -17,5 +17,5 @@
 More will come....
 
 Hopefully I can write this such that it will work on almost all SUN
-machines in existance.  We'll see ;(
+machines in existence.  We'll see ;(
 
diff -u --recursive --new-file v1.3.94/linux/arch/sparc/kernel/auxio.c linux/arch/sparc/kernel/auxio.c
--- v1.3.94/linux/arch/sparc/kernel/auxio.c	Sun Apr 21 19:21:59 1996
+++ linux/arch/sparc/kernel/auxio.c	Tue Apr 23 12:31:45 1996
@@ -31,7 +31,7 @@
 	/* Map the register both read and write */
 	auxio_register = (unsigned char *) sparc_alloc_io(auxregs[0].phys_addr, 0,
 							  auxregs[0].reg_size,
-							  "auxilliaryIO",
+							  "auxiliaryIO",
 							  auxregs[0].which_io, 0x0);
 	/* Fix the address on sun4m and sun4c. */
 	if((((unsigned long) auxregs[0].phys_addr) & 3) == 3 ||
diff -u --recursive --new-file v1.3.94/linux/arch/sparc/kernel/entry.S linux/arch/sparc/kernel/entry.S
--- v1.3.94/linux/arch/sparc/kernel/entry.S	Sun Apr 21 19:21:59 1996
+++ linux/arch/sparc/kernel/entry.S	Tue Apr 23 12:31:35 1996
@@ -413,7 +413,7 @@
 	LEAVE_IRQ
 	RESTORE_ALL
 
-	/* This routine handles illegal isntructions and privileged
+	/* This routine handles illegal instructions and privileged
 	 * instruction attempts from user code.
 	 */
 	.align	4
@@ -728,7 +728,7 @@
 	ENTER_SYSCALL
 
 	/* Ugh, we need to clear the IRQ line.  This is now
-	 * a very sun4c specific trap hanler...
+	 * a very sun4c specific trap handler...
 	 */
 	sethi	%hi(C_LABEL(interrupt_enable)), %l5
 	ld	[%l5 + %lo(C_LABEL(interrupt_enable))], %l5
@@ -847,7 +847,7 @@
 	be	1f
 	 nop
 
-	/* Asyncronous fault, why you little ?!#&%@... */
+	/* Asynchronous fault, why you little ?!#&%@... */
 	sethi	%hi(0x80000000), %o2
 	st	%o2, [%l5 + 0xc]
 	WRITE_PAUSE
diff -u --recursive --new-file v1.3.94/linux/arch/sparc/kernel/etrap.S linux/arch/sparc/kernel/etrap.S
--- v1.3.94/linux/arch/sparc/kernel/etrap.S	Sun Apr 21 19:22:00 1996
+++ linux/arch/sparc/kernel/etrap.S	Tue Apr 23 12:31:35 1996
@@ -65,7 +65,7 @@
 	 * T == Window entered when trap occurred
 	 * S == Window we will need to save if (1<<T) == %wim
 	 *
-	 * Before execution gets here, it must be guarenteed that
+	 * Before execution gets here, it must be guaranteed that
 	 * %l0 contains trap time %psr, %l1 and %l2 contain the
 	 * trap pc and npc, and %l3 contains the trap time %wim.
 	 */
@@ -181,7 +181,7 @@
 		 mov	%t_kstack, %sp			! and onto kernel stack
 
 trap_setup_user_spill:
-		/* A spill occured from either kernel or user mode
+		/* A spill occurred from either kernel or user mode
 		 * and there exist some user windows to deal with.
 		 * A mask of the currently valid user windows
 		 * is in %g1 upon entry to here.
@@ -200,7 +200,7 @@
 	wr	%g2, 0x0, %wim
 	WRITE_PAUSE
 
-	/* Call MMU-architecture dependant stack checking
+	/* Call MMU-architecture dependent stack checking
 	 * routine.
 	 */
 	.globl	C_LABEL(tsetup_mmu_patchme)
diff -u --recursive --new-file v1.3.94/linux/arch/sparc/kernel/head.S linux/arch/sparc/kernel/head.S
--- v1.3.94/linux/arch/sparc/kernel/head.S	Sun Apr 21 19:22:00 1996
+++ linux/arch/sparc/kernel/head.S	Tue Apr 23 12:31:35 1996
@@ -582,7 +582,7 @@
 
 		/* Calculate to KERNBASE entry.
 		 *
-		 * XXX Should not use imperical constant, but Gas gets an  XXX
+		 * XXX Should not use empirical constant, but Gas gets an  XXX
 		 * XXX upset stomach with the bitshift I would have to use XXX
 		 */
 		add	%o1, 0x3c0, %o3		
@@ -629,7 +629,7 @@
 		sll	%g1, 0x8, %g1			! make phys addr for l1 tbl
 
 		lda	[%g1] ASI_M_BYPASS, %g2		! get level1 entry for 0x0
-		add	%g1, 0x3c0, %g3			! XXX AWAY WITH IMPERICALS
+		add	%g1, 0x3c0, %g3			! XXX AWAY WITH EMPIRICALS
 		sta	%g2, [%g3] ASI_M_BYPASS		! place at KERNBASE entry
 		b	go_to_highmem
 		 nop					! wheee....
@@ -812,7 +812,7 @@
  * be sitting in the fault status/address registers.  Read them all to
  * clear them so we don't get magic faults later on.
  */
-/* This sucks, aparently this makes Vikings call prom panic, will fix later */
+/* This sucks, apparently this makes Vikings call prom panic, will fix later */
 
 		rd	%psr, %o1
 		srl	%o1, 28, %o1		! Get a type of the CPU
diff -u --recursive --new-file v1.3.94/linux/arch/sparc/kernel/idprom.c linux/arch/sparc/kernel/idprom.c
--- v1.3.94/linux/arch/sparc/kernel/idprom.c	Sun Apr 21 19:22:00 1996
+++ linux/arch/sparc/kernel/idprom.c	Tue Apr 23 12:31:35 1996
@@ -21,7 +21,7 @@
 
 /* Here is the master table of Sun machines which use some implementation
  * of the Sparc CPU and have a meaningful IDPROM machtype value that we
- * know about.  See asm-sparc/machines.h for imperical constants.
+ * know about.  See asm-sparc/machines.h for empirical constants.
  */
 struct Sun_Machine_Models Sun_Machines[NUM_SUN_MACHINES] = {
 /* First, Sun4's */
diff -u --recursive --new-file v1.3.94/linux/arch/sparc/kernel/ioport.c linux/arch/sparc/kernel/ioport.c
--- v1.3.94/linux/arch/sparc/kernel/ioport.c	Sun Apr 21 19:22:00 1996
+++ linux/arch/sparc/kernel/ioport.c	Tue Apr 23 12:31:35 1996
@@ -61,7 +61,7 @@
 		
 	len += offset;
 	if(((unsigned long) virtual + len) > (IOBASE_VADDR + IOBASE_LEN)) {
-		prom_printf("alloc_io: Mapping ouside IOBASE area\n");
+		prom_printf("alloc_io: Mapping outside IOBASE area\n");
 		prom_halt();
 	}
 	if(check_region ((vaddr | offset), len)) {
@@ -84,11 +84,11 @@
 	return (void *) (base_address | offset);
 }
 
-/* Does DVMA allocations with PAGE_SIZE granulatity.  How this basically
+/* Does DVMA allocations with PAGE_SIZE granularity.  How this basically
  * works is that the ESP chip can do DVMA transfers at ANY address with
- * certain size and boundry restrictions.  But other devices that are
+ * certain size and boundary restrictions.  But other devices that are
  * attached to it and would like to do DVMA have to set things up in
- * a special way, if the DVMA see's a device attached to it transfer data
+ * a special way, if the DVMA sees a device attached to it transfer data
  * at addresses above DVMA_VADDR it will grab them, this way it does not
  * now have to know the peculiarities of where to read the Lance data
  * from. (for example)
diff -u --recursive --new-file v1.3.94/linux/arch/sparc/kernel/irq.c linux/arch/sparc/kernel/irq.c
--- v1.3.94/linux/arch/sparc/kernel/irq.c	Sun Apr 21 19:22:00 1996
+++ linux/arch/sparc/kernel/irq.c	Tue Apr 23 12:31:35 1996
@@ -150,7 +150,7 @@
 	}
 	if (action->flags & SA_STATIC_ALLOC)
 	{
-	    /* This interrupt is marked as specially allocted
+	    /* This interrupt is marked as specially allocated
 	     * so it is a bad idea to free it.
 	     */
 	    printk("Attempt to free statically allocated IRQ%d (%s)\n",
diff -u --recursive --new-file v1.3.94/linux/arch/sparc/kernel/process.c linux/arch/sparc/kernel/process.c
--- v1.3.94/linux/arch/sparc/kernel/process.c	Sun Apr 21 19:22:00 1996
+++ linux/arch/sparc/kernel/process.c	Tue Apr 23 12:31:45 1996
@@ -215,7 +215,7 @@
  * Parent -->  %o0 == childs  pid, %o1 == 0
  * Child  -->  %o0 == parents pid, %o1 == 1
  *
- * NOTE: We have a seperate fork kpsr/kwim because
+ * NOTE: We have a separate fork kpsr/kwim because
  *       the parent could change these values between
  *       sys_fork invocation and when we reach here
  *       if the parent should sleep while trying to
diff -u --recursive --new-file v1.3.94/linux/arch/sparc/kernel/sclow.S linux/arch/sparc/kernel/sclow.S
--- v1.3.94/linux/arch/sparc/kernel/sclow.S	Sun Apr 21 19:22:00 1996
+++ linux/arch/sparc/kernel/sclow.S	Tue Apr 23 12:31:45 1996
@@ -1,5 +1,5 @@
 /* sclow.S: Low level special syscall handling.
- *          Basically these are cases where we can completly
+ *          Basically these are cases where we can completely
  *          handle the system call without saving any state
  *          because we know that the process will not sleep.
  *
diff -u --recursive --new-file v1.3.94/linux/arch/sparc/kernel/setup.c linux/arch/sparc/kernel/setup.c
--- v1.3.94/linux/arch/sparc/kernel/setup.c	Sun Apr 21 19:22:00 1996
+++ linux/arch/sparc/kernel/setup.c	Tue Apr 23 12:31:45 1996
@@ -55,7 +55,7 @@
 	return memory_start;
 }
 
-/* Typing sync at the prom promptcalls the function pointed to by
+/* Typing sync at the prom prompt calls the function pointed to by
  * romvec->pv_synchook which I set to the following function.
  * This should sync all filesystems and return, for now it just
  * prints out pretty messages and returns.
diff -u --recursive --new-file v1.3.94/linux/arch/sparc/kernel/smp.c linux/arch/sparc/kernel/smp.c
--- v1.3.94/linux/arch/sparc/kernel/smp.c	Sun Apr 21 19:22:00 1996
+++ linux/arch/sparc/kernel/smp.c	Tue Apr 23 12:31:45 1996
@@ -50,8 +50,8 @@
 volatile int cpu_number_map[NR_CPUS];
 volatile int cpu_logical_map[NR_CPUS];
 
-/* The only guarenteed locking primitive available on all Sparc
- * processors is 'ldstub [%reg + immediate], %dest_reg' which atomicly
+/* The only guaranteed locking primitive available on all Sparc
+ * processors is 'ldstub [%reg + immediate], %dest_reg' which atomically
  * places the current byte at the effective address into dest_reg and
  * places 0xff there afterwards.  Pretty lame locking primitive
  * compared to the Alpha and the intel no?  Most Sparcs have 'swap'
diff -u --recursive --new-file v1.3.94/linux/arch/sparc/kernel/sparc-stub.c linux/arch/sparc/kernel/sparc-stub.c
--- v1.3.94/linux/arch/sparc/kernel/sparc-stub.c	Sun Apr 21 19:22:00 1996
+++ linux/arch/sparc/kernel/sparc-stub.c	Tue Apr 23 12:31:35 1996
@@ -4,7 +4,7 @@
  * Modifications to run under Linux
  * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
  *
- * This file origionally came from the gdb sources, and the
+ * This file originally came from the gdb sources, and the
  * copyright notices have been retained below.
  */
 
@@ -439,7 +439,7 @@
 }
 
 /*
- * This function does all command procesing for interfacing to gdb.  It
+ * This function does all command processing for interfacing to gdb.  It
  * returns 1 if you should skip the instruction at the trap address, 0
  * otherwise.
  */
diff -u --recursive --new-file v1.3.94/linux/arch/sparc/kernel/sun4c_irq.c linux/arch/sparc/kernel/sun4c_irq.c
--- v1.3.94/linux/arch/sparc/kernel/sun4c_irq.c	Sun Apr 21 19:22:00 1996
+++ linux/arch/sparc/kernel/sun4c_irq.c	Tue Apr 23 12:31:45 1996
@@ -1,7 +1,7 @@
 /*  sun4c_irq.c
  *  arch/sparc/kernel/sun4c_irq.c:
  *
- *  djhr: Hacked out of irq.c into a CPU dependant version.
+ *  djhr: Hacked out of irq.c into a CPU dependent version.
  *
  *  Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
  *  Copyright (C) 1995 Miguel de Icaza (miguel@nuclecu.unam.mx)
diff -u --recursive --new-file v1.3.94/linux/arch/sparc/kernel/sun4m_irq.c linux/arch/sparc/kernel/sun4m_irq.c
--- v1.3.94/linux/arch/sparc/kernel/sun4m_irq.c	Sun Apr 21 19:22:00 1996
+++ linux/arch/sparc/kernel/sun4m_irq.c	Tue Apr 23 12:31:45 1996
@@ -1,7 +1,7 @@
 /*  sun4m_irq.c
  *  arch/sparc/kernel/sun4m_irq.c:
  *
- *  djhr: Hacked out of irq.c into a CPU dependant version.
+ *  djhr: Hacked out of irq.c into a CPU dependent version.
  *
  *  Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
  *  Copyright (C) 1995 Miguel de Icaza (miguel@nuclecu.unam.mx)
@@ -307,7 +307,7 @@
     
 	if (linux_num_cpus > 1) {
 		/* system wide interrupts go to cpu 0, this should always
-		 * be safe because it is guarenteed to be fitted or OBP doesn't
+		 * be safe because it is guaranteed to be fitted or OBP doesn't
 		 * come up
 		 *
 		 * Not sure, but writing here on SLAVIO systems may puke
diff -u --recursive --new-file v1.3.94/linux/arch/sparc/kernel/sunos_ioctl.c linux/arch/sparc/kernel/sunos_ioctl.c
--- v1.3.94/linux/arch/sparc/kernel/sunos_ioctl.c	Sun Apr 21 19:22:00 1996
+++ linux/arch/sparc/kernel/sunos_ioctl.c	Tue Apr 23 12:31:45 1996
@@ -53,7 +53,7 @@
 		}
 	}
 
-	/* Binary compatability is good American knowhow fuckin' up. */
+	/* Binary compatibility is good American knowhow fuckin' up. */
 	if(cmd == TIOCNOTTY)
 		return sys_setsid();
 
diff -u --recursive --new-file v1.3.94/linux/arch/sparc/kernel/sys_sparc.c linux/arch/sparc/kernel/sys_sparc.c
--- v1.3.94/linux/arch/sparc/kernel/sys_sparc.c	Sun Apr 21 19:22:00 1996
+++ linux/arch/sparc/kernel/sys_sparc.c	Tue Apr 23 12:31:45 1996
@@ -27,7 +27,7 @@
 
 /*
  * sys_pipe() is the normal C calling standard for creating
- * a pipe. It's not the way unix tranditionally does this, though.
+ * a pipe. It's not the way unix traditionally does this, though.
  */
 asmlinkage int sparc_pipe(struct pt_regs *regs)
 {
diff -u --recursive --new-file v1.3.94/linux/arch/sparc/kernel/sys_sunos.c linux/arch/sparc/kernel/sys_sunos.c
--- v1.3.94/linux/arch/sparc/kernel/sys_sunos.c	Sun Apr 21 19:22:00 1996
+++ linux/arch/sparc/kernel/sys_sunos.c	Tue Apr 23 12:31:45 1996
@@ -1,5 +1,5 @@
 /* $Id: sys_sunos.c,v 1.37 1996/04/19 16:52:38 miguel Exp $
- * sys_sunos.c: SunOS specific syscall compatability support.
+ * sys_sunos.c: SunOS specific syscall compatibility support.
  *
  * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
  * Copyright (C) 1995 Miguel de Icaza (miguel@nuclecu.unam.mx)
@@ -193,7 +193,7 @@
 }
 
 /* XXX Completely undocumented, and completely magic...
- * XXX I belive it is to increase the size of the stack by
+ * XXX I believe it is to increase the size of the stack by
  * XXX argument 'increment' and return the new end of stack
  * XXX area.  Wheee...
  */
@@ -262,7 +262,7 @@
  * low-bit is one  == Page is currently residing in core
  * All other bits are undefined within the character so there...
  * Also, if you try to get stats on an area outside of the user vm area
- * *or* the passed base address is not aligned on a page boundry you
+ * *or* the passed base address is not aligned on a page boundary you
  * get an error.
  */
 asmlinkage int sunos_mincore(unsigned long addr, unsigned long len, char *array)
@@ -301,7 +301,7 @@
 }
 
 /* This just wants the soft limit (ie. rlim_cur element) of the RLIMIT_NOFILE
- * resource limit and is for backwards compatability with older sunos
+ * resource limit and is for backwards compatibility with older sunos
  * revs.
  */
 asmlinkage long sunos_getdtablesize(void)
@@ -413,7 +413,7 @@
 	return cnt - buf.count;
 }
 
-/* Old sunos getdirentries, severely broken compatability stuff here. */
+/* Old sunos getdirentries, severely broken compatibility stuff here. */
 struct sunos_direntry {
     unsigned long  d_ino;
     unsigned short d_reclen;
@@ -701,7 +701,7 @@
 		return error;
 	/* Ok, here comes the fun part: Linux's nfs mount needs a
 	 * socket connection to the server, but SunOS mount does not
-	 * requiere this, so we use the information on the destination
+	 * require this, so we use the information on the destination
 	 * address to create a socket and bind it to a reserved
 	 * port on this system
 	 */
diff -u --recursive --new-file v1.3.94/linux/arch/sparc/kernel/systbls.S linux/arch/sparc/kernel/systbls.S
--- v1.3.94/linux/arch/sparc/kernel/systbls.S	Sun Apr 21 19:22:01 1996
+++ linux/arch/sparc/kernel/systbls.S	Tue Apr 23 12:31:45 1996
@@ -1,5 +1,5 @@
 /* $Id: systbls.S,v 1.38 1996/04/20 08:43:26 davem Exp $
- * systbls.S: System call entry point tables for OS compatability.
+ * systbls.S: System call entry point tables for OS compatibility.
  *            The native Linux system call table lives here also.
  *
  * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
diff -u --recursive --new-file v1.3.94/linux/arch/sparc/kernel/wuf.S linux/arch/sparc/kernel/wuf.S
--- v1.3.94/linux/arch/sparc/kernel/wuf.S	Sun Apr 21 19:22:01 1996
+++ linux/arch/sparc/kernel/wuf.S	Tue Apr 23 12:31:45 1996
@@ -234,7 +234,7 @@
 	 * check routines in wof.S, these routines are free to use
 	 * any of the local registers they want to as this window
 	 * does not belong to anyone at this point, however the
-	 * outs and ins are still verbotten as they are part of
+	 * outs and ins are still verboten as they are part of
 	 * 'someone elses' window possibly.
 	 */
 
@@ -345,7 +345,7 @@
 	be	fwin_user_finish_up
 	 nop
 
-	/* Did I ever tell you about my window labotomy?
+	/* Did I ever tell you about my window lobotomy?
 	 * anyways... fwin_user_stack_is_bolixed expects
 	 * to be in window 'W' so make it happy or else
 	 * we watchdog badly.
diff -u --recursive --new-file v1.3.94/linux/arch/sparc/lib/strlen.S linux/arch/sparc/lib/strlen.S
--- v1.3.94/linux/arch/sparc/lib/strlen.S	Sun Apr 21 19:22:01 1996
+++ linux/arch/sparc/lib/strlen.S	Tue Apr 23 12:31:45 1996
@@ -42,7 +42,7 @@
 	sethi	%hi(LO_MAGIC),%g3
 	or	%g3,%lo(LO_MAGIC),%o2
 next_word:
-	ld	[%o0],%g2		! no dependancies
+	ld	[%o0],%g2		! no dependencies
 next_word_preloaded:
 	sub	%g2,%o2,%g2		! lots of locks here
 	andcc	%g2,%o3,%g0		! and I dont like it...
diff -u --recursive --new-file v1.3.94/linux/arch/sparc/mm/fault.c linux/arch/sparc/mm/fault.c
--- v1.3.94/linux/arch/sparc/mm/fault.c	Sun Apr 21 19:22:01 1996
+++ linux/arch/sparc/mm/fault.c	Tue Apr 23 12:31:45 1996
@@ -86,7 +86,7 @@
 	sp_banks[i].base_addr = 0xdeadbeef;
 	sp_banks[i].num_bytes = 0;
 
-	/* Now mask all bank sizes on a page boundry, it is all we can
+	/* Now mask all bank sizes on a page boundary, it is all we can
 	 * use anyways.
 	 */
 	for(i=0; sp_banks[i].num_bytes != 0; i++)
diff -u --recursive --new-file v1.3.94/linux/arch/sparc/mm/generic.c linux/arch/sparc/mm/generic.c
--- v1.3.94/linux/arch/sparc/mm/generic.c	Sun Apr 21 19:22:01 1996
+++ linux/arch/sparc/mm/generic.c	Tue Apr 23 12:31:46 1996
@@ -1,4 +1,4 @@
-/* generic.c: Generic Sparc mm routines that are not dependant upon
+/* generic.c: Generic Sparc mm routines that are not dependent upon
  *            MMU type but are Sparc specific.
  *
  * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
diff -u --recursive --new-file v1.3.94/linux/arch/sparc/mm/init.c linux/arch/sparc/mm/init.c
--- v1.3.94/linux/arch/sparc/mm/init.c	Sun Apr 21 19:22:01 1996
+++ linux/arch/sparc/mm/init.c	Tue Apr 23 12:31:45 1996
@@ -131,7 +131,7 @@
 	};
 
 	/* Initialize the protection map with non-constant values
-	 * MMU dependant values.
+	 * MMU dependent values.
 	 */
 	protection_map[0] = PAGE_NONE;
 	protection_map[1] = PAGE_READONLY;
diff -u --recursive --new-file v1.3.94/linux/arch/sparc/mm/srmmu.c linux/arch/sparc/mm/srmmu.c
--- v1.3.94/linux/arch/sparc/mm/srmmu.c	Sun Apr 21 19:22:01 1996
+++ linux/arch/sparc/mm/srmmu.c	Tue Apr 23 12:31:45 1996
@@ -483,7 +483,7 @@
 	ptep = srmmu_pte_offset(pmdp, virt_addr);
 	tmp = (physaddr >> 4) | SRMMU_ET_PTE;
 
-	/* I need to test whether this is consistant over all
+	/* I need to test whether this is consistent over all
 	 * sun4m's.  The bus_type represents the upper 4 bits of
 	 * 36-bit physical address on the I/O space lines...
 	 */
@@ -614,7 +614,7 @@
 
 /* TLB flushes seem to upset the tsunami sometimes, I can't figure out
  * what the hell is going on.  All I see is a tlb flush (page or whole,
- * there is no consistant pattern) and then total local variable corruption
+ * there is no consistent pattern) and then total local variable corruption
  * in the procedure who called us after return.  Usually triggerable
  * by "cool" programs like crashme and bonnie.  I played around a bit
  * and adding a bunch of forced nops seems to make the problems all
@@ -1695,7 +1695,7 @@
 		start += PAGE_SIZE;
 		tmp = (srmmu_hwprobe(start) & SRMMU_PTE_PMASK) << 4;
 
-		/* Never a cross bank boundry, thank you. */
+		/* Never a cross bank boundary, thank you. */
 		if(tmp != last_page + PAGE_SIZE)
 			break;
 		last_page = tmp;
@@ -2114,7 +2114,7 @@
 	mreg |= (SWIFT_IE | SWIFT_DE); /* I & D caches on */
 
 	/* The Swift branch folding logic is completely broken.  At
-	 * trap time, if things are just right, if can mistakedly
+	 * trap time, if things are just right, if can mistakenly
 	 * think that a trap is coming from kernel mode when in fact
 	 * it is coming from user mode (it mis-executes the branch in
 	 * the trap code).  So you see things like crashme completely
diff -u --recursive --new-file v1.3.94/linux/arch/sparc/mm/sun4c.c linux/arch/sparc/mm/sun4c.c
--- v1.3.94/linux/arch/sparc/mm/sun4c.c	Sun Apr 21 19:22:01 1996
+++ linux/arch/sparc/mm/sun4c.c	Tue Apr 23 12:31:46 1996
@@ -495,7 +495,7 @@
 }
 
 /* Using this method to free up mmu entries eliminates a lot of
- * potention races since we have a kernel that incurs tlb
+ * potential races since we have a kernel that incurs tlb
  * replacement faults.  There may be performance penalties.
  */
 static inline struct sun4c_mmu_entry *sun4c_user_strategy(void)
@@ -580,8 +580,8 @@
 /* READ THIS:  If you put any diagnostic printing code in any of the kernel
  *             fault handling code you will lose badly.  This is the most
  *             delicate piece of code in the entire kernel, atomicity of
- *             kernel tlb replacement must be guarenteed.  This is why we
- *             have seperate user and kernel allocation rings to alleviate
+ *             kernel tlb replacement must be guaranteed.  This is why we
+ *             have separate user and kernel allocation rings to alleviate
  *             as many bad interactions as possible.
  *
  * XXX Someday make this into a fast in-window trap handler to avoid
@@ -1035,7 +1035,7 @@
 	int octx;
 	struct mm_struct *mm = vma->vm_mm;
 
-	/* Sun4c has no seperate I/D caches so cannot optimize for non
+	/* Sun4c has no separate I/D caches so cannot optimize for non
 	 * text page flushes.
 	 */
 #ifndef __SMP__
diff -u --recursive --new-file v1.3.94/linux/arch/sparc/prom/memory.c linux/arch/sparc/prom/memory.c
--- v1.3.94/linux/arch/sparc/prom/memory.c	Sun Apr 21 19:22:01 1996
+++ linux/arch/sparc/prom/memory.c	Tue Apr 23 12:31:46 1996
@@ -10,12 +10,12 @@
 #include <asm/openprom.h>
 #include <asm/oplib.h>
 
-/* This routine, for consistancy, returns the ram parameters in the
- * V0 prom memory descriptor format.  I choose this format becuase I
+/* This routine, for consistency, returns the ram parameters in the
+ * V0 prom memory descriptor format.  I choose this format because I
  * think it was the easiest to work with.  I feel the religious
  * arguments now... ;)  Also, I return the linked lists sorted to
- * prevent paging_init() upset stomache as I have not yet written
- * the pepto-bismal kernel module yet.
+ * prevent paging_init() upset stomach as I have not yet written
+ * the pepto-bismol kernel module yet.
  */
 
 struct linux_prom_registers prom_reg_memlist[64];
diff -u --recursive --new-file v1.3.94/linux/arch/sparc/prom/palloc.c linux/arch/sparc/prom/palloc.c
--- v1.3.94/linux/arch/sparc/prom/palloc.c	Sun Apr 21 19:22:02 1996
+++ linux/arch/sparc/prom/palloc.c	Tue Apr 23 12:31:46 1996
@@ -18,7 +18,7 @@
 
 /* Allocate a chunk of memory of size 'num_bytes' giving a suggestion
  * of virtual_hint as the preferred virtual base address of this chunk.
- * There are no guarentees that you will get the allocation, or that
+ * There are no guarantees that you will get the allocation, or that
  * the prom will abide by your "hint".  So check your return value.
  */
 char *
diff -u --recursive --new-file v1.3.94/linux/drivers/block/ide-tape.c linux/drivers/block/ide-tape.c
--- v1.3.94/linux/drivers/block/ide-tape.c	Fri Apr 12 15:51:50 1996
+++ linux/drivers/block/ide-tape.c	Tue Apr 23 12:42:38 1996
@@ -1,5 +1,5 @@
 /*
- * linux/drivers/block/ide-tape.c	Version 1.3 - ALPHA	Feb   9, 1996
+ * linux/drivers/block/ide-tape.c	Version 1.5 - ALPHA	Apr  12, 1996
  *
  * Copyright (C) 1995, 1996 Gadi Oxman <tgud@tochnapc2.technion.ac.il>
  *
@@ -181,6 +181,9 @@
  *                        block device interface. For more info, read the
  *                        comments in triton.c.
  * Ver 1.4   Mar 13 96   Fixed serialize support.
+ * Ver 1.5   Apr 12 96   Fixed shared interface operation, broken in 1.3.85.
+ *                       Fixed pipelined read mode inefficiency.
+ *                       Fixed nasty null dereferencing bug.
  *
  * We are currently in an *alpha* stage. The driver is not complete and not
  * much tested. I would strongly suggest to:
@@ -1244,7 +1247,8 @@
 	tape->request_status=0;
 	tape->chrdev_direction=idetape_direction_none;
 	tape->reset_issued=0;
-
+	tape->pc=&(tape->pc_stack [0]);
+	
 #if IDETAPE_PIPELINE
 	tape->max_number_of_stages=IDETAPE_MIN_PIPELINE_STAGES;
 	printk ("ide-tape: Operating in pipelined (fast and tricky) operation mode.\n");
@@ -3154,7 +3158,6 @@
 	}
 #endif /* IDETAPE_DEBUG_BUGS */
 
-	run_task_queue(&tq_disk);
 	rq->sem=&sem;
 	down (&sem);
 }
@@ -3213,7 +3216,7 @@
 	rq.sector = tape->block_address;
 	rq.nr_sectors = rq.current_nr_sectors = blocks;
 
-	if (tape->current_number_of_stages < 0.5*tape->max_number_of_stages) {
+	if (tape->active_data_request != NULL || tape->current_number_of_stages <= 0.25*tape->max_number_of_stages) {
 		new_stage=idetape_kmalloc_stage (drive);
 		while (new_stage != NULL) {
 			new_stage->rq=rq;
diff -u --recursive --new-file v1.3.94/linux/drivers/block/ide.c linux/drivers/block/ide.c
--- v1.3.94/linux/drivers/block/ide.c	Sun Apr 21 12:39:00 1996
+++ linux/drivers/block/ide.c	Tue Apr 23 12:42:38 1996
@@ -225,6 +225,8 @@
  *			fix cli() problem in try_to_identify()
  * Version 5.36		fixes to optional PCMCIA support
  * Version 5.37		don't use DMA when "noautotune" is specified
+ * Version 5.37a (go)	fix shared irq probing (was broken in kernel 1.3.72)
+ *			call unplug_device() from ide_do_drive_cmd()
  *
  *  Some additional driver compile-time options are in ide.h
  *
@@ -1737,6 +1739,7 @@
 	rq->rq_dev = MKDEV(major,(drive->select.b.unit)<<PARTN_BITS);
 	if (action == ide_wait)
 		rq->sem = &sem;
+	unplug_device(bdev);
 
 	save_flags(flags);
 	cli();
@@ -1762,10 +1765,8 @@
 		rq->next = cur_rq->next;
 		cur_rq->next = rq;
 	}
-	if (action == ide_wait  && rq->rq_status != RQ_INACTIVE) {
-		run_task_queue(&tq_disk);
+	if (action == ide_wait  && rq->rq_status != RQ_INACTIVE)
 		down(&sem);	/* wait for it to be serviced */
-	}
 	restore_flags(flags);
 	return rq->errors ? -EIO : 0;	/* return -EIO if errors */
 }
@@ -2504,6 +2505,56 @@
 }
 
 /*
+ * We query CMOS about hard disks : it could be that we have a SCSI/ESDI/etc
+ * controller that is BIOS compatible with ST-506, and thus showing up in our
+ * BIOS table, but not register compatible, and therefore not present in CMOS.
+ *
+ * Furthermore, we will assume that our ST-506 drives <if any> are the primary
+ * drives in the system -- the ones reflected as drive 1 or 2.  The first
+ * drive is stored in the high nibble of CMOS byte 0x12, the second in the low
+ * nibble.  This will be either a 4 bit drive type or 0xf indicating use byte
+ * 0x19 for an 8 bit type, drive 1, 0x1a for drive 2 in CMOS.  A non-zero value
+ * means we have an AT controller hard disk for that drive.
+ *
+ * Of course, there is no guarantee that either drive is actually on the
+ * "primary" IDE interface, but we don't bother trying to sort that out here.
+ * If a drive is not actually on the primary interface, then these parameters
+ * will be ignored.  This results in the user having to supply the logical
+ * drive geometry as a boot parameter for each drive not on the primary i/f.
+ *
+ * The only "perfect" way to handle this would be to modify the setup.[cS] code
+ * to do BIOS calls Int13h/Fn08h and Int13h/Fn48h to get all of the drive info
+ * for us during initialization.  I have the necessary docs -- any takers?  -ml
+ */
+static void probe_cmos_for_drives (ide_hwif_t *hwif)
+{
+#ifdef __i386__
+	extern struct drive_info_struct drive_info;
+	byte cmos_disks, *BIOS = (byte *) &drive_info;
+	int unit;
+
+#ifdef CONFIG_BLK_DEV_PROMISE
+	if (hwif->is_promise2)
+		return;
+#endif /* CONFIG_BLK_DEV_PROMISE */
+	outb_p(0x12,0x70);		/* specify CMOS address 0x12 */
+	cmos_disks = inb_p(0x71);	/* read the data from 0x12 */
+	/* Extract drive geometry from CMOS+BIOS if not already setup */
+	for (unit = 0; unit < MAX_DRIVES; ++unit) {
+		ide_drive_t *drive = &hwif->drives[unit];
+		if ((cmos_disks & (0xf0 >> (unit*4))) && !drive->present) {
+			drive->cyl   = drive->bios_cyl  = *(unsigned short *)BIOS;
+			drive->head  = drive->bios_head = *(BIOS+2);
+			drive->sect  = drive->bios_sect = *(BIOS+14);
+			drive->ctl   = *(BIOS+8);
+			drive->present = 1;
+		}
+		BIOS += 16;
+	}
+#endif
+}
+
+/*
  * This routine only knows how to look for drive units 0 and 1
  * on an interface, so any setting of MAX_DRIVES > 2 won't work here.
  */
@@ -2511,6 +2562,10 @@
 {
 	unsigned int unit;
 
+	if (hwif->noprobe)
+		return;
+	if (hwif->io_base == HD_DATA)
+		probe_cmos_for_drives (hwif);
 #if CONFIG_BLK_DEV_PROMISE
 	if (!hwif->is_promise2 &&
 	   (check_region(hwif->io_base,8) || check_region(hwif->ctl_port,1))) {
@@ -2924,56 +2979,6 @@
 	return 1;
 }
 
-/*
- * We query CMOS about hard disks : it could be that we have a SCSI/ESDI/etc
- * controller that is BIOS compatible with ST-506, and thus showing up in our
- * BIOS table, but not register compatible, and therefore not present in CMOS.
- *
- * Furthermore, we will assume that our ST-506 drives <if any> are the primary
- * drives in the system -- the ones reflected as drive 1 or 2.  The first
- * drive is stored in the high nibble of CMOS byte 0x12, the second in the low
- * nibble.  This will be either a 4 bit drive type or 0xf indicating use byte
- * 0x19 for an 8 bit type, drive 1, 0x1a for drive 2 in CMOS.  A non-zero value
- * means we have an AT controller hard disk for that drive.
- *
- * Of course, there is no guarantee that either drive is actually on the
- * "primary" IDE interface, but we don't bother trying to sort that out here.
- * If a drive is not actually on the primary interface, then these parameters
- * will be ignored.  This results in the user having to supply the logical
- * drive geometry as a boot parameter for each drive not on the primary i/f.
- *
- * The only "perfect" way to handle this would be to modify the setup.[cS] code
- * to do BIOS calls Int13h/Fn08h and Int13h/Fn48h to get all of the drive info
- * for us during initialization.  I have the necessary docs -- any takers?  -ml
- */
-
-static void probe_cmos_for_drives (ide_hwif_t *hwif)
-{
-#ifdef __i386__
-	extern struct drive_info_struct drive_info;
-	byte cmos_disks, *BIOS = (byte *) &drive_info;
-	int unit;
-
-#ifdef CONFIG_BLK_DEV_PROMISE
-	if (hwif->is_promise2)
-		return;
-#endif /* CONFIG_BLK_DEV_PROMISE */
-	outb_p(0x12,0x70);		/* specify CMOS address 0x12 */
-	cmos_disks = inb_p(0x71);	/* read the data from 0x12 */
-	/* Extract drive geometry from CMOS+BIOS if not already setup */
-	for (unit = 0; unit < MAX_DRIVES; ++unit) {
-		ide_drive_t *drive = &hwif->drives[unit];
-		if ((cmos_disks & (0xf0 >> (unit*4))) && !drive->present) {
-			drive->cyl   = drive->bios_cyl  = *(unsigned short *)BIOS;
-			drive->head  = drive->bios_head = *(BIOS+2);
-			drive->sect  = drive->bios_sect = *(BIOS+14);
-			drive->ctl   = *(BIOS+8);
-			drive->present = 1;
-		}
-		BIOS += 16;
-	}
-#endif
-}
 
 /*
  * This routine sets up the irq for an ide interface, and creates a new
@@ -3153,15 +3158,8 @@
 	ide_hwif_t *hwif = &ide_hwifs[h];
 	void (*rfn)(void);
 	
-	if (hwif->noprobe)
+	if (!hwif->present)
 		return 0;
-	else {
-		if (hwif->io_base == HD_DATA)
-			probe_cmos_for_drives (hwif);
-		probe_hwif (hwif);
-		if (!hwif->present)
-			return 0;
-	}
 	if (!hwif->irq) {
 		if (!(hwif->irq = default_irqs[h])) {
 			printk("%s: DISABLED, NO IRQ\n", hwif->name);
@@ -3222,6 +3220,8 @@
 	 * Probe for drives in the usual way.. CMOS/BIOS, then poke at ports
 	 */
 	for (index = 0; index < MAX_HWIFS; ++index)
+		probe_hwif (&ide_hwifs[index]);
+	for (index = 0; index < MAX_HWIFS; ++index)
 		hwif_init (index);
 
 #ifdef CONFIG_BLK_DEV_IDETAPE
@@ -3250,6 +3250,7 @@
 			hwif->ctl_port = ctl_port;
 			hwif->irq = irq;
 			hwif->noprobe = 0;
+			probe_hwif(hwif);
 			if (!hwif_init(index))
 				break;
 			for (i = 0; i < hwif->gd->nr_real; i++)
diff -u --recursive --new-file v1.3.94/linux/drivers/block/ll_rw_blk.c linux/drivers/block/ll_rw_blk.c
--- v1.3.94/linux/drivers/block/ll_rw_blk.c	Sun Apr 21 19:22:02 1996
+++ linux/drivers/block/ll_rw_blk.c	Tue Apr 23 12:42:38 1996
@@ -84,16 +84,19 @@
 /*
  * remove the plug and let it rip..
  */
-static void unplug_device(void * data)
+void unplug_device(void * data)
 {
 	struct blk_dev_struct * dev = (struct blk_dev_struct *) data;
 	unsigned long flags;
 
 	save_flags(flags);
 	cli();
-	dev->current_request = dev->plug.next;
-	dev->plug.next = NULL;
-	(dev->request_fn)();
+	if (dev->current_request == &dev->plug) {
+		dev->current_request = dev->plug.next;
+		dev->plug.next = NULL;
+		if (dev->current_request)
+			(dev->request_fn)();
+	}
 	restore_flags(flags);
 }
 
diff -u --recursive --new-file v1.3.94/linux/drivers/block/loop.c linux/drivers/block/loop.c
--- v1.3.94/linux/drivers/block/loop.c	Sun Mar 24 20:07:00 1996
+++ linux/drivers/block/loop.c	Tue Apr 23 09:25:35 1996
@@ -20,6 +20,8 @@
 #include <linux/errno.h>
 #include <linux/major.h>
 
+#include <asm/segment.h>
+
 #ifdef DES_AVAILABLE
 #include "des.h"
 #endif
diff -u --recursive --new-file v1.3.94/linux/drivers/char/ChangeLog linux/drivers/char/ChangeLog
--- v1.3.94/linux/drivers/char/ChangeLog	Sun Apr 21 12:39:00 1996
+++ linux/drivers/char/ChangeLog	Wed Apr 24 09:13:04 1996
@@ -1,3 +1,18 @@
+Tue Apr 23 22:56:07 1996    <tytso@rsts-11.mit.edu>
+
+	* tty_io.c (init_dev): Change return code when user attempts to
+		open master pty which is already open from EAGAIN to EIO,
+		to match with BSD expectations.  EIO is more correct
+		anyway, since EAGAIN implies that retrying will be
+		successful --- which it might be.... Eventually!!
+
+	* pty.c (pty_open, pty_close): Fix wait loop so that we don't
+		busy loop while waiting for the master side to open.
+		Fix tty opening/closing logic.  TTY_SLAVE_CLOSED was
+		renamed to TTY_OTHER_CLOSED, so that the name is more
+		descriptive.  Also fixed code so that the tty flag
+		actually works correctly now....
+
 Mon Apr  1 10:22:01 1996    <tytso@rsts-11.mit.edu>
 
 	* serial.c (rs_close): Cleaned up modularization changes.
diff -u --recursive --new-file v1.3.94/linux/drivers/char/README.stallion linux/drivers/char/README.stallion
--- v1.3.94/linux/drivers/char/README.stallion	Fri Apr 19 10:07:58 1996
+++ linux/drivers/char/README.stallion	Wed Apr 24 12:48:04 1996
@@ -2,8 +2,8 @@
 Stallion Multiport Serial Drivers
 ---------------------------------
 
-Version: 1.0.8
-Date:    25MAR96
+Version: 1.1.3
+Date:    23APR96
 Author:  Greg Ungerer (gerg@stallion.oz.au)
 
 
@@ -26,9 +26,9 @@
 The following ftp sites (and their mirrors) definitely have the stallion
 driver utility package: ftp.stallion.com, tsx-11.mit.edu, sunsite.unc.edu.
 
-ftp.stallion.com:/drivers/ata5/Linux/stallion-1.1.0.tar.gz
-tsx-11.mit.edu:/pub/linux/BETA/serial/stallion/stallion-1.1.0.tar.gz
-sunsite.unc.edu:/pub/Linux/kernel/patches/serial/stallion-1.1.0.tar.gz
+ftp.stallion.com:/drivers/ata5/Linux/stallion-1.1.2.tar.gz
+tsx-11.mit.edu:/pub/linux/BETA/serial/stallion/stallion-1.1.2.tar.gz
+sunsite.unc.edu:/pub/Linux/kernel/patches/serial/stallion-1.1.2.tar.gz
 
 If you are using the EasyIO or EasyConnection 8/32 boards then you don't
 need this package. Although it does have a handy script to create the
@@ -128,48 +128,10 @@
 ONboard/E can be programmed for memory addresses up to 4Gb (the EISA bus
 addressing limit).
 
-The istallion intelligent driver does offer support for these higher memory
-addresses with a couple of limitations. The higher memory support can only
-be used in the loadable module form of the driver, since the kernel memory
-management routines it relies on can not be run from the drivers static
-kernel init routine.
-
-By default, support for these higher memory addresses is not compiled into
-the driver. This is because it relies on kernel functions that are not
-normally exported as part of the Linux loadable module system.
-
-To add the appropriate symbols into the kernel export code you need to:
-
-1. cd /usr/src/linux/kernel
-   (assuming your Linux kernel code is in /usr/src/linux)
-2. vi ksyms.c
-   - find the line that reads
-        X(vfree),
-   - after this line insert the following line
-        X(remap_page_range),
-   - save and exit
-3. cd ..
-4. build a new kernel (usually just make)
-
-This will export the "remap_page_range" function for loadable modules
-which is required for the higher memory support code.
-
-Finally you need to enable the code in the istallion driver. To do this
-edit the istallion.c file and search for the symbol STLI_HIMEMORY. It is
-near the top of the file in a line that looks like:
-
-#define	STLI_HIMEMORY	0
-
-Change the "0" to a "1". This enables the high memory support code in
-the driver. You will then need to rebuild the module or rebuild the
-kernel to incorporate the change. You will also need to modify
-the board resource configuration information to use a higher memory
-address.
-
-Once these changes are in place the driver will work as it did before.
-Note that the physical memory address range is software programmed on the
-EasyConnection 8/64-EI and ONboards, but must be set via DIP switches on
-the original Stallion boards.
+The higher than 1Mb memory addresses are fully supported by this driver.
+Just enter the address as you normally would for a lower than 1Mb address
+(in the drivers board configuration structure).
+
 
 
 2.3 TROUBLE SHOOTING
@@ -304,7 +266,7 @@
 and gets them well out of the way.
 
 The ports of the EasyIO-8M board do not have DCD or DTR signals. So these
-ports cannot be used as real modem devices. Generally when using these
+ports cannot be used as real modem devices. Generally, when using these
 ports you should only use the cueX devices.
 
 The driver utility package contains a couple of very useful programs. One 
diff -u --recursive --new-file v1.3.94/linux/drivers/char/cyclades.c linux/drivers/char/cyclades.c
--- v1.3.94/linux/drivers/char/cyclades.c	Sun Apr 21 12:39:01 1996
+++ linux/drivers/char/cyclades.c	Wed Apr 24 07:33:36 1996
@@ -2784,7 +2784,7 @@
     cy_serial_driver.magic = TTY_DRIVER_MAGIC;
     cy_serial_driver.name = "ttyC";
     cy_serial_driver.major = CYCLADES_MAJOR;
-    cy_serial_driver.minor_start = 32;
+    cy_serial_driver.minor_start = 0;
     cy_serial_driver.num = NR_PORTS;
     cy_serial_driver.type = TTY_DRIVER_TYPE_SERIAL;
     cy_serial_driver.subtype = SERIAL_TYPE_NORMAL;
diff -u --recursive --new-file v1.3.94/linux/drivers/char/istallion.c linux/drivers/char/istallion.c
--- v1.3.94/linux/drivers/char/istallion.c	Fri Apr 19 10:07:58 1996
+++ linux/drivers/char/istallion.c	Wed Apr 24 12:48:04 1996
@@ -125,24 +125,6 @@
 static int	stli_nrbrds = sizeof(stli_brdconf) / sizeof(stlconf_t);
 
 /*
- *	Code support is offered for boards to use the above 1Mb memory
- *	ranges for those boards which support this (supported on the ONboard
- *	and ECP-EI hardware). The following switch should be enabled. The only
- *	catch is that the kernel functions required to do this are not
- *	normally exported symbols, so you will have to do some extra work
- *	for this to be used in the loadable module form of the driver.
- *	Unfortunately this doesn't work either if you linked the driver into
- *	the kernel, since the memory management code is not set up early
- *	enough (before our initialization routine is run).
- */
-#define	STLI_HIMEMORY	0
-
-#if STLI_HIMEMORY
-#include <asm/page.h>
-#include <asm/pgtable.h>
-#endif
-
-/*
  *	There is some experimental EISA board detection code in this driver.
  *	By default it is disabled, but for those that want to try it out,
  *	then set the define below to be 1.
@@ -175,7 +157,7 @@
  *	all the local structures required by a serial tty driver.
  */
 static char	*stli_drvname = "Stallion Intelligent Multiport Serial Driver";
-static char	*stli_drvversion = "1.1.1";
+static char	*stli_drvversion = "1.1.3";
 static char	*stli_serialname = "ttyE";
 static char	*stli_calloutname = "cue";
 
@@ -310,19 +292,14 @@
  *	the 1Gb, 2Gb and 3Gb areas as well...
  */
 static unsigned long	stli_eisamemprobeaddrs[] = {
-	0xc0000, 0xd0000, 0xe0000, 0xf0000,
+	0xc0000,    0xd0000,    0xe0000,    0xf0000,
 	0x80000000, 0x80010000, 0x80020000, 0x80030000,
 	0x40000000, 0x40010000, 0x40020000, 0x40030000,
 	0xc0000000, 0xc0010000, 0xc0020000, 0xc0030000,
 	0xff000000, 0xff010000, 0xff020000, 0xff030000,
 };
 
-#if STLI_HIMEMORY
 static int	stli_eisamempsize = sizeof(stli_eisamemprobeaddrs) / sizeof(unsigned long);
-#else
-static int	stli_eisamempsize = 4;
-#endif
-
 int		stli_eisaprobe = STLI_EISAPROBE;
 
 /*****************************************************************************/
@@ -407,11 +384,8 @@
 #define	ONB_ATADDRMASK	0xff0000
 #define	ONB_ATADDRSHFT	16
 
-#if STLI_HIMEMORY
-#define	ONB_HIMEMENAB	0x02
-#else
-#define	ONB_HIMEMENAB	0
-#endif
+#define	ONB_MEMENABLO	0
+#define	ONB_MEMENABHI	0x02
 
 /*
  *	Important defines for the EISA class of ONboard board.
@@ -627,10 +601,6 @@
 
 static stliport_t *stli_getport(int brdnr, int panelnr, int portnr);
 
-#if STLI_HIMEMORY
-static void *stli_mapbrdmem(unsigned long physaddr, unsigned int size);
-#endif
-
 /*****************************************************************************/
 
 /*
@@ -750,10 +720,8 @@
 			}
 		}
 
-#if STLI_HIMEMORY
-		if (((unsigned long) brdp->membase) >= 0x100000)
+		if (brdp->memaddr >= 0x100000)
 			vfree(brdp->membase);
-#endif
 		if ((brdp->brdtype == BRD_ECP) || (brdp->brdtype == BRD_ECPE) || (brdp->brdtype == BRD_ECPMC))
 			release_region(brdp->iobase, ECP_IOSIZE);
 		else
@@ -3083,7 +3051,7 @@
 #if DEBUG
 	printk("stli_onbenable(brdp=%x)\n", (int) brdp);
 #endif
-	outb((ONB_ATENABLE | ONB_HIMEMENAB), (brdp->iobase + ONB_ATCONFR));
+	outb((brdp->enabval | ONB_ATENABLE), (brdp->iobase + ONB_ATCONFR));
 }
 
 /*****************************************************************************/
@@ -3093,7 +3061,7 @@
 #if DEBUG
 	printk("stli_onbdisable(brdp=%x)\n", (int) brdp);
 #endif
-	outb(ONB_ATDISABLE, (brdp->iobase + ONB_ATCONFR));
+	outb((brdp->enabval | ONB_ATDISABLE), (brdp->iobase + ONB_ATCONFR));
 }
 
 /*****************************************************************************/
@@ -3346,40 +3314,6 @@
 
 /*****************************************************************************/
 
-#if STLI_HIMEMORY
- 
-#define	PAGE_IOMEM	__pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_PCD)
-
-/*
- *	To support shared memory addresses outside of the lower 1 Mb region
- *	we will need to pull some tricks with memory management to map the
- *	higher range into kernel virtual address space... Radical stuff...
- */
-
-static void *stli_mapbrdmem(unsigned long physaddr, unsigned int size)
-{
-	void	*virtaddr;
-	int	rc;
-
-#if DEBUG
-	printk("stli_mapbrdmem(physaddr=%x,size=%x)\n", (int) physaddr, size);
-#endif
-
-	if ((virtaddr = vmalloc(size)) == (char *) NULL) {
-		printk("STALLION: failed to allocate virtual address space, size=%x\n", size);
-		return((void *) NULL);
-	}
-	if ((rc = remap_page_range((TASK_SIZE + ((unsigned long) virtaddr)), physaddr, size, PAGE_IOMEM))) {
-		printk("STALLION: failed to map physical address=%x, errno=%d\n", (int) physaddr, rc);
-		return((void *) NULL);
-	}
-	return(virtaddr);
-}
-
-#endif
-
-/*****************************************************************************/
-
 /*
  *	Try to find an ECP board and initialize it. This handles only ECP
  *	board types.
@@ -3459,13 +3393,11 @@
  */
 	EBRDINIT(brdp);
 
-#if STLI_HIMEMORY
 	if (brdp->memaddr > 0x100000) {
-		brdp->membase = stli_mapbrdmem(brdp->memaddr, brdp->memsize);
+		brdp->membase = vremap(brdp->memaddr, brdp->memsize);
 		if (brdp->membase == (void *) NULL)
 			return(-ENOMEM);
 	}
-#endif
 
 /*
  *	Now that all specific code is set up, enable the shared memory and
@@ -3558,6 +3490,10 @@
 		brdp->getmemptr = stli_onbgetmemptr;
 		brdp->intr = stli_ecpintr;
 		brdp->reset = stli_onbreset;
+		if (brdp->memaddr > 0x100000)
+			brdp->enabval = ONB_MEMENABHI;
+		else
+			brdp->enabval = ONB_MEMENABLO;
 		break;
 
 	case BRD_ONBOARDE:
@@ -3613,13 +3549,11 @@
  */
 	EBRDINIT(brdp);
 
-#if STLI_HIMEMORY
 	if (brdp->memaddr > 0x100000) {
-		brdp->membase = stli_mapbrdmem(brdp->memaddr, brdp->memsize);
+		brdp->membase = vremap(brdp->memaddr, brdp->memsize);
 		if (brdp->membase == (void *) NULL)
 			return(-ENOMEM);
 	}
-#endif
 
 /*
  *	Now that all specific code is set up, enable the shared memory and
@@ -3880,13 +3814,11 @@
 	for (i = 0; (i < stli_eisamempsize); i++) {
 		brdp->memaddr = stli_eisamemprobeaddrs[i];
 		brdp->membase = (void *) brdp->memaddr;
-#if STLI_HIMEMORY
 		if (brdp->memaddr > 0x100000) {
-			brdp->membase = stli_mapbrdmem(brdp->memaddr, brdp->memsize);
+			brdp->membase = vremap(brdp->memaddr, brdp->memsize);
 			if (brdp->membase == (void *) NULL)
 				continue;
 		}
-#endif
 		if (brdp->brdtype == BRD_ECPE) {
 			ecpsigp = (cdkecpsig_t *) stli_ecpeigetmemptr(brdp, CDK_SIGADDR, __LINE__);
 			memcpy(&ecpsig, ecpsigp, sizeof(cdkecpsig_t));
@@ -3899,10 +3831,8 @@
 					(onbsig.magic2 == ONB_MAGIC2) && (onbsig.magic3 == ONB_MAGIC3))
 				foundit = 1;
 		}
-#if STLI_HIMEMORY
 		if (brdp->memaddr >= 0x100000)
 			vfree(brdp->membase);
-#endif
 		if (foundit)
 			break;
 	}
@@ -4292,8 +4222,12 @@
 	if (brdp == (stlibrd_t *) NULL)
 		return(-ENODEV);
 
-	if ((rc = stli_cmdwait(brdp, portp, A_GETSTATS, &stli_cdkstats, sizeof(asystats_t), 1)) < 0)
-		return(rc);
+	if (brdp->state & BST_STARTED) {
+		if ((rc = stli_cmdwait(brdp, portp, A_GETSTATS, &stli_cdkstats, sizeof(asystats_t), 1)) < 0)
+			return(rc);
+	} else {
+		memset(&stli_cdkstats, 0, sizeof(asystats_t));
+	}
 
 	memset(&stli_comstats, 0, sizeof(comstats_t));
 	stli_comstats.brd = portp->brdnr;
@@ -4364,8 +4298,10 @@
 	if (brdp == (stlibrd_t *) NULL)
 		return(-ENODEV);
 
-	if ((rc = stli_cmdwait(brdp, portp, A_CLEARSTATS, 0, 0, 0)) < 0)
-		return(rc);
+	if (brdp->state & BST_STARTED) {
+		if ((rc = stli_cmdwait(brdp, portp, A_CLEARSTATS, 0, 0, 0)) < 0)
+			return(rc);
+	}
 
 	memset(&stli_comstats, 0, sizeof(comstats_t));
 	stli_comstats.brd = portp->brdnr;
@@ -4426,14 +4362,57 @@
 static int stli_memioctl(struct inode *ip, struct file *fp, unsigned int cmd, unsigned long arg)
 {
 	stlibrd_t	*brdp;
-	int		brdnr, rc;
+	int		brdnr, rc, done;
 
 #if DEBUG
 	printk("stli_memioctl(ip=%x,fp=%x,cmd=%x,arg=%x)\n", (int) ip, (int) fp, cmd, (int) arg);
 #endif
 
+/*
+ *	First up handle the board independent ioctls.
+ */
+	done = 0;
+	rc = 0;
+
+	switch (cmd) {
+	case COM_GETPORTSTATS:
+		if ((rc = verify_area(VERIFY_WRITE, (void *) arg, sizeof(comstats_t))) == 0)
+			rc = stli_getportstats((stliport_t *) NULL, (comstats_t *) arg);
+		done++;
+		break;
+	case COM_CLRPORTSTATS:
+		if ((rc = verify_area(VERIFY_WRITE, (void *) arg, sizeof(comstats_t))) == 0)
+			rc = stli_clrportstats((stliport_t *) NULL, (comstats_t *) arg);
+		done++;
+		break;
+	case COM_GETBRDSTATS:
+		if ((rc = verify_area(VERIFY_WRITE, (void *) arg, sizeof(combrd_t))) == 0)
+			rc = stli_getbrdstats((combrd_t *) arg);
+		done++;
+		break;
+	case COM_READPORT:
+		if ((rc = verify_area(VERIFY_WRITE, (void *) arg, sizeof(stliport_t))) == 0)
+			rc = stli_getportstruct(arg);
+		done++;
+		break;
+	case COM_READBOARD:
+		if ((rc = verify_area(VERIFY_WRITE, (void *) arg, sizeof(stlibrd_t))) == 0)
+			rc = stli_getbrdstruct(arg);
+		done++;
+		break;
+	default:
+		break;
+	}
+
+	if (done)
+		return(rc);
+
+/*
+ *	Now handle the board specific ioctls. These all depend on the
+ *	minor number of the device they were called from.
+ */
 	brdnr = MINOR(ip->i_rdev);
-	if (brdnr >= stli_nrbrds)
+	if (brdnr >= STL_MAXBRDS)
 		return(-ENODEV);
 	brdp = stli_brds[brdnr];
 	if (brdp == (stlibrd_t *) NULL)
@@ -4441,8 +4420,6 @@
 	if (brdp->state == 0)
 		return(-ENODEV);
 
-	rc = 0;
-
 	switch (cmd) {
 	case STL_BINTR:
 		EBRDINTR(brdp);
@@ -4460,26 +4437,6 @@
 			if (brdp->reenable != NULL)
 				(* brdp->reenable)(brdp);
 		}
-		break;
-	case COM_GETPORTSTATS:
-		if ((rc = verify_area(VERIFY_WRITE, (void *) arg, sizeof(comstats_t))) == 0)
-			rc = stli_getportstats((stliport_t *) NULL, (comstats_t *) arg);
-		break;
-	case COM_CLRPORTSTATS:
-		if ((rc = verify_area(VERIFY_WRITE, (void *) arg, sizeof(comstats_t))) == 0)
-			rc = stli_clrportstats((stliport_t *) NULL, (comstats_t *) arg);
-		break;
-	case COM_GETBRDSTATS:
-		if ((rc = verify_area(VERIFY_WRITE, (void *) arg, sizeof(combrd_t))) == 0)
-			rc = stli_getbrdstats((combrd_t *) arg);
-		break;
-	case COM_READPORT:
-		if ((rc = verify_area(VERIFY_WRITE, (void *) arg, sizeof(stliport_t))) == 0)
-			rc = stli_getportstruct(arg);
-		break;
-	case COM_READBOARD:
-		if ((rc = verify_area(VERIFY_WRITE, (void *) arg, sizeof(stlibrd_t))) == 0)
-			rc = stli_getbrdstruct(arg);
 		break;
 	default:
 		rc = -ENOIOCTLCMD;
diff -u --recursive --new-file v1.3.94/linux/drivers/char/misc.c linux/drivers/char/misc.c
--- v1.3.94/linux/drivers/char/misc.c	Fri Apr 19 10:07:58 1996
+++ linux/drivers/char/misc.c	Tue Apr 23 12:28:22 1996
@@ -188,7 +188,7 @@
 #ifdef CONFIG_PROC_FS
 	proc_register_dynamic(&proc_root, &(struct proc_dir_entry) {
 		0, 4, "misc",
-		S_IRUGO, 1, 0, 0,
+		S_IFREG | S_IRUGO, 1, 0, 0,
 		0, NULL /* ops -- default to array */,
 		&proc_misc_read /* get_info */,
 	});	
diff -u --recursive --new-file v1.3.94/linux/drivers/char/n_tty.c linux/drivers/char/n_tty.c
--- v1.3.94/linux/drivers/char/n_tty.c	Sat Oct 28 15:19:02 1995
+++ linux/drivers/char/n_tty.c	Wed Apr 24 09:13:04 1996
@@ -826,7 +826,7 @@
 			tty->minimum_to_wake = (minimum - (b - buf));
 		
 		if (!input_available_p(tty, 0)) {
-			if (tty->flags & (1 << TTY_SLAVE_CLOSED)) {
+			if (tty->flags & (1 << TTY_OTHER_CLOSED)) {
 				retval = -EIO;
 				break;
 			}
@@ -985,7 +985,7 @@
 		case SEL_EX:
 			if (tty->packet && tty->link->ctrl_status)
 				return 1;
-			if (tty->flags & (1 << TTY_SLAVE_CLOSED))
+			if (tty->flags & (1 << TTY_OTHER_CLOSED))
 				return 1;
 			if (tty_hung_up_p(file))
 				return 1;
diff -u --recursive --new-file v1.3.94/linux/drivers/char/pty.c linux/drivers/char/pty.c
--- v1.3.94/linux/drivers/char/pty.c	Sat Mar 23 18:04:50 1996
+++ linux/drivers/char/pty.c	Wed Apr 24 09:13:04 1996
@@ -78,12 +78,10 @@
 		return;
 	wake_up_interruptible(&tty->link->read_wait);
 	wake_up_interruptible(&tty->link->write_wait);
+	set_bit(TTY_OTHER_CLOSED, &tty->link->flags);
 	if (tty->driver.subtype == PTY_TYPE_MASTER) {
 		tty_hangup(tty->link);
-		set_bit(TTY_SLAVE_CLOSED, &tty->flags);
-	} else {
-		start_tty(tty);
-		set_bit(TTY_SLAVE_CLOSED, &tty->link->flags);
+		set_bit(TTY_OTHER_CLOSED, &tty->flags);
 	}
 }
 
@@ -183,6 +181,8 @@
 
 int pty_open(struct tty_struct *tty, struct file * filp)
 {
+	struct wait_queue wait = { current, NULL };
+	int	retval;
 	int	line;
 	struct	pty_struct *pty;
 	
@@ -204,18 +204,36 @@
 			free_page(page);
 	}
 
-	if (tty->driver.subtype == PTY_TYPE_SLAVE)
-		clear_bit(TTY_SLAVE_CLOSED, &tty->link->flags);
+	clear_bit(TTY_OTHER_CLOSED, &tty->link->flags);
 	wake_up_interruptible(&pty->open_wait);
 	set_bit(TTY_THROTTLED, &tty->flags);
 	if (filp->f_flags & O_NDELAY)
 		return 0;
-	while (test_bit(TTY_SLAVE_CLOSED, &tty->link->flags) &&
-	       !(current->signal & ~current->blocked))
-		interruptible_sleep_on(&pty->open_wait);
-	if (!tty->link->count)
-		return -ERESTARTSYS;
-	return 0;
+	/*
+	 * If we're opening the master pty, just return.  If we're
+	 * trying to open the slave pty, then we have to wait for the
+	 * master pty to open.
+	 */
+	if (tty->driver.subtype == PTY_TYPE_MASTER)
+		return 0;
+	add_wait_queue(&pty->open_wait, &wait);
+	retval = 0;
+	while (1) {
+		if (current->signal & ~current->blocked) {
+			retval = -ERESTARTSYS;
+			break;
+		}
+		/*
+		 * Block until the master is open...
+		 */
+		if (tty->link->count &&
+		    !test_bit(TTY_OTHER_CLOSED, &tty->flags))
+			break;
+		schedule();
+	}
+	current->state = TASK_RUNNING;
+	remove_wait_queue(&pty->open_wait, &wait);
+	return retval;
 }
 
 int pty_init(void)
diff -u --recursive --new-file v1.3.94/linux/drivers/char/stallion.c linux/drivers/char/stallion.c
--- v1.3.94/linux/drivers/char/stallion.c	Fri Apr 19 10:07:58 1996
+++ linux/drivers/char/stallion.c	Wed Apr 24 12:48:04 1996
@@ -140,7 +140,7 @@
  *	all the local structures required by a serial tty driver.
  */
 static char	*stl_drvname = "Stallion Multiport Serial Driver";
-static char	*stl_drvversion = "1.1.1";
+static char	*stl_drvversion = "1.1.3";
 static char	*stl_serialname = "ttyE";
 static char	*stl_calloutname = "cue";
 
@@ -3065,20 +3065,15 @@
 
 static int stl_memioctl(struct inode *ip, struct file *fp, unsigned int cmd, unsigned long arg)
 {
-	stlbrd_t	*brdp;
-	int		brdnr, rc;
+	int	brdnr, rc;
 
 #if DEBUG
 	printk("stl_memioctl(ip=%x,fp=%x,cmd=%x,arg=%x)\n", (int) ip, (int) fp, cmd, (int) arg);
 #endif
 
 	brdnr = MINOR(ip->i_rdev);
-	if (brdnr >= stl_nrbrds)
-		return(-ENODEV);
-	brdp = stl_brds[brdnr];
-	if (brdp == (stlbrd_t *) NULL)
+	if (brdnr >= STL_MAXBRDS)
 		return(-ENODEV);
-
 	rc = 0;
 
 	switch (cmd) {
diff -u --recursive --new-file v1.3.94/linux/drivers/char/suncons.c linux/drivers/char/suncons.c
--- v1.3.94/linux/drivers/char/suncons.c	Sun Apr 21 19:22:06 1996
+++ linux/drivers/char/suncons.c	Tue Apr 23 12:31:34 1996
@@ -25,7 +25,7 @@
  *
  * We try to make everything a power of two if possible to
  * speed up the bit blit.  Doing multiplies, divides, and
- * remainer routines end up calling software library routines
+ * remainder routines end up calling software library routines
  * since not all Sparcs have the hardware to do it.
  *
  * TODO:
@@ -38,7 +38,7 @@
  */
 
 
-/* Define thie one if you are debugging something in X, it will not disable the console output */
+/* Define this one if you are debugging something in X, it will not disable the console output */
 /* #define DEBUGGING_X */
 /* See also: sparc/keyboard.c: CODING_NEW_DRIVER */
 
@@ -87,7 +87,7 @@
 
 /* Based upon what the PROM tells us, we can figure out where
  * the console is currently located.  The situation can be either
- * of the following two scenerios:
+ * of the following two scenarios:
  *
  * 1) Console i/o is done over the serial line, ttya or ttyb
  * 2) Console output on frame buffer (video card) and input
@@ -115,7 +115,7 @@
 static int x_margin, y_margin;	/* the x and y margins */
 static int bytes_per_row;	/* bytes used by one screen line (of 16 scan lines)  */
 
-/* Functions used by the SPARC dependant console code
+/* Functions used by the SPARC dependent console code
  * to perform the restore_palette function.
  */
 static void (*restore_palette)(void);
@@ -142,10 +142,10 @@
 /* First for MONO displays. */
 #define SCREEN_WIDTH     1152     /* Screen width in pixels  */
 #define SCREEN_HEIGHT    900      /* Screen height in pixels */
-#define CHARS_PER_LINE   144      /* Make this imperical for speed */
+#define CHARS_PER_LINE   144      /* Make this empirical for speed */
 #define NICE_Y_MARGIN    18       /* We skip 18 y-pixels at top/bottom */
 #define NICE_X_MARGIN    8        /* We skip 64 x-pixels at left/right */
-#define FBUF_TOP_SKIP    2592     /* Imperical, (CHARS_PER_LINE * NICE_Y_MARGIN) */
+#define FBUF_TOP_SKIP    2592     /* Empirical, (CHARS_PER_LINE * NICE_Y_MARGIN) */
 #define CHAR_HEIGHT      16
 #define ONE_ROW          2304     /* CHARS_PER_LINE * CHAR_HEIGHT */
 
@@ -220,7 +220,7 @@
 /* The idea is the following:
  * we only use the colors in the range 0..15, and we only
  * setup the palette on that range, so we better keep the
- * pixel inverion using those colors, that's why we have
+ * pixel inversion using those colors, that's why we have
  * those constants below.
  */
 inline static void
@@ -1076,7 +1076,7 @@
 		bt->color_map = *i++;
 }
 
-/* The cg3 is pressumed to emulate a cg4, I guess older programs will want that */
+/* The cg3 is presumed to emulate a cg4, I guess older programs will want that */
 /* addresses above 0x4000000 are for cg3, below that it's cg4 emulation          */
 static int
 cg3_mmap (struct inode *inode, struct file *file, struct vm_area_struct *vma, long base, void *xx)
@@ -1428,7 +1428,7 @@
 	return 0; /* success */
 }
 
-/* video init code, called from withing the SBUS bus scanner at
+/* video init code, called from within the SBUS bus scanner at
  * boot time.
  */
 void
diff -u --recursive --new-file v1.3.94/linux/drivers/char/sunmouse.c linux/drivers/char/sunmouse.c
--- v1.3.94/linux/drivers/char/sunmouse.c	Sun Apr 21 19:22:06 1996
+++ linux/drivers/char/sunmouse.c	Tue Apr 23 12:31:34 1996
@@ -7,7 +7,7 @@
  * Johan Myreen.
  *
  * Dec/19/95 Added SunOS mouse ioctls - miguel.
- * Jan/5/96  Added VUID support, sigio supprot - miguel.
+ * Jan/5/96  Added VUID support, sigio support - miguel.
  * Mar/5/96  Added proper mouse stream support - miguel.
  */
 
@@ -200,7 +200,7 @@
 		printk("DY2<%d>", mvalue);
 #endif
 		sunmouse.delta_y += mvalue;
-		sunmouse.byte = 69;  /* Some rediculious value */
+		sunmouse.byte = 69;  /* Some ridiculous value */
 		break;
 	case 69:
 		/* Until we get the (0x80 -> 0x87) value we aren't
diff -u --recursive --new-file v1.3.94/linux/drivers/char/tty_io.c linux/drivers/char/tty_io.c
--- v1.3.94/linux/drivers/char/tty_io.c	Tue Apr 23 13:57:09 1996
+++ linux/drivers/char/tty_io.c	Wed Apr 24 09:13:04 1996
@@ -818,7 +818,7 @@
 	ltp_loc = &driver->termios_locked[idx];
 
 repeat:
-	retval = -EAGAIN;
+	retval = -EIO;
 	if (driver->type == TTY_DRIVER_TYPE_PTY &&
 	    driver->subtype == PTY_TYPE_MASTER &&
 	    *tty_loc && (*tty_loc)->count)
diff -u --recursive --new-file v1.3.94/linux/drivers/isdn/pcbit/callbacks.c linux/drivers/isdn/pcbit/callbacks.c
--- v1.3.94/linux/drivers/isdn/pcbit/callbacks.c	Sun Apr 21 19:22:07 1996
+++ linux/drivers/isdn/pcbit/callbacks.c	Tue Apr 23 12:31:35 1996
@@ -1,7 +1,7 @@
 /*
  * Copyright (C) 1996 Universidade de Lisboa
  * 
- * Writen by Pedro Roque Marques (roque@di.fc.ul.pt)
+ * Written by Pedro Roque Marques (roque@di.fc.ul.pt)
  *
  * This software may be used and distributed according to the terms of 
  * the GNU Public License, incorporated herein by reference.
@@ -125,8 +125,8 @@
 
 
 /*
- * Disconnect received (actualy RELEASE COMPLETE) 
- * This means we where not hable to establish connection with remote
+ * Disconnect received (actually RELEASE COMPLETE) 
+ * This means we were not able to establish connection with remote
  * Inform the big boss above
  */
 void cb_out_3(struct pcbit_dev * dev, struct pcbit_chan* chan,
@@ -142,7 +142,7 @@
 
 
 /*
- * Incomming call received
+ * Incoming call received
  * inform user
  */
 
@@ -195,7 +195,7 @@
 }
 
 /*
- * user has replyed
+ * user has replied
  * open the channel
  * send CONNECT message CONNECT_ACTIVE_REQ in CAPI
  */
@@ -278,7 +278,7 @@
 
         
 /*
- *  User HANGUP on active/call proceding state
+ *  User HANGUP on active/call proceeding state
  *  send disc.req
  */
 void cb_disc_2(struct pcbit_dev * dev, struct pcbit_chan* chan, 
@@ -344,7 +344,7 @@
 }
 
 /*
- *  Inform User that the B-channel is availiable
+ *  Inform User that the B-channel is available
  */
 void cb_open(struct pcbit_dev * dev, struct pcbit_chan* chan, 
 	     struct callb_data *data) 
diff -u --recursive --new-file v1.3.94/linux/drivers/isdn/pcbit/callbacks.h linux/drivers/isdn/pcbit/callbacks.h
--- v1.3.94/linux/drivers/isdn/pcbit/callbacks.h	Sun Apr 21 19:22:07 1996
+++ linux/drivers/isdn/pcbit/callbacks.h	Tue Apr 23 12:31:35 1996
@@ -1,7 +1,7 @@
 /*
  * Copyright (C) 1996 Universidade de Lisboa
  * 
- * Writen by Pedro Roque Marques (roque@di.fc.ul.pt)
+ * Written by Pedro Roque Marques (roque@di.fc.ul.pt)
  *
  * This software may be used and distributed according to the terms of 
  * the GNU Public License, incorporated herein by reference.
diff -u --recursive --new-file v1.3.94/linux/drivers/isdn/pcbit/capi.c linux/drivers/isdn/pcbit/capi.c
--- v1.3.94/linux/drivers/isdn/pcbit/capi.c	Sun Apr 21 19:22:07 1996
+++ linux/drivers/isdn/pcbit/capi.c	Tue Apr 23 12:31:35 1996
@@ -1,7 +1,7 @@
 /*
  * Copyright (C) 1996 Universidade de Lisboa
  * 
- * Writen by Pedro Roque Marques (roque@di.fc.ul.pt)
+ * Written by Pedro Roque Marques (roque@di.fc.ul.pt)
  *
  * This software may be used and distributed according to the terms of 
  * the GNU Public License, incorporated herein by reference.
@@ -90,12 +90,12 @@
         *((ushort*) skb_put(*skb, 2)) = AppInfoMask; 
 
 
-        /* Bearer Capbility - Mandatory*/
+        /* Bearer Capability - Mandatory*/
         *(skb_put(*skb, 1)) = 2;        /* BC0.Length                        */
         *(skb_put(*skb, 1)) = 0x88;     /* BC0.Octect3 - Digital Information */
         *(skb_put(*skb, 1)) = 0x90;     /* BC0.Octect4 -                     */
 
-        /* Bearer Capbility - Optional*/
+        /* Bearer Capability - Optional*/
         *(skb_put(*skb, 1)) = 0;        /* BC1.Length = 0                    */
 
         *(skb_put(*skb, 1)) = 1;        /* ChannelID.Length = 1              */
@@ -414,7 +414,7 @@
         skb_pull(skb, CIlen + 1);
 
         /* Calling Party Number */
-        /* An "aditional service" as far as Portugal Telecom is concerned */
+        /* An "additional service" as far as Portugal Telecom is concerned */
 
         len = skb->data[0];
 
@@ -504,7 +504,7 @@
         skb_pull(skb, 1);
 
         /* FIX ME */
-        /* This is actualy a firmware bug */
+        /* This is actually a firmware bug */
         if (!*complete)
         {
                 printk(KERN_DEBUG "complete=%02x\n", *complete);
diff -u --recursive --new-file v1.3.94/linux/drivers/isdn/pcbit/capi.h linux/drivers/isdn/pcbit/capi.h
--- v1.3.94/linux/drivers/isdn/pcbit/capi.h	Sun Apr 21 19:22:07 1996
+++ linux/drivers/isdn/pcbit/capi.h	Tue Apr 23 12:31:35 1996
@@ -1,7 +1,7 @@
 /*
  * Copyright (C) 1996 Universidade de Lisboa
  * 
- * Writen by Pedro Roque Marques (roque@di.fc.ul.pt)
+ * Written by Pedro Roque Marques (roque@di.fc.ul.pt)
  *
  * This software may be used and distributed according to the terms of 
  * the GNU Public License, incorporated herein by reference.
diff -u --recursive --new-file v1.3.94/linux/drivers/isdn/pcbit/drv.c linux/drivers/isdn/pcbit/drv.c
--- v1.3.94/linux/drivers/isdn/pcbit/drv.c	Sun Apr 21 19:22:07 1996
+++ linux/drivers/isdn/pcbit/drv.c	Tue Apr 23 12:31:35 1996
@@ -1,7 +1,7 @@
 /*
  * Copyright (C) 1996 Universidade de Lisboa
  * 
- * Writen by Pedro Roque Marques (roque@di.fc.ul.pt)
+ * Written by Pedro Roque Marques (roque@di.fc.ul.pt)
  *
  * This software may be used and distributed according to the terms of 
  * the GNU Public License, incorporated herein by reference.
@@ -251,7 +251,7 @@
 		pcbit_fsm_event(dev, chan, EV_USR_SETUP_RESP, NULL);
 		break;
 	case ISDN_CMD_ACCEPTB:
-		printk("ISDN_CMD_ACCEPTB - not realy needed\n");
+		printk("ISDN_CMD_ACCEPTB - not really needed\n");
 		break;
 	case ISDN_CMD_HANGUP:
 		pcbit_fsm_event(dev, chan, EV_USR_RELEASE_REQ, NULL);
@@ -354,7 +354,7 @@
 	{
 #ifdef DEBUG_QUEUE
 		printk(KERN_DEBUG 
-		       "pcbit: %d packets allready in queue - write fails\n",
+		       "pcbit: %d packets already in queue - write fails\n",
 		       chan->queued);
 #endif
 		/*
@@ -768,7 +768,7 @@
 	if (stat_count < 0)
 		stat_count = STATBUF_LEN - stat_st + stat_end;
 
-	/* FIXME: should we sleep and wait for more cockies ? */
+	/* FIXME: should we sleep and wait for more cookies ? */
 	if (len > stat_count)            
 		len = stat_count;
 
@@ -1025,7 +1025,7 @@
 		dev->unack_seq = 0;
 		break;
 	default:
-		printk("error: unkown ioctl\n");
+		printk("error: unknown ioctl\n");
 		break;
 	};
 	return 0;
diff -u --recursive --new-file v1.3.94/linux/drivers/isdn/pcbit/edss1.c linux/drivers/isdn/pcbit/edss1.c
--- v1.3.94/linux/drivers/isdn/pcbit/edss1.c	Sun Apr 21 19:22:07 1996
+++ linux/drivers/isdn/pcbit/edss1.c	Tue Apr 23 12:31:35 1996
@@ -1,7 +1,7 @@
 /*
  * Copyright (C) 1996 Universidade de Lisboa
  * 
- * Writen by Pedro Roque Marques (roque@di.fc.ul.pt)
+ * Written by Pedro Roque Marques (roque@di.fc.ul.pt)
  *
  * This software may be used and distributed according to the terms of 
  * the GNU Public License, incorporated herein by reference.
@@ -105,7 +105,7 @@
   {0x1b,"Destination out of order"},
   {0x1c,"Invalid number format (address incomplete)"},
   {0x1d,"Facility rejected"},
-  {0x1e,"Response to Status enuiry"},
+  {0x1e,"Response to Status enquiry"},
   {0x1f,"Normal, unspecified"},
   {0x22,"No circuit/channel available"},
   {0x26,"Network out of order"},
@@ -121,7 +121,7 @@
   {0x32,"Requested facility not subscribed"},
   {0x35,"Outgoing calls barred within CUG"},
   {0x37,"Incoming calls barred within CUG"},
-  {0x39,"Bearer capability not auhorized"},
+  {0x39,"Bearer capability not authorized"},
   {0x3a,"Bearer capability not presently available"},
   {0x3e,"Inconsistency in designated outgoing access information and subscriber class"},
   {0x3f,"Service or option not available, unspecified"},
@@ -166,10 +166,10 @@
   {EV_USR_RELEASE_REQ,   "CC->L3: Release Request"},
 
   {EV_NET_SETUP,        "NET->TE: setup "},
-  {EV_NET_CALL_PROC,    "NET->TE: call proceding"},
-  {EV_NET_SETUP_ACK,    "NET->TE: setup acknowlegde (more info needed)"},
+  {EV_NET_CALL_PROC,    "NET->TE: call proceeding"},
+  {EV_NET_SETUP_ACK,    "NET->TE: setup acknowledge (more info needed)"},
   {EV_NET_CONN,         "NET->TE: connect"},
-  {EV_NET_CONN_ACK,     "NET->TE: connect aknowlegde"},
+  {EV_NET_CONN_ACK,     "NET->TE: connect acknowledge"},
   {EV_NET_DISC,         "NET->TE: disconnect indication"},
   {EV_NET_RELEASE,      "NET->TE: release"},
   {EV_NET_RELEASE_COMP, "NET->TE: release complete"},
@@ -217,7 +217,7 @@
   {ST_CALL_PROC, ST_NULL, EV_NET_DISC, cb_disc_1},
   {ST_CALL_PROC, ST_DISC_REQ, EV_USR_RELEASE_REQ, cb_disc_2},
 
-  /* Incomming */
+  /* Incoming */
   {ST_NULL, ST_CALL_PRES, EV_NET_SETUP, NULL},
 
   {ST_CALL_PRES, ST_INCM_PROC, EV_USR_PROCED_REQ, cb_in_1},
@@ -270,7 +270,7 @@
         dev = chan2dev(chan);
 
         if (dev == NULL) {
-                printk(KERN_WARNING "pcbit: timer for unkown device\n");
+                printk(KERN_WARNING "pcbit: timer for unknown device\n");
                 return;
         }
 
diff -u --recursive --new-file v1.3.94/linux/drivers/isdn/pcbit/edss1.h linux/drivers/isdn/pcbit/edss1.h
--- v1.3.94/linux/drivers/isdn/pcbit/edss1.h	Sun Apr 21 19:22:07 1996
+++ linux/drivers/isdn/pcbit/edss1.h	Tue Apr 23 12:31:35 1996
@@ -1,7 +1,7 @@
 /*
  * Copyright (C) 1996 Universidade de Lisboa
  * 
- * Writen by Pedro Roque Marques (roque@di.fc.ul.pt)
+ * Written by Pedro Roque Marques (roque@di.fc.ul.pt)
  *
  * This software may be used and distributed according to the terms of 
  * the GNU Public License, incorporated herein by reference.
@@ -19,11 +19,11 @@
 #define ST_NULL      0
 #define ST_CALL_INIT 1    /* Call initiated */
 #define ST_OVER_SEND 2    /* Overlap sending - Requests More Info 4 call */
-#define ST_CALL_PROC 3    /* Call Procceding */
+#define ST_CALL_PROC 3    /* Call Proceeding */
 #define ST_CALL_DELV 4
 #define ST_CALL_PRES 6    /* Call Present - Received CONN.IND */
 #define ST_CALL_RECV 7    /* Alerting sent */
-#define ST_CONN_REQ  8    /* Answered - wainting 4 CONN.CONF */
+#define ST_CONN_REQ  8    /* Answered - waiting 4 CONN.CONF */
 #define ST_INCM_PROC 9
 #define ST_ACTIVE    10
 #define ST_DISC_REQ  11
diff -u --recursive --new-file v1.3.94/linux/drivers/isdn/pcbit/layer2.c linux/drivers/isdn/pcbit/layer2.c
--- v1.3.94/linux/drivers/isdn/pcbit/layer2.c	Sun Apr 21 19:22:07 1996
+++ linux/drivers/isdn/pcbit/layer2.c	Tue Apr 23 12:31:35 1996
@@ -1,7 +1,7 @@
 /*
  * Copyright (C) 1996 Universidade de Lisboa
  * 
- * Writen by Pedro Roque Marques (roque@di.fc.ul.pt)
+ * Written by Pedro Roque Marques (roque@di.fc.ul.pt)
  *
  * This software may be used and distributed according to the terms of 
  * the GNU Public License, incorporated herein by reference.
@@ -288,7 +288,7 @@
 			frame->copied += cp_len;
 		}
 
-		/* bookeeping */
+		/* bookkeeping */
 		dev->free -= flen;
 		pcbit_tx_update(dev, flen);
 
@@ -461,18 +461,18 @@
                         return;
                 }
 
-                /* miminum frame read */
+                /* minimum frame read */
 
 		frame->skb = dev_alloc_skb(frame->hdr_len + frame->dt_len + 
 					   ((frame->hdr_len + 15) & ~15));
 
 		if (!frame->skb) {
-			printk(KERN_DEBUG "pcbit_receive: out of memmory\n");
+			printk(KERN_DEBUG "pcbit_receive: out of memory\n");
 			kfree(frame);
 			return;
 		}
 
-                /* 16 byte aligment for IP */		       
+                /* 16 byte alignment for IP */		       
 		if (frame->dt_len)
                         skb_reserve(frame->skb, (frame->hdr_len + 15) & ~15);
 
@@ -485,7 +485,7 @@
                 if (!(frame = dev->read_frame)) {                
                         printk("Type 1 frame and no frame queued\n");
 #if 1
-			/* usualy after an error: toss frame */
+			/* usually after an error: toss frame */
 			dev->readptr += tt;
 			if (dev->readptr > dev->sh_mem + BANK2 + BANKLEN)
 				dev->readptr -= BANKLEN;
@@ -533,7 +533,7 @@
 /*
  *  The board sends 0 sized frames
  *  They are TDATA_CONFs that get messed up somehow
- *  gotta send a fake acknowledment to the upper layer somehow
+ *  gotta send a fake acknowledgment to the upper layer somehow
  */
 
 static __inline__ void pcbit_fake_conf(struct pcbit_dev *dev, struct pcbit_chan * chan)
diff -u --recursive --new-file v1.3.94/linux/drivers/isdn/pcbit/layer2.h linux/drivers/isdn/pcbit/layer2.h
--- v1.3.94/linux/drivers/isdn/pcbit/layer2.h	Sun Apr 21 19:22:07 1996
+++ linux/drivers/isdn/pcbit/layer2.h	Tue Apr 23 12:31:35 1996
@@ -1,7 +1,7 @@
 /*
  * Copyright (C) 1996 Universidade de Lisboa
  * 
- * Writen by Pedro Roque Marques (roque@di.fc.ul.pt)
+ * Written by Pedro Roque Marques (roque@di.fc.ul.pt)
  *
  * This software may be used and distributed according to the terms of 
  * the GNU Public License, incorporated herein by reference.
diff -u --recursive --new-file v1.3.94/linux/drivers/isdn/pcbit/module.c linux/drivers/isdn/pcbit/module.c
--- v1.3.94/linux/drivers/isdn/pcbit/module.c	Sun Apr 21 19:22:07 1996
+++ linux/drivers/isdn/pcbit/module.c	Tue Apr 23 12:31:35 1996
@@ -1,7 +1,7 @@
 /*
  * Copyright (C) 1996 Universidade de Lisboa
  * 
- * Writen by Pedro Roque Marques (roque@di.fc.ul.pt)
+ * Written by Pedro Roque Marques (roque@di.fc.ul.pt)
  *
  * This software may be used and distributed according to the terms of 
  * the GNU Public License, incorporated herein by reference.
diff -u --recursive --new-file v1.3.94/linux/drivers/isdn/pcbit/pcbit.h linux/drivers/isdn/pcbit/pcbit.h
--- v1.3.94/linux/drivers/isdn/pcbit/pcbit.h	Sun Apr 21 19:22:07 1996
+++ linux/drivers/isdn/pcbit/pcbit.h	Tue Apr 23 12:31:35 1996
@@ -1,7 +1,7 @@
 /*
  * Copyright (C) 1996 Universidade de Lisboa
  * 
- * Writen by Pedro Roque Marques (roque@di.fc.ul.pt)
+ * Written by Pedro Roque Marques (roque@di.fc.ul.pt)
  *
  * This software may be used and distributed according to the terms of 
  * the GNU Public License, incorporated herein by reference.
@@ -24,7 +24,7 @@
 struct pcbit_chan {
 	unsigned short id;
 	unsigned short callref;                   /* Call Reference */
-	unsigned char  proto;                     /* layer2protol  */
+	unsigned char  proto;                     /* layer2protocol  */
 	unsigned char  queued;                    /* unacked data messages */
 	unsigned char  layer2link;                /* used in TData */
 	unsigned char  snum;                      /* used in TData */
diff -u --recursive --new-file v1.3.94/linux/drivers/isdn/teles/isdnl3.c linux/drivers/isdn/teles/isdnl3.c
--- v1.3.94/linux/drivers/isdn/teles/isdnl3.c	Sun Apr 21 19:22:07 1996
+++ linux/drivers/isdn/teles/isdnl3.c	Tue Apr 23 12:31:35 1996
@@ -293,7 +293,7 @@
 
         if (bcfound) {
                 if (st->pa->info != 7) {
-                        printk(KERN_WARNING "non-dgital call: %s -> %s\n",
+                        printk(KERN_WARNING "non-digital call: %s -> %s\n",
                                st->pa->calling,
                                st->pa->called);
                 }
diff -u --recursive --new-file v1.3.94/linux/drivers/net/depca.c linux/drivers/net/depca.c
--- v1.3.94/linux/drivers/net/depca.c	Fri Apr 12 15:51:55 1996
+++ linux/drivers/net/depca.c	Tue Apr 23 09:22:01 1996
@@ -200,11 +200,12 @@
 			  Both above from a suggestion by 
 			  <pchen@woodruffs121.residence.gatech.edu>.
 			  Add new multicasting code.
+      0.421   22-Apr-96	  Fix alloc_device() bug <jari@markkus2.fimr.fi>
 
     =========================================================================
 */
 
-static const char *version = "depca.c:v0.42 95/12/27 davies@wanton.lkg.dec.com\n";
+static const char *version = "depca.c:v0.421 96/4/22 davies@wanton.lkg.dec.com\n";
 
 #include <linux/module.h>
 
@@ -1336,7 +1337,7 @@
 	** and initialize it (name, I/O address, next device (NULL) and
 	** initialisation probe routine).
 	*/
-	dev->name = (char *)(dev + sizeof(struct device));
+	dev->name = (char *)(dev + 1);
 	if (num_eth > 9999) {
 	  sprintf(dev->name,"eth????");    /* New device name */
 	} else {
@@ -1375,7 +1376,7 @@
 	    ** and initialize it (name, I/O address, next device (NULL) and
 	    ** initialisation probe routine).
 	    */
-	    tmp->name = (char *)(tmp + sizeof(struct device));
+	    tmp->name = (char *)(tmp + 1);
 	    if (num_eth > 9999) {
 	      sprintf(tmp->name,"eth????");       /* New device name */
 	    } else {
diff -u --recursive --new-file v1.3.94/linux/drivers/net/ewrk3.c linux/drivers/net/ewrk3.c
--- v1.3.94/linux/drivers/net/ewrk3.c	Wed Mar  6 15:04:20 1996
+++ linux/drivers/net/ewrk3.c	Tue Apr 23 09:22:01 1996
@@ -132,11 +132,12 @@
 			  Add new multicasting code.
       0.41    20-Jan-96   Fix IRQ set up problem reported by 
                           <kenneth@bbs.sas.ntu.ac.sg>.
+      0.42    22-Apr-96	  Fix alloc_device() bug <jari@markkus2.fimr.fi>
 
     =========================================================================
 */
 
-static const char *version = "ewrk3.c:v0.41 96/1/20 davies@wanton.lkg.dec.com\n";
+static const char *version = "ewrk3.c:v0.42 96/4/22 davies@wanton.lkg.dec.com\n";
 
 #include <linux/module.h>
 
@@ -1415,7 +1416,7 @@
 	** and initialize it (name, I/O address, next device (NULL) and
 	** initialisation probe routine).
 	*/
-	dev->name = (char *)(dev + sizeof(struct device));
+	dev->name = (char *)(dev + 1);
 	if (num_eth > 9999) {
 	  sprintf(dev->name,"eth????");    /* New device name */
 	} else {
@@ -1454,7 +1455,7 @@
 	    ** and initialize it (name, I/O address, next device (NULL) and
 	    ** initialisation probe routine).
 	    */
-	    tmp->name = (char *)(tmp + sizeof(struct device));
+	    tmp->name = (char *)(tmp + 1);
 	    if (num_eth > 9999) {
 	      sprintf(tmp->name,"eth????");       /* New device name */
 	    } else {
diff -u --recursive --new-file v1.3.94/linux/drivers/net/ppp.c linux/drivers/net/ppp.c
--- v1.3.94/linux/drivers/net/ppp.c	Fri Apr 12 15:51:56 1996
+++ linux/drivers/net/ppp.c	Wed Apr 24 09:13:04 1996
@@ -2613,7 +2613,7 @@
  */
 	case SEL_EX:
 		/* Is this a pty link and the remote disconnected? */
-		if (tty->flags & (1 << TTY_SLAVE_CLOSED))
+		if (tty->flags & (1 << TTY_OTHER_CLOSED))
 			break;
 
 		/* Is this a local link and the modem disconnected? */
diff -u --recursive --new-file v1.3.94/linux/drivers/sbus/dvma.c linux/drivers/sbus/dvma.c
--- v1.3.94/linux/drivers/sbus/dvma.c	Sun Apr 21 19:22:10 1996
+++ linux/drivers/sbus/dvma.c	Tue Apr 23 12:31:35 1996
@@ -78,7 +78,7 @@
 					dma->SBus_dev->reg_addrs[0].which_io, 0x0);
 
 		dma->node = dma->SBus_dev->prom_node;
-		dma->running=0;      /* No tranfers going on as of yet */
+		dma->running=0;      /* No transfers going on as of yet */
 		dma->allocated=0;    /* No one has allocated us yet */
 		switch((dma->regs->cond_reg)&DMA_DEVICE_ID) {
 		case DMA_VERS0:
diff -u --recursive --new-file v1.3.94/linux/drivers/scsi/esp.h linux/drivers/scsi/esp.h
--- v1.3.94/linux/drivers/scsi/esp.h	Sun Apr 21 19:22:11 1996
+++ linux/drivers/scsi/esp.h	Tue Apr 23 12:31:34 1996
@@ -246,7 +246,7 @@
 
 /* The status register can be masked with ESP_STAT_PMASK and compared
  * with the following values to determine the current phase the ESP
- * (at least thinks it) is in.  For our pusposes we also add our own
+ * (at least thinks it) is in.  For our purposes we also add our own
  * software 'done' bit for our phase management engine.
  */
 #define ESP_DOP   (0)                                       /* Data Out  */
diff -u --recursive --new-file v1.3.94/linux/drivers/scsi/scsi.c linux/drivers/scsi/scsi.c
--- v1.3.94/linux/drivers/scsi/scsi.c	Sun Apr 21 12:39:02 1996
+++ linux/drivers/scsi/scsi.c	Wed Apr 24 12:47:02 1996
@@ -23,6 +23,10 @@
  *  Added request_module("scsi_hostadapter") for kerneld:
  *  (Put an "alias scsi_hostadapter your_hostadapter" in /etc/conf.modules)
  *  Bjorn Ekwall  <bj0rn@blox.se>
+ *
+ *  Major improvements to the timeout, abort, and reset processing,
+ *  as well as performance modifications for large queue depths by
+ *  Leonard N. Zubkoff <lnz@dandelion.com>
  */
 
 /*
@@ -2122,12 +2126,12 @@
                  */
                 if( temp & SCSI_RESET_BUS_RESET )
                 {
-                    SCpnt1 = host->host_queue;
-                    while(SCpnt1) {
-                        if( SCpnt->request.rq_status != RQ_INACTIVE
-                           && SCpnt1 != SCpnt)
-                            scsi_request_sense (SCpnt);
-                        SCpnt1 = SCpnt1->next;
+		    SCpnt1 = host->host_queue;
+		    while(SCpnt1) {
+			if (SCpnt1->request.rq_status != RQ_INACTIVE
+			    && SCpnt1 != SCpnt)
+			    scsi_request_sense (SCpnt1);
+			SCpnt1 = SCpnt1->next;
                     }
                 }
 		return 0;
diff -u --recursive --new-file v1.3.94/linux/drivers/scsi/st.c linux/drivers/scsi/st.c
--- v1.3.94/linux/drivers/scsi/st.c	Tue Apr 23 13:57:10 1996
+++ linux/drivers/scsi/st.c	Wed Apr 24 12:48:52 1996
@@ -11,7 +11,7 @@
   Copyright 1992 - 1996 Kai Makisara
 		 email Kai.Makisara@metla.fi
 
-  Last modified: Sun Apr 21 22:03:50 1996 by root@kai.makisara.fi
+  Last modified: Wed Apr 24 09:53:23 1996 by root@kai.makisara.fi
   Some small formal changes - aeb, 950809
 */
 
@@ -1230,9 +1230,28 @@
 		  (STp->buffer)->buffer_bytes = bytes - transfer;
 		}
 		else {
-		  printk(KERN_NOTICE "st%d: Incorrect block size.\n", dev);
 		  SCpnt->request.rq_status = RQ_INACTIVE;  /* Mark as not busy */
-		  return (-EIO);
+		  if (transfer == blks) {  /* We did not get anything, signal error */
+		    printk(KERN_NOTICE "st%d: Incorrect block size.\n", dev);
+		    if (STp->drv_block >= 0)
+		      STp->drv_block += blks - transfer + 1;
+		    st_int_ioctl(inode, filp, MTBSR, 1);
+		    return (-EIO);
+		  }
+		  /* We have some data, deliver it */
+		  (STp->buffer)->buffer_bytes = (blks - transfer) * STp->block_size;
+#if DEBUG
+		  if (debugging)
+		    printk(ST_DEB_MSG "st%d: ILI but enough data received %d %d.\n",
+			   dev, count - total, (STp->buffer)->buffer_bytes);
+#endif
+		  if (count - total > (STp->buffer)->buffer_bytes)
+		    count = total + (STp->buffer)->buffer_bytes;
+		  if (STp->drv_block >= 0)
+		    STp->drv_block += 1;
+		  if (st_int_ioctl(inode, filp, MTBSR, 1))
+		    return (-EIO);
+		  SCpnt = NULL;
 		}
 	      }
 	      else if (SCpnt->sense_buffer[2] & 0x40) {
diff -u --recursive --new-file v1.3.94/linux/drivers/sound/ad1848.c linux/drivers/sound/ad1848.c
--- v1.3.94/linux/drivers/sound/ad1848.c	Fri Apr 12 15:52:02 1996
+++ linux/drivers/sound/ad1848.c	Tue Apr 23 09:12:30 1996
@@ -390,7 +390,7 @@
   if (mix_devices[dev][RIGHT_CHN].nbits == 0)	/* Mono control */
     right = left;
 
-  retvol = left | (left << 8);
+  retvol = left | (right << 8);
 
   /* Scale volumes */
   left = mix_cvt[left];
diff -u --recursive --new-file v1.3.94/linux/fs/buffer.c linux/fs/buffer.c
--- v1.3.94/linux/fs/buffer.c	Wed Apr 17 09:06:32 1996
+++ linux/fs/buffer.c	Wed Apr 24 15:09:21 1996
@@ -721,17 +721,11 @@
 	
 	/* Too bad, that was not enough. Try a little harder to grow some. */
 	
-	if (nr_free_pages > min_free_pages + 5) {
-		if (grow_buffers(GFP_BUFFER, size)) {
-	                needed -= PAGE_SIZE;
-			goto repeat0;
-		};
+	if (grow_buffers(GFP_ATOMIC, size)) {
+                needed -= PAGE_SIZE;
+		goto repeat0;
 	}
-	
-	/* and repeat until we find something good */
-	if (!grow_buffers(GFP_ATOMIC, size))
-		wakeup_bdflush(1);
-	needed -= PAGE_SIZE;
+	wakeup_bdflush(1);
 	goto repeat0;
 }
 
diff -u --recursive --new-file v1.3.94/linux/fs/ext2/super.c linux/fs/ext2/super.c
--- v1.3.94/linux/fs/ext2/super.c	Mon Feb 26 08:38:08 1996
+++ linux/fs/ext2/super.c	Tue Apr 23 14:08:55 1996
@@ -651,7 +651,7 @@
 	/*
 	 * Allow the "check" option to be passed as a remount option.
 	 */
-	set_opt (new_mount_opt, CHECK_NORMAL);
+	new_mount_opt = EXT2_MOUNT_CHECK_NORMAL;
 	if (!parse_options (data, &tmp, &resuid, &resgid,
 			    &new_mount_opt))
 		return -EINVAL;
diff -u --recursive --new-file v1.3.94/linux/fs/locks.c linux/fs/locks.c
--- v1.3.94/linux/fs/locks.c	Mon Apr 15 12:20:21 1996
+++ linux/fs/locks.c	Wed Apr 24 16:34:06 1996
@@ -68,6 +68,9 @@
  *  see if system call should be rejected. Ref. HP-UX/SunOS/Solaris Reference
  *  Manual, Section 2.
  *  Andy Walker (andy@lysaker.kvaerner.no), April 09, 1996.
+ *
+ *  Tidied up block list handling.
+ *  Andy Walker (andy@lysaker.kvaerner.no), April 24, 1996.
  */
 
 #include <linux/malloc.h>
@@ -105,10 +108,10 @@
 static struct file_lock *file_lock_table = NULL;
 
 /* Free lock not inserted in any queue */
-static inline void locks_free_lock(struct file_lock **fl)
+static inline void locks_free_lock(struct file_lock *fl)
 {
-	kfree(*fl);
-	*fl = NULL;		       /* Just in case */
+	kfree(fl);
+	return;
 }
 
 /* Add lock fl to the blocked list pointed to by block.
@@ -125,34 +128,33 @@
  * so they are inlined now. -- Dmitry Gorodchanin 02/09/96.
  */
 
-static inline void locks_insert_block(struct file_lock **block, 
+static inline void locks_insert_block(struct file_lock *bfl, 
 				      struct file_lock *fl)
 {
-	struct file_lock *bfl;
-
-	while ((bfl = *block) != NULL) {
-		block = &bfl->fl_block;
+	while (bfl->fl_block != NULL) {
+		bfl = bfl->fl_block;
 	}
 
-	*block = fl;
+	bfl->fl_block = fl;
 	fl->fl_block = NULL;
 	
 	return;
 }
 
-static inline void locks_delete_block(struct file_lock **block,
+static inline void locks_delete_block(struct file_lock *bfl,
 				      struct file_lock *fl)
 {
-	struct file_lock *bfl;
+	struct file_lock *tfl;
 	
-	while ((bfl = *block) != NULL) {
-		if (bfl == fl) {
-			*block = fl->fl_block;
+	while ((tfl = bfl->fl_block) != NULL) {
+		if (tfl == fl) {
+			bfl->fl_block = fl->fl_block;
 			fl->fl_block = NULL;
 			return;
 		}
-		block = &bfl->fl_block;
+		bfl = tfl;
 	}
+	return;
 }
 
 /* flock() system call entry point. Apply a FLOCK style lock to
@@ -271,6 +273,9 @@
 		break;
 	case F_SHLCK :
 	case F_EXLCK :
+		printk(KERN_WARNING
+		       "fcntl_setlk() called by process %d with broken flock() emulation\n",
+		       current->pid);
 		if (!(filp->f_mode & 3))
 			return (-EBADF);
 		break;
@@ -612,10 +617,10 @@
 				 * instead of locks_delete_lock()
 				 * 	Dmitry Gorodchanin 09/02/96.
 				 */
-				locks_free_lock(&new_fl);
+				locks_free_lock(new_fl);
 				return (-ERESTARTSYS);
 			}
-			locks_insert_block(&fl->fl_block, new_fl);
+			locks_insert_block(fl, new_fl);
 			interruptible_sleep_on(&new_fl->fl_wait);
 			wake_up(&new_fl->fl_wait);
 			if (current->signal & ~current->blocked) {
@@ -626,14 +631,14 @@
 				 * 	Dmitry Gorodchanin 09/02/96.
 				 */
 
-				locks_delete_block(&fl->fl_block, new_fl);
-				locks_free_lock(&new_fl);
+				locks_delete_block(fl, new_fl);
+				locks_free_lock(new_fl);
 				return (-ERESTARTSYS);
 			}
 			goto repeat;
 		}
 		
-		locks_free_lock(&new_fl);
+		locks_free_lock(new_fl);
 		return (-EAGAIN);
 	}
 	locks_insert_lock(&filp->f_inode->i_flock, new_fl);
@@ -874,9 +879,8 @@
 
 	if (pfl != NULL)
 		pfl->fl_nextlink = nfl;
-	else {
+	else
 		file_lock_table = nfl;
-	}
 	
 	while ((nfl = fl->fl_block) != NULL) {
 		fl->fl_block = nfl->fl_block;
diff -u --recursive --new-file v1.3.94/linux/fs/pipe.c linux/fs/pipe.c
--- v1.3.94/linux/fs/pipe.c	Sun Mar 31 00:13:18 1996
+++ linux/fs/pipe.c	Tue Apr 23 16:02:24 1996
@@ -423,6 +423,7 @@
 			break;
 	if (j < 2) {
 		iput(inode);
+		iput(inode);
 		if (j)
 			f[0]->f_count--;
 		return -ENFILE;
@@ -434,6 +435,7 @@
 			j++;
 		}
 	if (j<2) {
+		iput(inode);
 		iput(inode);
 		f[0]->f_count--;
 		f[1]->f_count--;
diff -u --recursive --new-file v1.3.94/linux/fs/ufs/ufs_super.c linux/fs/ufs/ufs_super.c
--- v1.3.94/linux/fs/ufs/ufs_super.c	Tue Apr 23 13:57:11 1996
+++ linux/fs/ufs/ufs_super.c	Tue Apr 23 09:25:57 1996
@@ -16,6 +16,8 @@
 #include <linux/module.h>
 #include <linux/locks.h>
 
+#include <asm/segment.h>
+
 struct super_block * ufs_read_super(struct super_block * sb, void * data, int silent);
 void ufs_put_super (struct super_block * sb);
 void ufs_statfs(struct super_block * sb, struct statfs * buf, int bufsize);
diff -u --recursive --new-file v1.3.94/linux/fs/ufs/ufs_symlink.c linux/fs/ufs/ufs_symlink.c
--- v1.3.94/linux/fs/ufs/ufs_symlink.c	Tue Apr 23 13:57:11 1996
+++ linux/fs/ufs/ufs_symlink.c	Tue Apr 23 09:26:55 1996
@@ -13,6 +13,8 @@
 #include <linux/fs.h>
 #include <linux/sched.h>
 
+#include <asm/segment.h>
+
 static int
 ufs_readlink(struct inode * inode, char * buffer, int buflen)
 {
@@ -39,7 +41,7 @@
 	        if (inode->i_sb->u.ufs_sb.s_flags &(UFS_DEBUG|UFS_DEBUG_LINKS)) {
 	                printk("ufs_readlink: bmap got %lu for ino %lu\n",
 	                       block, inode->i_ino);
-} 
+		} 
 	        bh = bread(inode->i_dev, block, BLOCK_SIZE);
 		if (!bh) {
 			iput (inode);
diff -u --recursive --new-file v1.3.94/linux/include/asm-alpha/io.h linux/include/asm-alpha/io.h
--- v1.3.94/linux/include/asm-alpha/io.h	Fri Apr 12 15:52:05 1996
+++ linux/include/asm-alpha/io.h	Tue Apr 23 12:47:26 1996
@@ -5,6 +5,10 @@
 
 #include <asm/system.h>
 
+/* We don't use IO slowdowns on the alpha, but.. */
+#define __SLOW_DOWN_IO	do { } while (0)
+#define SLOW_DOWN_IO	do { } while (0)
+
 /*
  * The hae (hardware address extension) register is used to
  * access high IO addresses. To avoid doing an external cycle
@@ -134,25 +138,12 @@
 #ifndef inl_p
 # define inl_p		inl
 #endif
+
 #ifndef outb_p
 # define outb_p		outb
 #endif
 #ifndef outw_p
 # define outw_p		outw
-#endif
-#ifndef outl_p
-# define outl_p		outl
-#endif
-
-#ifndef inw_p
-# define inw_p		inw
-#endif
-#ifndef outw_p
-# define outw_p		outw
-#endif
-
-#ifndef inl_p
-# define inl_p		inl
 #endif
 #ifndef outl_p
 # define outl_p		outl
diff -u --recursive --new-file v1.3.94/linux/include/asm-i386/pgtable.h linux/include/asm-i386/pgtable.h
--- v1.3.94/linux/include/asm-i386/pgtable.h	Tue Apr 23 13:57:12 1996
+++ linux/include/asm-i386/pgtable.h	Tue Apr 23 13:41:25 1996
@@ -40,7 +40,7 @@
  */
 
 #define __flush_tlb() \
-__asm__ __volatile__("movl %%cr3,%%eax\n\tmovl %%eax,%%cr3": : :"ax")
+do { unsigned long tmpreg; __asm__ __volatile__("movl %%cr3,%0\n\tmovl %0,%%cr3":"=r" (tmpreg) : :"memory"); } while (0)
 
 #ifdef CONFIG_M386
 #define __flush_tlb_one(addr) flush_tlb()
@@ -290,7 +290,7 @@
 do { \
 	(tsk)->tss.cr3 = (unsigned long) (pgdir); \
 	if ((tsk) == current) \
-		__asm__ __volatile__("movl %0,%%cr3": :"a" (pgdir)); \
+		__asm__ __volatile__("movl %0,%%cr3": :"r" (pgdir)); \
 } while (0)
 
 extern inline int pte_none(pte_t pte)		{ return !pte_val(pte); }
diff -u --recursive --new-file v1.3.94/linux/include/asm-sparc/asi.h linux/include/asm-sparc/asi.h
--- v1.3.94/linux/include/asm-sparc/asi.h	Sun Apr 21 19:22:12 1996
+++ linux/include/asm-sparc/asi.h	Tue Apr 23 12:31:34 1996
@@ -101,7 +101,7 @@
 #define ASI_M_IC_FLCLEAR   0x36
 #define ASI_M_DC_FLCLEAR   0x37
 
-#define ASI_M_DCDR         0x39   /* Data Cache Diagnostics Registerl rw, ss */
+#define ASI_M_DCDR         0x39   /* Data Cache Diagnostics Register rw, ss */
 
 #define ASI_M_ACTION       0x4c   /* Breakpoint Action Register (GNU/Viking) */
 
diff -u --recursive --new-file v1.3.94/linux/include/asm-sparc/auxio.h linux/include/asm-sparc/auxio.h
--- v1.3.94/linux/include/asm-sparc/auxio.h	Sun Apr 21 19:22:12 1996
+++ linux/include/asm-sparc/auxio.h	Tue Apr 23 12:31:34 1996
@@ -1,5 +1,5 @@
 /* $Id: auxio.h,v 1.10 1996/01/03 03:52:58 davem Exp $
- * auxio.h:  Definitons and code for the Auxiliary I/O register.
+ * auxio.h:  Definitions and code for the Auxiliary I/O register.
  *
  * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
  */
diff -u --recursive --new-file v1.3.94/linux/include/asm-sparc/bsderrno.h linux/include/asm-sparc/bsderrno.h
--- v1.3.94/linux/include/asm-sparc/bsderrno.h	Sun Apr 21 19:22:12 1996
+++ linux/include/asm-sparc/bsderrno.h	Tue Apr 23 12:31:34 1996
@@ -1,5 +1,5 @@
 /* $Id: bsderrno.h,v 1.2 1995/11/25 02:31:17 davem Exp $
- * bsderrno.h: Error numbers for NetBSD binary compatability
+ * bsderrno.h: Error numbers for NetBSD binary compatibility
  *
  * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
  */
diff -u --recursive --new-file v1.3.94/linux/include/asm-sparc/cache.h linux/include/asm-sparc/cache.h
--- v1.3.94/linux/include/asm-sparc/cache.h	Sun Apr 21 19:22:12 1996
+++ linux/include/asm-sparc/cache.h	Tue Apr 23 12:31:34 1996
@@ -14,7 +14,7 @@
  * alternate address space.  The IDC bit must be off in the ICCR on
  * HyperSparcs for these accesses to work.  The code below does not do
  * any checking, the caller must do so.  These routines are for
- * diagnostics only, but coule end up being useful.  Use with care.
+ * diagnostics only, but could end up being useful.  Use with care.
  * Also, you are asking for trouble if you execute these in one of the
  * three instructions following a %asr/%psr access or modification.
  */
diff -u --recursive --new-file v1.3.94/linux/include/asm-sparc/cypress.h linux/include/asm-sparc/cypress.h
--- v1.3.94/linux/include/asm-sparc/cypress.h	Sun Apr 21 19:22:12 1996
+++ linux/include/asm-sparc/cypress.h	Tue Apr 23 12:31:34 1996
@@ -24,7 +24,7 @@
  * BM: Boot Mode -- 0 = not in boot mode, 1 = in boot mode
  * C: Cacheable -- Indicates whether accesses are cacheable while
  *    the MMU is off.  0=no 1=yes
- * MR: MemoryReflection -- Indicates whether the bus attacted to the
+ * MR: MemoryReflection -- Indicates whether the bus attached to the
  *     MBus supports memory reflection. 0=no 1=yes (605 only)
  * CM: CacheMode -- Indicates whether the cache is operating in write
  *     through or copy-back mode. 0=write-through 1=copy-back
diff -u --recursive --new-file v1.3.94/linux/include/asm-sparc/dma.h linux/include/asm-sparc/dma.h
--- v1.3.94/linux/include/asm-sparc/dma.h	Sun Apr 21 19:22:12 1996
+++ linux/include/asm-sparc/dma.h	Tue Apr 23 12:31:34 1996
@@ -96,7 +96,7 @@
 #define DMA_RST_ENET     DMA_RST_SCSI      /* Reset the ENET controller */
 #define DMA_ST_WRITE     0x00000100        /* write from device to memory */
 #define DMA_ENABLE       0x00000200        /* Fire up DMA, handle requests */
-#define DMA_PEND_READ    0x00000400        /* DMA_VERS1/0/PLUS Pendind Read */
+#define DMA_PEND_READ    0x00000400        /* DMA_VERS1/0/PLUS Pending Read */
 #define DMA_DSBL_RD_DRN  0x00001000        /* No EC drain on slave reads */
 #define DMA_BCNT_ENAB    0x00002000        /* If on, use the byte counter */
 #define DMA_TERM_CNTR    0x00004000        /* Terminal counter */
diff -u --recursive --new-file v1.3.94/linux/include/asm-sparc/ecc.h linux/include/asm-sparc/ecc.h
--- v1.3.94/linux/include/asm-sparc/ecc.h	Sun Apr 21 19:22:12 1996
+++ linux/include/asm-sparc/ecc.h	Tue Apr 23 12:31:34 1996
@@ -101,7 +101,7 @@
  *  31-18  17  16    15-8    7-4   3    2    1 0
  *
  * C2E: A C2 graphics error occurred. 0=no 1=yes (SS10 only)
- * MULT: Multiple errors occurres ;-O 0=no 1=prom_panic(yes)
+ * MULT: Multiple errors occurred ;-O 0=no 1=prom_panic(yes)
  * SYNDROME: Controller is mentally unstable.
  * DWORD:
  * UNC: Uncorrectable error.  0=no 1=yes
diff -u --recursive --new-file v1.3.94/linux/include/asm-sparc/fbio.h linux/include/asm-sparc/fbio.h
--- v1.3.94/linux/include/asm-sparc/fbio.h	Sun Apr 21 19:22:12 1996
+++ linux/include/asm-sparc/fbio.h	Tue Apr 23 12:31:34 1996
@@ -72,7 +72,7 @@
         int     emu_types[FB_ATTR_NEMUTYPES]; /* supported emulations */
 };
 #define FBIOSATTR  _IOW('F', 5, struct fbgattr) /* Unsupported: */
-#define FBIOGATTR  _IOR('F', 6, struct fbgattr)	/* supporoted */
+#define FBIOGATTR  _IOR('F', 6, struct fbgattr)	/* supported */
 
 #define FBIOSVIDEO _IOW('F', 7, int)
 #define FBIOGVIDEO _IOR('F', 8, int)
diff -u --recursive --new-file v1.3.94/linux/include/asm-sparc/floppy.h linux/include/asm-sparc/floppy.h
--- v1.3.94/linux/include/asm-sparc/floppy.h	Sun Apr 21 19:22:12 1996
+++ linux/include/asm-sparc/floppy.h	Tue Apr 23 12:31:34 1996
@@ -93,7 +93,7 @@
 #define N_FDC    1
 #define N_DRIVE  8
 
-/* No 64k boundry crossing problems on the Sparc. */
+/* No 64k boundary crossing problems on the Sparc. */
 #define CROSS_64KB(a,s) (0)
 
 /* Routines unique to each controller type on a Sun. */
diff -u --recursive --new-file v1.3.94/linux/include/asm-sparc/head.h linux/include/asm-sparc/head.h
--- v1.3.94/linux/include/asm-sparc/head.h	Sun Apr 21 19:22:12 1996
+++ linux/include/asm-sparc/head.h	Tue Apr 23 12:31:34 1996
@@ -8,7 +8,7 @@
 #define SRMMU_L1_KBASE_OFFSET ((KERNBASE>>24)<<2)  /* Used in boot remapping. */
 #define INTS_ENAB        0x01           /* entry.S uses this. */
 
-#define NCPUS            4              /* Architectual limit of sun4m. */
+#define NCPUS            4              /* Architectural limit of sun4m. */
 
 #define SUN4_PROM_VECTOR 0xFFE81000     /* To safely die on a SUN4 */
 #define SUN4_PRINTF      0x84           /* Offset into SUN4_PROM_VECTOR */
@@ -82,7 +82,7 @@
 
 /* NMI's (Non Maskable Interrupts) are special, you can't keep them
  * from coming in, and basically if you get one, the shows over. ;(
- * On the sun4c they are usually asyncronous memory errors, on the
+ * On the sun4c they are usually asynchronous memory errors, on the
  * the sun4m they could be either due to mem errors or a software
  * initiated interrupt from the prom/kern on an SMP box saying "I
  * command you to do CPU tricks, read your mailbox for more info."
diff -u --recursive --new-file v1.3.94/linux/include/asm-sparc/irq.h linux/include/asm-sparc/irq.h
--- v1.3.94/linux/include/asm-sparc/irq.h	Sun Apr 21 19:22:12 1996
+++ linux/include/asm-sparc/irq.h	Tue Apr 23 12:31:34 1996
@@ -15,7 +15,7 @@
 
 /* Dave Redman (djhr@tadpole.co.uk)
  * changed these to function pointers.. it saves cycles and will allow
- * the irq dependancies to be split into different files at a later date
+ * the irq dependencies to be split into different files at a later date
  * sun4c_irq.c, sun4m_irq.c etc so we could reduce the kernel size.
  */
 extern void (*disable_irq)(unsigned int);
diff -u --recursive --new-file v1.3.94/linux/include/asm-sparc/mbus.h linux/include/asm-sparc/mbus.h
--- v1.3.94/linux/include/asm-sparc/mbus.h	Sun Apr 21 19:22:12 1996
+++ linux/include/asm-sparc/mbus.h	Tue Apr 23 12:31:34 1996
@@ -45,7 +45,7 @@
 extern unsigned int hwbug_bitmask;
 
 /* First the module type values. To find out which you have, just load
- * the mmu control register from ASI_M_MMUREG alternate adress space and
+ * the mmu control register from ASI_M_MMUREG alternate address space and
  * shift the value right 28 bits.
  */
 /* IMPL field means the company which produced the chip. */
diff -u --recursive --new-file v1.3.94/linux/include/asm-sparc/memreg.h linux/include/asm-sparc/memreg.h
--- v1.3.94/linux/include/asm-sparc/memreg.h	Sun Apr 21 19:22:12 1996
+++ linux/include/asm-sparc/memreg.h	Tue Apr 23 12:31:34 1996
@@ -16,7 +16,7 @@
 #define SUN4C_SYNC_SIZE      0x0002  /* bad access size? whuz this? */
 #define SUN4C_SYNC_PARITY    0x0008  /* bad ram chips caused a parity error */
 #define SUN4C_SYNC_SBUS      0x0010  /* the SBUS had some problems... */
-#define SUN4C_SYNC_NOMEM     0x0020  /* translation to non-existant ram */
+#define SUN4C_SYNC_NOMEM     0x0020  /* translation to non-existent ram */
 #define SUN4C_SYNC_PROT      0x0040  /* access violated pte protections */
 #define SUN4C_SYNC_NPRESENT  0x0080  /* pte said that page was not present */
 #define SUN4C_SYNC_BADWRITE  0x8000  /* while writing something went bogus */
diff -u --recursive --new-file v1.3.94/linux/include/asm-sparc/mman.h linux/include/asm-sparc/mman.h
--- v1.3.94/linux/include/asm-sparc/mman.h	Sun Apr 21 19:22:12 1996
+++ linux/include/asm-sparc/mman.h	Tue Apr 23 12:31:34 1996
@@ -18,7 +18,7 @@
 #define MAP_NORESERVE   0x40            /* don't reserve swap pages */
 #define MAP_INHERIT     0x80            /* SunOS doesn't do this, but... */
 #define MAP_LOCKED      0x100           /* lock the mapping */
-#define _MAP_NEW        0x80000000      /* Binary compatability is fun... */
+#define _MAP_NEW        0x80000000      /* Binary compatibility is fun... */
 
 #define MAP_GROWSDOWN	0x0100		/* stack-like segment */
 #define MAP_DENYWRITE	0x0800		/* ETXTBSY */
diff -u --recursive --new-file v1.3.94/linux/include/asm-sparc/mostek.h linux/include/asm-sparc/mostek.h
--- v1.3.94/linux/include/asm-sparc/mostek.h	Sun Apr 21 19:22:12 1996
+++ linux/include/asm-sparc/mostek.h	Tue Apr 23 12:31:34 1996
@@ -29,7 +29,7 @@
 /* Control register values. */
 #define MSTK_CREG_WRITE    0x80   /* Must set this before placing values. */
 #define MSTK_CREG_READ     0x40   /* Stop the clock, I want to fetch values. */
-#define MSTK_CREG_SIGN     0x20   /* Grrr... whats this??? */
+#define MSTK_CREG_SIGN     0x20   /* Grrr... what's this??? */
 
 #define MSTK_YR_ZERO       1968   /* If year reg has zero, it is 1968 */
 #define MSTK_CVT_YEAR(yr)  ((yr) + MSTK_YR_ZERO)
diff -u --recursive --new-file v1.3.94/linux/include/asm-sparc/mpmbox.h linux/include/asm-sparc/mpmbox.h
--- v1.3.94/linux/include/asm-sparc/mpmbox.h	Sun Apr 21 19:22:12 1996
+++ linux/include/asm-sparc/mpmbox.h	Tue Apr 23 12:31:34 1996
@@ -38,7 +38,7 @@
  */
 #define MAILBOX_BPT_SPIN      0xfd
 
-/* Oh geese, some other nitwit got a damn watchdog reset.  The partys
+/* Oh geese, some other nitwit got a damn watchdog reset.  The party's
  * over so go call prom_stopcpu().
  */
 #define MAILBOX_WDOG_STOP     0xfe
diff -u --recursive --new-file v1.3.94/linux/include/asm-sparc/mxcc.h linux/include/asm-sparc/mxcc.h
--- v1.3.94/linux/include/asm-sparc/mxcc.h	Sun Apr 21 19:22:12 1996
+++ linux/include/asm-sparc/mxcc.h	Tue Apr 23 12:31:34 1996
@@ -51,7 +51,7 @@
  *  31   30 29  28  27  26  25 24-15  14-7   6  5-3   2-0
  *
  * ME: Multiple Errors have occurred
- * CE: Cache consistancy Error
+ * CE: Cache consistency Error
  * PEW: Parity Error during a Write operation
  * PEE: Parity Error involving the External cache
  * ASE: ASynchronous Error
diff -u --recursive --new-file v1.3.94/linux/include/asm-sparc/oplib.h linux/include/asm-sparc/oplib.h
--- v1.3.94/linux/include/asm-sparc/oplib.h	Sun Apr 21 19:22:12 1996
+++ linux/include/asm-sparc/oplib.h	Tue Apr 23 12:31:34 1996
@@ -15,7 +15,7 @@
 
 /* Enumeration to describe the prom major version we have detected. */
 enum prom_major_version {
-	PROM_V0,      /* Origional sun4c V0 prom */
+	PROM_V0,      /* Original sun4c V0 prom */
 	PROM_V2,      /* sun4c and early sun4m V2 prom */
 	PROM_V3,      /* sun4m and later, up to sun4d/sun4e machines V3 */
 	PROM_P1275,   /* IEEE compliant ISA based Sun PROM, only sun4u */
@@ -84,7 +84,7 @@
  * entries.  One for the total amount of physical ram on the machine, one
  * for the amount of physical ram available, and one describing the virtual
  * areas which are allocated by the prom.  So, in a sense the physical
- * available is a calculation of the total physical minus the physcial mapped
+ * available is a calculation of the total physical minus the physical mapped
  * by the prom with virtual mappings.
  *
  * These lists are returned pre-sorted, this should make your life easier
diff -u --recursive --new-file v1.3.94/linux/include/asm-sparc/pconf.h linux/include/asm-sparc/pconf.h
--- v1.3.94/linux/include/asm-sparc/pconf.h	Sun Apr 21 19:22:12 1996
+++ linux/include/asm-sparc/pconf.h	Tue Apr 23 12:31:34 1996
@@ -1,6 +1,6 @@
 /* $Id: pconf.h,v 1.2 1995/11/25 02:32:20 davem Exp $
  * pconf.h: pathconf() and fpathconf() defines for SunOS
- *          system call compatability.
+ *          system call compatibility.
  *
  * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
  */
@@ -13,7 +13,7 @@
 
 #define _PCONF_LINK       1 /* Max number of links to an object        */
 #define _PCONF_CANON      2 /* TTY input buffer line size              */
-#define _PCONF_INPUT      3 /* Biggest packet a tty can inbibe at once */
+#define _PCONF_INPUT      3 /* Biggest packet a tty can imbibe at once */
 #define _PCONF_NAME       4 /* Filename length max                     */
 #define _PCONF_PATH       5 /* Max size of a pathname                  */
 #define _PCONF_PIPE       6 /* Buffer size for a pipe                  */
diff -u --recursive --new-file v1.3.94/linux/include/asm-sparc/pgtsrmmu.h linux/include/asm-sparc/pgtsrmmu.h
--- v1.3.94/linux/include/asm-sparc/pgtsrmmu.h	Sun Apr 21 19:22:12 1996
+++ linux/include/asm-sparc/pgtsrmmu.h	Tue Apr 23 12:31:34 1996
@@ -165,7 +165,7 @@
 	return retval;
 }
 
-/* This is guarenteed on all SRMMU's. */
+/* This is guaranteed on all SRMMU's. */
 extern inline void srmmu_flush_whole_tlb(void)
 {
 	__asm__ __volatile__("sta %%g0, [%0] %1\n\t": :
diff -u --recursive --new-file v1.3.94/linux/include/asm-sparc/signal.h linux/include/asm-sparc/signal.h
--- v1.3.94/linux/include/asm-sparc/signal.h	Sun Apr 21 19:22:12 1996
+++ linux/include/asm-sparc/signal.h	Tue Apr 23 12:31:34 1996
@@ -123,7 +123,7 @@
  *
  * DJHR
  * SA_STATIC_ALLOC is used for the SPARC system to indicate that this
- * interupt handler's irq structure should be statically allocated
+ * interrupt handler's irq structure should be statically allocated
  * by the request_irq routine.
  * The alternative is that arch/sparc/kernel/irq.c has carnal knowledge
  * of interrupt usage and that sucks. Also without a flag like this
diff -u --recursive --new-file v1.3.94/linux/include/asm-sparc/smp.h linux/include/asm-sparc/smp.h
--- v1.3.94/linux/include/asm-sparc/smp.h	Tue Apr 23 13:57:13 1996
+++ linux/include/asm-sparc/smp.h	Tue Apr 23 12:31:34 1996
@@ -143,7 +143,7 @@
 #define MSG_CAPTURE            0x0004       /* Park a processor. */
 #define MSG_CROSS_CALL         0x0005       /* run func on cpus */
 
-/* Imperical PROM processor mailbox constants.  If the per-cpu mailbox
+/* Empirical PROM processor mailbox constants.  If the per-cpu mailbox
  * contains something other than one of these then the ipi is from
  * Linux's active_kernel_processor.  This facility exists so that
  * the boot monitor can capture all the other cpus when one catches
diff -u --recursive --new-file v1.3.94/linux/include/asm-sparc/solerrno.h linux/include/asm-sparc/solerrno.h
--- v1.3.94/linux/include/asm-sparc/solerrno.h	Sun Apr 21 19:22:12 1996
+++ linux/include/asm-sparc/solerrno.h	Tue Apr 23 12:31:34 1996
@@ -1,5 +1,5 @@
 /* $Id: solerrno.h,v 1.4 1996/03/23 02:40:09 davem Exp $
- * solerrno.h: Solaris error return codes for compatability.
+ * solerrno.h: Solaris error return codes for compatibility.
  *
  * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
  */
@@ -41,7 +41,7 @@
 #define	SOL_EPIPE          32    /* Call a plumber                   */
 #define	SOL_EDOM           33    /* Argument was out of fct domain   */
 #define	SOL_ERANGE         34    /* Could not represent math result  */
-#define	SOL_ENOMSG         35    /* Message of req type doesnt exist */
+#define	SOL_ENOMSG         35    /* Message of req type doesn't exist */
 #define	SOL_EIDRM          36    /* Identifier has been removed      */
 #define	SOL_ECHRNG         37    /* Req channel number out of range  */
 #define	SOL_EL2NSYNC       38    /* Could not sync at run level 2    */
diff -u --recursive --new-file v1.3.94/linux/include/asm-sparc/traps.h linux/include/asm-sparc/traps.h
--- v1.3.94/linux/include/asm-sparc/traps.h	Sun Apr 21 19:22:15 1996
+++ linux/include/asm-sparc/traps.h	Tue Apr 23 12:31:34 1996
@@ -67,7 +67,7 @@
 /* First, hardware traps. */
 #define SP_TRAP_TFLT    0x1          /* Text fault */
 #define SP_TRAP_II      0x2          /* Illegal Instruction */
-#define SP_TRAP_PI      0x3          /* Priviledged Instruction */
+#define SP_TRAP_PI      0x3          /* Privileged Instruction */
 #define SP_TRAP_FPD     0x4          /* Floating Point Disabled */
 #define SP_TRAP_WOVF    0x5          /* Window Overflow */
 #define SP_TRAP_WUNF    0x6          /* Window Underflow */
diff -u --recursive --new-file v1.3.94/linux/include/asm-sparc/unistd.h linux/include/asm-sparc/unistd.h
--- v1.3.94/linux/include/asm-sparc/unistd.h	Sun Apr 21 19:22:15 1996
+++ linux/include/asm-sparc/unistd.h	Tue Apr 23 12:31:34 1996
@@ -11,7 +11,7 @@
  *
  * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
  *
- * SunOS compatability based upon preliminary work which is:
+ * SunOS compatibility based upon preliminary work which is:
  *
  * Copyright (C) 1995 Adrian M. Rodriguez (adrian@remus.rutgers.edu)
  */
diff -u --recursive --new-file v1.3.94/linux/include/asm-sparc/vac-ops.h linux/include/asm-sparc/vac-ops.h
--- v1.3.94/linux/include/asm-sparc/vac-ops.h	Sun Apr 21 19:22:15 1996
+++ linux/include/asm-sparc/vac-ops.h	Tue Apr 23 12:31:34 1996
@@ -67,7 +67,7 @@
 /* The indexing of cache lines creates a problem.  Because the line
  * field of a virtual address extends past the page offset within
  * the virtual address it is possible to have what are called
- * 'bad aliases' which will create inconsistancies.  So we must make
+ * 'bad aliases' which will create inconsistencies.  So we must make
  * sure that within a context that if a physical page is mapped
  * more than once, that 'extra' line bits are the same.  If this is
  * not the case, and thus is a 'bad alias' we must turn off the
diff -u --recursive --new-file v1.3.94/linux/include/asm-sparc/vaddrs.h linux/include/asm-sparc/vaddrs.h
--- v1.3.94/linux/include/asm-sparc/vaddrs.h	Sun Apr 21 19:22:15 1996
+++ linux/include/asm-sparc/vaddrs.h	Tue Apr 23 12:31:34 1996
@@ -23,7 +23,7 @@
 #define  DVMA_LEN       0x00040000  /* Size of the DVMA address space */
 #define  DVMA_END       0xfff40000
 
-/* IOMMU Mapping area, must be on a 16MB boundry!  Note this
+/* IOMMU Mapping area, must be on a 16MB boundary!  Note this
  * doesn't count the DVMA areas, the prom lives between the
  * iommu mapping area (for scsi transfer buffers) and the
  * dvma upper range (for lance packet ring buffers).
diff -u --recursive --new-file v1.3.94/linux/include/asm-sparc/viking.h linux/include/asm-sparc/viking.h
--- v1.3.94/linux/include/asm-sparc/viking.h	Sun Apr 21 19:22:15 1996
+++ linux/include/asm-sparc/viking.h	Tue Apr 23 12:31:34 1996
@@ -36,7 +36,7 @@
  * SP: SnooP Enable -- 0 = bus snooping off, 1 = bus snooping on
  *
  * This enables snooping on the GNU/Viking bus.  This must be on
- * for the hardware cache consistancy mechanisms of the GNU/Viking
+ * for the hardware cache consistency mechanisms of the GNU/Viking
  * to work at all.  On non-mxcc GNU/Viking modules the split I/D
  * caches will snoop regardless of whether they are enabled, this
  * takes care of the case where the I or D or both caches are turned
diff -u --recursive --new-file v1.3.94/linux/include/linux/blkdev.h linux/include/linux/blkdev.h
--- v1.3.94/linux/include/linux/blkdev.h	Sun Apr 21 19:22:16 1996
+++ linux/include/linux/blkdev.h	Wed Apr 24 16:21:40 1996
@@ -49,6 +49,7 @@
 extern struct blk_dev_struct blk_dev[MAX_BLKDEV];
 extern struct wait_queue * wait_for_request;
 extern void resetup_one_dev(struct gendisk *dev, int drive);
+extern void unplug_device(void * data);
 
 /* md needs this function to remap requests */
 extern int md_map (int minor, kdev_t *rdev, unsigned long *rsector, unsigned long size);
diff -u --recursive --new-file v1.3.94/linux/include/linux/fs.h linux/include/linux/fs.h
--- v1.3.94/linux/include/linux/fs.h	Tue Apr 23 13:57:13 1996
+++ linux/include/linux/fs.h	Wed Apr 24 16:21:40 1996
@@ -224,6 +224,7 @@
 #include <linux/nfs_fs_i.h>
 #include <linux/xia_fs_i.h>
 #include <linux/sysv_fs_i.h>
+#include <linux/affs_fs_i.h>
 #include <linux/ufs_fs_i.h>
 
 /*
@@ -312,6 +313,7 @@
 		struct nfs_inode_info nfs_i;
 		struct xiafs_inode_info xiafs_i;
 		struct sysv_inode_info sysv_i;
+		struct affs_inode_info affs_i;
 		struct ufs_inode_info ufs_i;
 		struct socket socket_i;
 		void * generic_ip;
@@ -402,6 +404,7 @@
 #include <linux/nfs_fs_sb.h>
 #include <linux/xia_fs_sb.h>
 #include <linux/sysv_fs_sb.h>
+#include <linux/affs_fs_sb.h>
 #include <linux/ufs_fs_sb.h>
 
 struct super_block {
@@ -430,6 +433,7 @@
 		struct nfs_sb_info nfs_sb;
 		struct xiafs_sb_info xiafs_sb;
 		struct sysv_sb_info sysv_sb;
+		struct affs_sb_info affs_sb;
 		struct ufs_sb_info ufs_sb;
 		void *generic_sbp;
 	} u;
diff -u --recursive --new-file v1.3.94/linux/include/linux/istallion.h linux/include/linux/istallion.h
--- v1.3.94/linux/include/linux/istallion.h	Fri Apr 19 10:08:02 1996
+++ linux/include/linux/istallion.h	Wed Apr 24 12:48:04 1996
@@ -108,6 +108,7 @@
 	int		hostoffset;
 	int		slaveoffset;
 	int		bitsize;
+	int		enabval;
 	int		panels[STL_MAXPANELS];
 	int		panelids[STL_MAXPANELS];
 	void		(*init)(struct stlibrd *brdp);
diff -u --recursive --new-file v1.3.94/linux/include/linux/net.h linux/include/linux/net.h
--- v1.3.94/linux/include/linux/net.h	Mon Mar 25 08:58:22 1996
+++ linux/include/linux/net.h	Tue Apr 23 13:10:39 1996
@@ -22,9 +22,6 @@
 #include <linux/wait.h>
 #include <linux/socket.h>
 
-
-#define NSOCKETS	2000		/* Dynamic, this is MAX LIMIT	*/
-#define NSOCKETS_UNIX	128		/* unix domain static limit	*/
 #define NPROTO		16		/* should be enough for now..	*/
 
 
diff -u --recursive --new-file v1.3.94/linux/include/linux/tty.h linux/include/linux/tty.h
--- v1.3.94/linux/include/linux/tty.h	Tue Apr 23 13:57:14 1996
+++ linux/include/linux/tty.h	Wed Apr 24 16:21:40 1996
@@ -261,7 +261,7 @@
  */
 #define TTY_THROTTLED 0
 #define TTY_IO_ERROR 1
-#define TTY_SLAVE_CLOSED 2
+#define TTY_OTHER_CLOSED 2
 #define TTY_EXCLUSIVE 3
 #define TTY_DEBUG 4
 #define TTY_DO_WRITE_WAKEUP 5
diff -u --recursive --new-file v1.3.94/linux/kernel/exit.c linux/kernel/exit.c
--- v1.3.94/linux/kernel/exit.c	Tue Apr 23 13:57:14 1996
+++ linux/kernel/exit.c	Tue Apr 23 13:54:32 1996
@@ -433,18 +433,19 @@
 	struct mm_struct * mm = current->mm;
 
 	/* Set us up to use the kernel mm state */
-	flush_cache_mm(mm);
-	flush_tlb_mm(mm);
-	init_mm.count++;
-	current->mm = &init_mm;
-	current->swappable = 0;
-	SET_PAGE_DIR(current, swapper_pg_dir);
+	if (mm != &init_mm) {
+		flush_cache_mm(mm);
+		flush_tlb_mm(mm);
+		current->mm = &init_mm;
+		current->swappable = 0;
+		SET_PAGE_DIR(current, swapper_pg_dir);
 
-	/* free the old state - not used any more */
-	if (!--mm->count) {
-		exit_mmap(mm);
-		free_page_tables(mm);
-		kfree(mm);
+		/* free the old state - not used any more */
+		if (!--mm->count) {
+			exit_mmap(mm);
+			free_page_tables(mm);
+			kfree(mm);
+		}
 	}
 }
 
diff -u --recursive --new-file v1.3.94/linux/kernel/sched.c linux/kernel/sched.c
--- v1.3.94/linux/kernel/sched.c	Tue Apr 23 13:57:14 1996
+++ linux/kernel/sched.c	Tue Apr 23 11:23:26 1996
@@ -546,40 +546,20 @@
 
 int del_timer(struct timer_list * timer)
 {
-	unsigned long flags;
-#if SLOW_BUT_DEBUGGING_TIMERS
-	struct timer_list * p;
-
-	p = &timer_head;
-	save_flags(flags);
-	cli();
-	while ((p = p->next) != &timer_head) {
-		if (p == timer) {
-			timer->next->prev = timer->prev;
-			timer->prev->next = timer->next;
+	int ret = 0;
+	if (timer->next) {
+		unsigned long flags;
+		struct timer_list * next;
+		save_flags(flags);
+		cli();
+		if ((next = timer->next) != NULL) {
+			(next->prev = timer->prev)->next = next;
 			timer->next = timer->prev = NULL;
-			restore_flags(flags);
-			return 1;
+			ret = 1;
 		}
+		restore_flags(flags);
 	}
-	if (timer->next || timer->prev)
-		printk("del_timer() called from %p with timer not initialized\n",
-			__builtin_return_address(0));
-	restore_flags(flags);
-	return 0;
-#else
-	struct timer_list * next;
-	int ret = 0;
-	save_flags(flags);
-	cli();
-	if ((next = timer->next) != NULL) {
-		(next->prev = timer->prev)->next = next;
-		timer->next = timer->prev = NULL;
-		ret = 1;
-	}
-	restore_flags(flags);
 	return ret;
-#endif
 }
 
 static inline void run_timer_list(void)
diff -u --recursive --new-file v1.3.94/linux/lib/string.c linux/lib/string.c
--- v1.3.94/linux/lib/string.c	Fri Aug 11 09:26:58 1995
+++ linux/lib/string.c	Tue Apr 23 13:24:52 1996
@@ -112,6 +112,18 @@
 }
 #endif
 
+#ifndef __HAVE_ARCH_STRRCHR
+char * strrchr(const char * s, int c)
+{
+       const char *p = s + strlen(s);
+       do {
+           if (*p == (char)c)
+               return (char *)p;
+       } while (--p >= s);
+       return NULL;
+}
+#endif
+
 #ifndef __HAVE_ARCH_STRLEN
 size_t strlen(const char * s)
 {
diff -u --recursive --new-file v1.3.94/linux/mm/filemap.c linux/mm/filemap.c
--- v1.3.94/linux/mm/filemap.c	Tue Apr 23 13:57:14 1996
+++ linux/mm/filemap.c	Wed Apr 24 15:01:47 1996
@@ -686,8 +686,11 @@
 		 */
 read_page:
 		error = inode->i_op->readpage(inode, page);
-		if (!error)
-			goto found_page;
+		if (!error) {
+			if (!PageError(page))
+				goto found_page;
+			error = -EIO;
+		}
 		free_page(addr);
 		break;
 	}
diff -u --recursive --new-file v1.3.94/linux/net/ipv4/ip_output.c linux/net/ipv4/ip_output.c
--- v1.3.94/linux/net/ipv4/ip_output.c	Sun Apr 21 19:22:17 1996
+++ linux/net/ipv4/ip_output.c	Wed Apr 24 13:00:04 1996
@@ -642,9 +642,10 @@
 	 *	choice RAW frames within 20 bytes of maximum size(rare) to the long path
 	 */
 
-	length += sizeof(struct iphdr);
-	if (!sk->ip_hdrincl && opt) 
-		length += opt->optlen;
+	if (!sk->ip_hdrincl) {
+		length += sizeof(struct iphdr);
+		if(opt) length += opt->optlen;
+	}
 
 	if(length <= dev->mtu && !MULTICAST(daddr) && daddr!=0xFFFFFFFF && daddr!=dev->pa_brdaddr)
 	{	
@@ -708,7 +709,7 @@
 			getfrag(frag,saddr,((char *)iph)+iph->ihl*4,0, length-iph->ihl*4);
 		}
 		else
-			getfrag(frag,saddr,(void *)iph,0,length-20);
+			getfrag(frag,saddr,(void *)iph,0,length);
 		dev_unlock_list();
 #ifdef CONFIG_FIREWALL
 		if(call_out_firewall(PF_INET, skb->dev, iph)< FW_ACCEPT)
