## Automatically generated incremental diff
## From:   linux-2.2.11-pre2
## To:     linux-2.2.11
## Robot:  $Id: make-incremental-diff,v 1.5 2001/12/01 08:32:36 hpa Exp $

diff -urN linux-2.2.11-pre2/CREDITS linux/CREDITS
--- linux-2.2.11-pre2/CREDITS	Mon Dec  3 18:51:50 2001
+++ linux/CREDITS	Mon Dec  3 18:52:17 2001
@@ -2211,6 +2211,7 @@
 E: R.E.Wolff@BitWizard.nl
 D: Written kmalloc/kfree
 D: Written Specialix IO8+ driver
+D: Written Specialix SX driver
 S: van Bronckhorststraat 12
 S: 2612 XV Delft
 S: The Netherlands
diff -urN linux-2.2.11-pre2/Documentation/Changes linux/Documentation/Changes
--- linux-2.2.11-pre2/Documentation/Changes	Mon Dec  3 18:51:50 2001
+++ linux/Documentation/Changes	Mon Dec  3 18:52:17 2001
@@ -701,8 +701,8 @@
 SMBfs
 =====
 
-The 2.0.4b release of Samba:
-ftp://ftp.samba.org/pub/samba/samba-2.0.4b.tar.gz
+The 2.0.5a release of Samba:
+ftp://ftp.samba.org/pub/samba/samba-2.0.5a.tar.gz
 
 Pcmcia-cs
 =========
diff -urN linux-2.2.11-pre2/Documentation/Configure.help linux/Documentation/Configure.help
--- linux-2.2.11-pre2/Documentation/Configure.help	Mon Dec  3 18:51:50 2001
+++ linux/Documentation/Configure.help	Mon Dec  3 18:52:17 2001
@@ -4037,7 +4037,13 @@
   MB/s with wide FAST-40 LVD devices and controllers.
 
   Recent versions of the 53C8XX chips are better supported by the
-  option "SYM53C8XX SCSI support", below.
+  option "SYM53C8XX SCSI support", below. This option will configure 
+  a different driver.
+
+  If you want the kernel to select the recommended driver for each of 
+  of your NCR/SYM53C8XX controllers you may just configure both the 
+  NCR53C8XX and the SYM53C8XX options to Y, or if modules are preferred, 
+  load first the sym53c8xx.o module and then the ncr53c8xx.o module.
 
   Note: there is yet another driver for the 53c8xx family of controllers
   ("NCR53c7,8xx SCSI support" above). If you want to use them both,
diff -urN linux-2.2.11-pre2/Documentation/mkdev.ida linux/Documentation/mkdev.ida
--- linux-2.2.11-pre2/Documentation/mkdev.ida	Wed Dec 31 16:00:00 1969
+++ linux/Documentation/mkdev.ida	Mon Dec  3 18:52:17 2001
@@ -0,0 +1,40 @@
+#!/bin/sh
+# Script to create device nodes for SMART array controllers
+# Usage:
+#	mkdev.ida [num controllers] [num log volumes] [num partitions]
+#
+# With no arguments, the script assumes 1 controller, 16 logical volumes,
+# and 16 partitions/volume, which is adequate for most configurations.
+#
+# If you had 5 controllers and were planning on no more than 4 logical volumes
+# each, using a maximum of 8 partitions per volume, you could say:
+#
+# mkdev.ida 5 4 8
+#
+# Of course, this has no real benefit over "mkdev.ida 5" except that it
+# doesn't create so many device nodes in /dev/ida.
+
+NR_CTLR=${1-1}
+NR_VOL=${2-16}
+NR_PART=${3-16}
+
+if [ ! -d /dev/ida ]; then
+	mkdir -p /dev/ida
+fi
+
+C=0; while [ $C -lt $NR_CTLR ]; do
+	MAJ=`expr $C + 72`
+	D=0; while [ $D -lt $NR_VOL ]; do
+		P=0; while [ $P -lt $NR_PART ]; do
+			MIN=`expr $D \* 16 + $P`
+			if [ $P -eq 0 ]; then
+				mknod /dev/ida/c${C}d${D} b $MAJ $MIN
+			else
+				mknod /dev/ida/c${C}d${D}p${P} b $MAJ $MIN
+			fi
+			P=`expr $P + 1`
+		done
+		D=`expr $D + 1`
+	done
+	C=`expr $C + 1`
+done
diff -urN linux-2.2.11-pre2/Documentation/networking/README.sb1000 linux/Documentation/networking/README.sb1000
--- linux-2.2.11-pre2/Documentation/networking/README.sb1000	Wed Dec 31 16:00:00 1969
+++ linux/Documentation/networking/README.sb1000	Mon Dec  3 18:52:17 2001
@@ -0,0 +1,133 @@
+This is the new release of a module network device driver for General
+Instruments (also known as NextLevel) SB1000 cable modem board (also
+called internal SURFboard).
+I have tested and I am running this module on kernel 2.0.33.
+Steven N. Hirsch <shirsch@adelphia.net> gave me a diff patch
+(sb1000-1.1.2_127.patch to be applied with 'patch -p') that allows
+you to compile and run the driver with kernel versions 2.1.x.
+Thanks very much Steve!
+
+Here you'll the following files:
+
+- README
+- Makefile
+- sb1000.c      the actual device driver
+- cmconfig.c    an ifconfig-like program to correctly set the SB1000
+- cmping.c      a ping-like program to test your connection
+- ftptest.c     a small program to test your connection speed with FTP
+                (requires ftplib version >= 3.0)
+
+The directory ppp/ contains the files I am using to connect to MediaOne
+here in Jacksonville, to show how you can use the driver and the cmconfig
+program.
+
+Clemmitt Sigler wrote a very good and useful web page and installation
+script (for Adelphia PowerLink users but easy to port to other ISPs)
+about this SB1000 driver for Linux.
+You can find it here:
+     http://home.adelphia.net/~siglercm/sb1000.html
+Thanks very much Clemmitt!
+
+To install and run it:
+- cd sb1000-1.1.2
+- make
+- make install
+- configure the SB1000 card using the isapnp tools setting the correct
+  I/O's and IRQ. You can find more info about the isapnp tools at:
+     http://www.roestock.demon.co.uk/isapnptools/
+  (once you're happy with it, you may want to set the configuration
+   at boot time in one of the /etc/init.d/ scripts)
+  IMPORTANT NOTICE: after configuring isapnp, please look in the file
+  /etc/isapnp.conf for the line beginning with:
+     (READPORT
+  if it says: '(READPORT 0x0203)' (which should be the default), then
+  go to the next step. If instead it says something like:
+  '(READPORT 0x020b)' or '(READPORT 0x<another number>)', then please
+  follow the instructions at the end of this README file before going
+  to the next step.
+- install the PPP configuration files in the /etc/ppp directory; you
+  definitely have to change the file ppp@gi-on (the start up file),
+  setting the correct login name, the phone number for the PPP connection
+  and the frequency (k stands for kHz, M for MHz) for the cablemodem.
+  You'll also have to change the last line in the pap-secrets file
+  writing your login and password there (read the whole file for more
+  site specific configurations).
+  You may have to change the firewall file to suit your needs (IPs and
+  ports allowed to connect).
+- start the PPP connection with ppp@gi-on and see what happens; you may
+  want to set 'pppd' (the last command in the ppp@gi-on file) to debug
+  mode adding 'debug' at the end of the command ('pppd' prints its info in
+  the file /var/log/messages and/or /var/log/ppp.log). To make sure 'chat'
+  s not having problems you may want to add a '-v' (verbose) after the 'chat'
+  command in 'ppp-on-dialer' and check the results in /var/log/messages)
+- if everything is working fine you should see after a few seconds a message
+  likes this:
+            cm0: sb1000 at (0x120,0x310), csn 1, S/N 0x2a0d16d8, IRQ 9. 
+            sb1000.c:v1.1.2 6/01/98 (fventuri@mediaone.net) 
+  and ifconfig -a should show you two new interfaces: ppp0 and cm0.
+  Typing 'cmconfig cm0' will show you more info about the cablemodem interface.
+- please let me know if you see any other message coming from 'cm0' in
+  your '/var/log/messages' or '/var/log/debug' file, to help me debug the
+  code
+- also let me know if you have any problem; if everything works (hopefully),
+  let me know which speed you can reach downloading the 5Mb test file using
+  this driver.
+- if everything seems to work fine but your computer locks up after a while
+  (and typically during a lengthy download through the cablemodem), you may
+  need to add a short delay in the driver to 'slow down' the SURFboard
+  because your PC might not be able to keep up with the transfer rate of
+  the SB1000. To do this, edit the 'Makefile' and look for the 'SB1000_DELAY'
+  define: uncomment those 'CFLAGS' lines (and comment the default ones)
+  and try setting the delay to something like 60 microseconds with:
+  '-DSB1000_DELAY=60'; if it still doesn't work or you like playing with
+  the driver, you may try other numbers: remember though that the higher
+  the delay, the slower the driver (which slows down the rest of the PC
+  too when it is actively used). Thanks to Ed Daiga for this tip!
+
+This release has a few things fixed and a better handling of the frame errors.
+
+I also have slightly modified the 'cablemodem' script in the 'ppp' so
+you may interested in having a look at it: I basically have added filtering
+out broadcast messages (you shouldn't get them with a point-to-point
+interface and so far the ones I have received were from hosts trying to
+attack my system) and lower debug levels for the driver to avoid seeing
+the 'frame error' messages (so far noone has noticed any problem with the
+driver even with those messages).
+
+For questions, infos, etc, feel free to email me at:
+		fventuri@mediaone.net
+
+Good luck,
+Franco Venturi
+
+Thanks to Edge for his useful comments and to Steven N. Hirsch
+for his patch to run the driver with 2.1.x kernels.
+Thanks also to Ed Daiga for his help in finding that adding a delay
+in the driver fixes some lock up problems with some slow PCs.
+Many thanks to Clemmitt Sigler for his (much needed) web page about the
+SB1000 driver for Linux.
+An interesting URL for Linux + MediaOne (although with an external modem)
+is: http://rlz.ne.mediaone.net/linux/home.shtml
+Today, Sep 22 1998, I finished writing a short utility (ftptest.c) to
+'measure' your cablemodem speed connection in Linux, downloading to
+memory the same file several times. To compile it you need ftplib, version
+3 or above. To run it, type:
+  ftptest URL n
+where URL is in the form: ftp://ftp.site.local.isp/pub/testfile
+and n is the number of simultaneous FTP connections that you want to run
+
+---------------------------------------------------------------------------
+IMPORTANT NOTICE: if in your file /etc/isapnp.conf, you found something
+like '(READPORT 0x020b)' or '(READPORT 0x<another number>)', (anything
+different from the default 0x0203), you have to change the READ_DATA_PORT
+parameter in the sb1000.c file as follows.
+  - edit the sb1000.c file, look for:
+       READ_DATA_PORT
+    (it should be around line 127 in version 1.1.2)
+  - change the value of READ_DATA_PORT to the same value found in
+    /etc/isapnp.conf; for instance, if you found a: '(READPORT 0x020b)',
+    then in sb1000.c you should have:
+          static const int READ_DATA_PORT = 0x20b; 
+  - save sb1000.c
+  - compile and install again the driver
+    (i.e. do a 'make' and a 'make install').
diff -urN linux-2.2.11-pre2/Documentation/networking/soundmodem.txt linux/Documentation/networking/soundmodem.txt
--- linux-2.2.11-pre2/Documentation/networking/soundmodem.txt	Wed May 20 18:54:34 1998
+++ linux/Documentation/networking/soundmodem.txt	Mon Dec  3 18:52:17 2001
@@ -42,8 +42,8 @@
 /etc/conf.modules).
 
 Examples:
-  insmod soundmodem hw=0 mode=0 iobase=0x220 irq=5 dma=1
-  sethdlc -i sm0 -p hw sbc type afsk1200 io 0x220 irq 5 dma 1
+  insmod soundmodem mode="sbc:afsk1200" iobase=0x220 irq=5 dma=1
+  sethdlc -i sm0 -p mode "sbc:afsk1200" io 0x220 irq 5 dma 1
 
 Both lines configure the first port to drive a soundblaster card
 in 1200 baud AFSK mode.
diff -urN linux-2.2.11-pre2/Documentation/networking/wavelan.txt linux/Documentation/networking/wavelan.txt
--- linux-2.2.11-pre2/Documentation/networking/wavelan.txt	Fri Aug 28 10:45:29 1998
+++ linux/Documentation/networking/wavelan.txt	Mon Dec  3 18:52:17 2001
@@ -1,7 +1,11 @@
 Sun Jul  2 01:38:33 EST 1995
 
-See also: http://www-uk.hpl.hp.com/people/jt/Linux/Wavelan.html
+	As the date above certify, this ``readme'' is mostly
+obsolete. Please read release notes and change list in
+driver/net/wavelan.p.h, and consult my web page at :
+	http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Wavelan.html
 
+	Jean <jt@hpl.hp.com>
 
 1. At present the driver autoprobes for a WaveLAN card only at I/O address 
    0x390. The version of the card that I use (NCR) supports four I/O addresses
diff -urN linux-2.2.11-pre2/Documentation/powerpc/sound.txt linux/Documentation/powerpc/sound.txt
--- linux-2.2.11-pre2/Documentation/powerpc/sound.txt	Sat Oct 10 09:53:24 1998
+++ linux/Documentation/powerpc/sound.txt	Mon Dec  3 18:52:17 2001
@@ -4,7 +4,7 @@
 Please mail me (Cort Dougan, cort@cs.nmt.edu) if you have questions,
 comments or corrections.
 
-Last Change: 3.24.98
+Last Change: 6.16.99
 
 This just covers sound on the PReP and CHRP systems for now and later
 will contain information on the PowerMac's.
@@ -51,7 +51,7 @@
 
   Midi is not supported since the cs4232 driver doesn't support midi yet.
 
-2. IBM PowerPersonal PReP machines and IBM LongTrail CHRP
+2. IBM PowerPersonal PReP machines
 
   I've only tested sound on the Power Personal Series of IBM workstations
   so if you try it on others please let me know the result.  I'm especially
@@ -74,3 +74,8 @@
   This setup does _NOT_ allow for recording yet.
 
   Midi is not supported since the cs4232 driver doesn't support midi yet.
+
+2. IBM CHRP
+
+  I have only tested this on the 43P-150.  Build the kernel with the cs4232
+  set as a module and load the module with irq=9 dma=1 dma2=2 io=0x550
diff -urN linux-2.2.11-pre2/Documentation/sound/AWE32 linux/Documentation/sound/AWE32
--- linux-2.2.11-pre2/Documentation/sound/AWE32	Thu Apr 29 11:53:41 1999
+++ linux/Documentation/sound/AWE32	Mon Dec  3 18:52:17 2001
@@ -85,7 +85,6 @@
 
 7) Edit /etc/conf.modules, inserting at the end of the file:
 
-alias sound sb
 alias midi awe_wave
 post-install awe_wave /usr/bin/sfxload /usr/synthfm.sbk
 options sb io=0x220 irq=5 dma=1 dma16=5 mpu_io=0x330
diff -urN linux-2.2.11-pre2/Documentation/sound/Introduction linux/Documentation/sound/Introduction
--- linux-2.2.11-pre2/Documentation/sound/Introduction	Mon Dec  3 18:51:50 2001
+++ linux/Documentation/sound/Introduction	Mon Dec  3 18:52:17 2001
@@ -239,7 +239,7 @@
 
 1.  Copy the sound modules to a new name.  For example
     sb.o could be copied (or symlinked) to sb1.o for the
-    second SoundBlasster.
+    second SoundBlaster.
 
 2.  Make a second entry in /etc/conf.modules, for example,
     sound1 or sb1.  This second entry should refer to the
diff -urN linux-2.2.11-pre2/Documentation/sx.txt linux/Documentation/sx.txt
--- linux-2.2.11-pre2/Documentation/sx.txt	Wed Dec 31 16:00:00 1969
+++ linux/Documentation/sx.txt	Mon Dec  3 18:52:17 2001
@@ -0,0 +1,289 @@
+
+      sx.txt  -- specialix SX/SI multiport serial driver readme.
+
+
+
+      Copyright (C) 1997  Roger Wolff (R.E.Wolff@BitWizard.nl)
+
+      Specialix pays for the development and support of this driver.
+      Please DO contact support@specialix.co.uk if you require
+      support.
+
+      This driver was developed in the BitWizard linux device
+      driver service. If you require a linux device driver for your
+      product, please contact devices@BitWizard.nl for a quote.
+
+      (History)
+      There used to be an SI driver by Simon Allan. This is a complete 
+      rewrite  from scratch. Just a few lines-of-code have been snatched.
+
+      (Sources)
+      Specialix document number 6210028: SX Host Card and Download Code
+      Software Functional Specification.
+
+      (Copying)
+      This program is free software; you can redistribute it and/or
+      modify it under the terms of the GNU General Public License as
+      published by the Free Software Foundation; either version 2 of
+      the License, or (at your option) any later version.
+
+      This program is distributed in the hope that it will be
+      useful, but WITHOUT ANY WARRANTY; without even the implied
+      warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+      PURPOSE.  See the GNU General Public License for more details.
+
+      You should have received a copy of the GNU General Public
+      License along with this program; if not, write to the Free
+      Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
+      USA.
+      
+      (Addendum)
+      I'd appreciate it that if you have fixes, that you send them
+      to me first. 
+
+
+Introduction
+============
+
+This file contains some random information, that I like to have online
+instead of in a manual that can get lost. Ever misplace your Linux
+kernel sources?  And the manual of one of the boards in your computer?
+
+
+Theory of operation
+===================
+
+An important thing to know is that the driver itself doesn't have the
+firmware for the card. This means that you need the separate package
+"sx_firmware". For now you can get the source at
+
+	ftp://ftp.bitwizard.nl/specialix/sx_firmware_<version>.tgz
+
+The firmware load needs a "misc" device, so you'll need to enable the
+"Support for user misc device modules" in your kernel configuration.
+The misc device needs to be called "/dev/specialix_sxctl". It needs
+misc major 10, and minor number 167 (assigned by HPA). The section
+on creating device files below also creates this device. 
+
+After loading the sx.o module into your kernel, the driver will report
+the number of cards detected, but because it doesn't have any
+firmware, it will not be able to determine the number of ports. Only
+when you then run "sx_firmware" will the firmware be downloaded and
+the rest of the driver initialized. At that time the sx_firmware
+program will report the number of ports installed.
+
+In contrast with many other multi port serial cards, some of the data
+structures are only allocated when the card knows the number of ports
+that are connected. This means we won't waste memory for 120 port
+descriptor structures when you only have 8 ports. If you experience
+problems due to this, please report them: I haven't seen any.
+
+
+Interrupts
+==========
+
+A multi port serial card, would generate a horrendous amount of
+interrupts if it would interrupt the CPU for every received
+character. Even more than 10 years ago, the trick not to use
+interrupts but to poll the serial cards was invented.
+
+The SX card allow us to do this two ways. First the card limits its
+own interrupt rate to a rate that won't overwhelm the CPU. Secondly,
+we could forget about the cards interrupt completely and use the
+internal timer for this purpose.
+
+Polling the card can take up to a few percent of your CPU. Using the
+interrupts would be better if you have most of the ports idle. Using
+timer-based polling is better if your card almost always has work to
+do. You save the separate interrupt in that case.
+
+In any case, it doesn't really matter all that much. 
+
+The most common problem with interrupts is that for ISA cards in a PCI
+system the BIOS has to be told to configure that interrupt as "legacy
+ISA". Otherwise the card can pull on the interrupt line all it wants
+but the CPU won't see this.
+
+If you can't get the interrupt to work, remember that polling mode is
+more efficient (provided you actually use the card intensively).
+
+
+Allowed Configurations
+======================
+
+Some configurations are disallowed. Even though at a glance they might
+seem to work, they are known to lockup the bus between the host card
+and the device concentrators. You should respect the drivers decision
+not to support certain configurations. It's there for a reason.
+
+Warning: Seriously technical stuff ahead. Executive summary: Don't use
+SX cards except configured at a 64k boundary. Skip the next paragraph.
+
+The SX cards can theoretically be placed at a 32k boundary. So for
+instance you can put an SX card at 0xc8000-0xd7fff. This is not a
+"recommended configuration". ISA cards have to tell the bus controller
+how they like their timing. Due to timing issues they have to do this
+based on which 64k window the address falls into. This means that the
+32k window below and above the SX card have to use exactly the same
+timing as the SX card. That reportedly works for other SX cards. But
+you're still left with two useless 32k windows that should not be used
+by anybody else.
+
+
+Configuring the driver
+======================
+
+PCI cards are always detected. The driver auto-probes for ISA cards at
+some sensible addresses. Please report if the auto-probe causes trouble
+in your system, or when a card isn't detected.
+
+I'm afraid I haven't implemented "kernel command line parameters" yet.
+This means that if the default doesn't work for you, you shouldn't use
+the compiled-into-the-kernel version of the driver. Use a module
+instead.  If you convince me that you need this, I'll make it for
+you. Deal?
+
+I'm afraid that the module parameters are a bit clumsy. If you have a
+better idea, please tell me.
+
+You can specify several parameters:
+
+	sx_poll: number of jiffies between timer-based polls.
+
+		Set this to "0" to disable timer based polls. 
+                Initialization of cards without a working interrupt
+                will fail.
+
+		Set this to "1" if you want a polling driver. 
+		(on Intel: 100 polls per second). If you don't use
+                fast baud rates, you might consider a value like "5". 
+                (If you don't know how to do the math, use 1).
+
+	sx_slowpoll: Number of jiffies between timer-based polls. 
+ 		Set this to "100" to poll once a second. 
+		This should get the card out of a stall if the driver
+                ever misses an interrupt. I've never seen this happen,
+                and if it does, that's a bug. Tell me. 
+
+	sx_maxints: Number of interrupts to request from the card. 
+		The card normally limits interrupts to about 100 per
+		second to offload the host CPU. You can increase this
+		number to reduce latency on the card a little.
+		Note that if you give a very high number you can overload
+		your CPU as well as the CPU on the host card. This setting 
+		is inaccurate and not recommended for SI cards (But it 
+		works). 
+
+	sx_irqmask: The mask of allowable IRQs to use. I suggest you set 
+                this to 0 (disable IRQs all together) and use polling if 
+		the assignment of IRQs becomes problematic.
+
+	sx_debug: You can enable different sorts of debug traces with this. 
+		At "-1" all debugging traces are active. You'll get several
+		times more debugging output than you'll get characters 
+		transmitted. 
+
+
+Baud rates
+==========
+
+Theoretically new SXDCs should be capable of more than 460k
+baud. However the line drivers usually give up before that.  Also the
+CPU on the card may not be able to handle 8 channels going at full
+blast at that speed. Moreover, the buffers are not large enough to
+allow operation with 100 interrupts per second. You'll have to realize
+that the card has a 256 byte buffer, so you'll have to increase the
+number of interrupts per second if you have more than 256*100 bytes
+per second to transmit.  If you do any performance testing in this
+area, I'd be glad to hear from you...
+
+(Psst Linux users..... I think the Linux driver is more efficient than
+the driver for other OSes. If you can and want to benchmark them
+against each other, be my guest, and report your findings...... :-)
+
+
+Ports and devices
+=================
+
+Port 0 is the top connector on the module closest to the host
+card. Oh, the ports on the SXDCs and TAs are labelled from 1 to 8
+instead of from 0 to 7, as they are numbered by linux. I'm stubborn in
+this: I know for sure that I wouldn't be able to calculate which port
+is which anymore if I would change that....
+
+
+Devices:
+
+You should make the device files as follows:
+
+#!/bin/sh
+# (I recommend that you cut-and-paste this into a file and run that)
+cd /dev
+t=0
+mknod specialix_sxctl c 10 167
+while [ $t -lt 64 ]
+  do 
+  echo -n "$t "
+  mknod ttyX$t c 32 $t
+  mknod cux$t  c 33 $t
+  t=`expr $t + 1`
+done
+echo ""
+rm /etc/psdevtab
+ps > /dev/null
+
+
+This creates 64 devices. If you have more, increase the constant on
+the line with "while". The devices start at 0, as is customary on
+Linux. Specialix seems to like starting the numbering at 1. 
+
+If your system doesn't come with these devices pre-installed, bug your
+linux-vendor about this. They should have these devices
+"pre-installed" before the new millennium. The "ps" stuff at the end
+is to "tell" ps that the new devices exist.
+
+Officially the maximum number of cards per computer is 4. This driver
+however supports as many cards in one machine as you want. You'll run
+out of interrupts after a few, but you can switch to polled operation
+then. At about 256 ports (More than 8 cards), we run out of minor
+device numbers. Sorry. I suggest you buy a second computer.... (Or
+switch to RIO).
+
+------------------------------------------------------------------------
+
+
+  Fixed bugs and restrictions:
+	- Hangup processing.  
+	  -- Done.
+
+	- the write path in generic_serial (lockup / oops). 
+	  -- Done (Ugly: not the way I want it. Copied from serial.c).
+
+        - write buffer isn't flushed at close.
+	  -- Done. I still seem to loose a few chars at close. 
+	     Sorry. I think that this is a firmware issue. (-> Specialix)
+
+	- drain hardware before  changing termios
+	- Change debug on the fly. 
+	- ISA free irq -1. (no firmware loaded).
+	- adding c8000 as a probe address. Added warning. 
+	- Add a RAMtest for the RAM on the card.c
+        - Crash when opening a port "way" of the number of allowed ports. 
+          (for example opening port 60 when there are only 24 ports attached)
+	- Sometimes the use-count strays a bit. After a few hours of
+          testing the use count is sometimes "3". If you are not like
+          me and can remember what you did to get it that way, I'd
+          appreciate an Email. Possibly fixed. Tell me if anyone still
+          sees this.
+	- TAs don't work right if you don't connect all the modem control
+	  signals. SXDCs do. T225 firmware problem -> Specialix. 
+	  (Mostly fixed now, I think. Tell me if you encounter this!)
+
+  Bugs & restrictions:
+
+	- Arbitrary baud rates. Requires firmware update. (-> Specialix)
+
+	- Low latency (mostly firmware, -> Specialix)
+
+
+
diff -urN linux-2.2.11-pre2/MAINTAINERS linux/MAINTAINERS
--- linux-2.2.11-pre2/MAINTAINERS	Mon Dec  3 18:51:52 2001
+++ linux/MAINTAINERS	Mon Dec  3 18:52:17 2001
@@ -847,7 +847,8 @@
 
 WAVELAN NETWORK DRIVER & WIRELESS EXTENSIONS
 P:	Jean Tourrilhes
-M:	jt@hplb.hpl.hp.com
+M:	jt@hpl.hp.com
+W:	http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/
 S:	Maintained
 
 WD7000 SCSI DRIVER
diff -urN linux-2.2.11-pre2/arch/alpha/Makefile linux/arch/alpha/Makefile
--- linux-2.2.11-pre2/arch/alpha/Makefile	Sun Jan 24 21:29:52 1999
+++ linux/arch/alpha/Makefile	Mon Dec  3 18:52:21 2001
@@ -116,9 +116,11 @@
 	@$(MAKEBOOT) clean
 
 archmrproper:
+	-$(MAKE) -C arch/alpha/math-emu cleansymlinks
 
 archdep:
 	@$(MAKEBOOT) dep
+	-$(MAKE) -C arch/alpha/math-emu symlinks
 
 bootpfile:
 	@$(MAKEBOOT) bootpfile
diff -urN linux-2.2.11-pre2/arch/alpha/kernel/core_cia.c linux/arch/alpha/kernel/core_cia.c
--- linux-2.2.11-pre2/arch/alpha/kernel/core_cia.c	Mon Dec  3 18:51:52 2001
+++ linux/arch/alpha/kernel/core_cia.c	Mon Dec  3 18:52:21 2001
@@ -31,30 +31,13 @@
  */
 
 /*
- * Machine check reasons.  Defined according to PALcode sources
- * (osf.h and platform.h).
- */
-#define MCHK_K_TPERR		0x0080
-#define MCHK_K_TCPERR		0x0082
-#define MCHK_K_HERR		0x0084
-#define MCHK_K_ECC_C		0x0086
-#define MCHK_K_ECC_NC		0x0088
-#define MCHK_K_OS_BUGCHECK	0x008A
-#define MCHK_K_PAL_BUGCHECK	0x0090
-
-/*
  * BIOS32-style PCI interface:
  */
 
-#define DEBUG_MCHECK 0
+#define DEBUG_MCHECK 0	/* 0 = minimal, 1 = debug, 2 = dump */
+
 #define DEBUG_CONFIG 0
-/* #define DEBUG_DUMP_REGS */
 
-#if DEBUG_MCHECK
-# define DBGM(args)	printk args
-#else
-# define DBGM(args)
-#endif
 #if DEBUG_CONFIG
 # define DBGC(args)	printk args
 #else
@@ -533,17 +516,25 @@
 	case 0:
 		/*
 		 * Set up the PCI->physical memory translation windows.
-		 * For now, windows 1,2 and 3 are disabled.  In the future,
+		 * For now, windows 2 and 3 are disabled.  In the future,
 		 * we may want to use them to do scatter/gather DMA. 
+		 *
+		 * Window 0 goes at 1 GB and is 1 GB large.
+		 * Window 1 goes at 2 GB and is 1 GB large.
 		 */
+		*(vuip)CIA_IOC_PCI_W0_BASE = CIA_DMA_WIN0_BASE_DEFAULT | 1U;
+		*(vuip)CIA_IOC_PCI_W0_MASK = (CIA_DMA_WIN0_SIZE_DEFAULT - 1) &
+						0xfff00000U;
+		*(vuip)CIA_IOC_PCI_T0_BASE = CIA_DMA_WIN0_TRAN_DEFAULT >> 2;
+
+		*(vuip)CIA_IOC_PCI_W1_BASE = CIA_DMA_WIN1_BASE_DEFAULT | 1U;
+		*(vuip)CIA_IOC_PCI_W1_MASK = (CIA_DMA_WIN1_SIZE_DEFAULT - 1) &
+						0xfff00000U;
+		*(vuip)CIA_IOC_PCI_T1_BASE = CIA_DMA_WIN1_TRAN_DEFAULT >> 2;
 
-		*(vuip)CIA_IOC_PCI_W0_BASE = 1U | (CIA_DMA_WIN_BASE_DEFAULT & 0xfff00000U);
-		*(vuip)CIA_IOC_PCI_W0_MASK = (CIA_DMA_WIN_SIZE_DEFAULT - 1) & 0xfff00000U;
-		*(vuip)CIA_IOC_PCI_T0_BASE = 0;
-
-		*(vuip)CIA_IOC_PCI_W1_BASE = 0x0;
 		*(vuip)CIA_IOC_PCI_W2_BASE = 0x0;
 		*(vuip)CIA_IOC_PCI_W3_BASE = 0x0;
+		mb();
 		break;
 	}
 
@@ -591,16 +582,6 @@
         }
 }
 
-static int
-cia_pci_clr_err(void)
-{
-	CIA_jd = *(vuip)CIA_IOC_CIA_ERR;
-	DBGM(("CIA_pci_clr_err: CIA ERR after read 0x%x\n", CIA_jd));
-	*(vuip)CIA_IOC_CIA_ERR = CIA_jd;
-	mb();
-	return 0;
-}
-
 void
 cia_machine_check(unsigned long vector, unsigned long la_ptr,
 		  struct pt_regs * regs)
@@ -608,10 +589,6 @@
 	struct el_common *mchk_header;
 	struct el_CIA_procdata *mchk_procdata;
 	struct el_CIA_sysdata_mcheck *mchk_sysdata;
-	unsigned long * ptr;
-	const char * reason;
-	char buf[128];
-	long i;
 
 	mchk_header = (struct el_common *)la_ptr;
 
@@ -621,98 +598,22 @@
 	mchk_sysdata = (struct el_CIA_sysdata_mcheck *)
 		(la_ptr + mchk_header->sys_offset);
 
-	DBGM(("cia_machine_check: vector=0x%lx la_ptr=0x%lx\n",
-	      vector, la_ptr));
-	DBGM(("                     pc=0x%lx size=0x%x procoffset=0x%x "
-	      "sysoffset 0x%x\n", regs->pc, mchk_header->size,
-	      mchk_header->proc_offset, mchk_header->sys_offset));
-	DBGM(("cia_machine_check: expected %d DCSR 0x%lx PEAR 0x%lx\n",
-	      CIA_mcheck_expected, mchk_sysdata->epic_dcsr,
-	      mchk_sysdata->epic_pear));
-
-#if DEBUG_MCHECK
-	{
-		unsigned long *ptr;
-		int i;
-
-		ptr = (unsigned long *)la_ptr;
-		for (i = 0; i < mchk_header->size / sizeof(long); i += 2) {
-			printk(" +%lx %lx %lx\n", i*sizeof(long),
-			       ptr[i], ptr[i+1]);
-		}
-	}
-#endif
-
-	/*
-	 * Check if machine check is due to a badaddr() and if so,
-	 * ignore the machine check.
-	 */
+	/* Clear the error before any reporting. */
 	mb();
 	mb();  /* magic */
-	if (CIA_mcheck_expected) {
-		DBGM(("CIA machine check expected\n"));
-		CIA_mcheck_expected = 0;
-		CIA_mcheck_taken = 1;
-		mb();
-		mb();  /* magic */
-		draina();
-		cia_pci_clr_err();
-		wrmces(0x7);
-		mb();
-		return;
-	}
+	draina();
 
-	switch ((unsigned int) mchk_header->code) {
-	case MCHK_K_TPERR:	reason = "tag parity error"; break;
-	case MCHK_K_TCPERR:	reason = "tag control parity error"; break;
-	case MCHK_K_HERR:	reason = "generic hard error"; break;
-	case MCHK_K_ECC_C:	reason = "correctable ECC error"; break;
-	case MCHK_K_ECC_NC:	reason = "uncorrectable ECC error"; break;
-	case MCHK_K_OS_BUGCHECK:	reason = "OS-specific PAL bugcheck"; break;
-	case MCHK_K_PAL_BUGCHECK:	reason = "callsys in kernel mode"; break;
-	case 0x96: reason = "i-cache read retryable error"; break;
-	case 0x98: reason = "processor detected hard error"; break;
-
-		/* System specific (these are for Alcor, at least): */
-	case 0x203: reason = "system detected uncorrectable ECC error"; break;
-	case 0x205: reason = "parity error detected by CIA"; break;
-	case 0x207: reason = "non-existent memory error"; break;
-	case 0x209: reason = "PCI SERR detected"; break;
-	case 0x20b: reason = "PCI data parity error detected"; break;
-	case 0x20d: reason = "PCI address parity error detected"; break;
-	case 0x20f: reason = "PCI master abort error"; break;
-	case 0x211: reason = "PCI target abort error"; break;
-	case 0x213: reason = "scatter/gather PTE invalid error"; break;
-	case 0x215: reason = "flash ROM write error"; break;
-	case 0x217: reason = "IOA timeout detected"; break;
-	case 0x219: reason = "IOCHK#, EISA add-in board parity or other catastrophic error"; break;
-	case 0x21b: reason = "EISA fail-safe timer timeout"; break;
-	case 0x21d: reason = "EISA bus time-out"; break;
-	case 0x21f: reason = "EISA software generated NMI"; break;
-	case 0x221: reason = "unexpected ev5 IRQ[3] interrupt"; break;
-	default:
-		sprintf(buf, "reason for machine-check unknown (0x%x)",
-			(unsigned int) mchk_header->code);
-		reason = buf;
-		break;
-	}
+	CIA_jd = *(vuip)CIA_IOC_CIA_ERR;
+	*(vuip)CIA_IOC_CIA_ERR = CIA_jd;
 	mb();
-	mb();  /* magic */
-	draina();
-	cia_pci_clr_err();
+	CIA_jd = *(vuip)CIA_IOC_CIA_ERR; /* re-read to force write */
+
 	wrmces(rdmces());	/* reset machine check pending flag */
 	mb();
 
-	printk(KERN_CRIT "CIA machine check: %s%s\n",
-	       reason, mchk_header->retry ? " (retryable)" : "");
-	printk(KERN_CRIT "   vector=0x%lx la_ptr=0x%lx pc=0x%lx\n",
-	       vector, la_ptr, regs->pc);
-
-	/* Dump the logout area to give all info.  */
-
-	ptr = (unsigned long *)la_ptr;
-	for (i = 0; i < mchk_header->size / sizeof(long); i += 2) {
-		printk(KERN_CRIT "   +%8lx %016lx %016lx\n",
-		       i*sizeof(long), ptr[i], ptr[i+1]);
-	}
+	process_mcheck_info(vector, la_ptr, regs, "CIA",
+			  DEBUG_MCHECK, CIA_mcheck_expected);
+
+	CIA_mcheck_expected = 0;
+	CIA_mcheck_taken = 1;
 }
diff -urN linux-2.2.11-pre2/arch/alpha/kernel/core_mcpcia.c linux/arch/alpha/kernel/core_mcpcia.c
--- linux-2.2.11-pre2/arch/alpha/kernel/core_mcpcia.c	Mon Dec  3 18:51:52 2001
+++ linux/arch/alpha/kernel/core_mcpcia.c	Mon Dec  3 18:52:21 2001
@@ -45,17 +45,11 @@
 # define DBG_CFG(args)
 #endif
 
-
-#define DEBUG_MCHECK
-
-#ifdef DEBUG_MCHECK
-# define DBG_MCK(args)	printk args
-#else
-# define DBG_MCK(args)
-#endif
+#define DEBUG_MCHECK 0	/* 0 = minimal, 1 = debug, 2 = dump */
 
 static volatile unsigned int MCPCIA_mcheck_expected[NR_CPUS];
 static volatile unsigned int MCPCIA_mcheck_taken[NR_CPUS];
+static volatile unsigned int MCPCIA_mcheck_hose[NR_CPUS];
 static unsigned int MCPCIA_jd[NR_CPUS];
 
 #define MCPCIA_MAX_HOSES 2
@@ -128,6 +122,7 @@
 	draina();
 	MCPCIA_mcheck_expected[cpu] = 1;
 	MCPCIA_mcheck_taken[cpu] = 0;
+	MCPCIA_mcheck_hose[cpu] = hoseno;
 	mb();
 
 	/* Access configuration space.  */
@@ -169,6 +164,7 @@
 
 	draina();
 	MCPCIA_mcheck_expected[cpu] = 1;
+	MCPCIA_mcheck_hose[cpu] = hoseno;
 	mb();
 
 	/* Access configuration space.  */
@@ -554,19 +550,12 @@
 	}
 }
 
-static int
-mcpcia_pci_clr_err(int h)
+static void
+mcpcia_pci_clr_err(int cpu, int hose)
 {
-	unsigned int cpu = smp_processor_id();
-
-	MCPCIA_jd[cpu] = *(vuip)MCPCIA_CAP_ERR(h);
-#if 0
-	DBG_MCK(("MCPCIA_pci_clr_err: MCPCIA CAP_ERR(%d) after read 0x%x\n",
-		 h, MCPCIA_jd[cpu]));
-#endif
-	*(vuip)MCPCIA_CAP_ERR(h) = 0xffffffff; mb(); /* clear them all */
-	MCPCIA_jd[cpu] = *(vuip)MCPCIA_CAP_ERR(h);
-	return 0;
+	MCPCIA_jd[cpu] = *(vuip)MCPCIA_CAP_ERR(hose);
+	*(vuip)MCPCIA_CAP_ERR(hose) = 0xffffffff; mb(); /* clear them all */
+	MCPCIA_jd[cpu] = *(vuip)MCPCIA_CAP_ERR(hose); /* read to force write */
 }
 
 static void
@@ -642,70 +631,36 @@
 }
 
 void
-mcpcia_machine_check(unsigned long type, unsigned long la_ptr,
+mcpcia_machine_check(unsigned long vector, unsigned long la_ptr,
 		     struct pt_regs * regs)
 {
-#if 0
-        printk("mcpcia machine check ignored\n") ;
-#else
 	struct el_common *mchk_header;
 	struct el_MCPCIA_uncorrected_frame_mcheck *mchk_logout;
 	unsigned int cpu = smp_processor_id();
-	int h = 0;
 
 	mchk_header = (struct el_common *)la_ptr;
 	mchk_logout = (struct el_MCPCIA_uncorrected_frame_mcheck *)la_ptr;
 
-#if 0
-	DBG_MCK(("mcpcia_machine_check: type=0x%lx la_ptr=0x%lx\n",
-		 type, la_ptr));
-	DBG_MCK(("\t\t pc=0x%lx size=0x%x procoffset=0x%x sysoffset 0x%x\n",
-		 regs->pc, mchk_header->size, mchk_header->proc_offset,
-		 mchk_header->sys_offset));
-#endif
-	/*
-	 * Check if machine check is due to a badaddr() and if so,
-	 * ignore the machine check.
-	 */
 	mb();
 	mb();  /* magic */
-	if (MCPCIA_mcheck_expected[cpu]) {
-#if 0
-		DBG_MCK(("MCPCIA machine check expected\n"));
-#endif
-		MCPCIA_mcheck_expected[cpu] = 0;
-		MCPCIA_mcheck_taken[cpu] = 1;
-		mb();
-		mb();  /* magic */
-		draina();
-		mcpcia_pci_clr_err(h);
-		wrmces(0x7);
-		mb();
-	}
-#if 1
+	draina();
+	if (MCPCIA_mcheck_expected[cpu])
+		mcpcia_pci_clr_err(cpu, MCPCIA_mcheck_hose[cpu]);
 	else {
-		printk("MCPCIA machine check NOT expected on CPU %d\n", cpu);
-		DBG_MCK(("mcpcia_machine_check: type=0x%lx pc=0x%lx"
-			 " code=0x%lx\n",
-			 type, regs->pc, mchk_header->code));
+		/* FIXME: how do we figure out which hose the error was on? */
+		mcpcia_pci_clr_err(cpu, 0);
+		mcpcia_pci_clr_err(cpu, 1);
+	}
+	wrmces(0x7);
+	mb();
 
-		MCPCIA_mcheck_expected[cpu] = 0;
-		MCPCIA_mcheck_taken[cpu] = 1;
-		mb();
-		mb();  /* magic */
-		draina();
-		mcpcia_pci_clr_err(h);
-		wrmces(0x7);
-		mb();
-#ifdef DEBUG_MCHECK_DUMP
-		if (type == 0x620)
-			printk("MCPCIA machine check: system CORRECTABLE!\n");
-		else if (type == 0x630)
-			printk("MCPCIA machine check: processor CORRECTABLE!\n");
-		else
-#endif /* DEBUG_MCHECK_DUMP */
-			mcpcia_print_uncorrectable(mchk_logout);
+	process_mcheck_info(vector, la_ptr, regs, "MCPCIA",
+			    DEBUG_MCHECK, MCPCIA_mcheck_expected[cpu]);
+
+	if (vector != 0x620 && vector != 0x630) {
+		mcpcia_print_uncorrectable(mchk_logout);
 	}
-#endif
-#endif
+
+	MCPCIA_mcheck_expected[cpu] = 0;
+	MCPCIA_mcheck_taken[cpu] = 1;
 }
diff -urN linux-2.2.11-pre2/arch/alpha/kernel/core_pyxis.c linux/arch/alpha/kernel/core_pyxis.c
--- linux-2.2.11-pre2/arch/alpha/kernel/core_pyxis.c	Mon Dec  3 18:51:52 2001
+++ linux/arch/alpha/kernel/core_pyxis.c	Mon Dec  3 18:52:21 2001
@@ -31,8 +31,9 @@
  * BIOS32-style PCI interface:
  */
 
+#define DEBUG_MCHECK 0	/* 0 = minimum, 1 = debug, 2 = dump */
+
 #define DEBUG_CONFIG 0
-#define DEBUG_MCHECK 0
 
 #if DEBUG_CONFIG
 # define DBG_CNF(args)	printk args
@@ -40,14 +41,6 @@
 # define DBG_CNF(args)
 #endif
 
-#if DEBUG_MCHECK
-# define DBG_MCK(args)	printk args
-# define DEBUG_MCHECK_DUMP
-#else
-# define DBG_MCK(args)
-#endif
-
-
 static volatile unsigned int PYXIS_mcheck_expected = 0;
 static volatile unsigned int PYXIS_mcheck_taken = 0;
 static unsigned int PYXIS_jd;
@@ -432,14 +425,13 @@
 	 * Window 1 goes at 2 GB and is 1 GB large.
 	 */
 
-	*(vuip)PYXIS_W0_BASE = PYXIS_DMA_WIN_BASE_DEFAULT | 1U;
-	*(vuip)PYXIS_W0_MASK = (PYXIS_DMA_WIN_SIZE_DEFAULT - 1) & 0xfff00000U;
-	*(vuip)PYXIS_T0_BASE = 0;
-
-	*(vuip)PYXIS_W1_BASE = (PYXIS_DMA_WIN_BASE_DEFAULT +
-				PYXIS_DMA_WIN_SIZE_DEFAULT) | 1U;
-	*(vuip)PYXIS_W1_MASK = (PYXIS_DMA_WIN_SIZE_DEFAULT - 1) & 0xfff00000U;
-	*(vuip)PYXIS_T1_BASE = PYXIS_DMA_WIN_SIZE_DEFAULT;
+	*(vuip)PYXIS_W0_BASE = PYXIS_DMA_WIN0_BASE_DEFAULT | 1U;
+	*(vuip)PYXIS_W0_MASK = (PYXIS_DMA_WIN0_SIZE_DEFAULT - 1) & 0xfff00000U;
+	*(vuip)PYXIS_T0_BASE = PYXIS_DMA_WIN0_TRAN_DEFAULT >> 2;
+
+	*(vuip)PYXIS_W1_BASE = PYXIS_DMA_WIN1_BASE_DEFAULT | 1U;
+	*(vuip)PYXIS_W1_MASK = (PYXIS_DMA_WIN1_SIZE_DEFAULT - 1) & 0xfff00000U;
+	*(vuip)PYXIS_T1_BASE = PYXIS_DMA_WIN1_TRAN_DEFAULT >> 2;
 
 	*(vuip)PYXIS_W2_BASE = 0x0 ;
 	*(vuip)PYXIS_W3_BASE = 0x0 ;
@@ -530,16 +522,6 @@
 	pyxis_finish_init_arch();
 }
 
-static int
-pyxis_pci_clr_err(void)
-{
-	PYXIS_jd = *(vuip)PYXIS_ERR;
-	DBG_MCK(("PYXIS_pci_clr_err: PYXIS ERR after read 0x%x\n", PYXIS_jd));
-	*(vuip)PYXIS_ERR = 0x0180; mb();
-	PYXIS_jd = *(vuip)PYXIS_ERR;  /* re-read to force write */
-	return 0;
-}
-
 void
 pyxis_machine_check(unsigned long vector, unsigned long la_ptr,
 		    struct pt_regs * regs)
@@ -552,61 +534,26 @@
 	mchk_sysdata = (struct el_PYXIS_sysdata_mcheck *)
 		(la_ptr + mchk_header->sys_offset);
 
-#if 0
-	DBG_MCK(("pyxis_machine_check: vector=0x%lx la_ptr=0x%lx\n",
-		 vector, la_ptr));
-	DBG_MCK(("\t\t pc=0x%lx size=0x%x procoffset=0x%x sysoffset 0x%x\n",
-		 regs->pc, mchk_header->size, mchk_header->proc_offset,
-		 mchk_header->sys_offset));
-	DBG_MCK(("pyxis_machine_check: expected %d DCSR 0x%lx PEAR 0x%lx\n",
-		 PYXIS_mcheck_expected, mchk_sysdata->epic_dcsr,
-		 mchk_sysdata->epic_pear));
-#endif
+	/* Clear the error before reporting anything. */
+	mb();
+	mb();  /* magic */
+	draina();
+
+	PYXIS_jd = *(vuip)PYXIS_ERR;
+	*(vuip)PYXIS_ERR = PYXIS_jd;
+	mb();
+	PYXIS_jd = *(vuip)PYXIS_ERR;  /* re-read to force write */
+
+	wrmces(0x7);
+	mb();
 
 	/*
-	 * Check if machine check is due to a badaddr() and if so,
-	 * ignore the machine check.
+	 * See if the machine check is due to a badaddr() and if so,
+	 * ignore it.
 	 */
-	mb();
-	mb();  /* magic */
-	if (PYXIS_mcheck_expected) {
-		DBG_MCK(("PYXIS machine check expected\n"));
-		PYXIS_mcheck_expected = 0;
-		PYXIS_mcheck_taken = 1;
-		mb();
-		mb();  /* magic */
-		draina();
-		pyxis_pci_clr_err();
-		wrmces(0x7);
-		mb();
-	}
-	else {
-		printk("PYXIS machine check NOT expected\n") ;
-		DBG_MCK(("pyxis_machine_check: vector=0x%lx la_ptr=0x%lx\n",
-			 vector, la_ptr));
-		DBG_MCK(("\t\t pc=0x%lx size=0x%x procoffset=0x%x"
-			 " sysoffset 0x%x\n",
-			 regs->pc, mchk_header->size, mchk_header->proc_offset,
-			 mchk_header->sys_offset));
-		PYXIS_mcheck_expected = 0;
-		PYXIS_mcheck_taken = 1;
-		mb();
-		mb();  /* magic */
-		draina();
-		pyxis_pci_clr_err();
-		wrmces(0x7);
-		mb();
+	process_mcheck_info(vector, la_ptr, regs, "PYXIS",
+			    DEBUG_MCHECK, PYXIS_mcheck_expected);
 
-#ifdef DEBUG_MCHECK_DUMP
-		{
-			unsigned long *ptr = (unsigned long *)la_ptr;;
-			long n = mchk_header->size / (2*sizeof(long));
-
-			do
-				printk(" +%lx %lx %lx\n", i*sizeof(long),
-				       ptr[i], ptr[i+1]);
-			while (--i);
-		}
-#endif
-	}
+	PYXIS_mcheck_expected = 0;
+	PYXIS_mcheck_taken = 1;
 }
diff -urN linux-2.2.11-pre2/arch/alpha/kernel/core_tsunami.c linux/arch/alpha/kernel/core_tsunami.c
--- linux-2.2.11-pre2/arch/alpha/kernel/core_tsunami.c	Sun Jan 10 22:56:43 1999
+++ linux/arch/alpha/kernel/core_tsunami.c	Mon Dec  3 18:52:21 2001
@@ -36,20 +36,16 @@
  * BIOS32-style PCI interface:
  */
 
-#ifdef DEBUG_CONFIG
+#define DEBUG_MCHECK 0  /* 0 = minimum, 1 = debug, 2 = dump */
+
+#define DEBUG_CONFIG 0
+
+#if DEBUG_CONFIG > 0
 # define DBG_CFG(args)	printk args
 #else
 # define DBG_CFG(args)
 #endif
 
-#define DEBUG_MCHECK
-#ifdef DEBUG_MCHECK
-# define DBG_MCK(args)	printk args
-#define DEBUG_MCHECK_DUMP
-#else
-# define DBG_MCK(args)
-#endif
-
 static volatile unsigned int TSUNAMI_mcheck_expected[NR_CPUS];
 static volatile unsigned int TSUNAMI_mcheck_taken[NR_CPUS];
 static unsigned int TSUNAMI_jd[NR_CPUS];
@@ -302,20 +298,18 @@
 		 * we may want to use them to do scatter/gather DMA. 
 		 *
 		 * Window 0 goes at 1 GB and is 1 GB large, mapping to 0.
+		 * Window 1 goes at 2 GB and is 1 GB large, mapping to 1GB.
 		 */
 
-		pchip->wsba[0].csr = 1L | (TSUNAMI_DMA_WIN_BASE_DEFAULT & 0xfff00000U);
-		pchip->wsm[0].csr = (TSUNAMI_DMA_WIN_SIZE_DEFAULT - 1) & 0xfff00000UL;
-		pchip->tba[0].csr = 0;
-
-#if 0
-		pchip->wsba[1].csr = 0;
-#else
-		/* make the second window at 2Gb for 1Gb mapping to 1Gb */
-		pchip->wsba[1].csr = 1L | ((0x80000000U) & 0xfff00000U);
-		pchip->wsm[1].csr = (0x40000000UL - 1) & 0xfff00000UL;
-		pchip->tba[1].csr = 0x40000000;
-#endif
+		pchip->wsba[0].csr = TSUNAMI_DMA_WIN0_BASE_DEFAULT | 1UL;
+		pchip->wsm[0].csr  = (TSUNAMI_DMA_WIN0_SIZE_DEFAULT - 1) &
+				     0xfff00000UL;
+		pchip->tba[0].csr  = TSUNAMI_DMA_WIN0_TRAN_DEFAULT;
+
+		pchip->wsba[1].csr = TSUNAMI_DMA_WIN1_BASE_DEFAULT | 1UL;
+		pchip->wsm[1].csr  = (TSUNAMI_DMA_WIN1_SIZE_DEFAULT - 1) &
+				     0xfff00000UL;
+		pchip->tba[1].csr  = TSUNAMI_DMA_WIN1_TRAN_DEFAULT;
 
 		pchip->wsba[2].csr = 0;
 		pchip->wsba[3].csr = 0;
@@ -365,8 +359,8 @@
 	*mem_start = (*mem_start | 31) + 1;
 
 	/* Find how many hoses we have, and initialize them.  */
+	/* TSUNAMI and TYPHOON can have 2, but might only have 1 (DS10) */
 	tsunami_init_one_pchip(TSUNAMI_pchip0, 0, mem_start);
-	/* must change this for TYPHOON which may have 4 */
 	if (TSUNAMI_cchip->csc.csr & 1L<<14)
 	    tsunami_init_one_pchip(TSUNAMI_pchip1, 1, mem_start);
 }
@@ -375,8 +369,6 @@
 tsunami_pci_clr_err_1(tsunami_pchip *pchip, int cpu)
 {
 	TSUNAMI_jd[cpu] = pchip->perror.csr;
-	DBG_MCK(("TSUNAMI_pci_clr_err: PERROR after read 0x%x\n",
-		 TSUNAMI_jd[cpu]));
 	pchip->perror.csr = 0x040;
 	mb();
 	TSUNAMI_jd[cpu] = pchip->perror.csr;
@@ -386,10 +378,13 @@
 tsunami_pci_clr_err(void)
 {
 	int cpu = smp_processor_id();
+
 	tsunami_pci_clr_err_1(TSUNAMI_pchip0, cpu);
-	/* must change this for TYPHOON which may have 4 */
+
+	/* TSUNAMI and TYPHOON can have 2, but might only have 1 (DS10) */
 	if (TSUNAMI_cchip->csc.csr & 1L<<14)
 	    tsunami_pci_clr_err_1(TSUNAMI_pchip1, cpu);
+
 	return 0;
 }
 
@@ -397,9 +392,6 @@
 tsunami_machine_check(unsigned long vector, unsigned long la_ptr,
 		      struct pt_regs * regs)
 {
-#if 0
-        printk("TSUNAMI machine check ignored\n") ;
-#else
 	struct el_common *mchk_header;
 	struct el_TSUNAMI_sysdata_mcheck *mchk_sysdata;
 	unsigned int cpu = smp_processor_id();
@@ -410,61 +402,21 @@
 	mchk_sysdata = (struct el_TSUNAMI_sysdata_mcheck *)
 		(la_ptr + mchk_header->sys_offset);
 
-#if 0
-	DBG_MCK(("tsunami_machine_check: vector=0x%lx la_ptr=0x%lx\n",
-		 vector, la_ptr));
-	DBG_MCK(("\t\t pc=0x%lx size=0x%x procoffset=0x%x sysoffset 0x%x\n",
-		 regs->pc, mchk_header->size, mchk_header->proc_offset,
-		 mchk_header->sys_offset));
-	DBG_MCK(("tsunami_machine_check: expected %d DCSR 0x%lx PEAR 0x%lx\n",
-		 TSUNAMI_mcheck_expected[cpu], mchk_sysdata->epic_dcsr,
-		 mchk_sysdata->epic_pear));
-#endif
-#ifdef DEBUG_MCHECK_DUMP
-	{
-		unsigned long *ptr;
-		int i;
+	/* Clear error before any reporting. */
+	mb();
+	mb();  /* magic */
+	draina();
+	tsunami_pci_clr_err();
+	wrmces(0x7);
+	mb();
 
-		ptr = (unsigned long *)la_ptr;
-		for (i = 0; i < mchk_header->size / sizeof(long); i += 2) {
-			printk(" +%lx %lx %lx\n", i*sizeof(long), ptr[i], ptr[i+1]);
-		}
-	}
-#endif /* DEBUG_MCHECK_DUMP */
 	/*
 	 * Check if machine check is due to a badaddr() and if so,
 	 * ignore the machine check.
 	 */
-	mb();
-	mb();  /* magic */
-	if (TSUNAMI_mcheck_expected[cpu]) {
-		DBG_MCK(("TSUNAMI machine check expected\n"));
-		TSUNAMI_mcheck_expected[cpu] = 0;
-		TSUNAMI_mcheck_taken[cpu] = 1;
-		mb();
-		mb();  /* magic */
-		draina();
-		tsunami_pci_clr_err();
-		wrmces(0x7);
-		mb();
-	}
-#if 1
-	else {
-		printk("TSUNAMI machine check NOT expected\n") ;
-		DBG_MCK(("tsunami_machine_check: vector=0x%lx la_ptr=0x%lx\n",
-			 vector, la_ptr));
-		DBG_MCK(("\t\t pc=0x%lx size=0x%x procoffset=0x%x sysoffset 0x%x\n",
-			 regs->pc, mchk_header->size, mchk_header->proc_offset,
-			 mchk_header->sys_offset));
-		TSUNAMI_mcheck_expected[cpu] = 0;
-		TSUNAMI_mcheck_taken[cpu] = 1;
-		mb();
-		mb();  /* magic */
-		draina();
-		tsunami_pci_clr_err();
-		wrmces(0x7);
-		mb();
-	}
-#endif
-#endif
+	process_mcheck_info(vector, la_ptr, regs, "TSUNAMI",
+			    DEBUG_MCHECK, TSUNAMI_mcheck_expected[cpu]);
+
+	TSUNAMI_mcheck_expected[cpu] = 0;
+	TSUNAMI_mcheck_taken[cpu] = 1;
 }
diff -urN linux-2.2.11-pre2/arch/alpha/kernel/entry.S linux/arch/alpha/kernel/entry.S
--- linux-2.2.11-pre2/arch/alpha/kernel/entry.S	Mon Dec  3 18:51:52 2001
+++ linux/arch/alpha/kernel/entry.S	Mon May 10 09:55:21 1999
@@ -527,8 +527,6 @@
 	call_pal PAL_swpctx
 	unop
 	bsr	$1,undo_switch_stack
-	lda	$8,0x3fff
-	bic	$30,$8,$8
 	mov	$17,$0
 	ret	$31,($26),1
 .end alpha_switch_to
diff -urN linux-2.2.11-pre2/arch/alpha/kernel/fpreg.c linux/arch/alpha/kernel/fpreg.c
--- linux-2.2.11-pre2/arch/alpha/kernel/fpreg.c	Sat May 22 13:41:47 1999
+++ linux/arch/alpha/kernel/fpreg.c	Mon Dec  3 18:52:21 2001
@@ -96,3 +96,96 @@
 	      case 31: LDT(31, val); break;
 	}
 }
+
+#if defined(__alpha_cix__) || defined(__alpha_fix__)
+#define STS(reg,val)  asm volatile ("ftois $f"#reg",%0" : "=r"(val));
+#else
+#define STS(reg,val)  asm volatile ("sts $f"#reg",%0" : "=m"(val));
+#endif
+
+unsigned long
+alpha_read_fp_reg_s (unsigned long reg)
+{
+	unsigned long val;
+
+	switch (reg) {
+	      case  0: STS( 0, val); break;
+	      case  1: STS( 1, val); break;
+	      case  2: STS( 2, val); break;
+	      case  3: STS( 3, val); break;
+	      case  4: STS( 4, val); break;
+	      case  5: STS( 5, val); break;
+	      case  6: STS( 6, val); break;
+	      case  7: STS( 7, val); break;
+	      case  8: STS( 8, val); break;
+	      case  9: STS( 9, val); break;
+	      case 10: STS(10, val); break;
+	      case 11: STS(11, val); break;
+	      case 12: STS(12, val); break;
+	      case 13: STS(13, val); break;
+	      case 14: STS(14, val); break;
+	      case 15: STS(15, val); break;
+	      case 16: STS(16, val); break;
+	      case 17: STS(17, val); break;
+	      case 18: STS(18, val); break;
+	      case 19: STS(19, val); break;
+	      case 20: STS(20, val); break;
+	      case 21: STS(21, val); break;
+	      case 22: STS(22, val); break;
+	      case 23: STS(23, val); break;
+	      case 24: STS(24, val); break;
+	      case 25: STS(25, val); break;
+	      case 26: STS(26, val); break;
+	      case 27: STS(27, val); break;
+	      case 28: STS(28, val); break;
+	      case 29: STS(29, val); break;
+	      case 30: STS(30, val); break;
+	      case 31: STS(31, val); break;
+	}
+	return val;
+}
+
+#if defined(__alpha_cix__) || defined(__alpha_fix__)
+#define LDS(reg,val)  asm volatile ("itofs %0,$f"#reg : : "r"(val));
+#else
+#define LDS(reg,val)  asm volatile ("lds $f"#reg",%0" : : "m"(val));
+#endif
+
+void
+alpha_write_fp_reg_s (unsigned long reg, unsigned long val)
+{
+	switch (reg) {
+	      case  0: LDS( 0, val); break;
+	      case  1: LDS( 1, val); break;
+	      case  2: LDS( 2, val); break;
+	      case  3: LDS( 3, val); break;
+	      case  4: LDS( 4, val); break;
+	      case  5: LDS( 5, val); break;
+	      case  6: LDS( 6, val); break;
+	      case  7: LDS( 7, val); break;
+	      case  8: LDS( 8, val); break;
+	      case  9: LDS( 9, val); break;
+	      case 10: LDS(10, val); break;
+	      case 11: LDS(11, val); break;
+	      case 12: LDS(12, val); break;
+	      case 13: LDS(13, val); break;
+	      case 14: LDS(14, val); break;
+	      case 15: LDS(15, val); break;
+	      case 16: LDS(16, val); break;
+	      case 17: LDS(17, val); break;
+	      case 18: LDS(18, val); break;
+	      case 19: LDS(19, val); break;
+	      case 20: LDS(20, val); break;
+	      case 21: LDS(21, val); break;
+	      case 22: LDS(22, val); break;
+	      case 23: LDS(23, val); break;
+	      case 24: LDS(24, val); break;
+	      case 25: LDS(25, val); break;
+	      case 26: LDS(26, val); break;
+	      case 27: LDS(27, val); break;
+	      case 28: LDS(28, val); break;
+	      case 29: LDS(29, val); break;
+	      case 30: LDS(30, val); break;
+	      case 31: LDS(31, val); break;
+	}
+}
diff -urN linux-2.2.11-pre2/arch/alpha/kernel/irq.c linux/arch/alpha/kernel/irq.c
--- linux-2.2.11-pre2/arch/alpha/kernel/irq.c	Sat May 22 13:42:26 1999
+++ linux/arch/alpha/kernel/irq.c	Mon Dec  3 18:52:21 2001
@@ -868,31 +868,23 @@
 	  unsigned long a3, unsigned long a4, unsigned long a5,
 	  struct pt_regs regs)
 {
-	unsigned long flags;
-
 	switch (type) {
 	case 0:
 #ifdef __SMP__
-		__save_and_cli(flags);
 		handle_ipi(&regs);
-		__restore_flags(flags);
 		return;
 #else
 		printk("Interprocessor interrupt? You must be kidding\n");
 #endif
 		break;
 	case 1:
-		__save_and_cli(flags);
 		handle_irq(RTC_IRQ, -1, &regs);
-		__restore_flags(flags);
 		return;
 	case 2:
 		alpha_mv.machine_check(vector, la_ptr, &regs);
 		return;
 	case 3:
-		__save_and_cli(flags);
 		alpha_mv.device_interrupt(vector, &regs);
-		__restore_flags(flags);
 		return;
 	case 4:
 		perf_irq(vector, &regs);
@@ -908,4 +900,85 @@
 {
 	wrent(entInt, 0);
 	alpha_mv.init_irq();
+}
+
+/*
+ * Machine check reasons.  Defined according to PALcode sources
+ * (osf.h and platform.h).
+ */
+#define MCHK_K_TPERR		0x0080
+#define MCHK_K_TCPERR		0x0082
+#define MCHK_K_HERR		0x0084
+#define MCHK_K_ECC_C		0x0086
+#define MCHK_K_ECC_NC		0x0088
+#define MCHK_K_OS_BUGCHECK	0x008A
+#define MCHK_K_PAL_BUGCHECK	0x0090
+
+void
+process_mcheck_info(unsigned long vector, unsigned long la_ptr,
+		  struct pt_regs *regs, char *machine,
+		  unsigned int debug, unsigned int expected)
+{
+	struct el_common *mchk_header;
+	unsigned long *ptr;
+	char *reason;
+	int i;
+
+	/*
+	 * See if the machine check is due to a badaddr() and if so,
+	 * ignore it.
+	 */
+	if (debug)
+		printk(KERN_CRIT "%s machine check %s\n", machine,
+		       (expected?"expected.":"NOT expected!!!"));
+	if (expected)
+		return;
+
+	mchk_header = (struct el_common *)la_ptr;
+
+	printk(KERN_CRIT "%s machine check: vector=0x%lx pc=0x%lx code=0x%lx\n",
+	       machine, vector, regs->pc, mchk_header->code);
+
+	switch ((unsigned int) mchk_header->code) {
+	case MCHK_K_TPERR:	reason = "tag parity error"; break;
+	case MCHK_K_TCPERR:	reason = "tag control parity error"; break;
+	case MCHK_K_HERR:	reason = "generic hard error"; break;
+	case MCHK_K_ECC_C:	reason = "correctable ECC error"; break;
+	case MCHK_K_ECC_NC:	reason = "uncorrectable ECC error"; break;
+	case MCHK_K_OS_BUGCHECK: reason = "OS-specific PAL bugcheck"; break;
+	case MCHK_K_PAL_BUGCHECK: reason = "callsys in kernel mode"; break;
+	case 0x96: reason = "i-cache read retryable error"; break;
+	case 0x98: reason = "processor detected hard error"; break;
+
+	  /* System specific (these are for Alcor, at least): */
+	case 0x203: reason = "system detected uncorrectable ECC error"; break;
+	case 0x205: reason = "parity error detected by CIA"; break;
+	case 0x207: reason = "non-existent memory error"; break;
+	case 0x209: reason = "PCI SERR detected"; break;
+	case 0x20b: reason = "PCI data parity error detected"; break;
+	case 0x20d: reason = "PCI address parity error detected"; break;
+	case 0x20f: reason = "PCI master abort error"; break;
+	case 0x211: reason = "PCI target abort error"; break;
+	case 0x213: reason = "scatter/gather PTE invalid error"; break;
+	case 0x215: reason = "flash ROM write error"; break;
+	case 0x217: reason = "IOA timeout detected"; break;
+	case 0x219: reason = "IOCHK#, EISA add-in board parity or other catastrophic error"; break;
+	case 0x21b: reason = "EISA fail-safe timer timeout"; break;
+	case 0x21d: reason = "EISA bus time-out"; break;
+	case 0x21f: reason = "EISA software generated NMI"; break;
+	case 0x221: reason = "unexpected ev5 IRQ[3] interrupt"; break;
+	default: reason = "unknown"; break;
+	}
+	printk(KERN_CRIT "machine check type: %s%s\n",
+	       reason, mchk_header->retry ? " (retryable)" : "");
+
+	if (debug > 1) {
+
+		/* Dump the logout area to give all info.  */
+		ptr = (unsigned long *)la_ptr;
+		for (i = 0; i < mchk_header->size / sizeof(long); i += 2) {
+			printk(KERN_CRIT "   +%8lx %016lx %016lx\n",
+			       i*sizeof(long), ptr[i], ptr[i+1]);
+		}
+	}
 }
diff -urN linux-2.2.11-pre2/arch/alpha/kernel/osf_sys.c linux/arch/alpha/kernel/osf_sys.c
--- linux-2.2.11-pre2/arch/alpha/kernel/osf_sys.c	Mon Dec  3 18:51:52 2001
+++ linux/arch/alpha/kernel/osf_sys.c	Mon Dec  3 18:52:21 2001
@@ -950,7 +950,7 @@
 {
 	switch (op) {
 	case SSI_IEEE_FP_CONTROL: {
-		unsigned long swcr, fpcr, undz;
+		unsigned long swcr, fpcr, undz, ev6;
 
 		/* 
 		 * Alpha Architecture Handbook 4.7.7.3:
@@ -959,6 +959,8 @@
 		 * set in the trap shadow of a software-complete insn.
 		 */
 
+		ev6 = (implver() == IMPLVER_EV6);
+
 		/* Update softare trap enable bits.  */
 		if (get_user(swcr, (unsigned long *)buffer))
 			return -EFAULT;
@@ -967,10 +969,17 @@
 
 		/* Update the real fpcr.  Keep UNFD off if not UNDZ.  */
 		fpcr = rdfpcr();
-		undz = (fpcr & FPCR_UNDZ);
-		fpcr &= ~(FPCR_MASK | FPCR_DYN_MASK | FPCR_UNDZ);
+		if(ev6) {
+		    undz = (fpcr & FPCR_UNDZ);
+		    fpcr &= (~(FPCR_MASK | FPCR_UNDZ)) | FPCR_DYN_MASK;
+		}
+		else {
+		    fpcr &= (~FPCR_MASK) | FPCR_DYN_MASK;
+		}
 		fpcr |= ieee_swcr_to_fpcr(swcr);
-		fpcr &= ~(undz << 1);
+		if(ev6 && !undz) {
+		    fpcr &= ~FPCR_UNFD;
+		}
 		wrfpcr(fpcr);
 		   
 		return 0;
diff -urN linux-2.2.11-pre2/arch/alpha/kernel/proto.h linux/arch/alpha/kernel/proto.h
--- linux-2.2.11-pre2/arch/alpha/kernel/proto.h	Mon Dec  3 18:51:52 2001
+++ linux/arch/alpha/kernel/proto.h	Mon Dec  3 18:52:21 2001
@@ -201,3 +201,9 @@
 
 /* ../mm/init.c */
 void srm_paging_stop(void);
+
+/* irq.c */
+extern void process_mcheck_info(unsigned long vector, unsigned long la_ptr,
+				struct pt_regs *regs, char *machine,
+				unsigned int debug, unsigned int expected);
+
diff -urN linux-2.2.11-pre2/arch/alpha/kernel/setup.c linux/arch/alpha/kernel/setup.c
--- linux-2.2.11-pre2/arch/alpha/kernel/setup.c	Mon Dec  3 18:51:52 2001
+++ linux/arch/alpha/kernel/setup.c	Mon Dec  3 18:52:21 2001
@@ -224,9 +224,16 @@
 	alpha_using_srm = strncmp((const char *)hwrpb->ssn, "MILO", 4) != 0;
 #endif
 
-	printk("Booting on %s%s%s using machine vector %s\n",
+	printk("%s on %s%s%s using machine vector %s from %s\n",
+#ifdef CONFIG_ALPHA_GENERIC
+	       "Booting GENERIC",
+#else
+	       "Booting",
+#endif
 	       type_name, (*var_name ? " variation " : ""),
-	       var_name, alpha_mv.vector_name);
+	       var_name, alpha_mv.vector_name,
+	       (alpha_using_srm ? "SRM" : "MILO"));
+
 	printk("Command line: %s\n", command_line);
 
 	/* 
@@ -727,7 +734,8 @@
 		      "BogoMIPS\t\t: %lu.%02lu\n"
 		      "kernel unaligned acc\t: %ld (pc=%lx,va=%lx)\n"
 		      "user unaligned acc\t: %ld (pc=%lx,va=%lx)\n"
-		      "platform string\t\t: %s\n",
+		      "platform string\t\t: %s\n"
+		      "cpus detected\t\t: %ld\n",
 		       cpu_name, cpu->variation, cpu->revision,
 		       (char*)cpu->serial_no,
 		       systype_name, sysvariation_name, hwrpb->sys_revision,
@@ -742,7 +750,7 @@
 		       loops_per_sec / 500000, (loops_per_sec / 5000) % 100,
 		       unaligned[0].count, unaligned[0].pc, unaligned[0].va,
 		       unaligned[1].count, unaligned[1].pc, unaligned[1].va,
-		       platform_string());
+		       platform_string(), hwrpb->nr_processors);
 
 #ifdef __SMP__
 	len += smp_info(buffer+len);
diff -urN linux-2.2.11-pre2/arch/alpha/kernel/sys_miata.c linux/arch/alpha/kernel/sys_miata.c
--- linux-2.2.11-pre2/arch/alpha/kernel/sys_miata.c	Sun Feb 21 19:06:36 1999
+++ linux/arch/alpha/kernel/sys_miata.c	Mon Dec  3 18:52:21 2001
@@ -271,6 +271,17 @@
 	es1888_init();
 }
 
+static void 
+miata_kill_arch (int mode, char *reboot_cmd) 
+{ 
+	/* Who said DEC engineers have no sense of humor? ;-)  */ 
+	if (alpha_using_srm) { 
+		*(vuip) PYXIS_RESET = 0x0000dead; 
+		mb(); 
+	} 
+	generic_kill_arch(mode, reboot_cmd); 
+} 
+
 
 /*
  * The System Vector
@@ -295,6 +306,6 @@
 	init_irq:		miata_init_irq,
 	init_pit:		generic_init_pit,
 	pci_fixup:		miata_pci_fixup,
-	kill_arch:		generic_kill_arch,
+	kill_arch:		miata_kill_arch,
 };
 ALIAS_MV(miata)
diff -urN linux-2.2.11-pre2/arch/alpha/math-emu/Makefile linux/arch/alpha/math-emu/Makefile
--- linux-2.2.11-pre2/arch/alpha/math-emu/Makefile	Thu Feb 12 13:31:28 1998
+++ linux/arch/alpha/math-emu/Makefile	Mon Dec  3 18:52:22 2001
@@ -3,10 +3,27 @@
 #
 
 O_TARGET := math-emu.o
-O_OBJS   := fp-emul.o ieee-math.o
+O_OBJS   := fp-emul.o faddd.o fadds.o fdivd.o fdivs.o fdtoi.o \
+		fdtos.o fdtox.o fmuld.o fmuls.o fsmuld.o fsqrtd.o \
+		fsqrts.o fstod.o fstoi.o fstox.o fsubd.o fsubs.o \
+		cmptxx.o fxtos.o fxtod.o udivmodti4.o div128.o
+
+LINKS	:=	double.h faddd.c fadds.c fdivd.c fdivs.c fdtoi.c \
+		fdtos.c fdtox.c fmuld.c fmuls.c fsmuld.c fsqrtd.c \
+		fsqrts.c fstod.c fstoi.c fstox.c fsubd.c fsubs.c \
+		op-common.h op-1.h op-2.h op-4.h single.h soft-fp.h \
+		udivmodti4.c
+
+
 
 ifeq ($(CONFIG_MATHEMU),m)
 M_OBJS   := $(O_TARGET)
 endif
 
 include $(TOPDIR)/Rules.make
+
+symlinks:
+	ln -sf $(patsubst %,../../sparc64/math-emu/%,$(LINKS)) .
+
+cleansymlinks:
+	rm -f $(LINKS)
diff -urN linux-2.2.11-pre2/arch/alpha/math-emu/cmptxx.c linux/arch/alpha/math-emu/cmptxx.c
--- linux-2.2.11-pre2/arch/alpha/math-emu/cmptxx.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/alpha/math-emu/cmptxx.c	Mon Dec  3 18:52:22 2001
@@ -0,0 +1,23 @@
+#include "soft-fp.h"
+#include "double.h"
+
+int CMPTXX(void *rc, void *rb, void *ra, int type)
+{
+	FP_DECL_D(A); FP_DECL_D(B);
+	long ret;
+	
+	__FP_UNPACK_D(A, ra);
+	__FP_UNPACK_D(B, rb);
+	FP_CMP_D(ret, A, B, 3);
+	if(ret == type) {
+	    *(unsigned long *)rc = 0x4000000000000000;
+	}
+	else if((type == CMPTXX_LE) && 
+		((ret == CMPTXX_LT) || (ret == CMPTXX_EQ))) {
+	    *(unsigned long *)rc = 0x4000000000000000;
+	}
+	else {
+	    *(unsigned long *)rc = 0;
+	}
+	return 0;
+}
diff -urN linux-2.2.11-pre2/arch/alpha/math-emu/div128.c linux/arch/alpha/math-emu/div128.c
--- linux-2.2.11-pre2/arch/alpha/math-emu/div128.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/alpha/math-emu/div128.c	Mon Dec  3 18:52:22 2001
@@ -0,0 +1,125 @@
+/*
+   Copyright stuff
+
+   Use of this program, for any purpose, is granted the author,
+   Ian Kaplan, as long as this copyright notice is included in
+   the source code or any source code derived from this program.
+   The user assumes all responsibility for using this code.
+
+   Ian Kaplan, October 1996
+
+*/
+
+#define HI 0
+#define LO 1
+
+void set128(unsigned long *n, unsigned long hi, unsigned long lo)
+{
+    n[HI] = hi;
+    n[LO] = lo;
+}
+
+int eq128(unsigned long *n1, unsigned long *n2)
+{
+    return((n1[HI] == n2[HI]) && (n1[LO] == n2[LO]));
+}
+
+int gt128(unsigned long *n1, unsigned long *n2)
+{
+    return((n1[HI] > n2[HI]) || 
+	((n1[HI] == n2[HI]) && (n1[LO] > n2[LO])));
+}
+
+int lt128(unsigned long *n1, unsigned long *n2)
+{
+    return((n1[HI] < n2[HI]) || 
+	((n1[HI] == n2[HI]) && (n1[LO] < n2[LO])));
+}
+
+
+void copy128(unsigned long *dest, unsigned long *src)
+{
+    dest[HI] = src[HI];
+    dest[LO] = src[LO];
+}
+
+/* Shift the given bit into the octaword from the right
+ * (i.e. left-shift-1, or in low bit).  If "bit" is zero,
+ * then this is a simple left shift.
+ */
+void shiftin128(unsigned long *n, unsigned long bit)
+{
+    n[HI] <<= 1;
+    if(n[LO] & 0x8000000000000000) {
+	n[HI] |= 1;
+    }
+    n[LO] = (n[LO] << 1) | bit;
+}
+
+void sub128(unsigned long *n1, unsigned long *n2, unsigned long *result)
+{
+    if(n1[LO] < n2[LO]) {
+        result[LO] = n1[LO] - n2[LO];
+	result[HI] = n1[HI] - n2[HI] - 1;
+    }
+    else {
+        result[LO] = n1[LO] - n2[LO];
+	result[HI] = n1[HI] - n2[HI];
+    }
+}
+	
+
+void udiv128(unsigned long *dividend,
+                     unsigned long *divisor,
+                     unsigned long *quotient,
+                     unsigned long *remainder )
+{
+  unsigned long zero[2];
+  unsigned long t[2], num_bits;
+  unsigned long q, bit;
+  unsigned long rem[2];
+  int i;
+
+  set128(remainder, 0, 0);
+  set128(quotient, 0, 0);
+  set128(zero, 0, 0);
+
+  if (eq128(divisor, zero)) {
+    return;
+  }
+
+  if(gt128(divisor, dividend)) {
+    copy128(remainder, dividend);
+    return;
+  }
+
+  if (eq128(divisor, dividend)) {
+    set128(quotient, 0, 1);
+    return;
+  }
+
+  num_bits = 128;
+
+  while(1) {
+    bit = (dividend[HI] & 0x8000000000000000) >> 63;
+    copy128(rem, remainder);
+    shiftin128(rem, bit);
+    if(lt128(rem, divisor)) break;
+    copy128(remainder, rem);
+    shiftin128(dividend, 0);
+    num_bits--;
+  }
+
+  for (i = 0; i < num_bits; i++) {
+    bit = (dividend[HI] & 0x8000000000000000) >> 63;
+    shiftin128(remainder, bit);
+    sub128(remainder, divisor, t);
+    q = !((t[HI] & 0x8000000000000000) >> 63);
+    shiftin128(dividend, 0);
+    shiftin128(quotient, q);
+    if (q) {
+       copy128(remainder, t);
+     }
+  }
+}  /* unsigned_divide128 */
+
diff -urN linux-2.2.11-pre2/arch/alpha/math-emu/fp-emul.c linux/arch/alpha/math-emu/fp-emul.c
--- linux-2.2.11-pre2/arch/alpha/math-emu/fp-emul.c	Mon May 10 09:55:21 1999
+++ linux/arch/alpha/math-emu/fp-emul.c	Mon Dec  3 18:52:22 2001
@@ -5,7 +5,24 @@
 
 #include <asm/uaccess.h>
 
-#include "ieee-math.h"
+#include "soft-fp.h"
+
+extern int CMPTXX(void *, void *, void *, int);
+extern int FXTOS(void *, void *);
+extern int FXTOD(void *, void *);
+extern int FDTOS(void *, void *);
+extern int FSTOD(void *, void *);
+extern int FDIVS(void *, void *, void *);
+extern int FDIVD(void *, void *, void *);
+extern int FMULS(void *, void *, void *);
+extern int FMULD(void *, void *, void *);
+extern int FSUBS(void *, void *, void *);
+extern int FSUBD(void *, void *, void *);
+extern int FADDS(void *, void *, void *);
+extern int FADDD(void *, void *, void *);
+extern int FDTOX(void *, void *);
+extern int FSQRTS(void *, void *);
+extern int FSQRTD(void *, void *);
 
 #define	OPC_PAL		0x00
 
@@ -59,6 +76,8 @@
 
 extern unsigned long alpha_read_fp_reg (unsigned long reg);
 extern void alpha_write_fp_reg (unsigned long reg, unsigned long val);
+extern unsigned long alpha_read_fp_reg_s (unsigned long reg);
+extern void alpha_write_fp_reg_s (unsigned long reg, unsigned long val);
 
 
 #ifdef MODULE
@@ -118,43 +137,58 @@
 	fb     = (insn >> 16) &  0x1f;
 	fa     = (insn >> 21) &  0x1f;
 	func   = (insn >>  5) & 0x7ff;
-	mode   = (insn >>  5) & 0xc0;
+	mode   = (insn >>  11) & 0x3;
 	op_fun = insn & OP_FUN(0x3f, 0x3f);
 	
-	va = alpha_read_fp_reg(fa);
-	vb = alpha_read_fp_reg(fb);
 	fpcr = rdfpcr();
 
 	/*
 	 * Try the operation in software.  First, obtain the rounding
-	 * mode...
+	 * mode and set it in the task struct
 	 */
-	if (mode == 0xc0) {
+	current->tss.flags &= ~IEEE_CURRENT_RM_MASK;
+	if (mode == 3) {
 	    /* dynamic---get rounding mode from fpcr: */
-	    mode = ((fpcr & FPCR_DYN_MASK) >> FPCR_DYN_SHIFT) << ROUND_SHIFT;
+	    current->tss.flags |= 
+		(((fpcr&FPCR_DYN_MASK)>>FPCR_DYN_SHIFT)<<IEEE_CURRENT_RM_SHIFT);
+	}
+	else {
+	    current->tss.flags |= (mode << IEEE_CURRENT_RM_SHIFT);
 	}
-	mode |= (fpcw & IEEE_TRAP_ENABLE_MASK);
 
-	if ((IEEE_TRAP_ENABLE_MASK & 0xc0)) {
+	/* JRP - What is this test supposed to check for? */
+	if ((IEEE_TRAP_ENABLE_MASK & 0x80 /* was 0xc0 */)) {
 		extern int something_is_wrong (void);
 		something_is_wrong();
 	}
 
 	switch (op_fun) {
 	      case FLTI_FUNC_CMPTEQ:
-		res = ieee_CMPTEQ(va, vb, &vc);
+		va = alpha_read_fp_reg(fa);
+		vb = alpha_read_fp_reg(fb);
+		res = CMPTXX(&vc, &vb, &va, CMPTXX_EQ);
+		alpha_write_fp_reg(fc, vc);
 		break;
 
 	      case FLTI_FUNC_CMPTLT:
-		res = ieee_CMPTLT(va, vb, &vc);
+		va = alpha_read_fp_reg(fa);
+		vb = alpha_read_fp_reg(fb);
+		res = CMPTXX(&vc, &vb, &va, CMPTXX_LT);
+		alpha_write_fp_reg(fc, vc);
 		break;
 
 	      case FLTI_FUNC_CMPTLE:
-		res = ieee_CMPTLE(va, vb, &vc);
+		va = alpha_read_fp_reg(fa);
+		vb = alpha_read_fp_reg(fb);
+		res = CMPTXX(&vc, &vb, &va, CMPTXX_LE);
+		alpha_write_fp_reg(fc, vc);
 		break;
 
 	      case FLTI_FUNC_CMPTUN:
-		res = ieee_CMPTUN(va, vb, &vc);
+		va = alpha_read_fp_reg(fa);
+		vb = alpha_read_fp_reg(fb);
+		res = CMPTXX(&vc, &vb, &va, CMPTXX_UN);
+		alpha_write_fp_reg(fc, vc);
 		break;
 
 	      case FLTL_FUNC_CVTQL:
@@ -164,17 +198,23 @@
 		 * ops.  We return the result the hw would have
 		 * computed.
 		 */
+		vb = alpha_read_fp_reg(fb);
 		vc = ((vb & 0xc0000000) << 32 |	/* sign and msb */
 		      (vb & 0x3fffffff) << 29);	/* rest of the integer */
-		res = FPCR_INV;
+		res = EFLAG_INVALID;
+		alpha_write_fp_reg(fc, vc);
 		break;
 
 	      case FLTI_FUNC_CVTQS:
-		res = ieee_CVTQS(mode, vb, &vc);
+		vb = alpha_read_fp_reg(fb);
+		res = FXTOS(&vc, &vb);
+		alpha_write_fp_reg_s(fc, vc);
 		break;
 
 	      case FLTI_FUNC_CVTQT:
-		res = ieee_CVTQT(mode, vb, &vc);
+		vb = alpha_read_fp_reg(fb);
+		res = FXTOD(&vc, &vb);
+		alpha_write_fp_reg(fc, vc);
 		break;
 
 	      case FLTI_FUNC_CVTTS_or_CVTST:
@@ -184,54 +224,88 @@
 			 * qualifier isn't set, we wouldn't be here in
 			 * the first place...
 			 */
-			res = ieee_CVTST(mode, vb, &vc);
+			vb = alpha_read_fp_reg_s(fb);
+			res = FSTOD(&vc, &vb);
+			alpha_write_fp_reg(fc, vc);
 		} else {
-			res = ieee_CVTTS(mode, vb, &vc);
+			vb = alpha_read_fp_reg(fb);
+			res = FDTOS(&vc, &vb);
+			alpha_write_fp_reg_s(fc, vc);
 		}
 		break; 
 
 	      case FLTI_FUNC_DIVS:
-		res = ieee_DIVS(mode, va, vb, &vc);
+		va = alpha_read_fp_reg_s(fa);
+		vb = alpha_read_fp_reg_s(fb);
+		res = FDIVS(&vc, &vb, &va);
+		alpha_write_fp_reg_s(fc, vc);
 		break;
 
 	      case FLTI_FUNC_DIVT:
-		res = ieee_DIVT(mode, va, vb, &vc);
+		va = alpha_read_fp_reg(fa);
+		vb = alpha_read_fp_reg(fb);
+		res = FDIVD(&vc, &vb, &va);
+		alpha_write_fp_reg(fc, vc);
 		break;
 
 	      case FLTI_FUNC_MULS:
-		res = ieee_MULS(mode, va, vb, &vc);
+		va = alpha_read_fp_reg_s(fa);
+		vb = alpha_read_fp_reg_s(fb);
+		res = FMULS(&vc, &vb, &va);
+		alpha_write_fp_reg_s(fc, vc);
 		break;
 
 	      case FLTI_FUNC_MULT:
-		res = ieee_MULT(mode, va, vb, &vc);
+		va = alpha_read_fp_reg(fa);
+		vb = alpha_read_fp_reg(fb);
+		res = FMULD(&vc, &vb, &va);
+		alpha_write_fp_reg(fc, vc);
 		break;
 
 	      case FLTI_FUNC_SUBS:
-		res = ieee_SUBS(mode, va, vb, &vc);
+		va = alpha_read_fp_reg_s(fa);
+		vb = alpha_read_fp_reg_s(fb);
+		res = FSUBS(&vc, &vb, &va);
+		alpha_write_fp_reg_s(fc, vc);
 		break;
 
 	      case FLTI_FUNC_SUBT:
-		res = ieee_SUBT(mode, va, vb, &vc);
+		va = alpha_read_fp_reg(fa);
+		vb = alpha_read_fp_reg(fb);
+		res = FSUBD(&vc, &vb, &va);
+		alpha_write_fp_reg(fc, vc);
 		break;
 
 	      case FLTI_FUNC_ADDS:
-		res = ieee_ADDS(mode, va, vb, &vc);
+		va = alpha_read_fp_reg_s(fa);
+		vb = alpha_read_fp_reg_s(fb);
+		res = FADDS(&vc, &vb, &va);
+		alpha_write_fp_reg_s(fc, vc);
 		break;
 
 	      case FLTI_FUNC_ADDT:
-		res = ieee_ADDT(mode, va, vb, &vc);
+		va = alpha_read_fp_reg(fa);
+		vb = alpha_read_fp_reg(fb);
+		res = FADDD(&vc, &vb, &va);
+		alpha_write_fp_reg(fc, vc);
 		break;
 
 	      case FLTI_FUNC_CVTTQ:
-		res = ieee_CVTTQ(mode, vb, &vc);
+		vb = alpha_read_fp_reg(fb);
+		res = FDTOX(&vc, &vb);
+		alpha_write_fp_reg(fc, vc);
 		break;
 
 	      case FLTC_FUNC_SQRTS:
-		res = ieee_SQRTS(mode, vb, &vc);
+		vb = alpha_read_fp_reg_s(fb);
+		res = FSQRTS(&vc, &vb);
+		alpha_write_fp_reg_s(fc, vc);
 		break;
 
 	      case FLTC_FUNC_SQRTT:
-		res = ieee_SQRTT(mode, vb, &vc);
+		vb = alpha_read_fp_reg(fb);
+		res = FSQRTD(&vc, &vb);
+		alpha_write_fp_reg(fc, vc);
 		break;
 
 	      default:
@@ -255,7 +329,7 @@
 	 */
 	if (res) {
 		/* Record exceptions in software control word.  */
-		current->tss.flags = fpcw |= res >> 35;
+		current->tss.flags = fpcw |= (res << IEEE_STATUS_TO_EXCSUM_SHIFT);
 
 		/* Update hardware control register */
 		fpcr &= (~FPCR_MASK | FPCR_DYN_MASK);
@@ -263,18 +337,17 @@
 		wrfpcr(fpcr);
 
 		/* Do we generate a signal?  */
-		if (res >> 51 & fpcw & IEEE_TRAP_ENABLE_MASK) {
+		if (res & fpcw & IEEE_TRAP_ENABLE_MASK) {
 			MOD_DEC_USE_COUNT;
 			return 0;
 		}
 	}
 
-	/*
-	 * Whoo-kay... we got this far, and we're not generating a signal
-	 * to the translated program.  All that remains is to write the
-	 * result:
+	/* We used to write the destination register here, but
+	 * DEC FORTRAN requires that the result *always* be
+	 * written... so we do the write immediately after
+	 * the operations above.
 	 */
-	alpha_write_fp_reg(fc, vc);
 
 	MOD_DEC_USE_COUNT;
 	return 1;
diff -urN linux-2.2.11-pre2/arch/alpha/math-emu/fxtod.c linux/arch/alpha/math-emu/fxtod.c
--- linux-2.2.11-pre2/arch/alpha/math-emu/fxtod.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/alpha/math-emu/fxtod.c	Mon Dec  3 18:52:22 2001
@@ -0,0 +1,11 @@
+#include "soft-fp.h"
+#include "double.h"
+
+int FXTOD(void *rd, void *rs2)
+{
+	FP_DECL_D(R);
+	long a = *(long *)rs2;
+
+	FP_FROM_INT_D(R, a, 64, long);
+	return __FP_PACK_D(rd, R);
+}
diff -urN linux-2.2.11-pre2/arch/alpha/math-emu/fxtos.c linux/arch/alpha/math-emu/fxtos.c
--- linux-2.2.11-pre2/arch/alpha/math-emu/fxtos.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/alpha/math-emu/fxtos.c	Mon Dec  3 18:52:22 2001
@@ -0,0 +1,11 @@
+#include "soft-fp.h"
+#include "single.h"
+
+int FXTOS(void *rd, void *rs2)
+{
+	FP_DECL_S(R);
+	long a = *(long *)rs2;
+
+	FP_FROM_INT_S(R, a, 64, long);
+	return __FP_PACK_S(rd, R);
+}
diff -urN linux-2.2.11-pre2/arch/alpha/math-emu/ieee-math.c linux/arch/alpha/math-emu/ieee-math.c
--- linux-2.2.11-pre2/arch/alpha/math-emu/ieee-math.c	Mon Dec  3 18:51:52 2001
+++ linux/arch/alpha/math-emu/ieee-math.c	Wed Dec 31 16:00:00 1969
@@ -1,1382 +0,0 @@
-/*
- * ieee-math.c - IEEE floating point emulation code
- * Copyright (C) 1989,1990,1991,1995 by
- * Digital Equipment Corporation, Maynard, Massachusetts.
- *
- * Heavily modified for Linux/Alpha.  Changes are Copyright (c) 1995
- * by David Mosberger (davidm@azstarnet.com).
- *
- * This file may be redistributed according to the terms of the
- * GNU General Public License.
- */
-/*
- * The original code did not have any comments. I have created many
- * comments as I fix the bugs in the code.  My comments are based on
- * my observation and interpretation of the code.  If the original
- * author would have spend a few minutes to comment the code, we would
- * never had a problem of misinterpretation.  -HA
- *
- * This code could probably be a lot more optimized (especially the
- * division routine).  However, my foremost concern was to get the
- * IEEE behavior right.  Performance is less critical as these
- * functions are used on exceptional numbers only (well, assuming you
- * don't turn on the "trap on inexact"...).
- */
-#include <linux/sched.h>
-#include "ieee-math.h"
-
-#define STICKY_S	0x20000000	/* both in longword 0 of fraction */
-#define STICKY_T	1
-
-/*
- * Careful: order matters here!
- */
-enum {
-	NaN, QNaN, INFTY, ZERO, DENORM, NORMAL
-};
-
-enum {
-	SINGLE, DOUBLE
-};
-
-typedef unsigned long fpclass_t;
-
-#define IEEE_TMAX	0x7fefffffffffffff
-#define IEEE_SMAX	0x47efffffe0000000
-#define IEEE_SNaN	0xfff00000000f0000
-#define IEEE_QNaN	0xfff8000000000000
-#define IEEE_PINF	0x7ff0000000000000
-#define IEEE_NINF	0xfff0000000000000
-
-
-/*
- * The memory format of S floating point numbers differs from the
- * register format.  In the following, the bitnumbers above the
- * diagram below give the memory format while the numbers below give
- * the register format.
- *
- *	  31 30	     23 22				0
- *	+-----------------------------------------------+
- * S	| s |	exp    |       fraction			|
- *	+-----------------------------------------------+
- *	  63 62	     52 51			      29
- *	
- * For T floating point numbers, the register and memory formats
- * match:
- *
- *	+-------------------------------------------------------------------+
- * T	| s |	     exp	|	    frac | tion			    |
- *	+-------------------------------------------------------------------+
- *	  63 62		      52 51	       32 31			   0
- */
-typedef struct {
-	unsigned long	f[2];	/* bit 55 in f[0] is the factor of 2^0*/
-	int		s;	/* 1 bit sign (0 for +, 1 for -) */
-	int		e;	/* 16 bit signed exponent */
-} EXTENDED;
-
-
-/*
- * Return the sign of a Q integer, S or T fp number in the register
- * format.
- */
-static inline int
-sign (unsigned long a)
-{
-	if ((long) a < 0)
-		return -1;
-	else
-		return 1;
-}
-
-
-static inline long
-cmp128 (const long a[2], const long b[2])
-{
-	if (a[1] < b[1]) return -1;
-	if (a[1] > b[1]) return  1;
-	return a[0] - b[0];
-}
-
-
-static inline void
-sll128 (unsigned long a[2])
-{
-	a[1] = (a[1] << 1) | (a[0] >> 63);
-	a[0] <<= 1;
-}
-
-
-static inline void
-srl128 (unsigned long a[2])
-{
-	a[0] = (a[0] >> 1) | (a[1] << 63);
-	a[1] >>= 1;
-}
-
-
-static inline void
-add128 (const unsigned long a[2], const unsigned long b[2], unsigned long c[2])
-{
-	unsigned long carry = a[0] > (0xffffffffffffffff - b[0]);
-
-	c[0] = a[0] + b[0];
-	c[1] = a[1] + b[1] + carry;
-}
-
-
-static inline void
-sub128 (const unsigned long a[2], const unsigned long b[2], unsigned long c[2])
-{
-	unsigned long borrow = a[0] < b[0];
-
-	c[0] = a[0] - b[0];
-	c[1] = a[1] - b[1] - borrow;
-}
-
-
-static inline void
-mul64 (const unsigned long a, const unsigned long b, unsigned long c[2])
-{
-	c[0] = a * b;
-	asm ("umulh %1,%2,%0" : "=r"(c[1]) : "r"(a), "r"(b));
-}
-
-
-static void
-div128 (unsigned long a[2], unsigned long b[2], unsigned long c[2])
-{
-	unsigned long mask[2] = {1, 0};
-
-	/*
-	 * Shift b until either the sign bit is set or until it is at
-	 * least as big as the dividend:
-	 */
-	while (cmp128(b, a) < 0 && sign(b[1]) >= 0) {
-		sll128(b);
-		sll128(mask);
-	}
-	c[0] = c[1] = 0;
-	do {
-		if (cmp128(a, b) >= 0) {
-			sub128(a, b, a);
-			add128(mask, c, c);
-		}
-		srl128(mask);
-		srl128(b);
-	} while (mask[0] || mask[1]);
-}
-
-
-static void
-normalize (EXTENDED *a)
-{
-	if (!a->f[0] && !a->f[1])
-		return;		/* zero fraction, unnormalizable... */
-	/*
-	 * In "extended" format, the "1" in "1.f" is explicit; it is
-	 * in bit 55 of f[0], and the decimal point is understood to
-	 * be between bit 55 and bit 54.  To normalize, shift the
-	 * fraction until we have a "1" in bit 55.
-	 */
-	if ((a->f[0] & 0xff00000000000000) != 0 || a->f[1] != 0) {
-		/*
-		 * Mantissa is greater than 1.0:
-		 */
-		while ((a->f[0] & 0xff80000000000000) != 0x0080000000000000 ||
-		       a->f[1] != 0)
-		{
-			unsigned long sticky;
-
-			++a->e;
-			sticky = a->f[0] & 1;
-			srl128(a->f);
-			a->f[0] |= sticky;
-		}
-		return;
-	}
-
-	if (!(a->f[0] & 0x0080000000000000)) {
-		/*
-		 * Mantissa is less than 1.0:
-		 */
-		while (!(a->f[0] & 0x0080000000000000)) {
-			--a->e;
-			a->f[0] <<= 1;
-		}
-		return;
-	}
-}
-
-
-static inline fpclass_t
-ieee_fpclass (unsigned long a)
-{
-	unsigned long exp, fract;
-
-	exp   = (a >> 52) & 0x7ff;	/* 11 bits of exponent */
-	fract = a & 0x000fffffffffffff;	/* 52 bits of fraction */
-	if (exp == 0) {
-		if (fract == 0)
-			return ZERO;
-		return DENORM;
-	}
-	if (exp == 0x7ff) {
-		if (fract == 0)
-			return INFTY;
-		if (((fract >> 51) & 1) != 0)
-			return QNaN;
-		return NaN;
-	}
-	return NORMAL;
-}
-
-
-/*
- * Translate S/T fp number in register format into extended format.
- */
-static fpclass_t
-extend_ieee (unsigned long a, EXTENDED *b, int prec)
-{
-	fpclass_t result_kind;
-
-	b->s = a >> 63;
-	b->e = ((a >> 52) & 0x7ff) - 0x3ff;	/* remove bias */
-	b->f[1] = 0;
-	/*
-	 * We shift f[1] left three bits so that the higher order bits
-	 * of the fraction will reside in bits 55 through 0 of f[0].
-	 */
-	b->f[0] = (a & 0x000fffffffffffff) << 3;
-	result_kind = ieee_fpclass(a);
-	if (result_kind == NORMAL) {
-		/* set implied 1. bit: */
-		b->f[0] |= 1UL << 55;
-	} else if (result_kind == DENORM) {
-		if (prec == SINGLE)
-			b->e = -126;
-		else
-			b->e = -1022;
-	}
-	return result_kind;
-}
-
-
-/*
- * INPUT PARAMETERS:
- *       a           a number in EXTENDED format to be converted to
- *                   s-floating format.
- *	 f	     rounding mode and exception enable bits.
- * OUTPUT PARAMETERS:
- *       b          will contain the s-floating number that "a" was
- *                  converted to (in register format).
- */
-static unsigned long
-make_s_ieee (long f, EXTENDED *a, unsigned long *b)
-{
-	unsigned long res, sticky;
-
-	if (!a->e && !a->f[0] && !a->f[1]) {
-		*b = (unsigned long) a->s << 63;	/* return +/-0 */
-		return 0;
-	}
-
-	normalize(a);
-	res = 0;
-
-	if (a->e < -0x7e) {
-		res = FPCR_INE;
-		if (f & IEEE_TRAP_ENABLE_UNF) {
-			res |= FPCR_UNF;
-			a->e += 0xc0;	/* scale up result by 2^alpha */
-		} else {
-			/* try making denormalized number: */
-			while (a->e < -0x7e) {
-				++a->e;
-				sticky = a->f[0] & 1;
-				srl128(a->f);
-				if (!a->f[0] && !a->f[0]) {
-					/* underflow: replace with exact 0 */
-					res |= FPCR_UNF;
-					break;
-				}
-				a->f[0] |= sticky;
-			}
-			a->e = -0x3ff;
-		}
-	}
-	if (a->e >= 0x80) {
-		res = FPCR_OVF | FPCR_INE;
-		if (f & IEEE_TRAP_ENABLE_OVF) {
-			a->e -= 0xc0;	/* scale down result by 2^alpha */
-		} else {
-			/*
-			 * Overflow without trap enabled, substitute
-			 * result according to rounding mode:
-			 */
-			switch (RM(f)) {
-			      case ROUND_NEAR:
-				*b = IEEE_PINF;
-				break;
-
-			      case ROUND_CHOP:
-				*b = IEEE_SMAX;
-				break;
-
-			      case ROUND_NINF:
-				if (a->s) {
-					*b = IEEE_PINF;
-				} else {
-					*b = IEEE_SMAX;
-				}
-				break;
-
-			      case ROUND_PINF: 
-				if (a->s) {
-					*b = IEEE_SMAX;
-				} else {
-					*b = IEEE_PINF;
-				}
-				break;
-			}
-			*b |= ((unsigned long) a->s << 63);
-			return res;
-		}
-	}
-
-	*b = (((unsigned long) a->s << 63) |
-	      (((unsigned long) a->e + 0x3ff) << 52) |
-	      ((a->f[0] >> 3) & 0x000fffffe0000000));
-	return res;
-}
-
-
-static unsigned long
-make_t_ieee (long f, EXTENDED *a, unsigned long *b)
-{
-	unsigned long res, sticky;
-
-	if (!a->e && !a->f[0] && !a->f[1]) {
-		*b = (unsigned long) a->s << 63;	/* return +/-0 */
-		return 0;
-	}
-
-	normalize(a);
-	res = 0;
-	if (a->e < -0x3fe) {
-		res = FPCR_INE;
-		if (f & IEEE_TRAP_ENABLE_UNF) {
-			res |= FPCR_UNF;
-			a->e += 0x600;
-		} else {
-			/* try making denormalized number: */
-			while (a->e < -0x3fe) {
-				++a->e;
-				sticky = a->f[0] & 1;
-				srl128(a->f);
-				if (!a->f[0] && !a->f[0]) {
-					/* underflow: replace with exact 0 */
-					res |= FPCR_UNF;
-					break;
-				}
-				a->f[0] |= sticky;
-			}
-			a->e = -0x3ff;
-		}
-	}
-	if (a->e >= 0x3ff) {
-		res = FPCR_OVF | FPCR_INE;
-		if (f & IEEE_TRAP_ENABLE_OVF) {
-			a->e -= 0x600;	/* scale down result by 2^alpha */
-		} else {
-			/*
-			 * Overflow without trap enabled, substitute
-			 * result according to rounding mode:
-			 */
-			switch (RM(f)) {
-			      case ROUND_NEAR:
-				*b = IEEE_PINF;
-				break;
-
-			      case ROUND_CHOP:
-				*b = IEEE_TMAX;
-				break;
-
-			      case ROUND_NINF:
-				if (a->s) {
-					*b = IEEE_PINF;
-				} else {
-					*b = IEEE_TMAX;
-				}
-				break;
-
-			      case ROUND_PINF: 
-				if (a->s) {
-					*b = IEEE_TMAX;
-				} else {
-					*b = IEEE_PINF;
-				}
-				break;
-			}
-			*b |= ((unsigned long) a->s << 63);
-			return res;
-		}
-	}
-	*b = (((unsigned long) a->s << 63) |
-	      (((unsigned long) a->e + 0x3ff) << 52) |
-	      ((a->f[0] >> 3) & 0x000fffffffffffff));
-	return res;
-}
-
-
-/*
- * INPUT PARAMETERS:
- *       a          EXTENDED format number to be rounded.
- *       rm	    integer with value ROUND_NEAR, ROUND_CHOP, etc.
- *                  indicates how "a" should be rounded to produce "b".
- * OUTPUT PARAMETERS:
- *       b          s-floating number produced by rounding "a".
- * RETURN VALUE:
- *       if no errors occurred, will be zero.  Else will contain flags
- *       like FPCR_INE_OP, etc.
- */
-static unsigned long
-round_s_ieee (int f, EXTENDED *a, unsigned long *b)
-{
-	unsigned long diff1, diff2, res = 0;
-	EXTENDED z1, z2;
-
-	if (!(a->f[0] & 0xffffffff)) {
-		return make_s_ieee(f, a, b);	/* no rounding error */
-	}
-
-	/*
-	 * z1 and z2 are the S-floating numbers with the next smaller/greater
-	 * magnitude than a, respectively.
-	 */
-	z1.s = z2.s = a->s;
-	z1.e = z2.e = a->e;
-	z1.f[0] = z2.f[0] = a->f[0] & 0xffffffff00000000;
-	z1.f[1] = z2.f[1] = 0;
-	z2.f[0] += 0x100000000;	/* next bigger S float number */
-
-	switch (RM(f)) {
-	      case ROUND_NEAR:
-		diff1 = a->f[0] - z1.f[0];
-		diff2 = z2.f[0] - a->f[0];
-		if (diff1 > diff2)
-			res = make_s_ieee(f, &z2, b);
-		else if (diff2 > diff1)
-			res = make_s_ieee(f, &z1, b);
-		else
-			/* equal distance: round towards even */
-			if (z1.f[0] & 0x100000000)
-				res = make_s_ieee(f, &z2, b);
-			else
-				res = make_s_ieee(f, &z1, b);
-		break;
-
-	      case ROUND_CHOP:
-		res = make_s_ieee(f, &z1, b);
-		break;
-
-	      case ROUND_PINF:
-		if (a->s) {
-			res = make_s_ieee(f, &z1, b);
-		} else {
-			res = make_s_ieee(f, &z2, b);
-		}
-		break;
-
-	      case ROUND_NINF:
-		if (a->s) {
-			res = make_s_ieee(f, &z2, b);
-		} else {
-			res = make_s_ieee(f, &z1, b);
-		}
-		break;
-	}
-	return FPCR_INE | res;
-}
-
-
-static unsigned long
-round_t_ieee (int f, EXTENDED *a, unsigned long *b)
-{
-	unsigned long diff1, diff2, res;
-	EXTENDED z1, z2;
-
-	if (!(a->f[0] & 0x7)) {
-		/* no rounding error */
-		return make_t_ieee(f, a, b);
-	}
-
-	z1.s = z2.s = a->s;
-	z1.e = z2.e = a->e;
-	z1.f[0] = z2.f[0] = a->f[0] & ~0x7;
-	z1.f[1] = z2.f[1] = 0;
-	z2.f[0] += (1 << 3);
-
-	res = 0;
-	switch (RM(f)) {
-	      case ROUND_NEAR:
-		diff1 = a->f[0] - z1.f[0];
-		diff2 = z2.f[0] - a->f[0];
-		if (diff1 > diff2)
-			res = make_t_ieee(f, &z2, b);
-		else if (diff2 > diff1)
-			res = make_t_ieee(f, &z1, b);
-		else
-			/* equal distance: round towards even */
-			if (z1.f[0] & (1 << 3))
-				res = make_t_ieee(f, &z2, b);
-			else
-				res = make_t_ieee(f, &z1, b);
-		break;
-
-	      case ROUND_CHOP:
-		res = make_t_ieee(f, &z1, b);
-		break;
-
-	      case ROUND_PINF:
-		if (a->s) {
-			res = make_t_ieee(f, &z1, b);
-		} else {
-			res = make_t_ieee(f, &z2, b);
-		}
-		break;
-
-	      case ROUND_NINF:
-		if (a->s) {
-			res = make_t_ieee(f, &z2, b);
-		} else {
-			res = make_t_ieee(f, &z1, b);
-		}
-		break;
-	}
-	return FPCR_INE | res;
-}
-
-
-static fpclass_t
-add_kernel_ieee (EXTENDED *op_a, EXTENDED *op_b, EXTENDED *op_c)
-{
-	unsigned long mask, fa, fb, fc;
-	int diff;
-
-	diff = op_a->e - op_b->e;
-	fa = op_a->f[0];
-	fb = op_b->f[0];
-	if (diff < 0) {
-		diff = -diff;
-		op_c->e = op_b->e;
-		mask = (1UL << diff) - 1;
-		fa >>= diff;
-		if (op_a->f[0] & mask) {
-			fa |= 1;		/* set sticky bit */
-		}
-	} else {
-		op_c->e = op_a->e;
-		mask = (1UL << diff) - 1;
-		fb >>= diff;
-		if (op_b->f[0] & mask) {
-			fb |= 1;		/* set sticky bit */
-		}
-	}
-	if (op_a->s)
-		fa = -fa;
-	if (op_b->s)
-		fb = -fb;
-	fc = fa + fb;
-	op_c->f[1] = 0;
-	op_c->s = fc >> 63;
-	if (op_c->s) {
-		fc = -fc;
-	}
-	op_c->f[0] = fc;
-	normalize(op_c);
-	return 0;
-}
-
-
-/*
- * converts s-floating "a" to t-floating "b".
- *
- * INPUT PARAMETERS:
- *       a           a s-floating number to be converted
- *       f           the rounding mode (ROUND_NEAR, etc. )
- * OUTPUT PARAMETERS:
- *       b           the t-floating number that "a" is converted to.
- * RETURN VALUE:
- *       error flags - i.e., zero if no errors occurred,
- *       FPCR_INV if invalid operation occurred, etc.
- */
-unsigned long
-ieee_CVTST (int f, unsigned long a, unsigned long *b)
-{
-	EXTENDED temp;
-	fpclass_t a_type;
-
-	a_type = extend_ieee(a, &temp, SINGLE);
-	if (a_type >= NaN && a_type <= INFTY) {
-		*b = a;
-		if (a_type == NaN) {
-			*b |= (1UL << 51);	/* turn SNaN into QNaN */
-			return FPCR_INV;
-		}
-		return 0;
-	}
-	return round_t_ieee(f, &temp, b);
-}
-
-
-/*
- * converts t-floating "a" to s-floating "b".
- *
- * INPUT PARAMETERS:
- *       a           a t-floating number to be converted
- *       f           the rounding mode (ROUND_NEAR, etc. )
- * OUTPUT PARAMETERS:
- *       b           the s-floating number that "a" is converted to.
- * RETURN VALUE:
- *       error flags - i.e., zero if no errors occurred,
- *       FPCR_INV if invalid operation occurred, etc.
- */
-unsigned long
-ieee_CVTTS (int f, unsigned long a, unsigned long *b)
-{
-	EXTENDED temp;
-	fpclass_t a_type;
-
-	a_type = extend_ieee(a, &temp, DOUBLE);
-	if (a_type >= NaN && a_type <= INFTY) {
-		*b = a;
-		if (a_type == NaN) {
-			*b |= (1UL << 51);	/* turn SNaN into QNaN */
-			return FPCR_INV;
-		}
-		return 0;
-	}
-	return round_s_ieee(f, &temp, b);
-}
-
-
-/*
- * converts q-format (64-bit integer) "a" to s-floating "b".
- *
- * INPUT PARAMETERS:
- *       a           an 64-bit integer to be converted.
- *       f           the rounding mode (ROUND_NEAR, etc. )
- * OUTPUT PARAMETERS:
- *       b           the s-floating number "a" is converted to.
- * RETURN VALUE:
- *       error flags - i.e., zero if no errors occurred,
- *       FPCR_INV if invalid operation occurred, etc.
- */
-unsigned long
-ieee_CVTQS (int f, unsigned long a, unsigned long *b)
-{
-	EXTENDED op_b;
-
-	op_b.s    = 0;
-	op_b.f[0] = a;
-	op_b.f[1] = 0;
-	if (sign(a) < 0) {
-		op_b.s = 1;
-		op_b.f[0] = -a;
-	}
-	op_b.e = 55;
-	normalize(&op_b);
-	return round_s_ieee(f, &op_b, b);
-}
-
-
-/*
- * converts 64-bit integer "a" to t-floating "b".
- *
- * INPUT PARAMETERS:
- *       a           a 64-bit integer to be converted.
- *       f           the rounding mode (ROUND_NEAR, etc.)
- * OUTPUT PARAMETERS:
- *       b           the t-floating number "a" is converted to.
- * RETURN VALUE:
- *       error flags - i.e., zero if no errors occurred,
- *       FPCR_INV if invalid operation occurred, etc.
- */
-unsigned long
-ieee_CVTQT (int f, long a, unsigned long *b)
-{
-	EXTENDED op_b;
-
-	if (a != 0) {
-		op_b.s = (a < 0 ? 1 : 0);
-		op_b.f[0] = (a < 0 ? -a : a);
-		op_b.f[1] = 0;
-		op_b.e = 55;
-		normalize(&op_b);
-		return round_t_ieee(f, &op_b, b);
-	} else {
-		*b = 0;
-		return 0;
-	}
-}
-
-
-/*
- * converts t-floating "a" to 64-bit integer (q-format) "b".
- *
- * INPUT PARAMETERS:
- *       a           a t-floating number to be converted.
- *       f           the rounding mode (ROUND_NEAR, etc. )
- * OUTPUT PARAMETERS:
- *       b           the 64-bit integer "a" is converted to.
- * RETURN VALUE:
- *       error flags - i.e., zero if no errors occurred,
- *       FPCR_INV if invalid operation occurred, etc.
- */
-unsigned long
-ieee_CVTTQ (int f, unsigned long a, unsigned long *pb)
-{
-	unsigned int midway;
-	unsigned long ov, uv, res, b;
-	fpclass_t a_type;
-	EXTENDED temp;
-
-	a_type = extend_ieee(a, &temp, DOUBLE);
-
-	b = 0x7fffffffffffffff;
-	res = FPCR_INV;
-	if (a_type == NaN || a_type == INFTY)
-		goto out;
-
-	res = 0;
-	if (a_type == QNaN)
-		goto out;
-
-	if (temp.e > 0) {
-		ov = 0;
-		while (temp.e > 0) {
-			--temp.e;
-			ov |= temp.f[1] >> 63;
-			sll128(temp.f);
-		}
-		if (ov || (temp.f[1] & 0xffc0000000000000))
-			res |= FPCR_IOV | FPCR_INE;
-	}
-	else if (temp.e < 0) {
-		while (temp.e < 0) {
-			++temp.e;
-			uv = temp.f[0] & 1;		/* save sticky bit */
-			srl128(temp.f);
-			temp.f[0] |= uv;
-		}
-	}
-	b = (temp.f[1] << 9) | (temp.f[0] >> 55);
-
-	/*
-	 * Notice: the fraction is only 52 bits long.  Thus, rounding
-	 * cannot possibly result in an integer overflow.
-	 */
-	switch (RM(f)) {
-	      case ROUND_NEAR:
-		if (temp.f[0] & 0x0040000000000000) {
-			midway = (temp.f[0] & 0x003fffffffffffff) == 0;
-			if ((midway && (temp.f[0] & 0x0080000000000000)) ||
-			    !midway)
-				++b;
-		}
-		break;
-
-	      case ROUND_PINF:
-		b += ((temp.f[0] & 0x007fffffffffffff) != 0 && !temp.s);
-		break;
-
-	      case ROUND_NINF:
-		b += ((temp.f[0] & 0x007fffffffffffff) != 0 && temp.s);
-		break;
-
-	      case ROUND_CHOP:
-		/* no action needed */
-		break;
-	}
-	if ((temp.f[0] & 0x007fffffffffffff) != 0)
-		res |= FPCR_INE;
-
-	if (temp.s) {
-		b = -b;
-	}
-
-out:
-	*pb = b;
-	return res;
-}
-
-
-unsigned long
-ieee_CMPTEQ (unsigned long a, unsigned long b, unsigned long *c)
-{
-	EXTENDED op_a, op_b;
-	fpclass_t a_type, b_type;
-
-	*c = 0;
-	a_type = extend_ieee(a, &op_a, DOUBLE);
-	b_type = extend_ieee(b, &op_b, DOUBLE);
-	if (a_type == NaN || b_type == NaN)
-		return FPCR_INV;
-	if (a_type == QNaN || b_type == QNaN)
-		return 0;
-
-	if ((op_a.e == op_b.e && op_a.s == op_b.s &&
-	     op_a.f[0] == op_b.f[0] && op_a.f[1] == op_b.f[1]) ||
-	    (a_type == ZERO && b_type == ZERO))
-		*c = 0x4000000000000000;
-	return 0;
-}
-
-
-unsigned long
-ieee_CMPTLT (unsigned long a, unsigned long b, unsigned long *c)
-{
-	fpclass_t a_type, b_type;
-	EXTENDED op_a, op_b;
-
-	*c = 0;
-	a_type = extend_ieee(a, &op_a, DOUBLE);
-	b_type = extend_ieee(b, &op_b, DOUBLE);
-	if (a_type == NaN || b_type == NaN)
-		return FPCR_INV;
-	if (a_type == QNaN || b_type == QNaN)
-		return 0;
-
-	if ((op_a.s == 1 && op_b.s == 0 &&
-	     (a_type != ZERO || b_type != ZERO)) ||
-	    (op_a.s == 1 && op_b.s == 1 &&
-	     (op_a.e > op_b.e || (op_a.e == op_b.e &&
-				  cmp128(op_a.f, op_b.f) > 0))) ||
-	    (op_a.s == 0 && op_b.s == 0 &&
-	     (op_a.e < op_b.e || (op_a.e == op_b.e &&
-				  cmp128(op_a.f,op_b.f) < 0))))
-		*c = 0x4000000000000000;
-	return 0;
-}
-
-
-unsigned long
-ieee_CMPTLE (unsigned long a, unsigned long b, unsigned long *c)
-{
-	fpclass_t a_type, b_type;
-	EXTENDED op_a, op_b;
-
-	*c = 0;
-	a_type = extend_ieee(a, &op_a, DOUBLE);
-	b_type = extend_ieee(b, &op_b, DOUBLE);
-	if (a_type == NaN || b_type == NaN)
-		return FPCR_INV;
-	if (a_type == QNaN || b_type == QNaN)
-		return 0;
-
-	if ((a_type == ZERO && b_type == ZERO) ||
-	    (op_a.s == 1 && op_b.s == 0) ||
-	    (op_a.s == 1 && op_b.s == 1 &&
-	     (op_a.e > op_b.e || (op_a.e == op_b.e &&
-				  cmp128(op_a.f,op_b.f) >= 0))) ||
-	    (op_a.s == 0 && op_b.s == 0 &&
-	     (op_a.e < op_b.e || (op_a.e == op_b.e &&
-				  cmp128(op_a.f,op_b.f) <= 0))))
-		*c = 0x4000000000000000;
-	return 0;
-}
-
-
-unsigned long
-ieee_CMPTUN (unsigned long a, unsigned long b, unsigned long *c)
-{
-	fpclass_t a_type, b_type;
-	EXTENDED op_a, op_b;
-
-	*c = 0x4000000000000000;
-	a_type = extend_ieee(a, &op_a, DOUBLE);
-	b_type = extend_ieee(b, &op_b, DOUBLE);
-	if (a_type == NaN || b_type == NaN)
-		return FPCR_INV;
-	if (a_type == QNaN || b_type == QNaN)
-		return 0;
-	*c = 0;
-	return 0;
-}
-
-
-/*
- * Add a + b = c, where a, b, and c are ieee s-floating numbers.  "f"
- * contains the rounding mode etc.
- */
-unsigned long
-ieee_ADDS (int f, unsigned long a, unsigned long b, unsigned long *c)
-{
-	fpclass_t a_type, b_type;
-	EXTENDED op_a, op_b, op_c;
-
-	a_type = extend_ieee(a, &op_a, SINGLE);
-	b_type = extend_ieee(b, &op_b, SINGLE);
-	if ((a_type >= NaN && a_type <= INFTY) ||
-	    (b_type >= NaN && b_type <= INFTY))
-	{
-		/* propagate NaNs according to arch. ref. handbook: */
-		if (b_type == QNaN)
-			*c = b;
-		else if (b_type == NaN)
-			*c = b | (1UL << 51);
-		else if (a_type == QNaN)
-			*c = a;
-		else if (a_type == NaN)
-			*c = a | (1UL << 51);
-
-		if (a_type == NaN || b_type == NaN)
-			return FPCR_INV;
-		if (a_type == QNaN || b_type == QNaN)
-			return 0;
-
-		if (a_type == INFTY && b_type == INFTY && sign(a) != sign(b)) {
-			*c = IEEE_QNaN;
-			return FPCR_INV;
-		}
-		if (a_type == INFTY)
-			*c = a;
-		else
-			*c = b;
-		return 0;
-	}
-
-	add_kernel_ieee(&op_a, &op_b, &op_c);
-	/* special case for -0 + -0 ==> -0 */
-	if (a_type == ZERO && b_type == ZERO)
-		op_c.s = op_a.s && op_b.s;
-	return round_s_ieee(f, &op_c, c);
-}
-
-
-/*
- * Add a + b = c, where a, b, and c are ieee t-floating numbers.  "f"
- * contains the rounding mode etc.
- */
-unsigned long
-ieee_ADDT (int f, unsigned long a, unsigned long b, unsigned long *c)
-{
-	fpclass_t a_type, b_type;
-	EXTENDED op_a, op_b, op_c;
-
-	a_type = extend_ieee(a, &op_a, DOUBLE);
-	b_type = extend_ieee(b, &op_b, DOUBLE);
-	if ((a_type >= NaN && a_type <= INFTY) ||
-	    (b_type >= NaN && b_type <= INFTY))
-	{
-		/* propagate NaNs according to arch. ref. handbook: */
-		if (b_type == QNaN)
-			*c = b;
-		else if (b_type == NaN)
-			*c = b | (1UL << 51);
-		else if (a_type == QNaN)
-			*c = a;
-		else if (a_type == NaN)
-			*c = a | (1UL << 51);
-
-		if (a_type == NaN || b_type == NaN)
-			return FPCR_INV;
-		if (a_type == QNaN || b_type == QNaN)
-			return 0;
-
-		if (a_type == INFTY && b_type == INFTY && sign(a) != sign(b)) {
-			*c = IEEE_QNaN;
-			return FPCR_INV;
-		}
-		if (a_type == INFTY)
-			*c = a;
-		else
-			*c = b;
-		return 0;
-	}
-	add_kernel_ieee(&op_a, &op_b, &op_c);
-	/* special case for -0 + -0 ==> -0 */
-	if (a_type == ZERO && b_type == ZERO)
-		op_c.s = op_a.s && op_b.s;
-
-	return round_t_ieee(f, &op_c, c);
-}
-
-
-/*
- * Subtract a - b = c, where a, b, and c are ieee s-floating numbers.
- * "f" contains the rounding mode etc.
- */
-unsigned long
-ieee_SUBS (int f, unsigned long a, unsigned long b, unsigned long *c)
-{
-	fpclass_t a_type, b_type;
-	EXTENDED op_a, op_b, op_c;
-
-	a_type = extend_ieee(a, &op_a, SINGLE);
-	b_type = extend_ieee(b, &op_b, SINGLE);
-	if ((a_type >= NaN && a_type <= INFTY) ||
-	    (b_type >= NaN && b_type <= INFTY))
-	{
-		/* propagate NaNs according to arch. ref. handbook: */
-		if (b_type == QNaN)
-			*c = b;
-		else if (b_type == NaN)
-			*c = b | (1UL << 51);
-		else if (a_type == QNaN)
-			*c = a;
-		else if (a_type == NaN)
-			*c = a | (1UL << 51);
-
-		if (a_type == NaN || b_type == NaN)
-			return FPCR_INV;
-		if (a_type == QNaN || b_type == QNaN)
-			return 0;
-
-		if (a_type == INFTY && b_type == INFTY && sign(a) == sign(b)) {
-			*c = IEEE_QNaN;
-			return FPCR_INV;
-		}
-		if (a_type == INFTY)
-			*c = a;
-		else
-			*c = b ^ (1UL << 63);
-		return 0;
-	}
-	op_b.s = !op_b.s;
-	add_kernel_ieee(&op_a, &op_b, &op_c);
-	/* special case for -0 - +0 ==> -0 */
-	if (a_type == ZERO && b_type == ZERO)
-		op_c.s = op_a.s && op_b.s;
-
-	return round_s_ieee(f, &op_c, c);
-}
-
-
-/*
- * Subtract a - b = c, where a, b, and c are ieee t-floating numbers.
- * "f" contains the rounding mode etc.
- */
-unsigned long
-ieee_SUBT (int f, unsigned long a, unsigned long b, unsigned long *c)
-{
-	fpclass_t a_type, b_type;
-	EXTENDED op_a, op_b, op_c;
-
-	a_type = extend_ieee(a, &op_a, DOUBLE);
-	b_type = extend_ieee(b, &op_b, DOUBLE);
-	if ((a_type >= NaN && a_type <= INFTY) ||
-	    (b_type >= NaN && b_type <= INFTY))
-	{
-		/* propagate NaNs according to arch. ref. handbook: */
-		if (b_type == QNaN)
-			*c = b;
-		else if (b_type == NaN)
-			*c = b | (1UL << 51);
-		else if (a_type == QNaN)
-			*c = a;
-		else if (a_type == NaN)
-			*c = a | (1UL << 51);
-
-		if (a_type == NaN || b_type == NaN)
-			return FPCR_INV;
-		if (a_type == QNaN || b_type == QNaN)
-			return 0;
-
-		if (a_type == INFTY && b_type == INFTY && sign(a) == sign(b)) {
-			*c = IEEE_QNaN;
-			return FPCR_INV;
-		}
-		if (a_type == INFTY)
-			*c = a;
-		else
-			*c = b ^ (1UL << 63);
-		return 0;
-	}
-	op_b.s = !op_b.s;
-	add_kernel_ieee(&op_a, &op_b, &op_c);
-	/* special case for -0 - +0 ==> -0 */
-	if (a_type == ZERO && b_type == ZERO)
-		op_c.s = op_a.s && op_b.s;
-
-	return round_t_ieee(f, &op_c, c);
-}
-
-
-/*
- * Multiply a x b = c, where a, b, and c are ieee s-floating numbers.
- * "f" contains the rounding mode.
- */
-unsigned long
-ieee_MULS (int f, unsigned long a, unsigned long b, unsigned long *c)
-{
-	fpclass_t a_type, b_type;
-	EXTENDED op_a, op_b, op_c;
-
-	a_type = extend_ieee(a, &op_a, SINGLE);
-	b_type = extend_ieee(b, &op_b, SINGLE);
-	if ((a_type >= NaN && a_type <= INFTY) ||
-	    (b_type >= NaN && b_type <= INFTY))
-	{
-		/* propagate NaNs according to arch. ref. handbook: */
-		if (b_type == QNaN)
-			*c = b;
-		else if (b_type == NaN)
-			*c = b | (1UL << 51);
-		else if (a_type == QNaN)
-			*c = a;
-		else if (a_type == NaN)
-			*c = a | (1UL << 51);
-
-		if (a_type == NaN || b_type == NaN)
-			return FPCR_INV;
-		if (a_type == QNaN || b_type == QNaN)
-			return 0;
-
-		if ((a_type == INFTY && b_type == ZERO) ||
-		    (b_type == INFTY && a_type == ZERO))
-		{
-			*c = IEEE_QNaN;		/* return canonical QNaN */
-			return FPCR_INV;
-		}
-		if (a_type == INFTY)
-			*c = a ^ ((b >> 63) << 63);
-		else if (b_type == INFTY)
-			*c = b ^ ((a >> 63) << 63);
-		else
-			/* either of a and b are +/-0 */
-			*c = ((unsigned long) op_a.s ^ op_b.s) << 63;
-		return 0;
-	}
-	op_c.s = op_a.s ^ op_b.s;
-	op_c.e = op_a.e + op_b.e - 55;
-	mul64(op_a.f[0], op_b.f[0], op_c.f);
-
-	return round_s_ieee(f, &op_c, c);
-}
-
-
-/*
- * Multiply a x b = c, where a, b, and c are ieee t-floating numbers.
- * "f" contains the rounding mode.
- */
-unsigned long
-ieee_MULT (int f, unsigned long a, unsigned long b, unsigned long *c)
-{
-	fpclass_t a_type, b_type;
-	EXTENDED op_a, op_b, op_c;
-
-	*c = IEEE_QNaN;
-	a_type = extend_ieee(a, &op_a, DOUBLE);
-	b_type = extend_ieee(b, &op_b, DOUBLE);
-	if ((a_type >= NaN && a_type <= ZERO) ||
-	    (b_type >= NaN && b_type <= ZERO))
-	{
-		/* propagate NaNs according to arch. ref. handbook: */
-		if (b_type == QNaN)
-			*c = b;
-		else if (b_type == NaN)
-			*c = b | (1UL << 51);
-		else if (a_type == QNaN)
-			*c = a;
-		else if (a_type == NaN)
-			*c = a | (1UL << 51);
-
-		if (a_type == NaN || b_type == NaN)
-			return FPCR_INV;
-		if (a_type == QNaN || b_type == QNaN)
-			return 0;
-
-		if ((a_type == INFTY && b_type == ZERO) ||
-		    (b_type == INFTY && a_type == ZERO))
-		{
-			*c = IEEE_QNaN;		/* return canonical QNaN */
-			return FPCR_INV;
-		}
-		if (a_type == INFTY)
-			*c = a ^ ((b >> 63) << 63);
-		else if (b_type == INFTY)
-			*c = b ^ ((a >> 63) << 63);
-		else
-			/* either of a and b are +/-0 */
-			*c = ((unsigned long) op_a.s ^ op_b.s) << 63;
-		return 0;
-	}
-	op_c.s = op_a.s ^ op_b.s;
-	op_c.e = op_a.e + op_b.e - 55;
-	mul64(op_a.f[0], op_b.f[0], op_c.f);
-
-	return round_t_ieee(f, &op_c, c);
-}
-
-
-/*
- * Divide a / b = c, where a, b, and c are ieee s-floating numbers.
- * "f" contains the rounding mode etc.
- */
-unsigned long
-ieee_DIVS (int f, unsigned long a, unsigned long b, unsigned long *c)
-{
-	fpclass_t a_type, b_type;
-	EXTENDED op_a, op_b, op_c;
-
-	a_type = extend_ieee(a, &op_a, SINGLE);
-	b_type = extend_ieee(b, &op_b, SINGLE);
-	if ((a_type >= NaN && a_type <= ZERO) ||
-	    (b_type >= NaN && b_type <= ZERO))
-	{
-		unsigned long res;
-
-		/* propagate NaNs according to arch. ref. handbook: */
-		if (b_type == QNaN)
-			*c = b;
-		else if (b_type == NaN)
-			*c = b | (1UL << 51);
-		else if (a_type == QNaN)
-			*c = a;
-		else if (a_type == NaN)
-			*c = a | (1UL << 51);
-
-		if (a_type == NaN || b_type == NaN)
-			return FPCR_INV;
-		if (a_type == QNaN || b_type == QNaN)
-			return 0;
-
-		res = 0;
-		*c = IEEE_PINF;
-		if (a_type == INFTY) {
-			if (b_type == INFTY) {
-				*c = IEEE_QNaN;
-				return FPCR_INV;
-			}
-		} else if (b_type == ZERO) {
-			if (a_type == ZERO) {
-				*c = IEEE_QNaN;
-				return FPCR_INV;
-			}
-			res = FPCR_DZE;
-		} else
-			/* a_type == ZERO || b_type == INFTY */
-			*c = 0;
-		*c |= (unsigned long) (op_a.s ^ op_b.s) << 63;
-		return res;
-	}
-	op_c.s = op_a.s ^ op_b.s;
-	op_c.e = op_a.e - op_b.e;
-
-	op_a.f[1] = op_a.f[0];
-	op_a.f[0] = 0;
-	div128(op_a.f, op_b.f, op_c.f);
-	if (a_type != ZERO)
-		/* force a sticky bit because DIVs never hit exact .5: */
-		op_c.f[0] |= STICKY_S;
-	normalize(&op_c);
-	op_c.e -= 9;		/* remove excess exp from original shift */
-	return round_s_ieee(f, &op_c, c);
-}
-
-
-/*
- * Divide a/b = c, where a, b, and c are ieee t-floating numbers.  "f"
- * contains the rounding mode etc.
- */
-unsigned long
-ieee_DIVT (int f, unsigned long a, unsigned long b, unsigned long *c)
-{
-	fpclass_t a_type, b_type;
-	EXTENDED op_a, op_b, op_c;
-
-	*c = IEEE_QNaN;
-	a_type = extend_ieee(a, &op_a, DOUBLE);
-	b_type = extend_ieee(b, &op_b, DOUBLE);
-	if ((a_type >= NaN && a_type <= ZERO) ||
-	    (b_type >= NaN && b_type <= ZERO))
-	{
-		unsigned long res;
-
-		/* propagate NaNs according to arch. ref. handbook: */
-		if (b_type == QNaN)
-			*c = b;
-		else if (b_type == NaN)
-			*c = b | (1UL << 51);
-		else if (a_type == QNaN)
-			*c = a;
-		else if (a_type == NaN)
-			*c = a | (1UL << 51);
-
-		if (a_type == NaN || b_type == NaN)
-			return FPCR_INV;
-		if (a_type == QNaN || b_type == QNaN)
-			return 0;
-
-		res = 0;
-		*c = IEEE_PINF;
-		if (a_type == INFTY) {
-			if (b_type == INFTY) {
-				*c = IEEE_QNaN;
-				return FPCR_INV;
-			}
-		} else if (b_type == ZERO) {
-			if (a_type == ZERO) {
-				*c = IEEE_QNaN;
-				return FPCR_INV;
-			}
-			res = FPCR_DZE;
-		} else
-			/* a_type == ZERO || b_type == INFTY */
-			*c = 0;
-		*c |= (unsigned long) (op_a.s ^ op_b.s) << 63;
-		return res;
-	}
-	op_c.s = op_a.s ^ op_b.s;
-	op_c.e = op_a.e - op_b.e;
-
-	op_a.f[1] = op_a.f[0];
-	op_a.f[0] = 0;
-	div128(op_a.f, op_b.f, op_c.f);
-	if (a_type != ZERO)
-		/* force a sticky bit because DIVs never hit exact .5 */
-		op_c.f[0] |= STICKY_T;
-	normalize(&op_c);
-	op_c.e -= 9;		/* remove excess exp from original shift */
-	return round_t_ieee(f, &op_c, c);
-}
-
-/*
- * Sqrt a = b, where a and b are ieee s-floating numbers.  "f"
- * contains the rounding mode etc.
- */
-unsigned long
-ieee_SQRTS (int f, unsigned long a, unsigned long *b)
-{
-	fpclass_t a_type;
-	EXTENDED op_a, op_b;
-
-	*b = IEEE_QNaN;
-	a_type = extend_ieee(a, &op_a, SINGLE);
-	if (op_a.s == 0) {
-		/* FIXME -- handle positive denormals.  */
-		send_sig(SIGFPE, current, 1);
-	}
-	return FPCR_INV;
-}
-
-/*
- * Sqrt a = b, where a and b are ieee t-floating numbers.  "f"
- * contains the rounding mode etc.
- */
-unsigned long
-ieee_SQRTT (int f, unsigned long a, unsigned long *b)
-{
-	fpclass_t a_type;
-	EXTENDED op_a, op_b;
-
-	*b = IEEE_QNaN;
-	a_type = extend_ieee(a, &op_a, DOUBLE);
-	if (op_a.s == 0) {
-		/* FIXME -- handle positive denormals.  */
-		send_sig(SIGFPE, current, 1);
-	}
-	return FPCR_INV;
-}
diff -urN linux-2.2.11-pre2/arch/alpha/math-emu/ieee-math.h linux/arch/alpha/math-emu/ieee-math.h
--- linux-2.2.11-pre2/arch/alpha/math-emu/ieee-math.h	Mon Dec  3 18:51:52 2001
+++ linux/arch/alpha/math-emu/ieee-math.h	Wed Dec 31 16:00:00 1969
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) 1992,1995 by
- * Digital Equipment Corporation, Maynard, Massachusetts.
- * This file may be redistributed according to the terms of the
- * GNU General Public License.
- */
-#ifndef __ieee_math_h__
-#define __ieee_math_h__
-
-#include <asm/fpu.h>
-
-#define ROUND_SHIFT	6		/* make space for trap-enable bits */
-#define RM(f)		(((f) >> ROUND_SHIFT) & 0x3)
-
-#define ROUND_CHOP 	(FPCR_DYN_CHOPPED >> FPCR_DYN_SHIFT)
-#define ROUND_NINF 	(FPCR_DYN_MINUS   >> FPCR_DYN_SHIFT)
-#define ROUND_NEAR 	(FPCR_DYN_NORMAL  >> FPCR_DYN_SHIFT)
-#define ROUND_PINF 	(FPCR_DYN_PLUS    >> FPCR_DYN_SHIFT)
-
-extern unsigned long ieee_CVTST (int rm, unsigned long a, unsigned long *b);
-extern unsigned long ieee_CVTTS (int rm, unsigned long a, unsigned long *b);
-extern unsigned long ieee_CVTQS (int rm, unsigned long a, unsigned long *b);
-extern unsigned long ieee_CVTQT (int rm, long a, unsigned long *b);
-extern unsigned long ieee_CVTTQ (int rm, unsigned long a, unsigned long *b);
-
-extern unsigned long ieee_CMPTEQ (unsigned long a, unsigned long b,
-				  unsigned long *c);
-extern unsigned long ieee_CMPTLT (unsigned long a, unsigned long b,
-				  unsigned long *c);
-extern unsigned long ieee_CMPTLE (unsigned long a, unsigned long b,
-				  unsigned long *c);
-extern unsigned long ieee_CMPTUN (unsigned long a, unsigned long b,
-				  unsigned long *c);
-
-extern unsigned long ieee_ADDS (int rm, unsigned long a, unsigned long b,
-				unsigned long *c);
-extern unsigned long ieee_ADDT (int rm, unsigned long a, unsigned long b,
-				unsigned long *c);
-extern unsigned long ieee_SUBS (int rm, unsigned long a, unsigned long b,
-				unsigned long *c);
-extern unsigned long ieee_SUBT (int rm, unsigned long a, unsigned long b,
-				unsigned long *c);
-extern unsigned long ieee_MULS (int rm, unsigned long a, unsigned long b,
-				unsigned long *c);
-extern unsigned long ieee_MULT (int rm, unsigned long a, unsigned long b,
-				unsigned long *c);
-extern unsigned long ieee_DIVS (int rm, unsigned long a, unsigned long b,
-				unsigned long *c);
-extern unsigned long ieee_DIVT (int rm, unsigned long a, unsigned long b,
-				unsigned long *c);
-extern unsigned long ieee_SQRTS (int rm, unsigned long a, unsigned long *b);
-extern unsigned long ieee_SQRTT (int rm, unsigned long a, unsigned long *b);
-
-#endif /* __ieee_math_h__ */
diff -urN linux-2.2.11-pre2/arch/alpha/math-emu/sfp-machine.h linux/arch/alpha/math-emu/sfp-machine.h
--- linux-2.2.11-pre2/arch/alpha/math-emu/sfp-machine.h	Wed Dec 31 16:00:00 1969
+++ linux/arch/alpha/math-emu/sfp-machine.h	Mon Dec  3 18:52:22 2001
@@ -0,0 +1,625 @@
+/* Machine-dependent software floating-point definitions.  Sparc64 version.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If
+   not, write to the Free Software Foundation, Inc.,
+   59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+#include <linux/sched.h>
+#include <asm/fpu.h>
+
+#define _FP_W_TYPE_SIZE		64
+#define _FP_W_TYPE		unsigned long
+#define _FP_WS_TYPE		signed long
+#define _FP_I_TYPE		long
+
+#define _FP_MUL_MEAT_S(R,X,Y)	_FP_MUL_MEAT_1_imm(S,R,X,Y)
+#define _FP_MUL_MEAT_D(R,X,Y)	_FP_MUL_MEAT_1_wide(D,R,X,Y,umul_ppmm)
+#define _FP_MUL_MEAT_Q(R,X,Y)	_FP_MUL_MEAT_2_wide(Q,R,X,Y,umul_ppmm)
+
+#define _FP_DIV_MEAT_S(R,X,Y)	_FP_DIV_MEAT_1_imm(S,R,X,Y,_FP_DIV_HELP_imm)
+#define _FP_DIV_MEAT_D(R,X,Y)	_FP_DIV_MEAT_1_udiv(D,R,X,Y)
+#define _FP_DIV_MEAT_Q(R,X,Y)	_FP_DIV_MEAT_2_udiv_64(Q,R,X,Y)
+
+#define _FP_NANFRAC_S		_FP_QNANBIT_S
+#define _FP_NANFRAC_D		_FP_QNANBIT_D
+#define _FP_NANFRAC_Q		_FP_QNANBIT_Q, 0
+
+/* On some architectures float-to-int conversions return a result
+ * code.  On others (e.g. Sparc) they return 0
+ */
+#define _FTOI_RESULT		A_r
+
+#define _FP_KEEPNANFRACP 1
+
+/* Alpha Architecture Manual Section 4.7.10.4: Propagating NaN Values,
+ * summary:
+ *
+ * The first of the following rules that is applicable governs the
+ * value returned:
+ *	1: If X is a quiet NaN, copy X to the result.
+ *	2: If X is a signaling NaN, the result is the canonical quiet NaN
+ *	   with the same sign as X
+ *	3: If Y is a quiet NaN, copy Y to the result.
+ *	4: If Y is a signaling NaN, the result is the canonical quiet NaN
+ *	   with the same sign as Y
+ *	5: The result is the canonical quiet NaN with a sign bit of 1
+ *
+ * In addition, in cases (2) and (4) above we set EFLAG_INVALID.
+ */
+
+#define _FP_IS_NAN(fs, Z)	(Z##_c == FP_CLS_NAN)
+#define _FP_IS_QNAN(fs, Z)	(Z##_f & _FP_QNANBIT_##fs)
+
+#define _FP_CHOOSENAN(fs, wc, R, X, Y)				\
+  do {								\
+    R##_r |= (X##_r | Y##_r);					\
+    if(_FP_IS_NAN(fs, Y)) {					\
+	R##_s = Y##_s;						\
+	R##_c = FP_CLS_NAN;					\
+	if(_FP_IS_QNAN(fs, Y)) {	/* Rule 1 */		\
+	    _FP_FRAC_COPY_##wc(R,Y);				\
+	}							\
+	else {				/* Rule 2 */		\
+	    _FP_FRAC_SET_##wc(R,Y##_f | _FP_QNANBIT_##fs); 	\
+	    R##_r = EFLAG_INVALID;				\
+	}							\
+    }								\
+    else if(_FP_IS_NAN(fs, X)) {				\
+	R##_s = X##_s;						\
+	R##_c = FP_CLS_NAN;					\
+	if(_FP_IS_QNAN(fs, X)) {	/* Rule 3 */		\
+	    _FP_FRAC_COPY_##wc(R,X);				\
+	}							\
+	else {				/* Rule 4 */		\
+	    _FP_FRAC_SET_##wc(R,X##_f | _FP_QNANBIT_##fs); 	\
+	    R##_r |= EFLAG_INVALID;				\
+	}							\
+    }								\
+    else {				/* Rule 5 */		\
+	R##_s = 1;						\
+	R##_c = FP_CLS_NAN;					\
+	_FP_FRAC_SET_##wc(R,_FP_QNANBIT_##fs | EFLAG_MASK); 	\
+    }								\
+  } while(0)
+
+/* Rules 3 and 4 don't apply to functions of only one argument */
+#define _FP_CHOOSENAN_1(fs, wc, R, X)				\
+  do {								\
+    if(_FP_IS_NAN(fs, X)) {					\
+	R##_s = X##_s;						\
+	R##_c = FP_CLS_NAN;					\
+	if(_FP_IS_QNAN(fs, X)) {	/* Rule 1 */		\
+	    _FP_FRAC_COPY_##wc(R,X);				\
+	}							\
+	else {				/* Rule 2 */		\
+	    _FP_FRAC_SET_##wc(R,X##_f | _FP_QNANBIT_##fs); 	\
+	    R##_r |= EFLAG_INVALID;				\
+	}							\
+    }								\
+    else {				/* Rule 5 */		\
+	R##_s = 1;						\
+	R##_c = FP_CLS_NAN;					\
+	_FP_FRAC_SET_##wc(R,_FP_QNANBIT_##fs | EFLAG_MASK); 	\
+    }								\
+  } while(0)
+
+#define _FP_CHOOSENAN_SQRT	_FP_CHOOSENAN_1
+
+
+#define __FP_UNPACK_DENORM(fs, wc, X)				\
+    {									\
+	_FP_I_TYPE _shift;						\
+	X##_r |= EFLAG_DENORM;						\
+	if(_FP_DENORM_TO_ZERO) {					\
+	    /* Crunching a nonzero denorm to zero necessarily makes */  \
+	    /* the result inexact */					\
+	    X##_r |= EFLAG_INEXACT;					\
+	    _FP_FRAC_SET_##wc(X, 0);					\
+	    X##_c = FP_CLS_ZERO;					\
+	}								\
+	else {								\
+	    _FP_FRAC_CLZ_##wc(_shift, X);				\
+	    _shift -= _FP_FRACXBITS_##fs;				\
+	    _FP_FRAC_SLL_##wc(X, (_shift+_FP_WORKBITS));		\
+	    X##_e -= _FP_EXPBIAS_##fs - 1 + _shift;			\
+	    X##_c = FP_CLS_NORMAL;					\
+	}								\
+    }
+
+#define __FP_UNPACK_RAW_1(fs, X, val)				\
+  do {								\
+    union _FP_UNION_##fs *_flo =				\
+    	(union _FP_UNION_##fs *)val;				\
+								\
+    X##_f = _flo->bits.frac;					\
+    X##_e = _flo->bits.exp;					\
+    X##_s = _flo->bits.sign;					\
+  } while (0)
+
+#define __FP_UNPACK_RAW_2(fs, X, val)			\
+  do {							\
+    union _FP_UNION_##fs *_flo =			\
+    	(union _FP_UNION_##fs *)val;			\
+							\
+    X##_f0 = _flo->bits.frac0;				\
+    X##_f1 = _flo->bits.frac1;				\
+    X##_e  = _flo->bits.exp;				\
+    X##_s  = _flo->bits.sign;				\
+  } while (0)
+
+#define __FP_UNPACK_S(X,val)		\
+  do {					\
+    __FP_UNPACK_RAW_1(S,X,val);		\
+    _FP_UNPACK_CANONICAL(S,1,X);	\
+  } while (0)
+
+#define __FP_UNPACK_D(X,val)		\
+  do {					\
+    __FP_UNPACK_RAW_1(D,X,val);		\
+    _FP_UNPACK_CANONICAL(D,1,X);	\
+  } while (0)
+
+#define __FP_UNPACK_Q(X,val)		\
+  do {					\
+    __FP_UNPACK_RAW_2(Q,X,val);		\
+    _FP_UNPACK_CANONICAL(Q,2,X);	\
+  } while (0)
+
+#define __FP_PACK_RAW_1(fs, val, X)				\
+  do {								\
+    union _FP_UNION_##fs *_flo =				\
+    	(union _FP_UNION_##fs *)val;				\
+								\
+    _flo->bits.frac = X##_f;					\
+    _flo->bits.exp  = X##_e;					\
+    _flo->bits.sign = X##_s;					\
+  } while (0)
+  
+#define __FP_PACK_RAW_2(fs, val, X)			\
+  do {							\
+    union _FP_UNION_##fs *_flo =			\
+    	(union _FP_UNION_##fs *)val;			\
+							\
+    _flo->bits.frac0 = X##_f0;				\
+    _flo->bits.frac1 = X##_f1;				\
+    _flo->bits.exp   = X##_e;				\
+    _flo->bits.sign  = X##_s;				\
+  } while (0)
+
+
+/* Alpha rules for handling certain exceptional cases are different
+ * enough that we simply define our own versions here to override
+ * the ones in op-common.h
+ */
+
+#define _FP_ADD(fs, wc, R, X, Y)					     \
+do {									     \
+  /* Propagate any flags that may have been set during unpacking */	     \
+  R##_r |= (X##_r | Y##_r);						     \
+  switch (_FP_CLS_COMBINE(X##_c, Y##_c))				     \
+  {									     \
+  case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_NORMAL):			     \
+    {									     \
+      /* shift the smaller number so that its exponent matches the larger */ \
+      _FP_I_TYPE diff = X##_e - Y##_e;					     \
+									     \
+      if (diff < 0)							     \
+	{								     \
+	  diff = -diff;							     \
+	  if (diff <= _FP_WFRACBITS_##fs)				     \
+	    _FP_FRAC_SRS_##wc(X, diff, _FP_WFRACBITS_##fs);		     \
+	  else if (!_FP_FRAC_ZEROP_##wc(X)) {				     \
+	    _FP_FRAC_SET_##wc(X, _FP_MINFRAC_##wc);			     \
+	    R_r |= EFLAG_INEXACT;					     \
+	  }								     \
+	  else								     \
+	    _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc);			     \
+	  R##_e = Y##_e;						     \
+	}								     \
+      else								     \
+	{								     \
+	  if (diff > 0)							     \
+	    {								     \
+	      if (diff <= _FP_WFRACBITS_##fs)				     \
+	        _FP_FRAC_SRS_##wc(Y, diff, _FP_WFRACBITS_##fs);		     \
+	      else if (!_FP_FRAC_ZEROP_##wc(Y))	{			     \
+	        _FP_FRAC_SET_##wc(Y, _FP_MINFRAC_##wc);			     \
+	         R_r |= EFLAG_INEXACT;					     \
+	      }								     \
+	      else							     \
+	        _FP_FRAC_SET_##wc(Y, _FP_ZEROFRAC_##wc);		     \
+	    }								     \
+	  R##_e = X##_e;						     \
+	}								     \
+									     \
+      R##_c = FP_CLS_NORMAL;						     \
+									     \
+      if (X##_s == Y##_s)						     \
+	{								     \
+	  R##_s = X##_s;						     \
+	  _FP_FRAC_ADD_##wc(R, X, Y);					     \
+	  if (_FP_FRAC_OVERP_##wc(fs, R))				     \
+	    {								     \
+	      _FP_FRAC_SRS_##wc(R, 1, _FP_WFRACBITS_##fs);		     \
+	      R##_e++;							     \
+	    }								     \
+	}								     \
+      else								     \
+	{								     \
+	  R##_s = X##_s;						     \
+	  _FP_FRAC_SUB_##wc(R, X, Y);					     \
+	  if (_FP_FRAC_ZEROP_##wc(R))					     \
+	    {								     \
+	      /* return an exact zero */				     \
+	      if (FP_ROUNDMODE == FP_RND_MINF)				     \
+		R##_s |= Y##_s;						     \
+	      else							     \
+		R##_s &= Y##_s;						     \
+	      R##_c = FP_CLS_ZERO;					     \
+	    }								     \
+	  else								     \
+	    {								     \
+	      if (_FP_FRAC_NEGP_##wc(R))				     \
+		{							     \
+		  _FP_FRAC_SUB_##wc(R, Y, X);				     \
+		  R##_s = Y##_s;					     \
+		}							     \
+									     \
+	      /* renormalize after subtraction */			     \
+	      _FP_FRAC_CLZ_##wc(diff, R);				     \
+	      diff -= _FP_WFRACXBITS_##fs;				     \
+	      if (diff)							     \
+		{							     \
+		  R##_e -= diff;					     \
+		  _FP_FRAC_SLL_##wc(R, diff);				     \
+		}							     \
+	    }								     \
+	}								     \
+      break;								     \
+    }									     \
+									     \
+  case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_NAN):				     \
+  case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_NORMAL):			     \
+  case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_INF):				     \
+  case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_ZERO):				     \
+  case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_NAN):			     \
+  case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_NAN):				     \
+  case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_NAN):				     \
+    _FP_CHOOSENAN(fs, wc, R, X, Y);					     \
+    break;								     \
+									     \
+  case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_ZERO):			     \
+    R##_e = X##_e;							     \
+    _FP_FRAC_COPY_##wc(R, X);						     \
+    R##_s = X##_s;							     \
+    R##_c = X##_c;							     \
+    break;								     \
+									     \
+  case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_NORMAL):			     \
+    R##_e = Y##_e;							     \
+    _FP_FRAC_COPY_##wc(R, Y);						     \
+    R##_s = Y##_s;							     \
+    R##_c = Y##_c;							     \
+    break;								     \
+									     \
+  case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_INF):				     \
+    if (X##_s != Y##_s)							     \
+      {									     \
+	/* +INF + -INF => NAN */					     \
+	_FP_FRAC_SET_##wc(R, _FP_NANFRAC_##fs);				     \
+	R##_s = X##_s ^ Y##_s;						     \
+	R##_c = FP_CLS_NAN;						     \
+	R##_r |= EFLAG_INVALID;						     \
+	break;								     \
+      }									     \
+    /* FALLTHRU */							     \
+									     \
+  case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_NORMAL):			     \
+  case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_ZERO):				     \
+    R##_s = X##_s;							     \
+    R##_c = FP_CLS_INF;							     \
+    break;								     \
+									     \
+  case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_INF):			     \
+  case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_INF):				     \
+    R##_s = Y##_s;							     \
+    R##_c = FP_CLS_INF;							     \
+    break;								     \
+									     \
+  case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_ZERO):			     \
+    /* make sure the sign is correct */					     \
+    if (FP_ROUNDMODE == FP_RND_MINF)					     \
+      R##_s = X##_s | Y##_s;						     \
+    else								     \
+      R##_s = X##_s & Y##_s;						     \
+    R##_c = FP_CLS_ZERO;						     \
+    break;								     \
+									     \
+  default:								     \
+    abort();								     \
+  }									     \
+} while (0)
+
+
+#define _FP_MUL(fs, wc, R, X, Y)			\
+do {							\
+  /* Propagate any flags that may have been set during unpacking */	     \
+  R##_r |= (X##_r | Y##_r);						     \
+  R##_s = X##_s ^ Y##_s;				\
+  switch (_FP_CLS_COMBINE(X##_c, Y##_c))		\
+  {							\
+  case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_NORMAL):	\
+    R##_c = FP_CLS_NORMAL;				\
+    R##_e = X##_e + Y##_e + 1;				\
+							\
+    _FP_MUL_MEAT_##fs(R,X,Y);				\
+							\
+    if (_FP_FRAC_OVERP_##wc(fs, R))			\
+      _FP_FRAC_SRS_##wc(R, 1, _FP_WFRACBITS_##fs);	\
+    else						\
+      R##_e--;						\
+    break;						\
+							\
+  case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_NORMAL):	\
+  case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_INF):		\
+  case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_ZERO):		\
+  case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_NAN):		\
+  case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_NAN):	\
+  case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_NAN):		\
+  case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_NAN):		\
+    _FP_CHOOSENAN(fs, wc, R, X, Y);			\
+    break;						\
+							\
+  case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_INF):		\
+  case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_NORMAL):	\
+  case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_NORMAL):	\
+  case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_ZERO):	\
+    _FP_FRAC_COPY_##wc(R, X);				\
+    R##_c = X##_c;					\
+    break;						\
+							\
+  case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_INF):	\
+  case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_ZERO):	\
+    _FP_FRAC_COPY_##wc(R, Y);				\
+    R##_c = Y##_c;					\
+    break;						\
+							\
+  case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_ZERO):		\
+  case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_INF):		\
+    R##_c = FP_CLS_NAN;					\
+    _FP_FRAC_SET_##wc(R, _FP_NANFRAC_##fs);		\
+    R##_s = 1; /* Alpha SRM rule */			\
+    break;						\
+							\
+  default:						\
+    abort();						\
+  }							\
+} while (0)
+
+
+#define _FP_DIV(fs, wc, R, X, Y)			\
+do {							\
+  /* Propagate any flags that may have been set during unpacking */	     \
+  R##_r |= (X##_r | Y##_r);						     \
+  R##_s = X##_s ^ Y##_s;				\
+  switch (_FP_CLS_COMBINE(X##_c, Y##_c))		\
+  {							\
+  case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_NORMAL):	\
+    R##_c = FP_CLS_NORMAL;				\
+    R##_e = X##_e - Y##_e;				\
+							\
+    _FP_DIV_MEAT_##fs(R,X,Y);				\
+    break;						\
+							\
+  case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_NORMAL):	\
+  case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_INF):		\
+  case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_ZERO):		\
+  case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_NAN):		\
+  case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_NAN):	\
+  case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_NAN):		\
+  case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_NAN):		\
+    _FP_CHOOSENAN(fs, wc, R, X, Y);			\
+    break;						\
+							\
+  case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_INF):	\
+  case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_INF):		\
+  case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_NORMAL):	\
+    R##_c = FP_CLS_ZERO;				\
+    break;						\
+							\
+  case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_ZERO):	\
+  case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_ZERO):		\
+  case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_NORMAL):	\
+    R##_c = FP_CLS_INF;					\
+    break;						\
+							\
+  case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_INF):		\
+  case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_ZERO):	\
+    R##_c = FP_CLS_NAN;					\
+    _FP_FRAC_SET_##wc(R, _FP_NANFRAC_##fs);		\
+    R##_s = 1;	/* Alpha SRM rule */			\
+    break;						\
+							\
+  default:						\
+    abort();						\
+  }							\
+} while (0)
+
+
+#define _FP_TO_INT(fs, wc, r, X, rsize, rsigned)			\
+  ({									\
+    switch (X##_c)							\
+      {									\
+      case FP_CLS_ZERO:							\
+	r = 0;								\
+	break;								\
+      case FP_CLS_NAN:                                              	\
+	r = 0;								\
+	X##_r |= EFLAG_INVALID;						\
+	break;								\
+      case FP_CLS_INF:							\
+	r = 0;								\
+	X##_r |= (EFLAG_INVALID | EFLAG_INEXACT);			\
+	break;								\
+      case FP_CLS_NORMAL:						\
+	if (X##_e < 0)							\
+	  {								\
+	    r = 0;							\
+	    X##_r |= EFLAG_INEXACT;					\
+	  }								\
+	else								\
+	  {								\
+	    if (X##_e >= rsize - (rsigned != 0)) {			\
+		/* Overflow.  On alpha, set the INV bit and proceed */	\
+		/* JRP - I *believe* the proper behavior is to set */   \
+		/*       INV and write a true zero... need to check */  \
+		X##_r |= EFLAG_INVALID;					\
+		r = 0;							\
+		break;							\
+	    }								\
+	    if (_FP_W_TYPE_SIZE*wc < rsize)				\
+	      {								\
+		_FP_FRAC_ASSEMBLE_##wc(r, X, rsize);			\
+		r <<= X##_e - _FP_WFRACBITS_##fs;			\
+	      }								\
+	    else							\
+	      {								\
+		if (X##_e >= _FP_WFRACBITS_##fs)			\
+		  _FP_FRAC_SLL_##wc(X, (X##_e - _FP_WFRACBITS_##fs + 1)); \
+		else							\
+		  _FP_FRAC_SRL_##wc(X, (_FP_WFRACBITS_##fs - X##_e - 1)); \
+		_FP_FRAC_ASSEMBLE_##wc(r, X, rsize);			\
+	      }								\
+	    if (rsigned && X##_s)					\
+	      r = -r;							\
+	  }								\
+	break;								\
+      }									\
+      X##_r;								\
+  })
+
+
+/* We only actually write to the destination register
+ * if exceptions signalled (if any) will not trap.
+ */
+#define __FPU_TEM ((current->tss.flags)& IEEE_TRAP_ENABLE_MASK)
+
+#define __FPU_TRAP_P(bits) \
+	((__FPU_TEM & (bits)) != 0)
+
+#define __FP_PACK_S(val,X)			\
+({  int __exc = _FP_PACK_CANONICAL(S,1,X);	\
+    if(!__exc || !__FPU_TRAP_P(__exc))		\
+        __FP_PACK_RAW_1(S,val,X);		\
+    __exc;					\
+})
+
+#define __FP_PACK_D(val,X)			\
+({  int __exc = _FP_PACK_CANONICAL(D,1,X);	\
+    if(!__exc || !__FPU_TRAP_P(__exc))		\
+        __FP_PACK_RAW_1(D,val,X);		\
+    __exc;					\
+})
+
+#define __FP_PACK_Q(val,X)			\
+({  int __exc = _FP_PACK_CANONICAL(Q,2,X);	\
+    if(!__exc || !__FPU_TRAP_P(__exc))		\
+        __FP_PACK_RAW_2(Q,val,X);		\
+    __exc;					\
+})
+
+/* Obtain the current rounding mode. */
+#define FP_ROUNDMODE	\
+    (((current->tss.flags)&IEEE_CURRENT_RM_MASK)>>IEEE_CURRENT_RM_SHIFT)
+
+#define FP_RND_NEAREST		(FPCR_DYN_NORMAL >> FPCR_DYN_SHIFT)
+#define FP_RND_ZERO		(FPCR_DYN_CHOPPED >> FPCR_DYN_SHIFT)
+#define FP_RND_PINF		(FPCR_DYN_PLUS >> FPCR_DYN_SHIFT)
+#define FP_RND_MINF		(FPCR_DYN_MINUS >> FPCR_DYN_SHIFT)
+
+
+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
+  __asm__ ("addq %4,%5,%1; cmpult %1,%4,$28; addq %2,%3,%0; addq %0,$28,%0" \
+	   : "=r" ((UDItype)(sh)), \
+	     "=r" ((UDItype)(sl)) \
+	   : "r" ((UDItype)(ah)), \
+	     "r" ((UDItype)(bh)), \
+	     "r" ((UDItype)(al)), \
+	     "r" ((UDItype)(bl)))
+	   
+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+  __asm__ ("subq %4,%5,%1; cmpult %4,%5,$28; subq %2,%3,%0; subq %0,$28,%0"\
+	   : "=r" ((UDItype)(sh)), \
+	     "=&r" ((UDItype)(sl)) \
+	   : "r" ((UDItype)(ah)), \
+	     "r" ((UDItype)(bh)), \
+	     "r" ((UDItype)(al)), \
+	     "r" ((UDItype)(bl)))
+	   
+#define umul_ppmm(wh, wl, u, v) \
+  do { \
+	  __asm__ ("mulq %2,%3,%1; umulh %2,%3,%0" \
+	   : "=r" ((UDItype)(wh)), \
+	     "=&r" ((UDItype)(wl)) \
+	   : "r" ((UDItype)(u)), \
+	     "r" ((UDItype)(v))); \
+  } while (0)
+
+
+#define udiv_qrnnd(q, r, n1, n0, d) 				\
+  do {                                                          \
+    unsigned long __n[2];					\
+    unsigned long __d[2];					\
+    unsigned long __q[2];					\
+    unsigned long __r[2];					\
+    __n[0]=n1; __n[1]=n0; __d[0]=0; __d[1]=d;			\
+    udiv128(__n, __d, __q, __r);				\
+    q=__q[1]; r=__r[1];						\
+  } while (0)
+
+#define UDIV_NEEDS_NORMALIZATION 1  
+
+#define abort()										\
+	return 0
+
+#ifndef __LITTLE_ENDIAN
+#define __LITTLE_ENDIAN -1
+#endif
+#define __BYTE_ORDER __LITTLE_ENDIAN
+
+/* Exception flags. */
+#define EFLAG_INVALID		IEEE_TRAP_ENABLE_INV
+#define EFLAG_OVERFLOW		IEEE_TRAP_ENABLE_OVF
+#define EFLAG_UNDERFLOW		IEEE_TRAP_ENABLE_UNF
+#define EFLAG_DIVZERO		IEEE_TRAP_ENABLE_DZE
+#define EFLAG_INEXACT		IEEE_TRAP_ENABLE_INE
+#define EFLAG_DENORM		IEEE_TRAP_ENABLE_DNO
+#define EFLAG_MASK		IEEE_TRAP_ENABLE_MASK
+
+#ifdef FP_TEST_XXX
+#define _FP_DENORM_TO_ZERO \
+    (tss_flags&IEEE_MAP_DMZ)
+#else
+#define _FP_DENORM_TO_ZERO \
+    ((current->tss.flags)&IEEE_MAP_DMZ)
+#endif
+
+/* Comparison operations */
+#define CMPTXX_EQ		0
+#define CMPTXX_LT		-1
+#define CMPTXX_GT		1
+#define CMPTXX_LE		2
+#define CMPTXX_UN		3
diff -urN linux-2.2.11-pre2/arch/i386/kernel/i386_ksyms.c linux/arch/i386/kernel/i386_ksyms.c
--- linux-2.2.11-pre2/arch/i386/kernel/i386_ksyms.c	Mon Dec  3 18:51:52 2001
+++ linux/arch/i386/kernel/i386_ksyms.c	Mon Dec  3 18:52:23 2001
@@ -112,6 +112,7 @@
 EXPORT_SYMBOL(mca_mark_as_used);
 EXPORT_SYMBOL(mca_mark_as_unused);
 EXPORT_SYMBOL(mca_find_unused_adapter);
+EXPORT_SYMBOL(mca_is_adapter_used);
 #endif
 
 #ifdef CONFIG_VT
diff -urN linux-2.2.11-pre2/arch/ppc/Makefile linux/arch/ppc/Makefile
--- linux-2.2.11-pre2/arch/ppc/Makefile	Fri Jun  4 13:30:47 1999
+++ linux/arch/ppc/Makefile	Mon Dec  3 18:52:25 2001
@@ -65,8 +65,7 @@
 checks:
 	@$(MAKE) -C arch/$(ARCH)/kernel checks
 
-BOOT_TARGETS = netboot znetboot zImage floppy install \
-	vmlinux.coff znetboot.initrd zImage.initrd vmlinux.coff.initrd
+BOOT_TARGETS = zImage znetboot.initrd zImage.initrd
 
 ifdef CONFIG_MBX
 $(BOOT_TARGETS): $(CHECKS) vmlinux
@@ -74,6 +73,16 @@
 	@$(MAKEMBXBOOT) $@
 else
 $(BOOT_TARGETS): $(CHECKS) vmlinux
+	@$(MAKECOFFBOOT) $@
+	@$(MAKEBOOT) $@
+	@$(MAKECHRPBOOT) $@
+
+znetboot: $(CHECKS) vmlinux
+ifdef CONFIG_SMP
+	cp -f vmlinux /tftpboot/vmlinux.smp
+else
+	cp -f vmlinux /tftpboot/vmlinux
+endif
 	@$(MAKECOFFBOOT) $@
 	@$(MAKEBOOT) $@
 	@$(MAKECHRPBOOT) $@
diff -urN linux-2.2.11-pre2/arch/ppc/chrpboot/main.c linux/arch/ppc/chrpboot/main.c
--- linux-2.2.11-pre2/arch/ppc/chrpboot/main.c	Fri Jun  4 13:30:47 1999
+++ linux/arch/ppc/chrpboot/main.c	Mon Dec  3 18:52:25 2001
@@ -19,12 +19,13 @@
 #define RAM_START	0x00000000
 #define RAM_END		(8<<20)
 
-#define RAM_FREE	(6<<20)		/* after image of chrpboot */
+#define RAM_FREE	((unsigned long)(_end+0x1000)&~0xFFF)
 #define PROG_START	0x00010000
 
 char *avail_ram;
 char *end_avail;
 
+extern char _end[];
 extern char image_data[];
 extern int image_len;
 extern char initrd_data[];
@@ -47,8 +48,8 @@
 	initrd_start = (RAM_END - initrd_size) & ~0xFFF;
 	a1 = initrd_start;
 	a2 = initrd_size;
-	printf("initial ramdisk at 0x%x (%u bytes)\n\r", initrd_start,
-	       initrd_size);
+	printf("initial ramdisk moving 0x%x <- 0x%x (%x bytes)\n\r", initrd_start,
+	       initrd_data,initrd_size);
 	memcpy((char *)initrd_start, initrd_data, initrd_size);
 	end_avail = (char *)initrd_start;
     } else
@@ -56,7 +57,6 @@
     im = image_data;
     len = image_len;
     dst = (void *) PROG_START;
-
     if (im[0] == 0x1f && im[1] == 0x8b) {
 	avail_ram = (char *)RAM_FREE;
 	printf("gunzipping (0x%x <- 0x%x:0x%0x)...", dst, im, im+len);
@@ -71,7 +71,7 @@
     sa = *(unsigned long *)PROG_START+PROG_START;
     printf("start address = 0x%x\n\r", sa);
 
-    (*(void (*)())sa)(a1, a2, prom, 0, 0);
+    (*(void (*)())sa)(0, 0, prom, a1, a2);
 
     printf("returned?\n\r");
 
diff -urN linux-2.2.11-pre2/arch/ppc/common_defconfig linux/arch/ppc/common_defconfig
--- linux-2.2.11-pre2/arch/ppc/common_defconfig	Fri Jun  4 13:30:47 1999
+++ linux/arch/ppc/common_defconfig	Mon Dec  3 18:52:25 2001
@@ -85,7 +85,7 @@
 #
 # Additional Block Devices
 #
-# CONFIG_BLK_DEV_LOOP is not set
+CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_NBD is not set
 # CONFIG_BLK_DEV_MD is not set
 CONFIG_BLK_DEV_RAM=y
@@ -173,7 +173,8 @@
 # CONFIG_SCSI_AHA1542 is not set
 # CONFIG_SCSI_AHA1740 is not set
 CONFIG_SCSI_AIC7XXX=y
-# CONFIG_OVERRIDE_CMDS is not set
+# CONFIG_AIC7XXX_TCQ_ON_BY_DEFAULT is not set
+CONFIG_AIC7XXX_CMDS_PER_DEVICE=8
 CONFIG_AIC7XXX_PROC_STATS=y
 CONFIG_AIC7XXX_RESET_DELAY=15
 # CONFIG_SCSI_ADVANSYS is not set
@@ -308,7 +309,7 @@
 CONFIG_FB_MATROX=y
 # CONFIG_FB_MATROX_MILLENIUM is not set
 CONFIG_FB_MATROX_MYSTIQUE=y
-# CONFIG_FB_MATROX_G100 is not set
+CONFIG_FB_MATROX_G100=y
 # CONFIG_FB_MATROX_MULTIHEAD is not set
 # CONFIG_FB_ATY is not set
 # CONFIG_FB_VIRTUAL is not set
@@ -378,6 +379,11 @@
 # CONFIG_FT_ALT_FDC is not set
 
 #
+# USB drivers - not for the faint of heart
+#
+# CONFIG_USB is not set
+
+#
 # Filesystems
 #
 # CONFIG_QUOTA is not set
@@ -497,6 +503,6 @@
 #
 # Kernel hacking
 #
-CONFIG_MAGIC_SYSRQ=y
+# CONFIG_MAGIC_SYSRQ is not set
 # CONFIG_KGDB is not set
 # CONFIG_XMON is not set
diff -urN linux-2.2.11-pre2/arch/ppc/config.in linux/arch/ppc/config.in
--- linux-2.2.11-pre2/arch/ppc/config.in	Fri Jun  4 13:30:47 1999
+++ linux/arch/ppc/config.in	Mon Dec  3 18:52:25 2001
@@ -1,4 +1,4 @@
-# $Id: config.in,v 1.92.2.1 1999/05/29 19:09:16 cort Exp $
+# $Id: config.in,v 1.92.2.2 1999/06/17 01:19:06 paulus Exp $
 # For a description of the syntax of this configuration file,
 # see the Configure script.
 #
@@ -176,6 +176,7 @@
 endmenu
 
 source drivers/char/Config.in
+source drivers/usb/Config.in
 source fs/Config.in
 
 mainmenu_option next_comment
diff -urN linux-2.2.11-pre2/arch/ppc/defconfig linux/arch/ppc/defconfig
--- linux-2.2.11-pre2/arch/ppc/defconfig	Fri Jun  4 13:30:47 1999
+++ linux/arch/ppc/defconfig	Mon Dec  3 18:52:25 2001
@@ -7,6 +7,7 @@
 #
 CONFIG_PPC=y
 CONFIG_6xx=y
+# CONFIG_PPC64 is not set
 # CONFIG_8xx is not set
 CONFIG_PMAC=y
 # CONFIG_PREP is not set
@@ -14,8 +15,9 @@
 # CONFIG_ALL_PPC is not set
 # CONFIG_APUS is not set
 # CONFIG_MBX is not set
-CONFIG_MACH_SPECIFIC=y
 # CONFIG_SMP is not set
+CONFIG_MACH_SPECIFIC=y
+CONFIG_6xx=y
 
 #
 # General setup
@@ -35,7 +37,8 @@
 CONFIG_KERNEL_ELF=y
 CONFIG_BINFMT_MISC=m
 # CONFIG_BINFMT_JAVA is not set
-# CONFIG_PARPORT is not set
+CONFIG_PARPORT=m
+# CONFIG_PARPORT_PC is not set
 # CONFIG_VGA_CONSOLE is not set
 CONFIG_FB=y
 CONFIG_FB_COMPAT_XPMAC=y
@@ -43,13 +46,12 @@
 CONFIG_MAC_KEYBOARD=y
 CONFIG_MAC_FLOPPY=y
 CONFIG_MAC_SERIAL=y
+# CONFIG_SERIAL_CONSOLE is not set
 CONFIG_ADBMOUSE=y
-CONFIG_BLK_DEV_IDE_PMAC=y
 CONFIG_PROC_DEVICETREE=y
-# CONFIG_KGDB is not set
-# CONFIG_XMON is not set
 # CONFIG_TOTALMP is not set
 CONFIG_BOOTX_TEXT=y
+# CONFIG_MOTOROLA_HOTSWAP is not set
 
 #
 # Plug and Play support
@@ -73,7 +75,15 @@
 # CONFIG_BLK_DEV_IDESCSI is not set
 # CONFIG_BLK_DEV_CMD640 is not set
 # CONFIG_BLK_DEV_RZ1000 is not set
-# CONFIG_BLK_DEV_IDEPCI is not set
+CONFIG_BLK_DEV_IDEPCI=y
+CONFIG_BLK_DEV_IDEDMA=y
+# CONFIG_BLK_DEV_OFFBOARD is not set
+CONFIG_IDEDMA_AUTO=y
+# CONFIG_BLK_DEV_OPTI621 is not set
+# CONFIG_BLK_DEV_TRM290 is not set
+# CONFIG_BLK_DEV_NS87415 is not set
+# CONFIG_BLK_DEV_VIA82C586 is not set
+CONFIG_BLK_DEV_CMD646=y
 # CONFIG_BLK_DEV_SL82C105 is not set
 CONFIG_BLK_DEV_IDE_PMAC=y
 CONFIG_BLK_DEV_IDEDMA_PMAC=y
@@ -84,14 +94,16 @@
 #
 # Additional Block Devices
 #
-# CONFIG_BLK_DEV_LOOP is not set
+CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_NBD is not set
 # CONFIG_BLK_DEV_MD is not set
 CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_INITRD=y
 # CONFIG_BLK_DEV_XD is not set
-CONFIG_PARIDE_PARPORT=y
+# CONFIG_BLK_DEV_DAC960 is not set
+CONFIG_PARIDE_PARPORT=m
 # CONFIG_PARIDE is not set
+# CONFIG_BLK_CPQ_DA is not set
 # CONFIG_BLK_DEV_HD is not set
 
 #
@@ -119,7 +131,6 @@
 # (it is safe to leave these untouched)
 #
 CONFIG_INET_RARP=y
-CONFIG_IP_NOSR=y
 CONFIG_SKB_LARGE=y
 # CONFIG_IPV6 is not set
 
@@ -173,7 +184,8 @@
 # CONFIG_SCSI_AHA1542 is not set
 # CONFIG_SCSI_AHA1740 is not set
 CONFIG_SCSI_AIC7XXX=y
-# CONFIG_OVERRIDE_CMDS is not set
+# CONFIG_AIC7XXX_TCQ_ON_BY_DEFAULT is not set
+CONFIG_AIC7XXX_CMDS_PER_DEVICE=8
 CONFIG_AIC7XXX_PROC_STATS=y
 CONFIG_AIC7XXX_RESET_DELAY=15
 # CONFIG_SCSI_ADVANSYS is not set
@@ -189,15 +201,28 @@
 # CONFIG_SCSI_GDTH is not set
 # CONFIG_SCSI_GENERIC_NCR5380 is not set
 # CONFIG_SCSI_INITIO is not set
+# CONFIG_SCSI_INIA100 is not set
+# CONFIG_SCSI_PPA is not set
+# CONFIG_SCSI_IMM is not set
 # CONFIG_SCSI_NCR53C406A is not set
+# CONFIG_SCSI_SYM53C416 is not set
 # CONFIG_SCSI_NCR53C7xx is not set
-# CONFIG_SCSI_NCR53C8XX is not set
+CONFIG_SCSI_NCR53C8XX=y
+CONFIG_SCSI_SYM53C8XX=y
+CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS=8
+CONFIG_SCSI_NCR53C8XX_MAX_TAGS=32
+CONFIG_SCSI_NCR53C8XX_SYNC=20
+# CONFIG_SCSI_NCR53C8XX_PROFILE is not set
+# CONFIG_SCSI_NCR53C8XX_IOMAPPED is not set
+# CONFIG_SCSI_NCR53C8XX_PQS_PDS is not set
+CONFIG_SCSI_NCR53C8XX_SYMBIOS_COMPAT=y
 # CONFIG_SCSI_PAS16 is not set
 # CONFIG_SCSI_PCI2000 is not set
 # CONFIG_SCSI_PCI2220I is not set
 # CONFIG_SCSI_PSI240I is not set
 # CONFIG_SCSI_QLOGIC_FAS is not set
 # CONFIG_SCSI_QLOGIC_ISP is not set
+# CONFIG_SCSI_QLOGIC_FC is not set
 # CONFIG_SCSI_SEAGATE is not set
 # CONFIG_SCSI_DC390T is not set
 # CONFIG_SCSI_T128 is not set
@@ -212,10 +237,18 @@
 # Network device support
 #
 CONFIG_NETDEVICES=y
+
+#
+# ARCnet devices
+#
 # CONFIG_ARCNET is not set
 # CONFIG_DUMMY is not set
 # CONFIG_EQUALIZER is not set
 # CONFIG_ETHERTAP is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
 CONFIG_NET_ETHERNET=y
 CONFIG_MACE=y
 CONFIG_BMAC=y
@@ -225,10 +258,10 @@
 # CONFIG_NET_VENDOR_RACAL is not set
 # CONFIG_RTL8139 is not set
 # CONFIG_YELLOWFIN is not set
-# CONFIG_ACENIC is not set
 # CONFIG_NET_ISA is not set
 CONFIG_NET_EISA=y
 # CONFIG_PCNET32 is not set
+# CONFIG_ACENIC is not set
 # CONFIG_AC3200 is not set
 # CONFIG_APRICOT is not set
 # CONFIG_CS89x0 is not set
@@ -247,22 +280,36 @@
 # CONFIG_NET_POCKET is not set
 # CONFIG_FDDI is not set
 # CONFIG_HIPPI is not set
-# CONFIG_DLCI is not set
+
+#
+# Appletalk devices
+#
 # CONFIG_LTPC is not set
 # CONFIG_COPS is not set
 # CONFIG_IPDDP is not set
-CONFIG_PPP=y
+# CONFIG_PLIP is not set
+CONFIG_PPP=m
 
 #
 # CCP compressors for PPP are only built as modules.
 #
 # CONFIG_SLIP is not set
 # CONFIG_NET_RADIO is not set
+
+#
+# Token ring devices
+#
 # CONFIG_TR is not set
+# CONFIG_RCPCI is not set
 # CONFIG_SHAPER is not set
+
+#
+# Wan interfaces
+#
 # CONFIG_HOSTESS_SV11 is not set
 # CONFIG_COSA is not set
-# CONFIG_RCPCI is not set
+# CONFIG_SEALEVEL_4021 is not set
+# CONFIG_DLCI is not set
 
 #
 # Amateur Radio support
@@ -275,7 +322,7 @@
 # CONFIG_ISDN is not set
 
 #
-# CD-ROM drivers (not for SCSI or IDE/ATAPI drives)
+# Old CD-ROM drivers (not SCSI, not IDE)
 #
 # CONFIG_CD_NO_IDESCSI is not set
 
@@ -283,6 +330,7 @@
 # Console drivers
 #
 CONFIG_DUMMY_CONSOLE=y
+# CONFIG_FB_PM2 is not set
 CONFIG_FB_OF=y
 CONFIG_FB_CONTROL=y
 CONFIG_FB_PLATINUM=y
@@ -319,6 +367,7 @@
 # CONFIG_SERIAL_NONSTANDARD is not set
 CONFIG_UNIX98_PTYS=y
 CONFIG_UNIX98_PTY_COUNT=256
+# CONFIG_PRINTER is not set
 # CONFIG_MOUSE is not set
 # CONFIG_QIC02_TAPE is not set
 # CONFIG_WATCHDOG is not set
@@ -334,6 +383,7 @@
 # Joystick support
 #
 # CONFIG_JOYSTICK is not set
+# CONFIG_DTLK is not set
 
 #
 # Ftape, the floppy tape device driver
@@ -341,6 +391,11 @@
 # CONFIG_FTAPE is not set
 
 #
+# USB drivers - not for the faint of heart
+#
+# CONFIG_USB is not set
+
+#
 # Filesystems
 #
 # CONFIG_QUOTA is not set
@@ -364,6 +419,7 @@
 CONFIG_EXT2_FS=y
 # CONFIG_SYSV_FS is not set
 # CONFIG_UFS_FS is not set
+# CONFIG_EFS_FS is not set
 
 #
 # Network File Systems
@@ -415,7 +471,7 @@
 # CONFIG_NLS_ISO8859_7 is not set
 # CONFIG_NLS_ISO8859_8 is not set
 # CONFIG_NLS_ISO8859_9 is not set
-# CONFIG_NLS_ISO8859_15 is not set
+CONFIG_NLS_ISO8859_15=y
 # CONFIG_NLS_KOI8_R is not set
 
 #
@@ -429,3 +485,10 @@
 # CONFIG_SOUND_MSNDCLAS is not set
 # CONFIG_SOUND_MSNDPIN is not set
 # CONFIG_SOUND_OSS is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_KGDB is not set
+# CONFIG_XMON is not set
diff -urN linux-2.2.11-pre2/arch/ppc/kernel/chrp_pci.c linux/arch/ppc/kernel/chrp_pci.c
--- linux-2.2.11-pre2/arch/ppc/kernel/chrp_pci.c	Fri Jun  4 13:30:47 1999
+++ linux/arch/ppc/kernel/chrp_pci.c	Mon Dec  3 18:52:25 2001
@@ -96,7 +96,7 @@
 #define python_config_data(bus) ((0xfef00000+0xf8010)-(bus*0x100000))
 #define PYTHON_CFA(b, d, o)	(0x80 | ((b<<6) << 8) | ((d) << 16) \
 				 | (((o) & ~3) << 24))
-unsigned int python_busnr = 1;
+unsigned int python_busnr = 0;
 
 int python_pcibios_read_config_byte(unsigned char bus, unsigned char dev_fn,
 				    unsigned char offset, unsigned char *val)
@@ -353,7 +353,8 @@
                 }
                 else
                 {
-			if ( !strncmp("IBM,7043-150", get_property(find_path_device("/"), "name", NULL),12) )
+			if ( !strncmp("IBM,7043-150", get_property(find_path_device("/"), "name", NULL),12) ||
+			     !strncmp("IBM,7046-155", get_property(find_path_device("/"), "name", NULL),12) )
 			{
 				pci_dram_offset = 0;
 				isa_mem_base = 0x80000000;
diff -urN linux-2.2.11-pre2/arch/ppc/kernel/chrp_setup.c linux/arch/ppc/kernel/chrp_setup.c
--- linux-2.2.11-pre2/arch/ppc/kernel/chrp_setup.c	Fri Jun  4 13:30:47 1999
+++ linux/arch/ppc/kernel/chrp_setup.c	Mon Dec  3 18:52:25 2001
@@ -295,7 +295,7 @@
 		struct property *p;
 		device = find_devices("rtas");
 		for ( p = device->properties;
-		      strncmp(p->name, "rtas-event-scan-rate", 20) && p ;
+		      p && strncmp(p->name, "rtas-event-scan-rate", 20);
 		      p = p->next )
 			/* nothing */ ;
 		if ( p && *(unsigned long *)p->value )
@@ -331,12 +331,8 @@
 chrp_power_off(void)
 {
 	/* allow power on only with power button press */
-#define	PWR_FIELD(x) (0x8000000000000000 >> ((x)-96))
 	printk("RTAS power-off returned %d\n",
-	       call_rtas("power-off", 2, 1, NULL,
-			 ((PWR_FIELD(96)|PWR_FIELD(97))>>32)&0xffffffff,
-			 (PWR_FIELD(96)|PWR_FIELD(97))&0xffffffff));
-#undef PWR_FIELD	
+	       call_rtas("power-off", 2, 1, NULL,0xffffffff,0xffffffff));
 	for (;;);
 }
 
@@ -475,6 +471,45 @@
 
 	/* Should this be here? - Corey */
 	pmac_nvram_init();
+
+#ifdef CONFIG_VT
+#ifdef CONFIG_MAC_KEYBOARD
+	if ( adb_hardware == ADB_NONE )
+	{
+		ppc_md.kbd_setkeycode    = pckbd_setkeycode;
+		ppc_md.kbd_getkeycode    = pckbd_getkeycode;
+		ppc_md.kbd_translate     = pckbd_translate;
+		ppc_md.kbd_unexpected_up = pckbd_unexpected_up;
+		ppc_md.kbd_leds          = pckbd_leds;
+		ppc_md.kbd_init_hw       = pckbd_init_hw;
+#ifdef CONFIG_MAGIC_SYSRQ
+		ppc_md.kbd_sysrq_xlate	 = pckbd_sysrq_xlate;
+#endif		
+	}
+	else
+	{
+		ppc_md.kbd_setkeycode    = mackbd_setkeycode;
+		ppc_md.kbd_getkeycode    = mackbd_getkeycode;
+		ppc_md.kbd_translate     = mackbd_translate;
+		ppc_md.kbd_unexpected_up = mackbd_unexpected_up;
+		ppc_md.kbd_leds          = mackbd_leds;
+		ppc_md.kbd_init_hw       = mackbd_init_hw;
+#ifdef CONFIG_MAGIC_SYSRQ
+		ppc_md.kbd_sysrq_xlate	 = mackbd_sysrq_xlate;
+#endif		
+	}
+#else
+	ppc_md.kbd_setkeycode    = pckbd_setkeycode;
+	ppc_md.kbd_getkeycode    = pckbd_getkeycode;
+	ppc_md.kbd_translate     = pckbd_translate;
+	ppc_md.kbd_unexpected_up = pckbd_unexpected_up;
+	ppc_md.kbd_leds          = pckbd_leds;
+	ppc_md.kbd_init_hw       = pckbd_init_hw;
+#ifdef CONFIG_MAGIC_SYSRQ
+	ppc_md.kbd_sysrq_xlate	 = pckbd_sysrq_xlate;
+#endif
+#endif
+#endif
 }
 
 #if defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_IDE_MODULE)
@@ -584,10 +619,10 @@
 	chrp_setup_pci_ptrs();
 #ifdef CONFIG_BLK_DEV_INITRD
 	/* take care of initrd if we have one */
-	if ( r3 )
+	if ( r6 )
 	{
-		initrd_start = r3 + KERNELBASE;
-		initrd_end = r3 + r4 + KERNELBASE;
+		initrd_start = r6 + KERNELBASE;
+		initrd_end = r6 + r7 + KERNELBASE;
 	}
 #endif /* CONFIG_BLK_DEV_INITRD */
 
@@ -614,44 +649,6 @@
 	ppc_md.get_rtc_time   = chrp_get_rtc_time;
 	ppc_md.calibrate_decr = chrp_calibrate_decr;
 
-#ifdef CONFIG_VT
-#ifdef CONFIG_MAC_KEYBOAD
-	if ( adb_hardware == ADB_NONE )
-	{
-		ppc_md.kbd_setkeycode    = pckbd_setkeycode;
-		ppc_md.kbd_getkeycode    = pckbd_getkeycode;
-		ppc_md.kbd_translate     = pckbd_translate;
-		ppc_md.kbd_unexpected_up = pckbd_unexpected_up;
-		ppc_md.kbd_leds          = pckbd_leds;
-		ppc_md.kbd_init_hw       = pckbd_init_hw;
-#ifdef CONFIG_MAGIC_SYSRQ
-		ppc_md.kbd_sysrq_xlate	 = pckbd_sysrq_xlate;
-#endif		
-	}
-	else
-	{
-		ppc_md.kbd_setkeycode    = mackbd_setkeycode;
-		ppc_md.kbd_getkeycode    = mackbd_getkeycode;
-		ppc_md.kbd_translate     = mackbd_translate;
-		ppc_md.kbd_unexpected_up = mackbd_unexpected_up;
-		ppc_md.kbd_leds          = mackbd_leds;
-		ppc_md.kbd_init_hw       = mackbd_init_hw;
-#ifdef CONFIG_MAGIC_SYSRQ
-		ppc_md.kbd_sysrq_xlate	 = mackbd_sysrq_xlate;
-#endif		
-	}
-#else
-	ppc_md.kbd_setkeycode    = pckbd_setkeycode;
-	ppc_md.kbd_getkeycode    = pckbd_getkeycode;
-	ppc_md.kbd_translate     = pckbd_translate;
-	ppc_md.kbd_unexpected_up = pckbd_unexpected_up;
-	ppc_md.kbd_leds          = pckbd_leds;
-	ppc_md.kbd_init_hw       = pckbd_init_hw;
-#ifdef CONFIG_MAGIC_SYSRQ
-	ppc_md.kbd_sysrq_xlate	 = pckbd_sysrq_xlate;
-#endif
-#endif
-#endif
 
 #if defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_IDE_MODULE)
         ppc_ide_md.insw = chrp_ide_insw;
@@ -675,8 +672,6 @@
 
 void chrp_progress(char *s)
 {
-	extern unsigned int rtas_data;
-	
 	if ( (_machine != _MACH_chrp) || !rtas_data )
 		return;
 	call_rtas( "display-character", 1, 1, NULL, '\r' );
diff -urN linux-2.2.11-pre2/arch/ppc/kernel/head.S linux/arch/ppc/kernel/head.S
--- linux-2.2.11-pre2/arch/ppc/kernel/head.S	Fri Jun  4 13:30:47 1999
+++ linux/arch/ppc/kernel/head.S	Mon Dec  3 18:52:25 2001
@@ -1,7 +1,7 @@
 /*
  *  arch/ppc/kernel/head.S
  *
- *  $Id: head.S,v 1.130.2.1 1999/05/29 19:09:59 cort Exp $
+ *  $Id: head.S,v 1.130.2.2 1999/06/30 04:53:21 paulus Exp $
  *
  *  PowerPC version 
  *    Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
@@ -300,7 +300,7 @@
 	oris	r21,r11,(KERNELBASE+0x20000000)@h
 	mtspr	DBAT2L,r18		/* N.B. 6xx (not 601) have valid */
 	mtspr	DBAT2U,r21		/* bit in upper BAT register */
-	mtspr	IBAT2L,r28
+	mtspr	IBAT2L,r18
 	mtspr	IBAT2U,r21
 #endif /* CONFIG_PPC64 */
 #endif
diff -urN linux-2.2.11-pre2/arch/ppc/kernel/idle.c linux/arch/ppc/kernel/idle.c
--- linux-2.2.11-pre2/arch/ppc/kernel/idle.c	Fri Jun  4 13:30:47 1999
+++ linux/arch/ppc/kernel/idle.c	Mon Dec  3 18:52:25 2001
@@ -1,5 +1,5 @@
 /*
- * $Id: idle.c,v 1.61.2.1 1999/05/29 19:10:02 cort Exp $
+ * $Id: idle.c,v 1.61.2.2 1999/06/15 16:54:14 cort Exp $
  *
  * Idle daemon for PowerPC.  Idle daemon will handle any action
  * that needs to be taken when the system becomes idle.
@@ -298,7 +298,7 @@
 	case 7:			/* 603ev */
 	case 8:			/* 750 */
 		save_flags(msr);
-		cli();
+		__cli();
 		if (!current->need_resched) {
 			asm("mfspr %0,1008" : "=r" (hid0) :);
 			hid0 &= ~(HID0_NAP | HID0_SLEEP | HID0_DOZE);
diff -urN linux-2.2.11-pre2/arch/ppc/kernel/irq.c linux/arch/ppc/kernel/irq.c
--- linux-2.2.11-pre2/arch/ppc/kernel/irq.c	Mon Dec  3 18:51:52 2001
+++ linux/arch/ppc/kernel/irq.c	Mon Dec  3 18:52:25 2001
@@ -1,5 +1,5 @@
 /*
- * $Id: irq.c,v 1.105.2.1 1999/05/29 19:10:05 cort Exp $
+ * $Id: irq.c,v 1.105.2.2 1999/06/17 01:16:10 paulus Exp $
  *
  *  arch/ppc/kernel/irq.c
  *
@@ -50,6 +50,7 @@
 #include <asm/io.h>
 #include <asm/pgtable.h>
 #include <asm/irq.h>
+#include <asm/bitops.h>
 #include <asm/gg2.h>
 #include <asm/cache.h>
 #include <asm/prom.h>
@@ -186,6 +187,12 @@
 void free_irq(unsigned int irq, void *dev_id)
 {
 	request_irq(irq, NULL, 0, NULL, dev_id);
+}
+
+/* XXX should implement irq disable depth like on intel */
+void disable_irq_nosync(unsigned int irq_nr)
+{
+	mask_irq(irq_nr);
 }
 
 void disable_irq(unsigned int irq_nr)
diff -urN linux-2.2.11-pre2/arch/ppc/kernel/misc.S linux/arch/ppc/kernel/misc.S
--- linux-2.2.11-pre2/arch/ppc/kernel/misc.S	Fri Jun  4 13:30:47 1999
+++ linux/arch/ppc/kernel/misc.S	Mon Dec  3 18:52:25 2001
@@ -650,17 +650,19 @@
 
 /*
  * Create a kernel thread
- *   __kernel_thread(flags, fn, arg)
+ *   kernel_thread(fn, arg, flags)
  */
-_GLOBAL(__kernel_thread)
+_GLOBAL(kernel_thread)
+	mr	r6,r3		/* function */
+	ori	r3,r5,CLONE_VM	/* flags */
 	li	r0,__NR_clone
 	sc
 	cmpi	0,r3,0		/* parent or child? */
 	bnelr			/* return if parent */
 	li	r0,0		/* clear out p->tss.regs */
 	stw	r0,TSS+PT_REGS(r2)	/* since we don't have user ctx */
-	mtlr	r4              /* fn addr in lr */
-	mr	r3,r5	        /* load arg and call fn */
+	mtlr	r6              /* fn addr in lr */
+	mr	r3,r4	        /* load arg and call fn */
 	blrl
 	li	r0,__NR_exit	/* exit after child exits */
         li	r3,0
@@ -866,7 +868,7 @@
 	.long sys_getresuid	/* 165 */
 	.long sys_query_module
 	.long sys_poll
-#ifdef CONFIG_NFS	
+#ifdef CONFIG_NFSD
 	.long sys_nfsservctl
 #else
 	.long sys_ni_syscall
diff -urN linux-2.2.11-pre2/arch/ppc/kernel/mk_defs.c linux/arch/ppc/kernel/mk_defs.c
--- linux-2.2.11-pre2/arch/ppc/kernel/mk_defs.c	Tue May 11 08:24:32 1999
+++ linux/arch/ppc/kernel/mk_defs.c	Mon Dec  3 18:52:25 2001
@@ -97,5 +97,6 @@
 	DEFINE(ORIG_GPR3, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, orig_gpr3));
 	DEFINE(RESULT, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, result));
 	DEFINE(TRAP, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, trap));
+	DEFINE(CLONE_VM, CLONE_VM);
 	return 0;
 }
diff -urN linux-2.2.11-pre2/arch/ppc/kernel/pmac_setup.c linux/arch/ppc/kernel/pmac_setup.c
--- linux-2.2.11-pre2/arch/ppc/kernel/pmac_setup.c	Mon Dec  3 18:51:52 2001
+++ linux/arch/ppc/kernel/pmac_setup.c	Mon Dec  3 18:52:25 2001
@@ -41,6 +41,7 @@
 #include <linux/blk.h>
 #include <linux/vt_kern.h>
 #include <linux/console.h>
+#include <linux/pci.h>
 #include <asm/prom.h>
 #include <asm/system.h>
 #include <asm/pgtable.h>
@@ -48,7 +49,6 @@
 #include <asm/io.h>
 #include <asm/pci-bridge.h>
 #include <asm/adb.h>
-#include <asm/dma.h>
 #include <asm/cuda.h>
 #include <asm/pmu.h>
 #include <asm/ohare.h>
@@ -98,6 +98,7 @@
 
 extern void zs_kgdb_hook(int tty_num);
 static void ohare_init(void);
+static void init_p2pbridge(void);
 
 __pmac
 int
@@ -255,6 +256,7 @@
 	ohare_init();
 
 	*memory_start_p = pmac_find_bridges(*memory_start_p, *memory_end_p);
+	init_p2pbridge();
 
 	/* Checks "l2cr-value" property in the registry */
 	if ( (_get_PVR() >> 16) == 8) {
@@ -299,6 +301,31 @@
 		ROOT_DEV = to_kdev_t(DEFAULT_ROOT_DEVICE);
 }
 
+/*
+ * Tweak the PCI-PCI bridge chip on the blue & white G3s.
+ */
+__initfunc(static void init_p2pbridge(void))
+{
+	struct device_node *p2pbridge;
+	unsigned char bus, devfn;
+	unsigned short val;
+
+	/* XXX it would be better here to identify the specific
+	   PCI-PCI bridge chip we have. */
+	if ((p2pbridge = find_devices("pci-bridge")) == 0
+	    || p2pbridge->parent == NULL
+	    || strcmp(p2pbridge->parent->name, "pci") != 0)
+		return;
+
+	if (pci_device_loc(p2pbridge, &bus, &devfn) < 0)
+		return;
+
+	pcibios_read_config_word(bus, devfn, PCI_BRIDGE_CONTROL, &val);
+	val &= ~PCI_BRIDGE_CTL_MASTER_ABORT;
+	pcibios_write_config_word(bus, devfn, PCI_BRIDGE_CONTROL, val);
+	pcibios_read_config_word(bus, devfn, PCI_BRIDGE_CONTROL, &val);
+}
+
 __initfunc(static void ohare_init(void))
 {
 	/*
@@ -488,13 +515,13 @@
 void
 pmac_ide_insw(ide_ioreg_t port, void *buf, int ns)
 {
-	ide_insw(port, buf, ns);
+	ide_insw(port+_IO_BASE, buf, ns);
 }
 
 void
 pmac_ide_outsw(ide_ioreg_t port, void *buf, int ns)
 {
-	ide_outsw(port, buf, ns);
+	ide_outsw(port+_IO_BASE, buf, ns);
 }
 
 int
@@ -601,7 +628,9 @@
         ppc_ide_md.fix_driveid = pmac_ide_fix_driveid;
         ppc_ide_md.ide_init_hwif = pmac_ide_init_hwif_ports;
 
-        ppc_ide_md.io_base = 0;
+	/* _IO_BASE isn't set yet, so it's just as well that
+	   ppc_ide_md.io_base isn't used any more. :-) */
+        ppc_ide_md.io_base = _IO_BASE;
 #endif		
 }
 
diff -urN linux-2.2.11-pre2/arch/ppc/kernel/ppc_htab.c linux/arch/ppc/kernel/ppc_htab.c
--- linux-2.2.11-pre2/arch/ppc/kernel/ppc_htab.c	Mon Dec 21 08:37:20 1998
+++ linux/arch/ppc/kernel/ppc_htab.c	Mon Dec  3 18:52:25 2001
@@ -253,6 +253,8 @@
 		return 0;
 	if (n > strlen(buffer) - *ppos)
 		n = strlen(buffer) - *ppos;
+	if (n > count)
+		n = count;
 	copy_to_user(buf, buffer + *ppos, n);
 	*ppos += n;
 	return n;
diff -urN linux-2.2.11-pre2/arch/ppc/kernel/ppc_ksyms.c linux/arch/ppc/kernel/ppc_ksyms.c
--- linux-2.2.11-pre2/arch/ppc/kernel/ppc_ksyms.c	Thu Apr 29 12:39:01 1999
+++ linux/arch/ppc/kernel/ppc_ksyms.c	Mon Dec  3 18:52:25 2001
@@ -30,8 +30,8 @@
 #include <asm/dma.h>
 #include <asm/machdep.h>
 
-#define __KERNEL_SYSCALLS__
-#include <linux/unistd.h>
+/* Tell string.h we don't want memcpy etc. as cpp defines */
+#define EXPORT_SYMTAB_STROPS
 
 extern void transfer_to_handler(void);
 extern void int_return(void);
@@ -55,7 +55,6 @@
 EXPORT_SYMBOL(transfer_to_handler);
 EXPORT_SYMBOL(int_return);
 EXPORT_SYMBOL(do_IRQ);
-EXPORT_SYMBOL(init_task_union);
 EXPORT_SYMBOL(MachineCheckException);
 EXPORT_SYMBOL(AlignmentException);
 EXPORT_SYMBOL(ProgramCheckException);
@@ -65,6 +64,7 @@
 EXPORT_SYMBOL(do_lost_interrupts);
 EXPORT_SYMBOL(enable_irq);
 EXPORT_SYMBOL(disable_irq);
+EXPORT_SYMBOL(disable_irq_nosync);
 EXPORT_SYMBOL(ppc_local_irq_count);
 EXPORT_SYMBOL(ppc_local_bh_count);
 
@@ -111,11 +111,6 @@
 EXPORT_SYMBOL(strspn);
 EXPORT_SYMBOL(strcmp);
 EXPORT_SYMBOL(strncmp);
-EXPORT_SYMBOL(memset);
-EXPORT_SYMBOL(memcpy);
-EXPORT_SYMBOL(memmove);
-EXPORT_SYMBOL(memscan);
-EXPORT_SYMBOL(memcmp);
 
 /* EXPORT_SYMBOL(csum_partial); already in net/netsyms.c */
 EXPORT_SYMBOL(csum_partial_copy_generic);
@@ -152,9 +147,10 @@
 
 EXPORT_SYMBOL(ide_insw);
 EXPORT_SYMBOL(ide_outsw);
+EXPORT_SYMBOL(ppc_ide_md);
 
 EXPORT_SYMBOL(start_thread);
-EXPORT_SYMBOL(__kernel_thread);
+EXPORT_SYMBOL(kernel_thread);
 
 EXPORT_SYMBOL(__cli);
 EXPORT_SYMBOL(__sti);
@@ -217,8 +213,9 @@
 EXPORT_SYMBOL(abs);
 EXPORT_SYMBOL(device_is_compatible);
 
-/* The following are special because they're not called
-   explicitly (the C compiler generates them).  Fortunately,
-   their interface isn't gonna change any time soon now, so
-   it's OK to leave it out of version control.  */
 EXPORT_SYMBOL_NOVERS(__ashrdi3);
+EXPORT_SYMBOL_NOVERS(memcpy);
+EXPORT_SYMBOL_NOVERS(memset);
+EXPORT_SYMBOL_NOVERS(memmove);
+EXPORT_SYMBOL_NOVERS(memscan);
+EXPORT_SYMBOL_NOVERS(memcmp);
diff -urN linux-2.2.11-pre2/arch/ppc/kernel/prom.c linux/arch/ppc/kernel/prom.c
--- linux-2.2.11-pre2/arch/ppc/kernel/prom.c	Fri Jun  4 13:30:47 1999
+++ linux/arch/ppc/kernel/prom.c	Mon Dec  3 18:52:25 2001
@@ -1,5 +1,5 @@
 /*
- * $Id: prom.c,v 1.54.2.1 1999/05/29 19:10:12 cort Exp $
+ * $Id: prom.c,v 1.54.2.3 1999/07/02 19:58:27 cort Exp $
  *
  * Procedures for interfacing to the Open Firmware PROM on
  * Power Macintosh computers.
@@ -338,7 +338,9 @@
 			 */
 			model = (char *) early_get_property
 				(r4 + bi->deviceTreeOffset, 4, RELOC("model"));
-			if (model && strcmp(model, RELOC("iMac,1")) == 0) {
+			if (model
+			    && (strcmp(model, RELOC("iMac,1")) == 0
+				|| strcmp(model, RELOC("PowerMac1,1")) == 0)) {
 				out_le32((unsigned *)0x80880008, 1);	/* XXX */
 			}
 		}
@@ -500,8 +502,8 @@
 			return;
 		
 		/* copy the holding pattern code to someplace safe (8M) */
-		memcpy( (void *)(8<<20), RELOC(__secondary_hold), 0x10000 );
-		for (i = 8<<20; i < ((8<<20)+0x10000); i += 32)
+		memcpy( (void *)(8<<20), RELOC(__secondary_hold), 0x100 );
+		for (i = 8<<20; i < ((8<<20)+0x100); i += 32)
 		{
 			asm volatile("dcbf 0,%0" : : "r" (i) : "memory");
 			asm volatile("icbi 0,%0" : : "r" (i) : "memory");
@@ -887,11 +889,11 @@
 	    && (imp = (struct pci_intr_map *)
 		get_property(np->parent, "interrupt-map", &ml)) != 0
 	    && (ip = (int *) get_property(np, "interrupts", &l)) != 0) {
-		unsigned int busdevfn = pci_addrs[0].addr.a_hi & 0xffff00;
+		unsigned int devfn = pci_addrs[0].addr.a_hi & 0xff00;
 		np->n_intrs = 0;
 		np->intrs = (struct interrupt_info *) mem_start;
 		for (i = 0; (ml -= sizeof(struct pci_intr_map)) >= 0; ++i) {
-			if (imp[i].addr.a_hi == busdevfn) {
+			if (imp[i].addr.a_hi == devfn) {
 				np->intrs[np->n_intrs].line = imp[i].intr;
 				np->intrs[np->n_intrs].sense = 0;
 				++np->n_intrs;
diff -urN linux-2.2.11-pre2/arch/ppc/kernel/signal.c linux/arch/ppc/kernel/signal.c
--- linux-2.2.11-pre2/arch/ppc/kernel/signal.c	Thu Apr 29 12:39:01 1999
+++ linux/arch/ppc/kernel/signal.c	Mon Dec  3 18:52:25 2001
@@ -1,7 +1,7 @@
 /*
  *  linux/arch/ppc/kernel/signal.c
  *
- *  $Id: signal.c,v 1.24 1999/04/03 11:25:16 paulus Exp $
+ *  $Id: signal.c,v 1.24.2.1 1999/06/17 01:18:22 paulus Exp $
  *
  *  PowerPC version 
  *    Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
@@ -455,6 +455,7 @@
 			default:
 				lock_kernel();
 				sigaddset(&current->signal, signr);
+				recalc_sigpending(current);
 				current->flags |= PF_SIGNALED;
 				do_exit(exit_code);
 				/* NOTREACHED */
diff -urN linux-2.2.11-pre2/arch/ppc/kernel/smp.c linux/arch/ppc/kernel/smp.c
--- linux-2.2.11-pre2/arch/ppc/kernel/smp.c	Fri Jun  4 13:30:47 1999
+++ linux/arch/ppc/kernel/smp.c	Mon Dec  3 18:52:25 2001
@@ -1,5 +1,5 @@
 /*
- * $Id: smp.c,v 1.49.2.1 1999/05/29 19:10:20 cort Exp $
+ * $Id: smp.c,v 1.49.2.3 1999/06/24 17:12:55 cort Exp $
  *
  * Smp support for ppc.
  *
@@ -243,20 +243,21 @@
 {
 	extern struct task_struct *current_set[NR_CPUS];
 	extern void __secondary_start_psurge(void);
-	int i;
+	extern void __secondary_start_chrp(void);
+	int i, cpu_nr;
 	struct task_struct *p;
 	unsigned long a;
 
         printk("Entering SMP Mode...\n");
 	/* let other processors know to not do certain initialization */
 	first_cpu_booted = 1;
+	smp_num_cpus = 1;
 	
 	/*
 	 * assume for now that the first cpu booted is
 	 * cpu 0, the master -- Cort
 	 */
 	cpu_callin_map[0] = 1;
-	cpu_callin_map[1] = 0;
         smp_store_cpu_info(0);
         active_kernel_processor = 0;
 	current->processor = 0;
@@ -282,16 +283,12 @@
 	{
 	case _MACH_Pmac:
 		/* assume powersurge board - 2 processors -- Cort */
-		smp_num_cpus = 2; 
+		cpu_nr = 2; 
 		break;
 	case _MACH_chrp:
-		smp_num_cpus = ((openpic_read(&OpenPIC->Global.Feature_Reporting0)
+		cpu_nr = ((openpic_read(&OpenPIC->Global.Feature_Reporting0)
 				 & OPENPIC_FEATURE_LAST_PROCESSOR_MASK) >>
 				OPENPIC_FEATURE_LAST_PROCESSOR_SHIFT)+1;
-		/* get our processor # - we may not be cpu 0 */
-		printk("SMP %d processors, boot CPU is %d (should be 0)\n",
-		       smp_num_cpus,
-		       10/*openpic_read(&OpenPIC->Processor[0]._Who_Am_I)*/);
 		break;
 	}
 
@@ -299,7 +296,7 @@
 	 * only check for cpus we know exist.  We keep the callin map
 	 * with cpus at the bottom -- Cort
 	 */
-	for ( i = 1 ; i < smp_num_cpus; i++ )
+	for ( i = 1 ; i < cpu_nr; i++ )
 	{
 		int c;
 		
@@ -332,6 +329,19 @@
 		case _MACH_chrp:
 			*(unsigned long *)KERNELBASE = i;
 			asm volatile("dcbf 0,%0"::"r"(KERNELBASE):"memory");
+#if 0
+			device = find_type_devices("cpu");
+			/* assume cpu device list is in order, find the ith cpu */
+			for ( a = i; device && a; device = device->next, a-- )
+				;
+			if ( !device )
+				break;
+			printk( "Starting %s (%lu): ", device->full_name,
+				*(ulong *)get_property(device, "reg", NULL) );
+			call_rtas( "start-cpu", 3, 1, NULL,
+				   *(ulong *)get_property(device, "reg", NULL),
+				   __pa(__secondary_start_chrp), i);
+#endif			
 			break;
 		}
 		
@@ -349,6 +359,7 @@
 			/* this sync's the decr's -- Cort */
 			if ( _machine == _MACH_Pmac )
 				set_dec(decrementer_count);
+			smp_num_cpus++;
 		} else {
 			printk("Processor %d is stuck.\n", i);
 		}
@@ -366,7 +377,6 @@
 
 void __init smp_commence(void)
 {
-	printk("SMP %d: smp_commence()\n",current->processor);
 	/*
 	 *	Lets the callin's below out of their loop.
 	 */
@@ -381,16 +391,12 @@
 /* Activate a secondary processor. */
 asmlinkage int __init start_secondary(void *unused)
 {
-	printk("SMP %d: start_secondary()\n",current->processor);
 	smp_callin();
 	return cpu_idle(NULL);
 }
 
 void __init smp_callin(void)
 {
-	int i;
-	
-	printk("SMP %d: smp_callin()\n",current->processor);
         smp_store_cpu_info(current->processor);
 	set_dec(decrementer_count);
 	
@@ -407,7 +413,6 @@
 
 void __init smp_setup(char *str, int *ints)
 {
-	printk("SMP %d: smp_setup()\n",current->processor);
 }
 
 int __init setup_profiling_timer(unsigned int multiplier)
diff -urN linux-2.2.11-pre2/arch/ppc/mm/init.c linux/arch/ppc/mm/init.c
--- linux-2.2.11-pre2/arch/ppc/mm/init.c	Fri Jun  4 13:30:47 1999
+++ linux/arch/ppc/mm/init.c	Mon Dec  3 18:52:25 2001
@@ -1,5 +1,5 @@
 /*
- *  $Id: init.c,v 1.164.2.2 1999/06/03 03:03:53 paulus Exp $
+ *  $Id: init.c,v 1.164.2.4 1999/06/17 19:05:21 cort Exp $
  *
  *  PowerPC version 
  *    Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
@@ -268,9 +268,12 @@
 	{	
 		printk("%-8.8s %3d %3d %8ld %8ld %8ld %c%08lx %08lx ",
 		       p->comm,p->pid,
-		       atomic_read(&p->mm->count),p->mm->context,
-		       p->mm->context<<4, p->tss.last_syscall,
-		       user_mode(p->tss.regs) ? 'u' : 'k', p->tss.regs->nip,
+		       (p->mm)?atomic_read(&p->mm->count):0,
+		       (p->mm)?p->mm->context:0,
+		       (p->mm)?(p->mm->context<<4):0,
+		       p->tss.last_syscall,
+		       (p->tss.regs)?user_mode(p->tss.regs) ? 'u' : 'k' : '?',
+		       (p->tss.regs)?p->tss.regs->nip:0,
 		       (ulong)p);
 		{
 			int iscur = 0;
@@ -1301,7 +1304,7 @@
 	int i;
 	
 	/* max amount of RAM we allow -- Cort */
-#define RAM_LIMIT (768<<20)
+#define RAM_LIMIT (256<<20)
 
 	memory_node = find_devices("memory");
 	if (memory_node == NULL) {
diff -urN linux-2.2.11-pre2/arch/ppc/pmac_defconfig linux/arch/ppc/pmac_defconfig
--- linux-2.2.11-pre2/arch/ppc/pmac_defconfig	Wed Mar 10 21:30:32 1999
+++ linux/arch/ppc/pmac_defconfig	Mon Dec  3 18:52:25 2001
@@ -7,6 +7,7 @@
 #
 CONFIG_PPC=y
 CONFIG_6xx=y
+# CONFIG_PPC64 is not set
 # CONFIG_8xx is not set
 CONFIG_PMAC=y
 # CONFIG_PREP is not set
@@ -14,8 +15,9 @@
 # CONFIG_ALL_PPC is not set
 # CONFIG_APUS is not set
 # CONFIG_MBX is not set
-CONFIG_MACH_SPECIFIC=y
 # CONFIG_SMP is not set
+CONFIG_MACH_SPECIFIC=y
+CONFIG_6xx=y
 
 #
 # General setup
@@ -35,7 +37,8 @@
 CONFIG_KERNEL_ELF=y
 CONFIG_BINFMT_MISC=m
 # CONFIG_BINFMT_JAVA is not set
-# CONFIG_PARPORT is not set
+CONFIG_PARPORT=m
+# CONFIG_PARPORT_PC is not set
 # CONFIG_VGA_CONSOLE is not set
 CONFIG_FB=y
 CONFIG_FB_COMPAT_XPMAC=y
@@ -43,13 +46,12 @@
 CONFIG_MAC_KEYBOARD=y
 CONFIG_MAC_FLOPPY=y
 CONFIG_MAC_SERIAL=y
+# CONFIG_SERIAL_CONSOLE is not set
 CONFIG_ADBMOUSE=y
-CONFIG_BLK_DEV_IDE_PMAC=y
 CONFIG_PROC_DEVICETREE=y
-# CONFIG_KGDB is not set
-# CONFIG_XMON is not set
 # CONFIG_TOTALMP is not set
 CONFIG_BOOTX_TEXT=y
+# CONFIG_MOTOROLA_HOTSWAP is not set
 
 #
 # Plug and Play support
@@ -73,7 +75,15 @@
 # CONFIG_BLK_DEV_IDESCSI is not set
 # CONFIG_BLK_DEV_CMD640 is not set
 # CONFIG_BLK_DEV_RZ1000 is not set
-# CONFIG_BLK_DEV_IDEPCI is not set
+CONFIG_BLK_DEV_IDEPCI=y
+CONFIG_BLK_DEV_IDEDMA=y
+# CONFIG_BLK_DEV_OFFBOARD is not set
+CONFIG_IDEDMA_AUTO=y
+# CONFIG_BLK_DEV_OPTI621 is not set
+# CONFIG_BLK_DEV_TRM290 is not set
+# CONFIG_BLK_DEV_NS87415 is not set
+# CONFIG_BLK_DEV_VIA82C586 is not set
+CONFIG_BLK_DEV_CMD646=y
 # CONFIG_BLK_DEV_SL82C105 is not set
 CONFIG_BLK_DEV_IDE_PMAC=y
 CONFIG_BLK_DEV_IDEDMA_PMAC=y
@@ -84,14 +94,16 @@
 #
 # Additional Block Devices
 #
-# CONFIG_BLK_DEV_LOOP is not set
+CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_NBD is not set
 # CONFIG_BLK_DEV_MD is not set
 CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_INITRD=y
 # CONFIG_BLK_DEV_XD is not set
-CONFIG_PARIDE_PARPORT=y
+# CONFIG_BLK_DEV_DAC960 is not set
+CONFIG_PARIDE_PARPORT=m
 # CONFIG_PARIDE is not set
+# CONFIG_BLK_CPQ_DA is not set
 # CONFIG_BLK_DEV_HD is not set
 
 #
@@ -119,7 +131,6 @@
 # (it is safe to leave these untouched)
 #
 CONFIG_INET_RARP=y
-CONFIG_IP_NOSR=y
 CONFIG_SKB_LARGE=y
 # CONFIG_IPV6 is not set
 
@@ -173,7 +184,8 @@
 # CONFIG_SCSI_AHA1542 is not set
 # CONFIG_SCSI_AHA1740 is not set
 CONFIG_SCSI_AIC7XXX=y
-# CONFIG_OVERRIDE_CMDS is not set
+# CONFIG_AIC7XXX_TCQ_ON_BY_DEFAULT is not set
+CONFIG_AIC7XXX_CMDS_PER_DEVICE=8
 CONFIG_AIC7XXX_PROC_STATS=y
 CONFIG_AIC7XXX_RESET_DELAY=15
 # CONFIG_SCSI_ADVANSYS is not set
@@ -189,15 +201,28 @@
 # CONFIG_SCSI_GDTH is not set
 # CONFIG_SCSI_GENERIC_NCR5380 is not set
 # CONFIG_SCSI_INITIO is not set
+# CONFIG_SCSI_INIA100 is not set
+# CONFIG_SCSI_PPA is not set
+# CONFIG_SCSI_IMM is not set
 # CONFIG_SCSI_NCR53C406A is not set
+# CONFIG_SCSI_SYM53C416 is not set
 # CONFIG_SCSI_NCR53C7xx is not set
-# CONFIG_SCSI_NCR53C8XX is not set
+CONFIG_SCSI_NCR53C8XX=y
+CONFIG_SCSI_SYM53C8XX=y
+CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS=8
+CONFIG_SCSI_NCR53C8XX_MAX_TAGS=32
+CONFIG_SCSI_NCR53C8XX_SYNC=20
+# CONFIG_SCSI_NCR53C8XX_PROFILE is not set
+# CONFIG_SCSI_NCR53C8XX_IOMAPPED is not set
+# CONFIG_SCSI_NCR53C8XX_PQS_PDS is not set
+CONFIG_SCSI_NCR53C8XX_SYMBIOS_COMPAT=y
 # CONFIG_SCSI_PAS16 is not set
 # CONFIG_SCSI_PCI2000 is not set
 # CONFIG_SCSI_PCI2220I is not set
 # CONFIG_SCSI_PSI240I is not set
 # CONFIG_SCSI_QLOGIC_FAS is not set
 # CONFIG_SCSI_QLOGIC_ISP is not set
+# CONFIG_SCSI_QLOGIC_FC is not set
 # CONFIG_SCSI_SEAGATE is not set
 # CONFIG_SCSI_DC390T is not set
 # CONFIG_SCSI_T128 is not set
@@ -212,10 +237,18 @@
 # Network device support
 #
 CONFIG_NETDEVICES=y
+
+#
+# ARCnet devices
+#
 # CONFIG_ARCNET is not set
 # CONFIG_DUMMY is not set
 # CONFIG_EQUALIZER is not set
 # CONFIG_ETHERTAP is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
 CONFIG_NET_ETHERNET=y
 CONFIG_MACE=y
 CONFIG_BMAC=y
@@ -225,10 +258,10 @@
 # CONFIG_NET_VENDOR_RACAL is not set
 # CONFIG_RTL8139 is not set
 # CONFIG_YELLOWFIN is not set
-# CONFIG_ACENIC is not set
 # CONFIG_NET_ISA is not set
 CONFIG_NET_EISA=y
 # CONFIG_PCNET32 is not set
+# CONFIG_ACENIC is not set
 # CONFIG_AC3200 is not set
 # CONFIG_APRICOT is not set
 # CONFIG_CS89x0 is not set
@@ -247,22 +280,36 @@
 # CONFIG_NET_POCKET is not set
 # CONFIG_FDDI is not set
 # CONFIG_HIPPI is not set
-# CONFIG_DLCI is not set
+
+#
+# Appletalk devices
+#
 # CONFIG_LTPC is not set
 # CONFIG_COPS is not set
 # CONFIG_IPDDP is not set
-CONFIG_PPP=y
+# CONFIG_PLIP is not set
+CONFIG_PPP=m
 
 #
 # CCP compressors for PPP are only built as modules.
 #
 # CONFIG_SLIP is not set
 # CONFIG_NET_RADIO is not set
+
+#
+# Token ring devices
+#
 # CONFIG_TR is not set
+# CONFIG_RCPCI is not set
 # CONFIG_SHAPER is not set
+
+#
+# Wan interfaces
+#
 # CONFIG_HOSTESS_SV11 is not set
 # CONFIG_COSA is not set
-# CONFIG_RCPCI is not set
+# CONFIG_SEALEVEL_4021 is not set
+# CONFIG_DLCI is not set
 
 #
 # Amateur Radio support
@@ -275,7 +322,7 @@
 # CONFIG_ISDN is not set
 
 #
-# CD-ROM drivers (not for SCSI or IDE/ATAPI drives)
+# Old CD-ROM drivers (not SCSI, not IDE)
 #
 # CONFIG_CD_NO_IDESCSI is not set
 
@@ -283,6 +330,7 @@
 # Console drivers
 #
 CONFIG_DUMMY_CONSOLE=y
+# CONFIG_FB_PM2 is not set
 CONFIG_FB_OF=y
 CONFIG_FB_CONTROL=y
 CONFIG_FB_PLATINUM=y
@@ -319,6 +367,7 @@
 # CONFIG_SERIAL_NONSTANDARD is not set
 CONFIG_UNIX98_PTYS=y
 CONFIG_UNIX98_PTY_COUNT=256
+# CONFIG_PRINTER is not set
 # CONFIG_MOUSE is not set
 # CONFIG_QIC02_TAPE is not set
 # CONFIG_WATCHDOG is not set
@@ -334,6 +383,7 @@
 # Joystick support
 #
 # CONFIG_JOYSTICK is not set
+# CONFIG_DTLK is not set
 
 #
 # Ftape, the floppy tape device driver
@@ -341,6 +391,11 @@
 # CONFIG_FTAPE is not set
 
 #
+# USB drivers - not for the faint of heart
+#
+# CONFIG_USB is not set
+
+#
 # Filesystems
 #
 # CONFIG_QUOTA is not set
@@ -364,6 +419,7 @@
 CONFIG_EXT2_FS=y
 # CONFIG_SYSV_FS is not set
 # CONFIG_UFS_FS is not set
+# CONFIG_EFS_FS is not set
 
 #
 # Network File Systems
@@ -415,7 +471,7 @@
 # CONFIG_NLS_ISO8859_7 is not set
 # CONFIG_NLS_ISO8859_8 is not set
 # CONFIG_NLS_ISO8859_9 is not set
-# CONFIG_NLS_ISO8859_15 is not set
+CONFIG_NLS_ISO8859_15=y
 # CONFIG_NLS_KOI8_R is not set
 
 #
@@ -429,3 +485,10 @@
 # CONFIG_SOUND_MSNDCLAS is not set
 # CONFIG_SOUND_MSNDPIN is not set
 # CONFIG_SOUND_OSS is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_KGDB is not set
+# CONFIG_XMON is not set
diff -urN linux-2.2.11-pre2/arch/sparc/defconfig linux/arch/sparc/defconfig
--- linux-2.2.11-pre2/arch/sparc/defconfig	Mon Dec  3 18:51:52 2001
+++ linux/arch/sparc/defconfig	Mon Dec  3 18:52:25 2001
@@ -243,6 +243,8 @@
 CONFIG_SYSV_FS=m
 CONFIG_UFS_FS=m
 CONFIG_UFS_FS_WRITE=y
+CONFIG_EFS_FS=m
+CONFIG_SGI_PARTITION=y
 
 #
 # Network File Systems
diff -urN linux-2.2.11-pre2/arch/sparc/kernel/pcic.c linux/arch/sparc/kernel/pcic.c
--- linux-2.2.11-pre2/arch/sparc/kernel/pcic.c	Mon Dec  3 18:51:52 2001
+++ linux/arch/sparc/kernel/pcic.c	Mon Dec  3 18:52:25 2001
@@ -1,4 +1,4 @@
-/* $Id: pcic.c,v 1.5 1999/03/16 00:15:20 davem Exp $
+/* $Id: pcic.c,v 1.5.2.1 1999/08/07 10:42:43 davem Exp $
  * pcic.c: Sparc/PCI controller support
  *
  * Copyright (C) 1998 V. Roganov and G. Raiko
diff -urN linux-2.2.11-pre2/arch/sparc/kernel/process.c linux/arch/sparc/kernel/process.c
--- linux-2.2.11-pre2/arch/sparc/kernel/process.c	Mon Dec  3 18:51:52 2001
+++ linux/arch/sparc/kernel/process.c	Mon Dec  3 18:52:25 2001
@@ -1,4 +1,4 @@
-/*  $Id: process.c,v 1.137 1999/05/08 03:00:10 davem Exp $
+/*  $Id: process.c,v 1.137.2.1 1999/08/07 10:42:45 davem Exp $
  *  linux/arch/sparc/kernel/process.c
  *
  *  Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
diff -urN linux-2.2.11-pre2/arch/sparc/kernel/sparc-stub.c linux/arch/sparc/kernel/sparc-stub.c
--- linux-2.2.11-pre2/arch/sparc/kernel/sparc-stub.c	Mon Dec  3 18:51:52 2001
+++ linux/arch/sparc/kernel/sparc-stub.c	Mon Dec  3 18:52:25 2001
@@ -1,4 +1,4 @@
-/* $Id: sparc-stub.c,v 1.24 1998/02/08 07:58:44 ecd Exp $
+/* $Id: sparc-stub.c,v 1.24.2.1 1999/08/07 10:42:46 davem Exp $
  * sparc-stub.c:  KGDB support for the Linux kernel.
  *
  * Modifications to run under Linux
diff -urN linux-2.2.11-pre2/arch/sparc/kernel/sparc_ksyms.c linux/arch/sparc/kernel/sparc_ksyms.c
--- linux-2.2.11-pre2/arch/sparc/kernel/sparc_ksyms.c	Mon Dec  3 18:51:52 2001
+++ linux/arch/sparc/kernel/sparc_ksyms.c	Mon Dec  3 18:52:25 2001
@@ -1,4 +1,4 @@
-/* $Id: sparc_ksyms.c,v 1.77 1999/03/21 06:37:43 davem Exp $
+/* $Id: sparc_ksyms.c,v 1.77.2.1 1999/08/07 10:42:47 davem Exp $
  * arch/sparc/kernel/ksyms.c: Sparc specific ksyms support.
  *
  * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
diff -urN linux-2.2.11-pre2/arch/sparc/kernel/sys_sunos.c linux/arch/sparc/kernel/sys_sunos.c
--- linux-2.2.11-pre2/arch/sparc/kernel/sys_sunos.c	Mon Dec  3 18:51:52 2001
+++ linux/arch/sparc/kernel/sys_sunos.c	Mon Dec  3 18:52:25 2001
@@ -1,4 +1,4 @@
-/* $Id: sys_sunos.c,v 1.94.2.1 1999/05/24 19:42:30 davem Exp $
+/* $Id: sys_sunos.c,v 1.94.2.2 1999/08/07 10:42:49 davem Exp $
  * sys_sunos.c: SunOS specific syscall compatibility support.
  *
  * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
diff -urN linux-2.2.11-pre2/arch/sparc/lib/debuglocks.c linux/arch/sparc/lib/debuglocks.c
--- linux-2.2.11-pre2/arch/sparc/lib/debuglocks.c	Thu Apr 22 19:24:51 1999
+++ linux/arch/sparc/lib/debuglocks.c	Mon Dec  3 18:52:25 2001
@@ -1,4 +1,4 @@
-/* $Id: debuglocks.c,v 1.7 1999/04/21 02:26:58 anton Exp $
+/* $Id: debuglocks.c,v 1.7.2.1 1999/08/05 09:39:27 anton Exp $
  * debuglocks.c: Debugging versions of SMP locking primitives.
  *
  * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu)
@@ -53,7 +53,7 @@
 		lock, cpu, caller, lock->owner_pc & ~3, lock->owner_pc & 3);
 
 	for(i = 0; i < NR_CPUS; i++)
-		printk(" reader[i]=%08lx", lock->reader_pc[i]);
+		printk(" reader[%d]=%08lx", i, lock->reader_pc[i]);
 
 	printk("\n");
 }
diff -urN linux-2.2.11-pre2/arch/sparc/math-emu/sfp-machine.h linux/arch/sparc/math-emu/sfp-machine.h
--- linux-2.2.11-pre2/arch/sparc/math-emu/sfp-machine.h	Wed Mar 10 16:53:36 1999
+++ linux/arch/sparc/math-emu/sfp-machine.h	Mon Dec  3 18:52:25 2001
@@ -91,6 +91,11 @@
 #define _FP_NANFRAC_D		_FP_QNANBIT_D, 0
 #define _FP_NANFRAC_Q           _FP_QNANBIT_Q, 0, 0, 0
 
+/* On some architectures float-to-int conversions return a result
+ * code.  On others (e.g. Sparc) they return 0
+ */
+#define _FTOI_RESULT		0
+
 #define _FP_KEEPNANFRACP 1
 
 /* This macro appears to be called when both X and Y are NaNs, and 
@@ -104,7 +109,25 @@
     _FP_FRAC_COPY_##wc(R,Y);					\
     R##_c = FP_CLS_NAN;						\
   } while (0)
+
+#define _FP_CHOOSENAN_SQRT(fs, wc, R, X)			\
+  do {								\
+    	R##_s = 0;						\
+    	R##_c = FP_CLS_NAN;					\
+    	_FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc);		\
+  } while (0)
+
   
+#define __FP_UNPACK_DENORM(fs, wc, X)				\
+    {								\
+	_FP_I_TYPE _shift;					\
+	_FP_FRAC_CLZ_##wc(_shift, X);				\
+	_shift -= _FP_FRACXBITS_##fs;				\
+	_FP_FRAC_SLL_##wc(X, (_shift+_FP_WORKBITS));		\
+	X##_e -= _FP_EXPBIAS_##fs - 1 + _shift;			\
+	X##_c = FP_CLS_NORMAL;					\
+    }
+
 #define __FP_UNPACK_RAW_1(fs, X, val)				\
   do {								\
     union _FP_UNION_##fs *_flo =				\
diff -urN linux-2.2.11-pre2/arch/sparc/mm/fault.c linux/arch/sparc/mm/fault.c
--- linux-2.2.11-pre2/arch/sparc/mm/fault.c	Mon Dec  3 18:51:52 2001
+++ linux/arch/sparc/mm/fault.c	Mon Dec  3 18:52:25 2001
@@ -1,4 +1,4 @@
-/* $Id: fault.c,v 1.101 1999/01/04 06:24:52 jj Exp $
+/* $Id: fault.c,v 1.101.2.2 1999/08/07 10:42:53 davem Exp $
  * fault.c:  Page fault handlers for the Sparc.
  *
  * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
@@ -382,12 +382,13 @@
 	if(expand_stack(vma, address))
 		goto bad_area;
 good_area:
-	if(write)
+	if(write) {
 		if(!(vma->vm_flags & VM_WRITE))
 			goto bad_area;
-	else
+	} else {
 		if(!(vma->vm_flags & (VM_READ | VM_EXEC)))
 			goto bad_area;
+	}
 	if (!handle_mm_fault(current, vma, address, write))
 		goto do_sigbus;
 	up(&mm->mmap_sem);
diff -urN linux-2.2.11-pre2/arch/sparc/mm/init.c linux/arch/sparc/mm/init.c
--- linux-2.2.11-pre2/arch/sparc/mm/init.c	Mon Dec  3 18:51:52 2001
+++ linux/arch/sparc/mm/init.c	Mon Dec  3 18:52:25 2001
@@ -1,4 +1,4 @@
-/*  $Id: init.c,v 1.65 1999/04/09 16:28:03 davem Exp $
+/*  $Id: init.c,v 1.65.2.1 1999/08/07 10:42:54 davem Exp $
  *  linux/arch/sparc/mm/init.c
  *
  *  Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
diff -urN linux-2.2.11-pre2/arch/sparc/mm/srmmu.c linux/arch/sparc/mm/srmmu.c
--- linux-2.2.11-pre2/arch/sparc/mm/srmmu.c	Wed Apr 28 10:58:10 1999
+++ linux/arch/sparc/mm/srmmu.c	Mon Dec  3 18:52:25 2001
@@ -1,4 +1,4 @@
-/* $Id: srmmu.c,v 1.187 1999/04/28 17:00:45 davem Exp $
+/* $Id: srmmu.c,v 1.187.2.1 1999/08/07 10:42:55 davem Exp $
  * srmmu.c:  SRMMU specific routines for memory management.
  *
  * Copyright (C) 1995 David S. Miller  (davem@caip.rutgers.edu)
@@ -114,6 +114,7 @@
 #define srmmu_ahashfn(addr)	((addr) >> 24)
 
 int viking_mxcc_present = 0;
+static spinlock_t srmmu_context_spinlock = SPIN_LOCK_UNLOCKED;
 
 /* Physical memory can be _very_ non-contiguous on the sun4m, especially
  * the SS10/20 class machines and with the latest openprom revisions.
@@ -819,7 +820,9 @@
 static void srmmu_switch_to_context(struct task_struct *tsk)
 {
 	if(tsk->mm->context == NO_CONTEXT) {
+		spin_lock(&srmmu_context_spinlock);
 		alloc_context(tsk->mm);
+		spin_unlock(&srmmu_context_spinlock);
 		ctxd_set(&srmmu_context_table[tsk->mm->context], tsk->mm->pgd);
 	}
 	srmmu_set_context(tsk->mm->context);
@@ -827,7 +830,9 @@
 
 static void srmmu_init_new_context(struct mm_struct *mm)
 {
+	spin_lock(&srmmu_context_spinlock);
 	alloc_context(mm);
+	spin_unlock(&srmmu_context_spinlock);
 
 	flush_cache_mm(mm);
 	ctxd_set(&srmmu_context_table[mm->context], mm->pgd);
@@ -1398,7 +1403,9 @@
 	if(tsk->mm->context == NO_CONTEXT) {
 		ctxd_t *ctxp;
 
+		spin_lock(&srmmu_context_spinlock);
 		alloc_context(tsk->mm);
+		spin_unlock(&srmmu_context_spinlock);
 		ctxp = &srmmu_context_table[tsk->mm->context];
 		srmmu_set_entry((pte_t *)ctxp, __pte((SRMMU_ET_PTD | (srmmu_v2p((unsigned long) tsk->mm->pgd) >> 4))));
 		hypersparc_flush_page_to_ram((unsigned long)ctxp);
@@ -1411,7 +1418,9 @@
 {
 	ctxd_t *ctxp;
 
+	spin_lock(&srmmu_context_spinlock);
 	alloc_context(mm);
+	spin_unlock(&srmmu_context_spinlock);
 
 	ctxp = &srmmu_context_table[mm->context];
 	srmmu_set_entry((pte_t *)ctxp, __pte((SRMMU_ET_PTD | (srmmu_v2p((unsigned long) mm->pgd) >> 4))));
diff -urN linux-2.2.11-pre2/arch/sparc/mm/tsunami.S linux/arch/sparc/mm/tsunami.S
--- linux-2.2.11-pre2/arch/sparc/mm/tsunami.S	Thu May 15 16:48:02 1997
+++ linux/arch/sparc/mm/tsunami.S	Mon Dec  3 18:52:25 2001
@@ -1,4 +1,4 @@
-/* $Id: tsunami.S,v 1.1 1997/05/03 05:09:09 davem Exp $
+/* $Id: tsunami.S,v 1.1.6.1 1999/08/09 13:00:16 davem Exp $
  * tsunami.S: High speed MicroSparc-I mmu/cache operations.
  *
  * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu)
@@ -68,6 +68,11 @@
 tsunami_flush_tlb_all:
 	 mov	0x400, %o1
 	sta	%g0, [%o1] ASI_M_FLUSH_PROBE
+	nop
+	nop
+	nop
+	nop
+	nop
 tsunami_flush_tlb_out:
 	retl
 	 nop
@@ -85,6 +90,11 @@
 	 lda	[%g1] ASI_M_MMUREGS, %g5
 	sta	%o3, [%g1] ASI_M_MMUREGS
 	sta	%g0, [%o1] ASI_M_FLUSH_PROBE
+	nop
+	nop
+	nop
+	nop
+	nop
 tsunami_flush_tlb_page_out:
 	retl
 	 sta	%g5, [%g1] ASI_M_MMUREGS
diff -urN linux-2.2.11-pre2/arch/sparc64/defconfig linux/arch/sparc64/defconfig
--- linux-2.2.11-pre2/arch/sparc64/defconfig	Mon Dec  3 18:51:52 2001
+++ linux/arch/sparc64/defconfig	Mon Dec  3 18:52:25 2001
@@ -287,6 +287,8 @@
 CONFIG_SYSV_FS=m
 CONFIG_UFS_FS=m
 CONFIG_UFS_FS_WRITE=y
+CONFIG_EFS_FS=m
+CONFIG_SGI_PARTITION=y
 
 #
 # Network File Systems
diff -urN linux-2.2.11-pre2/arch/sparc64/kernel/head.S linux/arch/sparc64/kernel/head.S
--- linux-2.2.11-pre2/arch/sparc64/kernel/head.S	Thu Apr 22 19:24:51 1999
+++ linux/arch/sparc64/kernel/head.S	Mon Dec  3 18:52:25 2001
@@ -1,4 +1,4 @@
-/* $Id: head.S,v 1.60 1999/04/12 08:08:21 davem Exp $
+/* $Id: head.S,v 1.60.2.1 1999/08/09 13:00:25 davem Exp $
  * head.S: Initial boot code for the Sparc64 port of Linux.
  *
  * Copyright (C) 1996,1997 David S. Miller (davem@caip.rutgers.edu)
@@ -75,6 +75,16 @@
 	 * PROM entry point is on %o4
 	 */
 sparc64_boot:
+#if 1
+	/* XXX Disable reception of correctable memory errors until
+	 * XXX we code up the proper handler... -DaveM
+	 */
+	ldxa	[%g0] ASI_ESTATE_ERROR_EN, %g1
+	andn	%g1, 0x1, %g1
+	stxa	%g1, [%g0] ASI_ESTATE_ERROR_EN
+	membar	#Sync
+#endif
+
 	/* Typically PROM has already enabled both MMU's and both on-chip
 	 * caches, but we do it here anyway just to be paranoid.
 	 */
diff -urN linux-2.2.11-pre2/arch/sparc64/kernel/psycho.c linux/arch/sparc64/kernel/psycho.c
--- linux-2.2.11-pre2/arch/sparc64/kernel/psycho.c	Mon Dec  3 18:51:52 2001
+++ linux/arch/sparc64/kernel/psycho.c	Mon Dec  3 18:52:25 2001
@@ -1,4 +1,4 @@
-/* $Id: psycho.c,v 1.85.2.1 1999/07/01 10:41:16 davem Exp $
+/* $Id: psycho.c,v 1.85.2.2 1999/08/09 13:00:21 davem Exp $
  * psycho.c: Ultra/AX U2P PCI controller support.
  *
  * Copyright (C) 1997 David S. Miller (davem@caipfs.rutgers.edu)
@@ -756,8 +756,8 @@
 	struct pci_dev *pdev;
 	unsigned short stmp;
 	unsigned int itmp;
+	unsigned char btmp;
 
-#if 0
 	for(pdev = pci_devices; pdev; pdev = pdev->next) {
 		if(pdev->vendor == PCI_VENDOR_ID_SUN &&
 		   pdev->device == PCI_DEVICE_ID_SUN_SABRE) {
@@ -765,7 +765,7 @@
 			break;
 		}
 	}
-#endif
+
 	for (pdev = sabre->pci_bus->devices; pdev; pdev = pdev->sibling) {
 		if (pdev->vendor == PCI_VENDOR_ID_SUN &&
 		    pdev->device == PCI_DEVICE_ID_SUN_SIMBA) {
@@ -797,14 +797,33 @@
 			pci_read_config_dword(pdev, APB_PCI_CONTROL_LOW, &itmp);
 			itmp = APB_PCI_CTL_LOW_ERRINT_EN | 0x0f;
 			pci_write_config_dword(pdev, APB_PCI_CONTROL_LOW, itmp);
-#if 0
+
 			/* Don't mess with the retry limit and PIO/DMA latency
 			 * timer settings.  But do set primary and secondary
 			 * latency timers.
 			 */
 			pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 64);
 			pci_write_config_byte(pdev, PCI_SEC_LATENCY_TIMER, 64);
-#endif
+
+			/* Here is an overview of the behavior of various
+			 * revisions of APB wrt. write buffer full conditions:
+			 *
+			 * Revision 1.0: pre-FCS, always stalls
+			 * Revision 1.1: pre-FCS, always disconnects
+			 * Revision 1.2: same behavior as rev 1.1
+			 * Revision 1.3: behavior is determined by bit 4 of
+			 *               secondary control register
+			 *		 0: stall initially, but disconnect
+			 *		    if PCI latency timer expires
+			 *		 1: always disconnect
+			 *
+			 * By setting the bit, since it is reserved in previous
+			 * revisions of APB, we get all FCS hardware to have
+			 * identical behavior when APB's write buffer fills up.
+			 */
+			pci_read_config_byte(pdev, APB_SECONDARY_CONTROL, &btmp);
+			btmp |= APB_SECONDARY_CTL_DISCON_FULL;
+			pci_write_config_byte(pdev, APB_SECONDARY_CONTROL, btmp);
 		}
 	}
 }
diff -urN linux-2.2.11-pre2/arch/sparc64/kernel/sys_sunos32.c linux/arch/sparc64/kernel/sys_sunos32.c
--- linux-2.2.11-pre2/arch/sparc64/kernel/sys_sunos32.c	Mon Dec  3 18:51:52 2001
+++ linux/arch/sparc64/kernel/sys_sunos32.c	Mon Dec  3 18:52:25 2001
@@ -1,4 +1,4 @@
-/* $Id: sys_sunos32.c,v 1.22.2.1 1999/05/24 19:42:36 davem Exp $
+/* $Id: sys_sunos32.c,v 1.22.2.2 1999/08/07 10:43:02 davem Exp $
  * sys_sunos32.c: SunOS binary compatability layer on sparc64.
  *
  * Copyright (C) 1995, 1996, 1997 David S. Miller (davem@caip.rutgers.edu)
diff -urN linux-2.2.11-pre2/arch/sparc64/kernel/trampoline.S linux/arch/sparc64/kernel/trampoline.S
--- linux-2.2.11-pre2/arch/sparc64/kernel/trampoline.S	Wed Mar 10 16:53:37 1999
+++ linux/arch/sparc64/kernel/trampoline.S	Mon Dec  3 18:52:25 2001
@@ -1,4 +1,4 @@
-/* $Id: trampoline.S,v 1.8 1998/12/09 21:01:15 davem Exp $
+/* $Id: trampoline.S,v 1.8.2.1 1999/08/09 13:00:27 davem Exp $
  * trampoline.S: Jump start slave processors on sparc64.
  *
  * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu)
@@ -23,6 +23,15 @@
 	.globl		sparc64_cpu_startup, sparc64_cpu_startup_end
 sparc64_cpu_startup:
 	flushw
+#if 1
+	/* XXX Disable reception of correctable memory errors until
+	 * XXX we code up the proper handler... -DaveM
+	 */
+	ldxa	[%g0] ASI_ESTATE_ERROR_EN, %g1
+	andn	%g1, 0x1, %g1
+	stxa	%g1, [%g0] ASI_ESTATE_ERROR_EN
+	membar	#Sync
+#endif
 	mov	(LSU_CONTROL_IC | LSU_CONTROL_DC | LSU_CONTROL_IM | LSU_CONTROL_DM), %g1
 	stxa	%g1, [%g0] ASI_LSU_CONTROL
 	membar	#Sync
diff -urN linux-2.2.11-pre2/arch/sparc64/math-emu/fdtoi.c linux/arch/sparc64/math-emu/fdtoi.c
--- linux-2.2.11-pre2/arch/sparc64/math-emu/fdtoi.c	Wed Mar 10 16:53:37 1999
+++ linux/arch/sparc64/math-emu/fdtoi.c	Mon Dec  3 18:52:25 2001
@@ -9,5 +9,5 @@
 	__FP_UNPACK_D(A, rs2);
 	FP_TO_INT_D(r, A, 32, 1);
 	*rd = r;
-	return 0;
+	return _FTOI_RESULT;
 }
diff -urN linux-2.2.11-pre2/arch/sparc64/math-emu/fdtox.c linux/arch/sparc64/math-emu/fdtox.c
--- linux-2.2.11-pre2/arch/sparc64/math-emu/fdtox.c	Wed Mar 10 16:53:37 1999
+++ linux/arch/sparc64/math-emu/fdtox.c	Mon Dec  3 18:52:25 2001
@@ -9,5 +9,5 @@
 	__FP_UNPACK_D(A, rs2);
 	FP_TO_INT_D(r, A, 64, 1);
 	*rd = r;
-	return 0;
+	return _FTOI_RESULT;
 }
diff -urN linux-2.2.11-pre2/arch/sparc64/math-emu/fstoi.c linux/arch/sparc64/math-emu/fstoi.c
--- linux-2.2.11-pre2/arch/sparc64/math-emu/fstoi.c	Wed Mar 10 16:53:37 1999
+++ linux/arch/sparc64/math-emu/fstoi.c	Mon Dec  3 18:52:25 2001
@@ -9,5 +9,5 @@
 	__FP_UNPACK_S(A, rs2);
 	FP_TO_INT_S(r, A, 32, 1);
 	*rd = r;
-	return 0;
+	return _FTOI_RESULT;
 }
diff -urN linux-2.2.11-pre2/arch/sparc64/math-emu/fstox.c linux/arch/sparc64/math-emu/fstox.c
--- linux-2.2.11-pre2/arch/sparc64/math-emu/fstox.c	Wed Mar 10 16:53:37 1999
+++ linux/arch/sparc64/math-emu/fstox.c	Mon Dec  3 18:52:25 2001
@@ -9,5 +9,5 @@
 	__FP_UNPACK_S(A, rs2);
 	FP_TO_INT_S(r, A, 64, 1);
 	*rd = r;
-	return 0;
+	return _FTOI_RESULT;
 }
diff -urN linux-2.2.11-pre2/arch/sparc64/math-emu/op-common.h linux/arch/sparc64/math-emu/op-common.h
--- linux-2.2.11-pre2/arch/sparc64/math-emu/op-common.h	Wed Mar 10 16:53:37 1999
+++ linux/arch/sparc64/math-emu/op-common.h	Mon Dec  3 18:52:25 2001
@@ -1,6 +1,5 @@
-
 #define _FP_DECL(wc, X)			\
-  _FP_I_TYPE X##_c, X##_s, X##_e;	\
+  _FP_I_TYPE X##_c, X##_s, X##_e, X##_r=0;	\
   _FP_FRAC_DECL_##wc(X)
 
 /*
@@ -8,6 +7,7 @@
  * of fp value and normalizing both the exponent and the fraction.
  */
 
+#ifndef _FP_UNPACK_CANONICAL
 #define _FP_UNPACK_CANONICAL(fs, wc, X)					\
 do {									\
   switch (X##_e)							\
@@ -23,15 +23,8 @@
     if (_FP_FRAC_ZEROP_##wc(X))						\
       X##_c = FP_CLS_ZERO;						\
     else								\
-      {									\
-	/* a denormalized number */					\
-	_FP_I_TYPE _shift;						\
-	_FP_FRAC_CLZ_##wc(_shift, X);					\
-	_shift -= _FP_FRACXBITS_##fs;					\
-	_FP_FRAC_SLL_##wc(X, (_shift+_FP_WORKBITS));			\
-	X##_e -= _FP_EXPBIAS_##fs - 1 + _shift;				\
-	X##_c = FP_CLS_NORMAL;						\
-      }									\
+      /* a denormalized number */					\
+      __FP_UNPACK_DENORM(fs, wc, X)					\
     break;								\
 									\
   case _FP_EXPMAX_##fs:							\
@@ -43,6 +36,7 @@
     break;								\
   }									\
 } while (0)
+#endif /* _FP_UNPACK_CANONICAL */
 
 
 /*
@@ -52,15 +46,16 @@
  * extracted -- but that is ok, we can regenerate them now.
  */
 
+#ifndef _FP_PACK_CANONICAL
 #define _FP_PACK_CANONICAL(fs, wc, X)				\
-({int __ret = 0;						\
+({int __pk__ret = X##_r;					\
   switch (X##_c)						\
   {								\
   case FP_CLS_NORMAL:						\
     X##_e += _FP_EXPBIAS_##fs;					\
     if (X##_e > 0)						\
       {								\
-	__ret |= _FP_ROUND(wc, X);				\
+	__pk__ret |= _FP_ROUND(wc, X);				\
 	if (_FP_FRAC_OVERP_##wc(fs, X))				\
 	  {							\
 	    _FP_FRAC_SRL_##wc(X, (_FP_WORKBITS+1));		\
@@ -73,7 +68,7 @@
 	    /* overflow to infinity */				\
 	    X##_e = _FP_EXPMAX_##fs;				\
 	    _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc);		\
-            __ret |= EFLAG_OVERFLOW;				\
+            __pk__ret |= EFLAG_OVERFLOW;			\
 	  }							\
       }								\
     else							\
@@ -83,7 +78,7 @@
 	if (X##_e <= _FP_WFRACBITS_##fs)			\
 	  {							\
 	    _FP_FRAC_SRS_##wc(X, X##_e, _FP_WFRACBITS_##fs);	\
-	    __ret |= _FP_ROUND(wc, X);				\
+	    __pk__ret |= _FP_ROUND(wc, X);			\
 	    _FP_FRAC_SLL_##wc(X, 1);				\
 	    if (_FP_FRAC_OVERP_##wc(fs, X))			\
 	      {							\
@@ -94,7 +89,7 @@
 	      {							\
 		X##_e = 0;					\
 		_FP_FRAC_SRL_##wc(X, _FP_WORKBITS+1);		\
-                __ret |= EFLAG_UNDERFLOW;			\
+                __pk__ret |= EFLAG_UNDERFLOW;			\
 	      }							\
 	  }							\
 	else							\
@@ -102,7 +97,7 @@
 	    /* underflow to zero */				\
 	    X##_e = 0;						\
 	    _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc);		\
-            __ret |= EFLAG_UNDERFLOW;				\
+            __pk__ret |= EFLAG_UNDERFLOW;			\
 	  }							\
       }								\
     break;							\
@@ -128,16 +123,18 @@
       _FP_FRAC_HIGH_##wc(X) |= _FP_QNANBIT_##fs;		\
     break;							\
   }								\
-  __ret;							\
+  __pk__ret;							\
 })
-
+#endif /* _FP_PACK_CANONICAL */
 
 /*
  * Main addition routine.  The input values should be cooked.
  */
-
+#ifndef _FP_ADD
 #define _FP_ADD(fs, wc, R, X, Y)					     \
 do {									     \
+  /* Propagate any flags that may have been set during unpacking */	     \
+  R##_r |= (X##_r | Y##_r);						     \
   switch (_FP_CLS_COMBINE(X##_c, Y##_c))				     \
   {									     \
   case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_NORMAL):			     \
@@ -150,8 +147,10 @@
 	  diff = -diff;							     \
 	  if (diff <= _FP_WFRACBITS_##fs)				     \
 	    _FP_FRAC_SRS_##wc(X, diff, _FP_WFRACBITS_##fs);		     \
-	  else if (!_FP_FRAC_ZEROP_##wc(X))				     \
+	  else if (!_FP_FRAC_ZEROP_##wc(X)) {				     \
 	    _FP_FRAC_SET_##wc(X, _FP_MINFRAC_##wc);			     \
+	    R_r |= EFLAG_INEXACT;					     \
+	  }								     \
 	  else								     \
 	    _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc);			     \
 	  R##_e = Y##_e;						     \
@@ -162,8 +161,10 @@
 	    {								     \
 	      if (diff <= _FP_WFRACBITS_##fs)				     \
 	        _FP_FRAC_SRS_##wc(Y, diff, _FP_WFRACBITS_##fs);		     \
-	      else if (!_FP_FRAC_ZEROP_##wc(Y))				     \
+	      else if (!_FP_FRAC_ZEROP_##wc(Y))	{			     \
 	        _FP_FRAC_SET_##wc(Y, _FP_MINFRAC_##wc);			     \
+	         R_r |= EFLAG_INEXACT;					     \
+	      }								     \
 	      else							     \
 	        _FP_FRAC_SET_##wc(Y, _FP_ZEROFRAC_##wc);		     \
 	    }								     \
@@ -247,6 +248,7 @@
 	_FP_FRAC_SET_##wc(R, _FP_NANFRAC_##fs);				     \
 	R##_s = X##_s ^ Y##_s;						     \
 	R##_c = FP_CLS_NAN;						     \
+	R##_r |= EFLAG_INVALID;						     \
 	break;								     \
       }									     \
     /* FALLTHRU */							     \
@@ -276,28 +278,33 @@
     abort();								     \
   }									     \
 } while (0)
+#endif /* _FP_ADD */
 
 
 /*
  * Main negation routine.  FIXME -- when we care about setting exception
  * bits reliably, this will not do.  We should examine all of the fp classes.
  */
-
+#ifndef _FP_NEG
 #define _FP_NEG(fs, wc, R, X)		\
   do {					\
+    R##_r |= X##_r;			\
     _FP_FRAC_COPY_##wc(R, X);		\
     R##_c = X##_c;			\
     R##_e = X##_e;			\
     R##_s = 1 ^ X##_s;			\
   } while (0)
+#endif /* _FP_NEG */
 
 
 /*
  * Main multiplication routine.  The input values should be cooked.
  */
-
+#ifndef _FP_MUL
 #define _FP_MUL(fs, wc, R, X, Y)			\
 do {							\
+  /* Propagate any flags that may have been set during unpacking */	     \
+  R##_r |= (X##_r | Y##_r);						     \
   R##_s = X##_s ^ Y##_s;				\
   switch (_FP_CLS_COMBINE(X##_c, Y##_c))		\
   {							\
@@ -351,14 +358,17 @@
     abort();						\
   }							\
 } while (0)
+#endif /* _FP_MUL */
 
 
 /*
  * Main division routine.  The input values should be cooked.
  */
-
+#ifndef _FP_DIV
 #define _FP_DIV(fs, wc, R, X, Y)			\
 do {							\
+  /* Propagate any flags that may have been set during unpacking */	     \
+  R##_r |= (X##_r | Y##_r);						     \
   R##_s = X##_s ^ Y##_s;				\
   switch (_FP_CLS_COMBINE(X##_c, Y##_c))		\
   {							\
@@ -411,13 +421,14 @@
     abort();						\
   }							\
 } while (0)
+#endif _FP_DIV
 
 
 /*
  * Main differential comparison routine.  The inputs should be raw not
  * cooked.  The return is -1,0,1 for normal values, 2 otherwise.
  */
-
+#ifndef _FP_CMP
 #define _FP_CMP(fs, wc, ret, X, Y, un)					\
   do {									\
     /* NANs are unordered */						\
@@ -426,6 +437,18 @@
       {									\
 	ret = un;							\
       }									\
+    /* Deal with infinities */						\
+    else if (X##_c == FP_CLS_INF) {					\
+	if(Y##_c == FP_CLS_INF) {					\
+	    ret = Y##_s - X##_s;					\
+	}								\
+	else {								\
+	    ret = X##_s ? -1 : 1; 					\
+	}								\
+    }									\
+    else if(Y##_c == FP_CLS_INF) {					\
+	ret = Y##_s ? 1 : -1;						\
+    }									\
     else								\
       {									\
 	int __is_zero_x;						\
@@ -454,10 +477,12 @@
 	  ret = 0;							\
       }									\
   } while (0)
+#endif /* _FP_CMP */
 
 
 /* Simplification for strict equality.  */
 
+#ifndef _FP_CMP_EQ
 #define _FP_CMP_EQ(fs, wc, ret, X, Y)					  \
   do {									  \
     /* NANs are unordered */						  \
@@ -473,21 +498,21 @@
 		&& (X##_s == Y##_s || !X##_e && _FP_FRAC_ZEROP_##wc(X))); \
       }									  \
   } while (0)
+#endif /* _FP_CMP_EQ */
 
 /*
  * Main square root routine.  The input value should be cooked.
  */
-
+#ifndef _FP_SQRT
 #define _FP_SQRT(fs, wc, R, X)						\
 do {									\
     _FP_FRAC_DECL_##wc(T); _FP_FRAC_DECL_##wc(S);			\
     _FP_W_TYPE q;							\
+    R##_r |= X##_r;							\
     switch (X##_c)							\
     {									\
     case FP_CLS_NAN:							\
-    	R##_s = 0;							\
-    	R##_c = FP_CLS_NAN;						\
-    	_FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc);			\
+        _FP_CHOOSENAN_SQRT(fs, wc, R, X);			        \
     	break;								\
     case FP_CLS_INF:							\
     	if (X##_s)							\
@@ -524,6 +549,7 @@
         _FP_FRAC_SRL_##wc(R, 1);					\
     }									\
   } while (0)
+#endif /* FP_SQRT */
 
 /*
  * Convert from FP to integer
@@ -552,56 +578,60 @@
  * in r be signed or unsigned?'. r is always(?) declared unsigned.
  * Comments below are mine, BTW -- PMM 
  */
-#define _FP_TO_INT(fs, wc, r, X, rsize, rsigned)				\
-  do {										\
-    switch (X##_c)								\
-      {										\
-      case FP_CLS_NORMAL:							\
-	if (X##_e < 0)								\
-	  {									\
-	  /* case FP_CLS_NAN: see above! */					\
-	  case FP_CLS_ZERO:							\
-	    r = 0;								\
-	  }									\
-	else if (X##_e >= rsize - (rsigned != 0))				\
-	  {	/* overflow */							\
-	  case FP_CLS_NAN:                                                      \
-          case FP_CLS_INF:							\
-	    if (rsigned)							\
-	      {									\
-		r = 1;								\
-		r <<= rsize - 1;						\
-		r -= 1 - X##_s;							\
-	      }									\
-	    else								\
-	      {									\
-		r = 0;								\
-		if (!X##_s)							\
-		  r = ~r;							\
-	      }									\
-	  }									\
-	else									\
-	  {									\
-	    if (_FP_W_TYPE_SIZE*wc < rsize)					\
-	      {									\
-		_FP_FRAC_ASSEMBLE_##wc(r, X, rsize);				\
-		r <<= X##_e - _FP_WFRACBITS_##fs;				\
-	      }									\
-	    else								\
-	      {									\
-		if (X##_e >= _FP_WFRACBITS_##fs)				\
-		  _FP_FRAC_SLL_##wc(X, (X##_e - _FP_WFRACBITS_##fs + 1));	\
-		else								\
-		  _FP_FRAC_SRL_##wc(X, (_FP_WFRACBITS_##fs - X##_e - 1));	\
-		_FP_FRAC_ASSEMBLE_##wc(r, X, rsize);				\
-	      }									\
-	    if (rsigned && X##_s)						\
-	      r = -r;								\
-	  }									\
-	break;									\
-      }										\
+#ifndef _FP_TO_INT
+#define _FP_TO_INT(fs, wc, r, X, rsize, rsigned)		\
+  do {								\
+    switch (X##_c)						\
+      {								\
+      case FP_CLS_NORMAL:					\
+	if (X##_e < 0)						\
+	  {							\
+	  /* case FP_CLS_NAN: see above! */			\
+	  case FP_CLS_ZERO:					\
+	    r = 0;						\
+	  }							\
+	else if (X##_e >= rsize - (rsigned != 0))		\
+	  {	/* overflow */					\
+	  case FP_CLS_NAN:                                      \
+          case FP_CLS_INF:					\
+	    if (rsigned)					\
+	      {							\
+		r = 1;						\
+		r <<= rsize - 1;				\
+		r -= 1 - X##_s;					\
+	      }							\
+	    else						\
+	      {							\
+		r = 0;						\
+		if (!X##_s)					\
+		  r = ~r;					\
+	      }							\
+	  }							\
+	else							\
+	  {							\
+	    if (_FP_W_TYPE_SIZE*wc < rsize)			\
+	      {							\
+		_FP_FRAC_ASSEMBLE_##wc(r, X, rsize);		\
+		r <<= X##_e - _FP_WFRACBITS_##fs;		\
+	      }							\
+	    else						\
+	      {							\
+		if (X##_e >= _FP_WFRACBITS_##fs)		\
+		  _FP_FRAC_SLL_##wc(X, (X##_e - _FP_WFRACBITS_##fs + 1)); \
+		else						\
+		  _FP_FRAC_SRL_##wc(X, (_FP_WFRACBITS_##fs - X##_e - 1)); \
+		_FP_FRAC_ASSEMBLE_##wc(r, X, rsize);		\
+	      }							\
+	    if (rsigned && X##_s)				\
+	      r = -r;						\
+	  }							\
+	break;							\
+      }								\
   } while (0)
 
+#endif /* _FP_TO_INT */
+
+#ifndef _FP_FROM_INT
 #define _FP_FROM_INT(fs, wc, X, r, rsize, rtype)			\
   do {									\
     if (r)								\
@@ -633,15 +663,18 @@
 	X##_c = FP_CLS_ZERO, X##_s = 0;					\
       }									\
   } while (0)
+#endif /* FP_FROM_INT */
 
-
+#ifndef FP_CONV
 #define FP_CONV(dfs,sfs,dwc,swc,D,S)			\
   do {							\
     _FP_FRAC_CONV_##dwc##_##swc(dfs, sfs, D, S);	\
     D##_e = S##_e;					\
     D##_c = S##_c;					\
     D##_s = S##_s;					\
+    D##_r |= S##_r;					\
   } while (0)
+#endif FP_CONV
 
 /*
  * Helper primitives.
diff -urN linux-2.2.11-pre2/arch/sparc64/math-emu/sfp-machine.h linux/arch/sparc64/math-emu/sfp-machine.h
--- linux-2.2.11-pre2/arch/sparc64/math-emu/sfp-machine.h	Tue Mar 16 21:52:06 1999
+++ linux/arch/sparc64/math-emu/sfp-machine.h	Mon Dec  3 18:52:25 2001
@@ -34,6 +34,11 @@
 #define _FP_NANFRAC_D		_FP_QNANBIT_D
 #define _FP_NANFRAC_Q		_FP_QNANBIT_Q, 0
 
+/* On some architectures float-to-int conversions return a result
+ * code.  On others (e.g. Sparc) they return 0
+ */
+#define _FTOI_RESULT		0
+
 #define _FP_KEEPNANFRACP 1
 #define _FP_CHOOSENAN(fs, wc, R, X, Y)				\
   do {								\
@@ -41,6 +46,25 @@
     _FP_FRAC_COPY_##wc(R,Y);					\
     R##_c = FP_CLS_NAN;						\
   } while (0)
+
+#define _FP_CHOOSENAN_SQRT(fs, wc, R, X)			\
+  do {								\
+    	R##_s = 0;						\
+    	R##_c = FP_CLS_NAN;					\
+    	_FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc);		\
+  } while (0)
+
+
+#define __FP_UNPACK_DENORM(fs, wc, X)				\
+    {								\
+	_FP_I_TYPE _shift;					\
+	_FP_FRAC_CLZ_##wc(_shift, X);				\
+	_shift -= _FP_FRACXBITS_##fs;				\
+	_FP_FRAC_SLL_##wc(X, (_shift+_FP_WORKBITS));		\
+	X##_e -= _FP_EXPBIAS_##fs - 1 + _shift;			\
+	X##_c = FP_CLS_NORMAL;					\
+    }
+
 
 #define __FP_UNPACK_RAW_1(fs, X, val)				\
   do {								\
diff -urN linux-2.2.11-pre2/arch/sparc64/mm/generic.c linux/arch/sparc64/mm/generic.c
--- linux-2.2.11-pre2/arch/sparc64/mm/generic.c	Mon Mar 15 16:10:43 1999
+++ linux/arch/sparc64/mm/generic.c	Mon Dec  3 18:52:25 2001
@@ -1,4 +1,4 @@
-/* $Id: generic.c,v 1.8 1999/03/12 06:51:50 davem Exp $
+/* $Id: generic.c,v 1.8.2.1 1999/07/23 22:31:03 davem Exp $
  * generic.c: Generic Sparc mm routines that are not dependent upon
  *            MMU type but are Sparc specific.
  *
@@ -95,7 +95,8 @@
 						  space);
 				curend = address + 0x10000;
 				offset += 0x10000;
-			}
+			} else
+				offset += PAGE_SIZE;
 		} else
 			offset += PAGE_SIZE;
 
diff -urN linux-2.2.11-pre2/arch/sparc64/solaris/socksys.c linux/arch/sparc64/solaris/socksys.c
--- linux-2.2.11-pre2/arch/sparc64/solaris/socksys.c	Mon Dec  3 18:51:52 2001
+++ linux/arch/sparc64/solaris/socksys.c	Mon Dec  3 18:52:25 2001
@@ -1,4 +1,4 @@
-/* $Id: socksys.c,v 1.8 1998/08/26 10:28:28 davem Exp $
+/* $Id: socksys.c,v 1.8.2.1 1999/08/07 10:43:11 davem Exp $
  * socksys.c: /dev/inet/ stuff for Solaris emulation.
  *
  * Copyright (C) 1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
diff -urN linux-2.2.11-pre2/drivers/block/ide-pmac.c linux/drivers/block/ide-pmac.c
--- linux-2.2.11-pre2/drivers/block/ide-pmac.c	Wed Mar 10 21:48:46 1999
+++ linux/drivers/block/ide-pmac.c	Mon Dec  3 18:52:25 2001
@@ -61,30 +61,39 @@
 void
 pmac_ide_init_hwif_ports(ide_ioreg_t *p, ide_ioreg_t base, int *irq)
 {
-	int i, r;
+	int i, ix;
 
 	*p = 0;
 	if (base == 0)
 		return;
+
+	for (ix = 0; ix < MAX_HWIFS; ++ix)
+		if (base == pmac_ide_regbase[ix])
+			break;
+
+	if (ix >= MAX_HWIFS) {
+		/* Probably a PCI interface... */
+		for (i = 0; i < 8; ++i)
+			*p++ = base + i;
+		/* XXX is this right? */
+		*p = 0;
+		if (irq != 0)
+			*irq = 0;
+		return;
+	}
+
 	/* we check only for -EINVAL meaning that we have found a matching
 	   bay but with the wrong device type */ 
 
-	r = check_media_bay_by_base(base, MB_CD);
-	if (r == -EINVAL)
+	i = check_media_bay_by_base(base, MB_CD);
+	if (i == -EINVAL)
 		return;
 		
 	for (i = 0; i < 8; ++i)
 		*p++ = base + i * 0x10;
 	*p = base + 0x160;
-	if (irq != NULL) {
-		*irq = 0;
-		for (i = 0; i < MAX_HWIFS; ++i) {
-			if (base == pmac_ide_regbase[i]) {
-				*irq = pmac_ide_irq[i];
-				break;
-			}
-		}
-	}
+	if (irq != NULL)
+		*irq = pmac_ide_irq[ix];
 }
 
 void pmac_ide_tuneproc(ide_drive_t *drive, byte pio)
@@ -96,10 +105,10 @@
 	pio = ide_get_best_pio_mode(drive, pio, 4, &d);
 	switch (pio) {
 	case 4:
-		out_le32((unsigned *)(IDE_DATA_REG + 0x200), 0x211025);
+		out_le32((unsigned *)(IDE_DATA_REG + 0x200 + _IO_BASE), 0x211025);
 		break;
 	default:
-		out_le32((unsigned *)(IDE_DATA_REG + 0x200), 0x2f8526);
+		out_le32((unsigned *)(IDE_DATA_REG + 0x200 + _IO_BASE), 0x2f8526);
 		break;
 	}
 }
@@ -142,14 +151,36 @@
 	*pp = removables;
 
 	for (i = 0, np = atas; i < MAX_HWIFS && np != NULL; np = np->next) {
+		struct device_node *tp;
+
+		/*
+		 * If this node is not under a mac-io or dbdma node,
+		 * leave it to the generic PCI driver.
+		 */
+		for (tp = np->parent; tp != 0; tp = tp->parent)
+			if (tp->type && (strcmp(tp->type, "mac-io") == 0
+					 || strcmp(tp->type, "dbdma") == 0))
+				break;
+		if (tp == 0)
+			continue;
+
 		if (np->n_addrs == 0) {
 			printk(KERN_WARNING "ide: no address for device %s\n",
 			       np->full_name);
 			continue;
 		}
-		
-		base = (unsigned long) ioremap(np->addrs[0].address, 0x200);
-		
+
+		/*
+		 * If this slot is taken (e.g. by ide-pci.c) try the next one.
+		 */
+		while (i < MAX_HWIFS
+		       && ide_hwifs[i].io_ports[IDE_DATA_OFFSET] != 0)
+			++i;
+		if (i >= MAX_HWIFS)
+			break;
+
+		base = (unsigned long) ioremap(np->addrs[0].address, 0x200) - _IO_BASE;
+
 		/* XXX This is bogus. Should be fixed in the registry by checking
 		   the kind of host interrupt controller, a bit like gatwick
 		   fixes in irq.c
diff -urN linux-2.2.11-pre2/drivers/char/Config.in linux/drivers/char/Config.in
--- linux-2.2.11-pre2/drivers/char/Config.in	Mon Dec  3 18:51:58 2001
+++ linux/drivers/char/Config.in	Mon Dec  3 18:52:25 2001
@@ -41,6 +41,7 @@
    if [ "$CONFIG_SPECIALIX" != "n" ]; then
      bool 'Specialix DTR/RTS pin is RTS' CONFIG_SPECIALIX_RTSCTS
    fi 
+   tristate 'Specialix SX (and SI) card support' CONFIG_SX
    tristate 'Hayes ESP serial port support' CONFIG_ESPSERIAL
    if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
 	dep_tristate 'Multi-Tech multiport card support' CONFIG_ISI m
diff -urN linux-2.2.11-pre2/drivers/char/Makefile linux/drivers/char/Makefile
--- linux-2.2.11-pre2/drivers/char/Makefile	Mon Dec  3 18:51:58 2001
+++ linux/drivers/char/Makefile	Mon Dec  3 18:52:25 2001
@@ -172,6 +172,14 @@
   endif
 endif
 
+ifeq ($(CONFIG_SX),y)
+L_OBJS += sx.o generic_serial.o
+else
+  ifeq ($(CONFIG_SX),m)
+  M_OBJS += sx.o
+  endif
+endif
+
 ifeq ($(CONFIG_ATIXL_BUSMOUSE),y)
 L_OBJS += atixlmouse.o
 else
diff -urN linux-2.2.11-pre2/drivers/char/bttv.c linux/drivers/char/bttv.c
--- linux-2.2.11-pre2/drivers/char/bttv.c	Mon Dec  3 18:51:59 2001
+++ linux/drivers/char/bttv.c	Mon Dec  3 18:52:25 2001
@@ -563,7 +563,7 @@
         /* MIRO PCTV pro */
         { 3, 1, 0, 2, 65551, { 2, 3, 1, 1}, {1,65537, 0, 0,10}},
 	/* ADS Technologies Channel Surfer TV (and maybe TV+FM) */
-	{ 3, 4, 0, 2, 15, { 2, 3, 1, 1}, { 13, 14, 11, 7, 0, 0}, 0},
+	{ 3, 4, 2, 2, 15, { 2, 3, 1, 1}, { 13, 14, 11, 7, 0, 0}, 0},
         /* AVerMedia TVCapture 98 */
 	{ 3, 4, 0, 2, 15, { 2, 3, 1, 1}, { 13, 14, 11, 7, 0, 0}, 0},
         /* Aimslab VHX */
@@ -577,7 +577,7 @@
         /* AVEC Intercapture */
         { 3, 1, 9, 2, 0, { 2, 3, 1, 1}, { 0, 0, 0, 0, 0}},
        /* LifeView FlyKit w/o Tuner */
-       { 3, 1, -1, 2, 0xc00, { 0, 3, 1, 1}}
+       { 3, 1, -1, -1, 0x8dff00, { 2, 3, 1, 1}}
 };
 #define TVCARDS (sizeof(tvcards)/sizeof(tvcard))
 
@@ -3148,7 +3148,7 @@
                         break;
 	}
 	printk("%s\n",btv->video_dev.name);
-	audio(btv, AUDIO_MUTE);
+	audio(btv, AUDIO_INTERN);
 }
 
 
diff -urN linux-2.2.11-pre2/drivers/char/generic_serial.c linux/drivers/char/generic_serial.c
--- linux-2.2.11-pre2/drivers/char/generic_serial.c	Wed Dec 31 16:00:00 1969
+++ linux/drivers/char/generic_serial.c	Mon Dec  3 18:52:25 2001
@@ -0,0 +1,1074 @@
+/*
+ *  generic_serial.c
+ *
+ *  Copyright (C) 1998/1999 R.E.Wolff@BitWizard.nl
+ *
+ *  written for the SX serial driver.
+ *     Contains the code that should be shared over all the serial drivers.
+ *
+ *  Credit for the idea to do it this way might go to Alan Cox. 
+ *
+ *
+ *  Version 0.1 -- December, 1998. Initial version.
+ *  Version 0.2 -- March, 1999.    Some more routines. Bugfixes. Etc.
+ *  Version 0.5 -- August, 1999.   Some more fixes. Reformat for Linus.
+ */
+
+#include <linux/tty.h>
+#include <linux/serial.h>
+#include <linux/mm.h>
+#include <asm/semaphore.h>
+#include <linux/version.h>
+
+
+#if LINUX_VERSION_CODE < 0x020100    /* Less than 2.1.0 */
+#define TWO_ZERO
+#else
+#if LINUX_VERSION_CODE < 0x020200   /* less than 2.2.x */
+#warning "Please use a 2.2.x kernel. "
+#else
+#if LINUX_VERSION_CODE < 0x020300   /* less than 2.2.x */
+#define TWO_TWO
+#else
+#define TWO_THREE
+#endif
+#endif
+#endif
+
+#ifdef TWO_ZERO
+
+/* Here is the section that makes the 2.2 compatible driver source 
+   work for 2.0 too! We mostly try to adopt the "new thingies" from 2.2, 
+   and provide for compatibility stuff here if possible. */
+
+/* Some 200 days (on intel) */
+#define MAX_SCHEDULE_TIMEOUT     ((long)(~0UL>>1))
+
+
+#ifndef MODULE
+
+#define copy_to_user(a,b,c)          memcpy_tofs(a,b,c)
+
+static inline int copy_from_user(void *to,const void *from, int c) 
+{
+	memcpy_fromfs(to, from, c);
+	return 0;
+}
+
+
+#define capable(x)                   suser()
+
+#define queue_task                   queue_task_irq_off
+#define tty_flip_buffer_push(tty)    queue_task(&tty->flip.tqueue, &tq_timer)
+#define signal_pending(current)      (current->signal & ~current->blocked)
+#define schedule_timeout(to)         do {current->timeout = jiffies + (to);schedule ();} while (0)
+#define time_after(t1,t2)            (((long)t1-t2) > 0)
+
+#define test_and_set_bit(nr, addr)   set_bit(nr, addr)
+#define test_and_clear_bit(nr, addr) clear_bit(nr, addr)
+
+/* Not yet implemented on 2.0 */
+#define ASYNC_SPD_SHI  -1
+#define ASYNC_SPD_WARP -1
+
+
+
+/* Ugly hack: the driver_name doesn't exist in 2.0.x . So we define it
+   to the "name" field that does exist. As long as the assignments are
+   done in the right order, there is nothing to worry about. */
+#define driver_name           name 
+
+
+/* Should be in a header somewhere. */
+#define TTY_HW_COOK_OUT       14 /* Flag to tell ntty what we can handle */
+#define TTY_HW_COOK_IN        15 /* in hardware - output and input       */
+#endif
+
+#endif
+
+#ifndef TWO_ZERO
+/* This include is new with 2.2  (and required!) */
+#include <asm/uaccess.h>
+#endif
+
+#ifndef TWO_THREE
+/* These are new in 2.3. The source now uses 2.3 syntax, and here is 
+   the compatibility define... */
+#define waitq_head_t struct wait_queue *
+#define DECLARE_MUTEX(name) struct semaphore name = MUTEX
+#define DECLARE_WAITQUEUE(wait, current) struct wait_queue wait = { current, NULL }
+
+#endif
+
+#include "generic_serial.h"
+
+
+#ifndef MODULE
+extern void my_hd (unsigned char *ptr, int n);
+#endif
+
+static char *                  tmp_buf; 
+static DECLARE_MUTEX(tmp_buf_sem);
+
+int gs_debug = 0;
+
+
+#ifdef DEBUG
+#define gs_dprintk(f, str...) if (gs_debug & f) printk (str)
+#else
+#define gs_dprintk(f, str...) /* nothing */
+#endif
+
+#define func_enter() gs_dprintk (SX_DEBUG_FLOW, "gs: enter " __FUNCTION__ "\n")
+#define func_exit()  gs_dprintk (SX_DEBUG_FLOW, "gs: exit  " __FUNCTION__ "\n")
+
+
+
+#if NEW_WRITE_LOCKING
+#define DECL      /* Nothing */
+#define LOCKIT    down (& port->port_write_sem);
+#define RELEASEIT up (&port->port_write_sem);
+#else
+#define DECL      unsigned long flags;
+#define LOCKIT    save_flags (flags);cli ()
+#define RELEASEIT restore_flags (flags)
+#endif
+
+
+
+void gs_put_char(struct tty_struct * tty, unsigned char ch)
+{
+	struct gs_port *port = tty->driver_data;
+	DECL
+
+	/*  func_enter (); */
+
+	/* Take a lock on the serial tranmit buffer! */
+	LOCKIT;
+
+	if (port->xmit_cnt >= SERIAL_XMIT_SIZE - 1) {
+		/* Sorry, buffer is full, drop character. Update statistics???? -- REW */
+		RELEASEIT;
+		return;
+	}
+
+	port->xmit_buf[port->xmit_head++] = ch;
+	port->xmit_head &= SERIAL_XMIT_SIZE - 1;
+	port->xmit_cnt++;  /* Characters in buffer */
+
+	RELEASEIT;
+	/* func_exit ();*/
+}
+
+
+#ifdef NEW_WRITE_LOCKING
+
+/*
+> Problems to take into account are:
+>       -1- Interrupts that empty part of the buffer.
+>       -2- page faults on the access to userspace. 
+>       -3- Other processes that are also trying to do a "write". 
+*/
+
+int gs_write(struct tty_struct * tty, int from_user, 
+                    const unsigned char *buf, int count)
+{
+	struct gs_port *port = tty->driver_data;
+	int c, total = 0;
+	int t;
+
+	/* func_enter (); */
+
+	if (! (port->flags & ASYNC_INITIALIZED))
+		return 0;
+
+	/* get exclusive "write" access to this port (problem 3) */
+	/* This is not a spinlock because we can have a disk access (page 
+		 fault) in copy_from_user */
+	down (& port->port_write_sem);
+
+	while (1) {
+
+		c = count;
+ 
+		/* This is safe because we "OWN" the "head". Noone else can 
+		   change the "head": we own the port_write_sem. */
+		/* Don't overrun the end of the buffer */
+		t = SERIAL_XMIT_SIZE - port->xmit_head;
+		if (t < c) c = t;
+ 
+		/* This is safe because the xmit_cnt can only decrease. This 
+		   would increase "t", so we might copy too little chars. */
+		/* Don't copy past the "head" of the buffer */
+		t = SERIAL_XMIT_SIZE - 1 - port->xmit_cnt;
+		if (t < c) c = t;
+ 
+		/* Can't copy more? break out! */
+		if (c <= 0) break;
+		if (from_user)
+			copy_from_user (port->xmit_buf + port->xmit_head, buf, c);
+		else
+			memcpy         (port->xmit_buf + port->xmit_head, buf, c);
+
+		port -> xmit_cnt += c;
+		port -> xmit_head = (port->xmit_head + c) & (SERIAL_XMIT_SIZE -1);
+		buf += c;
+		count -= c;
+		total += c;
+	}
+	up (& port->port_write_sem);
+
+	gs_dprintk (GS_DEBUG_WRITE, "write: interrupts are %s\n", 
+	            (port->flags & GS_TX_INTEN)?"enabled": "disabled"); 
+
+	if (port->xmit_cnt && 
+	    !tty->stopped && 
+	    !tty->hw_stopped &&
+	    !(port->flags & GS_TX_INTEN)) {
+		port->flags |= GS_TX_INTEN;
+		port->rd->enable_tx_interrupts (port);
+	}
+	/* func_exit (); */
+	return total;
+}
+#else
+/*
+> Problems to take into account are:
+>       -1- Interrupts that empty part of the buffer.
+>       -2- page faults on the access to userspace. 
+>       -3- Other processes that are also trying to do a "write". 
+*/
+
+int gs_write(struct tty_struct * tty, int from_user, 
+                    const unsigned char *buf, int count)
+{
+	struct gs_port *port;
+	int c, total = 0;
+	int t;
+	unsigned long flags;
+
+	func_enter ();
+
+	/* The standard serial driver returns 0 in this case. 
+	   That sounds to me as "No error, I just didn't get to writing any
+	   bytes. Feel free to try again." 
+	   The "official" way to write n bytes from buf is:
+
+		 for (nwritten = 0;nwritten < n;nwritten += rv) {
+			 rv = write (fd, buf+nwritten, n-nwritten);
+			 if (rv < 0) break; // Error: bail out. //
+		 } 
+
+	   which will loop endlessly in this case. The manual page for write
+	   agrees with me. In practise almost everybody writes 
+	   "write (fd, buf,n);" but some people might have had to deal with 
+	   incomplete writes in the past and correctly implemented it by now... 
+	 */
+
+	if (!tty) return -EIO;
+
+	port = tty->driver_data;
+	if (!port || !port->xmit_buf || !tmp_buf)
+		return -EIO;
+
+	/* printk ("from_user = %d.\n", from_user); */
+	save_flags(flags);
+	if (from_user) {
+		/* printk ("Going into the semaphore\n"); */
+		down(&tmp_buf_sem);
+		/* printk ("got out of the semaphore\n"); */
+		while (1) {
+			c = count;
+
+			/* This is safe because we "OWN" the "head". Noone else can 
+			   change the "head": we own the port_write_sem. */
+			/* Don't overrun the end of the buffer */
+			t = SERIAL_XMIT_SIZE - port->xmit_head;
+			if (t < c) c = t;
+ 
+			/* This is safe because the xmit_cnt can only decrease. This 
+			   would increase "t", so we might copy too little chars. */
+			/* Don't copy past the "head" of the buffer */
+			t = SERIAL_XMIT_SIZE - 1 - port->xmit_cnt;
+			if (t < c) c = t;	 
+
+			/* Can't copy more? break out! */
+			if (c <= 0) break;
+
+			c -= copy_from_user(tmp_buf, buf, c);
+			if (!c) {
+				if (!total)
+					total = -EFAULT;
+				break;
+			}
+			cli();
+			t = SERIAL_XMIT_SIZE - port->xmit_head;
+			if (t < c) c = t;
+			t = SERIAL_XMIT_SIZE - 1 - port->xmit_cnt;
+			if (t < c) c = t;
+
+			memcpy(port->xmit_buf + port->xmit_head, tmp_buf, c);
+			port->xmit_head = ((port->xmit_head + c) &
+			                   (SERIAL_XMIT_SIZE-1));
+			port->xmit_cnt += c;
+			restore_flags(flags);
+			buf += c;
+			count -= c;
+			total += c;
+		}
+		up(&tmp_buf_sem);
+	} else {
+		while (1) {
+			cli();
+			c = count;
+
+			/* This is safe because we "OWN" the "head". Noone else can 
+			   change the "head": we own the port_write_sem. */
+			/* Don't overrun the end of the buffer */
+			t = SERIAL_XMIT_SIZE - port->xmit_head;
+			if (t < c) c = t;
+ 
+			/* This is safe because the xmit_cnt can only decrease. This 
+			   would increase "t", so we might copy too little chars. */
+			/* Don't copy past the "head" of the buffer */
+			t = SERIAL_XMIT_SIZE - 1 - port->xmit_cnt;
+			if (t < c) c = t;
+ 
+			/* Can't copy more? break out! */
+			if (c <= 0) {
+				restore_flags(flags);
+				break;
+			}
+			memcpy(port->xmit_buf + port->xmit_head, buf, c);
+			port->xmit_head = ((port->xmit_head + c) &
+			                   (SERIAL_XMIT_SIZE-1));
+			port->xmit_cnt += c;
+			restore_flags(flags);
+			buf += c;
+			count -= c;
+			total += c;
+		}
+	}
+
+	if (port->xmit_cnt && 
+	    !tty->stopped && 
+	    !tty->hw_stopped &&
+	    !(port->flags & GS_TX_INTEN)) {
+		port->flags |= GS_TX_INTEN;
+		port->rd->enable_tx_interrupts (port);
+	}
+	func_exit ();
+	return total;
+}
+
+#endif
+
+
+
+int gs_write_room(struct tty_struct * tty)
+{
+	struct gs_port *port = tty->driver_data;
+	int ret;
+
+	/* func_enter (); */
+	ret = SERIAL_XMIT_SIZE - port->xmit_cnt - 1;
+	if (ret < 0)
+		ret = 0;
+	/* func_exit (); */
+	return ret;
+}
+
+
+int gs_chars_in_buffer(struct tty_struct *tty)
+{
+	struct gs_port *port = tty->driver_data;
+	func_enter ();
+
+	func_exit ();
+	return port->xmit_cnt;
+}
+
+
+int gs_real_chars_in_buffer(struct tty_struct *tty)
+{
+	struct gs_port *port = tty->driver_data;
+	func_enter ();
+
+	if (!tty) return 0;
+	port = tty->driver_data;
+
+	func_exit ();
+	return port->xmit_cnt + port->rd->chars_in_buffer (port);
+}
+
+
+static void gs_wait_tx_flushed (void * ptr, int timeout) 
+{
+	struct gs_port *port = ptr;
+	long end_jiffies;
+	int jiffies_to_transmit, charsleft;
+	int to, rcib;
+
+	func_enter();
+
+	gs_dprintk (GS_DEBUG_FLUSH, "port=%p.\n", port);
+	if (port) {
+		gs_dprintk (GS_DEBUG_FLUSH, "xmit_cnt=%x, xmit_buf=%p, tty=%p.\n", 
+		port->xmit_cnt, port->xmit_buf, port->tty);
+	}
+
+	if (!port || port->xmit_cnt < 0 || !port->xmit_buf) {
+		gs_dprintk (GS_DEBUG_FLUSH, "ERROR: !port, !port->xmit_buf or prot->xmit_cnt < 0.\n");
+	func_exit();
+		return;  /* This is an error which we don't know how to handle. */
+	}
+	gs_dprintk (GS_DEBUG_FLUSH, "checkpoint 1\n");
+
+	rcib = gs_real_chars_in_buffer(port->tty);
+
+	gs_dprintk (GS_DEBUG_FLUSH, "checkpoint 2\n");
+
+	if(rcib <= 0) {
+		gs_dprintk (GS_DEBUG_FLUSH, "nothing to wait for.\n");
+	func_exit();
+	return;
+	}
+	gs_dprintk (GS_DEBUG_FLUSH, "checkpoint 3\n");
+
+	/* stop trying: now + twice the time it would normally take +  seconds */
+	end_jiffies  = jiffies; 
+	if (timeout !=  MAX_SCHEDULE_TIMEOUT)
+		end_jiffies += port->baud?(2 * rcib * 10 * HZ / port->baud):0;
+	end_jiffies += timeout;
+
+	gs_dprintk (GS_DEBUG_FLUSH, "now=%lx, end=%lx (%ld).\n", 
+		    jiffies, end_jiffies, end_jiffies-jiffies); 
+
+	to = 100;
+	/* the expression is actually jiffies < end_jiffies, but that won't
+	   work around the wraparound. Tricky eh? */
+	while (to-- &&
+	       (charsleft = gs_real_chars_in_buffer (port->tty)) &&
+	        time_after (end_jiffies, jiffies)) {
+		/* Units check: 
+		   chars * (bits/char) * (jiffies /sec) / (bits/sec) = jiffies!
+		   check! */
+
+		charsleft += 16; /* Allow 16 chars more to be transmitted ... */
+		jiffies_to_transmit = port->baud?(1 + charsleft * 10 * HZ / port->baud):0;
+		/*                                ^^^ Round up.... */
+		if (jiffies_to_transmit <= 0) jiffies_to_transmit = 1;
+
+		gs_dprintk (GS_DEBUG_FLUSH, "Expect to finish in %d jiffies "
+			    "(%d chars).\n", jiffies_to_transmit, charsleft); 
+
+		current->state = TASK_INTERRUPTIBLE;
+		schedule_timeout(jiffies_to_transmit);
+		if (signal_pending (current))
+			break;
+	}
+
+	gs_dprintk (GS_DEBUG_FLUSH, "charsleft = %d.\n", charsleft); 
+	current->state = TASK_RUNNING;
+
+	func_exit();
+}
+
+
+
+void gs_flush_buffer(struct tty_struct *tty)
+{
+	struct gs_port *port = tty->driver_data;
+	unsigned long flags;
+
+	func_enter ();
+	/* XXX Would the write semaphore do? */
+	save_flags(flags); cli();
+	port->xmit_cnt = port->xmit_head = port->xmit_tail = 0;
+	restore_flags(flags);
+
+	wake_up_interruptible(&tty->write_wait);
+	if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
+	    tty->ldisc.write_wakeup)
+		(tty->ldisc.write_wakeup)(tty);
+	func_exit ();
+}
+
+
+void gs_flush_chars(struct tty_struct * tty)
+{
+	struct gs_port *port = tty->driver_data;
+
+	func_enter ();
+	if (port->xmit_cnt <= 0 || tty->stopped || tty->hw_stopped ||
+	    !port->xmit_buf) {
+		func_exit ();
+		return;
+	}
+
+	/* Beats me -- REW */
+	port->flags |= GS_TX_INTEN;
+	port->rd->enable_tx_interrupts (port);
+	func_exit ();
+}
+
+
+void gs_stop(struct tty_struct * tty)
+{
+	struct gs_port *port = tty->driver_data;
+
+	func_enter ();
+	if (port->xmit_cnt && 
+	    port->xmit_buf && 
+	    (port->flags & GS_TX_INTEN) ) {
+		port->flags &= ~GS_TX_INTEN;
+		port->rd->disable_tx_interrupts (port);
+	}
+	func_exit ();
+}
+
+
+void gs_start(struct tty_struct * tty)
+{
+	struct gs_port *port = tty->driver_data;
+
+	if (port->xmit_cnt && 
+	    port->xmit_buf && 
+	    !(port->flags & GS_TX_INTEN) ) {
+		port->flags |= GS_TX_INTEN;
+		port->rd->enable_tx_interrupts (port);
+	}
+	func_exit ();
+}
+
+
+void gs_shutdown_port (struct gs_port *port)
+{
+	long flags;
+
+	if (!(port->flags & ASYNC_INITIALIZED))
+		return;
+
+	save_flags (flags);
+	cli ();
+
+	if (port->xmit_buf) {
+		free_page((unsigned long) port->xmit_buf);
+		port->xmit_buf = 0;
+	}
+
+	if (port->tty)
+		set_bit(TTY_IO_ERROR, &port->tty->flags);
+
+	port->rd->shutdown_port (port);
+
+	port->flags &= ~ASYNC_INITIALIZED;
+	restore_flags (flags);
+}
+
+
+void gs_hangup(struct tty_struct *tty)
+{
+	struct gs_port   *port = tty->driver_data;
+
+	func_enter ();
+
+	tty = port->tty;
+	if (!tty) return;
+
+	gs_shutdown_port (port);
+
+	/* gs_flush_buffer (tty); */
+	port->flags &= ~(ASYNC_NORMAL_ACTIVE|ASYNC_CALLOUT_ACTIVE |GS_ACTIVE);
+	port->tty = NULL;
+	port->count = 0;
+
+	wake_up_interruptible(&port->open_wait);
+	func_exit ();
+}
+
+
+void gs_do_softint(void *private_)
+{
+	struct gs_port *port = private_;
+	struct tty_struct *tty;
+
+	tty = port->tty;
+	if(!tty) return;
+
+	if (test_and_clear_bit(RS_EVENT_WRITE_WAKEUP, &port->event)) {
+		if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
+		    tty->ldisc.write_wakeup)
+			(tty->ldisc.write_wakeup)(tty);
+		wake_up_interruptible(&tty->write_wait);
+	}
+	func_exit ();
+}
+
+
+int block_til_ready(void *port_, struct file * filp)
+{
+	struct gs_port *port = port_;
+	DECLARE_WAITQUEUE(wait, current);
+	int    retval;
+	int    do_clocal = 0;
+	int    CD;
+	struct tty_struct *tty;
+
+	func_enter ();
+	tty = port->tty;
+
+	gs_dprintk (GS_DEBUG_BTR, "Entering block_till_ready.\n"); 
+	/*
+	 * If the device is in the middle of being closed, then block
+	 * until it's done, and then try again.
+	 */
+	if (tty_hung_up_p(filp) || port->flags & ASYNC_CLOSING) {
+	  interruptible_sleep_on(&port->close_wait);
+		if (port->flags & ASYNC_HUP_NOTIFY)
+			return -EAGAIN;
+		else
+			return -ERESTARTSYS;
+	}
+
+	gs_dprintk (GS_DEBUG_BTR, "after hung up\n"); 
+
+	/*
+	 * If this is a callout device, then just make sure the normal
+	 * device isn't being used.
+	 */
+	if (tty->driver.subtype == GS_TYPE_CALLOUT) {
+		if (port->flags & ASYNC_NORMAL_ACTIVE)
+			return -EBUSY;
+		if ((port->flags & ASYNC_CALLOUT_ACTIVE) &&
+		    (port->flags & ASYNC_SESSION_LOCKOUT) &&
+		    (port->session != current->session))
+			return -EBUSY;
+		if ((port->flags & ASYNC_CALLOUT_ACTIVE) &&
+		    (port->flags & ASYNC_PGRP_LOCKOUT) &&
+		    (port->pgrp != current->pgrp))
+			return -EBUSY;
+		port->flags |= ASYNC_CALLOUT_ACTIVE;
+		return 0;
+	}
+
+	gs_dprintk (GS_DEBUG_BTR, "after subtype\n");
+
+	/*
+	 * If non-blocking mode is set, or the port is not enabled,
+	 * then make the check up front and then exit.
+	 */
+	if ((filp->f_flags & O_NONBLOCK) ||
+	    (tty->flags & (1 << TTY_IO_ERROR))) {
+		if (port->flags & ASYNC_CALLOUT_ACTIVE)
+			return -EBUSY;
+		port->flags |= ASYNC_NORMAL_ACTIVE;
+		return 0;
+	}
+
+	gs_dprintk (GS_DEBUG_BTR, "after nonblock\n"); 
+ 
+	if (port->flags & ASYNC_CALLOUT_ACTIVE) {
+		if (port->normal_termios.c_cflag & CLOCAL) 
+			do_clocal = 1;
+	} else {
+		if (C_CLOCAL(tty))
+			do_clocal = 1;
+	}
+
+	gs_dprintk (GS_DEBUG_BTR, "after clocal check.\n"); 
+
+	/*
+	 * Block waiting for the carrier detect and the line to become
+	 * free (i.e., not in use by the callout).  While we are in
+	 * this loop, port->count is dropped by one, so that
+	 * rs_close() knows when to free things.  We restore it upon
+	 * exit, either normal or abnormal.
+	 */
+	retval = 0;
+	add_wait_queue(&port->open_wait, &wait);
+
+	gs_dprintk (GS_DEBUG_BTR, "after add waitq.\n"); 
+
+	cli();
+	if (!tty_hung_up_p(filp))
+		port->count--;
+	sti();
+	port->blocked_open++;
+	while (1) {
+		CD = port->rd->get_CD (port);
+		gs_dprintk (GS_DEBUG_BTR, "CD is now %d.\n", CD);
+		current->state = TASK_INTERRUPTIBLE;
+		if (tty_hung_up_p(filp) ||
+		    !(port->flags & ASYNC_INITIALIZED)) {
+			if (port->flags & ASYNC_HUP_NOTIFY)
+				retval = -EAGAIN;
+			else
+				retval = -ERESTARTSYS;
+			break;
+		}
+		if (!(port->flags & ASYNC_CALLOUT_ACTIVE) &&
+		    !(port->flags & ASYNC_CLOSING) &&
+		    (do_clocal || CD))
+			break;
+		gs_dprintk (GS_DEBUG_BTR, "signal_pending is now: %d (%lx)\n", 
+		(int)signal_pending (current), *(long*)(&current->blocked)); 
+		if (signal_pending(current)) {
+			retval = -ERESTARTSYS;
+			break;
+		}
+		schedule();
+	}
+	gs_dprintk (GS_DEBUG_BTR, "Got out of the loop. (%d)\n",
+		    port->blocked_open);
+	current->state = TASK_RUNNING;
+	remove_wait_queue(&port->open_wait, &wait);
+	if (!tty_hung_up_p(filp))
+		port->count++;
+	port->blocked_open--;
+	if (retval)
+		return retval;
+
+	port->flags |= ASYNC_NORMAL_ACTIVE;
+	func_exit ();
+	return 0;
+}			 
+
+
+void gs_close(struct tty_struct * tty, struct file * filp)
+{
+	unsigned long flags;
+	struct gs_port *port;
+
+	func_enter ();
+	port = (struct gs_port *) tty->driver_data;
+
+	gs_dprintk (GS_DEBUG_CLOSE, "tty=%p, port=%p port->tty=%p\n",
+	            tty, port, port->tty);
+
+	if(! port) {
+		func_exit();
+		return;
+	}
+	if (!port->tty) {
+		printk (KERN_WARNING "gs: Odd: port->tty is NULL\n");
+		port->tty = tty;
+	}
+
+
+	save_flags(flags); cli();
+
+	if (tty_hung_up_p(filp)) {
+		restore_flags(flags);
+		port->rd->hungup (port);
+		func_exit ();
+		return;
+	}
+
+	if ((tty->count == 1) && (port->count != 1)) {
+		printk(KERN_ERR "gs: gs_close: bad port count;"
+		       " tty->count is 1, port count is %d\n", port->count);
+		port->count = 1;
+	}
+	if (--port->count < 0) {
+		printk(KERN_ERR "gs: gs_close: bad port count: %d\n", port->count);
+		port->count = 0;
+	}
+	if (port->count) {
+		restore_flags(flags);
+		func_exit ();
+		return;
+	}
+	port->flags |= ASYNC_CLOSING;
+
+	/*
+	 * Save the termios structure, since this port may have
+	 * separate termios for callout and dialin.
+	 */
+	if (port->flags & ASYNC_NORMAL_ACTIVE)
+		port->normal_termios = *tty->termios;
+	if (port->flags & ASYNC_CALLOUT_ACTIVE)
+		port->callout_termios = *tty->termios;
+	/*
+	 * Now we wait for the transmit buffer to clear; and we notify 
+	 * the line discipline to only process XON/XOFF characters.
+	 */
+	tty->closing = 1;
+	/* if (port->closing_wait != ASYNC_CLOSING_WAIT_NONE)
+	   tty_wait_until_sent(tty, port->closing_wait); */
+
+	/*
+	 * At this point we stop accepting input.  To do this, we
+	 * disable the receive line status interrupts, and tell the
+	 * interrupt driver to stop checking the data ready bit in the
+	 * line status register.
+	 */
+
+	port->rd->disable_rx_interrupts (port);
+
+	if (port->closing_wait != ASYNC_CLOSING_WAIT_NONE)
+		gs_wait_tx_flushed (port, port->closing_wait); 
+
+	port->flags &= ~GS_ACTIVE;
+
+	if (tty->driver.flush_buffer)
+		tty->driver.flush_buffer(tty);
+	if (tty->ldisc.flush_buffer)
+		tty->ldisc.flush_buffer(tty);
+	tty->closing = 0;
+	port->event = 0;
+	port->tty = 0;
+	if (port->blocked_open) {
+		if (port->close_delay) {
+			current->state = TASK_INTERRUPTIBLE;
+			schedule_timeout(port->close_delay);
+		}
+		wake_up_interruptible(&port->open_wait);
+	}
+	port->flags &= ~(ASYNC_NORMAL_ACTIVE|ASYNC_CALLOUT_ACTIVE|
+	                 ASYNC_CLOSING | ASYNC_INITIALIZED);
+	wake_up_interruptible(&port->close_wait);
+
+	port->rd->close (port);
+	port->rd->shutdown_port (port);
+	restore_flags(flags);
+	func_exit ();
+}
+
+
+static unsigned int     gs_baudrates[] = {
+  0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800,
+  9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600
+};
+
+
+void gs_set_termios (struct tty_struct * tty, 
+                     struct termios * old_termios)
+{
+	struct gs_port *port = tty->driver_data;
+	int baudrate, tmp;
+	struct termios *tiosp;
+
+	func_enter();
+
+	tiosp = tty->termios;
+
+
+	if (gs_debug & GS_DEBUG_TERMIOS) {
+		gs_dprintk (GS_DEBUG_TERMIOS, "termios structure (%p):\n", tiosp);
+		my_hd ((unsigned char *)tiosp, sizeof (struct termios));
+	}
+
+#if 0
+	/* This is an optimization that is only allowed for dumb cards */
+	/* Smart cards require knowledge of iflags and oflags too: that 
+	   might change hardware cooking mode.... */
+#endif
+	if (old_termios) {
+		if(   (tiosp->c_iflag == old_termios->c_iflag)
+		   && (tiosp->c_oflag == old_termios->c_oflag)
+		   && (tiosp->c_cflag == old_termios->c_cflag)
+		   && (tiosp->c_lflag == old_termios->c_lflag)
+		   && (tiosp->c_line  == old_termios->c_line)
+		   && (memcmp(tiosp->c_cc, old_termios->c_cc, NCC) == 0)) {
+			gs_dprintk(GS_DEBUG_TERMIOS, "gs_set_termios: optimized away\n");
+			return;
+		}
+	} else 
+		gs_dprintk(GS_DEBUG_TERMIOS, "gs_set_termios: no old_termios: "
+		           "no optimization\n");
+
+	if(old_termios && (gs_debug & GS_DEBUG_TERMIOS)) {
+		if(tiosp->c_iflag != old_termios->c_iflag)  printk("c_iflag changed\n");
+		if(tiosp->c_oflag != old_termios->c_oflag)  printk("c_oflag changed\n");
+		if(tiosp->c_cflag != old_termios->c_cflag)  printk("c_cflag changed\n");
+		if(tiosp->c_lflag != old_termios->c_lflag)  printk("c_lflag changed\n");
+		if(tiosp->c_line  != old_termios->c_line)   printk("c_line changed\n");
+		if(!memcmp(tiosp->c_cc, old_termios->c_cc, NCC)) printk("c_cc changed\n");
+	}
+
+	baudrate = tiosp->c_cflag & CBAUD;
+	if (baudrate & CBAUDEX) {
+		baudrate &= ~CBAUDEX;
+		if ((baudrate < 1) || (baudrate > 4))
+			tiosp->c_cflag &= ~CBAUDEX;
+		else
+			baudrate += 15;
+	}
+
+	baudrate = gs_baudrates[baudrate];
+	if ((tiosp->c_cflag & CBAUD) == B38400) {
+		if (     (port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
+			baudrate = 57600;
+		else if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
+			baudrate = 115200;
+		else if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI)
+			baudrate = 230400;
+		else if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
+			baudrate = 460800;
+		else if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST)
+			baudrate = (port->baud_base / port->custom_divisor);
+	}
+
+	/* I recommend using THIS instead of the mess in termios (and
+	   duplicating the above code). Next we should create a clean
+	   interface towards this variable. If your card supports arbitrary
+	   baud rates, (e.g. CD1400 or 16550 based cards) then everything
+	   will be very easy..... */
+	port->baud = baudrate;
+
+	/* Two timer ticks seems enough to wakeup something like SLIP driver */
+	/* Baudrate/10 is cps. Divide by HZ to get chars per tick. */
+	tmp = (baudrate / 10 / HZ) * 2;			 
+
+	if (tmp <                 0) tmp = 0;
+	if (tmp >= SERIAL_XMIT_SIZE) tmp = SERIAL_XMIT_SIZE-1;
+
+	port->wakeup_chars = tmp;
+
+	/* We should really wait for the characters to be all sent before
+	   changing the settings. -- CAL */
+	gs_wait_tx_flushed (port, MAX_SCHEDULE_TIMEOUT);
+
+	port->rd->set_real_termios(port);
+
+	if ((!old_termios || 
+	     (old_termios->c_cflag & CRTSCTS)) &&
+	    !(      tiosp->c_cflag & CRTSCTS)) {
+		tty->stopped = 0;
+		gs_start(tty);
+	}
+
+#ifdef tytso_patch_94Nov25_1726
+	/* This "makes sense", Why is it commented out? */
+
+	if (!(old_termios->c_cflag & CLOCAL) &&
+	    (tty->termios->c_cflag & CLOCAL))
+		wake_up_interruptible(&info->open_wait);
+#endif
+
+	func_exit();
+	return;
+}
+
+
+
+/* Must be called with interrupts enabled */
+int gs_init_port(struct gs_port *port)
+{
+	unsigned long flags;
+	unsigned long page;
+
+	save_flags (flags);
+	if (!tmp_buf) {
+		page = get_free_page(GFP_KERNEL);
+
+		cli (); /* Don't expect this to make a difference. */ 
+		if (tmp_buf)
+			free_page(page);
+		else
+			tmp_buf = (unsigned char *) page;
+		restore_flags (flags);
+
+		if (!tmp_buf) {
+			return -ENOMEM;
+		}
+	}
+
+	if (port->flags & ASYNC_INITIALIZED)
+		return 0;
+
+	if (!port->xmit_buf) {
+		/* We may sleep in get_free_page() */
+		unsigned long tmp;
+
+		tmp = get_free_page(GFP_KERNEL);
+
+		/* Spinlock? */
+		cli ();
+		if (port->xmit_buf) 
+			free_page (tmp);
+		else
+			port->xmit_buf = (unsigned char *) tmp;
+		restore_flags (flags);
+
+		if (!port->xmit_buf)
+			return -ENOMEM;
+	}
+
+	cli();
+
+	if (port->tty) 
+		clear_bit(TTY_IO_ERROR, &port->tty->flags);
+
+	port->xmit_cnt = port->xmit_head = port->xmit_tail = 0;
+
+	gs_set_termios(port->tty, NULL);
+
+	port->flags |= ASYNC_INITIALIZED;
+	port->flags &= ~GS_TX_INTEN;
+
+	restore_flags(flags);
+	return 0;
+}
+
+
+int gs_setserial(struct gs_port *port, struct serial_struct *sp)
+{
+	struct serial_struct sio;
+
+	copy_from_user(&sio, sp, sizeof(struct serial_struct));
+
+	if (!capable(CAP_SYS_ADMIN)) {
+		if ((sio.baud_base != port->baud_base) ||
+		    (sio.close_delay != port->close_delay) ||
+		    ((sio.flags & ~ASYNC_USR_MASK) !=
+		     (port->flags & ~ASYNC_USR_MASK)))
+			return(-EPERM);
+	} 
+
+	port->flags = (port->flags & ~ASYNC_USR_MASK) |
+		(sio.flags & ASYNC_USR_MASK);
+  
+	port->baud_base = sio.baud_base;
+	port->close_delay = sio.close_delay;
+	port->closing_wait = sio.closing_wait;
+	port->custom_divisor = sio.custom_divisor;
+
+	gs_set_termios (port->tty, NULL);
+
+	return 0;
+}
+
+
+/*****************************************************************************/
+
+/*
+ *      Generate the serial struct info.
+ */
+
+void gs_getserial(struct gs_port *port, struct serial_struct *sp)
+{
+	struct serial_struct    sio;
+
+	memset(&sio, 0, sizeof(struct serial_struct));
+	sio.flags = port->flags;
+	sio.baud_base = port->baud_base;
+	sio.close_delay = port->close_delay;
+	sio.closing_wait = port->closing_wait;
+	sio.custom_divisor = port->custom_divisor;
+	sio.hub6 = 0;
+
+	/* If you want you can override these. */
+	sio.type = PORT_UNKNOWN;
+	sio.xmit_fifo_size = -1;
+	sio.line = -1;
+	sio.port = -1;
+	sio.irq = -1;
+
+	if (port->rd->getserial)
+		port->rd->getserial (port, &sio);
+
+	copy_to_user(sp, &sio, sizeof(struct serial_struct));
+}
+
diff -urN linux-2.2.11-pre2/drivers/char/generic_serial.h linux/drivers/char/generic_serial.h
--- linux-2.2.11-pre2/drivers/char/generic_serial.h	Wed Dec 31 16:00:00 1969
+++ linux/drivers/char/generic_serial.h	Mon Dec  3 18:52:25 2001
@@ -0,0 +1,101 @@
+/*
+ *  generic_serial.h
+ *
+ *  Copyright (C) 1998 R.E.Wolff@BitWizard.nl
+ *
+ *  written for the SX serial driver.
+ *     Contains the code that should be shared over all the serial drivers.
+ *
+ *  Version 0.1 -- December, 1998.
+ */
+
+#ifndef GENERIC_SERIAL_H
+#define GENERIC_SERIAL_H
+
+struct real_driver {
+  void                    (*disable_tx_interrupts) (void *);
+  void                    (*enable_tx_interrupts) (void *);
+  void                    (*disable_rx_interrupts) (void *);
+  void                    (*enable_rx_interrupts) (void *);
+  int                     (*get_CD) (void *);
+  void                    (*shutdown_port) (void*);
+  void                    (*set_real_termios) (void*);
+  int                     (*chars_in_buffer) (void*);
+  void                    (*close) (void*);
+  void                    (*hungup) (void*);
+  void                    (*getserial) (void*, struct serial_struct *sp);
+};
+
+
+
+struct gs_port {
+  int                     magic;
+  unsigned char           *xmit_buf; 
+  int                     xmit_head;
+  int                     xmit_tail;
+  int                     xmit_cnt;
+  /*  struct semaphore        port_write_sem; */
+  int                     flags;
+  struct termios          normal_termios;
+  struct termios          callout_termios;
+  wait_queue_head_t       open_wait;
+  wait_queue_head_t       close_wait;
+  long                    session;
+  long                    pgrp;
+  int                     count;
+  int                     blocked_open;
+  struct tty_struct       *tty;
+  int                     event;
+  unsigned short          closing_wait;
+  int                     close_delay;
+  struct real_driver      *rd;
+  int                     wakeup_chars;
+  int                     baud_base;
+  int                     baud;
+  int                     custom_divisor;
+};
+
+
+/* Flags */
+/* Warning: serial.h defines some ASYNC_ flags, they say they are "only"
+   used in serial.c, but they are also used in all other serial drivers. 
+   Make sure they don't clash with these here... */
+#define GS_TX_INTEN      0x00800000
+#define GS_RX_INTEN      0x00400000
+#define GS_ACTIVE        0x00200000
+
+
+
+#define GS_TYPE_NORMAL   1
+#define GS_TYPE_CALLOUT  2
+
+
+#define GS_DEBUG_FLUSH   0x00000001
+#define GS_DEBUG_BTR     0x00000002
+#define GS_DEBUG_TERMIOS 0x00000004
+#define GS_DEBUG_STUFF   0x00000008
+#define GS_DEBUG_CLOSE   0x00000010
+
+
+void gs_put_char(struct tty_struct *tty, unsigned char ch);
+int  gs_write(struct tty_struct *tty, int from_user, 
+             const unsigned char *buf, int count);
+int  gs_write_room(struct tty_struct *tty);
+int  gs_chars_in_buffer(struct tty_struct *tty);
+void gs_flush_buffer(struct tty_struct *tty);
+void gs_flush_chars(struct tty_struct *tty);
+void gs_stop(struct tty_struct *tty);
+void gs_start(struct tty_struct *tty);
+void gs_hangup(struct tty_struct *tty);
+void gs_do_softint(void *private_);
+int  block_til_ready(void *port, struct file *filp);
+void gs_close(struct tty_struct *tty, struct file *filp);
+void gs_set_termios (struct tty_struct * tty, 
+                     struct termios * old_termios);
+int  gs_init_port(struct gs_port *port);
+int  gs_setserial(struct gs_port *port, struct serial_struct *sp);
+void gs_getserial(struct gs_port *port, struct serial_struct *sp);
+
+extern int gs_debug;
+
+#endif
diff -urN linux-2.2.11-pre2/drivers/char/keyboard.c linux/drivers/char/keyboard.c
--- linux-2.2.11-pre2/drivers/char/keyboard.c	Mon Dec  3 18:52:01 2001
+++ linux/drivers/char/keyboard.c	Mon Dec  3 18:52:25 2001
@@ -156,7 +156,6 @@
 
 #ifdef CONFIG_MAGIC_SYSRQ
 static int sysrq_pressed;
-int sysrq_enabled = 1;
 #endif
 
 /*
diff -urN linux-2.2.11-pre2/drivers/char/mem.c linux/drivers/char/mem.c
--- linux-2.2.11-pre2/drivers/char/mem.c	Mon May 10 10:18:34 1999
+++ linux/drivers/char/mem.c	Mon Dec  3 18:52:25 2001
@@ -16,6 +16,7 @@
 #include <linux/init.h>
 #include <linux/joystick.h>
 #include <linux/i2c.h>
+#include <linux/capability.h>
 
 #include <asm/uaccess.h>
 #include <asm/io.h>
@@ -464,11 +465,19 @@
 	}
 }
 
+static int open_port(struct inode * inode, struct file * filp)
+{
+	return capable(CAP_SYS_RAWIO) ? 0 : -EPERM;
+}
+
+
 #define mmap_kmem	mmap_mem
 #define zero_lseek	null_lseek
 #define full_lseek      null_lseek
 #define write_zero	write_null
 #define read_full       read_zero
+#define open_mem	open_port	/* different capability? */
+#define open_kmem	open_mem
 
 static struct file_operations mem_fops = {
 	memory_lseek,
@@ -478,7 +487,7 @@
 	NULL,		/* mem_poll */
 	NULL,		/* mem_ioctl */
 	mmap_mem,
-	NULL,		/* no special open code */
+	open_mem,
 	NULL,		/* flush */
 	NULL,		/* no special release code */
 	NULL		/* fsync */
@@ -492,7 +501,7 @@
 	NULL,		/* kmem_poll */
 	NULL,		/* kmem_ioctl */
 	mmap_kmem,
-	NULL,		/* no special open code */
+	open_kmem,
 	NULL,		/* flush */
 	NULL,		/* no special release code */
 	NULL		/* fsync */
@@ -520,7 +529,7 @@
 	NULL,		/* port_poll */
 	NULL,		/* port_ioctl */
 	NULL,		/* port_mmap */
-	NULL,		/* no special open code */
+	open_port,
 	NULL,		/* flush */
 	NULL,		/* no special release code */
 	NULL		/* fsync */
diff -urN linux-2.2.11-pre2/drivers/char/sx.c linux/drivers/char/sx.c
--- linux-2.2.11-pre2/drivers/char/sx.c	Wed Dec 31 16:00:00 1969
+++ linux/drivers/char/sx.c	Mon Dec  3 18:52:25 2001
@@ -0,0 +1,2684 @@
+
+/* sx.c -- driver for the Specialix SX series cards. 
+ *
+ *  This driver will also support the older SI, and XIO cards.
+ *
+ *
+ *   (C) 1998 R.E.Wolff@BitWizard.nl
+ *
+ *  Simon Allen (simonallen@cix.compulink.co.uk) wrote a previous
+ *  version of this driver. Some fragments may have been copied. (none
+ *  yet :-)
+ *
+ * Specialix pays for the development and support of this driver.
+ * Please DO contact support@specialix.co.uk if you require
+ * support. But please read the documentation (sx.txt) first.
+ *
+ *
+ *
+ *      This program is free software; you can redistribute it and/or
+ *      modify it under the terms of the GNU General Public License as
+ *      published by the Free Software Foundation; either version 2 of
+ *      the License, or (at your option) any later version.
+ *
+ *      This program is distributed in the hope that it will be
+ *      useful, but WITHOUT ANY WARRANTY; without even the implied
+ *      warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ *      PURPOSE.  See the GNU General Public License for more details.
+ *
+ *      You should have received a copy of the GNU General Public
+ *      License along with this program; if not, write to the Free
+ *      Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
+ *      USA.
+ *
+ * Revision history:
+ * $Log: sx.c,v $
+ * Revision 1.26  1999/08/05 15:22:14  wolff
+ * - Port to 2.3.x
+ * - Reformatted to Linus' liking.
+ *
+ * Revision 1.25  1999/07/30 14:24:08  wolff
+ * Had accidentally left "gs_debug" set to "-1" instead of "off" (=0).
+ *
+ * Revision 1.24  1999/07/28 09:41:52  wolff
+ * - I noticed the remark about use-count straying in sx.txt. I checked
+ *   sx_open, and found a few places where that could happen. I hope it's
+ *   fixed now.
+ *
+ * Revision 1.23  1999/07/28 08:56:06  wolff
+ * - Fixed crash when sx_firmware run twice.
+ * - Added sx_slowpoll as a module parameter (I guess nobody really wanted
+ *   to change it from the default... )
+ * - Fixed a stupid editing problem I introduced in 1.22.
+ * - Fixed dropping characters on a termios change.
+ *
+ * Revision 1.22  1999/07/26 21:01:43  wolff
+ * Russell Brown noticed that I had overlooked 4 out of six modem control
+ * signals in sx_getsignals. Ooops.
+ *
+ * Revision 1.21  1999/07/23 09:11:33  wolff
+ * I forgot to free dynamically allocated memory when the driver is unloaded.
+ *
+ * Revision 1.20  1999/07/20 06:25:26  wolff
+ * The "closing wait" wasn't honoured. Thanks to James Griffiths for
+ * reporting this.
+ *
+ * Revision 1.19  1999/07/11 08:59:59  wolff
+ * Fixed an oops in close, when an open was pending. Changed the memtest
+ * a bit. Should also test the board in word-mode, however my card fails the
+ * memtest then. I still have to figure out what is wrong...
+ *
+ * Revision 1.18  1999/06/10 09:38:42  wolff
+ * Changed the format of the firmware revision from %04x to %x.%02x .
+ *
+ * Revision 1.17  1999/06/04 09:44:35  wolff
+ * fixed problem: reference to pci stuff when config_pci was off...
+ * Thanks to Jorge Novo for noticing this.
+ *
+ * Revision 1.16  1999/06/02 08:30:15  wolff
+ * added/removed the workaround for the DCD bug in the Firmware.
+ * A bit more debugging code to locate that...
+ *
+ * Revision 1.15  1999/06/01 11:35:30  wolff
+ * when DCD is left low (floating?), on TA's the firmware first tells us
+ * that DCD is high, but after a short while suddenly comes to the
+ * conclusion that it is low. All this would be fine, if it weren't that
+ * Unix requires us to send a "hangup" signal in that case. This usually
+ * all happens BEFORE the program has had a chance to ioctl the device
+ * into clocal mode..
+ *
+ * Revision 1.14  1999/05/25 11:18:59  wolff
+ * Added PCI-fix.
+ * Added checks for return code of sx_sendcommand.
+ * Don't issue "reconfig" if port isn't open yet. (bit us on TA modules...)
+ *
+ * Revision 1.13  1999/04/29 15:18:01  wolff
+ * Fixed an "oops" that showed on SuSE 6.0 systems.
+ * Activate DTR again after stty 0.
+ *
+ * Revision 1.12  1999/04/29 07:49:52  wolff
+ * Improved "stty 0" handling a bit. (used to change baud to 9600 assuming
+ *     the connection would be dropped anyway. That is not always the case,
+ *     and confuses people).
+ * Told the card to always monitor the modem signals.
+ * Added support for dynamic  gs_debug adjustments.
+ * Now tells the rest of the system the number of ports.
+ *
+ * Revision 1.11  1999/04/24 11:11:30  wolff
+ * Fixed two stupid typos in the memory test.
+ *
+ * Revision 1.10  1999/04/24 10:53:39  wolff
+ * Added some of Christian's suggestions.
+ * Fixed an HW_COOK_IN bug (ISIG was not in I_OTHER. We used to trust the
+ * card to send the signal to the process.....)
+ *
+ * Revision 1.9  1999/04/23 07:26:38  wolff
+ * Included Christian Lademann's 2.0 compile-warning fixes and interrupt
+ *    assignment redesign.
+ * Cleanup of some other stuff.
+ *
+ * Revision 1.8  1999/04/16 13:05:30  wolff
+ * fixed a DCD change unnoticed bug.
+ *
+ * Revision 1.7  1999/04/14 22:19:51  wolff
+ * Fixed typo that showed up in 2.0.x builds (get_user instead of Get_user!)
+ *
+ * Revision 1.6  1999/04/13 18:40:20  wolff
+ * changed misc-minor to 161, as assigned by HPA.
+ *
+ * Revision 1.5  1999/04/13 15:12:25  wolff
+ * Fixed use-count leak when "hangup" occurred.
+ * Added workaround for a stupid-PCIBIOS bug.
+ *
+ *
+ * Revision 1.4  1999/04/01 22:47:40  wolff
+ * Fixed < 1M linux-2.0 problem.
+ * (vremap isn't compatible with ioremap in that case)
+ *
+ * Revision 1.3  1999/03/31 13:45:45  wolff
+ * Firmware loading is now done through a separate IOCTL.
+ *
+ * Revision 1.2  1999/03/28 12:22:29  wolff
+ * rcs cleanup
+ *
+ * Revision 1.1  1999/03/28 12:10:34  wolff
+ * Readying for release on 2.0.x (sorry David, 1.01 becomes 1.1 for RCS). 
+ *
+ * Revision 0.12  1999/03/28 09:20:10  wolff
+ * Fixed problem in 0.11, continueing cleanup.
+ *
+ * Revision 0.11  1999/03/28 08:46:44  wolff
+ * cleanup. Not good.
+ *
+ * Revision 0.10  1999/03/28 08:09:43  wolff
+ * Fixed loosing characters on close.
+ *
+ * Revision 0.9  1999/03/21 22:52:01  wolff
+ * Ported back to 2.2.... (minor things)
+ *
+ * Revision 0.8  1999/03/21 22:40:33  wolff
+ * Port to 2.0
+ *
+ * Revision 0.7  1999/03/21 19:06:34  wolff
+ * Fixed hangup processing.
+ *
+ * Revision 0.6  1999/02/05 08:45:14  wolff
+ * fixed real_raw problems. Inclusion into kernel imminent.
+ *
+ * Revision 0.5  1998/12/21 23:51:06  wolff
+ * Snatched a nasty bug: sx_transmit_chars was getting re-entered, and it
+ * shouldn't have. THATs why I want to have transmit interrupts even when
+ * the buffer is empty.
+ *
+ * Revision 0.4  1998/12/17 09:34:46  wolff
+ * PPP works. ioctl works. Basically works!
+ *
+ * Revision 0.3  1998/12/15 13:05:18  wolff
+ * It works! Wow! Gotta start implementing IOCTL and stuff....
+ *
+ * Revision 0.2  1998/12/01 08:33:53  wolff
+ * moved over to 2.1.130
+ *
+ * Revision 0.1  1998/11/03 21:23:51  wolff
+ * Initial revision. Detects SX card.
+ *
+ * */
+
+
+#define RCS_ID "$Id: sx.c,v 1.26 1999/08/05 15:22:14 wolff Exp $"
+#define RCS_REV "$Revision: 1.26 $"
+
+
+#include <linux/module.h>
+#include <linux/config.h> 
+#include <linux/kdev_t.h>
+#include <asm/io.h>
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/ioport.h>
+#include <linux/interrupt.h>
+#include <linux/errno.h>
+#include <linux/tty.h>
+#include <linux/tty_flip.h>
+#include <linux/mm.h>
+#include <linux/serial.h>
+#include <linux/fcntl.h>
+#include <linux/major.h>
+#include <linux/delay.h>
+#include <linux/tqueue.h>
+#include <linux/version.h>
+#include <linux/pci.h>
+#include <linux/malloc.h>
+#include <linux/miscdevice.h>
+
+/* The 3.0.0 version of sxboards/sxwindow.h  uses BYTE and WORD.... */
+#define BYTE u8
+#define WORD u16
+
+/* .... but the 3.0.4 version uses _u8 and _u16. */
+#define _u8 u8
+#define _u16 u16
+
+#include "sxboards.h"
+#include "sxwindow.h"
+
+
+/* I don't think that this driver can handle more than 256 ports on
+   one machine. You'll have to increase the number of boards in sx.h
+   if you want more than 4 boards.  */
+
+
+/* ************************************************************** */
+/* * This section can be removed when 2.0 becomes outdated....  * */
+/* ************************************************************** */
+
+
+#if LINUX_VERSION_CODE < 0x020100    /* Less than 2.1.0 */
+#define TWO_ZERO
+#else
+#if LINUX_VERSION_CODE < 0x020200   /* less than 2.2.x */
+#warning "Please use a 2.2.x kernel. "
+#else
+#if LINUX_VERSION_CODE < 0x020300   /* less than 2.3.x */
+#define TWO_TWO
+#else
+#define TWO_THREE
+#endif
+#endif
+#endif
+
+#ifdef TWO_ZERO
+
+/* Here is the section that makes the 2.2 compatible driver source 
+   work for 2.0 too! We mostly try to adopt the "new thingies" from 2.2, 
+   and provide for compatibility stuff here if possible. */
+
+#include <linux/bios32.h>
+
+#define Get_user(a,b)                a = get_user(b)
+#define Put_user(a,b)                0,put_user(a,b)
+#define copy_to_user(a,b,c)          memcpy_tofs(a,b,c)
+
+static inline int copy_from_user(void *to,const void *from, int c) 
+{
+  memcpy_fromfs(to, from, c);
+  return 0;
+}
+
+#define pci_present                  pcibios_present
+#define pci_read_config_word         pcibios_read_config_word
+#define pci_read_config_dword        pcibios_read_config_dword
+
+static inline unsigned char get_irq (unsigned char bus, unsigned char fn)
+{
+	unsigned char t; 
+	pcibios_read_config_byte (bus, fn, PCI_INTERRUPT_LINE, &t);
+	return t;
+}
+
+static inline void *ioremap(unsigned long base, long length)
+{
+	if (base < 0x100000) return (void *)base;
+	return vremap (base, length);
+}
+
+#define my_iounmap(x, b)             (((long)x<0x100000)?0:vfree ((void*)x))
+
+#define capable(x)                   suser()
+
+#define queue_task                   queue_task_irq_off
+#define tty_flip_buffer_push(tty)    queue_task(&tty->flip.tqueue, &tq_timer)
+#define signal_pending(current)      (current->signal & ~current->blocked)
+#define schedule_timeout(to)         do {current->timeout = jiffies + (to);schedule ();} while (0)
+#define time_after(t1,t2)            (((long)t1-t2) > 0)
+
+
+#define test_and_set_bit(nr, addr)   set_bit(nr, addr)
+#define test_and_clear_bit(nr, addr) clear_bit(nr, addr)
+
+/* Not yet implemented on 2.0 */
+#define ASYNC_SPD_SHI  -1
+#define ASYNC_SPD_WARP -1
+
+
+/* Ugly hack: the driver_name doesn't exist in 2.0.x . So we define it
+   to the "name" field that does exist. As long as the assignments are
+   done in the right order, there is nothing to worry about. */
+#define driver_name           name 
+
+/* Should be in a header somewhere. They are in tty.h on 2.2 */
+#define TTY_HW_COOK_OUT       14 /* Flag to tell ntty what we can handle */
+#define TTY_HW_COOK_IN        15 /* in hardware - output and input       */
+
+/* The return type of a "close" routine. */
+#define INT                   void
+#define NO_ERROR              /* Nothing */
+
+#else
+
+/* The 2.2.x compatibility section. */
+#include <asm/uaccess.h>
+
+
+#define Get_user(a,b)         get_user(a,b)
+#define Put_user(a,b)         put_user(a,b)
+#define get_irq(pdev)         pdev->irq
+
+#define INT                   int
+#define NO_ERROR              0
+
+#define my_iounmap(x,b)       (iounmap((char *)(b)))
+
+#endif
+
+#ifndef TWO_THREE
+/* These are new in 2.3. The source now uses 2.3 syntax, and here is 
+   the compatibility define... */
+#define wait_queue_head_t struct wait_queue *
+#define DECLARE_MUTEX(name) struct semaphore name = MUTEX
+#define DECLARE_WAITQUEUE(wait, current) struct wait_queue wait = { current, NULL }
+
+#endif
+
+
+
+#include "generic_serial.h"
+#include "sx.h"
+
+
+/* ************************************************************** */
+/* *                End of compatibility section..              * */
+/* ************************************************************** */
+
+
+
+/* Why the hell am I defining these here? */
+#define SX_TYPE_NORMAL 1
+#define SX_TYPE_CALLOUT 2
+
+#ifndef SX_NORMAL_MAJOR
+/* This allows overriding on the compiler commandline, or in a "major.h" 
+   include or something like that */
+#define SX_NORMAL_MAJOR  32
+#define SX_CALLOUT_MAJOR 33
+#endif
+
+#ifndef PCI_DEVICE_ID_SPECIALIX_SX_XIO_IO8
+#define PCI_DEVICE_ID_SPECIALIX_SX_XIO_IO8 0x2000
+#endif
+
+
+
+/* Configurable options: 
+   (Don't be too sure that it'll work if you toggle them) */
+
+/* Am I paranoid or not ? ;-) */
+#undef SX_PARANOIA_CHECK
+
+
+/* 20 -> 2000 per second. The card should rate-limit interrupts at 100
+   Hz, but it is user configurable. I don't recommend going above 1000
+   Hz. The interrupt ratelimit might trigger if the interrupt is
+   shared with a very active other device. */
+#define IRQ_RATE_LIMIT 20
+
+/* Sharing interrupts is possible now. If the other device wants more
+   than 2000 interrupts per second, we'd gracefully decline further
+   interrupts. That's not what we want. On the other hand, if the
+   other device interrupts 2000 times a second, don't use the SX
+   interrupt. Use polling. */
+#undef IRQ_RATE_LIMIT
+
+
+#if 0
+/* Not implemented */
+/* 
+ * The following defines are mostly for testing purposes. But if you need
+ * some nice reporting in your syslog, you can define them also.
+ */
+#define SX_REPORT_FIFO
+#define SX_REPORT_OVERRUN
+#endif 
+
+
+/* Function prototypes */
+static void sx_disable_tx_interrupts (void * ptr); 
+static void sx_enable_tx_interrupts (void * ptr); 
+static void sx_disable_rx_interrupts (void * ptr); 
+static void sx_enable_rx_interrupts (void * ptr); 
+static int  sx_get_CD (void * ptr); 
+static void sx_shutdown_port (void * ptr);
+static void sx_set_real_termios (void  *ptr);
+static void sx_hungup (void  *ptr);
+static void sx_close (void  *ptr);
+static int sx_chars_in_buffer (void * ptr);
+static int sx_init_board (struct sx_board *board);
+static int sx_init_portstructs (int nboards, int nports);
+static int sx_fw_ioctl (struct inode *inode, struct file *filp,
+		         unsigned int cmd, unsigned long arg);
+static int sx_fw_open(struct inode *inode, struct file *filp);
+static INT sx_fw_release(struct inode *inode, struct file *filp);
+static int sx_init_drivers(void);
+void my_hd (unsigned char *addr, int len);
+
+
+
+static struct tty_driver sx_driver, sx_callout_driver;
+
+static struct tty_struct * sx_table[SX_NPORTS] = { NULL, };
+static struct termios ** sx_termios;
+static struct termios ** sx_termios_locked;
+
+struct sx_board boards[SX_NBOARDS];
+struct sx_port *sx_ports;
+int sx_refcount;
+int sx_initialized = 0;
+int sx_nports = 0;
+int sx_debug = 0;
+
+
+/* You can have the driver poll your card. 
+    - Set sx_poll to 1 to poll every timer tick (10ms on Intel). 
+      This is used when the card cannot use an interrupt for some reason.
+
+    - set sx_slowpoll to 100 to do an extra poll once a second (on Intel). If 
+      the driver misses an interrupt (report this if it DOES happen to you!)
+      everything will continue to work.... 
+ */
+int sx_poll = 1;
+int sx_slowpoll = 0;
+
+/* The card limits the number of interrupts per second. 
+   At 115k2 "100" should be sufficient. 
+   If you're using higher baudrates, you can increase this...
+ */
+
+int sx_maxints = 100;
+
+/* These are the only open spaces in my computer. Yours may have more
+   or less.... */
+int sx_probe_addrs[]= {0xc0000, 0xd0000, 0xe0000, 
+                       0xc8000, 0xd8000, 0xe8000};
+int si_probe_addrs[]= {0xc0000, 0xd0000, 0xe0000, 
+                       0xc8000, 0xd8000, 0xe8000};
+
+#define NR_SX_ADDRS (sizeof(sx_probe_addrs)/sizeof (int))
+#define NR_SI_ADDRS (sizeof(si_probe_addrs)/sizeof (int))
+
+
+/* Set the mask to all-ones. This alas, only supports 32 interrupts. 
+   Some architectures may need more. */
+int sx_irqmask = -1;
+
+#ifndef TWO_ZERO
+#ifdef MODULE
+MODULE_PARM(sx_poll, "i");
+MODULE_PARM(sx_slowpoll, "i");
+MODULE_PARM(sx_maxints, "i");
+MODULE_PARM(sx_debug, "i");
+MODULE_PARM(sx_irqmask, "i");
+#endif
+#endif
+
+static struct real_driver sx_real_driver = {
+	sx_disable_tx_interrupts,
+	sx_enable_tx_interrupts,
+	sx_disable_rx_interrupts,
+	sx_enable_rx_interrupts,
+	sx_get_CD,
+	sx_shutdown_port, 
+	sx_set_real_termios, 
+	sx_chars_in_buffer,
+	sx_close,
+	sx_hungup,
+	NULL
+};
+
+
+/* 
+   This driver can spew a whole lot of debugging output at you. If you
+   need maximum performance, you should disable the DEBUG define. To
+   aid in debugging in the field, I'm leaving the compile-time debug
+   features enabled, and disable them "runtime". That allows me to
+   instruct people with problems to enable debugging without requiring
+   them to recompile... 
+*/
+#define DEBUG
+
+
+#ifdef DEBUG
+#define sx_dprintk(f, str...) if (sx_debug & f) printk (str)
+#else
+#define sx_dprintk(f, str...) /* nothing */
+#endif
+
+
+
+#define func_enter() sx_dprintk (SX_DEBUG_FLOW, "sx: enter " __FUNCTION__ "\n")
+#define func_exit()  sx_dprintk (SX_DEBUG_FLOW, "sx: exit  " __FUNCTION__ "\n")
+
+#define func_enter2() sx_dprintk (SX_DEBUG_FLOW, "sx: enter " __FUNCTION__ \
+                                  "(port %d)\n", port->line)
+
+
+
+
+/* 
+ *  Firmware loader driver specific routines
+ *
+ */
+
+static struct file_operations sx_fw_fops = {
+	NULL,	/*	lseek	*/
+	NULL,	/*	read	*/
+	NULL,	/*	write	*/
+	NULL,	/*	readdir	*/
+	NULL,	/*	select	*/
+	sx_fw_ioctl,
+	NULL,	/*	mmap	*/
+	sx_fw_open,
+#ifndef TWO_ZERO
+	NULL,	/*	flush	*/
+#endif
+	sx_fw_release,
+	NULL,	/*	fsync	*/
+	NULL,	/*	fasync	*/
+	NULL,	/*	check_media_change	*/
+	NULL,	/*	revalidate	*/
+};
+
+struct miscdevice sx_fw_device = {
+	SXCTL_MISC_MINOR, "sxctl", &sx_fw_fops
+};
+
+
+
+
+
+#ifdef SX_PARANOIA_CHECK
+
+/* This doesn't work. Who's paranoid around here? Not me! */
+
+static inline int sx_paranoia_check(struct sx_port const * port,
+				    kdev_t device, const char *routine)
+{
+
+	static const char *badmagic =
+	  KERN_ERR "sx: Warning: bad sx port magic number for device %s in %s\n";
+	static const char *badinfo =
+	  KERN_ERR "sx: Warning: null sx port for device %s in %s\n";
+ 
+	if (!port) {
+		printk(badinfo, kdevname(device), routine);
+		return 1;
+	}
+	if (port->magic != SX_MAGIC) {
+		printk(badmagic, kdevname(device), routine);
+		return 1;
+	}
+
+	return 0;
+}
+#else
+#define sx_paranoia_check(a,b,c) 0
+#endif
+
+/* The timeouts. First try 30 times as fast as possible. Then give
+   the card some time to breathe between accesses. (Otherwise the
+   processor on the card might not be able to access its OWN bus... */
+
+#define TIMEOUT_1 30
+#define TIMEOUT_2 1000000
+
+
+/* This needs redoing for Alpha -- REW -- Done. */
+
+inline void write_sx_byte (struct sx_board *board, int offset, u8 byte)
+{
+	writeb (byte, board->base+offset);
+}
+
+inline u8 read_sx_byte (struct sx_board *board, int offset)
+{
+	return readb (board->base+offset);
+}
+
+
+inline void write_sx_word (struct sx_board *board, int offset, u16 word)
+{
+	writew (word, board->base+offset);
+}
+
+inline u16 read_sx_word (struct sx_board *board, int offset)
+{
+	return readw (board->base + offset);
+}
+
+
+int sx_busy_wait_eq (struct sx_board *board, 
+                     int offset,
+                     int mask,
+                     int correctval)
+{
+	int i;
+
+	func_enter ();
+
+	for (i=0; i < TIMEOUT_1 > 0;i++) 
+		if ((read_sx_byte (board, offset) & mask) == correctval) {
+			func_exit ();
+			return 1;
+		}
+
+	for (i=0; i < TIMEOUT_2 > 0;i++) {
+		if ((read_sx_byte (board, offset) & mask) == correctval) {
+			func_exit ();
+			return 1;
+		}
+		udelay (1);
+	}
+
+	func_exit ();
+	return 0;
+}
+
+
+int sx_busy_wait_neq (struct sx_board *board, 
+                      int offset,
+                      int mask,
+                      int badval)
+{
+	int i;
+
+	func_enter ();
+
+	for (i=0; i < TIMEOUT_1 > 0;i++) 
+		if ((read_sx_byte (board, offset) & mask) != badval) {
+			func_exit ();
+			return 1;
+		}
+
+	for (i=0; i < TIMEOUT_2 > 0;i++) {
+		if ((read_sx_byte (board, offset) & mask) != badval) {
+			func_exit ();
+			return 1;
+		}
+		udelay (1);
+	}
+
+	func_exit ();
+	return 0;
+}
+
+
+
+/* 5.6.4 of 6210028 r2.3 */
+int sx_reset (struct sx_board *board)
+{
+	func_enter ();
+
+	if (IS_SX_BOARD (board)) {
+
+		write_sx_byte (board, SX_CONFIG, 0);
+		write_sx_byte (board, SX_RESET, 1); /* Value doesn't matter */
+
+		if (!sx_busy_wait_eq (board, SX_RESET_STATUS, 1, 0)) {
+			printk (KERN_INFO "sx: Card doesn't respond to reset....\n");
+			return 0;
+		}
+	} else {
+		/* Gory details of the SI/ISA board */
+		write_sx_byte (board, SI2_ISA_RESET,    SI2_ISA_RESET_SET);
+		write_sx_byte (board, SI2_ISA_IRQ11,    SI2_ISA_IRQ11_CLEAR);
+		write_sx_byte (board, SI2_ISA_IRQ12,    SI2_ISA_IRQ12_CLEAR);
+		write_sx_byte (board, SI2_ISA_IRQ15,    SI2_ISA_IRQ15_CLEAR);
+		write_sx_byte (board, SI2_ISA_INTCLEAR, SI2_ISA_INTCLEAR_CLEAR);
+		write_sx_byte (board, SI2_ISA_IRQSET,   SI2_ISA_IRQSET_CLEAR);
+	}
+
+	func_exit ();
+	return 1;
+}
+
+
+/* This doesn't work on machines where "NULL" isn't 0 */
+/* If you have one of those, someone will need to write 
+   the equivalent of this, which will amount to about 3 lines. I don't
+   want to complicate this right now. -- REW
+   (See, I do write comments every now and then :-) */
+#define OFFSETOF(strct, elem) ((long)&(((struct strct *)NULL)->elem))
+
+
+#define CHAN_OFFSET(port,elem) (port->ch_base + OFFSETOF (_SXCHANNEL, elem))
+#define MODU_OFFSET(board,addr,elem)    (addr + OFFSETOF (_SXMODULE, elem))
+#define  BRD_OFFSET(board,elem)                (OFFSETOF (_SXCARD, elem))
+
+
+#define sx_write_channel_byte(port, elem, val) \
+   write_sx_byte (port->board, CHAN_OFFSET (port, elem), val)
+
+#define sx_read_channel_byte(port, elem) \
+   read_sx_byte (port->board, CHAN_OFFSET (port, elem))
+
+#define sx_write_channel_word(port, elem, val) \
+   write_sx_word (port->board, CHAN_OFFSET (port, elem), val)
+
+#define sx_read_channel_word(port, elem) \
+   read_sx_word (port->board, CHAN_OFFSET (port, elem))
+
+
+#define sx_write_module_byte(board, addr, elem, val) \
+   write_sx_byte (board, MODU_OFFSET (board, addr, elem), val)
+
+#define sx_read_module_byte(board, addr, elem) \
+   read_sx_byte (board, MODU_OFFSET (board, addr, elem))
+
+#define sx_write_module_word(board, addr, elem, val) \
+   write_sx_word (board, MODU_OFFSET (board, addr, elem), val)
+
+#define sx_read_module_word(board, addr, elem) \
+   read_sx_word (board, MODU_OFFSET (board, addr, elem))
+
+
+#define sx_write_board_byte(board, elem, val) \
+   write_sx_byte (board, BRD_OFFSET (board, elem), val)
+
+#define sx_read_board_byte(board, elem) \
+   read_sx_byte (board, BRD_OFFSET (board, elem))
+
+#define sx_write_board_word(board, elem, val) \
+   write_sx_word (board, BRD_OFFSET (board, elem), val)
+
+#define sx_read_board_word(board, elem) \
+   read_sx_word (board, BRD_OFFSET (board, elem))
+
+
+int sx_start_board (struct sx_board *board)
+{
+	if (IS_SX_BOARD (board)) {
+		write_sx_byte (board, SX_CONFIG, SX_CONF_BUSEN);
+	} else {
+		/* Don't bug me about the clear_set. 
+		   I haven't the foggiest idea what it's about -- REW*/
+		write_sx_byte (board, SI2_ISA_RESET,    SI2_ISA_RESET_CLEAR);
+		write_sx_byte (board, SI2_ISA_INTCLEAR, SI2_ISA_INTCLEAR_SET);
+	}
+	return 1;
+}
+
+#define SX_IRQ_REG_VAL(board) \
+        ((board->flags & SX_ISA_BOARD)?(board->irq << 4):0)
+
+/* Note. The SX register is write-only. Therefore, we have to enable the
+   bus too. This is a no-op, if you don't mess with this driver... */
+int sx_start_interrupts (struct sx_board *board)
+{
+
+	/* Don't call this with board->irq == 0 */
+
+	if (IS_SX_BOARD(board)) {
+		write_sx_byte (board, SX_CONFIG, SX_IRQ_REG_VAL (board) | 
+		                                 SX_CONF_BUSEN | 
+		                                 SX_CONF_HOSTIRQ);
+	} else {
+		switch (board->irq) {
+		case 11:write_sx_byte (board, SI2_ISA_IRQ11, SI2_ISA_IRQ11_SET);break;
+		case 12:write_sx_byte (board, SI2_ISA_IRQ12, SI2_ISA_IRQ12_SET);break;
+		case 15:write_sx_byte (board, SI2_ISA_IRQ15, SI2_ISA_IRQ15_SET);break;
+		default:printk (KERN_INFO "sx: SI/XIO card doesn't support interrupt %d.\n", 
+		                board->irq);
+		return 0;
+		}
+		write_sx_byte (board, SI2_ISA_INTCLEAR, SI2_ISA_INTCLEAR_SET);
+	}
+
+	return 1;
+}
+
+
+int sx_send_command (struct sx_port *port, 
+                     int command,
+                     int mask,
+                     int newstat)
+{
+	func_enter2 ();
+	write_sx_byte (port->board, CHAN_OFFSET (port, hi_hstat), command);
+	func_exit ();
+	return sx_busy_wait_eq (port->board, CHAN_OFFSET (port, hi_hstat), mask, newstat);
+}
+
+
+char *mod_type_s (int module_type)
+{
+	switch (module_type) {
+	case TA4:       return "TA4";
+	case TA8:       return "TA8";
+	case TA4_ASIC:  return "TA4_ASIC";
+	case TA8_ASIC:  return "TA8_ASIC";
+	case MTA_CD1400:return "MTA_CD1400";
+	case SXDC:      return "SXDC";
+	default:return "Unknown/invalid";
+	}
+}
+
+
+char *pan_type_s (int pan_type)
+{
+	switch (pan_type) {
+	case MOD_RS232DB25:     return "MOD_RS232DB25";
+	case MOD_RS232RJ45:     return "MOD_RS232RJ45";
+	case MOD_RS422DB25:     return "MOD_RS422DB25";
+	case MOD_PARALLEL:      return "MOD_PARALLEL";
+	case MOD_2_RS232DB25:   return "MOD_2_RS232DB25";
+	case MOD_2_RS232RJ45:   return "MOD_2_RS232RJ45";
+	case MOD_2_RS422DB25:   return "MOD_2_RS422DB25";
+	case MOD_RS232DB25MALE: return "MOD_RS232DB25MALE";
+	case MOD_2_PARALLEL:    return "MOD_2_PARALLEL";
+	case MOD_BLANK:         return "empty";
+	default:return "invalid";
+	}
+}
+
+
+int mod_compat_type (int module_type)
+{
+	return module_type >> 4;
+}
+
+
+static void sx_setsignals (struct sx_port *port, int dtr, int rts)
+{
+	int t;
+	func_enter2 ();
+
+	t = sx_read_channel_byte (port, hi_op);
+	if (dtr >= 0) t = dtr? (t | OP_DTR): (t & ~OP_DTR);
+	if (rts >= 0) t = rts? (t | OP_RTS): (t & ~OP_RTS);
+	sx_write_channel_byte (port, hi_op, t);
+	sx_dprintk (SX_DEBUG_MODEMSIGNALS, "setsignals: %d/%d\n", dtr, rts);
+	func_exit ();
+}
+
+
+
+static int sx_getsignals (struct sx_port *port)
+{
+	int i_stat,o_stat;
+
+	o_stat = sx_read_channel_byte (port, hi_op);
+	i_stat = sx_read_channel_byte (port, hi_ip);
+
+	sx_dprintk (SX_DEBUG_MODEMSIGNALS, "getsignals: %d/%d  (%d/%d) %02x/%02x\n",
+	            (o_stat & OP_DTR) != 0, (o_stat & OP_RTS) != 0,
+	            port->c_dcd, sx_get_CD (port),
+	            sx_read_channel_byte (port, hi_ip),
+	            sx_read_channel_byte (port, hi_state));
+
+	return (((o_stat & OP_DTR)?TIOCM_DTR:0) |
+	        ((o_stat & OP_RTS)?TIOCM_RTS:0) |
+	        ((i_stat & IP_CTS)?TIOCM_CTS:0) |
+	        ((i_stat & IP_DCD)?TIOCM_CAR:0) |
+	        ((i_stat & IP_DSR)?TIOCM_DSR:0) |
+	        ((i_stat & IP_RI)?TIOCM_RNG:0)
+	        );
+}
+
+
+static void sx_set_baud (struct sx_port *port)
+{
+	int t;
+
+	if (port->board->ta_type == MOD_SXDC) {
+		switch (port->gs.baud) {
+		  /* Save some typing work... */
+#define e(x) case x:t= BAUD_ ## x ; break
+			e(50);e(75);e(110);e(150);e(200);e(300);e(600);
+                        e(1200);e(1800);e(2000);e(2400);e(4800);e(7200);
+                        e(9600);e(14400);e(19200);e(28800);e(38400);
+                        e(56000);e(57600);e(64000);e(76800);e(115200);
+			e(128000);e(150000);e(230400);e(256000);e(460800);
+                        e(921600);
+		case 134    :t = BAUD_134_5;   break;
+		case 0      :t = -1;
+								 break;
+		default:
+			/* Can I return "invalid"? */
+			t = BAUD_9600;
+			printk (KERN_INFO "sx: unsupported baud rate: %d.\n", port->gs.baud);
+			break;
+		}
+#undef e
+		if (t > 0) {
+			/* The baud rate is not set to 0, so we're enabeling DTR... -- REW */
+			sx_setsignals (port, 1, -1); 
+			/* XXX This is not TA & MTA compatible */
+			sx_write_channel_byte (port, hi_csr, 0xff);
+
+			sx_write_channel_byte (port, hi_txbaud, t);
+			sx_write_channel_byte (port, hi_rxbaud, t);
+		} else {
+			sx_setsignals (port, 0, -1);
+		}
+	} else {
+		switch (port->gs.baud) {
+#define e(x) case x:t= CSR_ ## x ; break
+			e(75);e(150);e(300);e(600);e(1200);e(2400);e(4800);
+                        e(1800);e(9600);
+			e(19200);e(57600);e(38400);
+			/* TA supports 110, but not 115200, MTA supports 115200, but not 110 */
+		case 110: 
+			if (port->board->ta_type == MOD_TA) {
+				t = CSR_110;
+				break;
+			} else {
+				t = CSR_9600;
+				printk (KERN_INFO "sx: Unsupported baud rate: %d.\n", port->gs.baud);
+				break;
+			}
+		case 115200: 
+			if (port->board->ta_type == MOD_TA) {
+				t = CSR_9600;
+				printk (KERN_INFO "sx: Unsupported baud rate: %d.\n", port->gs.baud);
+				break;
+			} else {
+				t = CSR_110;
+				break;
+			}
+		case 0      :t = -1;
+								 break;
+		default:
+			t = CSR_9600;
+			printk (KERN_INFO "sx: Unsupported baud rate: %d.\n", port->gs.baud);
+			break;
+		}
+#undef e
+		if (t >= 0) {
+			sx_setsignals (port, 1, -1);
+			sx_write_channel_byte (port, hi_csr, t * 0x11);
+		} else {
+			sx_setsignals (port, 0, -1);
+		}
+	}
+}
+
+
+/* Simon Allen's version of this routine was 225 lines long. 85 is a lot
+   better. -- REW */
+
+static void sx_set_real_termios (void *ptr)
+{
+	struct sx_port *port = ptr;
+
+	func_enter2();
+
+	/* What is this doing here? -- REW
+	   Ha! figured it out. It is to allow you to get DTR active again
+	   if you've dropped it with stty 0. Moved to set_baud, where it
+	   belongs (next to the drop dtr if baud == 0) -- REW */
+	/* sx_setsignals (port, 1, -1); */
+
+	sx_set_baud (port);
+
+#define CFLAG port->gs.tty->termios->c_cflag
+	sx_write_channel_byte (port, hi_mr1,
+	                       (C_PARENB (port->gs.tty)? MR1_WITH:MR1_NONE) |
+	                       (C_PARODD (port->gs.tty)? MR1_ODD:MR1_EVEN) |
+	                       (C_CRTSCTS(port->gs.tty)? MR1_RTS_RXFLOW:0) |
+	                       (((CFLAG & CSIZE)==CS8) ? MR1_8_BITS:0) |
+	                       (((CFLAG & CSIZE)==CS7) ? MR1_7_BITS:0) |
+	                       (((CFLAG & CSIZE)==CS6) ? MR1_6_BITS:0) |
+	                       (((CFLAG & CSIZE)==CS5) ? MR1_5_BITS:0) );
+
+	sx_write_channel_byte (port, hi_mr2,
+	                       (C_CRTSCTS(port->gs.tty)?MR2_CTS_TXFLOW:0) |
+	                       (C_CSTOPB (port->gs.tty)?MR2_2_STOP:MR2_1_STOP));
+
+	switch (CFLAG & CSIZE) {
+	case CS8:sx_write_channel_byte (port, hi_mask, 0xff);break;
+	case CS7:sx_write_channel_byte (port, hi_mask, 0x7f);break;
+	case CS6:sx_write_channel_byte (port, hi_mask, 0x3f);break;
+	case CS5:sx_write_channel_byte (port, hi_mask, 0x1f);break;
+	default:
+		printk (KERN_INFO "sx: Invalid wordsize: %d\n", CFLAG & CSIZE);
+		break;
+	}
+
+	sx_write_channel_byte (port, hi_prtcl, 
+	                       (I_IXON   (port->gs.tty)?SP_TXEN:0) |
+	                       (I_IXOFF  (port->gs.tty)?SP_RXEN:0) |
+	                       (I_IXANY  (port->gs.tty)?SP_TANY:0) |
+	                       SP_DCEN);
+
+	sx_write_channel_byte (port, hi_break, 
+	                       I_OTHER(port->gs.tty) ? 0:
+	                       (I_IGNBRK(port->gs.tty)?BR_IGN:0 |
+	                        I_BRKINT(port->gs.tty)?BR_INT:0));
+
+	sx_write_channel_byte (port, hi_txon,  START_CHAR (port->gs.tty));
+	sx_write_channel_byte (port, hi_rxon,  START_CHAR (port->gs.tty));
+	sx_write_channel_byte (port, hi_txoff, STOP_CHAR  (port->gs.tty));
+	sx_write_channel_byte (port, hi_rxoff, STOP_CHAR  (port->gs.tty));
+
+	if (sx_read_channel_byte (port, hi_hstat) == HS_IDLE_OPEN) {
+		if (sx_send_command (port, HS_CONFIG, -1, HS_IDLE_OPEN) != 1) {
+			printk (KERN_WARNING "sx: Sent reconfigure command, but card didn't react.\n");
+		}
+	} else {
+		sx_dprintk (SX_DEBUG_TERMIOS, 
+		            "sx: Not sending reconfigure: port isn't open (%02x).\n", 
+		            sx_read_channel_byte (port, hi_hstat));
+	}
+
+
+	/* Tell line discipline whether we will do input cooking */
+	if(I_OTHER(port->gs.tty)) {
+		clear_bit(TTY_HW_COOK_IN, &port->gs.tty->flags);
+	} else {
+		set_bit(TTY_HW_COOK_IN, &port->gs.tty->flags);
+	}
+	sx_dprintk (SX_DEBUG_TERMIOS, "iflags: %x(%d) ", 
+	            port->gs.tty->termios->c_iflag, 
+	            I_OTHER(port->gs.tty));
+
+
+/* Tell line discipline whether we will do output cooking.
+ * If OPOST is set and no other output flags are set then we can do output
+ * processing.  Even if only *one* other flag in the O_OTHER group is set
+ * we do cooking in software.
+ */
+	if(O_OPOST(port->gs.tty) && !O_OTHER(port->gs.tty)) {
+		set_bit(TTY_HW_COOK_OUT, &port->gs.tty->flags);
+	} else {
+		clear_bit(TTY_HW_COOK_OUT, &port->gs.tty->flags);
+	}
+	sx_dprintk (SX_DEBUG_TERMIOS, "oflags: %x(%d)\n", 
+	            port->gs.tty->termios->c_oflag, 
+	            O_OTHER(port->gs.tty));
+	/* port->c_dcd = sx_get_CD (port); */
+	func_exit ();
+}
+
+
+
+/* ********************************************************************** *
+ *                   the interrupt related routines                       *
+ * ********************************************************************** */
+
+/* Note:
+   Other drivers use the macro "MIN" to calculate how much to copy.
+   This has the disadvantage that it will evaluate parts twice. That's
+   expensive when it's IO (and the compiler cannot optimize those away!).
+   Moreover, I'm not sure that you're race-free. 
+
+   I assign a value, and then only allow the value to decrease. This
+   is always safe. This makes the code a few lines longer, and you
+   know I'm dead against that, but I think it is required in this
+   case.  */
+
+
+void sx_transmit_chars (struct sx_port *port)
+{
+	int c;
+	int tx_ip;
+	int txroom;
+
+	func_enter2 ();
+	sx_dprintk (SX_DEBUG_TRANSMIT, "Port %p: transmit %d chars\n", 
+	            port, port->gs.xmit_cnt);
+
+	if (test_and_set_bit (SX_PORT_TRANSMIT_LOCK, &port->locks)) {
+		return;
+	}
+
+	while (1) {
+		c = port->gs.xmit_cnt;
+
+		sx_dprintk (SX_DEBUG_TRANSMIT, "Copying %d ", c);
+		tx_ip  = sx_read_channel_byte (port, hi_txipos);
+
+		/* Took me 5 minutes to deduce this formula. 
+		   Luckily it is literally in the manual in section 6.5.4.3.5 */
+		txroom = (sx_read_channel_byte (port, hi_txopos) - tx_ip - 1) & 0xff;
+
+		/* Don't copy more bytes than there is room for in the buffer */
+		if (c > txroom)
+			c = txroom;
+		sx_dprintk (SX_DEBUG_TRANSMIT, " %d(%d) ", c, txroom );
+
+		/* Don't copy past the end of the hardware transmit buffer */
+		if (c > 0x100 - tx_ip) 
+			c = 0x100 - tx_ip;
+
+		sx_dprintk (SX_DEBUG_TRANSMIT, " %d(%d) ", c, 0x100-tx_ip );
+
+		/* Don't copy pas the end of the source buffer */
+		if (c > SERIAL_XMIT_SIZE - port->gs.xmit_tail) 
+                	c = SERIAL_XMIT_SIZE - port->gs.xmit_tail;
+
+		sx_dprintk (SX_DEBUG_TRANSMIT, " %d(%d) \n", 
+		            c, SERIAL_XMIT_SIZE- port->gs.xmit_tail);
+
+		/* If for one reason or another, we can't copy more data, we're done! */
+		if (c == 0) break;
+
+
+		memcpy_toio (port->board->base + CHAN_OFFSET(port,hi_txbuf) + tx_ip, 
+		             port->gs.xmit_buf + port->gs.xmit_tail, c);
+
+		/* Update the pointer in the card */
+		sx_write_channel_byte (port, hi_txipos, (tx_ip+c) & 0xff);
+
+		/* Update the kernel buffer end */
+		port->gs.xmit_tail = (port->gs.xmit_tail + c) & (SERIAL_XMIT_SIZE-1);
+
+		/* This one last. (this is essential)
+		   It would allow others to start putting more data into the buffer! */
+		port->gs.xmit_cnt -= c;
+	}
+
+	if (port->gs.xmit_cnt == 0) {
+		sx_disable_tx_interrupts (port);
+	}
+
+	if (port->gs.xmit_cnt <= port->gs.wakeup_chars) {
+		if ((port->gs.tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
+		    port->gs.tty->ldisc.write_wakeup)
+			(port->gs.tty->ldisc.write_wakeup)(port->gs.tty);
+		sx_dprintk (SX_DEBUG_TRANSMIT, "Waking up.... ldisc (%d)....\n",
+		            port->gs.wakeup_chars); 
+		wake_up_interruptible(&port->gs.tty->write_wait);
+	}
+
+	clear_bit (SX_PORT_TRANSMIT_LOCK, &port->locks);
+	func_exit ();
+}
+
+
+/* Note the symmetry between receiving chars and transmitting them!
+   Note: The kernel should have implemented both a receive buffer and
+   a transmit buffer. */
+
+/* Inlined: Called only once. Remove the inline when you add another call */
+inline void sx_receive_chars (struct sx_port *port)
+{
+	int c;
+	int rx_op;
+	struct tty_struct *tty;
+	int copied=0;
+
+	/* func_enter2 (); */
+	tty = port->gs.tty;
+	while (1) {
+		rx_op = sx_read_channel_byte (port, hi_rxopos);
+		c = (sx_read_channel_byte (port, hi_rxipos) - rx_op) & 0xff;
+
+		sx_dprintk (SX_DEBUG_RECEIVE, "rxop=%d, c = %d.\n", rx_op, c); 
+
+		/* Don't copy more bytes than there is room for in the buffer */
+		if (tty->flip.count + c > TTY_FLIPBUF_SIZE) 
+			c = TTY_FLIPBUF_SIZE - tty->flip.count;
+
+		sx_dprintk (SX_DEBUG_RECEIVE, "c = %d.\n", c); 
+
+		/* Don't copy past the end of the hardware receive buffer */
+		if (rx_op + c > 0x100) c = 0x100 - rx_op;
+
+		sx_dprintk (SX_DEBUG_RECEIVE, "c = %d.\n", c);
+
+		/* If for one reason or another, we can't copy more data, we're done! */
+		if (c == 0) break;
+
+		sx_dprintk (SX_DEBUG_RECEIVE , "Copying over %d chars. First is %d at %lx\n", c, 
+		            read_sx_byte (port->board, CHAN_OFFSET(port,hi_rxbuf) + rx_op),
+		            CHAN_OFFSET(port, hi_rxbuf)); 
+		memcpy_fromio (tty->flip.char_buf_ptr, 
+		               port->board->base + CHAN_OFFSET(port,hi_rxbuf) + rx_op, c);
+		memset(tty->flip.flag_buf_ptr, TTY_NORMAL, c);
+
+		/* Update the kernel buffer end */
+		tty->flip.count += c;
+		tty->flip.char_buf_ptr += c;
+		tty->flip.flag_buf_ptr += c;
+
+		/* This one last. ( Not essential.)
+		   It allows the card to start putting more data into the buffer! 
+		   Update the pointer in the card */
+		sx_write_channel_byte (port, hi_rxopos, (rx_op + c) & 0xff);
+
+		copied += c;
+	}
+	if (copied) {
+		struct timeval tv;
+
+		do_gettimeofday (&tv);
+		sx_dprintk (SX_DEBUG_RECEIVE, 
+		            "pushing flipq port %d (%3d chars): %d.%06d  (%d/%d)\n", 
+		            port->line, copied, 
+		            (int) (tv.tv_sec % 60), (int)tv.tv_usec, tty->raw, tty->real_raw);
+
+		/* Tell the rest of the system the news. Great news. New characters! */
+		tty_flip_buffer_push (tty);
+		/*    tty_schedule_flip (tty); */
+	}
+
+	/* func_exit (); */
+}
+
+/* Inlined: it is called only once. Remove the inline if you add another 
+   call */
+inline void sx_check_modem_signals (struct sx_port *port)
+{
+	int hi_state;
+	int c_dcd;
+
+	hi_state = sx_read_channel_byte (port, hi_state);
+	sx_dprintk (SX_DEBUG_MODEMSIGNALS, "Checking modem signals (%d/%d)\n",
+	            port->c_dcd, sx_get_CD (port));
+
+	if (hi_state & ST_BREAK) {
+		hi_state &= ~ST_BREAK;
+		sx_dprintk (SX_DEBUG_MODEMSIGNALS, "got a break.\n");
+
+		sx_write_channel_byte (port, hi_state, hi_state);
+		if (port->gs.flags & ASYNC_SAK) {
+			do_SAK (port->gs.tty);
+		}
+	}
+	if (hi_state & ST_DCD) {
+		hi_state &= ~ST_DCD;
+		sx_dprintk (SX_DEBUG_MODEMSIGNALS, "got a DCD change.\n");
+		sx_write_channel_byte (port, hi_state, hi_state);
+		c_dcd = sx_get_CD (port);
+		sx_dprintk (SX_DEBUG_MODEMSIGNALS, "DCD is now %d\n", c_dcd);
+		if (c_dcd != port->c_dcd) {
+			port->c_dcd = c_dcd;
+			if (sx_get_CD (port)) {
+				/* DCD went UP */
+				if( (~(port->gs.flags & ASYNC_NORMAL_ACTIVE) || 
+						 ~(port->gs.flags & ASYNC_CALLOUT_ACTIVE)) &&
+						(sx_read_channel_byte(port, hi_hstat) != HS_IDLE_CLOSED)) {
+					/* Are we blocking in open?*/
+					sx_dprintk (SX_DEBUG_MODEMSIGNALS, "DCD active, unblocking open\n");
+					wake_up_interruptible(&port->gs.open_wait);
+				} else {
+					sx_dprintk (SX_DEBUG_MODEMSIGNALS, "DCD raised. Ignoring.\n");
+				}
+			} else {
+				/* DCD went down! */
+				if (!((port->gs.flags & ASYNC_CALLOUT_ACTIVE) &&
+				      (port->gs.flags & ASYNC_CALLOUT_NOHUP))) {
+					sx_dprintk (SX_DEBUG_MODEMSIGNALS, "DCD dropped. hanging up....\n");
+					tty_hangup (port->gs.tty);
+				} else {
+					sx_dprintk (SX_DEBUG_MODEMSIGNALS, "DCD dropped. ignoring.\n");
+				}
+			}
+		} else {
+			sx_dprintk (SX_DEBUG_MODEMSIGNALS, "Hmmm. card told us DCD changed, but it didn't.\n");
+		}
+	}
+}
+
+
+/* This is what an interrupt routine should look like. 
+ * Small, elegant, clear.
+ */
+
+static void sx_interrupt (int irq, void *ptr, struct pt_regs *regs)
+{
+	struct sx_board *board = ptr;
+	struct sx_port *port;
+	int i;
+
+	/*   func_enter ();  */
+	sx_dprintk (SX_DEBUG_FLOW, "sx: enter sx_interrupt (%d/%d)\n", irq, board->irq); 
+
+	/* AAargh! The order in which to do these things is essential and
+	   not trivial. 
+
+	   - Rate limit goes before "recursive". Otherwise a series of
+	     recursive calls will hang the machine in the interrupt routine. 
+
+	   - hardware twiddling goes before "recursive". Otherwise when we
+	     poll the card, and a recursive interrupt happens, we wont
+	     ack the card, so it might keep on interrupting us. (especially
+	     level sensitive interrupt systems like PCI).
+
+	   - Rate limit goes before hardware twiddling. Otherwise we won't
+	     catch a card that has gone bonkers.
+
+	   - The "initialized" test goes after the hardware twiddling. Otherwise
+	     the card will stick us in the interrupt routine again.
+
+	   - The initialized test goes before recursive. 
+	*/
+
+
+
+#ifdef IRQ_RATE_LIMIT
+	/* Aaargh! I'm ashamed. This costs more lines-of-code than the
+	   actual interrupt routine!. (Well, used to when I wrote that comment) */
+	{
+		static int lastjif;
+		static int nintr=0;
+
+		if (lastjif == jiffies) {
+			if (++nintr > IRQ_RATE_LIMIT) {
+				free_irq (board->irq, board);
+				printk (KERN_ERR "sx: Too many interrupts. Turning off interrupt %d.\n", 
+					      board->irq);
+			}
+		} else {
+			lastjif = jiffies;
+			nintr = 0;
+		}
+	}
+#endif
+
+
+	if (board->irq == irq) {
+		/* Tell the card we've noticed the interrupt. */
+
+		sx_write_board_word (board, cc_int_pending, 0);
+		if (IS_SX_BOARD (board)) {
+			write_sx_byte (board, SX_RESET_IRQ, 1);
+		} else {
+			write_sx_byte (board, SI2_ISA_INTCLEAR, SI2_ISA_INTCLEAR_CLEAR);
+			write_sx_byte (board, SI2_ISA_INTCLEAR, SI2_ISA_INTCLEAR_SET);
+		}
+	}
+
+	if (!sx_initialized) return;
+	if (!(board->flags & SX_BOARD_INITIALIZED)) return;
+
+	if (test_and_set_bit (SX_BOARD_INTR_LOCK, &board->locks)) {
+		printk (KERN_ERR "Recursive interrupt! (%d)\n", board->irq);
+		return;
+	}
+
+	 for (i=0;i<board->nports;i++) {
+		port = &board->ports[i];
+		if (port->gs.flags & GS_ACTIVE) {
+			if (sx_read_channel_byte (port, hi_state)) {
+				sx_dprintk (SX_DEBUG_INTERRUPTS, 
+				            "Port %d: modem signal change?... \n", i);
+				sx_check_modem_signals (port); 
+			}
+			if (port->gs.xmit_cnt) {
+				sx_transmit_chars (port);
+			}
+			if (!(port->gs.flags & SX_RX_THROTTLE)) {
+				sx_receive_chars (port);
+			}
+		}
+	}
+
+	clear_bit (SX_BOARD_INTR_LOCK, &board->locks);
+
+	sx_dprintk (SX_DEBUG_FLOW, "sx: exit sx_interrupt (%d/%d)\n", irq, board->irq); 
+	/*  func_exit ();  */
+}
+
+
+static void sx_pollfunc (unsigned long data)
+{
+	struct sx_board *board = (struct sx_board *) data;
+
+	func_enter ();
+
+	sx_interrupt (0, board, NULL);
+
+	board->timer.expires = jiffies + sx_poll;
+	add_timer (&board->timer);
+	func_exit ();
+}
+
+
+
+/* ********************************************************************** *
+ *                Here are the routines that actually                     *
+ *              interface with the generic_serial driver                  *
+ * ********************************************************************** */
+
+/* Ehhm. I don't know how to fiddle with interrupts on the SX card. --REW */
+/* Hmm. Ok I figured it out. You don't.  */
+
+static void sx_disable_tx_interrupts (void * ptr) 
+{
+	struct sx_port *port = ptr; 
+	func_enter2();
+
+	port->gs.flags &= ~GS_TX_INTEN;
+
+	func_exit();
+}
+
+
+static void sx_enable_tx_interrupts (void * ptr) 
+{
+	struct sx_port *port = ptr; 
+	int data_in_buffer;
+	func_enter2();
+
+	/* First transmit the characters that we're supposed to */
+	sx_transmit_chars (port);
+
+	/* The sx card will never interrupt us if we don't fill the buffer
+	   past 25%. So we keep considering interrupts off if that's the case. */
+	data_in_buffer = (sx_read_channel_byte (port, hi_txipos) - 
+	                  sx_read_channel_byte (port, hi_txopos)) & 0xff;
+
+	/* XXX Must be "HIGH_WATER" for SI card according to doc. */
+	if (data_in_buffer < LOW_WATER) 
+		port->gs.flags &= ~GS_TX_INTEN;
+
+	func_exit();
+}
+
+
+static void sx_disable_rx_interrupts (void * ptr) 
+{
+	/*  struct sx_port *port = ptr; */
+	func_enter();
+
+	func_exit();
+}
+
+static void sx_enable_rx_interrupts (void * ptr) 
+{
+	/*  struct sx_port *port = ptr; */
+	func_enter();
+
+	func_exit();
+}
+
+
+/* Jeez. Isn't this simple? */
+static int sx_get_CD (void * ptr) 
+{
+	struct sx_port *port = ptr;
+	func_enter2();
+
+	func_exit();
+	return ((sx_read_channel_byte (port, hi_ip) & IP_DCD) != 0);
+}
+
+
+/* Jeez. Isn't this simple? */
+static int sx_chars_in_buffer (void * ptr) 
+{
+	struct sx_port *port = ptr;
+	func_enter2();
+
+	func_exit();
+	return ((sx_read_channel_byte (port, hi_txipos) - 
+	         sx_read_channel_byte (port, hi_txopos)) & 0xff);
+}
+
+
+static void sx_shutdown_port (void * ptr) 
+{
+	struct sx_port *port = ptr; 
+
+	func_enter();
+
+	port->gs.flags &= ~ GS_ACTIVE;
+	if (port->gs.tty && port->gs.tty->termios->c_cflag & HUPCL) {
+		sx_setsignals (port, 0, 0);
+	}
+
+	func_exit();
+}
+
+
+
+
+
+/* ********************************************************************** *
+ *                Here are the routines that actually                     *
+ *               interface with the rest of the system                    *
+ * ********************************************************************** */
+
+
+static int sx_fw_open(struct inode *inode, struct file *filp)
+{
+	func_enter ();
+	MOD_INC_USE_COUNT;
+	func_exit ();
+	return 0;
+}
+
+
+static INT sx_fw_release(struct inode *inode, struct file *filp)
+{
+	func_enter ();
+	MOD_DEC_USE_COUNT;
+	func_exit ();
+	return NO_ERROR;
+}
+
+
+static int sx_open  (struct tty_struct * tty, struct file * filp)
+{
+	struct sx_port *port;
+	int retval, line;
+
+	func_enter();
+
+	if (!sx_initialized) {
+		return -EIO;
+	}
+
+	line = MINOR(tty->device);
+	sx_dprintk (SX_DEBUG_OPEN, "%d: opening line %d. tty=%p ctty=%p, np=%d)\n", 
+	            current->pid, line, tty, current->tty, sx_nports);
+
+	if ((line < 0) || (line >= SX_NPORTS) || (line >= sx_nports))
+		return -ENODEV;
+
+	port = & sx_ports[line];
+	port->c_dcd = 0; /* Make sure that the first interrupt doesn't detect a
+	                    1 -> 0 transition. */
+
+
+	sx_dprintk (SX_DEBUG_OPEN, "port = %p c_dcd = %d\n", port, port->c_dcd);
+
+	tty->driver_data = port;
+	port->gs.tty = tty;
+	port->gs.count++;
+
+	sx_dprintk (SX_DEBUG_OPEN, "starting port\n");
+
+	/*
+	 * Start up serial port
+	 */
+	retval = gs_init_port(&port->gs);
+	sx_dprintk (SX_DEBUG_OPEN, "done gs_init\n");
+	if (retval) {
+		port->gs.count--;
+		return retval;
+	}
+
+	port->gs.flags |= GS_ACTIVE;
+	sx_setsignals (port, 1,1);
+
+	sx_dprintk (SX_DEBUG_OPEN, "before inc_use_count (count=%d.\n", 
+	            port->gs.count);
+	if (port->gs.count == 1) {
+		MOD_INC_USE_COUNT;
+	}
+	sx_dprintk (SX_DEBUG_OPEN, "after inc_use_count\n");
+
+#if 0
+	if (sx_debug & SX_DEBUG_OPEN)
+		my_hd ((unsigned char *)port, sizeof (*port));
+#else
+	if (sx_debug & SX_DEBUG_OPEN)
+		my_hd ((unsigned char *)port->board->base + port->ch_base, 
+		       sizeof (*port));
+#endif
+
+	if (sx_send_command (port, HS_LOPEN, -1, HS_IDLE_OPEN) != 1) {
+		printk (KERN_ERR "sx: Card didn't respond to LOPEN command.\n");
+		MOD_DEC_USE_COUNT;
+		port->gs.count--;
+		return -EIO;
+	}
+
+	retval = block_til_ready(port, filp);
+	sx_dprintk (SX_DEBUG_OPEN, "Block til ready returned %d. Count=%d\n", 
+	            retval, port->gs.count);
+
+	if (retval) {
+		MOD_DEC_USE_COUNT;
+		port->gs.count--;
+		return retval;
+	}
+	/* tty->low_latency = 1; */
+
+	if ((port->gs.count == 1) && (port->gs.flags & ASYNC_SPLIT_TERMIOS)) {
+		if (tty->driver.subtype == SERIAL_TYPE_NORMAL)
+			*tty->termios = port->gs.normal_termios;
+		else 
+			*tty->termios = port->gs.callout_termios;
+		sx_set_real_termios (port);
+	}
+
+	port->gs.session = current->session;
+	port->gs.pgrp = current->pgrp;
+	port->c_dcd = sx_get_CD (port);
+	sx_dprintk (SX_DEBUG_OPEN, "at open: cd=%d\n", port->c_dcd);
+	func_exit();
+	return 0;
+
+}
+
+
+/* I haven't the foggiest why the decrement use count has to happen
+   here. The whole linux serial drivers stuff needs to be redesigned.
+   My guess is that this is a hack to minimize the impact of a bug
+   elsewhere. Thinking about it some more. (try it sometime) Try
+   running minicom on a serial port that is driven by a modularized
+   driver. Have the modem hangup. Then remove the driver module. Then
+   exit minicom.  I expect an "oops".  -- REW */
+static void sx_hungup (void *ptr)
+{
+	func_enter ();
+	MOD_DEC_USE_COUNT;
+	func_exit ();
+}
+
+
+static void sx_close (void *ptr)
+{
+	struct sx_port *port = ptr; 
+	/* Give the port 5 seconds to close down. */
+	int to = 5 * HZ; 
+
+	func_enter ();
+	sx_send_command (port, HS_CLOSE, 0, 0);
+
+	while (to-- && (sx_read_channel_byte (port, hi_hstat) != HS_IDLE_CLOSED)) {
+		current->state = TASK_INTERRUPTIBLE;
+		schedule_timeout (1);
+		if (signal_pending (current))
+				break;
+	}
+	current->state = TASK_RUNNING;
+	if (sx_read_channel_byte (port, hi_hstat) != HS_IDLE_CLOSED) {
+		if (sx_send_command (port, HS_FORCE_CLOSED, -1, HS_IDLE_CLOSED) != 1) {
+			printk (KERN_ERR 
+			        "sx: sent the force_close command, but card didn't react\n");
+		} else
+			sx_dprintk (SX_DEBUG_CLOSE, "sent the force_close command.\n");
+	}
+
+	sx_dprintk (SX_DEBUG_CLOSE, "waited %d jiffies for close. count=%d\n", 
+	            5 * HZ - to - 1, port->gs.count);
+
+	MOD_DEC_USE_COUNT;
+	func_exit ();
+}
+
+
+
+/* This is relatively thorough. But then again it is only 20 lines. */
+#define MARCHUP    for (i=min;i<max;i++) 
+#define MARCHDOWN  for (i=max-1;i>=min;i--)
+#define W0         write_sx_byte (board, i, 0x55)
+#define W1         write_sx_byte (board, i, 0xaa)
+#define R0         if (read_sx_byte (board, i) != 0x55) return 1
+#define R1         if (read_sx_byte (board, i) != 0xaa) return 1
+
+/* This memtest takes a human-noticable time. You normally only do it
+   once a boot, so I guess that it is worth it. */
+int do_memtest (struct sx_board *board, int min, int max)
+{
+	int i;
+
+	/* This is a marchb. Theoretically, marchb catches much more than
+	   simpler tests. In practise, the longer test just catches more
+	   intermittent errors. -- REW
+	   (For the theory behind memory testing see: 
+	   Testing Semiconductor Memories by A.J. van de Goor.) */
+	MARCHUP	 {W0;}
+	MARCHUP   {R0;W1;R1;W0;R0;W1;}
+	MARCHUP   {R1;W0;W1;}
+	MARCHDOWN {R1;W0;W1;W0;}
+	MARCHDOWN {R0;W1;W0;}
+
+	return 0;
+}
+
+
+#undef MARCHUP
+#undef MARCHDOWN
+#undef W0
+#undef W1
+#undef R0
+#undef R1
+
+#define MARCHUP    for (i=min;i<max;i+=2) 
+#define MARCHDOWN  for (i=max-1;i>=min;i-=2)
+#define W0         write_sx_word (board, i, 0x55aa)
+#define W1         write_sx_word (board, i, 0xaa55)
+#define R0         if (read_sx_word (board, i) != 0x55aa) return 1
+#define R1         if (read_sx_word (board, i) != 0xaa55) return 1
+
+/* This memtest takes a human-noticable time. You normally only do it
+   once a boot, so I guess that it is worth it. */
+int do_memtest_w (struct sx_board *board, int min, int max)
+{
+	int i;
+
+	MARCHUP   {W0;}
+	MARCHUP   {R0;W1;R1;W0;R0;W1;}
+	MARCHUP   {R1;W0;W1;}
+	MARCHDOWN {R1;W0;W1;W0;}
+	MARCHDOWN {R0;W1;W0;}
+
+	return 0;
+}
+
+
+static int sx_fw_ioctl (struct inode *inode, struct file *filp,
+		         unsigned int cmd, unsigned long arg)
+{
+	int rc = 0;
+	int *descr = (int *)arg, i;
+	static struct sx_board *board = NULL;
+	int nbytes, offset, data;
+	char *tmp;
+
+	func_enter();
+
+#if 0 
+	/* Removed superuser check: Sysops can use the permissions on the device
+	   file to restrict access. Recommendation: Root only. (root.root 600) */
+	if (!suser ()) {
+		return -EPERM;
+	}
+#endif
+
+	sx_dprintk (SX_DEBUG_FIRMWARE, "IOCTL %x: %lx\n", cmd, arg);
+
+	if (!board) board = &boards[0];
+	if (board->flags & SX_BOARD_PRESENT) {
+		sx_dprintk (SX_DEBUG_FIRMWARE, "Board present! (%x)\n", 
+		            board->flags);
+	} else {
+		sx_dprintk (SX_DEBUG_FIRMWARE, "Board not present! (%x) all:", 
+		            board->flags);
+		for (i=0;i< SX_NBOARDS;i++)
+			sx_dprintk (SX_DEBUG_FIRMWARE, "<%x> ", boards[i].flags);
+		sx_dprintk (SX_DEBUG_FIRMWARE, "\n");
+		return -EIO;
+	}
+
+	switch (cmd) {
+	case SXIO_SET_BOARD:
+		sx_dprintk (SX_DEBUG_FIRMWARE, "set board to %ld\n", arg);
+		if (arg > SX_NBOARDS) return -EIO;
+		sx_dprintk (SX_DEBUG_FIRMWARE, "not out of range\n");
+		if (!(boards[arg].flags	& SX_BOARD_PRESENT)) return -EIO;
+		sx_dprintk (SX_DEBUG_FIRMWARE, ".. and present!\n");
+		board = &boards[arg];
+		break;
+	case SXIO_GET_TYPE:
+		rc = IS_SX_BOARD (board)? SX_TYPE_SX:SX_TYPE_SI;
+		sx_dprintk (SX_DEBUG_FIRMWARE, "returning type= %d\n", rc);
+		break;
+	case SXIO_DO_RAMTEST:
+		if (sx_initialized) /* Already initialized: better not ramtest the board.  */
+			return -EPERM;
+		if (IS_SX_BOARD (board)) {
+			rc          = do_memtest   (board, 0, 0x7000);
+			if (!rc) rc = do_memtest   (board, 0, 0x7000);
+			/*if (!rc) rc = do_memtest_w (board, 0, 0x7000);*/
+		} else {
+			rc             = do_memtest   (board, 0, 0x7ff8);
+			/* if (!rc) rc = do_memtest_w (board, 0, 0x7ff8); */
+		}
+		sx_dprintk (SX_DEBUG_FIRMWARE, "returning memtest result= %d\n", rc);
+		break;
+	case SXIO_DOWNLOAD:
+		if (sx_initialized) /* Already initialized */
+			return -EEXIST;
+		if (!sx_reset (board)) 
+			return -EIO;
+		sx_dprintk (SX_DEBUG_INIT, "reset the board...\n");
+
+		tmp = kmalloc (SX_CHUNK_SIZE, GFP_USER);
+		if (!tmp) return -ENOMEM;
+		Get_user (nbytes, descr++);
+		Get_user (offset, descr++); 
+		Get_user (data,	 descr++);
+		while (nbytes && data) {
+			for (i=0;i<nbytes;i += SX_CHUNK_SIZE) {
+				copy_from_user (tmp, (char *)data+i, 
+				                (i+SX_CHUNK_SIZE>nbytes)?nbytes-i:SX_CHUNK_SIZE);
+				memcpy_toio    ((char *) (board->base + offset + i), tmp, 
+				                (i+SX_CHUNK_SIZE>nbytes)?nbytes-i:SX_CHUNK_SIZE);
+			}
+
+			Get_user (nbytes, descr++);
+			Get_user (offset, descr++); 
+			Get_user (data,   descr++);
+		}
+		kfree (tmp);
+		sx_nports += sx_init_board (board);
+		rc = sx_nports;
+		break;
+	case SXIO_INIT:
+		if (sx_initialized) /* Already initialized */
+			return -EEXIST;
+		/* This is not allowed until all boards are initialized... */
+		for (i=0;i<SX_NBOARDS;i++) {
+			if ( (boards[i].flags & SX_BOARD_PRESENT) &&
+			     !(boards[i].flags & SX_BOARD_INITIALIZED))
+				return -EIO;
+		}
+		for (i=0;i<SX_NBOARDS;i++)
+			if (!(boards[i].flags & SX_BOARD_PRESENT)) break;
+
+		sx_dprintk (SX_DEBUG_FIRMWARE, "initing portstructs, %d boards, "
+		            "%d channels, first board: %d ports\n", 
+		            i, sx_nports, boards[0].nports);
+		rc = sx_init_portstructs (i, sx_nports);
+		sx_init_drivers ();
+		if (rc >= 0) 
+			sx_initialized++;
+		break;
+	case SXIO_SETDEBUG:
+		sx_debug = arg;
+		break;
+	case SXIO_GETDEBUG:
+		rc = sx_debug;
+		break;
+	case SXIO_SETGSDEBUG:
+		gs_debug = arg;
+		break;
+	case SXIO_GETGSDEBUG:
+		rc = gs_debug;
+		break;
+	default:
+		printk (KERN_WARNING "Unknown ioctl on firmware device (%x).\n", cmd);
+		break;
+	}
+	func_exit ();
+	return rc;
+}
+
+
+static int sx_ioctl (struct tty_struct * tty, struct file * filp, 
+                     unsigned int cmd, unsigned long arg)
+{
+	int rc;
+	struct sx_port *port = tty->driver_data;
+	int ival;
+
+	/* func_enter2(); */
+
+	rc = 0;
+	switch (cmd) {
+	case TIOCGSOFTCAR:
+		rc = Put_user(((tty->termios->c_cflag & CLOCAL) ? 1 : 0),
+		              (unsigned int *) arg);
+		break;
+	case TIOCSSOFTCAR:
+		if ((rc = verify_area(VERIFY_READ, (void *) arg,
+		                      sizeof(int))) == 0) {
+			Get_user(ival, (unsigned int *) arg);
+			tty->termios->c_cflag =
+				(tty->termios->c_cflag & ~CLOCAL) |
+				(ival ? CLOCAL : 0);
+		}
+		break;
+	case TIOCGSERIAL:
+		if ((rc = verify_area(VERIFY_WRITE, (void *) arg,
+		                      sizeof(struct serial_struct))) == 0)
+			gs_getserial(&port->gs, (struct serial_struct *) arg);
+		break;
+	case TIOCSSERIAL:
+		if ((rc = verify_area(VERIFY_READ, (void *) arg,
+		                      sizeof(struct serial_struct))) == 0)
+			rc = gs_setserial(&port->gs, (struct serial_struct *) arg);
+		break;
+	case TIOCMGET:
+		if ((rc = verify_area(VERIFY_WRITE, (void *) arg,
+		                      sizeof(unsigned int))) == 0) {
+			ival = sx_getsignals(port);
+			put_user(ival, (unsigned int *) arg);
+		}
+		break;
+	case TIOCMBIS:
+		if ((rc = verify_area(VERIFY_READ, (void *) arg,
+		                      sizeof(unsigned int))) == 0) {
+			Get_user(ival, (unsigned int *) arg);
+			sx_setsignals(port, ((ival & TIOCM_DTR) ? 1 : -1),
+			                     ((ival & TIOCM_RTS) ? 1 : -1));
+		}
+		break;
+	case TIOCMBIC:
+		if ((rc = verify_area(VERIFY_READ, (void *) arg,
+		                      sizeof(unsigned int))) == 0) {
+			Get_user(ival, (unsigned int *) arg);
+			sx_setsignals(port, ((ival & TIOCM_DTR) ? 0 : -1),
+			                     ((ival & TIOCM_RTS) ? 0 : -1));
+		}
+		break;
+	case TIOCMSET:
+		if ((rc = verify_area(VERIFY_READ, (void *) arg,
+		                      sizeof(unsigned int))) == 0) {
+			Get_user(ival, (unsigned int *) arg);
+			sx_setsignals(port, ((ival & TIOCM_DTR) ? 1 : 0),
+			                     ((ival & TIOCM_RTS) ? 1 : 0));
+		}
+		break;
+
+	default:
+		rc = -ENOIOCTLCMD;
+		break;
+	}
+
+	/* func_exit(); */
+	return rc;
+}
+
+
+/* The throttle/unthrottle scheme for the Specialix card is different
+ * from other drivers and deserves some explanation. 
+ * The Specialix hardware takes care of XON/XOFF
+ * and CTS/RTS flow control itself.  This means that all we have to
+ * do when signalled by the upper tty layer to throttle/unthrottle is
+ * to make a note of it here.  When we come to read characters from the
+ * rx buffers on the card (sx_receive_chars()) we look to see if the
+ * upper layer can accept more (as noted here in sx_rx_throt[]). 
+ * If it can't we simply don't remove chars from the cards buffer. 
+ * When the tty layer can accept chars, we again note that here and when
+ * sx_receive_chars() is called it will remove them from the cards buffer.
+ * The card will notice that a ports buffer has drained below some low
+ * water mark and will unflow control the line itself, using whatever
+ * flow control scheme is in use for that port. -- Simon Allen
+ */
+
+static void sx_throttle (struct tty_struct * tty)
+{
+	struct sx_port *port = (struct sx_port *)tty->driver_data;
+
+	func_enter2();
+	/* If the port is using any type of input flow
+	 * control then throttle the port.
+	 */
+	if((tty->termios->c_cflag & CRTSCTS) || (I_IXOFF(tty)) ) {
+		port->gs.flags |= SX_RX_THROTTLE;
+	}
+	func_exit();
+}
+
+
+static void sx_unthrottle (struct tty_struct * tty)
+{
+	struct sx_port *port = (struct sx_port *)tty->driver_data;
+
+	func_enter2();
+	/* Always unthrottle even if flow control is not enabled on
+	 * this port in case we disabled flow control while the port
+	 * was throttled
+	 */
+	port->gs.flags &= ~SX_RX_THROTTLE;
+	func_exit();
+	return;
+}
+
+
+/* ********************************************************************** *
+ *                    Here are the initialization routines.               *
+ * ********************************************************************** */
+
+
+
+
+static int sx_init_board (struct sx_board *board)
+{
+	int addr;
+	int chans;
+	int type;
+
+	func_enter();
+
+	/* This is preceded by downloading the download code. */
+
+	board->flags |= SX_BOARD_INITIALIZED;
+
+	/* This resets the processor again, to make sure it didn't do any
+	   foolish things while we were downloading the image */
+	if (!sx_reset (board))
+		return 0;
+
+	sx_start_board (board);
+
+	if (!sx_busy_wait_neq (board, 0, 0xff, 0)) {
+		printk (KERN_ERR "sx: Ooops. Board won't initialize.\n");
+		return 0;
+	}
+
+	/* Ok. So now the processor on the card is running. It gathered
+	   some info for us... */
+	sx_dprintk (SX_DEBUG_INIT, "The sxcard structure:\n");
+	if (sx_debug & SX_DEBUG_INIT) my_hd ((char *)(board->base), 0x10);
+	sx_dprintk (SX_DEBUG_INIT, "the first sx_module structure:\n");
+	if (sx_debug & SX_DEBUG_INIT) my_hd ((char *)(board->base + 0x80), 0x30);
+
+	sx_dprintk (SX_DEBUG_INIT, 
+	            "init_status: %x, %dk memory, firmware V%x.%02x,\n", 
+	            read_sx_byte (board, 0), read_sx_byte(board, 1), 
+	            read_sx_byte (board, 5), read_sx_byte(board, 4));
+
+	if (read_sx_byte (board, 0) == 0xff) {
+		printk (KERN_INFO "sx: No modules found. Sorry.\n");
+		board->nports = 0;
+		return 0;
+	}
+
+	chans = 0;
+
+	if (IS_SX_BOARD(board)) {
+		sx_write_board_word (board, cc_int_count, sx_maxints);
+	} else {
+		if (sx_maxints)
+			sx_write_board_word (board, cc_int_count, SI_PROCESSOR_CLOCK/8/sx_maxints);
+	}
+
+	/* grab the first module type... */
+	/*  board->ta_type = mod_compat_type (read_sx_byte (board, 0x80 + 0x08)); */
+	board->ta_type = mod_compat_type (sx_read_module_byte (board, 0x80, mc_chip));
+
+	/* XXX byteorder */
+	for (addr = 0x80;addr != 0;addr = read_sx_word (board, addr) & 0x7fff) {
+		type = sx_read_module_byte (board, addr, mc_chip);
+		sx_dprintk (SX_DEBUG_INIT, "Module at %x: %d channels\n", 
+		            addr, read_sx_byte (board, addr + 2));
+
+		chans += sx_read_module_byte (board, addr, mc_type);
+
+		sx_dprintk (SX_DEBUG_INIT, "module is an %s, which has %s/%s panels\n", 
+		            mod_type_s (type),
+		            pan_type_s (sx_read_module_byte (board, addr, mc_mods) & 0xf),
+		            pan_type_s (sx_read_module_byte (board, addr, mc_mods) >> 4));
+
+		sx_dprintk (SX_DEBUG_INIT, "CD1400 versions: %x/%x, ASIC version: %x\n", 
+		            sx_read_module_byte (board, addr, mc_rev1),
+		            sx_read_module_byte (board, addr, mc_rev2),
+		            sx_read_module_byte (board, addr, mc_mtaasic_rev));
+
+		/* The following combinations are illegal: It should theoretically
+		   work, but timing problems make the bus HANG. */
+
+		if (mod_compat_type (type) != board->ta_type) {
+			printk (KERN_ERR "sx: This is an invalid configuration.\n"
+			        "Don't mix TA/MTA/SXDC on the same hostadapter.\n");
+			chans=0;
+			break;
+		}
+		if (IS_SI_BOARD(board) && (mod_compat_type(type) == 4)) {
+			printk (KERN_ERR "sx: This is an invalid configuration.\n"
+			        "Don't use SXDCs on an SI/XIO adapter.\n");
+			chans=0;
+			break;
+		}
+#if 0 /* Problem fixed: firmware 3.05 */
+		if (IS_SX_BOARD(board) && (type == TA8)) {
+			/* There are some issues with the firmware and the DCD/RTS
+			   lines. It might work if you tie them together or something.
+			   It might also work if you get a newer sx_firmware.	Therefore
+			   this is just a warning. */
+			printk (KERN_WARNING "sx: The SX host doesn't work too well "
+			        "with the TA8 adapters.\nSpecialix is working on it.\n");
+		}
+#endif
+	}
+
+	if (chans) {
+		/* board->flags |= SX_BOARD_PRESENT; */
+		if(board->irq > 0) {
+			/* fixed irq, probably PCI */
+			if(sx_irqmask & (1 << board->irq)) { /* may we use this irq? */
+				if(request_irq(board->irq, sx_interrupt, SA_SHIRQ | SA_INTERRUPT, "sx", board)) {
+					printk(KERN_ERR "sx: Cannot allocate irq %d.\n", board->irq);
+					board->irq = 0;
+				}
+			} else
+				board->irq = 0;
+		} else if(board->irq < 0 && sx_irqmask) {
+			/* auto-allocate irq */
+			int irqnr;
+			int irqmask = sx_irqmask & (IS_SX_BOARD(board) ? SX_ISA_IRQ_MASK : SI2_ISA_IRQ_MASK);
+			for(irqnr = 15; irqnr > 0; irqnr--)
+				if(irqmask & (1 << irqnr))
+					if(! request_irq(irqnr, sx_interrupt, SA_SHIRQ | SA_INTERRUPT, "sx", board))
+						break;
+			if(! irqnr)
+				printk(KERN_ERR "sx: Cannot allocate IRQ.\n");
+			board->irq = irqnr;
+		} else
+			board->irq = 0;
+
+		if (board->irq) {
+			/* Found a valid interrupt, start up interrupts! */
+			sx_dprintk (SX_DEBUG_INIT, "Using irq %d.\n", board->irq);
+			sx_start_interrupts (board);
+			board->poll = sx_slowpoll;
+			board->flags |= SX_IRQ_ALLOCATED;
+		} else {
+			/* no irq: setup board for polled operation */
+			board->poll = sx_poll;
+			sx_dprintk (SX_DEBUG_INIT, "Using poll-interval %d.\n", board->poll);
+		}
+
+		/* The timer should be initialized anyway: That way we can safely
+			 del_timer it when the module is unloaded. */
+		init_timer (&board->timer);
+
+		if (board->poll) {
+			board->timer.data = (unsigned long) board;
+			board->timer.function = sx_pollfunc;
+			board->timer.expires = jiffies + board->poll;
+			add_timer (&board->timer);
+		}
+	} else {
+		board->irq = 0;
+	}
+
+	board->nports = chans;
+	sx_dprintk (SX_DEBUG_INIT, "returning %d ports.", board->nports);
+
+	func_exit();
+	return chans;
+}
+
+
+void printheader(void)
+{
+	static int header_printed = 0;
+
+	if (!header_printed) {
+		printk (KERN_INFO "Specialix SX driver "
+		        "(C) 1998/1999 R.E.Wolff@BitWizard.nl \n");
+		printk (KERN_INFO "sx: version %s\n", RCS_ID);
+		header_printed = 1;
+	}
+}
+
+
+int probe_sx (struct sx_board *board)
+{
+	struct vpd_prom vpdp;
+	char *p;
+	int i;
+
+	func_enter();
+	sx_dprintk (SX_DEBUG_PROBE, "Going to verify vpd prom at %x.\n", 
+	            board->base + SX_VPD_ROM);
+
+	if (sx_debug & SX_DEBUG_PROBE)
+		my_hd ((char *)(board->base + SX_VPD_ROM), 0x40);
+
+	p = (char *) &vpdp;
+	for (i=0;i< sizeof (struct vpd_prom);i++)
+		*p++ = read_sx_byte (board, SX_VPD_ROM + i*2);
+
+	if (sx_debug & SX_DEBUG_PROBE)
+		my_hd ((char *)&vpdp, 0x20);
+
+	sx_dprintk (SX_DEBUG_PROBE, "checking identifier...\n");
+
+	if (strncmp (vpdp.identifier, SX_VPD_IDENT_STRING, 16) != 0) {
+		sx_dprintk (SX_DEBUG_PROBE, "Got non-SX identifier: '%s'\n", 
+		            vpdp.identifier); 
+		return 0;
+	}
+
+	printheader ();
+
+	printk (KERN_DEBUG "sx: Found an SX board at %x\n", board->hw_base);
+	printk (KERN_DEBUG "sx: hw_rev: %d, assembly level: %d, uniq ID:%08x, ", 
+	        vpdp.hwrev, vpdp.hwass, vpdp.uniqid);
+	printk (           "Manufactured: %d/%d\n", 
+	        1970 + vpdp.myear, vpdp.mweek);
+
+
+	if ((((vpdp.uniqid >> 24) & SX_UNIQUEID_MASK) != SX_PCI_UNIQUEID1) &&
+	    (((vpdp.uniqid >> 24) & SX_UNIQUEID_MASK) != SX_ISA_UNIQUEID1)) {
+		/* This might be a bit harsh. This was the primary reason the
+		   SX/ISA card didn't work at first... */
+		printk (KERN_ERR "sx: Hmm. Not an SX/PCI or SX/ISA card. Sorry: giving up.\n");
+		return (0);
+	}
+
+	if (((vpdp.uniqid >> 24) & SX_UNIQUEID_MASK) == SX_ISA_UNIQUEID1) {
+		if (board->base & 0x8000) {
+			printk (KERN_WARNING "sx: Warning: There may be hardware problems with the card at %x.\n", board->base);
+			printk (KERN_WARNING "sx: Read sx.txt for more info.\n");
+		}
+	}
+
+
+	board->nports = -1;
+
+	/* This resets the processor, and keeps it off the bus. */
+	if (!sx_reset (board)) 
+		return 0;
+	sx_dprintk (SX_DEBUG_INIT, "reset the board...\n");
+
+	board->flags |= SX_BOARD_PRESENT;
+
+	func_exit();
+	return 1;
+}
+
+
+
+/* Specialix probes for this card at 32k increments from 640k to 16M.
+   I consider machines with less than 16M unlikely nowadays, so I'm
+   not probing above 1Mb. Also, 0xa0000, 0xb0000, are taken by the VGA
+   card. 0xe0000 and 0xf0000 are taken by the BIOS. That only leaves 
+   0xc0000, 0xc8000, 0xd0000 and 0xd8000 . */
+
+int probe_si (struct sx_board *board)
+{
+	int i;
+
+	func_enter();
+	sx_dprintk (SX_DEBUG_PROBE, "Going to verify SI signature %x.\n", 
+	            board->base + SI2_ISA_ID_BASE);
+
+	if (sx_debug & SX_DEBUG_PROBE)
+		my_hd ((char *)(board->base + SI2_ISA_ID_BASE), 0x8);
+
+	for (i=0;i<8;i++) {
+		if ((read_sx_byte (board, SI2_ISA_ID_BASE+7-i) & 7) != i) {
+			return 0;
+		}
+	}
+
+	printheader ();
+
+	printk (KERN_DEBUG "sx: Found an SI board at %x\n", board->hw_base);
+	/* Compared to the SX boards, it is a complete guess as to what
+		 this card is up to... */
+
+	board->nports = -1;
+
+	/* This resets the processor, and keeps it off the bus. */
+	if (!sx_reset (board)) 
+		return 0;
+	sx_dprintk (SX_DEBUG_INIT, "reset the board...\n");
+
+	board->flags |= SX_BOARD_PRESENT;
+
+	func_exit();
+	return 1;
+}
+
+
+static int sx_init_drivers(void)
+{
+	int error;
+
+	func_enter();
+
+	memset(&sx_driver, 0, sizeof(sx_driver));
+	sx_driver.magic = TTY_DRIVER_MAGIC;
+	sx_driver.driver_name = "specialix_sx";
+	sx_driver.name = "ttyX";
+	sx_driver.major = SX_NORMAL_MAJOR;
+	sx_driver.num = sx_nports;
+	sx_driver.type = TTY_DRIVER_TYPE_SERIAL;
+	sx_driver.subtype = SX_TYPE_NORMAL;
+	sx_driver.init_termios = tty_std_termios;
+	sx_driver.init_termios.c_cflag =
+	  B9600 | CS8 | CREAD | HUPCL | CLOCAL;
+	sx_driver.flags = TTY_DRIVER_REAL_RAW;
+	sx_driver.refcount = &sx_refcount;
+	sx_driver.table = sx_table;
+	sx_driver.termios = sx_termios;
+	sx_driver.termios_locked = sx_termios_locked;
+
+	sx_driver.open	= sx_open;
+	sx_driver.close = gs_close;
+	sx_driver.write = gs_write;
+	sx_driver.put_char = gs_put_char;
+	sx_driver.flush_chars = gs_flush_chars;
+	sx_driver.write_room = gs_write_room;
+	sx_driver.chars_in_buffer = gs_chars_in_buffer;
+	sx_driver.flush_buffer = gs_flush_buffer;
+	sx_driver.ioctl = sx_ioctl;
+	sx_driver.throttle = sx_throttle;
+	sx_driver.unthrottle = sx_unthrottle;
+	sx_driver.set_termios = gs_set_termios;
+	sx_driver.stop = gs_stop;
+	sx_driver.start = gs_start;
+	sx_driver.hangup = gs_hangup;
+
+	sx_callout_driver = sx_driver;
+	sx_callout_driver.name = "cux";
+	sx_callout_driver.major = SX_CALLOUT_MAJOR;
+	sx_callout_driver.subtype = SX_TYPE_CALLOUT;
+
+	if ((error = tty_register_driver(&sx_driver))) {
+		printk(KERN_ERR "sx: Couldn't register sx driver, error = %d\n",
+		       error);
+		return 1;
+	}
+	if ((error = tty_register_driver(&sx_callout_driver))) {
+		tty_unregister_driver(&sx_driver);
+		printk(KERN_ERR "sx: Couldn't register sx callout driver, error = %d\n",
+		       error);
+		return 1;
+	}
+
+	func_exit();
+	return 0;
+}
+
+
+void * ckmalloc (int size)
+{
+	void *p;
+
+	p = kmalloc(size, GFP_KERNEL);
+	if (p) 
+		memset(p, 0, size);
+	return p;
+}
+
+
+static int sx_init_portstructs (int nboards, int nports)
+{
+	struct sx_board *board;
+	struct sx_port *port;
+	int i, j;
+	int addr, chans;
+	int portno;
+
+	func_enter();
+
+	/* Many drivers statically allocate the maximum number of ports
+	   There is no reason not to allocate them dynamically. Is there? -- REW */
+	sx_ports          = ckmalloc(nports * sizeof (struct sx_port));
+	if (!sx_ports)
+		return -ENOMEM;
+
+	sx_termios        = ckmalloc(nports * sizeof (struct termios *));
+	if (!sx_termios) {
+		kfree (sx_ports);
+		return -ENOMEM;
+	}
+
+	sx_termios_locked = ckmalloc(nports * sizeof (struct termios *));
+	if (!sx_termios_locked) {
+		kfree (sx_ports);
+		kfree (sx_termios);
+		return -ENOMEM;
+	}
+
+	/* Adjust the values in the "driver" */
+	sx_driver.termios = sx_termios;
+	sx_driver.termios_locked = sx_termios_locked;
+
+	port = sx_ports;
+	for (i = 0; i < nboards; i++) {
+		board = &boards[i];
+		board->ports = port;
+		for (j=0; j < boards[i].nports;j++) {
+			sx_dprintk (SX_DEBUG_INIT, "initing port %d\n", j);
+			port->gs.callout_termios = tty_std_termios;
+			port->gs.normal_termios	= tty_std_termios;
+			port->gs.magic = SX_MAGIC;
+			port->gs.close_delay = HZ/2;
+			port->gs.closing_wait = 30 * HZ;
+			port->board = board;
+			port->gs.rd = &sx_real_driver;
+#ifdef NEW_WRITE_LOCKING
+			port->gs.port_write_sem = MUTEX;
+#endif
+			port++;
+		}
+	}
+
+	port = sx_ports;
+	portno = 0;
+	for (i = 0; i < nboards; i++) {
+		board = &boards[i];
+		board->port_base = portno;
+		/* Possibly the configuration was rejected. */
+		sx_dprintk (SX_DEBUG_PROBE, "Board has %d channels\n", board->nports);
+		if (board->nports <= 0) continue;
+		/* XXX byteorder ?? */
+		for (addr = 0x80;addr != 0;addr = read_sx_word (board, addr) & 0x7fff) {
+			chans = sx_read_module_byte (board, addr, mc_type); 
+			sx_dprintk (SX_DEBUG_PROBE, "Module at %x: %d channels\n", addr, chans);
+			sx_dprintk (SX_DEBUG_PROBE, "Port at");
+			for (j=0;j<chans;j++) {
+				/* The "sx-way" is the way it SHOULD be done. That way in the 
+				   future, the firmware may for example pack the structures a bit
+				   more efficient. Neil tells me it isn't going to happen anytime
+				   soon though. */
+				if (IS_SX_BOARD(board))
+					port->ch_base = sx_read_module_word (board, addr+j*2, mc_chan_pointer);
+				else
+					port->ch_base = addr + 0x100 + 0x300*j;
+
+				sx_dprintk (SX_DEBUG_PROBE, " %x", port->ch_base);
+				port->line = portno++;
+				port++;
+			}
+			sx_dprintk (SX_DEBUG_PROBE, "\n");
+		}
+		/* This has to be done earlier. */
+		/* board->flags |= SX_BOARD_INITIALIZED; */
+	}
+
+	func_exit();
+	return 0;
+}
+
+
+static void sx_release_drivers(void)
+{
+	func_enter();
+	tty_unregister_driver(&sx_driver);
+	tty_unregister_driver(&sx_callout_driver);
+	func_exit();
+}
+
+#ifdef TWO_ZERO
+#define PDEV unsigned char pci_bus, unsigned pci_fun
+#define pdev pci_bus, pci_fun
+#else
+#define PDEV   struct pci_dev *pdev
+#endif
+
+
+#ifdef CONFIG_PCI
+ /******************************************************** 
+ * Setting bit 17 in the CNTRL register of the PLX 9050  * 
+ * chip forces a retry on writes while a read is pending.*
+ * This is to prevent the card locking up on Intel Xeon  *
+ * multiprocessor systems with the NX chipset.    -- NV  *
+ ********************************************************/
+
+/* Newer cards are produced with this bit set from the configuration
+   EEprom.  As the bit is read/write for the CPU, we can fix it here,
+   if we detect that it isn't set correctly. -- REW */
+
+void fix_sx_pci (PDEV, struct sx_board *board)
+{
+	unsigned int hwbase;
+	unsigned long rebase;
+	int t;
+
+#define CNTRL_REG_OFFSET        0x14
+
+	pci_read_config_dword(pdev, PCI_BASE_ADDRESS_0, &hwbase);
+	hwbase &= PCI_BASE_ADDRESS_MEM_MASK;
+	rebase = (ulong) ioremap(hwbase, 0x80);
+	t = readb (rebase + CNTRL_REG_OFFSET*4 + 2);
+	if (t != 0x06) {
+		printk (KERN_DEBUG "sx: performing cntrl reg fix: %02x -> 06\n", t); 
+		writeb (0x06, rebase + CNTRL_REG_OFFSET*4+2);
+	}
+	my_iounmap (hwbase, rebase);
+
+}
+#endif
+
+
+#ifdef MODULE
+#define sx_init init_module
+#endif
+
+int sx_init(void) 
+{
+	int i;
+	int found = 0;
+	struct sx_board *board;
+
+#ifdef CONFIG_PCI
+#ifndef TWO_ZERO
+	struct pci_dev *pdev = NULL;
+#else
+	unsigned char pci_bus, pci_fun;
+	/* in 2.2.x pdev is a pointer defining a PCI device. In 2.0 its the bus/fn */
+#endif
+	unsigned int tint;
+	unsigned short tshort;
+#endif
+
+	func_enter();
+	sx_dprintk (SX_DEBUG_INIT, "Initing sx module... (sx_debug=%d)\n", sx_debug);
+	if (abs ((long) (&sx_debug) - sx_debug) < 0x10000) {
+		printk (KERN_WARNING "sx: sx_debug is an address, instead of a value. "
+		        "Assuming -1.\n");
+		printk ("(%p)\n", &sx_debug);
+		sx_debug=-1;
+	}
+
+#ifdef CONFIG_PCI
+	if (pci_present ()) {
+#ifndef TWO_ZERO
+		while ((pdev = pci_find_device (PCI_VENDOR_ID_SPECIALIX, 
+		                                PCI_DEVICE_ID_SPECIALIX_SX_XIO_IO8, 
+			                              pdev))) {
+#else
+			for (i=0;i< SX_NBOARDS;i++) {
+				if (pcibios_find_device (PCI_VENDOR_ID_SPECIALIX, 
+				                         PCI_DEVICE_ID_SPECIALIX_SX_XIO_IO8, i,
+					                       &pci_bus, &pci_fun)) break;
+#endif
+			/* Specialix has a whole bunch of cards with
+			   0x2000 as the device ID. They say its because
+			   the standard requires it. Stupid standard. */
+			/* It seems that reading a word doesn't work reliably on 2.0.
+			   Also, reading a non-aligned dword doesn't work. So we read the
+			   whole dword at 0x2c and extract the word at 0x2e (SUBSYSTEM_ID)
+			   ourselves */
+			/* I don't know why the define doesn't work, constant 0x2c does --REW */ 
+			pci_read_config_dword (pdev, 0x2c, &tint);
+			tshort = (tint >> 16) & 0xffff;
+			sx_dprintk (SX_DEBUG_PROBE, "Got a specialix card: %x.\n", tint);
+			/* sx_dprintk (SX_DEBUG_PROBE, "pdev = %d/%d	(%x)\n", pdev, tint); */ 
+			if (tshort != 0x0200) {
+				sx_dprintk (SX_DEBUG_PROBE, "But it's not an SX card (%d)...\n", 
+				            tshort);
+				continue;
+			}
+			board = &boards[found];
+
+			pci_read_config_dword(pdev, PCI_BASE_ADDRESS_2, &tint);
+			board->hw_base = tint & PCI_BASE_ADDRESS_MEM_MASK;
+			board->base = (ulong) ioremap(board->hw_base, SX_WINDOW_LEN);
+			board->irq = get_irq (pdev);
+			board->flags &= ~SX_BOARD_TYPE;
+			board->flags |=  SX_PCI_BOARD;
+
+			sx_dprintk (SX_DEBUG_PROBE, "Got a specialix card: %x/%x(%d).\n", 
+			            tint, boards[found].base, board->irq);
+
+			if (probe_sx (board)) {
+				found++;
+				fix_sx_pci (pdev, board);
+			} else 
+				my_iounmap (board->hw_base, board->base);
+		}
+	}
+#endif
+
+	for (i=0;i<NR_SX_ADDRS;i++) {
+		board = &boards[found];
+		board->hw_base = sx_probe_addrs[i];
+		board->base = (ulong) ioremap(board->hw_base, SX_WINDOW_LEN);
+		board->flags &= ~SX_BOARD_TYPE;
+		board->flags |=	SX_ISA_BOARD;
+		board->irq = sx_irqmask?-1:0;
+
+		if (probe_sx (board)) {
+			found++;
+		} else {
+			my_iounmap (board->hw_base, board->base);
+		}
+	}
+
+	for (i=0;i<NR_SI_ADDRS;i++) {
+		board = &boards[found];
+		board->hw_base = si_probe_addrs[i];
+		board->base = (ulong) ioremap(board->hw_base, SI2_ISA_WINDOW_LEN);
+		board->flags &= ~SX_BOARD_TYPE;
+		board->flags |=  SI_ISA_BOARD;
+		board->irq = sx_irqmask ?-1:0;
+
+		if (probe_si (board)) {
+			found++;
+		} else {
+			my_iounmap (board->hw_base, board->base);
+		}
+	}
+
+	if (found) {
+		printk (KERN_INFO "sx: total of %d boards detected.\n", found);
+
+		if (misc_register(&sx_fw_device) < 0) {
+			printk(KERN_ERR "SX: Unable to register firmware loader driver.\n");
+			return -EIO;
+		}
+	}
+
+	func_exit();
+	return found?0:-EIO;
+}
+
+
+
+void cleanup_module(void)
+{
+	int i; 
+	struct sx_board *board;
+
+	func_enter();
+	for (i = 0; i < SX_NBOARDS; i++) {
+		board = &boards[i];
+		if (board->flags & SX_BOARD_INITIALIZED) {
+			sx_dprintk (SX_DEBUG_CLEANUP, "Cleaning up board at %x\n", board->base);
+			/* The board should stop messing with us.
+			   (actually I mean the interrupt) */
+			sx_reset (board);
+			if ((board->irq) && (board->flags & SX_IRQ_ALLOCATED))
+				free_irq (board->irq, board);
+
+			/* It is safe/allowed to del_timer a non-active timer */
+			del_timer (& board->timer);
+			my_iounmap (board->hw_base, board->base);
+		}
+	}
+	if (misc_deregister(&sx_fw_device) < 0) {
+		printk (KERN_INFO "sx: couldn't deregister firmware loader device\n");
+	}
+	sx_dprintk (SX_DEBUG_CLEANUP, "Cleaning up drivers (%d)\n", sx_initialized);
+	if (sx_initialized)
+		sx_release_drivers ();
+
+	kfree (sx_ports);
+	kfree (sx_termios);
+	kfree (sx_termios_locked);
+	func_exit();
+}
+
+
+#ifdef DEBUG
+void my_hd (unsigned char *addr, int len)
+{
+	int i, j, ch;
+
+	for (i=0;i<len;i+=16) {
+		printk ("%08x ", (int) addr+i);
+		for (j=0;j<16;j++) {
+			printk ("%02x %s", addr[j+i], (j==7)?" ":"");
+		}
+		for (j=0;j<16;j++) {
+			ch = addr[j+i];
+			printk ("%c", (ch < 0x20)?'.':((ch > 0x7f)?'.':ch));
+		}
+		printk ("\n");
+	}
+}
+#endif
+
+#ifdef MODULE
+#undef func_enter
+#undef func_exit
+
+#include "generic_serial.c"
+#endif
+
+
+/*
+ * Anybody who knows why this doesn't work for me, please tell me -- REW.
+ * Snatched from scsi.c (fixed one spelling error):
+ * Overrides for Emacs so that we follow Linus' tabbing style.
+ * Emacs will notice this stuff at the end of the file and automatically
+ * adjust the settings for this buffer only.  This must remain at the end
+ * of the file.
+ * ---------------------------------------------------------------------------
+ * Local variables:
+ * c-indent-level: 4
+ * c-brace-imaginary-offset: 0
+ * c-brace-offset: -4
+ * c-argdecl-indent: 4
+ * c-label-offset: -4
+ * c-continued-statement-offset: 4
+ * c-continued-brace-offset: 0
+ * indent-tabs-mode: nil
+ * tab-width: 8
+ * End:
+ */
diff -urN linux-2.2.11-pre2/drivers/char/sx.h linux/drivers/char/sx.h
--- linux-2.2.11-pre2/drivers/char/sx.h	Wed Dec 31 16:00:00 1969
+++ linux/drivers/char/sx.h	Mon Dec  3 18:52:25 2001
@@ -0,0 +1,180 @@
+
+/*
+ *  sx.h
+ *
+ *  Copyright (C) 1998/1999 R.E.Wolff@BitWizard.nl
+ *
+ *  SX serial driver.
+ *  -- Supports SI, XIO and SX host cards. 
+ *  -- Supports TAs, MTAs and SXDCs.
+ *
+ *  Version 1.3 -- March, 1999. 
+ * 
+ */
+
+#define SX_NBOARDS        4
+#define SX_PORTSPERBOARD 32
+#define SX_NPORTS        (SX_NBOARDS * SX_PORTSPERBOARD)
+
+#ifdef __KERNEL__
+
+#define SX_MAGIC 0x12345678
+
+struct sx_port {
+  struct gs_port          gs;
+  /*
+  struct tq_struct        tqueue;
+  struct tq_struct        tqueue_hangup;
+  */
+  struct wait_queue       *shutdown_wait;
+  int                     ch_base;
+  int                     c_dcd;
+  struct sx_board         *board;
+  int                     line;
+  int                     locks;
+};
+
+struct sx_board {
+  int magic;
+  unsigned int base;
+  unsigned int hw_base;
+  int port_base; /* Number of the first port */
+  struct sx_port *ports;
+  int nports;
+  int flags;
+  int irq;
+  int poll;
+  int ta_type;
+  struct timer_list       timer;
+  int                     locks;
+};
+
+struct vpd_prom {
+  unsigned short id;
+  char hwrev;
+  char hwass;
+  int uniqid;
+  char myear;
+  char mweek;
+  char hw_feature[5];
+  char oem_id;
+  char identifier[16];
+};
+
+#ifndef MOD_RS232DB25MALE
+#define MOD_RS232DB25MALE 0x0a
+#endif
+
+
+#define SX_BOARD_PRESENT     0x00000001
+#define SX_ISA_BOARD         0x00000002
+#define SX_PCI_BOARD         0x00000004
+#define SI_ISA_BOARD         0x00000008
+#define SX_BOARD_INITIALIZED 0x00000010
+#define SX_IRQ_ALLOCATED     0x00000020
+
+#define SX_BOARD_TYPE (SX_ISA_BOARD|SX_PCI_BOARD|SI_ISA_BOARD)
+
+#define IS_SX_BOARD(board) (board->flags & (SX_PCI_BOARD | SX_ISA_BOARD))
+#define IS_SI_BOARD(board) (board->flags & SI_ISA_BOARD)
+
+
+#define SERIAL_TYPE_NORMAL 1
+
+/* The SI processor clock is required to calculate the cc_int_count register
+   value for the SI cards. */
+#define SI_PROCESSOR_CLOCK 25000000
+
+
+/* port flags */
+/* Make sure these don't clash with gs flags or async flags */
+#define SX_RX_THROTTLE        0x0000001
+
+
+
+#define SX_PORT_TRANSMIT_LOCK  0
+#define SX_BOARD_INTR_LOCK     0
+
+
+
+/* Debug flags. Add these together to get more debug info. */
+
+#define SX_DEBUG_OPEN          0x00000001
+#define SX_DEBUG_SETTING       0x00000002
+#define SX_DEBUG_FLOW          0x00000004
+#define SX_DEBUG_MODEMSIGNALS  0x00000008
+#define SX_DEBUG_TERMIOS       0x00000010
+#define SX_DEBUG_TRANSMIT      0x00000020
+#define SX_DEBUG_RECEIVE       0x00000040
+#define SX_DEBUG_INTERRUPTS    0x00000080
+#define SX_DEBUG_PROBE         0x00000100
+#define SX_DEBUG_INIT          0x00000200
+#define SX_DEBUG_CLEANUP       0x00000400
+#define SX_DEBUG_CLOSE         0x00000800
+#define SX_DEBUG_FIRMWARE      0x00001000
+#define SX_DEBUG_MEMTEST       0x00002000
+
+#define SX_DEBUG_ALL           0xffffffff
+
+
+#define O_OTHER(tty)    \
+      ((O_OLCUC(tty))  ||\
+      (O_ONLCR(tty))   ||\
+      (O_OCRNL(tty))   ||\
+      (O_ONOCR(tty))   ||\
+      (O_ONLRET(tty))  ||\
+      (O_OFILL(tty))   ||\
+      (O_OFDEL(tty))   ||\
+      (O_NLDLY(tty))   ||\
+      (O_CRDLY(tty))   ||\
+      (O_TABDLY(tty))  ||\
+      (O_BSDLY(tty))   ||\
+      (O_VTDLY(tty))   ||\
+      (O_FFDLY(tty)))
+
+/* Same for input. */
+#define I_OTHER(tty)    \
+      ((I_INLCR(tty))  ||\
+      (I_IGNCR(tty))   ||\
+      (I_ICRNL(tty))   ||\
+      (I_IUCLC(tty))   ||\
+      (L_ISIG(tty)))
+
+#define MOD_TA   (        TA>>4)
+#define MOD_MTA  (MTA_CD1400>>4)
+#define MOD_SXDC (      SXDC>>4)
+
+
+/* We copy the download code over to the card in chunks of ... bytes */
+#define SX_CHUNK_SIZE 128
+
+#endif /* __KERNEL__ */
+
+
+
+/* Specialix document 6210046-11 page 3 */
+#define SPX(X) (('S'<<24) | ('P' << 16) | (X))
+
+/* Specialix-Linux specific IOCTLS. */
+#define SPXL(X) (SPX(('L' << 8) | (X)))
+
+
+#define SXIO_SET_BOARD      SPXL(0x01)
+#define SXIO_GET_TYPE       SPXL(0x02)
+#define SXIO_DOWNLOAD       SPXL(0x03)
+#define SXIO_INIT           SPXL(0x04)
+#define SXIO_SETDEBUG       SPXL(0x05)
+#define SXIO_GETDEBUG       SPXL(0x06)
+#define SXIO_DO_RAMTEST     SPXL(0x07)
+#define SXIO_SETGSDEBUG     SPXL(0x08)
+#define SXIO_GETGSDEBUG     SPXL(0x09)
+
+
+#ifndef SXCTL_MISC_MINOR 
+/* Allow others to gather this into "major.h" or something like that */
+#define SXCTL_MISC_MINOR    167
+#endif
+
+#define SX_TYPE_SX          0x01
+#define SX_TYPE_SI          0x02
+
diff -urN linux-2.2.11-pre2/drivers/char/sxboards.h linux/drivers/char/sxboards.h
--- linux-2.2.11-pre2/drivers/char/sxboards.h	Wed Dec 31 16:00:00 1969
+++ linux/drivers/char/sxboards.h	Mon Dec  3 18:52:25 2001
@@ -0,0 +1,181 @@
+/************************************************************************/
+/*									*/
+/*	Title		:	SX/SI/XIO Board Hardware Definitions	*/
+/*									*/
+/*	Author		:	N.P.Vassallo				*/
+/*									*/
+/*	Creation	:	16th March 1998				*/
+/*									*/
+/*	Version		:	3.0.0					*/
+/*									*/
+/*	Copyright	:	(c) Specialix International Ltd. 1998	*/
+/*									*/
+/*	Description	:	Prototypes, structures and definitions	*/
+/*				describing the SX/SI/XIO board hardware	*/
+/*									*/
+/************************************************************************/
+
+/* History...
+
+3.0.0	16/03/98 NPV	Creation.
+
+*/
+
+#ifndef	_sxboards_h				/* If SXBOARDS.H not already defined */
+#define	_sxboards_h    1
+
+/*****************************************************************************
+*******************************                 ******************************
+*******************************   Board Types   ******************************
+*******************************                 ******************************
+*****************************************************************************/
+
+/* BUS types... */
+#define		BUS_ISA		0
+#define		BUS_MCA		1
+#define		BUS_EISA	2
+#define		BUS_PCI		3
+
+/* Board phases... */
+#define		SI1_Z280	1
+#define		SI2_Z280	2
+#define		SI3_T225	3
+
+/* Board types... */
+#define		CARD_TYPE(bus,phase)	(bus<<4|phase)
+#define		CARD_BUS(type)		((type>>4)&0xF)
+#define		CARD_PHASE(type)	(type&0xF)
+
+#define		TYPE_SI2_ISA		CARD_TYPE(BUS_ISA,SI2_Z280)
+#define		TYPE_SI2_EISA		CARD_TYPE(BUS_EISA,SI2_Z280)
+#define		TYPE_SI2_PCI		CARD_TYPE(BUS_PCI,SI2_Z280)
+
+#define		TYPE_SX_ISA		CARD_TYPE(BUS_ISA,SI3_T225)
+#define		TYPE_SX_PCI		CARD_TYPE(BUS_PCI,SI3_T225)
+
+/*****************************************************************************
+******************************                  ******************************
+******************************   Phase 2 Z280   ******************************
+******************************                  ******************************
+*****************************************************************************/
+
+/* ISA board details... */
+#define		SI2_ISA_WINDOW_LEN	0x8000		/* 32 Kbyte shared memory window */
+#define 	SI2_ISA_MEMORY_LEN	0x7FF8		/* Usable memory */
+#define		SI2_ISA_ADDR_LOW	0x0A0000	/* Lowest address = 640 Kbyte */
+#define		SI2_ISA_ADDR_HIGH	0xFF8000	/* Highest address = 16Mbyte - 32Kbyte */
+#define		SI2_ISA_ADDR_STEP	SI2_ISA_WINDOW_LEN/* ISA board address step */
+#define		SI2_ISA_IRQ_MASK	0x9800		/* IRQs 15,12,11 */
+
+/* ISA board, register definitions... */
+#define		SI2_ISA_ID_BASE		0x7FF8			/* READ:  Board ID string */
+#define		SI2_ISA_RESET		SI2_ISA_ID_BASE		/* WRITE: Host Reset */
+#define		SI2_ISA_IRQ11		(SI2_ISA_ID_BASE+1)	/* WRITE: Set IRQ11 */
+#define		SI2_ISA_IRQ12		(SI2_ISA_ID_BASE+2)	/* WRITE: Set IRQ12 */
+#define		SI2_ISA_IRQ15		(SI2_ISA_ID_BASE+3)	/* WRITE: Set IRQ15 */
+#define		SI2_ISA_IRQSET		(SI2_ISA_ID_BASE+4)	/* WRITE: Set Host Interrupt */
+#define		SI2_ISA_INTCLEAR	(SI2_ISA_ID_BASE+5)	/* WRITE: Enable Host Interrupt */
+
+#define		SI2_ISA_IRQ11_SET	0x10
+#define		SI2_ISA_IRQ11_CLEAR	0x00
+#define		SI2_ISA_IRQ12_SET	0x10
+#define		SI2_ISA_IRQ12_CLEAR	0x00
+#define		SI2_ISA_IRQ15_SET	0x10
+#define		SI2_ISA_IRQ15_CLEAR	0x00
+#define		SI2_ISA_INTCLEAR_SET	0x10
+#define		SI2_ISA_INTCLEAR_CLEAR	0x00
+#define		SI2_ISA_IRQSET_CLEAR	0x10
+#define		SI2_ISA_IRQSET_SET	0x00
+#define		SI2_ISA_RESET_SET	0x00
+#define		SI2_ISA_RESET_CLEAR	0x10
+
+/* PCI board details... */
+#define		SI2_PCI_WINDOW_LEN	0x100000	/* 1 Mbyte memory window */
+
+/* PCI board register definitions... */
+#define		SI2_PCI_SET_IRQ		0x40001		/* Set Host Interrupt  */
+#define		SI2_PCI_RESET		0xC0001		/* Host Reset */
+
+/*****************************************************************************
+******************************                  ******************************
+******************************   Phase 3 T225   ******************************
+******************************                  ******************************
+*****************************************************************************/
+
+/* General board details... */
+#define		SX_WINDOW_LEN		64*1024		/* 64 Kbyte memory window */
+
+/* ISA board details... */
+#define		SX_ISA_ADDR_LOW		0x0A0000	/* Lowest address = 640 Kbyte */
+#define		SX_ISA_ADDR_HIGH	0xFF8000	/* Highest address = 16Mbyte - 32Kbyte */
+#define		SX_ISA_ADDR_STEP	SX_WINDOW_LEN	/* ISA board address step */
+#define		SX_ISA_IRQ_MASK		0x9E00		/* IRQs 15,12,11,10,9 */
+
+/* Hardware register definitions... */
+#define		SX_EVENT_STATUS		0x7800		/* READ:  T225 Event Status */
+#define		SX_EVENT_STROBE		0x7800		/* WRITE: T225 Event Strobe */
+#define		SX_EVENT_ENABLE		0x7880		/* WRITE: T225 Event Enable */
+#define		SX_VPD_ROM		0x7C00		/* READ:  Vital Product Data ROM */
+#define		SX_CONFIG		0x7C00		/* WRITE: Host Configuration Register */
+#define		SX_IRQ_STATUS		0x7C80		/* READ:  Host Interrupt Status */
+#define		SX_SET_IRQ		0x7C80		/* WRITE: Set Host Interrupt */
+#define		SX_RESET_STATUS		0x7D00		/* READ:  Host Reset Status */
+#define		SX_RESET		0x7D00		/* WRITE: Host Reset */
+#define		SX_RESET_IRQ		0x7D80		/* WRITE: Reset Host Interrupt */
+
+/* SX_VPD_ROM definitions... */
+#define		SX_VPD_SLX_ID1		0x00
+#define		SX_VPD_SLX_ID2		0x01
+#define		SX_VPD_HW_REV		0x02
+#define		SX_VPD_HW_ASSEM		0x03
+#define		SX_VPD_UNIQUEID4	0x04
+#define		SX_VPD_UNIQUEID3	0x05
+#define		SX_VPD_UNIQUEID2	0x06
+#define		SX_VPD_UNIQUEID1	0x07
+#define		SX_VPD_MANU_YEAR	0x08
+#define		SX_VPD_MANU_WEEK	0x09
+#define		SX_VPD_IDENT		0x10
+#define		SX_VPD_IDENT_STRING	"JET HOST BY KEV#"
+
+/* SX unique identifiers... */
+#define		SX_UNIQUEID_MASK	0xF0
+#define		SX_ISA_UNIQUEID1	0x20
+#define		SX_PCI_UNIQUEID1	0x50
+
+/* SX_CONFIG definitions... */
+#define		SX_CONF_BUSEN		0x02		/* Enable T225 memory and I/O */
+#define		SX_CONF_HOSTIRQ		0x04		/* Enable board to host interrupt */
+
+/* SX bootstrap... */
+#define		SX_BOOTSTRAP		"\x28\x20\x21\x02\x60\x0a"
+#define		SX_BOOTSTRAP_SIZE	6
+#define		SX_BOOTSTRAP_ADDR	(0x8000-SX_BOOTSTRAP_SIZE)
+
+/*****************************************************************************
+**********************************          **********************************
+**********************************   EISA   **********************************
+**********************************          **********************************
+*****************************************************************************/
+
+#define		SI2_EISA_OFF	 	0x42
+#define		SI2_EISA_VAL	 	0x01
+
+/*****************************************************************************
+***********************************         **********************************
+***********************************   PCI   **********************************
+***********************************         **********************************
+*****************************************************************************/
+
+/* General definitions... */
+
+#define		SPX_VENDOR_ID		0x11CB		/* Assigned by the PCI SIG */
+#define		SPX_DEVICE_ID		0x4000		/* SI/XIO boards */
+#define		SPX_PLXDEVICE_ID	0x2000		/* SX boards */
+
+#define		SPX_SUB_VENDOR_ID	SPX_VENDOR_ID	/* Same as vendor id */
+#define		SI2_SUB_SYS_ID		0x400		/* Phase 2 (Z280) board */
+#define		SX_SUB_SYS_ID		0x200		/* Phase 3 (t225) board */
+
+#endif						/*_sxboards_h */
+
+/* End of SXBOARDS.H */
diff -urN linux-2.2.11-pre2/drivers/char/sxwindow.h linux/drivers/char/sxwindow.h
--- linux-2.2.11-pre2/drivers/char/sxwindow.h	Wed Dec 31 16:00:00 1969
+++ linux/drivers/char/sxwindow.h	Mon Dec  3 18:52:25 2001
@@ -0,0 +1,393 @@
+/************************************************************************/
+/*									*/
+/*	Title		:	SX Shared Memory Window Structure	*/
+/*									*/
+/*	Author		:	N.P.Vassallo				*/
+/*									*/
+/*	Creation	:	16th March 1998				*/
+/*									*/
+/*	Version		:	3.0.0					*/
+/*									*/
+/*	Copyright	:	(c) Specialix International Ltd. 1998	*/
+/*									*/
+/*	Description	:	Prototypes, structures and definitions	*/
+/*				describing the SX/SI/XIO cards shared	*/
+/*				memory window structure:		*/
+/*					SXCARD				*/
+/*					SXMODULE			*/
+/*					SXCHANNEL			*/
+/*									*/
+/************************************************************************/
+
+/* History...
+
+3.0.0	16/03/98 NPV	Creation. (based on STRUCT.H)
+
+*/
+
+#ifndef	_sxwindow_h				/* If SXWINDOW.H not already defined */
+#define	_sxwindow_h    1
+
+/*****************************************************************************
+***************************                        ***************************
+***************************   Common Definitions   ***************************
+***************************                        ***************************
+*****************************************************************************/
+
+typedef	struct	_SXCARD		*PSXCARD;	/* SXCARD structure pointer */
+typedef	struct	_SXMODULE	*PMOD;		/* SXMODULE structure pointer */
+typedef	struct	_SXCHANNEL	*PCHAN;		/* SXCHANNEL structure pointer */
+
+/*****************************************************************************
+*********************************            *********************************
+*********************************   SXCARD   *********************************
+*********************************            *********************************
+*****************************************************************************/
+
+typedef	struct	_SXCARD
+{
+	BYTE	cc_init_status;			/* 0x00 Initialisation status */
+	BYTE	cc_mem_size;			/* 0x01 Size of memory on card */
+	WORD	cc_int_count;			/* 0x02 Interrupt count */
+	WORD	cc_revision;			/* 0x04 Download code revision */
+	BYTE	cc_isr_count;			/* 0x06 Count when ISR is run */
+	BYTE	cc_main_count;			/* 0x07 Count when main loop is run */
+	WORD	cc_int_pending;			/* 0x08 Interrupt pending */
+	WORD	cc_poll_count;			/* 0x0A Count when poll is run */
+	BYTE	cc_int_set_count;		/* 0x0C Count when host interrupt is set */
+	BYTE	cc_rfu[0x80 - 0x0D];		/* 0x0D Pad structure to 128 bytes (0x80) */
+
+} SXCARD;
+
+/* SXCARD.cc_init_status definitions... */
+#define 	ADAPTERS_FOUND		(BYTE)0x01
+#define 	NO_ADAPTERS_FOUND	(BYTE)0xFF
+
+/* SXCARD.cc_mem_size definitions... */
+#define 	SX_MEMORY_SIZE		(BYTE)0x40
+
+/* SXCARD.cc_int_count definitions... */
+#define 	INT_COUNT_DEFAULT	100	/* Hz */
+
+/*****************************************************************************
+********************************              ********************************
+********************************   SXMODULE   ********************************
+********************************              ********************************
+*****************************************************************************/
+
+#define	TOP_POINTER(a)		((a)|0x8000)	/* Sets top bit of word */
+#define UNTOP_POINTER(a)	((a)&~0x8000)	/* Clears top bit of word */
+
+typedef	struct	_SXMODULE
+{
+	WORD	mc_next;			/* 0x00 Next module "pointer" (ORed with 0x8000) */
+	BYTE	mc_type;			/* 0x02 Type of TA in terms of number of channels */
+	BYTE	mc_mod_no;			/* 0x03 Module number on SI bus cable (0 closest to card) */
+	BYTE	mc_dtr;				/* 0x04 Private DTR copy (TA only) */
+	BYTE	mc_rfu1;			/* 0x05 Reserved */
+	WORD	mc_uart;			/* 0x06 UART base address for this module */
+	BYTE	mc_chip;			/* 0x08 Chip type / number of ports */
+	BYTE	mc_current_uart;		/* 0x09 Current uart selected for this module */
+#ifdef	DOWNLOAD
+	PCHAN	mc_chan_pointer[8];		/* 0x0A Pointer to each channel structure */
+#else
+	WORD	mc_chan_pointer[8];		/* 0x0A Define as WORD if not compiling into download */
+#endif
+	WORD	mc_rfu2;			/* 0x1A Reserved */
+	BYTE	mc_opens1;			/* 0x1C Number of open ports on first four ports on MTA/SXDC */
+	BYTE	mc_opens2;			/* 0x1D Number of open ports on second four ports on MTA/SXDC */
+	BYTE	mc_mods;			/* 0x1E Types of connector module attached to MTA/SXDC */
+	BYTE	mc_rev1;			/* 0x1F Revision of first CD1400 on MTA/SXDC */
+	BYTE	mc_rev2;			/* 0x20 Revision of second CD1400 on MTA/SXDC */
+	BYTE	mc_mtaasic_rev;			/* 0x21 Revision of MTA ASIC 1..4 -> A, B, C, D */
+	BYTE	mc_rfu3[0x100 - 0x22];		/* 0x22 Pad structure to 256 bytes (0x100) */
+
+} SXMODULE;
+
+/* SXMODULE.mc_type definitions... */
+#define		FOUR_PORTS	(BYTE)4
+#define 	EIGHT_PORTS	(BYTE)8
+
+/* SXMODULE.mc_chip definitions... */
+#define 	CHIP_MASK	0xF0
+#define		TA		(BYTE)0
+#define 	TA4		(TA | FOUR_PORTS)
+#define 	TA8		(TA | EIGHT_PORTS)
+#define		TA4_ASIC	(BYTE)0x0A
+#define		TA8_ASIC	(BYTE)0x0B
+#define 	MTA_CD1400	(BYTE)0x28
+#define 	SXDC		(BYTE)0x48
+
+/* SXMODULE.mc_mods definitions... */
+#define		MOD_RS232DB25	0x00		/* RS232 DB25 (socket/plug) */
+#define		MOD_RS232RJ45	0x01		/* RS232 RJ45 (shielded/opto-isolated) */
+#define		MOD_RESERVED_2	0x02		/* Reserved (RS485) */
+#define		MOD_RS422DB25	0x03		/* RS422 DB25 Socket */
+#define		MOD_RESERVED_4	0x04		/* Reserved */
+#define		MOD_PARALLEL	0x05		/* Parallel */
+#define		MOD_RESERVED_6	0x06		/* Reserved (RS423) */
+#define		MOD_RESERVED_7	0x07		/* Reserved */
+#define		MOD_2_RS232DB25	0x08		/* Rev 2.0 RS232 DB25 (socket/plug) */
+#define		MOD_2_RS232RJ45	0x09		/* Rev 2.0 RS232 RJ45 */
+#define		MOD_RESERVED_A	0x0A		/* Rev 2.0 Reserved */
+#define		MOD_2_RS422DB25	0x0B		/* Rev 2.0 RS422 DB25 */
+#define		MOD_RESERVED_C	0x0C		/* Rev 2.0 Reserved */
+#define		MOD_2_PARALLEL	0x0D		/* Rev 2.0 Parallel */
+#define		MOD_RESERVED_E	0x0E		/* Rev 2.0 Reserved */
+#define		MOD_BLANK	0x0F		/* Blank Panel */
+
+/*****************************************************************************
+********************************               *******************************
+********************************   SXCHANNEL   *******************************
+********************************               *******************************
+*****************************************************************************/
+
+#define		TX_BUFF_OFFSET		0x60	/* Transmit buffer offset in channel structure */
+#define		BUFF_POINTER(a)		(((a)+TX_BUFF_OFFSET)|0x8000)
+#define		UNBUFF_POINTER(a)	(jet_channel*)(((a)&~0x8000)-TX_BUFF_OFFSET) 
+#define 	BUFFER_SIZE		256
+#define 	HIGH_WATER		((BUFFER_SIZE / 4) * 3)
+#define 	LOW_WATER		(BUFFER_SIZE / 4)
+
+typedef	struct	_SXCHANNEL
+{
+	WORD	next_item;			/* 0x00 Offset from window base of next channels hi_txbuf (ORred with 0x8000) */
+	WORD 	addr_uart;			/* 0x02 INTERNAL pointer to uart address. Includes FASTPATH bit */
+	WORD	module;				/* 0x04 Offset from window base of parent SXMODULE structure */
+	BYTE 	type;				/* 0x06 Chip type / number of ports (copy of mc_chip) */
+	BYTE	chan_number;			/* 0x07 Channel number on the TA/MTA/SXDC */
+	WORD	xc_status;			/* 0x08 Flow control and I/O status */
+	BYTE	hi_rxipos;			/* 0x0A Receive buffer input index */
+	BYTE	hi_rxopos;			/* 0x0B Receive buffer output index */
+	BYTE	hi_txopos;			/* 0x0C Transmit buffer output index */
+	BYTE	hi_txipos;			/* 0x0D Transmit buffer input index */
+	BYTE	hi_hstat;			/* 0x0E Command register */
+	BYTE	dtr_bit;			/* 0x0F INTERNAL DTR control byte (TA only) */
+	BYTE	txon;				/* 0x10 INTERNAL copy of hi_txon */
+	BYTE	txoff;				/* 0x11 INTERNAL copy of hi_txoff */
+	BYTE	rxon;				/* 0x12 INTERNAL copy of hi_rxon */
+	BYTE	rxoff;				/* 0x13 INTERNAL copy of hi_rxoff */
+	BYTE	hi_mr1;				/* 0x14 Mode Register 1 (databits,parity,RTS rx flow)*/
+	BYTE	hi_mr2;				/* 0x15 Mode Register 2 (stopbits,local,CTS tx flow)*/
+	BYTE	hi_csr;				/* 0x16 Clock Select Register (baud rate) */
+	BYTE	hi_op;				/* 0x17 Modem Output Signal */
+	BYTE	hi_ip;				/* 0x18 Modem Input Signal */
+	BYTE	hi_state;			/* 0x19 Channel status */
+	BYTE	hi_prtcl;			/* 0x1A Channel protocol (flow control) */
+	BYTE	hi_txon;			/* 0x1B Transmit XON character */
+	BYTE	hi_txoff;			/* 0x1C Transmit XOFF character */
+	BYTE	hi_rxon;			/* 0x1D Receive XON character */
+	BYTE	hi_rxoff;			/* 0x1E Receive XOFF character */
+	BYTE	close_prev;			/* 0x1F INTERNAL channel previously closed flag */
+	BYTE	hi_break;			/* 0x20 Break and error control */
+	BYTE	break_state;			/* 0x21 INTERNAL copy of hi_break */
+	BYTE	hi_mask;			/* 0x22 Mask for received data */
+	BYTE	mask;				/* 0x23 INTERNAL copy of hi_mask */
+	BYTE	mod_type;			/* 0x24 MTA/SXDC hardware module type */
+	BYTE	ccr_state;			/* 0x25 INTERNAL MTA/SXDC state of CCR register */
+	BYTE	ip_mask;			/* 0x26 Input handshake mask */
+	BYTE	hi_parallel;			/* 0x27 Parallel port flag */
+	BYTE	par_error;			/* 0x28 Error code for parallel loopback test */
+	BYTE	any_sent;			/* 0x29 INTERNAL data sent flag */
+	BYTE	asic_txfifo_size;		/* 0x2A INTERNAL SXDC transmit FIFO size */
+	BYTE	rfu1[2];			/* 0x2B Reserved */
+	BYTE	csr;				/* 0x2D INTERNAL copy of hi_csr */
+#ifdef	DOWNLOAD
+	PCHAN	nextp;				/* 0x2E Offset from window base of next channel structure */
+#else
+	WORD	nextp;				/* 0x2E Define as WORD if not compiling into download */
+#endif
+	BYTE	prtcl;				/* 0x30 INTERNAL copy of hi_prtcl */
+	BYTE	mr1;				/* 0x31 INTERNAL copy of hi_mr1 */
+	BYTE	mr2;				/* 0x32 INTERNAL copy of hi_mr2 */
+	BYTE	hi_txbaud;			/* 0x33 Extended transmit baud rate (SXDC only if((hi_csr&0x0F)==0x0F) */
+	BYTE	hi_rxbaud;			/* 0x34 Extended receive baud rate  (SXDC only if((hi_csr&0xF0)==0xF0) */
+	BYTE	txbreak_state;			/* 0x35 INTERNAL MTA/SXDC transmit break state */
+	BYTE	txbaud;				/* 0x36 INTERNAL copy of hi_txbaud */
+	BYTE	rxbaud;				/* 0x37 INTERNAL copy of hi_rxbaud */
+	WORD	err_framing;			/* 0x38 Count of receive framing errors */
+	WORD	err_parity;			/* 0x3A Count of receive parity errors */
+	WORD	err_overrun;			/* 0x3C Count of receive overrun errors */
+	WORD	err_overflow;			/* 0x3E Count of receive buffer overflow errors */
+	BYTE	rfu2[TX_BUFF_OFFSET - 0x40];	/* 0x40 Reserved until hi_txbuf */
+	BYTE	hi_txbuf[BUFFER_SIZE];		/* 0x060 Transmit buffer */
+	BYTE	hi_rxbuf[BUFFER_SIZE];		/* 0x160 Receive buffer */
+	BYTE	rfu3[0x300 - 0x260];		/* 0x260 Reserved until 768 bytes (0x300) */
+
+} SXCHANNEL;
+
+/* SXCHANNEL.addr_uart definitions... */
+#define		FASTPATH	0x1000		/* Set to indicate fast rx/tx processing (TA only) */
+
+/* SXCHANNEL.xc_status definitions... */
+#define		X_TANY		0x0001		/* XON is any character (TA only) */
+#define		X_TION		0x0001		/* Tx interrupts on (MTA only) */
+#define		X_TXEN		0x0002		/* Tx XON/XOFF enabled (TA only) */
+#define		X_RTSEN		0x0002		/* RTS FLOW enabled (MTA only) */
+#define		X_TXRC		0x0004		/* XOFF received (TA only) */
+#define		X_RTSLOW	0x0004		/* RTS dropped (MTA only) */
+#define		X_RXEN		0x0008		/* Rx XON/XOFF enabled */
+#define		X_ANYXO		0x0010		/* XOFF pending/sent or RTS dropped */
+#define		X_RXSE		0x0020		/* Rx XOFF sent */
+#define		X_NPEND		0x0040		/* Rx XON pending or XOFF pending */
+#define		X_FPEND		0x0080		/* Rx XOFF pending */
+#define		C_CRSE		0x0100		/* Carriage return sent (TA only) */
+#define		C_TEMR		0x0100		/* Tx empty requested (MTA only) */
+#define		C_TEMA		0x0200		/* Tx empty acked (MTA only) */
+#define		C_ANYP		0x0200		/* Any protocol bar tx XON/XOFF (TA only) */
+#define		C_EN		0x0400		/* Cooking enabled (on MTA means port is also || */
+#define		C_HIGH		0x0800		/* Buffer previously hit high water */
+#define		C_CTSEN		0x1000		/* CTS automatic flow-control enabled */
+#define		C_DCDEN		0x2000		/* DCD/DTR checking enabled */
+#define		C_BREAK		0x4000		/* Break detected */
+#define		C_RTSEN		0x8000		/* RTS automatic flow control enabled (MTA only) */
+#define		C_PARITY	0x8000		/* Parity checking enabled (TA only) */
+
+/* SXCHANNEL.hi_hstat definitions... */
+#define		HS_IDLE_OPEN	0x00		/* Channel open state */
+#define		HS_LOPEN	0x02		/* Local open command (no modem monitoring) */
+#define		HS_MOPEN	0x04		/* Modem open command (wait for DCD signal) */
+#define		HS_IDLE_MPEND	0x06		/* Waiting for DCD signal state */
+#define		HS_CONFIG	0x08		/* Configuration command */
+#define		HS_CLOSE	0x0A		/* Close command */
+#define		HS_START	0x0C		/* Start transmit break command */
+#define		HS_STOP		0x0E		/* Stop transmit break command */
+#define		HS_IDLE_CLOSED	0x10		/* Closed channel state */
+#define		HS_IDLE_BREAK	0x12		/* Transmit break state */
+#define		HS_FORCE_CLOSED	0x14		/* Force close command */
+#define		HS_RESUME	0x16		/* Clear pending XOFF command */
+#define		HS_WFLUSH	0x18		/* Flush transmit buffer command */
+#define		HS_RFLUSH	0x1A		/* Flush receive buffer command */
+#define		HS_SUSPEND	0x1C		/* Suspend output command (like XOFF received) */
+#define		PARALLEL	0x1E		/* Parallel port loopback test command (Diagnostics Only) */
+#define		ENABLE_RX_INTS	0x20		/* Enable receive interrupts command (Diagnostics Only) */
+#define		ENABLE_TX_INTS	0x22		/* Enable transmit interrupts command (Diagnostics Only) */
+#define		ENABLE_MDM_INTS	0x24		/* Enable modem interrupts command (Diagnostics Only) */
+#define		DISABLE_INTS	0x26		/* Disable interrupts command (Diagnostics Only) */
+
+/* SXCHANNEL.hi_mr1 definitions... */
+#define		MR1_BITS	0x03		/* Data bits mask */
+#define		MR1_5_BITS	0x00		/* 5 data bits */
+#define		MR1_6_BITS	0x01		/* 6 data bits */
+#define		MR1_7_BITS	0x02		/* 7 data bits */
+#define		MR1_8_BITS	0x03		/* 8 data bits */
+#define		MR1_PARITY	0x1C		/* Parity mask */
+#define		MR1_ODD		0x04		/* Odd parity */
+#define		MR1_EVEN	0x00		/* Even parity */
+#define		MR1_WITH	0x00		/* Parity enabled */
+#define		MR1_FORCE	0x08		/* Force parity */
+#define		MR1_NONE	0x10		/* No parity */
+#define		MR1_NOPARITY	MR1_NONE		/* No parity */
+#define		MR1_ODDPARITY	(MR1_WITH|MR1_ODD)	/* Odd parity */
+#define		MR1_EVENPARITY	(MR1_WITH|MR1_EVEN)	/* Even parity */
+#define		MR1_MARKPARITY	(MR1_FORCE|MR1_ODD)	/* Mark parity */
+#define		MR1_SPACEPARITY	(MR1_FORCE|MR1_EVEN)	/* Space parity */
+#define		MR1_RTS_RXFLOW	0x80		/* RTS receive flow control */
+
+/* SXCHANNEL.hi_mr2 definitions... */
+#define		MR2_STOP	0x0F		/* Stop bits mask */
+#define		MR2_1_STOP	0x07		/* 1 stop bit */
+#define		MR2_2_STOP	0x0F		/* 2 stop bits */
+#define		MR2_CTS_TXFLOW	0x10		/* CTS transmit flow control */
+#define		MR2_RTS_TOGGLE	0x20		/* RTS toggle on transmit */
+#define		MR2_NORMAL	0x00		/* Normal mode */
+#define		MR2_AUTO	0x40		/* Auto-echo mode (TA only) */
+#define		MR2_LOCAL	0x80		/* Local echo mode */
+#define		MR2_REMOTE	0xC0		/* Remote echo mode (TA only) */
+
+/* SXCHANNEL.hi_csr definitions... */
+#define		CSR_75		0x0		/*    75 baud */
+#define		CSR_110		0x1		/*   110 baud (TA), 115200 (MTA/SXDC) */
+#define		CSR_38400	0x2		/* 38400 baud */
+#define		CSR_150		0x3		/*   150 baud */
+#define		CSR_300		0x4		/*   300 baud */
+#define		CSR_600		0x5		/*   600 baud */
+#define		CSR_1200	0x6		/*  1200 baud */
+#define		CSR_2000	0x7		/*  2000 baud */
+#define		CSR_2400	0x8		/*  2400 baud */
+#define		CSR_4800	0x9		/*  4800 baud */
+#define		CSR_1800	0xA		/*  1800 baud */
+#define		CSR_9600	0xB		/*  9600 baud */
+#define		CSR_19200	0xC		/* 19200 baud */
+#define		CSR_57600	0xD		/* 57600 baud */
+#define		CSR_EXTBAUD	0xF		/* Extended baud rate (hi_txbaud/hi_rxbaud) */
+
+/* SXCHANNEL.hi_op definitions... */
+#define		OP_RTS		0x01		/* RTS modem output signal */
+#define		OP_DTR		0x02		/* DTR modem output signal */
+
+/* SXCHANNEL.hi_ip definitions... */
+#define		IP_CTS		0x02		/* CTS modem input signal */
+#define		IP_DCD		0x04		/* DCD modem input signal */
+#define		IP_DSR		0x20		/* DTR modem input signal */
+#define		IP_RI		0x40		/* RI modem input signal */
+
+/* SXCHANNEL.hi_state definitions... */
+#define		ST_BREAK	0x01		/* Break received (clear with config) */
+#define		ST_DCD		0x02		/* DCD signal changed state */
+
+/* SXCHANNEL.hi_prtcl definitions... */
+#define		SP_TANY		0x01		/* Transmit XON/XANY (if SP_TXEN enabled) */
+#define		SP_TXEN		0x02		/* Transmit XON/XOFF flow control */
+#define		SP_CEN		0x04		/* Cooking enabled */
+#define		SP_RXEN		0x08		/* Rx XON/XOFF enabled */
+#define		SP_DCEN		0x20		/* DCD / DTR check */
+#define		SP_DTR_RXFLOW	0x40		/* DTR receive flow control */
+#define		SP_PAEN		0x80		/* Parity checking enabled */
+
+/* SXCHANNEL.hi_break definitions... */
+#define		BR_IGN		0x01		/* Ignore any received breaks */
+#define		BR_INT		0x02		/* Interrupt on received break */
+#define		BR_PARMRK	0x04		/* Enable parmrk parity error processing */
+#define		BR_PARIGN	0x08		/* Ignore chars with parity errors */
+#define 	BR_ERRINT	0x80		/* Treat parity/framing/overrun errors as exceptions */
+
+/* SXCHANNEL.par_error definitions.. */
+#define		DIAG_IRQ_RX	0x01		/* Indicate serial receive interrupt (diags only) */
+#define		DIAG_IRQ_TX	0x02		/* Indicate serial transmit interrupt (diags only) */
+#define		DIAG_IRQ_MD	0x04		/* Indicate serial modem interrupt (diags only) */
+
+/* SXCHANNEL.hi_txbaud/hi_rxbaud definitions... (SXDC only) */
+#define		BAUD_75		0x00		/*     75 baud */
+#define		BAUD_115200	0x01		/* 115200 baud */
+#define		BAUD_38400	0x02		/*  38400 baud */
+#define		BAUD_150	0x03		/*    150 baud */
+#define		BAUD_300	0x04		/*    300 baud */
+#define		BAUD_600	0x05		/*    600 baud */
+#define		BAUD_1200	0x06		/*   1200 baud */
+#define		BAUD_2000	0x07		/*   2000 baud */
+#define		BAUD_2400	0x08		/*   2400 baud */
+#define		BAUD_4800	0x09		/*   4800 baud */
+#define		BAUD_1800	0x0A		/*   1800 baud */
+#define		BAUD_9600	0x0B		/*   9600 baud */
+#define		BAUD_19200	0x0C		/*  19200 baud */
+#define		BAUD_57600	0x0D		/*  57600 baud */
+#define		BAUD_230400	0x0E		/* 230400 baud */
+#define		BAUD_460800	0x0F		/* 460800 baud */
+#define		BAUD_921600	0x10		/* 921600 baud */
+#define		BAUD_50		0x11    	/*     50 baud */
+#define		BAUD_110	0x12		/*    110 baud */
+#define		BAUD_134_5	0x13		/*  134.5 baud */
+#define		BAUD_200	0x14		/*    200 baud */
+#define		BAUD_7200	0x15		/*   7200 baud */
+#define		BAUD_56000	0x16		/*  56000 baud */
+#define		BAUD_64000	0x17		/*  64000 baud */
+#define		BAUD_76800	0x18		/*  76800 baud */
+#define		BAUD_128000	0x19		/* 128000 baud */
+#define		BAUD_150000	0x1A		/* 150000 baud */
+#define		BAUD_14400	0x1B		/*  14400 baud */
+#define		BAUD_256000	0x1C		/* 256000 baud */
+#define		BAUD_28800	0x1D		/*  28800 baud */
+
+/* SXCHANNEL.txbreak_state definiions... */
+#define		TXBREAK_OFF	0		/* Not sending break */
+#define		TXBREAK_START	1		/* Begin sending break */
+#define		TXBREAK_START1	2		/* Begin sending break, part 1 */
+#define		TXBREAK_ON	3		/* Sending break */
+#define		TXBREAK_STOP	4		/* Stop sending break */
+#define		TXBREAK_STOP1	5		/* Stop sending break, part 1 */
+
+#endif						/* _sxwindow_h */
+
+/* End of SXWINDOW.H */
+
diff -urN linux-2.2.11-pre2/drivers/char/sysrq.c linux/drivers/char/sysrq.c
--- linux-2.2.11-pre2/drivers/char/sysrq.c	Wed Nov 25 17:25:17 1998
+++ linux/drivers/char/sysrq.c	Mon Dec  3 18:52:25 2001
@@ -28,6 +28,10 @@
 #include <linux/apm_bios.h>
 #endif
 
+#ifdef CONFIG_MAGIC_SYSRQ
+int sysrq_enabled = 1;
+#endif
+
 extern void wakeup_bdflush(int);
 extern void reset_vc(unsigned int);
 extern int console_loglevel;
diff -urN linux-2.2.11-pre2/drivers/char/tty_io.c linux/drivers/char/tty_io.c
--- linux-2.2.11-pre2/drivers/char/tty_io.c	Mon Mar 22 10:06:21 1999
+++ linux/drivers/char/tty_io.c	Mon Dec  3 18:52:25 2001
@@ -2166,6 +2166,9 @@
 #ifdef CONFIG_SPECIALIX
 	specialix_init();
 #endif
+#ifdef CONFIG_SX
+	sx_init();
+#endif
 #ifdef CONFIG_8xx
         rs_8xx_init();
 #endif /* CONFIG_8xx */
diff -urN linux-2.2.11-pre2/drivers/macintosh/mediabay.c linux/drivers/macintosh/mediabay.c
--- linux-2.2.11-pre2/drivers/macintosh/mediabay.c	Mon Dec 21 08:37:28 1998
+++ linux/drivers/macintosh/mediabay.c	Mon Dec  3 18:52:26 2001
@@ -64,8 +64,7 @@
 #ifdef CONFIG_BLK_DEV_IDE
 /* check the busy bit in the media-bay ide interface
    (assumes the media-bay contains an ide device) */
-#define MB_IDE_READY(i)	((in_8((volatile unsigned char *) \
-			       (media_bays[i].cd_base + 0x70)) & 0x80) == 0)
+#define MB_IDE_READY(i)	((inb(media_bays[i].cd_base + 0x70) & 0x80) == 0)
 #endif
 
 /*
diff -urN linux-2.2.11-pre2/drivers/macintosh/via-pmu.c linux/drivers/macintosh/via-pmu.c
--- linux-2.2.11-pre2/drivers/macintosh/via-pmu.c	Thu Apr 29 12:53:48 1999
+++ linux/drivers/macintosh/via-pmu.c	Mon Dec  3 18:52:26 2001
@@ -21,6 +21,7 @@
 #include <linux/blkdev.h>
 #include <linux/pci.h>
 #include <linux/malloc.h>
+#include <linux/poll.h>
 #include <asm/prom.h>
 #include <asm/adb.h>
 #include <asm/pmu.h>
@@ -112,6 +113,9 @@
 static void pmu_handle_data(unsigned char *data, int len,
 			    struct pt_regs *regs);
 static void set_volume(int level);
+#ifdef CONFIG_PMAC_PBOOK
+static void pmu_pass_intr(unsigned char *data, int len);
+#endif
 
 static struct adb_controller	pmu_controller = {
 	ADB_VIAPMU,
@@ -729,21 +733,32 @@
 			}
 			pmu_done(req);
 		} else {
-			adb_input(data+1, len-1, regs, 1);
+			/*
+			 * XXX the PMU gives us an up event for keycodes
+			 * 0x74 or 0x75 when the PC card eject buttons
+			 * are released, so we ignore those events.
+			 */
+			if (!(len == 4 && data[1] == 0x2c && data[3] == 0xff
+			      && (data[2] & ~1) == 0xf4))
+				adb_input(data+1, len-1, regs, 1);
 		}
+	} else if (data[0] == 0x08 && len == 3) {
+		/* sound/brightness buttons pressed */
+		pmu_set_brightness(data[1] >> 3);
+		set_volume(data[2]);
 	} else {
-		if (data[0] == 0x08 && len == 3) {
-			/* sound/brightness buttons pressed */
-			pmu_set_brightness(data[1] >> 3);
-			set_volume(data[2]);
-		} else if (show_pmu_ints
-			   && !(data[0] == PMU_INT_TICK && len == 1)) {
+#ifdef CONFIG_PMAC_PBOOK
+		pmu_pass_intr(data, len);
+#else
+		if (show_pmu_ints
+		    && !(data[0] == PMU_INT_TICK && len == 1)) {
 			int i;
 			printk(KERN_DEBUG "pmu intr");
 			for (i = 0; i < len; ++i)
 				printk(" %.2x", data[i]);
 			printk("\n");
 		}
+#endif
 	}
 }
 
@@ -1064,15 +1079,112 @@
 /*
  * Support for /dev/pmu device
  */
+#define RB_SIZE		10
+struct pmu_private {
+	struct list_head list;
+	int	rb_get;
+	int	rb_put;
+	struct rb_entry {
+		unsigned short len;
+		unsigned char data[16];
+	}	rb_buf[RB_SIZE];
+	struct wait_queue *wait;
+	spinlock_t lock;
+};
+
+static LIST_HEAD(all_pmu_pvt);
+static spinlock_t all_pvt_lock = SPIN_LOCK_UNLOCKED;
+
+static void pmu_pass_intr(unsigned char *data, int len)
+{
+	struct pmu_private *pp;
+	struct list_head *list;
+	int i;
+	unsigned long flags;
+
+	if (len > sizeof(pp->rb_buf[0].data))
+		len = sizeof(pp->rb_buf[0].data);
+	spin_lock_irqsave(&all_pvt_lock, flags);
+	for (list = &all_pmu_pvt; (list = list->next) != &all_pmu_pvt; ) {
+		pp = list_entry(list, struct pmu_private, list);
+		i = pp->rb_put + 1;
+		if (i >= RB_SIZE)
+			i = 0;
+		if (i != pp->rb_get) {
+			struct rb_entry *rp = &pp->rb_buf[pp->rb_put];
+			rp->len = len;
+			memcpy(rp->data, data, len);
+			pp->rb_put = i;
+			wake_up_interruptible(&pp->wait);
+		}
+	}
+	spin_unlock_irqrestore(&all_pvt_lock, flags);
+}
+
 static int __openfirmware pmu_open(struct inode *inode, struct file *file)
 {
+	struct pmu_private *pp;
+	unsigned long flags;
+
+	pp = kmalloc(sizeof(struct pmu_private), GFP_KERNEL);
+	if (pp == 0)
+		return -ENOMEM;
+	pp->rb_get = pp->rb_put = 0;
+	spin_lock_init(&pp->lock);
+	pp->wait = 0;
+	spin_lock_irqsave(&all_pvt_lock, flags);
+	list_add(&pp->list, &all_pmu_pvt);
+	spin_unlock_irqrestore(&all_pvt_lock, flags);
+	file->private_data = pp;
 	return 0;
 }
 
 static ssize_t __openfirmware pmu_read(struct file *file, char *buf,
 			size_t count, loff_t *ppos)
 {
-	return 0;
+	struct pmu_private *pp = file->private_data;
+	struct wait_queue wait = { current, NULL };
+	int ret;
+
+	if (count < 1 || pp == 0)
+		return -EINVAL;
+	ret = verify_area(VERIFY_WRITE, buf, count);
+	if (ret)
+		return ret;
+
+	add_wait_queue(&pp->wait, &wait);
+	current->state = TASK_INTERRUPTIBLE;
+
+	for (;;) {
+		ret = -EAGAIN;
+		spin_lock(&pp->lock);
+		if (pp->rb_get != pp->rb_put) {
+			int i = pp->rb_get;
+			struct rb_entry *rp = &pp->rb_buf[i];
+			ret = rp->len;
+			if (ret > count)
+				ret = count;
+			if (ret > 0 && copy_to_user(buf, rp->data, ret))
+				ret = -EFAULT;
+			if (++i >= RB_SIZE)
+				i = 0;
+			pp->rb_get = i;
+		}
+		spin_unlock(&pp->lock);
+		if (ret >= 0)
+			break;
+
+		if (file->f_flags & O_NONBLOCK)
+			break;
+		ret = -ERESTARTSYS;
+		if (signal_pending(current))
+			break;
+		schedule();
+	}
+	current->state = TASK_RUNNING;
+	remove_wait_queue(&pp->wait, &wait);
+
+	return ret;
 }
 
 static ssize_t __openfirmware pmu_write(struct file *file, const char *buf,
@@ -1081,6 +1193,36 @@
 	return 0;
 }
 
+static unsigned int pmu_fpoll(struct file *filp, poll_table *wait)
+{
+	struct pmu_private *pp = filp->private_data;
+	unsigned int mask = 0;
+
+	if (pp == 0)
+		return 0;
+	poll_wait(filp, &pp->wait, wait);
+	spin_lock(&pp->lock);
+	if (pp->rb_get != pp->rb_put)
+		mask |= POLLIN;
+	spin_unlock(&pp->lock);
+	return mask;
+}
+
+static int pmu_release(struct inode *inode, struct file *file)
+{
+	struct pmu_private *pp = file->private_data;
+	unsigned long flags;
+
+	if (pp != 0) {
+		file->private_data = 0;
+		spin_lock_irqsave(&all_pvt_lock, flags);
+		list_del(&pp->list);
+		spin_unlock_irqrestore(&all_pvt_lock, flags);
+		kfree(pp);
+	}
+	return 0;
+}
+
 /* Note: removed __openfirmware here since it causes link errors */
 static int /*__openfirmware*/ pmu_ioctl(struct inode * inode, struct file *filp,
 		     u_int cmd, u_long arg)
@@ -1089,18 +1231,18 @@
 	__u32 value;
 
 	switch (cmd) {
-	    case PMU_IOC_SLEEP:
+	case PMU_IOC_SLEEP:
 	    	if (pmu_kind != PMU_OHARE_BASED)
 	    		return -ENOSYS;
 		return powerbook_sleep();
-	    case PMU_IOC_GET_BACKLIGHT:
+	case PMU_IOC_GET_BACKLIGHT:
 		return put_user(backlight_level, (__u32 *)arg);
-	    case PMU_IOC_SET_BACKLIGHT:
+	case PMU_IOC_SET_BACKLIGHT:
 		error = get_user(value, (__u32 *)arg);
 		if (!error)
 			pmu_set_brightness(value);
 		return error;
-	    case PMU_IOC_GET_MODEL:
+	case PMU_IOC_GET_MODEL:
 	    	return put_user(pmu_kind, (__u32 *)arg);
 	}
 	return -EINVAL;
@@ -1111,12 +1253,12 @@
 	pmu_read,
 	pmu_write,
 	NULL,		/* no readdir */
-	NULL,		/* no poll yet */
+	pmu_fpoll,
 	pmu_ioctl,
 	NULL,		/* no mmap */
 	pmu_open,
 	NULL,		/* flush */
-	NULL		/* no release */
+	pmu_release,
 };
 
 static struct miscdevice pmu_device = {
diff -urN linux-2.2.11-pre2/drivers/misc/parport_pc.c linux/drivers/misc/parport_pc.c
--- linux-2.2.11-pre2/drivers/misc/parport_pc.c	Tue Jun  1 16:43:43 1999
+++ linux/drivers/misc/parport_pc.c	Mon Dec  3 18:52:26 2001
@@ -829,9 +829,9 @@
 	/* Done probing.  Now put the port into a sensible start-up state. */
 	if (p->modes & PARPORT_MODE_PCECR)
 		/*
-		 * Put the ECP detected port in the more SPP like mode.
+		 * Put the ECP detected port in the more PS2 like mode.
 		 */
-		parport_pc_write_econtrol(p, 0x0);
+		parport_pc_write_econtrol(p, 0x34);
 	parport_pc_write_control(p, 0x8);
 	parport_pc_write_data(p, 0);
 	udelay (50);
diff -urN linux-2.2.11-pre2/drivers/net/Config.in linux/drivers/net/Config.in
--- linux-2.2.11-pre2/drivers/net/Config.in	Mon Dec  3 18:52:02 2001
+++ linux/drivers/net/Config.in	Mon Dec  3 18:52:26 2001
@@ -24,6 +24,9 @@
      tristate 'Ethertap network tap' CONFIG_ETHERTAP
   fi
 fi
+
+tristate 'General Instruments Surfboard 1000' CONFIG_NET_SB1000
+
 #
 #	Ethernet
 #
@@ -90,6 +93,7 @@
   fi
   if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
       tristate 'RealTek 8129/8139 (not 8019/8029!) support' CONFIG_RTL8139
+      tristate 'SiS 900 PCI Fast Ethernet Adapter support' CONFIG_SIS900
       tristate 'Packet Engines Yellowfin Gigabit-NIC support' CONFIG_YELLOWFIN
   fi
   bool 'Other ISA cards' CONFIG_NET_ISA
@@ -278,6 +282,7 @@
 fi
 
 endmenu
+
 
 #
 # X.25 network drivers
diff -urN linux-2.2.11-pre2/drivers/net/Makefile linux/drivers/net/Makefile
--- linux-2.2.11-pre2/drivers/net/Makefile	Mon Dec  3 18:52:02 2001
+++ linux/drivers/net/Makefile	Mon Dec  3 18:52:26 2001
@@ -91,6 +91,14 @@
   endif
 endif
 
+ifeq ($(CONFIG_NET_SB1000),y)
+L_OBJS += sb1000.o
+else
+  ifeq ($(CONFIG_NET_SB1000),m)
+  M_OBJS += sb1000.o
+  endif
+endif
+
 ifeq ($(CONFIG_DAYNAPORT), y)
 L_OBJS += daynaport.o
 CONFIG_8390_BUILTIN = y
@@ -555,6 +563,14 @@
 else
   ifeq ($(CONFIG_RTL8139),m)
   M_OBJS += rtl8139.o
+  endif
+endif
+
+ifeq ($(CONFIG_SIS900),y)
+L_OBJS += sis900.o
+else
+  ifeq ($(CONFIG_SIS900),m)
+  M_OBJS += sis900.o
   endif
 endif
 
diff -urN linux-2.2.11-pre2/drivers/net/Space.c linux/drivers/net/Space.c
--- linux-2.2.11-pre2/drivers/net/Space.c	Mon Dec  3 18:52:02 2001
+++ linux/drivers/net/Space.c	Mon Dec  3 18:52:26 2001
@@ -111,6 +111,7 @@
 extern int am79c961_probe(struct device *dev);
 extern int epic100_probe(struct device *dev);
 extern int rtl8139_probe(struct device *dev);
+extern int sis900_probe(struct device *dev);
 extern int hplance_probe(struct device *dev);
 extern int bagetlance_probe(struct device *);
 extern int dec_lance_probe(struct device *);
@@ -205,6 +206,9 @@
 #ifdef CONFIG_RTL8139
 	{rtl8139_probe, 0},
 #endif
+#ifdef CONFIG_SIS900
+	{sis900_probe, 0},
+#endif
 #ifdef CONFIG_YELLOWFIN
 	{yellowfin_probe, 0},
 #endif
@@ -816,6 +820,14 @@
         "bif", 0x0, 0x0, 0x0, 0x0, 0, 0, 0, 0, 0, NEXT_DEV, bif_init };
 #   undef       NEXT_DEV
 #   define      NEXT_DEV        (&bif_dev)
+#endif
+	
+#ifdef CONFIG_NET_SB1000
+    extern int sb1000_init(struct device *dev);
+    static struct device sb1000_dev = {
+        "cm0", 0x0, 0x0, 0x0, 0x0, 0, 0, 0, 0, 0, NEXT_DEV, sb1000_probe };
+#   undef       NEXT_DEV
+#   define      NEXT_DEV        (&sb1000_dev)
 #endif
 	
 extern int loopback_init(struct device *dev);
diff -urN linux-2.2.11-pre2/drivers/net/acenic.c linux/drivers/net/acenic.c
--- linux-2.2.11-pre2/drivers/net/acenic.c	Mon Mar 22 08:08:12 1999
+++ linux/drivers/net/acenic.c	Mon Dec  3 18:52:26 2001
@@ -2,7 +2,7 @@
  * acenic.c: Linux driver for the Alteon AceNIC Gigabit Ethernet card
  *           and other Tigon based cards.
  *
- * Copyright 1998 by Jes Sorensen, <Jes.Sorensen@cern.ch>.
+ * Copyright 1998, 1999 by Jes Sorensen, <Jes.Sorensen@cern.ch>.
  *
  * Thanks to Alteon and 3Com for providing hardware and documentation
  * enabling me to write this driver.
@@ -67,6 +67,16 @@
 #define PCI_VENDOR_ID_NETGEAR		0x1385
 #define PCI_DEVICE_ID_NETGEAR_GA620	0x620a
 #endif
+/*
+ * They used the DEC vendor ID by mistake
+ */
+#ifndef PCI_DEVICE_ID_FARALLON_PN9000SX
+#define PCI_DEVICE_ID_FARALLON_PN9000SX 0x1a
+#endif
+#ifndef PCI_VENDOR_ID_SGI
+#define PCI_VENDOR_ID_SGI             0x10a9
+#define PCI_DEVICE_ID_SGI_ACENIC      0x0009
+#endif
 
 /*
  * This driver currently supports Tigon I and Tigon II based cards
@@ -171,7 +181,7 @@
 static int max_rx_desc[8] = {0, };
 static int tx_ratio[8] = {0, };
 
-static const char __initdata *version = "acenic.c: v0.32 03/15/99  Jes Sorensen (Jes.Sorensen@cern.ch)\n";
+static const char __initdata *version = "acenic.c: v0.33 07/20/99  Jes Sorensen (Jes.Sorensen@cern.ch)\n";
 
 static struct device *root_dev = NULL;
 
@@ -208,7 +218,15 @@
 		    !((pdev->vendor == PCI_VENDOR_ID_3COM) &&
 		      (pdev->device == PCI_DEVICE_ID_3COM_3C985)) &&
 		    !((pdev->vendor == PCI_VENDOR_ID_NETGEAR) &&
-		      (pdev->device == PCI_DEVICE_ID_NETGEAR_GA620)))
+		      (pdev->device == PCI_DEVICE_ID_NETGEAR_GA620)) &&
+		/*
+		 * Farallon used the DEC vendor ID on their cards by
+		 * mistake for a while
+		 */
+		    !((pdev->vendor == PCI_VENDOR_ID_DEC) &&
+		      (pdev->device == PCI_DEVICE_ID_FARALLON_PN9000SX)) &&
+		    !((pdev->vendor == PCI_VENDOR_ID_SGI) &&
+		      (pdev->device == PCI_DEVICE_ID_SGI_ACENIC)))
 			continue;
 
 		dev = init_etherdev(dev, sizeof(struct ace_private));
@@ -282,6 +300,18 @@
 			sprintf(ap->name, "NetGear GA620 Gigabit Ethernet");
 			printk(KERN_INFO "%s: NetGear GA620 ", dev->name);
 			break;
+		case PCI_VENDOR_ID_DEC:
+			if (pdev->device == PCI_DEVICE_ID_FARALLON_PN9000SX) {
+				sprintf(ap->name, "Farallon PN9000-SX "
+					"Gigabit Ethernet");
+				printk(KERN_INFO "%s: Farallon PN9000-SX ",
+				       dev->name);
+				break;
+			}
+		case PCI_VENDOR_ID_SGI:
+			sprintf(ap->name, "SGI AceNIC Gigabit Ethernet");
+			printk(KERN_INFO "%s: SGI AceNIC ", dev->name);
+			break;
 		default:
 			sprintf(ap->name, "Unknown AceNIC based Gigabit Ethernet");
 			printk(KERN_INFO "%s: Unknown AceNIC ", dev->name);
@@ -569,7 +599,7 @@
 	 * and the control blocks for the transmit and receive rings
 	 * as they need to be setup once and for all.
 	 */
-	if (!(info = kmalloc(sizeof(struct ace_info), GFP_KERNEL | GFP_DMA))){
+	if (!(info = kmalloc(sizeof(struct ace_info), GFP_KERNEL))){
 		free_irq(dev->irq, dev);
 		return -EAGAIN;
 	}
@@ -1162,6 +1192,12 @@
 		skb->dev = dev;
 		skb->protocol = eth_type_trans(skb, dev);
 
+#if 0
+		/*
+		 * This was never actually enabled in the RX descriptors
+		 * anyway - it requires a bit more testing before enabling
+		 * it again.
+		 */
 		/*
 		 * If the checksum is correct and this is not a
 		 * fragment, tell the stack that the data is correct.
@@ -1172,7 +1208,7 @@
 			skb->ip_summed = CHECKSUM_UNNECESSARY;
 		else
 			skb->ip_summed = CHECKSUM_NONE;
-
+#endif
 		netif_rx(skb);		/* send it up */
 
 		ap->stats.rx_packets++;
diff -urN linux-2.2.11-pre2/drivers/net/acenic_firmware.h linux/drivers/net/acenic_firmware.h
--- linux-2.2.11-pre2/drivers/net/acenic_firmware.h	Mon Mar 22 08:08:12 1999
+++ linux/drivers/net/acenic_firmware.h	Mon Dec  3 18:52:26 2001
@@ -1,31 +1,31 @@
 /* Generated by genfw.c */
 int tigonFwReleaseMajor = 0xc;
 int tigonFwReleaseMinor = 0x3;
-int tigonFwReleaseFix = 0x5;
+int tigonFwReleaseFix = 0xa;
 u32 tigonFwStartAddr = 0x00004000;
 u32 tigonFwTextAddr = 0x00004000;
-int tigonFwTextLen = 0x10910;
-u32 tigonFwRodataAddr = 0x00014910;
+int tigonFwTextLen = 0x10920;
+u32 tigonFwRodataAddr = 0x00014920;
 int tigonFwRodataLen = 0xaa0;
-u32 tigonFwDataAddr = 0x000153d0;
+u32 tigonFwDataAddr = 0x000153e0;
 int tigonFwDataLen = 0x150;
-u32 tigonFwSbssAddr = 0x00015520;
+u32 tigonFwSbssAddr = 0x00015530;
 int tigonFwSbssLen = 0x2c;
-u32 tigonFwBssAddr = 0x00015550;
+u32 tigonFwBssAddr = 0x00015560;
 int tigonFwBssLen = 0x2080;
 u32 tigonFwText[(MAX_TEXT_LEN/4) + 1] __initdata = {
 0x10000003, 
 0x0, 0xd, 0xd, 0x3c1d0001, 
-0x8fbd5404, 0x3a0f021, 0x3c100000, 0x26104000, 
+0x8fbd5414, 0x3a0f021, 0x3c100000, 0x26104000, 
 0xc00100c, 0x0, 0xd, 0x27bdffd8, 
 0x3c1cc000, 0x3c1b0013, 0x377bd800, 0xd021, 
 0x3c170013, 0x36f75418, 0x2e02021, 0x340583e8, 
 0xafbf0024, 0xc00248c, 0xafb00020, 0xc0023ec, 
-0x0, 0x3c040001, 0x24844970, 0x24050001, 
-0x2e03021, 0x3821, 0x3c100001, 0x261075d0, 
+0x0, 0x3c040001, 0x24844984, 0x24050001, 
+0x2e03021, 0x3821, 0x3c100001, 0x261075e0, 
 0xafb00010, 0xc002407, 0xafbb0014, 0x3c02000f, 
 0x3442ffff, 0x2021024, 0x362102b, 0x10400009, 
-0x24050003, 0x3c040001, 0x2484497c, 0x2003021, 
+0x24050003, 0x3c040001, 0x24844990, 0x2003021, 
 0x3603821, 0x3c020010, 0xafa20010, 0xc002407, 
 0xafa00014, 0x2021, 0x3405c000, 0x3c010001, 
 0x370821, 0xa02083b0, 0x3c010001, 0x370821, 
@@ -63,7 +63,7 @@
 0x0, 0x8ee20450, 0x8ee30454, 0xaee304fc, 
 0x8ee204fc, 0x2442e000, 0x2c422001, 0x1440000d, 
 0x26e40030, 0x8ee20450, 0x8ee30454, 0x3c040001, 
-0x24844988, 0x3c050001, 0xafa00010, 0xafa00014, 
+0x2484499c, 0x3c050001, 0xafa00010, 0xafa00014, 
 0x8ee704fc, 0x34a5f000, 0xc002407, 0x603021, 
 0x26e40030, 0xc00248c, 0x24050400, 0x27440080, 
 0xc00248c, 0x24050080, 0x26e4777c, 0xc00248c, 
@@ -73,7 +73,7 @@
 0x3442ca00, 0x2021, 0x24030002, 0xaee30074, 
 0xaee30070, 0xaee2006c, 0x240203e8, 0xaee20104, 
 0x24020001, 0xaee30100, 0xaee2010c, 0x3c030001, 
-0x641821, 0x906353d0, 0x2e41021, 0x24840001, 
+0x641821, 0x906353e0, 0x2e41021, 0x24840001, 
 0xa043009c, 0x2c82000f, 0x1440fff8, 0x0, 
 0x8f820040, 0x2e41821, 0x24840001, 0x21702, 
 0x24420030, 0xa062009c, 0x2e41021, 0xa040009c, 
@@ -119,7 +119,7 @@
 0x8ee24e30, 0x24420001, 0xaee24e30, 0x8ee24e30, 
 0x210c0, 0x24425038, 0x2e22021, 0x24020007, 
 0xac820000, 0x24020001, 0xac820004, 0x54c0000c, 
-0xaee90608, 0x3c040001, 0x24844994, 0xafa00010, 
+0xaee90608, 0x3c040001, 0x248449a8, 0xafa00010, 
 0xafa00014, 0x8ee60608, 0x8f470228, 0x3c050009, 
 0xc002407, 0x34a5f000, 0x8001223, 0x0, 
 0x8f830120, 0x27623800, 0x24660020, 0xc2102b, 
@@ -145,21 +145,21 @@
 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 
 0x24425038, 0x2e22021, 0x24020012, 0xac820000, 
 0x24020001, 0xac820004, 0x14c0001b, 0x0, 
-0x3c040001, 0x2484499c, 0xafa00010, 0xafa00014, 
+0x3c040001, 0x248449b0, 0xafa00010, 0xafa00014, 
 0x8ee60608, 0x8f470228, 0x3c050009, 0xc002407, 
 0x34a5f001, 0x8ee201b0, 0x24420001, 0xaee201b0, 
-0x8001223, 0x8ee201b0, 0x3c040001, 0x248449a8, 
+0x8001223, 0x8ee201b0, 0x3c040001, 0x248449bc, 
 0xafa00014, 0x8ee60608, 0x8f470228, 0x3c050009, 
 0xc002407, 0x34a5f005, 0x8ee201ac, 0x24420001, 
 0xaee201ac, 0x8ee201ac, 0x8ee20160, 0x3c040001, 
-0x248449b4, 0x3405f001, 0x24420001, 0xaee20160, 
+0x248449c8, 0x3405f001, 0x24420001, 0xaee20160, 
 0x8ee20160, 0x3021, 0x3821, 0xafa00010, 
 0xc002407, 0xafa00014, 0x8001238, 0x0, 
 0x3c020001, 0x2442f5b8, 0x21100, 0x21182, 
 0x431025, 0x3c010001, 0xac221278, 0x96e2045a, 
 0x30420003, 0x10400025, 0x3c050fff, 0x8ee204c8, 
 0x34a5ffff, 0x34420a00, 0xaee204c8, 0x8ee304c8, 
-0x3c040001, 0x248449c0, 0x24020001, 0xa2e204ec, 
+0x3c040001, 0x248449d4, 0x24020001, 0xa2e204ec, 
 0xa2e204ed, 0x3c020002, 0x621825, 0x3c020001, 
 0x2442a3a0, 0x451024, 0x21082, 0xaee304c8, 
 0x3c030800, 0x431025, 0x3c010001, 0xac221220, 
@@ -202,7 +202,7 @@
 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 
 0x2e22021, 0x24020007, 0xac820000, 0x24020001, 
 0xac820004, 0x54c0000c, 0xaee90608, 0x3c040001, 
-0x24844994, 0xafa00010, 0xafa00014, 0x8ee60608, 
+0x248449a8, 0xafa00010, 0xafa00014, 0x8ee60608, 
 0x8f470228, 0x3c050009, 0xc002407, 0x34a5f000, 
 0x800136d, 0x0, 0x8f830120, 0x27623800, 
 0x24660020, 0xc2102b, 0x50400001, 0x27663000, 
@@ -227,17 +227,17 @@
 0x1021, 0x8ee24e30, 0x24420001, 0xaee24e30, 
 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 
 0x24020012, 0xac820000, 0x24020001, 0xac820004, 
-0x14c0001b, 0x0, 0x3c040001, 0x2484499c, 
+0x14c0001b, 0x0, 0x3c040001, 0x248449b0, 
 0xafa00010, 0xafa00014, 0x8ee60608, 0x8f470228, 
 0x3c050009, 0xc002407, 0x34a5f001, 0x8ee201b0, 
 0x24420001, 0xaee201b0, 0x800136d, 0x8ee201b0, 
-0x3c040001, 0x248449a8, 0xafa00014, 0x8ee60608, 
+0x3c040001, 0x248449bc, 0xafa00014, 0x8ee60608, 
 0x8f470228, 0x3c050009, 0xc002407, 0x34a5f005, 
 0x8ee201ac, 0x24420001, 0xaee201ac, 0x8ee201ac, 
-0x8ee20160, 0x3c040001, 0x248449b4, 0x3405f002, 
+0x8ee20160, 0x3c040001, 0x248449c8, 0x3405f002, 
 0x24420001, 0xaee20160, 0x8ee20160, 0x3021, 
 0x3821, 0xafa00010, 0xc002407, 0xafa00014, 
-0x96e6047a, 0x96e7046a, 0x3c040001, 0x248449cc, 
+0x96e6047a, 0x96e7046a, 0x3c040001, 0x248449e0, 
 0x24050012, 0xafa00010, 0xc002407, 0xafa00014, 
 0xc004500, 0x0, 0xc002318, 0x0, 
 0x3c060001, 0x34c63800, 0xaee00608, 0xaf400228, 
@@ -280,7 +280,7 @@
 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 
 0x2e22021, 0x24020007, 0xac820000, 0x24020001, 
 0xac820004, 0x54c0000c, 0xaee90608, 0x3c040001, 
-0x24844994, 0xafa00010, 0xafa00014, 0x8ee60608, 
+0x248449a8, 0xafa00010, 0xafa00014, 0x8ee60608, 
 0x8f470228, 0x3c050009, 0xc002407, 0x34a5f000, 
 0x80014a5, 0x0, 0x8f830120, 0x27623800, 
 0x24660020, 0xc2102b, 0x50400001, 0x27663000, 
@@ -305,11 +305,11 @@
 0x1021, 0x8ee24e30, 0x24420001, 0xaee24e30, 
 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 
 0x24020012, 0xac820000, 0x24020001, 0xac820004, 
-0x14c0001b, 0x0, 0x3c040001, 0x2484499c, 
+0x14c0001b, 0x0, 0x3c040001, 0x248449b0, 
 0xafa00010, 0xafa00014, 0x8ee60608, 0x8f470228, 
 0x3c050009, 0xc002407, 0x34a5f001, 0x8ee201b0, 
 0x24420001, 0xaee201b0, 0x80014a5, 0x8ee201b0, 
-0x3c040001, 0x248449a8, 0xafa00014, 0x8ee60608, 
+0x3c040001, 0x248449bc, 0xafa00014, 0x8ee60608, 
 0x8f470228, 0x3c050009, 0xc002407, 0x34a5f005, 
 0x8ee201ac, 0x24420001, 0xaee201ac, 0x8ee201ac, 
 0x8ee20154, 0x24420001, 0xaee20154, 0xc0014dc, 
@@ -331,7 +331,7 @@
 0xaee07b8c, 0xaee07b84, 0x3c010001, 0x370821, 
 0xac2083bc, 0x3c010001, 0x370821, 0x3e00008, 
 0xa02083b9, 0x27bdffd8, 0xafbf0024, 0xafb00020, 
-0x8f820054, 0x3c030001, 0x8c635488, 0x24420067, 
+0x8f820054, 0x3c030001, 0x8c635498, 0x24420067, 
 0x1060000d, 0xaf820058, 0x3c020001, 0x571021, 
 0x904283b8, 0x10400005, 0x3c030200, 0x3c010001, 
 0x370821, 0x8001503, 0xa02083b8, 0x8ee20000, 
@@ -349,7 +349,7 @@
 0x0, 0x3c030001, 0x771821, 0x8c6383d4, 
 0x8f8200b4, 0x1462007c, 0x0, 0x3c070001, 
 0xf73821, 0x8ce783d0, 0x8f8200b0, 0x3c040001, 
-0x24844a40, 0xafa00014, 0xafa20010, 0x8f8600b0, 
+0x24844a50, 0xafa00014, 0xafa20010, 0x8f8600b0, 
 0x3c050005, 0xc002407, 0x34a50900, 0x8f82011c, 
 0x34420002, 0xaf82011c, 0x8f830104, 0x8f8200b0, 
 0x34420001, 0xaf8200b0, 0xaf830104, 0x8f830120, 
@@ -377,10 +377,10 @@
 0xac820000, 0x24020001, 0xac820004, 0x8f82011c, 
 0x2403fffd, 0x431024, 0xaf82011c, 0x8ee201e4, 
 0x3c070001, 0xf73821, 0x8ce783d0, 0x24420001, 
-0xaee201e4, 0x8ee201e4, 0x3c040001, 0x24844a4c, 
+0xaee201e4, 0x8ee201e4, 0x3c040001, 0x24844a5c, 
 0x80015bd, 0xafa00010, 0x8f820104, 0x3c010001, 
 0x370821, 0xac2283d0, 0x8f8200b4, 0x3c070001, 
-0xf73821, 0x8ce783d0, 0x3c040001, 0x24844a54, 
+0xf73821, 0x8ce783d0, 0x3c040001, 0x24844a64, 
 0x3c010001, 0x370821, 0xac2283d4, 0xafa00010, 
 0xafa00014, 0x8f8600b0, 0x3c050005, 0xc002407, 
 0x34a50900, 0x80015cc, 0x0, 0x8f820104, 
@@ -413,7 +413,7 @@
 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 
 0x24425038, 0x2e22021, 0x24020012, 0xac820000, 
 0x24020001, 0xac820004, 0x5600000b, 0x24100001, 
-0x8ee204e4, 0x3c040001, 0x24844a5c, 0xafa00014, 
+0x8ee204e4, 0x3c040001, 0x24844a6c, 0xafa00014, 
 0xafa20010, 0x8ee60608, 0x8f470228, 0x3c050009, 
 0xc002407, 0x34a5f006, 0x16000003, 0x24020001, 
 0x8001650, 0xa2e204f4, 0x8ee20170, 0x24420001, 
@@ -443,7 +443,7 @@
 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 
 0x24020012, 0xac820000, 0x24020001, 0xac820004, 
 0x5600000b, 0x24100001, 0x8ee2724c, 0x3c040001, 
-0x24844a68, 0xafa00014, 0xafa20010, 0x8ee6724c, 
+0x24844a78, 0xafa00014, 0xafa20010, 0x8ee6724c, 
 0x8f470280, 0x3c050009, 0xc002407, 0x34a5f008, 
 0x56000001, 0xaee00e1c, 0x8ee20174, 0x24420001, 
 0xaee20174, 0x8ee20174, 0x8ee24e24, 0x10400019, 
@@ -554,11 +554,11 @@
 0x8f820054, 0x1221023, 0x2c420033, 0x1440ffa6, 
 0x0, 0x316300ff, 0x24020001, 0x14620003, 
 0x3c050009, 0x800197c, 0x24100001, 0x3c040001, 
-0x24844a74, 0xafa00010, 0xafa00014, 0x8f860120, 
+0x24844a84, 0xafa00010, 0xafa00014, 0x8f860120, 
 0x8f870124, 0x800187b, 0x34a5f011, 0x3c040001, 
-0x24844a80, 0xafa00010, 0xafa00014, 0x8f860120, 
+0x24844a90, 0xafa00010, 0xafa00014, 0x8f860120, 
 0x8f870124, 0x34a5f010, 0xc002407, 0x8021, 
-0x800197c, 0x0, 0x3c040001, 0x24844a8c, 
+0x800197c, 0x0, 0x3c040001, 0x24844a9c, 
 0xafa00014, 0x8ee60608, 0x8f470228, 0x3c050009, 
 0x8001975, 0x34a5f00f, 0x8ee20608, 0x8f430228, 
 0x24420001, 0x304900ff, 0x512300e2, 0xafa00010, 
@@ -589,7 +589,7 @@
 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 
 0x24425038, 0x2e22021, 0x24020007, 0xac820000, 
 0x24020001, 0xac820004, 0x5600000c, 0xaee90608, 
-0x3c040001, 0x24844a98, 0xafa00010, 0xafa00014, 
+0x3c040001, 0x24844aa8, 0xafa00010, 0xafa00014, 
 0x8ee60608, 0x8f470228, 0x3c050009, 0xc002407, 
 0x34a5f000, 0x800197c, 0x0, 0x8f830120, 
 0x27623800, 0x24660020, 0xc2102b, 0x50400001, 
@@ -615,10 +615,10 @@
 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 
 0x2e22021, 0x24020012, 0xac820000, 0x24020001, 
 0xac820004, 0x5600001d, 0x24100001, 0x3c040001, 
-0x24844aa0, 0xafa00010, 0xafa00014, 0x8ee60608, 
+0x24844ab0, 0xafa00010, 0xafa00014, 0x8ee60608, 
 0x8f470228, 0x3c050009, 0xc002407, 0x34a5f001, 
 0x8ee201b0, 0x24420001, 0xaee201b0, 0x800197c, 
-0x8ee201b0, 0x3c040001, 0x24844aac, 0xafa00014, 
+0x8ee201b0, 0x3c040001, 0x24844abc, 0xafa00014, 
 0x8ee60608, 0x8f470228, 0x3c050009, 0x34a5f005, 
 0xc002407, 0x0, 0x8ee201ac, 0x8021, 
 0x24420001, 0xaee201ac, 0x8ee201ac, 0x1200000c, 
@@ -626,7 +626,7 @@
 0x8f420238, 0x8ee30158, 0x24630001, 0xaee30158, 
 0x8ee30158, 0x800198c, 0xaee27278, 0x24020001, 
 0x3c010001, 0x370821, 0xa02283b0, 0x3c020001, 
-0x8c425488, 0x10400187, 0x0, 0x8ee27b84, 
+0x8c425498, 0x10400187, 0x0, 0x8ee27b84, 
 0x24430001, 0x284200c9, 0x144001a4, 0xaee37b84, 
 0x8ee204d4, 0x30420002, 0x14400119, 0xaee07b84, 
 0x8ee204d4, 0x3c030600, 0x34631000, 0x34420002, 
@@ -690,12 +690,12 @@
 0x56000006, 0x240b0001, 0x8f820054, 0x1221023, 
 0x2c420033, 0x1440ffa6, 0x0, 0x316300ff, 
 0x24020001, 0x10620022, 0x0, 0x3c040001, 
-0x24844a74, 0xafa00010, 0xafa00014, 0x8f860120, 
+0x24844a84, 0xafa00010, 0xafa00014, 0x8f860120, 
 0x8f870124, 0x3c050009, 0xc002407, 0x34a5f011, 
-0x8001aad, 0x0, 0x3c040001, 0x24844a80, 
+0x8001aad, 0x0, 0x3c040001, 0x24844a90, 
 0xafa00014, 0x8f860120, 0x8f870124, 0x3c050009, 
 0xc002407, 0x34a5f010, 0x8001aad, 0x0, 
-0x3c040001, 0x24844a8c, 0xafa00014, 0x8ee60608, 
+0x3c040001, 0x24844a9c, 0xafa00014, 0x8ee60608, 
 0x8f470228, 0x3c050009, 0xc002407, 0x34a5f00f, 
 0x8ee201ac, 0x24420001, 0xaee201ac, 0x8ee201ac, 
 0x8ee2015c, 0x24420001, 0xaee2015c, 0x8ee2015c, 
@@ -742,18 +742,18 @@
 0xaee2016c, 0x80022f4, 0x8ee2016c, 0x32c20001, 
 0x10400004, 0x24020001, 0xaf820064, 0x80022f4, 
 0x0, 0x32c20002, 0x1440000c, 0x3c050003, 
-0x3c040001, 0x24844b24, 0x34a50001, 0x2c03021, 
+0x3c040001, 0x24844b34, 0x34a50001, 0x2c03021, 
 0x3821, 0xafa00010, 0xc002407, 0xafa00014, 
 0x2402fff8, 0x80022f4, 0xaf820064, 0x8f43022c, 
 0x8f42010c, 0x5062000c, 0xafa00010, 0x8f42022c, 
 0x21080, 0x5a1021, 0x8c420300, 0xafa20020, 
 0x8f42022c, 0x24070001, 0x24420001, 0x3042003f, 
-0x8001b80, 0xaf42022c, 0x3c040001, 0x24844b30, 
+0x8001b80, 0xaf42022c, 0x3c040001, 0x24844b40, 
 0xafa00014, 0x8f46022c, 0x8f47010c, 0x3c050003, 
 0xc002407, 0x34a5f01f, 0x3821, 0x14e00003, 
 0x0, 0x80022ed, 0xaf960064, 0x93a20020, 
 0x2443ffff, 0x2c620011, 0x10400658, 0x31080, 
-0x3c010001, 0x220821, 0x8c224be8, 0x400008, 
+0x3c010001, 0x220821, 0x8c224bf8, 0x400008, 
 0x0, 0x8fa20020, 0x30420fff, 0xaee20e0c, 
 0x8f820060, 0x34420200, 0xaf820060, 0x8ee20118, 
 0x24420001, 0xaee20118, 0x80022e8, 0x8ee20118, 
@@ -769,7 +769,7 @@
 0x8f840054, 0x41442, 0x41c82, 0x431021, 
 0x41cc2, 0x431023, 0x41d02, 0x431021, 
 0x41d42, 0x431023, 0x8001bd0, 0xaee20078, 
-0x3c040001, 0x24844b3c, 0xafa00014, 0x8fa60020, 
+0x3c040001, 0x24844b4c, 0xafa00014, 0x8fa60020, 
 0x3c050003, 0xc002407, 0x34a50004, 0x8ee20110, 
 0x24420001, 0xaee20110, 0x80022e8, 0x8ee20110, 
 0x27440212, 0xc0022fe, 0x24050006, 0x3049001f, 
@@ -785,7 +785,7 @@
 0x2c820080, 0x1440fff8, 0x410c0, 0x4c10010, 
 0x618c0, 0x610c0, 0x571821, 0x8c63737c, 
 0x571021, 0xafa30010, 0x8c427380, 0x3c040001, 
-0x24844b48, 0xafa20014, 0x8f470214, 0x3c050003, 
+0x24844b58, 0xafa20014, 0x8f470214, 0x3c050003, 
 0xc002407, 0x34a50013, 0x8001c90, 0x3c020800, 
 0x97440212, 0x771021, 0xa444737e, 0x8f440214, 
 0x771021, 0x2e31821, 0xac447380, 0x34028000, 
@@ -803,7 +803,7 @@
 0x24840001, 0x2c820080, 0x1440fff8, 0x410c0, 
 0x4c10023, 0x618c0, 0x910c0, 0x571821, 
 0x8c63727c, 0x571021, 0xafa30010, 0x8c427280, 
-0x3c040001, 0x24844b54, 0xafa20014, 0x8f470214, 
+0x3c040001, 0x24844b64, 0xafa20014, 0x8f470214, 
 0x3c050003, 0xc002407, 0x34a5f017, 0x8001c90, 
 0x3c020800, 0x8f430210, 0xb71021, 0xac43777c, 
 0x8f430214, 0xb71021, 0xac437780, 0x3c020001, 
@@ -878,13 +878,13 @@
 0x2e22021, 0xac8a0000, 0xac8c0004, 0x54e00006, 
 0x240b0001, 0x8f820054, 0x1221023, 0x2c420033, 
 0x1440ffa6, 0x0, 0x316300ff, 0x24020001, 
-0x10620022, 0x0, 0x3c040001, 0x24844b60, 
+0x10620022, 0x0, 0x3c040001, 0x24844b70, 
 0xafa00010, 0xafa00014, 0x8f860120, 0x8f870124, 
 0x3c050009, 0xc002407, 0x34a5f011, 0x8001da0, 
-0x0, 0x3c040001, 0x24844b6c, 0xafa00014, 
+0x0, 0x3c040001, 0x24844b7c, 0xafa00014, 
 0x8f860120, 0x8f870124, 0x3c050009, 0xc002407, 
 0x34a5f010, 0x8001da0, 0x0, 0x3c040001, 
-0x24844b78, 0xafa00014, 0x8ee60608, 0x8f470228, 
+0x24844b88, 0xafa00014, 0x8ee60608, 0x8f470228, 
 0x3c050009, 0xc002407, 0x34a5f00f, 0x8ee201ac, 
 0x24420001, 0xaee201ac, 0x8ee201ac, 0x8ee20124, 
 0x24420001, 0xaee20124, 0x8001f97, 0x8ee20124, 
@@ -899,7 +899,7 @@
 0x1221004, 0x21027, 0x621824, 0xaf830228, 
 0x910c0, 0x2e21821, 0x3402c000, 0x8001e4e, 
 0xa462727c, 0x8f420214, 0xafa20010, 0x910c0, 
-0x571021, 0x8c42727c, 0x3c040001, 0x24844b84, 
+0x571021, 0x8c42727c, 0x3c040001, 0x24844b94, 
 0x3c050003, 0xafa20014, 0x8f470210, 0x34a5f01c, 
 0xc002407, 0x1203021, 0x8001e83, 0x3c020800, 
 0xb71021, 0x9443727e, 0x97420212, 0x14620019, 
@@ -927,7 +927,7 @@
 0x910c0, 0x2e41821, 0x3402c000, 0x15000015, 
 0xa462737c, 0x910c0, 0x2e21821, 0x34028000, 
 0x8001e4e, 0xa462727c, 0x571021, 0x8c42727c, 
-0x3c040001, 0x24844b90, 0x3c050003, 0xafa20010, 
+0x3c040001, 0x24844ba0, 0x3c050003, 0xafa20010, 
 0x710c0, 0x571021, 0x8c42737c, 0x34a5001e, 
 0x1203021, 0xc002407, 0xafa20014, 0x8001e83, 
 0x3c020800, 0x2021, 0x428c0, 0xb71021, 
@@ -1003,12 +1003,12 @@
 0xac8a0000, 0xac8c0004, 0x54e00006, 0x240b0001, 
 0x8f820054, 0x1221023, 0x2c420033, 0x1440ffa6, 
 0x0, 0x316300ff, 0x24020001, 0x10620022, 
-0x0, 0x3c040001, 0x24844b60, 0xafa00010, 
+0x0, 0x3c040001, 0x24844b70, 0xafa00010, 
 0xafa00014, 0x8f860120, 0x8f870124, 0x3c050009, 
 0xc002407, 0x34a5f011, 0x8001f93, 0x0, 
-0x3c040001, 0x24844b6c, 0xafa00014, 0x8f860120, 
+0x3c040001, 0x24844b7c, 0xafa00014, 0x8f860120, 
 0x8f870124, 0x3c050009, 0xc002407, 0x34a5f010, 
-0x8001f93, 0x0, 0x3c040001, 0x24844b78, 
+0x8001f93, 0x0, 0x3c040001, 0x24844b88, 
 0xafa00014, 0x8ee60608, 0x8f470228, 0x3c050009, 
 0xc002407, 0x34a5f00f, 0x8ee201ac, 0x24420001, 
 0xaee201ac, 0x8ee201ac, 0x8ee20128, 0x24420001, 
@@ -1020,7 +1020,7 @@
 0x8f820228, 0xaee204dc, 0x2402ffff, 0xaf820228, 
 0x24020001, 0x8001fbe, 0xa2e204d8, 0x92e204d8, 
 0x5040000c, 0xa2e004d8, 0x8ee204dc, 0xaf820228, 
-0x8001fbe, 0xa2e004d8, 0x3c040001, 0x24844b98, 
+0x8001fbe, 0xa2e004d8, 0x3c040001, 0x24844ba8, 
 0xafa00014, 0x8fa60020, 0x3c050003, 0xc002407, 
 0x34a5f009, 0x8ee2013c, 0x24420001, 0xaee2013c, 
 0x80022e8, 0x8ee2013c, 0x8fa20020, 0x21200, 
@@ -1031,7 +1031,7 @@
 0x370821, 0xa02283b2, 0x8001fea, 0xaee40108, 
 0x8f820220, 0x3c0308ff, 0x3463fff7, 0x431024, 
 0xaf820220, 0x3c010001, 0x370821, 0xa02083b2, 
-0x8001fea, 0xaee40108, 0x3c040001, 0x24844ba4, 
+0x8001fea, 0xaee40108, 0x3c040001, 0x24844bb4, 
 0xafa00014, 0x8fa60020, 0x3c050003, 0xc002407, 
 0x34a5f00a, 0x8ee2012c, 0x24420001, 0xaee2012c, 
 0x80022e8, 0x8ee2012c, 0x8fa20020, 0x21200, 
@@ -1043,13 +1043,13 @@
 0x571021, 0x904283b2, 0x3c010001, 0x370821, 
 0x1440000e, 0xa02083b3, 0x8f820220, 0x3c0308ff, 
 0x3463fff7, 0x431024, 0x8002018, 0xaf820220, 
-0x3c040001, 0x24844bb0, 0xafa00014, 0x8fa60020, 
+0x3c040001, 0x24844bc0, 0xafa00014, 0x8fa60020, 
 0x3c050003, 0xc002407, 0x34a5f00b, 0x8ee20114, 
 0x24420001, 0xaee20114, 0x80022e8, 0x8ee20114, 
 0x27840208, 0x27450200, 0xc00249e, 0x24060008, 
 0x26e40094, 0x27450200, 0xc00249e, 0x24060008, 
 0x8ee20134, 0x24420001, 0xaee20134, 0x80022e8, 
-0x8ee20134, 0x8f460248, 0x2021, 0xc004fa4, 
+0x8ee20134, 0x8f460248, 0x2021, 0xc004fa8, 
 0x24050004, 0x8ee20130, 0x24420001, 0xaee20130, 
 0x80022e8, 0x8ee20130, 0x8ef301cc, 0x8ef401d0, 
 0x8ef501d8, 0x8ee20140, 0x26e40030, 0x24420001, 
@@ -1063,7 +1063,7 @@
 0xaee20104, 0xaee40100, 0xaee3010c, 0x8f820220, 
 0x30420008, 0x10400004, 0x0, 0xaee30108, 
 0x8002061, 0x2021, 0xaee40108, 0x2021, 
-0x3c030001, 0x641821, 0x906353e0, 0x2e41021, 
+0x3c030001, 0x641821, 0x906353f0, 0x2e41021, 
 0x24840001, 0xa043009c, 0x2c82000f, 0x1440fff8, 
 0x0, 0x8f820040, 0x2e41821, 0x24840001, 
 0x21702, 0x24420030, 0xa062009c, 0x2e41021, 
@@ -1143,13 +1143,13 @@
 0x2e22021, 0xac8a0000, 0xac8c0004, 0x54e00006, 
 0x240b0001, 0x8f820054, 0x1221023, 0x2c420033, 
 0x1440ffa6, 0x0, 0x316300ff, 0x24020001, 
-0x10620022, 0x0, 0x3c040001, 0x24844b60, 
+0x10620022, 0x0, 0x3c040001, 0x24844b70, 
 0xafa00010, 0xafa00014, 0x8f860120, 0x8f870124, 
 0x3c050009, 0xc002407, 0x34a5f011, 0x80021c4, 
-0x0, 0x3c040001, 0x24844b6c, 0xafa00014, 
+0x0, 0x3c040001, 0x24844b7c, 0xafa00014, 
 0x8f860120, 0x8f870124, 0x3c050009, 0xc002407, 
 0x34a5f010, 0x80021c4, 0x0, 0x3c040001, 
-0x24844b78, 0xafa00014, 0x8ee60608, 0x8f470228, 
+0x24844b88, 0xafa00014, 0x8ee60608, 0x8f470228, 
 0x3c050009, 0xc002407, 0x34a5f00f, 0x8ee201ac, 
 0x24420001, 0xaee201ac, 0x8ee201ac, 0x8ee20120, 
 0x24420001, 0xaee20120, 0x8ee20120, 0x8ee20168, 
@@ -1159,7 +1159,7 @@
 0x8f820220, 0x30420008, 0x14400002, 0x24020001, 
 0x24020002, 0xaee20108, 0x8ee2011c, 0x24420001, 
 0xaee2011c, 0x80022e8, 0x8ee2011c, 0x3c040001, 
-0x24844bbc, 0xafa00010, 0xafa00014, 0x8fa60020, 
+0x24844bcc, 0xafa00010, 0xafa00014, 0x8fa60020, 
 0x3c050003, 0xc002407, 0x34a5f00f, 0x93a20020, 
 0x3c030700, 0x34631000, 0x431025, 0xafa20018, 
 0x8ee20608, 0x8f430228, 0x24420001, 0x304900ff, 
@@ -1190,7 +1190,7 @@
 0x1021, 0x8ee24e30, 0x24420001, 0xaee24e30, 
 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 
 0x24020007, 0xac820000, 0x24020001, 0xac820004, 
-0x54e0000c, 0xaee90608, 0x3c040001, 0x24844bc4, 
+0x54e0000c, 0xaee90608, 0x3c040001, 0x24844bd4, 
 0xafa00010, 0xafa00014, 0x8ee60608, 0x8f470228, 
 0x3c050009, 0xc002407, 0x34a5f000, 0x80022e0, 
 0x0, 0x8f830120, 0x27623800, 0x24660020, 
@@ -1216,11 +1216,11 @@
 0x8ee24e30, 0x24420001, 0xaee24e30, 0x8ee24e30, 
 0x210c0, 0x24425038, 0x2e22021, 0x24020012, 
 0xac820000, 0x24020001, 0xac820004, 0x14e0001b, 
-0x0, 0x3c040001, 0x24844bcc, 0xafa00010, 
+0x0, 0x3c040001, 0x24844bdc, 0xafa00010, 
 0xafa00014, 0x8ee60608, 0x8f470228, 0x3c050009, 
 0xc002407, 0x34a5f001, 0x8ee201b0, 0x24420001, 
 0xaee201b0, 0x80022e0, 0x8ee201b0, 0x3c040001, 
-0x24844bd8, 0xafa00014, 0x8ee60608, 0x8f470228, 
+0x24844be8, 0xafa00014, 0x8ee60608, 0x8f470228, 
 0x3c050009, 0xc002407, 0x34a5f005, 0x8ee201ac, 
 0x24420001, 0xaee201ac, 0x8ee201ac, 0x8ee20150, 
 0x24420001, 0xaee20150, 0x8ee20150, 0x8ee20160, 
@@ -1247,7 +1247,7 @@
 0xaf82011c, 0x8fbf0010, 0x3e00008, 0x27bd0018, 
 0x27bdffe0, 0xafbf0018, 0x8f820104, 0xafa20010, 
 0x8f820100, 0x3c050002, 0xafa20014, 0x8f8600b0, 
-0x8f87011c, 0x3c040001, 0x24844c8c, 0xc002407, 
+0x8f87011c, 0x3c040001, 0x24844ca0, 0xc002407, 
 0x34a5f000, 0x8f8300b0, 0x3c027f00, 0x621824, 
 0x3c020400, 0x1062002b, 0x43102b, 0x14400008, 
 0x3c022000, 0x3c020100, 0x10620026, 0x3c020200, 
@@ -1264,7 +1264,7 @@
 0x8fbf0018, 0x3e00008, 0x27bd0020, 0x27bdffe0, 
 0xafbf001c, 0xafb00018, 0x8f820120, 0xafa20010, 
 0x8f820124, 0x3c050001, 0xafa20014, 0x8f8600a0, 
-0x8f87011c, 0x3c040001, 0x24844c98, 0xc002407, 
+0x8f87011c, 0x3c040001, 0x24844cac, 0xc002407, 
 0x34a5f000, 0x8f8300a0, 0x3c027f00, 0x621824, 
 0x3c020400, 0x10620055, 0x8021, 0x43102b, 
 0x14400008, 0x3c042000, 0x3c020100, 0x1062004f, 
@@ -1290,43 +1290,43 @@
 0xaee2019c, 0x80023e7, 0x8ee2019c, 0x8f8200a0, 
 0x34420001, 0xaf8200a0, 0x8fbf001c, 0x8fb00018, 
 0x3e00008, 0x27bd0020, 0x0, 0x3c020001, 
-0x8c425408, 0x27bdffe8, 0xafbf0014, 0x14400012, 
-0xafb00010, 0x3c100001, 0x26105550, 0x2002021, 
+0x8c425418, 0x27bdffe8, 0xafbf0014, 0x14400012, 
+0xafb00010, 0x3c100001, 0x26105560, 0x2002021, 
 0xc00248c, 0x24052000, 0x26021fe0, 0x3c010001, 
-0xac225524, 0x3c010001, 0xac225520, 0xaf420250, 
+0xac225534, 0x3c010001, 0xac225530, 0xaf420250, 
 0x24022000, 0xaf500254, 0xaf420258, 0x24020001, 
-0x3c010001, 0xac225408, 0x8fbf0014, 0x8fb00010, 
-0x3e00008, 0x27bd0018, 0x3c030001, 0x8c635524, 
+0x3c010001, 0xac225418, 0x8fbf0014, 0x8fb00010, 
+0x3e00008, 0x27bd0018, 0x3c030001, 0x8c635534, 
 0x8c820000, 0x8fa80010, 0x8fa90014, 0xac620000, 
-0x3c020001, 0x8c425524, 0x8c830004, 0xac430004, 
+0x3c020001, 0x8c425534, 0x8c830004, 0xac430004, 
 0xac450008, 0x8f840054, 0x2443ffe0, 0xac460010, 
 0xac470014, 0xac480018, 0xac49001c, 0x3c010001, 
-0xac235524, 0xac44000c, 0x3c020001, 0x24425550, 
+0xac235534, 0xac44000c, 0x3c020001, 0x24425560, 
 0x62182b, 0x10600005, 0x0, 0x3c020001, 
-0x8c425520, 0x3c010001, 0xac225524, 0x3c030001, 
-0x8c635524, 0x3c020001, 0x8c4253f0, 0xac620000, 
-0x3c030001, 0x8c635524, 0x3c020001, 0x8c4253f0, 
+0x8c425530, 0x3c010001, 0xac225534, 0x3c030001, 
+0x8c635534, 0x3c020001, 0x8c425400, 0xac620000, 
+0x3c030001, 0x8c635534, 0x3c020001, 0x8c425400, 
 0xac620004, 0x3e00008, 0xaf430250, 0x3c030001, 
-0x8c635524, 0x3c020001, 0x8c4253f0, 0x27bdffd0, 
+0x8c635534, 0x3c020001, 0x8c425400, 0x27bdffd0, 
 0xafb40020, 0x8fb40040, 0xafb00010, 0x808021, 
 0xafb50024, 0x8fb50044, 0x8fa40048, 0xafb10014, 
 0xa08821, 0xafbf0028, 0xafb3001c, 0xafb20018, 
-0xac620000, 0x3c050001, 0x8ca55524, 0x3c020001, 
-0x8c4253f0, 0xc09021, 0xe09821, 0x10800006, 
+0xac620000, 0x3c050001, 0x8ca55534, 0x3c020001, 
+0x8c425400, 0xc09021, 0xe09821, 0x10800006, 
 0xaca20004, 0x24a50008, 0xc002494, 0x24060018, 
 0x8002452, 0x0, 0x24a40008, 0xc00248c, 
-0x24050018, 0x3c020001, 0x8c425524, 0x3c050001, 
-0x24a55550, 0x2442ffe0, 0x3c010001, 0xac225524, 
+0x24050018, 0x3c020001, 0x8c425534, 0x3c050001, 
+0x24a55560, 0x2442ffe0, 0x3c010001, 0xac225534, 
 0x45102b, 0x10400005, 0x0, 0x3c020001, 
-0x8c425520, 0x3c010001, 0xac225524, 0x3c030001, 
-0x8c635524, 0x8e020000, 0xac620000, 0x3c030001, 
-0x8c635524, 0x8e020004, 0xac620004, 0xac710008, 
-0x8f840054, 0x2462ffe0, 0x3c010001, 0xac225524, 
+0x8c425530, 0x3c010001, 0xac225534, 0x3c030001, 
+0x8c635534, 0x8e020000, 0xac620000, 0x3c030001, 
+0x8c635534, 0x8e020004, 0xac620004, 0xac710008, 
+0x8f840054, 0x2462ffe0, 0x3c010001, 0xac225534, 
 0x45102b, 0xac720010, 0xac730014, 0xac740018, 
 0xac75001c, 0x10400005, 0xac64000c, 0x3c020001, 
-0x8c425520, 0x3c010001, 0xac225524, 0x3c030001, 
-0x8c635524, 0x3c020001, 0x8c4253f0, 0xac620000, 
-0x3c030001, 0x8c635524, 0x3c020001, 0x8c4253f0, 
+0x8c425530, 0x3c010001, 0xac225534, 0x3c030001, 
+0x8c635534, 0x3c020001, 0x8c425400, 0xac620000, 
+0x3c030001, 0x8c635534, 0x3c020001, 0x8c425400, 
 0xac620004, 0xaf430250, 0x8fbf0028, 0x8fb50024, 
 0x8fb40020, 0x8fb3001c, 0x8fb20018, 0x8fb10014, 
 0x8fb00010, 0x3e00008, 0x27bd0030, 0x10a00005, 
@@ -1372,7 +1372,7 @@
 0x210c0, 0x24424e38, 0x2e22021, 0x24020005, 
 0xac820000, 0x24020001, 0xac820004, 0x1520000a, 
 0x3c040001, 0xafab0010, 0x8ee27264, 0x3c040001, 
-0x24844f00, 0x3c050004, 0xafa20014, 0x8ee604e4, 
+0x24844f10, 0x3c050004, 0xafa20014, 0x8ee604e4, 
 0x80028c2, 0x34a5f114, 0x8ee27264, 0x34843800, 
 0x3641821, 0x24420010, 0x43102b, 0x14400073, 
 0x0, 0x8ee27264, 0x24480010, 0x3641021, 
@@ -1401,7 +1401,7 @@
 0x210c0, 0x24424e38, 0x2e22021, 0x24020005, 
 0xac820000, 0x24020001, 0xac820004, 0x1520000a, 
 0x2508fffc, 0xafab0010, 0x8ee27264, 0x3c040001, 
-0x24844f00, 0x3c050004, 0xafa20014, 0x8ee604e4, 
+0x24844f10, 0x3c050004, 0xafa20014, 0x8ee604e4, 
 0x80028c2, 0x34a5f125, 0x34028100, 0xa5020000, 
 0x9582000e, 0x8002621, 0xa5020002, 0x8f850100, 
 0x27623000, 0x24a60020, 0xc2102b, 0x50400001, 
@@ -1428,7 +1428,7 @@
 0x8ee24e28, 0x210c0, 0x24424e38, 0x2e22021, 
 0x24020005, 0xac820000, 0x24020001, 0xac820004, 
 0x1520000a, 0x34028100, 0xafab0010, 0x8ee27264, 
-0x3c040001, 0x24844f00, 0x3c050004, 0xafa20014, 
+0x3c040001, 0x24844f10, 0x3c050004, 0xafa20014, 
 0x8ee604e4, 0x80028c2, 0x34a5f015, 0x8ee37264, 
 0xa462000c, 0x8ee37264, 0x9582000e, 0xa462000e, 
 0x8002685, 0x24e70004, 0x8f840100, 0x27623000, 
@@ -1454,7 +1454,7 @@
 0x24420001, 0xaee24e28, 0x8ee24e28, 0x210c0, 
 0x24424e38, 0x2e22021, 0x24020005, 0xac820000, 
 0x24020001, 0xac820004, 0x15200009, 0x3c050004, 
-0xafab0010, 0x8ee27264, 0x3c040001, 0x24844f00, 
+0xafab0010, 0x8ee27264, 0x3c040001, 0x24844f10, 
 0xafa20014, 0x8ee604e4, 0x80028c2, 0x34a5f004, 
 0x8ee2725c, 0x30e7ffff, 0x471021, 0xaee2725c, 
 0x8ee204e4, 0x8ee304fc, 0x8ee47258, 0x21100, 
@@ -1474,7 +1474,7 @@
 0x8f8200f0, 0x24090001, 0x8fa30018, 0x8fa4001c, 
 0xac430000, 0xac440004, 0xaf8700f0, 0x15200012, 
 0xd1142, 0x8f8200f0, 0xafa20010, 0x8f8200f4, 
-0x3c040001, 0x24844f0c, 0xafa20014, 0x8fa60018, 
+0x3c040001, 0x24844f1c, 0xafa20014, 0x8fa60018, 
 0x8fa7001c, 0x3c050004, 0xc002407, 0x34a5f005, 
 0x8ee20088, 0x24420001, 0xaee20088, 0x8ee20088, 
 0x80028d7, 0xaee0725c, 0x30430003, 0x24020002, 
@@ -1516,7 +1516,7 @@
 0xaee24e28, 0x8ee24e28, 0x210c0, 0x24424e38, 
 0x2e22021, 0x24020005, 0xac820000, 0x24020001, 
 0xac820004, 0x1520000a, 0x3c040001, 0xafab0010, 
-0x8ee27264, 0x3c040001, 0x24844f00, 0x3c050004, 
+0x8ee27264, 0x3c040001, 0x24844f10, 0x3c050004, 
 0xafa20014, 0x8ee604e4, 0x80028c2, 0x34a5f014, 
 0x8ee27264, 0x34843800, 0x3641821, 0x24420010, 
 0x43102b, 0x14400073, 0x0, 0x8ee27264, 
@@ -1545,7 +1545,7 @@
 0xaee24e28, 0x8ee24e28, 0x210c0, 0x24424e38, 
 0x2e22021, 0x24020005, 0xac820000, 0x24020001, 
 0xac820004, 0x1520000a, 0x2508fffc, 0xafab0010, 
-0x8ee27264, 0x3c040001, 0x24844f00, 0x3c050004, 
+0x8ee27264, 0x3c040001, 0x24844f10, 0x3c050004, 
 0xafa20014, 0x8ee604e4, 0x80028c2, 0x34a5f015, 
 0x34028100, 0xa5020000, 0x9582000e, 0x8002863, 
 0xa5020002, 0x8f850100, 0x27623000, 0x24a60020, 
@@ -1572,7 +1572,7 @@
 0x24420001, 0xaee24e28, 0x8ee24e28, 0x210c0, 
 0x24424e38, 0x2e22021, 0x24020005, 0xac820000, 
 0x24020001, 0xac820004, 0x1520000a, 0x34028100, 
-0xafab0010, 0x8ee27264, 0x3c040001, 0x24844f00, 
+0xafab0010, 0x8ee27264, 0x3c040001, 0x24844f10, 
 0x3c050004, 0xafa20014, 0x8ee604e4, 0x80028c2, 
 0x34a5f016, 0x8ee37264, 0xa462000c, 0x8ee37264, 
 0x9582000e, 0xa462000e, 0x80028c6, 0x24e70004, 
@@ -1598,7 +1598,7 @@
 0xaee24e28, 0x8ee24e28, 0x210c0, 0x24424e38, 
 0x2e22021, 0x24020005, 0xac820000, 0x24020001, 
 0xac820004, 0x1520000b, 0x3c050004, 0x3c040001, 
-0x24844f18, 0xafab0010, 0xafa00014, 0x8ee604e4, 
+0x24844f28, 0xafab0010, 0xafa00014, 0x8ee604e4, 
 0x34a5f017, 0xc002407, 0x30e7ffff, 0x80028e5, 
 0x0, 0x8ee27264, 0x3c050001, 0x30e4ffff, 
 0x441021, 0xaee27264, 0x8ee2725c, 0x8ee37264, 
@@ -1664,7 +1664,7 @@
 0x24420001, 0xaee24e28, 0x8ee24e28, 0x210c0, 
 0x24424e38, 0x2e22021, 0x24020005, 0xac820000, 
 0x24020001, 0xac820004, 0x1540000a, 0x24020001, 
-0xafa90010, 0x8ee27264, 0x3c040001, 0x24844f00, 
+0xafa90010, 0x8ee27264, 0x3c040001, 0x24844f10, 
 0x3c050004, 0xafa20014, 0x8ee604e4, 0x8002a53, 
 0x34a5f204, 0xa2e204ed, 0x8ee204e8, 0x8ee304fc, 
 0x8ee47258, 0x3c060001, 0x34c63800, 0x3c010001, 
@@ -1698,7 +1698,7 @@
 0xaee24e28, 0x8ee24e28, 0x210c0, 0x24424e38, 
 0x2e22021, 0x24020005, 0xac820000, 0x24020001, 
 0xac820004, 0x1540000c, 0x30e5ffff, 0x3c040001, 
-0x24844f18, 0x3c050004, 0xafa90010, 0xafa00014, 
+0x24844f28, 0x3c050004, 0xafa90010, 0xafa00014, 
 0x8ee604e4, 0x34a5f237, 0xc002407, 0x30e7ffff, 
 0x8002a76, 0x0, 0x8ee27264, 0x451021, 
 0xaee27264, 0x8ee2726c, 0x8ee37264, 0x3c040001, 
@@ -1722,7 +1722,7 @@
 0x8f830108, 0x21140, 0x621821, 0xaf830108, 
 0xac800000, 0x8cc20018, 0x2443fffe, 0x2c620013, 
 0x104000c1, 0x31080, 0x3c010001, 0x220821, 
-0x8c224f40, 0x400008, 0x0, 0x8ee204f0, 
+0x8c224f50, 0x400008, 0x0, 0x8ee204f0, 
 0x471021, 0xaee204f0, 0x8ee204f0, 0x8f43023c, 
 0x43102b, 0x144000be, 0x0, 0x8ee304e4, 
 0x8ee204f8, 0x506200ba, 0xa2e004f4, 0x8f830120, 
@@ -1749,7 +1749,7 @@
 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 
 0x2e22021, 0x24020012, 0xac820000, 0x24020001, 
 0xac820004, 0x5600000b, 0x24100001, 0x8ee204e4, 
-0x3c040001, 0x24844f24, 0xafa00014, 0xafa20010, 
+0x3c040001, 0x24844f34, 0xafa00014, 0xafa20010, 
 0x8ee60608, 0x8f470228, 0x3c050009, 0xc002407, 
 0x34a5f006, 0x16000003, 0x24020001, 0x8002b75, 
 0xa2e204f4, 0x8ee20170, 0x24420001, 0xaee20170, 
@@ -1770,7 +1770,7 @@
 0x8002b75, 0xaee20000, 0x8ee2014c, 0x3c010001, 
 0x370821, 0xa02083e0, 0x24420001, 0xaee2014c, 
 0x8002b75, 0x8ee2014c, 0x94c7000e, 0x8cc2001c, 
-0x3c040001, 0x24844f30, 0xafa60014, 0xafa20010, 
+0x3c040001, 0x24844f40, 0xafa60014, 0xafa20010, 
 0x8cc60018, 0x3c050008, 0xc002407, 0x34a50910, 
 0x8fbf001c, 0x8fb00018, 0x3e00008, 0x27bd0020, 
 0x27bdff98, 0xafbf0060, 0xafbe005c, 0xafb60058, 
@@ -1779,7 +1779,7 @@
 0xafa00024, 0x106203e7, 0xafa0002c, 0x3c1e0001, 
 0x37de3800, 0x3c0bffff, 0x8f930108, 0x8e620018, 
 0x8f830104, 0x2443fffe, 0x2c620014, 0x104003cf, 
-0x31080, 0x3c010001, 0x220821, 0x8c224f90, 
+0x31080, 0x3c010001, 0x220821, 0x8c224fa0, 
 0x400008, 0x0, 0x9663000e, 0x8ee2725c, 
 0x8ee404f0, 0x431021, 0xaee2725c, 0x8e63001c, 
 0x96e20458, 0x24840001, 0xaee404f0, 0x24630001, 
@@ -1808,7 +1808,7 @@
 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 
 0x2e22021, 0x24020012, 0x240c0001, 0xac820000, 
 0xac8c0004, 0x5600000d, 0x24100001, 0x8ee204e4, 
-0x3c040001, 0x24844f24, 0xafa00014, 0xafa20010, 
+0x3c040001, 0x24844f34, 0xafa00014, 0xafa20010, 
 0x8ee60608, 0x8f470228, 0x3c050009, 0x34a5f006, 
 0xc002407, 0xafab0038, 0x8fab0038, 0x1200030a, 
 0x240c0001, 0x8002f1d, 0x0, 0x966c001c, 
@@ -2002,7 +2002,7 @@
 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 
 0x24425038, 0x2e22021, 0x24020012, 0x240c0001, 
 0xac820000, 0xac8c0004, 0x5600000d, 0x24100001, 
-0x8ee204e4, 0x3c040001, 0x24844f24, 0xafa00014, 
+0x8ee204e4, 0x3c040001, 0x24844f34, 0xafa00014, 
 0xafa20010, 0x8ee60608, 0x8f470228, 0x3c050009, 
 0x34a5f006, 0xc002407, 0xafab0038, 0x8fab0038, 
 0x16000003, 0x240c0001, 0x8002f60, 0xa2ec04f4, 
@@ -2057,7 +2057,7 @@
 0x8821, 0x8f8200e4, 0x24110001, 0x8c430000, 
 0x8c440004, 0xafa30018, 0xafa4001c, 0x1620000e, 
 0x3c02ffff, 0x8f8200c4, 0xafa20010, 0x8f8200c8, 
-0x3c040001, 0x24845040, 0xafa20014, 0x8f8600e0, 
+0x3c040001, 0x24845050, 0xafa20014, 0x8f8600e0, 
 0x8f8700e4, 0x3c050006, 0xc002407, 0x34a5f000, 
 0x80034d0, 0x0, 0x8fa3001c, 0x8fb20018, 
 0x3074ffff, 0x2694fffc, 0x621024, 0x10400058, 
@@ -2155,11 +2155,11 @@
 0x862021, 0xaee400c0, 0xaee500c4, 0x8ee20058, 
 0x24420001, 0xaee20058, 0x8ee20058, 0x8ee2007c, 
 0x24420001, 0xaee2007c, 0x8ee2007c, 0x8f8200e0, 
-0xafa20010, 0x8f8200e4, 0x3c040001, 0x24845048, 
+0xafa20010, 0x8f8200e4, 0x3c040001, 0x24845058, 
 0xafa20014, 0x8fa60018, 0x8fa7001c, 0x3c050006, 
 0xc002407, 0x34a5f003, 0x80034d0, 0x0, 
 0x8ee25240, 0xafa20010, 0x8ee25244, 0x3c040001, 
-0x24845054, 0xafa20014, 0x8ee60e10, 0x8ee70e18, 
+0x24845064, 0xafa20014, 0x8ee60e10, 0x8ee70e18, 
 0x3c050006, 0xc002407, 0x34a5f002, 0x8ee201c0, 
 0x24420001, 0xaee201c0, 0x8ee20000, 0x8ee301c0, 
 0x2403ffbf, 0x431024, 0x8003474, 0xaee20000, 
@@ -2211,7 +2211,7 @@
 0x50550003, 0x1021, 0x8ee24e30, 0x24420001, 
 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 
 0x2e22021, 0xac960000, 0xac9e0004, 0x16200018, 
-0x3c050006, 0x8e020018, 0x3c040001, 0x24845060, 
+0x3c050006, 0x8e020018, 0x3c040001, 0x24845070, 
 0xafa20010, 0x8e020000, 0x8e030004, 0x34a5f009, 
 0x2003021, 0xc002407, 0xafa30014, 0x93a20037, 
 0x10400216, 0x340f8100, 0x8e420004, 0x8e430008, 
@@ -2244,7 +2244,7 @@
 0x210c0, 0x24425038, 0x2e22021, 0xac960000, 
 0xac9e0004, 0x1620000d, 0x0, 0xa60c000a, 
 0xa60a000e, 0x8f820100, 0xafa20010, 0x8f820104, 
-0x3c040001, 0x2484506c, 0x3c050006, 0xafa20014, 
+0x3c040001, 0x2484507c, 0x3c050006, 0xafa20014, 
 0x8ee6724c, 0x800343f, 0x34a5f00b, 0x3c010001, 
 0x370821, 0xa02083c0, 0xadab0000, 0x8ee201d8, 
 0x8ee3724c, 0x2442ffff, 0xaee201d8, 0x8ee201d8, 
@@ -2276,7 +2276,7 @@
 0x1021, 0x8ee24e30, 0x24420001, 0xaee24e30, 
 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 
 0xac8e0000, 0xac9e0004, 0x5620000d, 0x24110001, 
-0x8ee2724c, 0x3c040001, 0x24845078, 0xafa00014, 
+0x8ee2724c, 0x3c040001, 0x24845088, 0xafa00014, 
 0xafa20010, 0x8ee6724c, 0x8f470280, 0x3c050009, 
 0x34a5f008, 0xc002407, 0xafae0048, 0x8fae0048, 
 0x56200001, 0xaee00e1c, 0x8ee20188, 0x24420001, 
@@ -2303,7 +2303,7 @@
 0x8ee24e30, 0x24420001, 0xaee24e30, 0x8ee24e30, 
 0x210c0, 0x24425038, 0x2e22021, 0xac8e0000, 
 0xac9e0004, 0x1620000d, 0x0, 0x8ee2724c, 
-0x3c040001, 0x24845078, 0xafa00014, 0xafa20010, 
+0x3c040001, 0x24845088, 0xafa00014, 0xafa20010, 
 0x8ee6724c, 0x8f470280, 0x3c050009, 0x34a5f008, 
 0xc002407, 0xafae0048, 0x8fae0048, 0x8ee20174, 
 0x24420001, 0xaee20174, 0x8ee20174, 0x8003472, 
@@ -2333,7 +2333,7 @@
 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 
 0xac960000, 0xac9e0004, 0x1620001d, 0x0, 
 0xa60c000a, 0x8f820100, 0xafa20010, 0x8f820104, 
-0x3c040001, 0x2484506c, 0x3c050006, 0xafa20014, 
+0x3c040001, 0x2484507c, 0x3c050006, 0xafa20014, 
 0x8ee6724c, 0x34a5f00d, 0xc002407, 0x2003821, 
 0x93a20037, 0x10400031, 0x340f8100, 0x8e420004, 
 0x8e430008, 0x8e44000c, 0xa64f000c, 0xae420000, 
@@ -2395,7 +2395,7 @@
 0x10430007, 0x4821, 0x8f8200e4, 0x24090001, 
 0x8c430000, 0x8c440004, 0xafa30018, 0xafa4001c, 
 0x1520000e, 0x3c02ffff, 0x8f8200c4, 0xafa20010, 
-0x8f8200c8, 0x3c040001, 0x24845040, 0xafa20014, 
+0x8f8200c8, 0x3c040001, 0x24845050, 0xafa20014, 
 0x8f8600e0, 0x8f8700e4, 0x3c050006, 0xc002407, 
 0x34a5f000, 0x8003854, 0x0, 0x8fa3001c, 
 0x8fb20018, 0x3073ffff, 0x2673fffc, 0x621024, 
@@ -2493,15 +2493,15 @@
 0x862021, 0xaee400c0, 0xaee500c4, 0x8ee20058, 
 0x24420001, 0xaee20058, 0x8ee20058, 0x8ee2007c, 
 0x24420001, 0xaee2007c, 0x8ee2007c, 0x8f8200e0, 
-0xafa20010, 0x8f8200e4, 0x3c040001, 0x24845048, 
+0xafa20010, 0x8f8200e4, 0x3c040001, 0x24845058, 
 0xafa20014, 0x8fa60018, 0x8fa7001c, 0x3c050006, 
 0xc002407, 0x34a5f003, 0x8003854, 0x0, 
 0x8ee25240, 0xafa20010, 0x8ee25244, 0x3c040001, 
-0x24845054, 0xafa20014, 0x8ee60e10, 0x8ee70e18, 
+0x24845064, 0xafa20014, 0x8ee60e10, 0x8ee70e18, 
 0xc002407, 0x34a5f002, 0x8ee201c0, 0x24420001, 
 0xaee201c0, 0x8ee20000, 0x8ee301c0, 0x2403ffbf, 
 0x431024, 0x80037fc, 0xaee20000, 0x8ee25240, 
-0xafa20010, 0x8ee25244, 0x3c040001, 0x24845054, 
+0xafa20010, 0x8ee25244, 0x3c040001, 0x24845064, 
 0xafa20014, 0x8ee60e10, 0x8ee70e18, 0x3c050006, 
 0xc002407, 0x34a5f002, 0x8ee201c0, 0x24420001, 
 0xaee201c0, 0x80037fc, 0x8ee201c0, 0x96e20468, 
@@ -2560,7 +2560,7 @@
 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 
 0x24425038, 0x2e22021, 0x24020007, 0xac820000, 
 0x24020001, 0xac820004, 0x15200018, 0x3c050006, 
-0x8e020018, 0x3c040001, 0x24845060, 0xafa20010, 
+0x8e020018, 0x3c040001, 0x24845070, 0xafa20010, 
 0x8e020000, 0x8e030004, 0x34a5f009, 0x2003021, 
 0xc002407, 0xafa30014, 0x32c200ff, 0x1040002b, 
 0x34028100, 0x8e430004, 0x8e440008, 0x8e45000c, 
@@ -2620,7 +2620,7 @@
 0x10430007, 0x3821, 0x8f8200e4, 0x24070001, 
 0x8c430000, 0x8c440004, 0xafa30018, 0xafa4001c, 
 0x14e0000e, 0x3c02ffff, 0x8f8200c4, 0xafa20010, 
-0x8f8200c8, 0x3c040001, 0x24845084, 0xafa20014, 
+0x8f8200c8, 0x3c040001, 0x24845094, 0xafa20014, 
 0x8f8600e0, 0x8f8700e4, 0x3c050006, 0xc002407, 
 0x34a5f200, 0x8003c5f, 0x0, 0x8fa3001c, 
 0x8fb20018, 0x3073ffff, 0x2673fffc, 0x621024, 
@@ -2718,11 +2718,11 @@
 0x862021, 0xaee400c0, 0xaee500c4, 0x8ee20058, 
 0x24420001, 0xaee20058, 0x8ee20058, 0x8ee2007c, 
 0x24420001, 0xaee2007c, 0x8ee2007c, 0x8f8200e0, 
-0xafa20010, 0x8f8200e4, 0x3c040001, 0x24845090, 
+0xafa20010, 0x8f8200e4, 0x3c040001, 0x248450a0, 
 0xafa20014, 0x8fa60018, 0x8fa7001c, 0x3c050006, 
 0xc002407, 0x34a5f203, 0x8003c5f, 0x0, 
 0x8ee25240, 0xafa20010, 0x8ee25244, 0x3c040001, 
-0x2484509c, 0xafa20014, 0x8ee60e10, 0x8ee70e18, 
+0x248450ac, 0xafa20014, 0x8ee60e10, 0x8ee70e18, 
 0x3c050006, 0xc002407, 0x34a5f202, 0x8ee201c0, 
 0x24420001, 0xaee201c0, 0x8003c06, 0x8ee201c0, 
 0x96e20468, 0x53102b, 0x54400001, 0x3c168000, 
@@ -2818,7 +2818,7 @@
 0x1021, 0x8ee24e30, 0x24420001, 0xaee24e30, 
 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 
 0x24020007, 0xac820000, 0x24020001, 0xac820004, 
-0x14e00019, 0x3c050006, 0x3c040001, 0x24845060, 
+0x14e00019, 0x3c050006, 0x3c040001, 0x24845070, 
 0x8e220018, 0x34a5f209, 0xafa20010, 0x8e220000, 
 0x8e230004, 0x2203021, 0x1603821, 0xc002407, 
 0xafa30014, 0x93a2002f, 0x1040002a, 0x34028100, 
@@ -2882,7 +2882,7 @@
 0x24020001, 0xac620004, 0x1480000e, 0x24030040, 
 0x8ee20e14, 0xafa20010, 0x8ee20e18, 0x3c050007, 
 0xafa20014, 0x8ee60e0c, 0x8ee70e10, 0x3c040001, 
-0x248450a4, 0xc002407, 0x34a5f001, 0x8003ce1, 
+0x248450b4, 0xc002407, 0x34a5f001, 0x8003ce1, 
 0x0, 0x8ee20500, 0x24420001, 0x50430003, 
 0x1021, 0x8ee20500, 0x24420001, 0xaee20500, 
 0x8ee20500, 0x21080, 0x571021, 0xac490508, 
@@ -2914,7 +2914,7 @@
 0x24020003, 0xac620000, 0x24020001, 0xac620004, 
 0x1480000e, 0x24030040, 0x8ee2523c, 0xafa20010, 
 0x8ee25244, 0x3c050007, 0xafa20014, 0x8ee65238, 
-0x8ee75240, 0x3c040001, 0x248450b0, 0xc002407, 
+0x8ee75240, 0x3c040001, 0x248450c0, 0xc002407, 
 0x34a5f010, 0x8003d63, 0x0, 0x8ee20500, 
 0x24420001, 0x50430003, 0x1021, 0x8ee20500, 
 0x24420001, 0xaee20500, 0x8ee20500, 0x21080, 
@@ -2934,7 +2934,7 @@
 0x8f830128, 0x21140, 0x621821, 0xaf830128, 
 0xaca00000, 0x8cc20018, 0x2443fffe, 0x2c620012, 
 0x10400008, 0x31080, 0x3c010001, 0x220821, 
-0x8c2250c0, 0x400008, 0x0, 0x24020001, 
+0x8c2250d0, 0x400008, 0x0, 0x24020001, 
 0xaee24e24, 0x3e00008, 0x0, 0x27bdffc8, 
 0xafbf0030, 0xafb5002c, 0xafb40028, 0xafb30024, 
 0xafb20020, 0xafb1001c, 0xafb00018, 0x8f830128, 
@@ -2943,7 +2943,7 @@
 0x24140040, 0x8f8c0128, 0x8f820128, 0x24420020, 
 0xaf820128, 0x9182001b, 0x8f830128, 0x2443fffe, 
 0x2c620012, 0x1040029c, 0x31080, 0x3c010001, 
-0x220821, 0x8c225118, 0x400008, 0x0, 
+0x220821, 0x8c225128, 0x400008, 0x0, 
 0x8f420218, 0x30420100, 0x10400007, 0x0, 
 0x95830016, 0x95820018, 0x621823, 0x31402, 
 0x431021, 0xa5820016, 0x8d82001c, 0x3c038000, 
@@ -3044,7 +3044,7 @@
 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 
 0x24425038, 0x2e22021, 0x24020007, 0xac820000, 
 0x24020001, 0xac820004, 0x1600000d, 0x0, 
-0x8f820120, 0x3c040001, 0x24845108, 0xafa00014, 
+0x8f820120, 0x3c040001, 0x24845118, 0xafa00014, 
 0xafa20010, 0x8d86001c, 0x8f870124, 0x3c050008, 
 0xc002407, 0x34a50001, 0x800405b, 0x0, 
 0x8ee2724c, 0x24420001, 0x304207ff, 0x11a00006, 
@@ -3079,7 +3079,7 @@
 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 
 0x24425038, 0x2e22021, 0x24020001, 0xac950000, 
 0xac820004, 0x5600000b, 0x24100001, 0x8ee2724c, 
-0x3c040001, 0x24845078, 0xafa00014, 0xafa20010, 
+0x3c040001, 0x24845088, 0xafa00014, 0xafa20010, 
 0x8ee6724c, 0x8f470280, 0x3c050009, 0xc002407, 
 0x34a5f008, 0x56000001, 0xaee00e1c, 0x8ee20188, 
 0x24420001, 0xaee20188, 0x8004054, 0x8ee20188, 
@@ -3105,7 +3105,7 @@
 0x1021, 0x8ee24e30, 0x24420001, 0xaee24e30, 
 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 
 0x24020001, 0xac950000, 0xac820004, 0x1600000b, 
-0x0, 0x8ee2724c, 0x3c040001, 0x24845078, 
+0x0, 0x8ee2724c, 0x3c040001, 0x24845088, 
 0xafa00014, 0xafa20010, 0x8ee6724c, 0x8f470280, 
 0x3c050009, 0xc002407, 0x34a5f008, 0x8ee20174, 
 0x24420001, 0xaee20174, 0x800405b, 0x8ee20174, 
@@ -3117,16 +3117,16 @@
 0xc00249e, 0xafb00010, 0x2021, 0x24100001, 
 0x2402241f, 0xaf900210, 0xaf900200, 0xaf800204, 
 0xaf820214, 0x8f460248, 0x24030004, 0x3c020040, 
-0x3c010001, 0xac235474, 0x3c010001, 0xac235478, 
-0x3c010001, 0xac20552c, 0x3c010001, 0xac225470, 
-0x3c010001, 0xac235478, 0xc004fa4, 0x24050004, 
+0x3c010001, 0xac235484, 0x3c010001, 0xac235488, 
+0x3c010001, 0xac20553c, 0x3c010001, 0xac225480, 
+0x3c010001, 0xac235488, 0xc004fa8, 0x24050004, 
 0xc004784, 0x0, 0x8ee20000, 0x3c03feff, 
 0x3463fffd, 0x431024, 0xaee20000, 0x3c023c00, 
 0xaf82021c, 0x3c010001, 0x370821, 0xac3083ac, 
 0x8fbf0014, 0x8fb00010, 0x3e00008, 0x27bd0018, 
 0x27bdffe0, 0x3c050008, 0x34a50400, 0xafbf0018, 
 0xafa00010, 0xafa00014, 0x8f860200, 0x3c040001, 
-0x248451c0, 0xc002407, 0x3821, 0x8ee20280, 
+0x248451d0, 0xc002407, 0x3821, 0x8ee20280, 
 0x24420001, 0xaee20280, 0x8ee20280, 0x8f830200, 
 0x3c023f00, 0x621824, 0x8fbf0018, 0x3c020400, 
 0x3e00008, 0x27bd0020, 0x27bdffd8, 0xafbf0020, 
@@ -3138,16 +3138,16 @@
 0xaee20218, 0x8ee20218, 0x80040ca, 0x3c03fdff, 
 0x8ee2021c, 0x24420001, 0xaee2021c, 0x8ee2021c, 
 0x3c03fdff, 0x3463ffff, 0x3c0808ff, 0x3508ffff, 
-0x8ee20000, 0x3c040001, 0x248451cc, 0x3c050008, 
+0x8ee20000, 0x3c040001, 0x248451dc, 0x3c050008, 
 0x2003021, 0x431024, 0xaee20000, 0x8f820220, 
 0x3821, 0x3c030300, 0x481024, 0x431025, 
 0xaf820220, 0xafa00010, 0xc002407, 0xafa00014, 
 0x800429a, 0x0, 0x2111024, 0x1040001f, 
 0x3c024000, 0x8f830224, 0x24021402, 0x1462000b, 
-0x3c03fdff, 0x3c040001, 0x248451d8, 0x3c050008, 
+0x3c03fdff, 0x3c040001, 0x248451e8, 0x3c050008, 
 0xafa00010, 0xafa00014, 0x8f860224, 0x34a5ffff, 
 0xc002407, 0x3821, 0x3c03fdff, 0x8ee20000, 
-0x3463ffff, 0x2002021, 0x431024, 0xc004cf0, 
+0x3463ffff, 0x2002021, 0x431024, 0xc004cf4, 
 0xaee20000, 0x8ee20220, 0x24420001, 0xaee20220, 
 0x8ee20220, 0x8f820220, 0x3c0308ff, 0x3463ffff, 
 0x431024, 0x8004299, 0x511025, 0x2021024, 
@@ -3218,7 +3218,7 @@
 0x431025, 0xaf820220, 0x8f8600e0, 0x8f8400e4, 
 0x10c4002a, 0x0, 0x8ee2007c, 0x24420001, 
 0xaee2007c, 0x8ee2007c, 0x24c2fff8, 0xaf8200e0, 
-0x3c020001, 0x8c4275b0, 0x3c030008, 0x8f8600e0, 
+0x3c020001, 0x8c4275c0, 0x3c030008, 0x8f8600e0, 
 0x431024, 0x1040001d, 0x0, 0x10c4001b, 
 0x240dfff8, 0x3c0a000a, 0x354af000, 0x3c0c0080, 
 0x24850008, 0x27622800, 0x50a20001, 0x27651800, 
@@ -3254,12 +3254,12 @@
 0x621023, 0x2c420002, 0x1440fffc, 0x0, 
 0x8f820220, 0x3c0308ff, 0x3463fffb, 0x431024, 
 0xaf820220, 0x8fbf0020, 0x8fb1001c, 0x8fb00018, 
-0x3e00008, 0x27bd0028, 0x3c020001, 0x8c425488, 
+0x3e00008, 0x27bd0028, 0x3c020001, 0x8c425498, 
 0x27bdffd8, 0x10400012, 0xafbf0020, 0x3c040001, 
-0x248451e4, 0x3c050008, 0x24020001, 0x3c010001, 
+0x248451f4, 0x3c050008, 0x24020001, 0x3c010001, 
 0x370821, 0xac2283ac, 0xafa00010, 0xafa00014, 
-0x8f860220, 0x34a50498, 0x3c010001, 0xac205488, 
-0x3c010001, 0xac22547c, 0xc002407, 0x3821, 
+0x8f860220, 0x34a50498, 0x3c010001, 0xac205498, 
+0x3c010001, 0xac22548c, 0xc002407, 0x3821, 
 0x8f420268, 0x3c037fff, 0x3463ffff, 0x431024, 
 0xaf420268, 0x8ee204d0, 0x8ee404d4, 0x2403fffe, 
 0x431024, 0x30840002, 0x1080011e, 0xaee204d0, 
@@ -3325,24 +3325,24 @@
 0x54a00006, 0x240b0001, 0x8f820054, 0x1221023, 
 0x2c420033, 0x1440ffa6, 0x0, 0x316300ff, 
 0x24020001, 0x54620003, 0xafa00010, 0x80043da, 
-0x0, 0x3c040001, 0x248451f0, 0xafa00014, 
+0x0, 0x3c040001, 0x24845200, 0xafa00014, 
 0x8f860120, 0x8f870124, 0x3c050009, 0xc002407, 
 0x34a5f011, 0x80043da, 0x0, 0x3c040001, 
-0x248451fc, 0xafa00014, 0x8f860120, 0x8f870124, 
+0x2484520c, 0xafa00014, 0x8f860120, 0x8f870124, 
 0x3c050009, 0xc002407, 0x34a5f010, 0x80043da, 
-0x0, 0x3c040001, 0x24845208, 0xafa00014, 
+0x0, 0x3c040001, 0x24845218, 0xafa00014, 
 0x8ee60608, 0x8f470228, 0x3c050009, 0xc002407, 
 0x34a5f00f, 0x8ee201ac, 0x24420001, 0xaee201ac, 
 0x8ee201ac, 0x8ee2015c, 0x24420001, 0xaee2015c, 
 0x8ee2015c, 0x8fbf0020, 0x3e00008, 0x27bd0028, 
-0x3c020001, 0x8c425488, 0x27bdffe0, 0x1440000d, 
-0xafbf0018, 0x3c040001, 0x24845214, 0x3c050008, 
+0x3c020001, 0x8c425498, 0x27bdffe0, 0x1440000d, 
+0xafbf0018, 0x3c040001, 0x24845224, 0x3c050008, 
 0xafa00010, 0xafa00014, 0x8f860220, 0x34a50499, 
-0x24020001, 0x3c010001, 0xac225488, 0xc002407, 
+0x24020001, 0x3c010001, 0xac225498, 0xc002407, 
 0x3821, 0x8ee204d0, 0x3c030001, 0x771821, 
 0x946383b2, 0x34420001, 0x10600007, 0xaee204d0, 
 0x8f820220, 0x3c0308ff, 0x3463ffff, 0x431024, 
-0x34420008, 0xaf820220, 0x2021, 0xc0050af, 
+0x34420008, 0xaf820220, 0x2021, 0xc0050b3, 
 0x24050004, 0xaf420268, 0x8fbf0018, 0x3e00008, 
 0x27bd0020, 0x0, 0x0, 0x0, 
 0x0, 0x0, 0x0, 0x0, 
@@ -3359,7 +3359,7 @@
 0x0, 0x0, 0x0, 0x0, 
 0x0, 0x0, 0x0, 0x0, 
 0x0, 0x0, 0x0, 0x3c120001, 
-0x26521200, 0x3c140001, 0x8e945400, 0x3c100001, 
+0x26521200, 0x3c140001, 0x8e945410, 0x3c100001, 
 0x26101120, 0x3c15c000, 0x36b50060, 0x8e8a0000, 
 0x8eb30000, 0x26a400b, 0x248000a, 0x200f821, 
 0x0, 0xd, 0x0, 0x0, 
@@ -3420,100 +3420,100 @@
 0x1062000c, 0x43102b, 0x14400006, 0x3c026000, 
 0x3c024000, 0x10620008, 0x24020800, 0x8004539, 
 0x0, 0x10620004, 0x24020800, 0x8004539, 
-0x0, 0x24020700, 0x3c010001, 0xac22548c, 
+0x0, 0x24020700, 0x3c010001, 0xac22549c, 
 0x3e00008, 0x0, 0x27bdffd0, 0xafbf0028, 
-0x3c010001, 0xc004ccd, 0xac205474, 0x24040001, 
-0x2821, 0x27a60020, 0x34028000, 0xc0048ea, 
+0x3c010001, 0xc004cd1, 0xac205484, 0x24040001, 
+0x2821, 0x27a60020, 0x34028000, 0xc0048ee, 
 0xa7a20020, 0x8f830054, 0x8f820054, 0x800454b, 
 0x24630064, 0x8f820054, 0x621023, 0x2c420065, 
-0x1440fffc, 0x24040001, 0x24050001, 0xc0048a8, 
+0x1440fffc, 0x24040001, 0x24050001, 0xc0048ac, 
 0x27a60020, 0x8f830054, 0x8f820054, 0x8004557, 
 0x24630064, 0x8f820054, 0x621023, 0x2c420065, 
-0x1440fffc, 0x24040001, 0x24050001, 0xc0048a8, 
+0x1440fffc, 0x24040001, 0x24050001, 0xc0048ac, 
 0x27a60020, 0x8f830054, 0x8f820054, 0x8004563, 
 0x24630064, 0x8f820054, 0x621023, 0x2c420065, 
-0x1440fffc, 0x24040001, 0x24050002, 0xc0048a8, 
+0x1440fffc, 0x24040001, 0x24050002, 0xc0048ac, 
 0x27a60018, 0x8f830054, 0x8f820054, 0x800456f, 
 0x24630064, 0x8f820054, 0x621023, 0x2c420065, 
-0x1440fffc, 0x24040001, 0x24050003, 0xc0048a8, 
+0x1440fffc, 0x24040001, 0x24050003, 0xc0048ac, 
 0x27a6001a, 0x97a20020, 0x10400027, 0x24030001, 
-0x3c020001, 0x8c425474, 0x97a30018, 0x34420001, 
-0x3c010001, 0xac225474, 0x24020015, 0x1462000d, 
+0x3c020001, 0x8c425484, 0x97a30018, 0x34420001, 
+0x3c010001, 0xac225484, 0x24020015, 0x1462000d, 
 0x0, 0x97a2001a, 0x3843f423, 0x2c630001, 
 0x3842f430, 0x2c420001, 0x621825, 0x10600005, 
-0x24020003, 0x3c010001, 0xac225540, 0x80045a7, 
+0x24020003, 0x3c010001, 0xac225550, 0x80045a7, 
 0x3c08fff0, 0x97a30018, 0x24027810, 0x1462000a, 
 0x24020002, 0x97a3001a, 0x24020001, 0x14620006, 
-0x24020002, 0x24020004, 0x3c010001, 0xac225540, 
-0x80045a7, 0x3c08fff0, 0x3c010001, 0xac225540, 
-0x80045a7, 0x3c08fff0, 0x3c020001, 0x8c425474, 
-0x3c010001, 0xac235540, 0x34420004, 0x3c010001, 
-0xac225474, 0x3c08fff0, 0x3508bdc0, 0x8f830054, 
-0x97a60018, 0x3c070001, 0x8ce75540, 0x3c040001, 
-0x24845280, 0x24020001, 0x3c010001, 0xac22547c, 
-0xafa60010, 0x3c060001, 0x8cc65474, 0x97a2001a, 
-0x3c05000d, 0x34a50100, 0x3c010001, 0xac205478, 
-0x681821, 0x3c010001, 0xac235538, 0xc002407, 
+0x24020002, 0x24020004, 0x3c010001, 0xac225550, 
+0x80045a7, 0x3c08fff0, 0x3c010001, 0xac225550, 
+0x80045a7, 0x3c08fff0, 0x3c020001, 0x8c425484, 
+0x3c010001, 0xac235550, 0x34420004, 0x3c010001, 
+0xac225484, 0x3c08fff0, 0x3508bdc0, 0x8f830054, 
+0x97a60018, 0x3c070001, 0x8ce75550, 0x3c040001, 
+0x24845290, 0x24020001, 0x3c010001, 0xac22548c, 
+0xafa60010, 0x3c060001, 0x8cc65484, 0x97a2001a, 
+0x3c05000d, 0x34a50100, 0x3c010001, 0xac205488, 
+0x681821, 0x3c010001, 0xac235548, 0xc002407, 
 0xafa20014, 0x8fbf0028, 0x3e00008, 0x27bd0030, 
-0x27bdffe8, 0x24070004, 0x3c040001, 0x8c845478, 
+0x27bdffe8, 0x24070004, 0x3c040001, 0x8c845488, 
 0x3021, 0x24020001, 0x1482000a, 0xafbf0010, 
-0x3c020001, 0x8c4275bc, 0x3c050004, 0x30428000, 
+0x3c020001, 0x8c4275cc, 0x3c050004, 0x30428000, 
 0x1040000c, 0x34a593e0, 0x3c05000f, 0x80045da, 
-0x34a54240, 0x3c020001, 0x8c4275bc, 0x3c05000f, 
+0x34a54240, 0x3c020001, 0x8c4275cc, 0x3c05000f, 
 0x30428000, 0x10400003, 0x34a54240, 0x3c05001e, 
-0x34a58480, 0x3c020001, 0x8c425538, 0x8f830054, 
+0x34a58480, 0x3c020001, 0x8c425548, 0x8f830054, 
 0x451021, 0x431023, 0x45102b, 0x1440002e, 
-0x0, 0x3c020001, 0x8c425480, 0x1440002a, 
+0x0, 0x3c020001, 0x8c425490, 0x1440002a, 
 0x2cc20001, 0x7182b, 0x431024, 0x1040001d, 
-0x0, 0x3c090001, 0x8d295474, 0x240b0001, 
-0x3c054000, 0x3c080001, 0x250875bc, 0x250afffc, 
+0x0, 0x3c090001, 0x8d295484, 0x240b0001, 
+0x3c054000, 0x3c080001, 0x250875cc, 0x250afffc, 
 0x42042, 0x14800002, 0x24e7ffff, 0x24040008, 
 0x891024, 0x5040000b, 0x2cc20001, 0x148b0004, 
 0x0, 0x8d020000, 0x80045ff, 0x451024, 
 0x8d420000, 0x451024, 0x54400001, 0x24060001, 
 0x2cc20001, 0x7182b, 0x431024, 0x5440ffed, 
-0x42042, 0x3c010001, 0x10c00024, 0xac245478, 
-0x8f830054, 0x24020001, 0x3c010001, 0xac22547c, 
-0x3c010001, 0xac235538, 0x3c020001, 0x8c42547c, 
-0x10400006, 0x24020001, 0x3c010001, 0xac20547c, 
+0x42042, 0x3c010001, 0x10c00024, 0xac245488, 
+0x8f830054, 0x24020001, 0x3c010001, 0xac22548c, 
+0x3c010001, 0xac235548, 0x3c020001, 0x8c42548c, 
+0x10400006, 0x24020001, 0x3c010001, 0xac20548c, 
 0x3c010001, 0x370821, 0xac2283ac, 0x3c030001, 
 0x771821, 0x8c6383ac, 0x24020008, 0x10620005, 
 0x24020001, 0xc00462f, 0x0, 0x800462c, 
-0x0, 0x3c030001, 0x8c635478, 0x10620007, 
-0x2402000e, 0x3c030001, 0x8c637550, 0x10620003, 
-0x0, 0xc004cf0, 0x8f840220, 0x8fbf0010, 
+0x0, 0x3c030001, 0x8c635488, 0x10620007, 
+0x2402000e, 0x3c030001, 0x8c637560, 0x10620003, 
+0x0, 0xc004cf4, 0x8f840220, 0x8fbf0010, 
 0x3e00008, 0x27bd0018, 0x27bdffe0, 0x3c02fdff, 
-0xafbf0018, 0x8ee30000, 0x3c050001, 0x8ca55478, 
-0x3c040001, 0x8c845498, 0x3442ffff, 0x621824, 
+0xafbf0018, 0x8ee30000, 0x3c050001, 0x8ca55488, 
+0x3c040001, 0x8c8454a8, 0x3442ffff, 0x621824, 
 0x14a40008, 0xaee30000, 0x3c030001, 0x771821, 
-0x8c6383ac, 0x3c020001, 0x8c42549c, 0x10620008, 
+0x8c6383ac, 0x3c020001, 0x8c4254ac, 0x10620008, 
 0x0, 0x3c020001, 0x571021, 0x8c4283ac, 
-0x3c010001, 0xac255498, 0x3c010001, 0xac22549c, 
-0x3c030001, 0x8c635478, 0x24020002, 0x10620131, 
+0x3c010001, 0xac2554a8, 0x3c010001, 0xac2254ac, 
+0x3c030001, 0x8c635488, 0x24020002, 0x10620131, 
 0x2c620003, 0x10400005, 0x24020001, 0x10620008, 
 0x0, 0x800477e, 0x0, 0x24020004, 
 0x10620079, 0x24020001, 0x800477f, 0x0, 
 0x3c020001, 0x571021, 0x8c4283ac, 0x2443ffff, 
 0x2c620008, 0x10400122, 0x31080, 0x3c010001, 
-0x220821, 0x8c225298, 0x400008, 0x0, 
-0xc004784, 0x0, 0x3c020001, 0x8c425484, 
-0x3c010001, 0xac205410, 0x104000bd, 0x24020002, 
+0x220821, 0x8c2252a8, 0x400008, 0x0, 
+0xc004784, 0x0, 0x3c020001, 0x8c425494, 
+0x3c010001, 0xac205420, 0x104000bd, 0x24020002, 
 0x3c010001, 0x370821, 0xac2283ac, 0x3c010001, 
-0x8004781, 0xac205484, 0xc00492b, 0x0, 
-0x3c030001, 0x8c6354a0, 0x80046f0, 0x24020011, 
-0x3c050001, 0x8ca55478, 0x3c060001, 0x8cc675bc, 
-0xc004fa4, 0x2021, 0x24020005, 0x3c010001, 
-0xac205484, 0x3c010001, 0x370821, 0x8004781, 
-0xac2283ac, 0x3c040001, 0x2484528c, 0x3c05000f, 
+0x8004781, 0xac205494, 0xc00492f, 0x0, 
+0x3c030001, 0x8c6354b0, 0x80046f0, 0x24020011, 
+0x3c050001, 0x8ca55488, 0x3c060001, 0x8cc675cc, 
+0xc004fa8, 0x2021, 0x24020005, 0x3c010001, 
+0xac205494, 0x3c010001, 0x370821, 0x8004781, 
+0xac2283ac, 0x3c040001, 0x2484529c, 0x3c05000f, 
 0x34a50100, 0x3021, 0x3821, 0xafa00010, 
 0xc002407, 0xafa00014, 0x8004781, 0x0, 
 0x8f820220, 0x3c03f700, 0x431025, 0x8004719, 
 0xaf820220, 0x8f820220, 0x3c030004, 0x431024, 
 0x14400090, 0x24020007, 0x8f830054, 0x3c020001, 
-0x8c425530, 0x2463d8f0, 0x431023, 0x2c422710, 
+0x8c425540, 0x2463d8f0, 0x431023, 0x2c422710, 
 0x144000df, 0x24020001, 0x800477f, 0x0, 
-0x3c050001, 0x8ca55478, 0xc0050af, 0x2021, 
-0xc00517a, 0x2021, 0x3c030001, 0x8c6375b4, 
+0x3c050001, 0x8ca55488, 0xc0050b3, 0x2021, 
+0xc00517e, 0x2021, 0x3c030001, 0x8c6375c4, 
 0x46100d1, 0x24020001, 0x3c020008, 0x621024, 
 0x10400006, 0x0, 0x8f820214, 0x3c03ffff, 
 0x431024, 0x80046bc, 0x3442251f, 0x8f820214, 
@@ -3524,69 +3524,69 @@
 0x3c010001, 0x370821, 0xc0043e1, 0xac2283ac, 
 0x8004781, 0x0, 0x3c020001, 0x571021, 
 0x8c4283ac, 0x2443ffff, 0x2c620008, 0x104000ac, 
-0x31080, 0x3c010001, 0x220821, 0x8c2252b8, 
+0x31080, 0x3c010001, 0x220821, 0x8c2252c8, 
 0x400008, 0x0, 0xc00429f, 0x0, 
-0x3c010001, 0xac20547c, 0xaf800204, 0x3c010001, 
-0xc004784, 0xac2075a0, 0x24020001, 0x3c010001, 
-0xac225490, 0x24020002, 0x3c010001, 0x370821, 
+0x3c010001, 0xac20548c, 0xaf800204, 0x3c010001, 
+0xc004784, 0xac2075b0, 0x24020001, 0x3c010001, 
+0xac2254a0, 0x24020002, 0x3c010001, 0x370821, 
 0x8004781, 0xac2283ac, 0xc004801, 0x0, 
-0x3c030001, 0x8c635490, 0x24020009, 0x14620090, 
+0x3c030001, 0x8c6354a0, 0x24020009, 0x14620090, 
 0x24020003, 0x3c010001, 0x370821, 0x8004781, 
-0xac2283ac, 0x3c020001, 0x8c4275b8, 0x30424000, 
+0xac2283ac, 0x3c020001, 0x8c4275c8, 0x30424000, 
 0x10400005, 0x0, 0x8f820044, 0x3c03ffff, 
 0x8004701, 0x34637fff, 0x8f820044, 0x2403ff7f, 
 0x431024, 0xaf820044, 0x8f830054, 0x800471b, 
-0x24020004, 0x8f830054, 0x3c020001, 0x8c425530, 
+0x24020004, 0x8f830054, 0x3c020001, 0x8c425540, 
 0x2463d8f0, 0x431023, 0x2c422710, 0x14400074, 
 0x24020005, 0x3c010001, 0x370821, 0x8004781, 
 0xac2283ac, 0x8f820220, 0x3c03f700, 0x431025, 
-0xaf820220, 0xaf800204, 0x3c010001, 0xac2075a0, 
+0xaf820220, 0xaf800204, 0x3c010001, 0xac2075b0, 
 0x8f830054, 0x24020006, 0x3c010001, 0x370821, 
-0xac2283ac, 0x3c010001, 0x8004781, 0xac235530, 
-0x8f830054, 0x3c020001, 0x8c425530, 0x2463fff6, 
+0xac2283ac, 0x3c010001, 0x8004781, 0xac235540, 
+0x8f830054, 0x3c020001, 0x8c425540, 0x2463fff6, 
 0x431023, 0x2c42000a, 0x14400059, 0x0, 
 0x24020007, 0x3c010001, 0x370821, 0x8004781, 
 0xac2283ac, 0x8f820220, 0x3c04f700, 0x441025, 
 0xaf820220, 0x8f820220, 0x3c030300, 0x431024, 
 0x14400005, 0x1821, 0x8f820220, 0x24030001, 
 0x441025, 0xaf820220, 0x10600043, 0x24020001, 
-0x8f820214, 0x3c03ffff, 0x3c040001, 0x8c845528, 
+0x8f820214, 0x3c03ffff, 0x3c040001, 0x8c845538, 
 0x431024, 0x3442251f, 0xaf820214, 0x24020008, 
 0x3c010001, 0x370821, 0x1080000b, 0xac2283ac, 
-0x3c020001, 0x8c425504, 0x14400007, 0x24020001, 
-0x3c010001, 0xac227550, 0xc004cf0, 0x8f840220, 
+0x3c020001, 0x8c425514, 0x14400007, 0x24020001, 
+0x3c010001, 0xac227560, 0xc004cf4, 0x8f840220, 
 0x800476e, 0x0, 0x8f820220, 0x3c030008, 
 0x431024, 0x14400017, 0x2402000e, 0x3c010001, 
-0xac227550, 0x8ee20000, 0x2021, 0x3c030200, 
-0x431025, 0xc00517a, 0xaee20000, 0x8f820220, 
+0xac227560, 0x8ee20000, 0x2021, 0x3c030200, 
+0x431025, 0xc00517e, 0xaee20000, 0x8f820220, 
 0x2403fffb, 0x431024, 0xaf820220, 0x8f820220, 
 0x34420002, 0xc0043e1, 0xaf820220, 0x3c050001, 
-0x8ca55478, 0xc0050af, 0x2021, 0x8004781, 
-0x0, 0x3c020001, 0x8c425504, 0x10400010, 
-0x0, 0x3c020001, 0x8c425500, 0x2442ffff, 
-0x3c010001, 0xac225500, 0x14400009, 0x24020002, 
-0x3c010001, 0xac205504, 0x3c010001, 0x8004781, 
-0xac225500, 0x24020001, 0x3c010001, 0xac22547c, 
+0x8ca55488, 0xc0050b3, 0x2021, 0x8004781, 
+0x0, 0x3c020001, 0x8c425514, 0x10400010, 
+0x0, 0x3c020001, 0x8c425510, 0x2442ffff, 
+0x3c010001, 0xac225510, 0x14400009, 0x24020002, 
+0x3c010001, 0xac205514, 0x3c010001, 0x8004781, 
+0xac225510, 0x24020001, 0x3c010001, 0xac22548c, 
 0x8fbf0018, 0x3e00008, 0x27bd0020, 0x8f820200, 
 0x8f820220, 0x8f820220, 0x34420004, 0xaf820220, 
-0x8f820200, 0x3c060001, 0x8cc65478, 0x34420004, 
+0x8f820200, 0x3c060001, 0x8cc65488, 0x34420004, 
 0xaf820200, 0x24020002, 0x10c2003a, 0x2cc20003, 
 0x10400005, 0x24020001, 0x10c20008, 0x0, 
 0x80047ca, 0x0, 0x24020004, 0x10c20013, 
 0x24020001, 0x80047ca, 0x0, 0x3c030001, 
-0x8c635468, 0x3c020001, 0x8c425470, 0x3c040001, 
-0x8c84548c, 0x3c050001, 0x8ca5546c, 0xaf860200, 
+0x8c635478, 0x3c020001, 0x8c425480, 0x3c040001, 
+0x8c84549c, 0x3c050001, 0x8ca5547c, 0xaf860200, 
 0xaf860220, 0x34630022, 0x441025, 0x451025, 
 0x34420002, 0x80047c9, 0xaf830200, 0x3c030001, 
-0x8c635528, 0xaf820200, 0x10600009, 0xaf820220, 
-0x3c020001, 0x8c425504, 0x14400005, 0x3c033f00, 
-0x3c020001, 0x8c425460, 0x80047bd, 0x346300e0, 
-0x3c020001, 0x8c425460, 0x3c033f00, 0x346300e2, 
-0x431025, 0xaf820200, 0x3c030001, 0x8c635464, 
-0x3c04f700, 0x3c020001, 0x8c425470, 0x3c050001, 
-0x8ca5548c, 0x641825, 0x431025, 0x451025, 
+0x8c635538, 0xaf820200, 0x10600009, 0xaf820220, 
+0x3c020001, 0x8c425514, 0x14400005, 0x3c033f00, 
+0x3c020001, 0x8c425470, 0x80047bd, 0x346300e0, 
+0x3c020001, 0x8c425470, 0x3c033f00, 0x346300e2, 
+0x431025, 0xaf820200, 0x3c030001, 0x8c635474, 
+0x3c04f700, 0x3c020001, 0x8c425480, 0x3c050001, 
+0x8ca5549c, 0x641825, 0x431025, 0x451025, 
 0xaf820220, 0x3e00008, 0x0, 0x8f820220, 
-0x3c030001, 0x8c635478, 0x34420004, 0xaf820220, 
+0x3c030001, 0x8c635488, 0x34420004, 0xaf820220, 
 0x24020001, 0x1062000f, 0x0, 0x8f830054, 
 0x8f820054, 0x24630002, 0x621023, 0x2c420003, 
 0x10400011, 0x0, 0x8f820054, 0x621023, 
@@ -3599,19 +3599,19 @@
 0x2c420033, 0x10400004, 0x0, 0x8f8200e0, 
 0x1082fff9, 0x0, 0x8f820220, 0x2403fffd, 
 0x431024, 0xaf820220, 0x3e00008, 0x0, 
-0x3c030001, 0x8c635490, 0x3c020001, 0x8c425494, 
-0x50620004, 0x2463ffff, 0x3c010001, 0xac235494, 
-0x2463ffff, 0x2c620009, 0x10400099, 0x31080, 
-0x3c010001, 0x220821, 0x8c2252d8, 0x400008, 
+0x3c030001, 0x8c6354a0, 0x3c020001, 0x8c4254a4, 
+0x50620004, 0x2463ffff, 0x3c010001, 0xac2354a4, 
+0x2463ffff, 0x2c620009, 0x1040009d, 0x31080, 
+0x3c010001, 0x220821, 0x8c2252e8, 0x400008, 
 0x0, 0x8f820044, 0x34428080, 0xaf820044, 
-0x8f830054, 0x8004896, 0x24020002, 0x8f830054, 
-0x3c020001, 0x8c425534, 0x2463d8f0, 0x431023, 
-0x2c422710, 0x14400086, 0x24020003, 0x80048a3, 
+0x8f830054, 0x800489a, 0x24020002, 0x8f830054, 
+0x3c020001, 0x8c425544, 0x2463d8f0, 0x431023, 
+0x2c422710, 0x1440008a, 0x24020003, 0x80048a7, 
 0x0, 0x8f820044, 0x3c03ffff, 0x34637fff, 
-0x431024, 0xaf820044, 0x8f830054, 0x8004896, 
-0x24020004, 0x8f830054, 0x3c020001, 0x8c425534, 
-0x2463fff6, 0x431023, 0x2c42000a, 0x14400074, 
-0x24020005, 0x80048a3, 0x0, 0x8f820220, 
+0x431024, 0xaf820044, 0x8f830054, 0x800489a, 
+0x24020004, 0x8f830054, 0x3c020001, 0x8c425544, 
+0x2463fff6, 0x431023, 0x2c42000a, 0x14400078, 
+0x24020005, 0x80048a7, 0x0, 0x8f820220, 
 0x3c03f700, 0x431025, 0xaf820220, 0x8f820220, 
 0x2403fffb, 0x431024, 0xaf820220, 0x8f820220, 
 0x34420002, 0xaf820220, 0x3c023f00, 0x344200e0, 
@@ -3629,529 +3629,530 @@
 0xaf820220, 0xaf830200, 0x8f8400f0, 0x276217f8, 
 0x14820002, 0x24850008, 0x27651000, 0x8f8200f4, 
 0x10a20007, 0x3c038000, 0x34630040, 0x3c020001, 
-0x24425420, 0xac820000, 0xac830004, 0xaf8500f0, 
-0x8f830054, 0x8004896, 0x24020006, 0x8f830054, 
-0x3c020001, 0x8c425534, 0x2463fff6, 0x431023, 
-0x2c42000a, 0x1440001e, 0x24020007, 0x80048a3, 
+0x24425430, 0xac820000, 0xac830004, 0xaf8500f0, 
+0x8f830054, 0x800489a, 0x24020006, 0x8f830054, 
+0x3c020001, 0x8c425544, 0x2463fff6, 0x431023, 
+0x2c42000a, 0x14400022, 0x24020007, 0x80048a7, 
 0x0, 0x8f8200e0, 0xaf8200e4, 0x8f8200e0, 
 0xaf8200e8, 0x8f820220, 0x34420004, 0xaf820220, 
+0x8f820220, 0x2403fff7, 0x431024, 0xaf820220, 
 0x8f820044, 0x34428080, 0xaf820044, 0x8f830054, 
-0x24020008, 0x3c010001, 0xac225490, 0x3c010001, 
-0x80048a5, 0xac235534, 0x8f830054, 0x3c020001, 
-0x8c425534, 0x2463d8f0, 0x431023, 0x2c422710, 
-0x14400003, 0x24020009, 0x3c010001, 0xac225490, 
+0x24020008, 0x3c010001, 0xac2254a0, 0x3c010001, 
+0x80048a9, 0xac235544, 0x8f830054, 0x3c020001, 
+0x8c425544, 0x2463d8f0, 0x431023, 0x2c422710, 
+0x14400003, 0x24020009, 0x3c010001, 0xac2254a0, 
 0x3e00008, 0x0, 0x0, 0x27bdffd8, 
 0xafb20018, 0x809021, 0xafb3001c, 0xa09821, 
 0xafb10014, 0xc08821, 0xafb00010, 0x8021, 
-0xafbf0020, 0xa6200000, 0xc004ca7, 0x24040001, 
+0xafbf0020, 0xa6200000, 0xc004cab, 0x24040001, 
 0x26100001, 0x2e020020, 0x1440fffb, 0x0, 
-0xc004ca7, 0x2021, 0xc004ca7, 0x24040001, 
-0xc004ca7, 0x24040001, 0xc004ca7, 0x2021, 
+0xc004cab, 0x2021, 0xc004cab, 0x24040001, 
+0xc004cab, 0x24040001, 0xc004cab, 0x2021, 
 0x24100010, 0x2501024, 0x10400002, 0x2021, 
-0x24040001, 0xc004ca7, 0x108042, 0x1600fffa, 
+0x24040001, 0xc004cab, 0x108042, 0x1600fffa, 
 0x2501024, 0x24100010, 0x2701024, 0x10400002, 
-0x2021, 0x24040001, 0xc004ca7, 0x108042, 
-0x1600fffa, 0x2701024, 0xc004ccd, 0x34108000, 
-0xc004ccd, 0x0, 0xc004c87, 0x0, 
+0x2021, 0x24040001, 0xc004cab, 0x108042, 
+0x1600fffa, 0x2701024, 0xc004cd1, 0x34108000, 
+0xc004cd1, 0x0, 0xc004c8b, 0x0, 
 0x50400005, 0x108042, 0x96220000, 0x501025, 
 0xa6220000, 0x108042, 0x1600fff7, 0x0, 
-0xc004ccd, 0x0, 0x8fbf0020, 0x8fb3001c, 
+0xc004cd1, 0x0, 0x8fbf0020, 0x8fb3001c, 
 0x8fb20018, 0x8fb10014, 0x8fb00010, 0x3e00008, 
 0x27bd0028, 0x27bdffd8, 0xafb10014, 0x808821, 
 0xafb20018, 0xa09021, 0xafb3001c, 0xc09821, 
-0xafb00010, 0x8021, 0xafbf0020, 0xc004ca7, 
+0xafb00010, 0x8021, 0xafbf0020, 0xc004cab, 
 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, 
-0x0, 0xc004ca7, 0x2021, 0xc004ca7, 
-0x24040001, 0xc004ca7, 0x2021, 0xc004ca7, 
+0x0, 0xc004cab, 0x2021, 0xc004cab, 
+0x24040001, 0xc004cab, 0x2021, 0xc004cab, 
 0x24040001, 0x24100010, 0x2301024, 0x10400002, 
-0x2021, 0x24040001, 0xc004ca7, 0x108042, 
+0x2021, 0x24040001, 0xc004cab, 0x108042, 
 0x1600fffa, 0x2301024, 0x24100010, 0x2501024, 
-0x10400002, 0x2021, 0x24040001, 0xc004ca7, 
-0x108042, 0x1600fffa, 0x2501024, 0xc004ca7, 
-0x24040001, 0xc004ca7, 0x2021, 0x34108000, 
+0x10400002, 0x2021, 0x24040001, 0xc004cab, 
+0x108042, 0x1600fffa, 0x2501024, 0xc004cab, 
+0x24040001, 0xc004cab, 0x2021, 0x34108000, 
 0x96620000, 0x501024, 0x10400002, 0x2021, 
-0x24040001, 0xc004ca7, 0x108042, 0x1600fff8, 
-0x0, 0xc004ccd, 0x0, 0x8fbf0020, 
+0x24040001, 0xc004cab, 0x108042, 0x1600fff8, 
+0x0, 0xc004cd1, 0x0, 0x8fbf0020, 
 0x8fb3001c, 0x8fb20018, 0x8fb10014, 0x8fb00010, 
-0x3e00008, 0x27bd0028, 0x3c030001, 0x8c6354a0, 
-0x3c020001, 0x8c4254e4, 0x27bdffd8, 0xafbf0020, 
+0x3e00008, 0x27bd0028, 0x3c030001, 0x8c6354b0, 
+0x3c020001, 0x8c4254f4, 0x27bdffd8, 0xafbf0020, 
 0xafb1001c, 0x10620003, 0xafb00018, 0x3c010001, 
-0xac2354e4, 0x2463ffff, 0x2c620013, 0x10400349, 
-0x31080, 0x3c010001, 0x220821, 0x8c225300, 
-0x400008, 0x0, 0xc004ccd, 0x8021, 
-0x34028000, 0xa7a20010, 0x27b10010, 0xc004ca7, 
+0xac2354f4, 0x2463ffff, 0x2c620013, 0x10400349, 
+0x31080, 0x3c010001, 0x220821, 0x8c225310, 
+0x400008, 0x0, 0xc004cd1, 0x8021, 
+0x34028000, 0xa7a20010, 0x27b10010, 0xc004cab, 
 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, 
-0x0, 0xc004ca7, 0x2021, 0xc004ca7, 
-0x24040001, 0xc004ca7, 0x2021, 0xc004ca7, 
+0x0, 0xc004cab, 0x2021, 0xc004cab, 
+0x24040001, 0xc004cab, 0x2021, 0xc004cab, 
 0x24040001, 0x24100010, 0x32020001, 0x10400002, 
-0x2021, 0x24040001, 0xc004ca7, 0x108042, 
-0x1600fffa, 0x32020001, 0x24100010, 0xc004ca7, 
+0x2021, 0x24040001, 0xc004cab, 0x108042, 
+0x1600fffa, 0x32020001, 0x24100010, 0xc004cab, 
 0x2021, 0x108042, 0x1600fffc, 0x0, 
-0xc004ca7, 0x24040001, 0xc004ca7, 0x2021, 
+0xc004cab, 0x24040001, 0xc004cab, 0x2021, 
 0x34108000, 0x96220000, 0x501024, 0x10400002, 
-0x2021, 0x24040001, 0xc004ca7, 0x108042, 
-0x1600fff8, 0x0, 0xc004ccd, 0x0, 
-0x8004c80, 0x24020002, 0x27b10010, 0xa7a00010, 
-0x8021, 0xc004ca7, 0x24040001, 0x26100001, 
-0x2e020020, 0x1440fffb, 0x0, 0xc004ca7, 
-0x2021, 0xc004ca7, 0x24040001, 0xc004ca7, 
-0x24040001, 0xc004ca7, 0x2021, 0x24100010, 
+0x2021, 0x24040001, 0xc004cab, 0x108042, 
+0x1600fff8, 0x0, 0xc004cd1, 0x0, 
+0x8004c84, 0x24020002, 0x27b10010, 0xa7a00010, 
+0x8021, 0xc004cab, 0x24040001, 0x26100001, 
+0x2e020020, 0x1440fffb, 0x0, 0xc004cab, 
+0x2021, 0xc004cab, 0x24040001, 0xc004cab, 
+0x24040001, 0xc004cab, 0x2021, 0x24100010, 
 0x32020001, 0x10400002, 0x2021, 0x24040001, 
-0xc004ca7, 0x108042, 0x1600fffa, 0x32020001, 
-0x24100010, 0xc004ca7, 0x2021, 0x108042, 
-0x1600fffc, 0x0, 0xc004ccd, 0x34108000, 
-0xc004ccd, 0x0, 0xc004c87, 0x0, 
+0xc004cab, 0x108042, 0x1600fffa, 0x32020001, 
+0x24100010, 0xc004cab, 0x2021, 0x108042, 
+0x1600fffc, 0x0, 0xc004cd1, 0x34108000, 
+0xc004cd1, 0x0, 0xc004c8b, 0x0, 
 0x50400005, 0x108042, 0x96220000, 0x501025, 
 0xa6220000, 0x108042, 0x1600fff7, 0x0, 
-0xc004ccd, 0x0, 0x97a20010, 0x30428000, 
-0x144002dc, 0x24020003, 0x8004c80, 0x0, 
+0xc004cd1, 0x0, 0x97a20010, 0x30428000, 
+0x144002dc, 0x24020003, 0x8004c84, 0x0, 
 0x24021200, 0xa7a20010, 0x27b10010, 0x8021, 
-0xc004ca7, 0x24040001, 0x26100001, 0x2e020020, 
-0x1440fffb, 0x0, 0xc004ca7, 0x2021, 
-0xc004ca7, 0x24040001, 0xc004ca7, 0x2021, 
-0xc004ca7, 0x24040001, 0x24100010, 0x32020001, 
-0x10400002, 0x2021, 0x24040001, 0xc004ca7, 
+0xc004cab, 0x24040001, 0x26100001, 0x2e020020, 
+0x1440fffb, 0x0, 0xc004cab, 0x2021, 
+0xc004cab, 0x24040001, 0xc004cab, 0x2021, 
+0xc004cab, 0x24040001, 0x24100010, 0x32020001, 
+0x10400002, 0x2021, 0x24040001, 0xc004cab, 
 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 
-0xc004ca7, 0x2021, 0x108042, 0x1600fffc, 
-0x0, 0xc004ca7, 0x24040001, 0xc004ca7, 
+0xc004cab, 0x2021, 0x108042, 0x1600fffc, 
+0x0, 0xc004cab, 0x24040001, 0xc004cab, 
 0x2021, 0x34108000, 0x96220000, 0x501024, 
-0x10400002, 0x2021, 0x24040001, 0xc004ca7, 
-0x108042, 0x1600fff8, 0x0, 0xc004ccd, 
-0x0, 0x8f830054, 0x8004c72, 0x24020004, 
-0x8f830054, 0x3c020001, 0x8c42553c, 0x2463ff9c, 
+0x10400002, 0x2021, 0x24040001, 0xc004cab, 
+0x108042, 0x1600fff8, 0x0, 0xc004cd1, 
+0x0, 0x8f830054, 0x8004c76, 0x24020004, 
+0x8f830054, 0x3c020001, 0x8c42554c, 0x2463ff9c, 
 0x431023, 0x2c420064, 0x1440029e, 0x24020002, 
-0x3c030001, 0x8c635540, 0x10620297, 0x2c620003, 
+0x3c030001, 0x8c635550, 0x10620297, 0x2c620003, 
 0x14400296, 0x24020011, 0x24020003, 0x10620005, 
-0x24020004, 0x10620291, 0x2402000f, 0x8004c80, 
-0x24020011, 0x8004c80, 0x24020005, 0x24020014, 
-0xa7a20010, 0x27b10010, 0x8021, 0xc004ca7, 
+0x24020004, 0x10620291, 0x2402000f, 0x8004c84, 
+0x24020011, 0x8004c84, 0x24020005, 0x24020014, 
+0xa7a20010, 0x27b10010, 0x8021, 0xc004cab, 
 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, 
-0x0, 0xc004ca7, 0x2021, 0xc004ca7, 
-0x24040001, 0xc004ca7, 0x2021, 0xc004ca7, 
+0x0, 0xc004cab, 0x2021, 0xc004cab, 
+0x24040001, 0xc004cab, 0x2021, 0xc004cab, 
 0x24040001, 0x24100010, 0x32020001, 0x10400002, 
-0x2021, 0x24040001, 0xc004ca7, 0x108042, 
+0x2021, 0x24040001, 0xc004cab, 0x108042, 
 0x1600fffa, 0x32020001, 0x24100010, 0x32020012, 
-0x10400002, 0x2021, 0x24040001, 0xc004ca7, 
-0x108042, 0x1600fffa, 0x32020012, 0xc004ca7, 
-0x24040001, 0xc004ca7, 0x2021, 0x34108000, 
+0x10400002, 0x2021, 0x24040001, 0xc004cab, 
+0x108042, 0x1600fffa, 0x32020012, 0xc004cab, 
+0x24040001, 0xc004cab, 0x2021, 0x34108000, 
 0x96220000, 0x501024, 0x10400002, 0x2021, 
-0x24040001, 0xc004ca7, 0x108042, 0x1600fff8, 
-0x0, 0xc004ccd, 0x0, 0x8f830054, 
-0x8004c72, 0x24020006, 0x8f830054, 0x3c020001, 
-0x8c42553c, 0x2463ff9c, 0x431023, 0x2c420064, 
-0x14400250, 0x24020007, 0x8004c80, 0x0, 
+0x24040001, 0xc004cab, 0x108042, 0x1600fff8, 
+0x0, 0xc004cd1, 0x0, 0x8f830054, 
+0x8004c76, 0x24020006, 0x8f830054, 0x3c020001, 
+0x8c42554c, 0x2463ff9c, 0x431023, 0x2c420064, 
+0x14400250, 0x24020007, 0x8004c84, 0x0, 
 0x24020006, 0xa7a20010, 0x27b10010, 0x8021, 
-0xc004ca7, 0x24040001, 0x26100001, 0x2e020020, 
-0x1440fffb, 0x0, 0xc004ca7, 0x2021, 
-0xc004ca7, 0x24040001, 0xc004ca7, 0x2021, 
-0xc004ca7, 0x24040001, 0x24100010, 0x32020001, 
-0x10400002, 0x2021, 0x24040001, 0xc004ca7, 
+0xc004cab, 0x24040001, 0x26100001, 0x2e020020, 
+0x1440fffb, 0x0, 0xc004cab, 0x2021, 
+0xc004cab, 0x24040001, 0xc004cab, 0x2021, 
+0xc004cab, 0x24040001, 0x24100010, 0x32020001, 
+0x10400002, 0x2021, 0x24040001, 0xc004cab, 
 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 
 0x32020013, 0x10400002, 0x2021, 0x24040001, 
-0xc004ca7, 0x108042, 0x1600fffa, 0x32020013, 
-0xc004ca7, 0x24040001, 0xc004ca7, 0x2021, 
+0xc004cab, 0x108042, 0x1600fffa, 0x32020013, 
+0xc004cab, 0x24040001, 0xc004cab, 0x2021, 
 0x34108000, 0x96220000, 0x501024, 0x10400002, 
-0x2021, 0x24040001, 0xc004ca7, 0x108042, 
-0x1600fff8, 0x0, 0xc004ccd, 0x0, 
-0x8f830054, 0x8004c72, 0x24020008, 0x8f830054, 
-0x3c020001, 0x8c42553c, 0x2463ff9c, 0x431023, 
-0x2c420064, 0x1440020f, 0x24020009, 0x8004c80, 
+0x2021, 0x24040001, 0xc004cab, 0x108042, 
+0x1600fff8, 0x0, 0xc004cd1, 0x0, 
+0x8f830054, 0x8004c76, 0x24020008, 0x8f830054, 
+0x3c020001, 0x8c42554c, 0x2463ff9c, 0x431023, 
+0x2c420064, 0x1440020f, 0x24020009, 0x8004c84, 
 0x0, 0x27b10010, 0xa7a00010, 0x8021, 
-0xc004ca7, 0x24040001, 0x26100001, 0x2e020020, 
-0x1440fffb, 0x0, 0xc004ca7, 0x2021, 
-0xc004ca7, 0x24040001, 0xc004ca7, 0x24040001, 
-0xc004ca7, 0x2021, 0x24100010, 0x32020001, 
-0x10400002, 0x2021, 0x24040001, 0xc004ca7, 
+0xc004cab, 0x24040001, 0x26100001, 0x2e020020, 
+0x1440fffb, 0x0, 0xc004cab, 0x2021, 
+0xc004cab, 0x24040001, 0xc004cab, 0x24040001, 
+0xc004cab, 0x2021, 0x24100010, 0x32020001, 
+0x10400002, 0x2021, 0x24040001, 0xc004cab, 
 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 
 0x32020018, 0x10400002, 0x2021, 0x24040001, 
-0xc004ca7, 0x108042, 0x1600fffa, 0x32020018, 
-0xc004ccd, 0x34108000, 0xc004ccd, 0x0, 
-0xc004c87, 0x0, 0x50400005, 0x108042, 
+0xc004cab, 0x108042, 0x1600fffa, 0x32020018, 
+0xc004cd1, 0x34108000, 0xc004cd1, 0x0, 
+0xc004c8b, 0x0, 0x50400005, 0x108042, 
 0x96220000, 0x501025, 0xa6220000, 0x108042, 
-0x1600fff7, 0x0, 0xc004ccd, 0x8021, 
+0x1600fff7, 0x0, 0xc004cd1, 0x8021, 
 0x97a20010, 0x27b10010, 0x34420001, 0xa7a20010, 
-0xc004ca7, 0x24040001, 0x26100001, 0x2e020020, 
-0x1440fffb, 0x0, 0xc004ca7, 0x2021, 
-0xc004ca7, 0x24040001, 0xc004ca7, 0x2021, 
-0xc004ca7, 0x24040001, 0x24100010, 0x32020001, 
-0x10400002, 0x2021, 0x24040001, 0xc004ca7, 
+0xc004cab, 0x24040001, 0x26100001, 0x2e020020, 
+0x1440fffb, 0x0, 0xc004cab, 0x2021, 
+0xc004cab, 0x24040001, 0xc004cab, 0x2021, 
+0xc004cab, 0x24040001, 0x24100010, 0x32020001, 
+0x10400002, 0x2021, 0x24040001, 0xc004cab, 
 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 
 0x32020018, 0x10400002, 0x2021, 0x24040001, 
-0xc004ca7, 0x108042, 0x1600fffa, 0x32020018, 
-0xc004ca7, 0x24040001, 0xc004ca7, 0x2021, 
+0xc004cab, 0x108042, 0x1600fffa, 0x32020018, 
+0xc004cab, 0x24040001, 0xc004cab, 0x2021, 
 0x34108000, 0x96220000, 0x501024, 0x10400002, 
-0x2021, 0x24040001, 0xc004ca7, 0x108042, 
-0x1600fff8, 0x0, 0xc004ccd, 0x0, 
-0x8f830054, 0x8004c72, 0x2402000a, 0x8f830054, 
-0x3c020001, 0x8c42553c, 0x2463ff9c, 0x431023, 
-0x2c420064, 0x1440019b, 0x2402000b, 0x8004c80, 
+0x2021, 0x24040001, 0xc004cab, 0x108042, 
+0x1600fff8, 0x0, 0xc004cd1, 0x0, 
+0x8f830054, 0x8004c76, 0x2402000a, 0x8f830054, 
+0x3c020001, 0x8c42554c, 0x2463ff9c, 0x431023, 
+0x2c420064, 0x1440019b, 0x2402000b, 0x8004c84, 
 0x0, 0x27b10010, 0xa7a00010, 0x8021, 
-0xc004ca7, 0x24040001, 0x26100001, 0x2e020020, 
-0x1440fffb, 0x0, 0xc004ca7, 0x2021, 
-0xc004ca7, 0x24040001, 0xc004ca7, 0x24040001, 
-0xc004ca7, 0x2021, 0x24100010, 0x32020001, 
-0x10400002, 0x2021, 0x24040001, 0xc004ca7, 
+0xc004cab, 0x24040001, 0x26100001, 0x2e020020, 
+0x1440fffb, 0x0, 0xc004cab, 0x2021, 
+0xc004cab, 0x24040001, 0xc004cab, 0x24040001, 
+0xc004cab, 0x2021, 0x24100010, 0x32020001, 
+0x10400002, 0x2021, 0x24040001, 0xc004cab, 
 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 
 0x32020017, 0x10400002, 0x2021, 0x24040001, 
-0xc004ca7, 0x108042, 0x1600fffa, 0x32020017, 
-0xc004ccd, 0x34108000, 0xc004ccd, 0x0, 
-0xc004c87, 0x0, 0x50400005, 0x108042, 
+0xc004cab, 0x108042, 0x1600fffa, 0x32020017, 
+0xc004cd1, 0x34108000, 0xc004cd1, 0x0, 
+0xc004c8b, 0x0, 0x50400005, 0x108042, 
 0x96220000, 0x501025, 0xa6220000, 0x108042, 
-0x1600fff7, 0x0, 0xc004ccd, 0x8021, 
+0x1600fff7, 0x0, 0xc004cd1, 0x8021, 
 0x97a20010, 0x27b10010, 0x34420700, 0xa7a20010, 
-0xc004ca7, 0x24040001, 0x26100001, 0x2e020020, 
-0x1440fffb, 0x0, 0xc004ca7, 0x2021, 
-0xc004ca7, 0x24040001, 0xc004ca7, 0x2021, 
-0xc004ca7, 0x24040001, 0x24100010, 0x32020001, 
-0x10400002, 0x2021, 0x24040001, 0xc004ca7, 
+0xc004cab, 0x24040001, 0x26100001, 0x2e020020, 
+0x1440fffb, 0x0, 0xc004cab, 0x2021, 
+0xc004cab, 0x24040001, 0xc004cab, 0x2021, 
+0xc004cab, 0x24040001, 0x24100010, 0x32020001, 
+0x10400002, 0x2021, 0x24040001, 0xc004cab, 
 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 
 0x32020017, 0x10400002, 0x2021, 0x24040001, 
-0xc004ca7, 0x108042, 0x1600fffa, 0x32020017, 
-0xc004ca7, 0x24040001, 0xc004ca7, 0x2021, 
+0xc004cab, 0x108042, 0x1600fffa, 0x32020017, 
+0xc004cab, 0x24040001, 0xc004cab, 0x2021, 
 0x34108000, 0x96220000, 0x501024, 0x10400002, 
-0x2021, 0x24040001, 0xc004ca7, 0x108042, 
-0x1600fff8, 0x0, 0xc004ccd, 0x0, 
-0x8f830054, 0x8004c72, 0x2402000c, 0x8f830054, 
-0x3c020001, 0x8c42553c, 0x2463ff9c, 0x431023, 
-0x2c420064, 0x14400127, 0x24020012, 0x8004c80, 
+0x2021, 0x24040001, 0xc004cab, 0x108042, 
+0x1600fff8, 0x0, 0xc004cd1, 0x0, 
+0x8f830054, 0x8004c76, 0x2402000c, 0x8f830054, 
+0x3c020001, 0x8c42554c, 0x2463ff9c, 0x431023, 
+0x2c420064, 0x14400127, 0x24020012, 0x8004c84, 
 0x0, 0x27b10010, 0xa7a00010, 0x8021, 
-0xc004ca7, 0x24040001, 0x26100001, 0x2e020020, 
-0x1440fffb, 0x0, 0xc004ca7, 0x2021, 
-0xc004ca7, 0x24040001, 0xc004ca7, 0x24040001, 
-0xc004ca7, 0x2021, 0x24100010, 0x32020001, 
-0x10400002, 0x2021, 0x24040001, 0xc004ca7, 
+0xc004cab, 0x24040001, 0x26100001, 0x2e020020, 
+0x1440fffb, 0x0, 0xc004cab, 0x2021, 
+0xc004cab, 0x24040001, 0xc004cab, 0x24040001, 
+0xc004cab, 0x2021, 0x24100010, 0x32020001, 
+0x10400002, 0x2021, 0x24040001, 0xc004cab, 
 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 
 0x32020014, 0x10400002, 0x2021, 0x24040001, 
-0xc004ca7, 0x108042, 0x1600fffa, 0x32020014, 
-0xc004ccd, 0x34108000, 0xc004ccd, 0x0, 
-0xc004c87, 0x0, 0x50400005, 0x108042, 
+0xc004cab, 0x108042, 0x1600fffa, 0x32020014, 
+0xc004cd1, 0x34108000, 0xc004cd1, 0x0, 
+0xc004c8b, 0x0, 0x50400005, 0x108042, 
 0x96220000, 0x501025, 0xa6220000, 0x108042, 
-0x1600fff7, 0x0, 0xc004ccd, 0x8021, 
+0x1600fff7, 0x0, 0xc004cd1, 0x8021, 
 0x97a20010, 0x27b10010, 0x34420010, 0xa7a20010, 
-0xc004ca7, 0x24040001, 0x26100001, 0x2e020020, 
-0x1440fffb, 0x0, 0xc004ca7, 0x2021, 
-0xc004ca7, 0x24040001, 0xc004ca7, 0x2021, 
-0xc004ca7, 0x24040001, 0x24100010, 0x32020001, 
-0x10400002, 0x2021, 0x24040001, 0xc004ca7, 
+0xc004cab, 0x24040001, 0x26100001, 0x2e020020, 
+0x1440fffb, 0x0, 0xc004cab, 0x2021, 
+0xc004cab, 0x24040001, 0xc004cab, 0x2021, 
+0xc004cab, 0x24040001, 0x24100010, 0x32020001, 
+0x10400002, 0x2021, 0x24040001, 0xc004cab, 
 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 
 0x32020014, 0x10400002, 0x2021, 0x24040001, 
-0xc004ca7, 0x108042, 0x1600fffa, 0x32020014, 
-0xc004ca7, 0x24040001, 0xc004ca7, 0x2021, 
+0xc004cab, 0x108042, 0x1600fffa, 0x32020014, 
+0xc004cab, 0x24040001, 0xc004cab, 0x2021, 
 0x34108000, 0x96220000, 0x501024, 0x10400002, 
-0x2021, 0x24040001, 0xc004ca7, 0x108042, 
-0x1600fff8, 0x0, 0xc004ccd, 0x0, 
-0x8f830054, 0x8004c72, 0x24020013, 0x8f830054, 
-0x3c020001, 0x8c42553c, 0x2463ff9c, 0x431023, 
-0x2c420064, 0x144000b3, 0x2402000d, 0x8004c80, 
+0x2021, 0x24040001, 0xc004cab, 0x108042, 
+0x1600fff8, 0x0, 0xc004cd1, 0x0, 
+0x8f830054, 0x8004c76, 0x24020013, 0x8f830054, 
+0x3c020001, 0x8c42554c, 0x2463ff9c, 0x431023, 
+0x2c420064, 0x144000b3, 0x2402000d, 0x8004c84, 
 0x0, 0x27b10010, 0xa7a00010, 0x8021, 
-0xc004ca7, 0x24040001, 0x26100001, 0x2e020020, 
-0x1440fffb, 0x0, 0xc004ca7, 0x2021, 
-0xc004ca7, 0x24040001, 0xc004ca7, 0x24040001, 
-0xc004ca7, 0x2021, 0x24100010, 0x32020001, 
-0x10400002, 0x2021, 0x24040001, 0xc004ca7, 
+0xc004cab, 0x24040001, 0x26100001, 0x2e020020, 
+0x1440fffb, 0x0, 0xc004cab, 0x2021, 
+0xc004cab, 0x24040001, 0xc004cab, 0x24040001, 
+0xc004cab, 0x2021, 0x24100010, 0x32020001, 
+0x10400002, 0x2021, 0x24040001, 0xc004cab, 
 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 
 0x32020018, 0x10400002, 0x2021, 0x24040001, 
-0xc004ca7, 0x108042, 0x1600fffa, 0x32020018, 
-0xc004ccd, 0x34108000, 0xc004ccd, 0x0, 
-0xc004c87, 0x0, 0x50400005, 0x108042, 
+0xc004cab, 0x108042, 0x1600fffa, 0x32020018, 
+0xc004cd1, 0x34108000, 0xc004cd1, 0x0, 
+0xc004c8b, 0x0, 0x50400005, 0x108042, 
 0x96220000, 0x501025, 0xa6220000, 0x108042, 
-0x1600fff7, 0x0, 0xc004ccd, 0x8021, 
+0x1600fff7, 0x0, 0xc004cd1, 0x8021, 
 0x97a20010, 0x27b10010, 0x3042fffe, 0xa7a20010, 
-0xc004ca7, 0x24040001, 0x26100001, 0x2e020020, 
-0x1440fffb, 0x0, 0xc004ca7, 0x2021, 
-0xc004ca7, 0x24040001, 0xc004ca7, 0x2021, 
-0xc004ca7, 0x24040001, 0x24100010, 0x32020001, 
-0x10400002, 0x2021, 0x24040001, 0xc004ca7, 
+0xc004cab, 0x24040001, 0x26100001, 0x2e020020, 
+0x1440fffb, 0x0, 0xc004cab, 0x2021, 
+0xc004cab, 0x24040001, 0xc004cab, 0x2021, 
+0xc004cab, 0x24040001, 0x24100010, 0x32020001, 
+0x10400002, 0x2021, 0x24040001, 0xc004cab, 
 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 
 0x32020018, 0x10400002, 0x2021, 0x24040001, 
-0xc004ca7, 0x108042, 0x1600fffa, 0x32020018, 
-0xc004ca7, 0x24040001, 0xc004ca7, 0x2021, 
+0xc004cab, 0x108042, 0x1600fffa, 0x32020018, 
+0xc004cab, 0x24040001, 0xc004cab, 0x2021, 
 0x34108000, 0x96220000, 0x501024, 0x10400002, 
-0x2021, 0x24040001, 0xc004ca7, 0x108042, 
-0x1600fff8, 0x0, 0xc004ccd, 0x0, 
-0x8f830054, 0x8004c72, 0x2402000e, 0x24020840, 
-0xa7a20010, 0x27b10010, 0x8021, 0xc004ca7, 
+0x2021, 0x24040001, 0xc004cab, 0x108042, 
+0x1600fff8, 0x0, 0xc004cd1, 0x0, 
+0x8f830054, 0x8004c76, 0x2402000e, 0x24020840, 
+0xa7a20010, 0x27b10010, 0x8021, 0xc004cab, 
 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, 
-0x0, 0xc004ca7, 0x2021, 0xc004ca7, 
-0x24040001, 0xc004ca7, 0x2021, 0xc004ca7, 
+0x0, 0xc004cab, 0x2021, 0xc004cab, 
+0x24040001, 0xc004cab, 0x2021, 0xc004cab, 
 0x24040001, 0x24100010, 0x32020001, 0x10400002, 
-0x2021, 0x24040001, 0xc004ca7, 0x108042, 
+0x2021, 0x24040001, 0xc004cab, 0x108042, 
 0x1600fffa, 0x32020001, 0x24100010, 0x32020013, 
-0x10400002, 0x2021, 0x24040001, 0xc004ca7, 
-0x108042, 0x1600fffa, 0x32020013, 0xc004ca7, 
-0x24040001, 0xc004ca7, 0x2021, 0x34108000, 
+0x10400002, 0x2021, 0x24040001, 0xc004cab, 
+0x108042, 0x1600fffa, 0x32020013, 0xc004cab, 
+0x24040001, 0xc004cab, 0x2021, 0x34108000, 
 0x96220000, 0x501024, 0x10400002, 0x2021, 
-0x24040001, 0xc004ca7, 0x108042, 0x1600fff8, 
-0x0, 0xc004ccd, 0x0, 0x8f830054, 
-0x24020010, 0x3c010001, 0xac2254a0, 0x3c010001, 
-0x8004c82, 0xac23553c, 0x8f830054, 0x3c020001, 
-0x8c42553c, 0x2463ff9c, 0x431023, 0x2c420064, 
+0x24040001, 0xc004cab, 0x108042, 0x1600fff8, 
+0x0, 0xc004cd1, 0x0, 0x8f830054, 
+0x24020010, 0x3c010001, 0xac2254b0, 0x3c010001, 
+0x8004c86, 0xac23554c, 0x8f830054, 0x3c020001, 
+0x8c42554c, 0x2463ff9c, 0x431023, 0x2c420064, 
 0x14400004, 0x0, 0x24020011, 0x3c010001, 
-0xac2254a0, 0x8fbf0020, 0x8fb1001c, 0x8fb00018, 
+0xac2254b0, 0x8fbf0020, 0x8fb1001c, 0x8fb00018, 
 0x3e00008, 0x27bd0028, 0x8f850044, 0x8f820044, 
 0x3c030001, 0x431025, 0x3c030008, 0xaf820044, 
-0x8f840054, 0x8f820054, 0xa32824, 0x8004c93, 
+0x8f840054, 0x8f820054, 0xa32824, 0x8004c97, 
 0x24840001, 0x8f820054, 0x821023, 0x2c420002, 
 0x1440fffc, 0x0, 0x8f820044, 0x3c03fffe, 
 0x3463ffff, 0x431024, 0xaf820044, 0x8f830054, 
-0x8f820054, 0x8004ca1, 0x24630001, 0x8f820054, 
+0x8f820054, 0x8004ca5, 0x24630001, 0x8f820054, 
 0x621023, 0x2c420002, 0x1440fffc, 0x0, 
 0x3e00008, 0xa01021, 0x8f830044, 0x3c02fff0, 
 0x3442ffff, 0x42480, 0x621824, 0x3c020002, 
 0x822025, 0x641825, 0xaf830044, 0x8f820044, 
 0x3c030001, 0x431025, 0xaf820044, 0x8f830054, 
-0x8f820054, 0x8004cb9, 0x24630001, 0x8f820054, 
+0x8f820054, 0x8004cbd, 0x24630001, 0x8f820054, 
 0x621023, 0x2c420002, 0x1440fffc, 0x0, 
 0x8f820044, 0x3c03fffe, 0x3463ffff, 0x431024, 
-0xaf820044, 0x8f830054, 0x8f820054, 0x8004cc7, 
+0xaf820044, 0x8f830054, 0x8f820054, 0x8004ccb, 
 0x24630001, 0x8f820054, 0x621023, 0x2c420002, 
 0x1440fffc, 0x0, 0x3e00008, 0x0, 
 0x8f820044, 0x3c03fff0, 0x3463ffff, 0x431024, 
 0xaf820044, 0x8f820044, 0x3c030001, 0x431025, 
-0xaf820044, 0x8f830054, 0x8f820054, 0x8004cdb, 
+0xaf820044, 0x8f830054, 0x8f820054, 0x8004cdf, 
 0x24630001, 0x8f820054, 0x621023, 0x2c420002, 
 0x1440fffc, 0x0, 0x8f820044, 0x3c03fffe, 
 0x3463ffff, 0x431024, 0xaf820044, 0x8f830054, 
-0x8f820054, 0x8004ce9, 0x24630001, 0x8f820054, 
+0x8f820054, 0x8004ced, 0x24630001, 0x8f820054, 
 0x621023, 0x2c420002, 0x1440fffc, 0x0, 
 0x3e00008, 0x0, 0x0, 0x27bdffe8, 
 0xafbf0010, 0x3c030001, 0x771821, 0x8c6383ac, 
 0x24020008, 0x1462022c, 0x803021, 0x3c020001, 
-0x8c425528, 0x14400033, 0x0, 0x8f850224, 
+0x8c425538, 0x14400033, 0x0, 0x8f850224, 
 0x38a30020, 0x2c630001, 0x38a20010, 0x2c420001, 
 0x621825, 0x1460000d, 0x38a30030, 0x2c630001, 
 0x38a20400, 0x2c420001, 0x621825, 0x14600007, 
 0x38a30402, 0x2c630001, 0x38a20404, 0x2c420001, 
 0x621825, 0x10600005, 0x0, 0xc00429f, 
-0x0, 0x8004d29, 0x2402000e, 0xc0043e1, 
-0x0, 0x3c050001, 0x8ca55478, 0xc0050af, 
-0x2021, 0x3c030001, 0x8c635478, 0x24020004, 
-0x14620005, 0x2403fffb, 0x3c020001, 0x8c425474, 
-0x8004d25, 0x2403fff7, 0x3c020001, 0x8c425474, 
-0x431024, 0x3c010001, 0xac225474, 0x2402000e, 
-0x3c010001, 0xc00429f, 0xac227550, 0x8004f23, 
+0x0, 0x8004d2d, 0x2402000e, 0xc0043e1, 
+0x0, 0x3c050001, 0x8ca55488, 0xc0050b3, 
+0x2021, 0x3c030001, 0x8c635488, 0x24020004, 
+0x14620005, 0x2403fffb, 0x3c020001, 0x8c425484, 
+0x8004d29, 0x2403fff7, 0x3c020001, 0x8c425484, 
+0x431024, 0x3c010001, 0xac225484, 0x2402000e, 
+0x3c010001, 0xc00429f, 0xac227560, 0x8004f27, 
 0x0, 0x8f820220, 0x3c030400, 0x431024, 
 0x10400027, 0x2403ffbf, 0x8f850224, 0x3c020001, 
-0x8c42755c, 0xa32024, 0x431024, 0x1482000c, 
-0x0, 0x3c020001, 0x8c427560, 0x24420001, 
-0x3c010001, 0xac227560, 0x2c420002, 0x14400008, 
-0x24020001, 0x3c010001, 0x8004d49, 0xac227580, 
-0x3c010001, 0xac207560, 0x3c010001, 0xac207580, 
-0x3c020001, 0x8c427580, 0x10400006, 0x30a20040, 
-0x10400004, 0x24020001, 0x3c010001, 0x8004d54, 
-0xac227584, 0x3c010001, 0xac207584, 0x3c010001, 
-0xac25755c, 0x3c010001, 0x8004d64, 0xac207590, 
-0x24020001, 0x3c010001, 0xac227590, 0x3c010001, 
-0xac207580, 0x3c010001, 0xac207560, 0x3c010001, 
-0xac207584, 0x3c010001, 0xac20755c, 0x3c030001, 
-0x8c637550, 0x3c020001, 0x8c427554, 0x10620003, 
-0x3c020200, 0x3c010001, 0xac237554, 0xc21024, 
+0x8c42756c, 0xa32024, 0x431024, 0x1482000c, 
+0x0, 0x3c020001, 0x8c427570, 0x24420001, 
+0x3c010001, 0xac227570, 0x2c420002, 0x14400008, 
+0x24020001, 0x3c010001, 0x8004d4d, 0xac227590, 
+0x3c010001, 0xac207570, 0x3c010001, 0xac207590, 
+0x3c020001, 0x8c427590, 0x10400006, 0x30a20040, 
+0x10400004, 0x24020001, 0x3c010001, 0x8004d58, 
+0xac227594, 0x3c010001, 0xac207594, 0x3c010001, 
+0xac25756c, 0x3c010001, 0x8004d68, 0xac2075a0, 
+0x24020001, 0x3c010001, 0xac2275a0, 0x3c010001, 
+0xac207590, 0x3c010001, 0xac207570, 0x3c010001, 
+0xac207594, 0x3c010001, 0xac20756c, 0x3c030001, 
+0x8c637560, 0x3c020001, 0x8c427564, 0x10620003, 
+0x3c020200, 0x3c010001, 0xac237564, 0xc21024, 
 0x10400007, 0x2463ffff, 0x8f820220, 0x24030001, 
-0x3c010001, 0xac23547c, 0x8004f21, 0x3c03f700, 
+0x3c010001, 0xac23548c, 0x8004f25, 0x3c03f700, 
 0x2c62000e, 0x104001a8, 0x31080, 0x3c010001, 
-0x220821, 0x8c225350, 0x400008, 0x0, 
-0x3c010001, 0xac207580, 0x3c010001, 0xac207560, 
-0x3c010001, 0xac20755c, 0x3c010001, 0xac207584, 
-0x3c010001, 0xac207578, 0x3c010001, 0xac207570, 
+0x220821, 0x8c225360, 0x400008, 0x0, 
+0x3c010001, 0xac207590, 0x3c010001, 0xac207570, 
+0x3c010001, 0xac20756c, 0x3c010001, 0xac207594, 
+0x3c010001, 0xac207588, 0x3c010001, 0xac207580, 
 0xc0047cc, 0xaf800224, 0x24020002, 0x3c010001, 
-0xac227550, 0x3c020001, 0x8c427590, 0x14400056, 
+0xac227560, 0x3c020001, 0x8c4275a0, 0x14400056, 
 0x3c03fdff, 0x8ee20000, 0x3463ffff, 0x431024, 
 0xc00429f, 0xaee20000, 0xaf800204, 0x8f820200, 
 0x2403fffd, 0x431024, 0xaf820200, 0x3c010001, 
-0xac2075a0, 0x8f830054, 0x3c020001, 0x8c427578, 
-0x24040001, 0x3c010001, 0xac24758c, 0x24420001, 
-0x3c010001, 0xac227578, 0x2c420004, 0x3c010001, 
-0xac237574, 0x14400006, 0x24020003, 0x3c010001, 
-0xac24547c, 0x3c010001, 0x8004f1f, 0xac207578, 
-0x3c010001, 0x8004f1f, 0xac227550, 0x8f830054, 
-0x3c020001, 0x8c427574, 0x2463d8f0, 0x431023, 
+0xac2075b0, 0x8f830054, 0x3c020001, 0x8c427588, 
+0x24040001, 0x3c010001, 0xac24759c, 0x24420001, 
+0x3c010001, 0xac227588, 0x2c420004, 0x3c010001, 
+0xac237584, 0x14400006, 0x24020003, 0x3c010001, 
+0xac24548c, 0x3c010001, 0x8004f23, 0xac207588, 
+0x3c010001, 0x8004f23, 0xac227560, 0x8f830054, 
+0x3c020001, 0x8c427584, 0x2463d8f0, 0x431023, 
 0x2c422710, 0x14400003, 0x24020004, 0x3c010001, 
-0xac227550, 0x3c020001, 0x8c427590, 0x14400026, 
+0xac227560, 0x3c020001, 0x8c4275a0, 0x14400026, 
 0x3c03fdff, 0x8ee20000, 0x3463ffff, 0x431024, 
-0x8004f1f, 0xaee20000, 0x3c040001, 0x8c84552c, 
-0x3c010001, 0xc004f26, 0xac207568, 0x3c020001, 
-0x8c42759c, 0xaf820204, 0x3c020001, 0x8c427590, 
+0x8004f23, 0xaee20000, 0x3c040001, 0x8c84553c, 
+0x3c010001, 0xc004f2a, 0xac207578, 0x3c020001, 
+0x8c4275ac, 0xaf820204, 0x3c020001, 0x8c4275a0, 
 0x14400015, 0x3c03fdff, 0x8ee20000, 0x3463ffff, 
 0x431024, 0xaee20000, 0x8f820204, 0x30420030, 
-0x1440013c, 0x24020002, 0x3c030001, 0x8c63759c, 
-0x24020005, 0x3c010001, 0xac227550, 0x3c010001, 
-0x8004f1f, 0xac2375a0, 0x3c020001, 0x8c427590, 
-0x10400010, 0x3c03fdff, 0x3c020001, 0x8c4254fc, 
-0x24420001, 0x3c010001, 0xac2254fc, 0x2c420002, 
-0x14400131, 0x24020001, 0x3c010001, 0xac225504, 
-0x3c010001, 0xac2054fc, 0x3c010001, 0x8004f1f, 
-0xac22547c, 0x8ee20000, 0x3463ffff, 0x431024, 
-0xaee20000, 0x3c020001, 0x8c427580, 0x10400122, 
-0x0, 0x3c020001, 0x8c42755c, 0x1040011e, 
-0x0, 0x3c010001, 0xac227588, 0x24020003, 
-0x3c010001, 0xac227560, 0x8004ec0, 0x24020006, 
-0x3c010001, 0xac207568, 0x8f820204, 0x34420040, 
-0xaf820204, 0x3c020001, 0x8c4275a0, 0x24030007, 
-0x3c010001, 0xac237550, 0x34420040, 0x3c010001, 
-0xac2275a0, 0x3c020001, 0x8c427580, 0x10400005, 
-0x0, 0x3c020001, 0x8c42755c, 0x104000f9, 
-0x24020002, 0x3c050001, 0x24a57560, 0x8ca20000, 
+0x1440013c, 0x24020002, 0x3c030001, 0x8c6375ac, 
+0x24020005, 0x3c010001, 0xac227560, 0x3c010001, 
+0x8004f23, 0xac2375b0, 0x3c020001, 0x8c4275a0, 
+0x10400010, 0x3c03fdff, 0x3c020001, 0x8c42550c, 
+0x24420001, 0x3c010001, 0xac22550c, 0x2c420002, 
+0x14400131, 0x24020001, 0x3c010001, 0xac225514, 
+0x3c010001, 0xac20550c, 0x3c010001, 0x8004f23, 
+0xac22548c, 0x8ee20000, 0x3463ffff, 0x431024, 
+0xaee20000, 0x3c020001, 0x8c427590, 0x10400122, 
+0x0, 0x3c020001, 0x8c42756c, 0x1040011e, 
+0x0, 0x3c010001, 0xac227598, 0x24020003, 
+0x3c010001, 0xac227570, 0x8004ec4, 0x24020006, 
+0x3c010001, 0xac207578, 0x8f820204, 0x34420040, 
+0xaf820204, 0x3c020001, 0x8c4275b0, 0x24030007, 
+0x3c010001, 0xac237560, 0x34420040, 0x3c010001, 
+0xac2275b0, 0x3c020001, 0x8c427590, 0x10400005, 
+0x0, 0x3c020001, 0x8c42756c, 0x104000f9, 
+0x24020002, 0x3c050001, 0x24a57570, 0x8ca20000, 
 0x2c424e21, 0x104000f3, 0x24020002, 0x3c020001, 
-0x8c427584, 0x104000f8, 0x2404ffbf, 0x3c020001, 
-0x8c42755c, 0x3c030001, 0x8c637588, 0x441024, 
+0x8c427594, 0x104000f8, 0x2404ffbf, 0x3c020001, 
+0x8c42756c, 0x3c030001, 0x8c637598, 0x441024, 
 0x641824, 0x10430004, 0x24020001, 0x3c010001, 
-0x8004f1f, 0xac227550, 0x24020003, 0xaca20000, 
-0x24020008, 0x3c010001, 0xac227550, 0x3c020001, 
-0x8c42758c, 0x1040000c, 0x24020001, 0x3c040001, 
-0xc004f33, 0x8c84755c, 0x3c020001, 0x8c4275a8, 
-0x14400005, 0x24020001, 0x3c020001, 0x8c4275a4, 
-0x10400006, 0x24020001, 0x3c010001, 0xac22547c, 
-0x3c010001, 0x8004f1f, 0xac207578, 0x3c020001, 
-0x8c427570, 0x3c030001, 0x8c63755c, 0x2c420001, 
-0x210c0, 0x30630008, 0x3c010001, 0xac227570, 
-0x3c010001, 0xac23756c, 0x8f830054, 0x24020009, 
-0x3c010001, 0xac227550, 0x3c010001, 0x8004f1f, 
-0xac237574, 0x8f830054, 0x3c020001, 0x8c427574, 
+0x8004f23, 0xac227560, 0x24020003, 0xaca20000, 
+0x24020008, 0x3c010001, 0xac227560, 0x3c020001, 
+0x8c42759c, 0x1040000c, 0x24020001, 0x3c040001, 
+0xc004f37, 0x8c84756c, 0x3c020001, 0x8c4275b8, 
+0x14400005, 0x24020001, 0x3c020001, 0x8c4275b4, 
+0x10400006, 0x24020001, 0x3c010001, 0xac22548c, 
+0x3c010001, 0x8004f23, 0xac207588, 0x3c020001, 
+0x8c427580, 0x3c030001, 0x8c63756c, 0x2c420001, 
+0x210c0, 0x30630008, 0x3c010001, 0xac227580, 
+0x3c010001, 0xac23757c, 0x8f830054, 0x24020009, 
+0x3c010001, 0xac227560, 0x3c010001, 0x8004f23, 
+0xac237584, 0x8f830054, 0x3c020001, 0x8c427584, 
 0x2463d8f0, 0x431023, 0x2c422710, 0x144000a8, 
-0x0, 0x3c020001, 0x8c427580, 0x10400005, 
-0x0, 0x3c020001, 0x8c42755c, 0x104000a9, 
-0x24020002, 0x3c030001, 0x24637560, 0x8c620000, 
+0x0, 0x3c020001, 0x8c427590, 0x10400005, 
+0x0, 0x3c020001, 0x8c42756c, 0x104000a9, 
+0x24020002, 0x3c030001, 0x24637570, 0x8c620000, 
 0x2c424e21, 0x104000a3, 0x24020002, 0x3c020001, 
-0x8c42758c, 0x1040000e, 0x0, 0x3c020001, 
-0x8c42755c, 0x3c010001, 0xac20758c, 0x30420080, 
+0x8c42759c, 0x1040000e, 0x0, 0x3c020001, 
+0x8c42756c, 0x3c010001, 0xac20759c, 0x30420080, 
 0x1040002f, 0x2402000c, 0x8f820204, 0x30420080, 
-0x1440000c, 0x24020003, 0x8004ead, 0x2402000c, 
-0x3c020001, 0x8c42755c, 0x30420080, 0x14400005, 
+0x1440000c, 0x24020003, 0x8004eb1, 0x2402000c, 
+0x3c020001, 0x8c42756c, 0x30420080, 0x14400005, 
 0x24020003, 0x8f820204, 0x30420080, 0x1040001f, 
 0x24020003, 0xac620000, 0x2402000a, 0x3c010001, 
-0xac227550, 0x3c040001, 0x24847598, 0x8c820000, 
-0x3c030001, 0x8c637570, 0x431025, 0xaf820204, 
-0x8c830000, 0x3c040001, 0x8c847570, 0x2402000b, 
-0x3c010001, 0xac227550, 0x641825, 0x3c010001, 
-0xac2375a0, 0x3c050001, 0x24a57560, 0x8ca20000, 
+0xac227560, 0x3c040001, 0x248475a8, 0x8c820000, 
+0x3c030001, 0x8c637580, 0x431025, 0xaf820204, 
+0x8c830000, 0x3c040001, 0x8c847580, 0x2402000b, 
+0x3c010001, 0xac227560, 0x641825, 0x3c010001, 
+0xac2375b0, 0x3c050001, 0x24a57570, 0x8ca20000, 
 0x2c424e21, 0x1040006f, 0x24020002, 0x3c020001, 
-0x8c427590, 0x10400005, 0x0, 0x2402000c, 
-0x3c010001, 0x8004f1f, 0xac227550, 0x3c020001, 
-0x8c427580, 0x1040006c, 0x0, 0x3c040001, 
-0x8c84755c, 0x1080005e, 0x30820008, 0x3c030001, 
-0x8c63756c, 0x10620064, 0x24020003, 0x3c010001, 
-0xac247588, 0xaca20000, 0x24020006, 0x3c010001, 
-0x8004f1f, 0xac227550, 0x8f820200, 0x34420002, 
+0x8c4275a0, 0x10400005, 0x0, 0x2402000c, 
+0x3c010001, 0x8004f23, 0xac227560, 0x3c020001, 
+0x8c427590, 0x1040006c, 0x0, 0x3c040001, 
+0x8c84756c, 0x1080005e, 0x30820008, 0x3c030001, 
+0x8c63757c, 0x10620064, 0x24020003, 0x3c010001, 
+0xac247598, 0xaca20000, 0x24020006, 0x3c010001, 
+0x8004f23, 0xac227560, 0x8f820200, 0x34420002, 
 0xaf820200, 0x8f830054, 0x2402000d, 0x3c010001, 
-0xac227550, 0x3c010001, 0xac237574, 0x8f830054, 
-0x3c020001, 0x8c427574, 0x2463d8f0, 0x431023, 
+0xac227560, 0x3c010001, 0xac237584, 0x8f830054, 
+0x3c020001, 0x8c427584, 0x2463d8f0, 0x431023, 
 0x2c422710, 0x1440003a, 0x0, 0x3c020001, 
-0x8c427590, 0x10400029, 0x2402000e, 0x3c030001, 
-0x8c6375a4, 0x3c010001, 0x14600015, 0xac227550, 
-0xc0043e1, 0x0, 0x3c050001, 0x8ca55478, 
-0xc0050af, 0x2021, 0x3c030001, 0x8c635478, 
+0x8c4275a0, 0x10400029, 0x2402000e, 0x3c030001, 
+0x8c6375b4, 0x3c010001, 0x14600015, 0xac227560, 
+0xc0043e1, 0x0, 0x3c050001, 0x8ca55488, 
+0xc0050b3, 0x2021, 0x3c030001, 0x8c635488, 
 0x24020004, 0x14620005, 0x2403fffb, 0x3c020001, 
-0x8c425474, 0x8004eee, 0x2403fff7, 0x3c020001, 
-0x8c425474, 0x431024, 0x3c010001, 0xac225474, 
+0x8c425484, 0x8004ef2, 0x2403fff7, 0x3c020001, 
+0x8c425484, 0x431024, 0x3c010001, 0xac225484, 
 0x8ee20000, 0x3c030200, 0x431025, 0xaee20000, 
-0x8f820224, 0x3c010001, 0xac2275ac, 0x8f820220, 
+0x8f820224, 0x3c010001, 0xac2275bc, 0x8f820220, 
 0x2403fffb, 0x431024, 0xaf820220, 0x8f820220, 
-0x34420002, 0x8004f1f, 0xaf820220, 0x3c020001, 
-0x8c427580, 0x10400005, 0x0, 0x3c020001, 
-0x8c42755c, 0x1040000f, 0x24020002, 0x3c020001, 
-0x8c427560, 0x2c424e21, 0x1040000a, 0x24020002, 
-0x3c020001, 0x8c427580, 0x1040000f, 0x0, 
-0x3c020001, 0x8c42755c, 0x1440000b, 0x0, 
-0x24020002, 0x3c010001, 0x8004f1f, 0xac227550, 
-0x3c020001, 0x8c427580, 0x10400003, 0x0, 
+0x34420002, 0x8004f23, 0xaf820220, 0x3c020001, 
+0x8c427590, 0x10400005, 0x0, 0x3c020001, 
+0x8c42756c, 0x1040000f, 0x24020002, 0x3c020001, 
+0x8c427570, 0x2c424e21, 0x1040000a, 0x24020002, 
+0x3c020001, 0x8c427590, 0x1040000f, 0x0, 
+0x3c020001, 0x8c42756c, 0x1440000b, 0x0, 
+0x24020002, 0x3c010001, 0x8004f23, 0xac227560, 
+0x3c020001, 0x8c427590, 0x10400003, 0x0, 
 0xc00429f, 0x0, 0x8f820220, 0x3c03f700, 
 0x431025, 0xaf820220, 0x8fbf0010, 0x3e00008, 
-0x27bd0018, 0x3c030001, 0x246375a8, 0x8c620000, 
-0x10400005, 0x34422000, 0x3c010001, 0xac22759c, 
-0x8004f31, 0xac600000, 0x3c010001, 0xac24759c, 
+0x27bd0018, 0x3c030001, 0x246375b8, 0x8c620000, 
+0x10400005, 0x34422000, 0x3c010001, 0xac2275ac, 
+0x8004f35, 0xac600000, 0x3c010001, 0xac2475ac, 
 0x3e00008, 0x0, 0x27bdffe0, 0x30820030, 
-0xafbf0018, 0x3c010001, 0xac2275a4, 0x14400067, 
+0xafbf0018, 0x3c010001, 0xac2275b4, 0x14400067, 
 0x3c02ffff, 0x34421f0e, 0x821024, 0x14400061, 
 0x24020030, 0x30822000, 0x1040005d, 0x30838000, 
 0x31a02, 0x30820001, 0x21200, 0x3c040001, 
-0x8c84552c, 0x621825, 0x331c2, 0x3c030001, 
-0x24635508, 0x30828000, 0x21202, 0x30840001, 
+0x8c84553c, 0x621825, 0x331c2, 0x3c030001, 
+0x24635518, 0x30828000, 0x21202, 0x30840001, 
 0x42200, 0x441025, 0x239c2, 0x61080, 
 0x431021, 0x471021, 0x90430000, 0x24020001, 
 0x10620025, 0x0, 0x10600007, 0x24020002, 
 0x10620013, 0x24020003, 0x1062002c, 0x3c05000f, 
-0x8004f95, 0x0, 0x8f820200, 0x2403feff, 
+0x8004f99, 0x0, 0x8f820200, 0x2403feff, 
 0x431024, 0xaf820200, 0x8f820220, 0x3c03fffe, 
 0x3463ffff, 0x431024, 0xaf820220, 0x3c010001, 
-0xac2075c4, 0x3c010001, 0x8004fa0, 0xac2075cc, 
+0xac2075d4, 0x3c010001, 0x8004fa4, 0xac2075dc, 
 0x8f820200, 0x34420100, 0xaf820200, 0x8f820220, 
 0x3c03fffe, 0x3463ffff, 0x431024, 0xaf820220, 
-0x24020100, 0x3c010001, 0xac2275c4, 0x3c010001, 
-0x8004fa0, 0xac2075cc, 0x8f820200, 0x2403feff, 
+0x24020100, 0x3c010001, 0xac2275d4, 0x3c010001, 
+0x8004fa4, 0xac2075dc, 0x8f820200, 0x2403feff, 
 0x431024, 0xaf820200, 0x8f820220, 0x3c030001, 
-0x431025, 0xaf820220, 0x3c010001, 0xac2075c4, 
-0x3c010001, 0x8004fa0, 0xac2375cc, 0x8f820200, 
+0x431025, 0xaf820220, 0x3c010001, 0xac2075d4, 
+0x3c010001, 0x8004fa4, 0xac2375dc, 0x8f820200, 
 0x34420100, 0xaf820200, 0x8f820220, 0x3c030001, 
 0x431025, 0xaf820220, 0x24020100, 0x3c010001, 
-0xac2275c4, 0x3c010001, 0x8004fa0, 0xac2375cc, 
-0x34a5ffff, 0x3c040001, 0x24845388, 0xafa30010, 
-0xc002407, 0xafa00014, 0x8004fa0, 0x0, 
-0x24020030, 0x3c010001, 0xac2275a8, 0x8fbf0018, 
+0xac2275d4, 0x3c010001, 0x8004fa4, 0xac2375dc, 
+0x34a5ffff, 0x3c040001, 0x24845398, 0xafa30010, 
+0xc002407, 0xafa00014, 0x8004fa4, 0x0, 
+0x24020030, 0x3c010001, 0xac2275b8, 0x8fbf0018, 
 0x3e00008, 0x27bd0020, 0x0, 0x27bdffc8, 
 0xafb10024, 0x808821, 0xafb3002c, 0xa09821, 
-0xafb00020, 0xc08021, 0x3c040001, 0x248453a0, 
-0x3c050009, 0x3c020001, 0x8c425478, 0x34a59001, 
+0xafb00020, 0xc08021, 0x3c040001, 0x248453b0, 
+0x3c050009, 0x3c020001, 0x8c425488, 0x34a59001, 
 0x2203021, 0x2603821, 0xafbf0030, 0xafb20028, 
 0xa7a0001a, 0xafb00014, 0xc002407, 0xafa20010, 
 0x24020002, 0x126200ed, 0x2e620003, 0x10400005, 
-0x24020001, 0x1262000a, 0x3c02fffb, 0x80050a8, 
+0x24020001, 0x1262000a, 0x3c02fffb, 0x80050ac, 
 0x0, 0x24020004, 0x1262006d, 0x24020008, 
-0x1262006c, 0x3c02ffec, 0x80050a8, 0x0, 
+0x1262006c, 0x3c02ffec, 0x80050ac, 0x0, 
 0x3442ffff, 0x2028024, 0x119140, 0x3c010001, 
-0x320821, 0xac3075bc, 0x3c024000, 0x2021024, 
+0x320821, 0xac3075cc, 0x3c024000, 0x2021024, 
 0x10400046, 0x1023c2, 0x30840030, 0x101382, 
-0x3042000c, 0x3c030001, 0x246354a4, 0x431021, 
+0x3042000c, 0x3c030001, 0x246354b4, 0x431021, 
 0x823821, 0x3c020020, 0x2021024, 0x10400006, 
-0x24020100, 0x3c010001, 0x320821, 0xac2275c0, 
-0x8004fe7, 0x3c020080, 0x3c010001, 0x320821, 
-0xac2075c0, 0x3c020080, 0x2021024, 0x10400006, 
+0x24020100, 0x3c010001, 0x320821, 0xac2275d0, 
+0x8004feb, 0x3c020080, 0x3c010001, 0x320821, 
+0xac2075d0, 0x3c020080, 0x2021024, 0x10400006, 
 0x111940, 0x3c020001, 0x3c010001, 0x230821, 
-0x8004ff3, 0xac2275c8, 0x111140, 0x3c010001, 
-0x220821, 0xac2075c8, 0x94e30000, 0x32024000, 
+0x8004ff7, 0xac2275d8, 0x111140, 0x3c010001, 
+0x220821, 0xac2075d8, 0x94e30000, 0x32024000, 
 0x10400003, 0xa7a30018, 0x34624000, 0xa7a20018, 
 0x24040001, 0x94e20002, 0x24050004, 0x24e60002, 
-0x34420001, 0xc0048ea, 0xa4e20002, 0x24040001, 
-0x2821, 0xc0048ea, 0x27a60018, 0x3c020001, 
-0x8c425478, 0x24110001, 0x3c010001, 0xac315484, 
+0x34420001, 0xc0048ee, 0xa4e20002, 0x24040001, 
+0x2821, 0xc0048ee, 0x27a60018, 0x3c020001, 
+0x8c425488, 0x24110001, 0x3c010001, 0xac315494, 
 0x14530004, 0x32028000, 0xc00429f, 0x0, 
 0x32028000, 0x10400099, 0x0, 0xc00429f, 
-0x0, 0x24020002, 0x3c010001, 0xac31547c, 
-0x3c010001, 0x80050a8, 0xac225478, 0x24040001, 
-0x24050004, 0x27b0001a, 0xc0048ea, 0x2003021, 
-0x24040001, 0x2821, 0xc0048ea, 0x2003021, 
-0x3c020001, 0x521021, 0x8c4275b4, 0x3c040001, 
-0x8c845478, 0x3c03bfff, 0x3463ffff, 0x3c010001, 
-0xac335484, 0x431024, 0x3c010001, 0x320821, 
-0x10930078, 0xac2275b4, 0x80050a8, 0x0, 
+0x0, 0x24020002, 0x3c010001, 0xac31548c, 
+0x3c010001, 0x80050ac, 0xac225488, 0x24040001, 
+0x24050004, 0x27b0001a, 0xc0048ee, 0x2003021, 
+0x24040001, 0x2821, 0xc0048ee, 0x2003021, 
+0x3c020001, 0x521021, 0x8c4275c4, 0x3c040001, 
+0x8c845488, 0x3c03bfff, 0x3463ffff, 0x3c010001, 
+0xac335494, 0x431024, 0x3c010001, 0x320821, 
+0x10930078, 0xac2275c4, 0x80050ac, 0x0, 
 0x3c02ffec, 0x3442ffff, 0x2028024, 0x3c020008, 
 0x2028025, 0x111140, 0x3c010001, 0x220821, 
-0xac3075b8, 0x3c022000, 0x2021024, 0x10400009, 
-0x0, 0x3c020001, 0x8c425504, 0x14400005, 
-0x24020001, 0x3c010001, 0xac225528, 0x8005049, 
-0x3c024000, 0x3c010001, 0xac205528, 0x3c024000, 
+0xac3075c8, 0x3c022000, 0x2021024, 0x10400009, 
+0x0, 0x3c020001, 0x8c425514, 0x14400005, 
+0x24020001, 0x3c010001, 0xac225538, 0x800504d, 
+0x3c024000, 0x3c010001, 0xac205538, 0x3c024000, 
 0x2021024, 0x1440001c, 0x0, 0x3c020001, 
-0x8c425528, 0x10400007, 0x24022020, 0x3c010001, 
-0xac22552c, 0x24020001, 0x3c010001, 0x370821, 
+0x8c425538, 0x10400007, 0x24022020, 0x3c010001, 
+0xac22553c, 0x24020001, 0x3c010001, 0x370821, 
 0xac2283ac, 0x3c04bfff, 0x111940, 0x3c020001, 
-0x431021, 0x8c4275b0, 0x3c050001, 0x8ca55478, 
+0x431021, 0x8c4275c0, 0x3c050001, 0x8ca55488, 
 0x3484ffff, 0x441024, 0x3c010001, 0x230821, 
-0xac2275b0, 0x24020001, 0x10a20044, 0x0, 
-0x80050a6, 0x0, 0x3c020001, 0x8c425528, 
-0x1040001c, 0x24022000, 0x3c010001, 0xac22552c, 
+0xac2275c0, 0x24020001, 0x10a20044, 0x0, 
+0x80050aa, 0x0, 0x3c020001, 0x8c425538, 
+0x1040001c, 0x24022000, 0x3c010001, 0xac22553c, 
 0x3c0300a0, 0x2031024, 0x14430005, 0x111140, 
-0x3402a000, 0x3c010001, 0x80050a1, 0xac22552c, 
-0x3c030001, 0x621821, 0x8c6375b8, 0x3c020020, 
+0x3402a000, 0x3c010001, 0x80050a5, 0xac22553c, 
+0x3c030001, 0x621821, 0x8c6375c8, 0x3c020020, 
 0x621024, 0x10400004, 0x24022001, 0x3c010001, 
-0x80050a1, 0xac22552c, 0x3c020080, 0x621024, 
-0x1040001f, 0x3402a001, 0x3c010001, 0x80050a1, 
-0xac22552c, 0x3c020020, 0x2021024, 0x10400007, 
+0x80050a5, 0xac22553c, 0x3c020080, 0x621024, 
+0x1040001f, 0x3402a001, 0x3c010001, 0x80050a5, 
+0xac22553c, 0x3c020020, 0x2021024, 0x10400007, 
 0x111940, 0x24020100, 0x3c010001, 0x230821, 
-0xac2275c4, 0x8005095, 0x3c020080, 0x111140, 
-0x3c010001, 0x220821, 0xac2075c4, 0x3c020080, 
+0xac2275d4, 0x8005099, 0x3c020080, 0x111140, 
+0x3c010001, 0x220821, 0xac2075d4, 0x3c020080, 
 0x2021024, 0x10400006, 0x111940, 0x3c020001, 
-0x3c010001, 0x230821, 0x80050a1, 0xac2275cc, 
-0x111140, 0x3c010001, 0x220821, 0xac2075cc, 
-0x3c030001, 0x8c635478, 0x24020001, 0x10620003, 
+0x3c010001, 0x230821, 0x80050a5, 0xac2275dc, 
+0x111140, 0x3c010001, 0x220821, 0xac2075dc, 
+0x3c030001, 0x8c635488, 0x24020001, 0x10620003, 
 0x0, 0xc00429f, 0x0, 0x8fbf0030, 
 0x8fb3002c, 0x8fb20028, 0x8fb10024, 0x8fb00020, 
 0x3e00008, 0x27bd0038, 0x27bdffd0, 0xafb40028, 
@@ -4159,124 +4160,124 @@
 0x9821, 0xafb1001c, 0x8821, 0x24020002, 
 0xafbf002c, 0xafb00018, 0xa7a00012, 0x10a20068, 
 0xa7a00010, 0x2ca20003, 0x10400005, 0x24020001, 
-0x10a2000a, 0x148140, 0x8005172, 0x2201021, 
+0x10a2000a, 0x148140, 0x8005176, 0x2201021, 
 0x24020004, 0x10a2005e, 0x24020008, 0x10a2005d, 
-0x142940, 0x8005172, 0x2201021, 0x3c030001, 
-0x701821, 0x8c6375bc, 0x3c024000, 0x621024, 
+0x142940, 0x8005176, 0x2201021, 0x3c030001, 
+0x701821, 0x8c6375cc, 0x3c024000, 0x621024, 
 0x14400009, 0x24040001, 0x3c027fff, 0x3442ffff, 
-0x628824, 0x3c010001, 0x300821, 0xac3175b4, 
-0x8005172, 0x2201021, 0x24050001, 0xc0048a8, 
-0x27a60010, 0x24040001, 0x24050001, 0xc0048a8, 
+0x628824, 0x3c010001, 0x300821, 0xac3175c4, 
+0x8005176, 0x2201021, 0x24050001, 0xc0048ac, 
+0x27a60010, 0x24040001, 0x24050001, 0xc0048ac, 
 0x27a60010, 0x97a20010, 0x30420004, 0x10400034, 
-0x3c114000, 0x3c030001, 0x8c635540, 0x24020003, 
+0x3c114000, 0x3c030001, 0x8c635550, 0x24020003, 
 0x10620008, 0x2c620004, 0x14400029, 0x3c028000, 
-0x24020004, 0x10620014, 0x24040001, 0x8005115, 
+0x24020004, 0x10620014, 0x24040001, 0x8005119, 
 0x3c028000, 0x24040001, 0x24050011, 0x27b00012, 
-0xc0048a8, 0x2003021, 0x24040001, 0x24050011, 
-0xc0048a8, 0x2003021, 0x97a30012, 0x30624000, 
+0xc0048ac, 0x2003021, 0x24040001, 0x24050011, 
+0xc0048ac, 0x2003021, 0x97a30012, 0x30624000, 
 0x10400002, 0x3c130010, 0x3c130008, 0x3c120001, 
-0x8005112, 0x30628000, 0x24050014, 0x27b00012, 
-0xc0048a8, 0x2003021, 0x24040001, 0x24050014, 
-0xc0048a8, 0x2003021, 0x97a30012, 0x30621000, 
+0x8005116, 0x30628000, 0x24050014, 0x27b00012, 
+0xc0048ac, 0x2003021, 0x24040001, 0x24050014, 
+0xc0048ac, 0x2003021, 0x97a30012, 0x30621000, 
 0x10400002, 0x3c130010, 0x3c130008, 0x3c120001, 
 0x30620800, 0x54400001, 0x3c120002, 0x3c028000, 
-0x2221025, 0x2531825, 0x800511f, 0x438825, 
-0x3c110001, 0x2308821, 0x8e3175bc, 0x3c027fff, 
+0x2221025, 0x2531825, 0x8005123, 0x438825, 
+0x3c110001, 0x2308821, 0x8e3175cc, 0x3c027fff, 
 0x3442ffff, 0x2228824, 0x141140, 0x3c010001, 
-0x220821, 0xac3175b4, 0x8005172, 0x2201021, 
-0x142940, 0x3c030001, 0x651821, 0x8c6375b8, 
+0x220821, 0xac3175c4, 0x8005176, 0x2201021, 
+0x142940, 0x3c030001, 0x651821, 0x8c6375c8, 
 0x3c024000, 0x621024, 0x14400008, 0x3c027fff, 
 0x3442ffff, 0x628824, 0x3c010001, 0x250821, 
-0xac3175b0, 0x8005172, 0x2201021, 0x3c020001, 
-0x8c425488, 0x10400033, 0x3c11c00c, 0x3c020001, 
-0x8c425504, 0x3c04c00c, 0x34842000, 0x3c030001, 
-0x8c635528, 0x2102b, 0x21023, 0x441024, 
+0xac3175c0, 0x8005176, 0x2201021, 0x3c020001, 
+0x8c425498, 0x10400033, 0x3c11c00c, 0x3c020001, 
+0x8c425514, 0x3c04c00c, 0x34842000, 0x3c030001, 
+0x8c635538, 0x2102b, 0x21023, 0x441024, 
 0x10600003, 0x518825, 0x3c022000, 0x2228825, 
-0x3c020001, 0x451021, 0x8c4275c4, 0x10400003, 
-0x3c020020, 0x800514f, 0x2228825, 0x3c02ffdf, 
+0x3c020001, 0x451021, 0x8c4275d4, 0x10400003, 
+0x3c020020, 0x8005153, 0x2228825, 0x3c02ffdf, 
 0x3442ffff, 0x2228824, 0x141140, 0x3c010001, 
-0x220821, 0x8c2275cc, 0x10400003, 0x3c020080, 
-0x800515a, 0x2228825, 0x3c02ff7f, 0x3442ffff, 
-0x2228824, 0x3c020001, 0x8c4254f0, 0x10400002, 
-0x3c020800, 0x2228825, 0x3c020001, 0x8c4254f4, 
+0x220821, 0x8c2275dc, 0x10400003, 0x3c020080, 
+0x800515e, 0x2228825, 0x3c02ff7f, 0x3442ffff, 
+0x2228824, 0x3c020001, 0x8c425500, 0x10400002, 
+0x3c020800, 0x2228825, 0x3c020001, 0x8c425504, 
 0x10400002, 0x3c020400, 0x2228825, 0x3c020001, 
-0x8c4254f8, 0x10400006, 0x3c020100, 0x800516d, 
+0x8c425508, 0x10400006, 0x3c020100, 0x8005171, 
 0x2228825, 0x3c027fff, 0x3442ffff, 0x628824, 
-0x141140, 0x3c010001, 0x220821, 0xac3175b0, 
+0x141140, 0x3c010001, 0x220821, 0xac3175c0, 
 0x2201021, 0x8fbf002c, 0x8fb40028, 0x8fb30024, 
 0x8fb20020, 0x8fb1001c, 0x8fb00018, 0x3e00008, 
 0x27bd0030, 0x27bdffd8, 0xafb40020, 0x80a021, 
 0xafbf0024, 0xafb3001c, 0xafb20018, 0xafb10014, 
-0xafb00010, 0x8f900200, 0x3c030001, 0x8c635478, 
+0xafb00010, 0x8f900200, 0x3c030001, 0x8c635488, 
 0x8f930220, 0x24020002, 0x106200b4, 0x2c620003, 
 0x10400005, 0x24020001, 0x1062000a, 0x141940, 
-0x800523c, 0x0, 0x24020004, 0x1062005a, 
-0x24020008, 0x10620059, 0x149140, 0x800523c, 
-0x0, 0x3c040001, 0x832021, 0x8c8475bc, 
-0x3c110001, 0x2238821, 0x8e3175b4, 0x3c024000, 
+0x8005240, 0x0, 0x24020004, 0x1062005a, 
+0x24020008, 0x10620059, 0x149140, 0x8005240, 
+0x0, 0x3c040001, 0x832021, 0x8c8475cc, 
+0x3c110001, 0x2238821, 0x8e3175c4, 0x3c024000, 
 0x821024, 0x1040003e, 0x3c020008, 0x2221024, 
 0x10400020, 0x36100002, 0x3c020001, 0x431021, 
-0x8c4275c0, 0x10400005, 0x36100020, 0x36100100, 
-0x3c020020, 0x80051b1, 0x2228825, 0x2402feff, 
+0x8c4275d0, 0x10400005, 0x36100020, 0x36100100, 
+0x3c020020, 0x80051b5, 0x2228825, 0x2402feff, 
 0x2028024, 0x3c02ffdf, 0x3442ffff, 0x2228824, 
-0x141140, 0x3c010001, 0x220821, 0x8c2275c8, 
+0x141140, 0x3c010001, 0x220821, 0x8c2275d8, 
 0x10400005, 0x3c020001, 0x2629825, 0x3c020080, 
-0x80051d0, 0x2228825, 0x3c02fffe, 0x3442ffff, 
-0x2629824, 0x3c02ff7f, 0x3442ffff, 0x80051d0, 
+0x80051d4, 0x2228825, 0x3c02fffe, 0x3442ffff, 
+0x2629824, 0x3c02ff7f, 0x3442ffff, 0x80051d4, 
 0x2228824, 0x2402fedf, 0x2028024, 0x3c02fffe, 
 0x3442ffff, 0x2629824, 0x3c02ff5f, 0x3442ffff, 
-0x2228824, 0x3c010001, 0x230821, 0xac2075c0, 
-0x3c010001, 0x230821, 0xac2075c8, 0xc0047cc, 
+0x2228824, 0x3c010001, 0x230821, 0xac2075d0, 
+0x3c010001, 0x230821, 0xac2075d8, 0xc0047cc, 
 0x0, 0xaf900200, 0xaf930220, 0x8f820220, 
 0x2403fffb, 0x431024, 0xaf820220, 0x8f820220, 
-0x34420002, 0xaf820220, 0x80051e7, 0x141140, 
+0x34420002, 0xaf820220, 0x80051eb, 0x141140, 
 0x8f820200, 0x2403fffd, 0x431024, 0xc0047cc, 
 0xaf820200, 0x3c02bfff, 0x3442ffff, 0xc00429f, 
 0x2228824, 0x141140, 0x3c010001, 0x220821, 
-0x800523c, 0xac3175b4, 0x149140, 0x3c040001, 
-0x922021, 0x8c8475b8, 0x3c110001, 0x2328821, 
-0x8e3175b0, 0x3c024000, 0x821024, 0x14400011, 
-0x0, 0x3c020001, 0x8c425528, 0x14400006, 
+0x8005240, 0xac3175c4, 0x149140, 0x3c040001, 
+0x922021, 0x8c8475c8, 0x3c110001, 0x2328821, 
+0x8e3175c0, 0x3c024000, 0x821024, 0x14400011, 
+0x0, 0x3c020001, 0x8c425538, 0x14400006, 
 0x3c02bfff, 0x8f820200, 0x34420002, 0xc0047cc, 
 0xaf820200, 0x3c02bfff, 0x3442ffff, 0xc00429f, 
-0x2228824, 0x3c010001, 0x320821, 0x800523c, 
-0xac3175b0, 0x3c020001, 0x8c425528, 0x10400005, 
-0x3c020020, 0x3c020001, 0x8c425504, 0x1040002b, 
+0x2228824, 0x3c010001, 0x320821, 0x8005240, 
+0xac3175c0, 0x3c020001, 0x8c425538, 0x10400005, 
+0x3c020020, 0x3c020001, 0x8c425514, 0x1040002b, 
 0x3c020020, 0x821024, 0x10400007, 0x36100020, 
-0x24020100, 0x3c010001, 0x320821, 0xac2275c4, 
-0x800521c, 0x36100100, 0x3c010001, 0x320821, 
-0xac2075c4, 0x2402feff, 0x2028024, 0x3c020080, 
+0x24020100, 0x3c010001, 0x320821, 0xac2275d4, 
+0x8005220, 0x36100100, 0x3c010001, 0x320821, 
+0xac2075d4, 0x2402feff, 0x2028024, 0x3c020080, 
 0x821024, 0x10400007, 0x141940, 0x3c020001, 
-0x3c010001, 0x230821, 0xac2275cc, 0x800522d, 
+0x3c010001, 0x230821, 0xac2275dc, 0x8005231, 
 0x2629825, 0x141140, 0x3c010001, 0x220821, 
-0xac2075cc, 0x3c02fffe, 0x3442ffff, 0x2629824, 
+0xac2075dc, 0x3c02fffe, 0x3442ffff, 0x2629824, 
 0xc0047cc, 0x0, 0xaf900200, 0xaf930220, 
 0x8f820220, 0x2403fffb, 0x431024, 0xaf820220, 
 0x8f820220, 0x34420002, 0xaf820220, 0x141140, 
-0x3c010001, 0x220821, 0xac3175b0, 0x8fbf0024, 
+0x3c010001, 0x220821, 0xac3175c0, 0x8fbf0024, 
 0x8fb40020, 0x8fb3001c, 0x8fb20018, 0x8fb10014, 
 0x8fb00010, 0x3e00008, 0x27bd0028, 0x0 };
 u32 tigonFwRodata[(MAX_RODATA_LEN/4) + 1] __initdata = {
 0x24486561, 0x6465723a, 0x202f7072, 
 0x6f6a6563, 0x74732f72, 0x63732f73, 0x772f6765, 
-0x2f6e6963, 0x2f66772f, 0x636f6d6d, 0x6f6e2f66, 
-0x776d6169, 0x6e2e632c, 0x7620312e, 0x312e322e, 
-0x31312031, 0x3939382f, 0x30342f32, 0x37203232, 
-0x3a31333a, 0x34322073, 0x6875616e, 0x67204578, 
-0x70202400, 0x7468655f, 0x4441574e, 0x0, 
-0x53544143, 0x4b5f3120, 0x0, 0x42616453, 
-0x6e64526e, 0x67000000, 0x3f456e71, 0x45767400, 
-0x3f6e6f51, 0x64457650, 0x0, 0x6576526e, 
-0x6746756c, 0x6c000000, 0x496c6c43, 0x6f6e6652, 
-0x78000000, 0x53656e64, 0x436b5375, 0x6d000000, 
-0x52656376, 0x566c616e, 0x0, 0x0, 
+0x2f2e2f6e, 0x69632f66, 0x772f636f, 0x6d6d6f6e, 
+0x2f66776d, 0x61696e2e, 0x632c7620, 0x312e312e, 
+0x322e3131, 0x20313939, 0x382f3034, 0x2f323720, 
+0x32323a31, 0x333a3432, 0x20736875, 0x616e6720, 
+0x45787020, 0x24000000, 0x7468655f, 0x4441574e, 
+0x0, 0x53544143, 0x4b5f3120, 0x0, 
+0x42616453, 0x6e64526e, 0x67000000, 0x3f456e71, 
+0x45767400, 0x3f6e6f51, 0x64457650, 0x0, 
+0x6576526e, 0x6746756c, 0x6c000000, 0x496c6c43, 
+0x6f6e6652, 0x78000000, 0x53656e64, 0x436b5375, 
+0x6d000000, 0x52656376, 0x566c616e, 0x0, 
 0x0, 0x24486561, 0x6465723a, 0x202f7072, 
 0x6f6a6563, 0x74732f72, 0x63732f73, 0x772f6765, 
-0x2f6e6963, 0x2f66772f, 0x636f6d6d, 0x6f6e2f74, 
-0x696d6572, 0x2e632c76, 0x20312e31, 0x2e322e38, 
-0x20313939, 0x382f3037, 0x2f333120, 0x31373a35, 
-0x383a3435, 0x20736875, 0x616e6720, 0x45787020, 
-0x24000000, 0x542d446d, 0x61526431, 0x0, 
+0x2f2e2f6e, 0x69632f66, 0x772f636f, 0x6d6d6f6e, 
+0x2f74696d, 0x65722e63, 0x2c762031, 0x2e312e32, 
+0x2e382031, 0x3939382f, 0x30372f33, 0x31203137, 
+0x3a35383a, 0x34352073, 0x6875616e, 0x67204578, 
+0x70202400, 0x542d446d, 0x61526431, 0x0, 
 0x542d446d, 0x61424200, 0x542d446d, 0x61320000, 
 0x3f6e6f51, 0x64547845, 0x0, 0x3f6e6f51, 
 0x64527845, 0x0, 0x656e714d, 0x45765046, 
@@ -4286,11 +4287,11 @@
 0x6576526e, 0x6746756c, 0x6c000000, 0x0, 
 0x0, 0x24486561, 0x6465723a, 0x202f7072, 
 0x6f6a6563, 0x74732f72, 0x63732f73, 0x772f6765, 
-0x2f6e6963, 0x2f66772f, 0x636f6d6d, 0x6f6e2f63, 
-0x6f6d6d61, 0x6e642e63, 0x2c762031, 0x2e312e32, 
-0x2e313020, 0x31393938, 0x2f31312f, 0x31382031, 
-0x373a3131, 0x3a313820, 0x73687561, 0x6e672045, 
-0x78702024, 0x0, 0x3f4d626f, 0x78457674, 
+0x2f2e2f6e, 0x69632f66, 0x772f636f, 0x6d6d6f6e, 
+0x2f636f6d, 0x6d616e64, 0x2e632c76, 0x20312e31, 
+0x2e322e31, 0x30203139, 0x39382f31, 0x312f3138, 
+0x2031373a, 0x31313a31, 0x38207368, 0x75616e67, 
+0x20457870, 0x20240000, 0x3f4d626f, 0x78457674, 
 0x0, 0x4e4f636f, 0x6d616e64, 0x0, 
 0x68737465, 0x5f455252, 0x0, 0x412d4572, 
 0x72427563, 0x0, 0x4552524f, 0x522d4164, 
@@ -4309,29 +4310,29 @@
 0x7e70, 0x80cc, 0x6e64, 0x81cc, 
 0x0, 0x24486561, 0x6465723a, 0x202f7072, 
 0x6f6a6563, 0x74732f72, 0x63732f73, 0x772f6765, 
-0x2f6e6963, 0x2f66772f, 0x636f6d6d, 0x6f6e2f64, 
-0x6d612e63, 0x2c762031, 0x2e312e32, 0x2e332031, 
-0x3939382f, 0x30342f32, 0x37203232, 0x3a31333a, 
-0x34312073, 0x6875616e, 0x67204578, 0x70202400, 
-0x646d6172, 0x6441544e, 0x0, 0x646d6177, 
-0x7241544e, 0x0, 0x0, 0x0, 
+0x2f2e2f6e, 0x69632f66, 0x772f636f, 0x6d6d6f6e, 
+0x2f646d61, 0x2e632c76, 0x20312e31, 0x2e322e33, 
+0x20313939, 0x382f3034, 0x2f323720, 0x32323a31, 
+0x333a3431, 0x20736875, 0x616e6720, 0x45787020, 
+0x24000000, 0x646d6172, 0x6441544e, 0x0, 
+0x646d6177, 0x7241544e, 0x0, 0x0, 
 0x0, 0x24486561, 0x6465723a, 0x202f7072, 
 0x6f6a6563, 0x74732f72, 0x63732f73, 0x772f6765, 
-0x2f6e6963, 0x2f66772f, 0x636f6d6d, 0x6f6e2f74, 
-0x72616365, 0x2e632c76, 0x20312e31, 0x2e322e32, 
-0x20313939, 0x382f3034, 0x2f323720, 0x32323a31, 
-0x333a3530, 0x20736875, 0x616e6720, 0x45787020, 
-0x24000000, 0x24486561, 0x6465723a, 0x202f7072, 
+0x2f2e2f6e, 0x69632f66, 0x772f636f, 0x6d6d6f6e, 
+0x2f747261, 0x63652e63, 0x2c762031, 0x2e312e32, 
+0x2e322031, 0x3939382f, 0x30342f32, 0x37203232, 
+0x3a31333a, 0x35302073, 0x6875616e, 0x67204578, 
+0x70202400, 0x24486561, 0x6465723a, 0x202f7072, 
 0x6f6a6563, 0x74732f72, 0x63732f73, 0x772f6765, 
-0x2f6e6963, 0x2f66772f, 0x636f6d6d, 0x6f6e2f64, 
-0x6174612e, 0x632c7620, 0x312e312e, 0x322e3220, 
-0x31393938, 0x2f30342f, 0x32372032, 0x323a3133, 
-0x3a343020, 0x73687561, 0x6e672045, 0x78702024, 
-0x0, 0x46575f56, 0x45525349, 0x4f4e3a20, 
-0x2331204d, 0x6f6e2046, 0x65622031, 0x2031363a, 
-0x35393a30, 0x31205053, 0x54203139, 0x39390000, 
+0x2f2e2f6e, 0x69632f66, 0x772f636f, 0x6d6d6f6e, 
+0x2f646174, 0x612e632c, 0x7620312e, 0x312e322e, 
+0x32203139, 0x39382f30, 0x342f3237, 0x2032323a, 
+0x31333a34, 0x30207368, 0x75616e67, 0x20457870, 
+0x20240000, 0x46575f56, 0x45525349, 0x4f4e3a20, 
+0x23312054, 0x75652041, 0x70722032, 0x30203137, 
+0x3a32313a, 0x30382050, 0x44542031, 0x39393900, 
 0x46575f43, 0x4f4d5049, 0x4c455f54, 0x494d453a, 
-0x2031363a, 0x35393a30, 0x31000000, 0x46575f43, 
+0x2031373a, 0x32313a30, 0x38000000, 0x46575f43, 
 0x4f4d5049, 0x4c455f42, 0x593a2064, 0x65767263, 
 0x73000000, 0x46575f43, 0x4f4d5049, 0x4c455f48, 
 0x4f53543a, 0x20636f6d, 0x70757465, 0x0, 
@@ -4342,17 +4343,17 @@
 0x2e320000, 0x0, 0x0, 0x0, 
 0x0, 0x24486561, 0x6465723a, 0x202f7072, 
 0x6f6a6563, 0x74732f72, 0x63732f73, 0x772f6765, 
-0x2f6e6963, 0x2f66772f, 0x636f6d6d, 0x6f6e2f6d, 
-0x656d2e63, 0x2c762031, 0x2e312e32, 0x2e322031, 
-0x3939382f, 0x30342f32, 0x37203232, 0x3a31333a, 
-0x34342073, 0x6875616e, 0x67204578, 0x70202400, 
-0x0, 0x24486561, 0x6465723a, 0x202f7072, 
+0x2f2e2f6e, 0x69632f66, 0x772f636f, 0x6d6d6f6e, 
+0x2f6d656d, 0x2e632c76, 0x20312e31, 0x2e322e32, 
+0x20313939, 0x382f3034, 0x2f323720, 0x32323a31, 
+0x333a3434, 0x20736875, 0x616e6720, 0x45787020, 
+0x24000000, 0x24486561, 0x6465723a, 0x202f7072, 
 0x6f6a6563, 0x74732f72, 0x63732f73, 0x772f6765, 
-0x2f6e6963, 0x2f66772f, 0x636f6d6d, 0x6f6e2f73, 
-0x656e642e, 0x632c7620, 0x312e312e, 0x322e3131, 
-0x20313939, 0x382f3132, 0x2f323220, 0x31373a31, 
-0x373a3535, 0x20736875, 0x616e6720, 0x45787020, 
-0x24000000, 0x736e6464, 0x654e6f51, 0x20000000, 
+0x2f2e2f6e, 0x69632f66, 0x772f636f, 0x6d6d6f6e, 
+0x2f73656e, 0x642e632c, 0x7620312e, 0x312e322e, 
+0x31312031, 0x3939382f, 0x31322f32, 0x32203137, 
+0x3a31373a, 0x35352073, 0x6875616e, 0x67204578, 
+0x70202400, 0x736e6464, 0x654e6f51, 0x20000000, 
 0x6e6f454e, 0x515f5458, 0x0, 0x736e6464, 
 0x744e6f51, 0x20000000, 0x3f6e6f51, 0x64547845, 
 0x0, 0x756e6b72, 0x64747970, 0x65000000, 
@@ -4368,11 +4369,11 @@
 0xbd80, 0xbd80, 0xbd80, 0xbd64, 
 0xb050, 0x24486561, 0x6465723a, 0x202f7072, 
 0x6f6a6563, 0x74732f72, 0x63732f73, 0x772f6765, 
-0x2f6e6963, 0x2f66772f, 0x636f6d6d, 0x6f6e2f72, 
-0x6563762e, 0x632c7620, 0x312e312e, 0x322e3139, 
-0x20313939, 0x382f3037, 0x2f323420, 0x32313a33, 
-0x303a3035, 0x20736875, 0x616e6720, 0x45787020, 
-0x24000000, 0x706b5278, 0x45525200, 0x66726d32, 
+0x2f2e2f6e, 0x69632f66, 0x772f636f, 0x6d6d6f6e, 
+0x2f726563, 0x762e632c, 0x7620312e, 0x312e322e, 
+0x31392031, 0x3939382f, 0x30372f32, 0x34203231, 
+0x3a33303a, 0x30352073, 0x6875616e, 0x67204578, 
+0x70202400, 0x706b5278, 0x45525200, 0x66726d32, 
 0x4c617267, 0x65000000, 0x72784e6f, 0x52784264, 
 0x0, 0x72785144, 0x6d614446, 0x0, 
 0x72785144, 0x6d614246, 0x0, 0x3f6e6f51, 
@@ -4392,11 +4393,11 @@
 0x1016c, 0x1016c, 0x10164, 0x10164, 
 0x10164, 0x24486561, 0x6465723a, 0x202f7072, 
 0x6f6a6563, 0x74732f72, 0x63732f73, 0x772f6765, 
-0x2f6e6963, 0x2f66772f, 0x636f6d6d, 0x6f6e2f6d, 
-0x61632e63, 0x2c762031, 0x2e312e32, 0x2e313220, 
-0x31393938, 0x2f30342f, 0x32372032, 0x323a3133, 
-0x3a343220, 0x73687561, 0x6e672045, 0x78702024, 
-0x0, 0x6d616374, 0x7841544e, 0x0, 
+0x2f2e2f6e, 0x69632f66, 0x772f636f, 0x6d6d6f6e, 
+0x2f6d6163, 0x2e632c76, 0x20312e31, 0x2e322e31, 
+0x32203139, 0x39382f30, 0x342f3237, 0x2032323a, 
+0x31333a34, 0x32207368, 0x75616e67, 0x20457870, 
+0x20240000, 0x6d616374, 0x7841544e, 0x0, 
 0x4e745379, 0x6e264c6b, 0x0, 0x72656d61, 
 0x73737274, 0x0, 0x6c696e6b, 0x444f574e, 
 0x0, 0x656e714d, 0x45765046, 0x61696c00, 
@@ -4404,27 +4405,27 @@
 0x456e454d, 0x0, 0x6c696e6b, 0x55500000, 
 0x0, 0x24486561, 0x6465723a, 0x202f7072, 
 0x6f6a6563, 0x74732f72, 0x63732f73, 0x772f6765, 
-0x2f6e6963, 0x2f66772f, 0x636f6d6d, 0x6f6e2f63, 
-0x6b73756d, 0x2e632c76, 0x20312e31, 0x2e322e32, 
-0x20313939, 0x382f3034, 0x2f323720, 0x32323a31, 
-0x333a3339, 0x20736875, 0x616e6720, 0x45787020, 
-0x24000000, 0x50726f62, 0x65506879, 0x0, 
+0x2f2e2f6e, 0x69632f66, 0x772f636f, 0x6d6d6f6e, 
+0x2f636b73, 0x756d2e63, 0x2c762031, 0x2e312e32, 
+0x2e322031, 0x3939382f, 0x30342f32, 0x37203232, 
+0x3a31333a, 0x33392073, 0x6875616e, 0x67204578, 
+0x70202400, 0x50726f62, 0x65506879, 0x0, 
 0x6c6e6b41, 0x53535254, 0x0, 0x11994, 
 0x119cc, 0x119e4, 0x11a18, 0x11a44, 
 0x11a58, 0x11a94, 0x11e04, 0x11b6c, 
 0x11bac, 0x11bd8, 0x11c18, 0x11c48, 
 0x11c84, 0x11cb8, 0x11e04, 0x12048, 
 0x12060, 0x12088, 0x120a8, 0x120d0, 
-0x12200, 0x12228, 0x1226c, 0x12294, 
-0x0, 0x124fc, 0x125cc, 0x126a4, 
-0x12774, 0x127d0, 0x128ac, 0x128d4, 
-0x129b0, 0x129d8, 0x12b80, 0x12ba8, 
-0x12d50, 0x12f48, 0x131dc, 0x130f0, 
-0x131dc, 0x13208, 0x12d78, 0x12f20, 
-0x0, 0x135f4, 0x13638, 0x136d0, 
-0x1371c, 0x1378c, 0x13824, 0x13858, 
-0x138e0, 0x13978, 0x13a48, 0x13a88, 
-0x13b0c, 0x13b30, 0x13c64, 0x646f4261, 
+0x12200, 0x12228, 0x1227c, 0x122a4, 
+0x0, 0x1250c, 0x125dc, 0x126b4, 
+0x12784, 0x127e0, 0x128bc, 0x128e4, 
+0x129c0, 0x129e8, 0x12b90, 0x12bb8, 
+0x12d60, 0x12f58, 0x131ec, 0x13100, 
+0x131ec, 0x13218, 0x12d88, 0x12f30, 
+0x0, 0x13604, 0x13648, 0x136e0, 
+0x1372c, 0x1379c, 0x13834, 0x13868, 
+0x138f0, 0x13988, 0x13a58, 0x13a98, 
+0x13b1c, 0x13b40, 0x13c74, 0x646f4261, 
 0x73655067, 0x0, 0x0, 0x0, 
 0x0, 0x73746d61, 0x634c4e4b, 0x0, 
 0x0, 0x0 };
@@ -4454,24 +4455,24 @@
 /* Generated by genfw.c */
 int tigon2FwReleaseMajor = 0xc;
 int tigon2FwReleaseMinor = 0x3;
-int tigon2FwReleaseFix = 0x5;
+int tigon2FwReleaseFix = 0xa;
 u32 tigon2FwStartAddr = 0x00004000;
 u32 tigon2FwTextAddr = 0x00004000;
-int tigon2FwTextLen = 0xec80;
-u32 tigon2FwRodataAddr = 0x00012c80;
-int tigon2FwRodataLen = 0xfb0;
-u32 tigon2FwDataAddr = 0x00013c50;
+int tigon2FwTextLen = 0xed40;
+u32 tigon2FwRodataAddr = 0x00012d40;
+int tigon2FwRodataLen = 0xff0;
+u32 tigon2FwDataAddr = 0x00013d60;
 int tigon2FwDataLen = 0x170;
-u32 tigon2FwSbssAddr = 0x00013dc0;
+u32 tigon2FwSbssAddr = 0x00013ed0;
 int tigon2FwSbssLen = 0xbc;
-u32 tigon2FwBssAddr = 0x00013e80;
+u32 tigon2FwBssAddr = 0x00013f90;
 int tigon2FwBssLen = 0x20c0;
 u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] __initdata = {
 0x0, 
 0x10000003, 0x0, 0xd, 0xd, 
-0x3c1d0001, 0x8fbd3ca0, 0x3a0f021, 0x3c100000, 
+0x3c1d0001, 0x8fbd3db0, 0x3a0f021, 0x3c100000, 
 0x26104000, 0xc0010c0, 0x0, 0xd, 
-0x3c1d0001, 0x8fbd3ca4, 0x3a0f021, 0x3c100000, 
+0x3c1d0001, 0x8fbd3db4, 0x3a0f021, 0x3c100000, 
 0x26104000, 0xc00178d, 0x0, 0xd, 
 0x0, 0x0, 0x0, 0x0, 
 0x0, 0x0, 0x0, 0x0, 
@@ -4485,19 +4486,19 @@
 0x0, 0x0, 0x0, 0x0, 
 0x0, 0x0, 0x0, 0x2000008, 
 0x0, 0x80016de, 0x3c0a0001, 0x80016de, 
-0x3c0a0002, 0x80016de, 0x0, 0x8002acd, 
-0x0, 0x8002a70, 0x0, 0x80016de, 
-0x3c0a0004, 0x8003095, 0x0, 0x8001a0e, 
-0x0, 0x800373f, 0x0, 0x80036e6, 
-0x0, 0x80016de, 0x3c0a0006, 0x80037ad, 
+0x3c0a0002, 0x80016de, 0x0, 0x8002afd, 
+0x0, 0x8002aa0, 0x0, 0x80016de, 
+0x3c0a0004, 0x80030d1, 0x0, 0x8001a0e, 
+0x0, 0x8003779, 0x0, 0x8003720, 
+0x0, 0x80016de, 0x3c0a0006, 0x80037e7, 
 0x3c0a0007, 0x80016de, 0x3c0a0008, 0x80016de, 
-0x3c0a0009, 0x8003805, 0x0, 0x8002cc0, 
+0x3c0a0009, 0x800383f, 0x0, 0x8002cf7, 
 0x0, 0x80016de, 0x3c0a000b, 0x80016de, 
-0x3c0a000c, 0x80016de, 0x3c0a000d, 0x80027ac, 
+0x3c0a000c, 0x80016de, 0x3c0a000d, 0x80027c5, 
 0x0, 0x800275a, 0x0, 0x80016de, 
 0x3c0a000e, 0x8001f28, 0x0, 0x8001920, 
-0x0, 0x80019c0, 0x0, 0x8003a70, 
-0x0, 0x8003a5e, 0x0, 0x80016de, 
+0x0, 0x80019c0, 0x0, 0x8003aa8, 
+0x0, 0x8003a96, 0x0, 0x80016de, 
 0x0, 0x80018c6, 0x0, 0x80016de, 
 0x0, 0x80016de, 0x3c0a0013, 0x80016de, 
 0x3c0a0014, 0x0, 0x0, 0x0, 
@@ -4517,79 +4518,79 @@
 0x0, 0x0, 0x0, 0x0, 
 0x0, 0x0, 0x0, 0x27bdffe0, 
 0x3c1cc000, 0xafbf001c, 0xafb00018, 0x8f820140, 
-0x24030003, 0xaf8300ec, 0x34420004, 0xc0029b8, 
+0x24030003, 0xaf8300ec, 0x34420004, 0xc0029e8, 
 0xaf820140, 0x3c0100c0, 0xc001712, 0xac203ffc, 
-0x403021, 0x3c020008, 0x3c010001, 0xac263dd8, 
+0x403021, 0x3c020008, 0x3c010001, 0xac263ee8, 
 0x50c2000d, 0x3c020003, 0x3c100010, 0x10d00009, 
-0x24050100, 0x3c040001, 0x24842d34, 0x3821, 
-0xafa00010, 0xc0029d3, 0xafa00014, 0x3c010001, 
-0xac303dd8, 0x3c020003, 0x34422000, 0x3c010001, 
-0xac223de8, 0x24020008, 0x3c010001, 0xac223df0, 
-0x2402001f, 0x3c010001, 0xac223e00, 0x24020016, 
-0x3c010001, 0xac223dd4, 0x3c05fffe, 0x34a56f08, 
-0x3c020001, 0x8c423dd8, 0x3c030001, 0x24635f40, 
-0x3c040001, 0x8c843c54, 0x431023, 0x14800002, 
+0x24050100, 0x3c040001, 0x24842df4, 0x3821, 
+0xafa00010, 0xc002a03, 0xafa00014, 0x3c010001, 
+0xac303ee8, 0x3c020003, 0x34422000, 0x3c010001, 
+0xac223ef8, 0x24020008, 0x3c010001, 0xac223f00, 
+0x2402001f, 0x3c010001, 0xac223f10, 0x24020016, 
+0x3c010001, 0xac223ee4, 0x3c05fffe, 0x34a56f08, 
+0x3c020001, 0x8c423ee8, 0x3c030001, 0x24636050, 
+0x3c040001, 0x8c843d64, 0x431023, 0x14800002, 
 0x458021, 0x2610fa48, 0x2402f000, 0x2028024, 
 0xc001734, 0x2002021, 0x2022823, 0x3c040020, 
 0x821823, 0x651823, 0x247bb000, 0x3c03fffe, 
 0x3463bf08, 0x363b821, 0x3c0600bf, 0x34c6f000, 
-0x3c070001, 0x8ce73c50, 0x3c0300bf, 0x3463e000, 
-0x852023, 0x3c010001, 0xac243de4, 0x822023, 
-0x3c010001, 0xac223dc0, 0x27620ffc, 0x3c010001, 
-0xac223ca0, 0x27621ffc, 0xdb3023, 0x7b1823, 
-0x3c010001, 0xac253dcc, 0x3c010001, 0xac243dc4, 
-0x3c010001, 0xac223ca4, 0xaf860150, 0x10e00011, 
-0xaf830250, 0x3c1d0001, 0x8fbd3c5c, 0x3a0f021, 
-0xc0016f8, 0x0, 0x3c020001, 0x8c423c60, 
-0x3c030001, 0x8c633c64, 0x2442fe00, 0x24630200, 
-0x3c010001, 0xac223c60, 0x3c010001, 0x10000004, 
-0xac233c64, 0x3c1d0001, 0x8fbd3ca0, 0x3a0f021, 
-0x3c020001, 0x8c423c54, 0x1040000d, 0x26fafa48, 
-0x3c020001, 0x8c423c60, 0x3c030001, 0x8c633c64, 
-0x3c1a0001, 0x8f5a3c64, 0x2442fa48, 0x246305b8, 
-0x3c010001, 0xac223c60, 0x3c010001, 0xac233c64, 
-0x3c020001, 0x8c423c58, 0x14400003, 0x0, 
-0x3c010001, 0xac203c60, 0xc00114d, 0x0, 
+0x3c070001, 0x8ce73d60, 0x3c0300bf, 0x3463e000, 
+0x852023, 0x3c010001, 0xac243ef4, 0x822023, 
+0x3c010001, 0xac223ed0, 0x27620ffc, 0x3c010001, 
+0xac223db0, 0x27621ffc, 0xdb3023, 0x7b1823, 
+0x3c010001, 0xac253edc, 0x3c010001, 0xac243ed4, 
+0x3c010001, 0xac223db4, 0xaf860150, 0x10e00011, 
+0xaf830250, 0x3c1d0001, 0x8fbd3d6c, 0x3a0f021, 
+0xc0016f8, 0x0, 0x3c020001, 0x8c423d70, 
+0x3c030001, 0x8c633d74, 0x2442fe00, 0x24630200, 
+0x3c010001, 0xac223d70, 0x3c010001, 0x10000004, 
+0xac233d74, 0x3c1d0001, 0x8fbd3db0, 0x3a0f021, 
+0x3c020001, 0x8c423d64, 0x1040000d, 0x26fafa48, 
+0x3c020001, 0x8c423d70, 0x3c030001, 0x8c633d74, 
+0x3c1a0001, 0x8f5a3d74, 0x2442fa48, 0x246305b8, 
+0x3c010001, 0xac223d70, 0x3c010001, 0xac233d74, 
+0x3c020001, 0x8c423d68, 0x14400003, 0x0, 
+0x3c010001, 0xac203d70, 0xc00114d, 0x0, 
 0x8fbf001c, 0x8fb00018, 0x3e00008, 0x27bd0020, 
-0x3c020001, 0x8c423c60, 0x3c030001, 0x8c633c64, 
-0x27bdffa0, 0xafb00040, 0x3c100001, 0x8e1036f4, 
-0x3c040001, 0x24842d40, 0xafbf0058, 0xafbe0054, 
+0x3c020001, 0x8c423d70, 0x3c030001, 0x8c633d74, 
+0x27bdffa0, 0xafb00040, 0x3c100001, 0x8e1037d8, 
+0x3c040001, 0x24842e00, 0xafbf0058, 0xafbe0054, 
 0xafb50050, 0xafb3004c, 0xafb20048, 0xafb10044, 
 0xafa20034, 0xafa30030, 0xafa00010, 0xafa00014, 
-0x8f860040, 0x24050200, 0xc0029d3, 0x2003821, 
+0x8f860040, 0x24050200, 0xc002a03, 0x2003821, 
 0x8f830040, 0x3c02f000, 0x621824, 0x3c026000, 
 0x1062000b, 0xa3a0003f, 0x240e0001, 0x3c040001, 
-0x24842d48, 0xa3ae003f, 0xafa00010, 0xafa00014, 
-0x8f860040, 0x24050300, 0xc0029d3, 0x2003821, 
+0x24842e08, 0xa3ae003f, 0xafa00010, 0xafa00014, 
+0x8f860040, 0x24050300, 0xc002a03, 0x2003821, 
 0x8f820240, 0x3c030001, 0x431025, 0xaf820240, 
 0xaf800048, 0x8f820048, 0x14400005, 0x0, 
 0xaf800048, 0x8f820048, 0x10400004, 0x0, 
 0xaf800048, 0x10000003, 0x2e02021, 0xaf80004c, 
-0x2e02021, 0x3c050001, 0xc002a40, 0x34a540f8, 
-0x3402021, 0xc002a40, 0x240505b8, 0x3c020001, 
-0x8c423de4, 0x3c0d0001, 0x8dad3dc4, 0x3c030001, 
-0x8c633dc0, 0x3c080001, 0x8d083dcc, 0x3c090001, 
-0x8d293de8, 0x3c0a0001, 0x8d4a3df0, 0x3c0b0001, 
-0x8d6b3e00, 0x3c0c0001, 0x8d8c3dd4, 0x3c040001, 
-0x24842d54, 0x24050400, 0xaf420130, 0x8f420130, 
+0x2e02021, 0x3c050001, 0xc002a70, 0x34a540f8, 
+0x3402021, 0xc002a70, 0x240505b8, 0x3c020001, 
+0x8c423ef4, 0x3c0d0001, 0x8dad3ed4, 0x3c030001, 
+0x8c633ed0, 0x3c080001, 0x8d083edc, 0x3c090001, 
+0x8d293ef8, 0x3c0a0001, 0x8d4a3f00, 0x3c0b0001, 
+0x8d6b3f10, 0x3c0c0001, 0x8d8c3ee4, 0x3c040001, 
+0x24842e14, 0x24050400, 0xaf420130, 0x8f420130, 
 0x24060001, 0x24070001, 0xaf400000, 0xaf4d012c, 
 0xaf430138, 0xaf48013c, 0xaf490140, 0xaf4a0144, 
 0xaf4b0148, 0xaf4c014c, 0x2442ff80, 0xaf420134, 
-0x24020001, 0xafa20010, 0xc0029d3, 0xafa00014, 
+0x24020001, 0xafa20010, 0xc002a03, 0xafa00014, 
 0x8f42012c, 0xafa20010, 0x8f420130, 0xafa20014, 
-0x8f460138, 0x8f47013c, 0x3c040001, 0x24842d60, 
-0xc0029d3, 0x24050500, 0xafb70010, 0xafba0014, 
-0x8f460140, 0x8f470144, 0x3c040001, 0x24842d6c, 
-0xc0029d3, 0x24050600, 0x3c020001, 0x8c423dd8, 
-0x3603821, 0x3c060001, 0x24c65f40, 0x2448ffff, 
+0x8f460138, 0x8f47013c, 0x3c040001, 0x24842e20, 
+0xc002a03, 0x24050500, 0xafb70010, 0xafba0014, 
+0x8f460140, 0x8f470144, 0x3c040001, 0x24842e2c, 
+0xc002a03, 0x24050600, 0x3c020001, 0x8c423ee8, 
+0x3603821, 0x3c060001, 0x24c66050, 0x2448ffff, 
 0x1061824, 0xe81024, 0x43102b, 0x10400006, 
-0x24050900, 0x3c040001, 0x24842d78, 0xafa80010, 
-0xc0029d3, 0xafa00014, 0x8f82000c, 0xafa20010, 
+0x24050900, 0x3c040001, 0x24842e38, 0xafa80010, 
+0xc002a03, 0xafa00014, 0x8f82000c, 0xafa20010, 
 0x8f82003c, 0xafa20014, 0x8f860000, 0x8f870004, 
-0x3c040001, 0x24842d84, 0xc0029d3, 0x24051000, 
+0x3c040001, 0x24842e44, 0xc002a03, 0x24051000, 
 0x8c020220, 0x8c030224, 0x8c060218, 0x8c07021c, 
-0x3c040001, 0x24842d8c, 0x24051100, 0xafa20010, 
-0xc0029d3, 0xafa30014, 0xaf800054, 0xaf80011c, 
+0x3c040001, 0x24842e4c, 0x24051100, 0xafa20010, 
+0xc002a03, 0xafa30014, 0xaf800054, 0xaf80011c, 
 0x8c020218, 0x30420002, 0x10400009, 0x0, 
 0x8c020220, 0x3c030002, 0x34630004, 0x431025, 
 0xaf42000c, 0x8c02021c, 0x10000008, 0x34420004, 
@@ -4611,7 +4612,7 @@
 0x431025, 0xaf8200b0, 0x8f8200b0, 0x30420004, 
 0x1440fffd, 0x24051200, 0x96e20472, 0x96e60452, 
 0x96e70462, 0xafa20010, 0x96e20482, 0x3c040001, 
-0x24842d94, 0xc0029d3, 0xafa20014, 0x96f00452, 
+0x24842e54, 0xc002a03, 0xafa20014, 0x96f00452, 
 0x32020001, 0x10400002, 0xb021, 0x24160001, 
 0x32020002, 0x54400001, 0x36d60002, 0x32020008, 
 0x54400001, 0x36d60004, 0x32020010, 0x54400001, 
@@ -4624,8 +4625,8 @@
 0x14400004, 0x3207009b, 0x30c2009b, 0x14e20007, 
 0x240e0001, 0x32c22000, 0x1440000d, 0x32020001, 
 0x3062009b, 0x10e20009, 0x240e0001, 0x3c040001, 
-0x24842da0, 0x24051300, 0x2003821, 0xa3ae003f, 
-0xafa30010, 0xc0029d3, 0xafa00014, 0x32020001, 
+0x24842e60, 0x24051300, 0x2003821, 0xa3ae003f, 
+0xafa30010, 0xc002a03, 0xafa00014, 0x32020001, 
 0x54400001, 0x36d60080, 0x32020002, 0x54400001, 
 0x36d60100, 0x32020008, 0x54400001, 0x36d60200, 
 0x32020010, 0x54400001, 0x36d60400, 0x32020080, 
@@ -4649,191 +4650,191 @@
 0xaf420180, 0xaf430184, 0x8ee20478, 0x8ee3047c, 
 0xaf420188, 0xaf43018c, 0x8ee20488, 0x8ee3048c, 
 0xaf420190, 0xaf430194, 0x8ee204b0, 0x8ee304b4, 
-0x24040080, 0xaf420198, 0xaf43019c, 0xc002a40, 
+0x24040080, 0xaf420198, 0xaf43019c, 0xc002a70, 
 0x24050080, 0x8c02025c, 0x27440214, 0xaf4201e0, 
-0x8c020260, 0x24050200, 0x24060008, 0xc002a57, 
+0x8c020260, 0x24050200, 0x24060008, 0xc002a87, 
 0xaf4201e8, 0x3c043b9a, 0x3484ca00, 0x3821, 
 0x24020006, 0x24030002, 0xaf4201e4, 0x240203e8, 
 0xaf4301f4, 0xaf4301f0, 0xaf4401ec, 0xaf420284, 
 0x24020001, 0xaf430280, 0xaf42028c, 0x3c030001, 
-0x671821, 0x90633c68, 0x3471021, 0x24e70001, 
+0x671821, 0x90633d78, 0x3471021, 0x24e70001, 
 0xa043021c, 0x2ce2000f, 0x1440fff8, 0x3471821, 
 0x24e70001, 0x3c080001, 0x350840f8, 0x8f820040, 
-0x3c040001, 0x24842dac, 0x24051400, 0x21702, 
+0x3c040001, 0x24842e6c, 0x24051400, 0x21702, 
 0x24420030, 0xa062021c, 0x3471021, 0xa040021c, 
 0x8c070218, 0x2c03021, 0x240205b8, 0xafa20010, 
-0xc0029d3, 0xafa80014, 0x3c040001, 0x24842db8, 
+0xc002a03, 0xafa80014, 0x3c040001, 0x24842e78, 
 0x3c050000, 0x24a55b3c, 0x24060010, 0x27b10030, 
 0x2203821, 0x27b30034, 0xc001750, 0xafb30010, 
-0x3c030001, 0x8c633c58, 0x1060000a, 0x408021, 
+0x3c030001, 0x8c633d68, 0x1060000a, 0x408021, 
 0x8fa30030, 0x2405ff00, 0x8fa20034, 0x246400ff, 
 0x852024, 0x831823, 0x431023, 0xafa20034, 
-0xafa40030, 0xafb30010, 0x3c040001, 0x24842dc4, 
+0xafa40030, 0xafb30010, 0x3c040001, 0x24842e84, 
 0x3c050000, 0x24a54100, 0x24060108, 0xc001750, 
 0x2203821, 0x409021, 0x32c20003, 0x50400045, 
 0x2203821, 0x8f820050, 0x3c030010, 0x431024, 
 0x10400016, 0x0, 0x8c020218, 0x30420040, 
 0x1040000f, 0x24020001, 0x8f820050, 0x8c030218, 
-0x240e0001, 0x3c040001, 0x24842dd0, 0xa3ae003f, 
+0x240e0001, 0x3c040001, 0x24842e90, 0xa3ae003f, 
 0xafa20010, 0xafa30014, 0x8f870040, 0x24051500, 
-0xc0029d3, 0x2c03021, 0x10000004, 0x0, 
+0xc002a03, 0x2c03021, 0x10000004, 0x0, 
 0x3c010001, 0x370821, 0xa02240f4, 0x3c040001, 
-0x24842ddc, 0x3c050001, 0x24a59ce8, 0x3c060001, 
+0x24842e9c, 0x3c050001, 0x24a59ce8, 0x3c060001, 
 0x24c69d60, 0xc53023, 0x8f420010, 0x27b30030, 
 0x2603821, 0x27b10034, 0x34420a00, 0xaf420010, 
-0xc001750, 0xafb10010, 0x3c040001, 0x24842df0, 
-0x3c050001, 0x24a5af7c, 0x3c060001, 0x24c6b2f8, 
+0xc001750, 0xafb10010, 0x3c040001, 0x24842eb0, 
+0x3c050001, 0x24a5b058, 0x3c060001, 0x24c6b3d4, 
 0xc53023, 0x2603821, 0xaf420108, 0xc001750, 
-0xafb10010, 0x3c040001, 0x24842e0c, 0x3c050001, 
-0x24a5b714, 0x3c060001, 0x24c6c1d4, 0xc53023, 
-0x2603821, 0x3c010001, 0xac223e30, 0xc001750, 
-0xafb10010, 0x3c040001, 0x24842e24, 0x10000024, 
-0x24051600, 0x3c040001, 0x24842e2c, 0x3c050001, 
+0xafb10010, 0x3c040001, 0x24842ecc, 0x3c050001, 
+0x24a5b7e4, 0x3c060001, 0x24c6c2c8, 0xc53023, 
+0x2603821, 0x3c010001, 0xac223f40, 0xc001750, 
+0xafb10010, 0x3c040001, 0x24842ee4, 0x10000024, 
+0x24051600, 0x3c040001, 0x24842eec, 0x3c050001, 
 0x24a59bb4, 0x3c060001, 0x24c69ce0, 0xc53023, 
-0xc001750, 0xafb30010, 0x3c040001, 0x24842e3c, 
-0x3c050001, 0x24a5ab34, 0x3c060001, 0x24c6af74, 
+0xc001750, 0xafb30010, 0x3c040001, 0x24842efc, 
+0x3c050001, 0x24a5abf4, 0x3c060001, 0x24c6b050, 
 0xc53023, 0x2203821, 0xaf420108, 0xc001750, 
-0xafb30010, 0x3c040001, 0x24842e50, 0x3c050001, 
-0x24a5b300, 0x3c060001, 0x24c6b70c, 0xc53023, 
-0x2203821, 0x3c010001, 0xac223e30, 0xc001750, 
-0xafb30010, 0x3c040001, 0x24842e64, 0x24051650, 
-0x2c03021, 0x3821, 0x3c010001, 0xac223e34, 
-0xafa00010, 0xc0029d3, 0xafa00014, 0x32c20020, 
-0x10400021, 0x27a70030, 0x3c040001, 0x24842e70, 
-0x3c050001, 0x24a5a9c0, 0x3c060001, 0x24c6ab2c, 
+0xafb30010, 0x3c040001, 0x24842f10, 0x3c050001, 
+0x24a5b3dc, 0x3c060001, 0x24c6b7dc, 0xc53023, 
+0x2203821, 0x3c010001, 0xac223f40, 0xc001750, 
+0xafb30010, 0x3c040001, 0x24842f24, 0x24051650, 
+0x2c03021, 0x3821, 0x3c010001, 0xac223f44, 
+0xafa00010, 0xc002a03, 0xafa00014, 0x32c20020, 
+0x10400021, 0x27a70030, 0x3c040001, 0x24842f30, 
+0x3c050001, 0x24a5aa80, 0x3c060001, 0x24c6abec, 
 0xc53023, 0x24022000, 0xaf42001c, 0x27a20034, 
 0xc001750, 0xafa20010, 0x21900, 0x31982, 
 0x3c040800, 0x641825, 0xae430028, 0x24030010, 
 0xaf43003c, 0x96e30450, 0xaf430040, 0x8f430040, 
-0x3c040001, 0x24842e84, 0xafa00014, 0xafa30010, 
-0x8f47001c, 0x24051660, 0x3c010001, 0xac223e2c, 
+0x3c040001, 0x24842f44, 0xafa00014, 0xafa30010, 
+0x8f47001c, 0x24051660, 0x3c010001, 0xac223f3c, 
 0x10000025, 0x32c60020, 0x8ee20448, 0x8ee3044c, 
 0xaf43001c, 0x8f42001c, 0x2442e000, 0x2c422001, 
-0x1440000a, 0x240e0001, 0x3c040001, 0x24842e90, 
+0x1440000a, 0x240e0001, 0x3c040001, 0x24842f50, 
 0xa3ae003f, 0xafa00010, 0xafa00014, 0x8f46001c, 
-0x24051700, 0xc0029d3, 0x3821, 0x3c020000, 
+0x24051700, 0xc002a03, 0x3821, 0x3c020000, 
 0x24425b78, 0x21100, 0x21182, 0x3c030800, 
 0x431025, 0xae420028, 0x24020008, 0xaf42003c, 
 0x96e20450, 0xaf420040, 0x8f420040, 0x3c040001, 
-0x24842e9c, 0xafa00014, 0xafa20010, 0x8f47001c, 
-0x24051800, 0x32c60020, 0xc0029d3, 0x0, 
-0x3c030001, 0x8c633e30, 0x3c050fff, 0x34a5ffff, 
-0x3c020001, 0x8c423e34, 0x3c040800, 0x651824, 
+0x24842f5c, 0xafa00014, 0xafa20010, 0x8f47001c, 
+0x24051800, 0x32c60020, 0xc002a03, 0x0, 
+0x3c030001, 0x8c633f40, 0x3c050fff, 0x34a5ffff, 
+0x3c020001, 0x8c423f44, 0x3c040800, 0x651824, 
 0x31882, 0x641825, 0x451024, 0x21082, 
 0x441025, 0xae420080, 0x32c20180, 0x10400056, 
 0xae430020, 0x8f82005c, 0x3c030080, 0x431024, 
 0x1040000d, 0x0, 0x8f820050, 0xafa20010, 
-0x8f82005c, 0x240e0001, 0x3c040001, 0x24842ea8, 
+0x8f82005c, 0x240e0001, 0x3c040001, 0x24842f68, 
 0xa3ae003f, 0xafa20014, 0x8f870040, 0x24051900, 
-0xc0029d3, 0x2c03021, 0x8f820050, 0x3c030010, 
+0xc002a03, 0x2c03021, 0x8f820050, 0x3c030010, 
 0x431024, 0x10400016, 0x0, 0x8c020218, 
 0x30420040, 0x1040000f, 0x24020001, 0x8f820050, 
-0x8c030218, 0x240e0001, 0x3c040001, 0x24842dd0, 
+0x8c030218, 0x240e0001, 0x3c040001, 0x24842e90, 
 0xa3ae003f, 0xafa20010, 0xafa30014, 0x8f870040, 
-0x24052000, 0xc0029d3, 0x2c03021, 0x10000004, 
+0x24052000, 0xc002a03, 0x2c03021, 0x10000004, 
 0x0, 0x3c010001, 0x370821, 0xa02240f4, 
-0x3c040001, 0x24842eb4, 0x3c050001, 0x24a59b2c, 
+0x3c040001, 0x24842f74, 0x3c050001, 0x24a59b2c, 
 0x3c060001, 0x24c69bac, 0xc53023, 0x8f420008, 
 0x27b30030, 0x2603821, 0x27b10034, 0x34420e00, 
 0xaf420008, 0xc001750, 0xafb10010, 0x3c040001, 
-0x24842ecc, 0x3c050001, 0x24a5d090, 0x3c060001, 
-0x24c6db90, 0xc53023, 0x2603821, 0xaf42010c, 
-0xc001750, 0xafb10010, 0x3c040001, 0x24842ee4, 
-0x3c050001, 0x24a5e174, 0x3c060001, 0x24c6e860, 
-0xc53023, 0x2603821, 0x3c010001, 0xac223e40, 
-0xc001750, 0xafb10010, 0x3c040001, 0x24842efc, 
-0x10000027, 0x24052100, 0x3c040001, 0x24842f04, 
+0x24842f8c, 0x3c050001, 0x24a5d180, 0x3c060001, 
+0x24c6dc78, 0xc53023, 0x2603821, 0xaf42010c, 
+0xc001750, 0xafb10010, 0x3c040001, 0x24842fa4, 
+0x3c050001, 0x24a5e25c, 0x3c060001, 0x24c6e948, 
+0xc53023, 0x2603821, 0x3c010001, 0xac223f50, 
+0xc001750, 0xafb10010, 0x3c040001, 0x24842fbc, 
+0x10000027, 0x24052100, 0x3c040001, 0x24842fc4, 
 0x3c050001, 0x24a599e8, 0x3c060001, 0x24c69b24, 
 0xc53023, 0x27b10030, 0x2203821, 0x27b30034, 
-0xc001750, 0xafb30010, 0x3c040001, 0x24842f14, 
-0x3c050001, 0x24a5c300, 0x3c060001, 0x24c6d088, 
+0xc001750, 0xafb30010, 0x3c040001, 0x24842fd4, 
+0x3c050001, 0x24a5c3f0, 0x3c060001, 0x24c6d178, 
 0xc53023, 0x2203821, 0xaf42010c, 0xc001750, 
-0xafb30010, 0x3c040001, 0x24842f24, 0x3c050001, 
-0x24a5e014, 0x3c060001, 0x24c6e16c, 0xc53023, 
-0x2203821, 0x3c010001, 0xac223e40, 0xc001750, 
-0xafb30010, 0x3c040001, 0x24842f38, 0x24052150, 
-0x2c03021, 0x3821, 0x3c010001, 0xac223e4c, 
-0xafa00010, 0xc0029d3, 0xafa00014, 0x3c030001, 
-0x8c633e40, 0x3c110fff, 0x3631ffff, 0x3c020001, 
-0x8c423e4c, 0x3c1e0800, 0x711824, 0x31882, 
+0xafb30010, 0x3c040001, 0x24842fe4, 0x3c050001, 
+0x24a5e0fc, 0x3c060001, 0x24c6e254, 0xc53023, 
+0x2203821, 0x3c010001, 0xac223f50, 0xc001750, 
+0xafb30010, 0x3c040001, 0x24842ff8, 0x24052150, 
+0x2c03021, 0x3821, 0x3c010001, 0xac223f5c, 
+0xafa00010, 0xc002a03, 0xafa00014, 0x3c030001, 
+0x8c633f50, 0x3c110fff, 0x3631ffff, 0x3c020001, 
+0x8c423f5c, 0x3c1e0800, 0x711824, 0x31882, 
 0x7e1825, 0x511024, 0x21082, 0x5e1025, 
 0xae430038, 0xae420078, 0x8c020218, 0x30420040, 
 0x14400004, 0x24020001, 0x3c010001, 0x370821, 
-0xa02240f4, 0x3c040001, 0x24842f44, 0x3c050001, 
-0x24a5db98, 0x3c060001, 0x24c6dcf4, 0xc53023, 
+0xa02240f4, 0x3c040001, 0x24843004, 0x3c050001, 
+0x24a5dc80, 0x3c060001, 0x24c6dddc, 0xc53023, 
 0x27b50030, 0x2a03821, 0x27b30034, 0xc001750, 
-0xafb30010, 0x3c010001, 0xac223e38, 0x511024, 
+0xafb30010, 0x3c010001, 0xac223f48, 0x511024, 
 0x21082, 0x5e1025, 0xae420050, 0x32c22000, 
 0x10400005, 0x2a03821, 0x3c020000, 0x24425b78, 
-0x1000000d, 0x511024, 0x3c040001, 0x24842f58, 
-0x3c050001, 0x24a5dcfc, 0x3c060001, 0x24c6deac, 
+0x1000000d, 0x511024, 0x3c040001, 0x24843018, 
+0x3c050001, 0x24a5dde4, 0x3c060001, 0x24c6df94, 
 0xc53023, 0xc001750, 0xafb30010, 0x3c010001, 
-0xac223e50, 0x511024, 0x21082, 0x5e1025, 
+0xac223f60, 0x511024, 0x21082, 0x5e1025, 
 0xae420048, 0x32c24000, 0x10400005, 0x27a70030, 
 0x3c020000, 0x24425b78, 0x1000000e, 0x21100, 
-0x3c040001, 0x24842f70, 0x3c050001, 0x24a5deb4, 
-0x3c060001, 0x24c6e00c, 0xc53023, 0x27a20034, 
-0xc001750, 0xafa20010, 0x3c010001, 0xac223e44, 
+0x3c040001, 0x24843030, 0x3c050001, 0x24a5df9c, 
+0x3c060001, 0x24c6e0f4, 0xc53023, 0x27a20034, 
+0xc001750, 0xafa20010, 0x3c010001, 0xac223f54, 
 0x21100, 0x21182, 0x3c030800, 0x431025, 
-0xae420060, 0x3c040001, 0x24842f88, 0x3c050000, 
+0xae420060, 0x3c040001, 0x24843048, 0x3c050000, 
 0x24a57ca0, 0x3c060001, 0x24c680c4, 0xc53023, 
 0x27b10030, 0x2203821, 0x27b30034, 0xc001750, 
 0xafb30010, 0x3c1e0fff, 0x37deffff, 0x3c040001, 
-0x24842f94, 0x3c050000, 0x24a56318, 0x3c060000, 
+0x24843054, 0x3c050000, 0x24a56318, 0x3c060000, 
 0x24c66478, 0xc53023, 0x2203821, 0x3c010001, 
-0xac223e18, 0x5e1024, 0x21082, 0x3c150800, 
+0xac223f28, 0x5e1024, 0x21082, 0x3c150800, 
 0x551025, 0xae4200b8, 0xc001750, 0xafb30010, 
-0x3c040001, 0x24842fa0, 0x3c050000, 0x24a56480, 
+0x3c040001, 0x24843060, 0x3c050000, 0x24a56480, 
 0x3c060000, 0x24c666f8, 0xc53023, 0x2203821, 
-0x3c010001, 0xac223e0c, 0x5e1024, 0x21082, 
+0x3c010001, 0xac223f1c, 0x5e1024, 0x21082, 
 0x551025, 0xae4200e8, 0xc001750, 0xafb30010, 
-0x3c040001, 0x24842fb8, 0x3c050000, 0x24a56700, 
+0x3c040001, 0x24843078, 0x3c050000, 0x24a56700, 
 0x3c060000, 0x24c66830, 0xc53023, 0x2203821, 
-0x3c010001, 0xac223e04, 0x5e1024, 0x21082, 
+0x3c010001, 0xac223f14, 0x5e1024, 0x21082, 
 0x551025, 0xae4200c0, 0xc001750, 0xafb30010, 
-0x3c040001, 0x24842fd0, 0x3c050001, 0x24a5f240, 
-0x3c060001, 0x24c6f318, 0xc53023, 0x2203821, 
-0x3c010001, 0xac223e10, 0x5e1024, 0x21082, 
+0x3c040001, 0x24843090, 0x3c050001, 0x24a5f300, 
+0x3c060001, 0x24c6f3d8, 0xc53023, 0x2203821, 
+0x3c010001, 0xac223f20, 0x5e1024, 0x21082, 
 0x551025, 0xae4200c8, 0xc001750, 0xafb30010, 
-0x3c040001, 0x24842fdc, 0x3c050001, 0x24a5c1e0, 
-0x3c060001, 0x24c6c21c, 0xc53023, 0x2203821, 
+0x3c040001, 0x2484309c, 0x3c050001, 0x24a5c2d0, 
+0x3c060001, 0x24c6c30c, 0xc53023, 0x2203821, 
 0xaf420110, 0xc001750, 0xafb30010, 0x3c040001, 
-0x24842fec, 0x3c050001, 0x24a5c224, 0x3c060001, 
-0x24c6c24c, 0xc53023, 0x2203821, 0xaf420114, 
-0xc001750, 0xafb30010, 0x3c040001, 0x24842ff8, 
-0x3c050001, 0x24a5e9c0, 0x3c060001, 0x24c6eeac, 
+0x248430ac, 0x3c050001, 0x24a5c314, 0x3c060001, 
+0x24c6c33c, 0xc53023, 0x2203821, 0xaf420114, 
+0xc001750, 0xafb30010, 0x3c040001, 0x248430b8, 
+0x3c050001, 0x24a5eaa0, 0x3c060001, 0x24c6ef78, 
 0xc53023, 0x2203821, 0xaf420118, 0xc001750, 
-0xafb30010, 0x3c010001, 0xac223e54, 0x5e1024, 
-0x21082, 0x551025, 0xc003d9f, 0xae4200d0, 
-0xc003a1c, 0x0, 0xc002630, 0x0, 
+0xafb30010, 0x3c010001, 0xac223f64, 0x5e1024, 
+0x21082, 0x551025, 0xc003dcf, 0xae4200d0, 
+0xc003a54, 0x0, 0xc002630, 0x0, 
 0xac000228, 0xac00022c, 0x96e20450, 0x2442ffff, 
 0xaf420038, 0x96e20460, 0xaf420080, 0x32c24000, 
 0x14400003, 0x0, 0x96e20480, 0xaf420084, 
 0x96e70490, 0x50e00001, 0x24070800, 0x24e2ffff, 
 0xaf420088, 0xaf42007c, 0x24020800, 0x10e2000f, 
 0x32c24000, 0x10400003, 0x24020400, 0x10e2000b, 
-0x0, 0x240e0001, 0x3c040001, 0x24843008, 
+0x0, 0x240e0001, 0x3c040001, 0x248430c8, 
 0xa3ae003f, 0x96e60490, 0x24052170, 0x2c03821, 
-0xafa00010, 0xc0029d3, 0xafa00014, 0x8f43012c, 
+0xafa00010, 0xc002a03, 0xafa00014, 0x8f43012c, 
 0x8f44012c, 0x24020001, 0xa34205b3, 0xaf430094, 
 0xaf440098, 0xafa00010, 0xafa00014, 0x8f460080, 
-0x8f470084, 0x3c040001, 0x24843014, 0xc0029d3, 
+0x8f470084, 0x3c040001, 0x248430d4, 0xc002a03, 
 0x24052200, 0xc00232c, 0x3c110800, 0x3c1433d8, 
 0x3694cb58, 0x3c020800, 0x34420080, 0x3c040001, 
-0x24843020, 0x3c050000, 0x24a55bbc, 0x3c060000, 
+0x248430e0, 0x3c050000, 0x24a55bbc, 0x3c060000, 
 0x24c65bd8, 0xc53023, 0x27a70030, 0xaf820060, 
 0x2402ffff, 0xaf820064, 0x27a20034, 0xc001750, 
-0xafa20010, 0x3c010001, 0xac223df4, 0x21100, 
+0xafa20010, 0x3c010001, 0xac223f04, 0x21100, 
 0x21182, 0x511025, 0xc0018a8, 0xae420000, 
 0x8f820240, 0x3c030001, 0x431025, 0xaf820240, 
 0x3c020000, 0x24424034, 0xaf820244, 0xaf800240, 
 0x8f820060, 0x511024, 0x14400005, 0x3c030800, 
 0x8f820060, 0x431024, 0x1040fffd, 0x0, 
-0xc003a29, 0x8821, 0x3c020100, 0xafa20020, 
+0xc003a61, 0x8821, 0x3c020100, 0xafa20020, 
 0x8f530018, 0x240200ff, 0x56620001, 0x26710001, 
 0x8c020228, 0x1622000e, 0x1330c0, 0x8f42032c, 
 0x24420001, 0xaf42032c, 0x8f42032c, 0x8c020228, 
-0x3c040001, 0x24842ce4, 0x3c050009, 0xafa00014, 
+0x3c040001, 0x24842da4, 0x3c050009, 0xafa00014, 
 0xafa20010, 0x8fa60020, 0x1000003f, 0x34a50100, 
 0xd71021, 0x8fa30020, 0x8fa40024, 0xac4304c0, 
 0xac4404c4, 0xc01821, 0x8f440168, 0x8f45016c, 
@@ -4842,21 +4843,21 @@
 0x8f48010c, 0x24070008, 0xa32821, 0xa3482b, 
 0x822021, 0x100f809, 0x892021, 0x1440000b, 
 0x24070008, 0x8f820120, 0xafa20010, 0x8f820124, 
-0x3c040001, 0x24842cec, 0x3c050009, 0xafa20014, 
+0x3c040001, 0x24842dac, 0x3c050009, 0xafa20014, 
 0x8fa60020, 0x1000001c, 0x34a50200, 0x8f440150, 
 0x8f450154, 0x8f43000c, 0xaf510018, 0x8f860120, 
 0x24020010, 0xafa20010, 0xafb10014, 0xafa30018, 
 0x8f42010c, 0x40f809, 0x24c6001c, 0x14400010, 
 0x0, 0x8f420330, 0x24420001, 0xaf420330, 
 0x8f420330, 0x8f820120, 0xafa20010, 0x8f820124, 
-0x3c040001, 0x24842cf4, 0x3c050009, 0xafa20014, 
-0x8fa60020, 0x34a50300, 0xc0029d3, 0x2603821, 
+0x3c040001, 0x24842db4, 0x3c050009, 0xafa20014, 
+0x8fa60020, 0x34a50300, 0xc002a03, 0x2603821, 
 0x8f4202d4, 0x24420001, 0xaf4202d4, 0x8f4202d4, 
 0x93a2003f, 0x10400069, 0x3c020700, 0x34423000, 
 0xafa20028, 0x8f530018, 0x240200ff, 0x12620002, 
 0x8821, 0x26710001, 0x8c020228, 0x1622000e, 
 0x1330c0, 0x8f42032c, 0x24420001, 0xaf42032c, 
-0x8f42032c, 0x8c020228, 0x3c040001, 0x24842ce4, 
+0x8f42032c, 0x8c020228, 0x3c040001, 0x24842da4, 
 0x3c050009, 0xafa00014, 0xafa20010, 0x8fa60028, 
 0x1000003f, 0x34a50100, 0xd71021, 0x8fa30028, 
 0x8fa4002c, 0xac4304c0, 0xac4404c4, 0xc01821, 
@@ -4865,19 +4866,19 @@
 0x2e63021, 0xafa80018, 0x8f48010c, 0x24070008, 
 0xa32821, 0xa3482b, 0x822021, 0x100f809, 
 0x892021, 0x1440000b, 0x24070008, 0x8f820120, 
-0xafa20010, 0x8f820124, 0x3c040001, 0x24842cec, 
+0xafa20010, 0x8f820124, 0x3c040001, 0x24842dac, 
 0x3c050009, 0xafa20014, 0x8fa60028, 0x1000001c, 
 0x34a50200, 0x8f440150, 0x8f450154, 0x8f43000c, 
 0xaf510018, 0x8f860120, 0x24020010, 0xafa20010, 
 0xafb10014, 0xafa30018, 0x8f42010c, 0x40f809, 
 0x24c6001c, 0x14400010, 0x0, 0x8f420330, 
 0x24420001, 0xaf420330, 0x8f420330, 0x8f820120, 
-0xafa20010, 0x8f820124, 0x3c040001, 0x24842cf4, 
+0xafa20010, 0x8f820124, 0x3c040001, 0x24842db4, 
 0x3c050009, 0xafa20014, 0x8fa60028, 0x34a50300, 
-0xc0029d3, 0x2603821, 0x8f4202e0, 0x24420001, 
-0xaf4202e0, 0x8f4202e0, 0x3c040001, 0x24843030, 
+0xc002a03, 0x2603821, 0x8f4202e0, 0x24420001, 
+0xaf4202e0, 0x8f4202e0, 0x3c040001, 0x248430f0, 
 0xafa00010, 0xafa00014, 0x8fa60028, 0x24052300, 
-0xc0029d3, 0x3821, 0x10000004, 0x0, 
+0xc002a03, 0x3821, 0x10000004, 0x0, 
 0x8c020264, 0x10400005, 0x0, 0x8f8200a0, 
 0x30420004, 0x1440fffa, 0x0, 0x8f820044, 
 0x34420004, 0xaf820044, 0x8f4202f8, 0x24420001, 
@@ -4887,29 +4888,29 @@
 0x8f430138, 0x431021, 0xaf420090, 0x24020001, 
 0xaf42008c, 0x32c20008, 0x10400006, 0x0, 
 0x8f820214, 0x3c038100, 0x3042ffff, 0x431025, 
-0xaf820214, 0x3c020001, 0x8c423d14, 0x30420001, 
-0x10400009, 0x0, 0x3c040001, 0x2484303c, 
+0xaf820214, 0x3c020001, 0x8c423e24, 0x30420001, 
+0x10400009, 0x0, 0x3c040001, 0x248430fc, 
 0x3c050000, 0x24a56c40, 0x3c060000, 0x24c670e8, 
-0x10000008, 0xc53023, 0x3c040001, 0x2484304c, 
+0x10000008, 0xc53023, 0x3c040001, 0x2484310c, 
 0x3c050000, 0x24a56838, 0x3c060000, 0x24c66c38, 
 0xc53023, 0x27a70030, 0x27a20034, 0xc001750, 
-0xafa20010, 0x3c010001, 0xac223e08, 0x3c020001, 
-0x8c423e08, 0x3c030800, 0x21100, 0x21182, 
+0xafa20010, 0x3c010001, 0xac223f18, 0x3c020001, 
+0x8c423f18, 0x3c030800, 0x21100, 0x21182, 
 0x431025, 0xae420040, 0x8f8200a0, 0xafa20010, 
 0x8f8200b0, 0xafa20014, 0x8f86005c, 0x8f87011c, 
-0x3c040001, 0x2484305c, 0x3c010001, 0xac363de0, 
-0x3c010001, 0xac203dd0, 0x3c010001, 0xac3c3dc8, 
-0x3c010001, 0xac3b3df8, 0x3c010001, 0xac373dfc, 
-0x3c010001, 0xac3a3ddc, 0xc0029d3, 0x24052400, 
+0x3c040001, 0x2484311c, 0x3c010001, 0xac363ef0, 
+0x3c010001, 0xac203ee0, 0x3c010001, 0xac3c3ed8, 
+0x3c010001, 0xac3b3f08, 0x3c010001, 0xac373f0c, 
+0x3c010001, 0xac3a3eec, 0xc002a03, 0x24052400, 
 0x8f820200, 0xafa20010, 0x8f820220, 0xafa20014, 
-0x8f860044, 0x8f870050, 0x3c040001, 0x24843068, 
-0xc0029d3, 0x24052500, 0x8f830060, 0x74100b, 
+0x8f860044, 0x8f870050, 0x3c040001, 0x24843128, 
+0xc002a03, 0x24052500, 0x8f830060, 0x74100b, 
 0x242000a, 0x200f821, 0x0, 0xd, 
 0x8fbf0058, 0x8fbe0054, 0x8fb50050, 0x8fb3004c, 
 0x8fb20048, 0x8fb10044, 0x8fb00040, 0x3e00008, 
-0x27bd0060, 0x27bdffe0, 0x3c040001, 0x24843074, 
+0x27bd0060, 0x27bdffe0, 0x3c040001, 0x24843134, 
 0x24052600, 0x3021, 0x3821, 0xafbf0018, 
-0xafa00010, 0xc0029d3, 0xafa00014, 0x8fbf0018, 
+0xafa00010, 0xc002a03, 0xafa00014, 0x8fbf0018, 
 0x3e00008, 0x27bd0020, 0x3e00008, 0x0, 
 0x3e00008, 0x0, 0x0, 0x0, 
 0x0, 0x0, 0x0, 0x3e00008, 
@@ -4918,16 +4919,16 @@
 0x8f820150, 0x3c03001f, 0x3463ffff, 0xafa40018, 
 0xa22823, 0xa32824, 0x8ca20000, 0x1044000a, 
 0x0, 0xafa50010, 0x8ca20000, 0xafa20014, 
-0x8f860150, 0x8f870250, 0x3c040001, 0x2484307c, 
-0xc0029d3, 0x24052700, 0x8fbf0218, 0x3e00008, 
+0x8f860150, 0x8f870250, 0x3c040001, 0x2484313c, 
+0xc002a03, 0x24052700, 0x8fbf0218, 0x3e00008, 
 0x27bd0220, 0x27bdffe0, 0x3c06abba, 0x34c6babe, 
 0xafb00018, 0x3c100004, 0x3c07007f, 0x34e7ffff, 
 0xafbf001c, 0x102840, 0x8e040000, 0x8ca30000, 
 0xaca00000, 0xae060000, 0x8ca20000, 0xaca30000, 
 0x10460005, 0xae040000, 0xa08021, 0xf0102b, 
-0x1040fff5, 0x102840, 0x3c040001, 0x24843088, 
+0x1040fff5, 0x102840, 0x3c040001, 0x24843148, 
 0x24052800, 0x2003021, 0x3821, 0xafa00010, 
-0xc0029d3, 0xafa00014, 0x2001021, 0x8fbf001c, 
+0xc002a03, 0xafa00014, 0x2001021, 0x8fbf001c, 
 0x8fb00018, 0x3e00008, 0x27bd0020, 0x8c020224, 
 0x3047003f, 0x10e00010, 0x803021, 0x2821, 
 0x24030020, 0xe31024, 0x10400002, 0x63042, 
@@ -4941,84 +4942,84 @@
 0xafb00018, 0x8ea20000, 0x2403fffc, 0xc38024, 
 0x50102b, 0x1440001b, 0xe08821, 0x8e330000, 
 0xafb00010, 0x8ea20000, 0xafa20014, 0x8e270000, 
-0x24053000, 0xc0029d3, 0x2403021, 0x8e230000, 
+0x24053000, 0xc002a03, 0x2403021, 0x8e230000, 
 0x702021, 0x64102b, 0x10400007, 0x2402821, 
 0x8ca20000, 0xac620000, 0x24630004, 0x64102b, 
 0x1440fffb, 0x24a50004, 0x8ea20000, 0x501023, 
 0xaea20000, 0x8e220000, 0x501021, 0x1000000b, 
 0xae220000, 0x2402002d, 0xa0820000, 0xafb00010, 
 0x8ea20000, 0x2409821, 0xafa20014, 0x8e270000, 
-0x24053100, 0xc0029d3, 0x2603021, 0x2601021, 
+0x24053100, 0xc002a03, 0x2603021, 0x2601021, 
 0x8fbf002c, 0x8fb50028, 0x8fb30024, 0x8fb20020, 
 0x8fb1001c, 0x8fb00018, 0x3e00008, 0x27bd0030, 
 0x27bdffe8, 0x3c1cc000, 0x3c05fffe, 0x3c030001, 
-0x8c633dc0, 0x3c040001, 0x8c843dcc, 0x34a5bf08, 
-0x24021ffc, 0x3c010001, 0xac223c60, 0x3c0200c0, 
-0x3c010001, 0xac223c64, 0x3c020020, 0xafbf0010, 
+0x8c633ed0, 0x3c040001, 0x8c843edc, 0x34a5bf08, 
+0x24021ffc, 0x3c010001, 0xac223d70, 0x3c0200c0, 
+0x3c010001, 0xac223d74, 0x3c020020, 0xafbf0010, 
 0x3c0100c0, 0xac201ffc, 0x431023, 0x441023, 
-0x245bb000, 0x365b821, 0x3c1d0001, 0x8fbd3c5c, 
+0x245bb000, 0x365b821, 0x3c1d0001, 0x8fbd3d6c, 
 0x3a0f021, 0x3c0400c0, 0x34840200, 0x3c1a00c0, 
 0x3c0300c0, 0x346307b8, 0x24021dfc, 0x3c010001, 
-0xac223c60, 0x24021844, 0x3c010001, 0xac243c64, 
-0x3c010001, 0xac223c60, 0x3c010001, 0xac233c64, 
+0xac223d70, 0x24021844, 0x3c010001, 0xac243d74, 
+0x3c010001, 0xac223d70, 0x3c010001, 0xac233d74, 
 0xc0017ba, 0x375a0200, 0x8fbf0010, 0x3e00008, 
-0x27bd0018, 0x27bdffc8, 0x3c040001, 0x24843094, 
-0x24053200, 0x3c020001, 0x8c423c60, 0x3c030001, 
-0x8c633c64, 0x3021, 0x3603821, 0xafbf0030, 
+0x27bd0018, 0x27bdffc8, 0x3c040001, 0x24843154, 
+0x24053200, 0x3c020001, 0x8c423d70, 0x3c030001, 
+0x8c633d74, 0x3021, 0x3603821, 0xafbf0030, 
 0xafb3002c, 0xafb20028, 0xafb10024, 0xafb00020, 
-0xafa2001c, 0xafa30018, 0xafb70010, 0xc0029d3, 
+0xafa2001c, 0xafa30018, 0xafb70010, 0xc002a03, 
 0xafba0014, 0xc0018c2, 0x0, 0x8f820240, 
 0x34420004, 0xaf820240, 0x24020001, 0xaf420000, 
 0x3c020001, 0x571021, 0x904240f4, 0x10400092, 
-0x2403fffc, 0x3c100001, 0x2610a6d3, 0x3c120001, 
-0x2652a2ac, 0x2121023, 0x438024, 0x8fa3001c, 
-0x3c040001, 0x248430a0, 0x70102b, 0x1440001a, 
+0x2403fffc, 0x3c100001, 0x2610a79b, 0x3c120001, 
+0x2652a374, 0x2121023, 0x438024, 0x8fa3001c, 
+0x3c040001, 0x24843160, 0x70102b, 0x1440001a, 
 0x27b30018, 0x8fb10018, 0x24053000, 0x2403021, 
-0xafb00010, 0xafa30014, 0xc0029d3, 0x2203821, 
+0xafb00010, 0xafa30014, 0xc002a03, 0x2203821, 
 0x8fa30018, 0x702021, 0x64102b, 0x10400007, 
 0x2403021, 0x8cc20000, 0xac620000, 0x24630004, 
 0x64102b, 0x1440fffb, 0x24c60004, 0x8fa2001c, 
 0x501023, 0xafa2001c, 0x8e620000, 0x501021, 
 0x1000000a, 0xae620000, 0x2408821, 0x24053100, 
 0xafb00010, 0xafa30014, 0x8fa70018, 0x2203021, 
-0x2402002d, 0xc0029d3, 0xa0820000, 0x24070020, 
-0x8fa3001c, 0x3c040001, 0x248430bc, 0x24120020, 
-0x3c010001, 0xac313dec, 0x2c620020, 0x1440001d, 
+0x2402002d, 0xc002a03, 0xa0820000, 0x24070020, 
+0x8fa3001c, 0x3c040001, 0x2484317c, 0x24120020, 
+0x3c010001, 0xac313efc, 0x2c620020, 0x1440001d, 
 0x27b10018, 0x8fb00018, 0x24053000, 0x3c060001, 
-0x24c63e80, 0xafa70010, 0xafa30014, 0xc0029d3, 
-0x2003821, 0x8fa30018, 0x3c040001, 0x24843e80, 
+0x24c63f90, 0xafa70010, 0xafa30014, 0xc002a03, 
+0x2003821, 0x8fa30018, 0x3c040001, 0x24843f90, 
 0x24650020, 0x65102b, 0x10400007, 0x0, 
 0x8c820000, 0xac620000, 0x24630004, 0x65102b, 
 0x1440fffb, 0x24840004, 0x8fa2001c, 0x521023, 
 0xafa2001c, 0x8e220000, 0x521021, 0x1000000b, 
-0xae220000, 0x3c100001, 0x26103e80, 0x24053100, 
+0xae220000, 0x3c100001, 0x26103f90, 0x24053100, 
 0xafa70010, 0xafa30014, 0x8fa70018, 0x2003021, 
-0x2402002d, 0xc0029d3, 0xa0820000, 0x24070020, 
-0x3c040001, 0x248430d0, 0x8fa3001c, 0x24120020, 
-0x3c010001, 0xac303e20, 0x2c620020, 0x1440001d, 
+0x2402002d, 0xc002a03, 0xa0820000, 0x24070020, 
+0x3c040001, 0x24843190, 0x8fa3001c, 0x24120020, 
+0x3c010001, 0xac303f30, 0x2c620020, 0x1440001d, 
 0x27b10018, 0x8fb00018, 0x24053000, 0x3c060001, 
-0x24c63ea0, 0xafa70010, 0xafa30014, 0xc0029d3, 
-0x2003821, 0x8fa30018, 0x3c040001, 0x24843ea0, 
+0x24c63fb0, 0xafa70010, 0xafa30014, 0xc002a03, 
+0x2003821, 0x8fa30018, 0x3c040001, 0x24843fb0, 
 0x24650020, 0x65102b, 0x10400007, 0x0, 
 0x8c820000, 0xac620000, 0x24630004, 0x65102b, 
 0x1440fffb, 0x24840004, 0x8fa2001c, 0x521023, 
 0xafa2001c, 0x8e220000, 0x521021, 0x1000000b, 
-0xae220000, 0x3c100001, 0x26103ea0, 0x24053100, 
+0xae220000, 0x3c100001, 0x26103fb0, 0x24053100, 
 0xafa70010, 0xafa30014, 0x8fa70018, 0x2003021, 
-0x2402002d, 0xc0029d3, 0xa0820000, 0x3c010001, 
-0x10000031, 0xac303e1c, 0x3c100000, 0x26107c8f, 
+0x2402002d, 0xc002a03, 0xa0820000, 0x3c010001, 
+0x10000031, 0xac303f2c, 0x3c100000, 0x26107c8f, 
 0x3c120000, 0x26527b0c, 0x2121023, 0x438024, 
-0x8fa3001c, 0x3c040001, 0x248430e4, 0x70102b, 
+0x8fa3001c, 0x3c040001, 0x248431a4, 0x70102b, 
 0x1440001a, 0x27b30018, 0x8fb10018, 0x24053000, 
-0x2403021, 0xafb00010, 0xafa30014, 0xc0029d3, 
+0x2403021, 0xafb00010, 0xafa30014, 0xc002a03, 
 0x2203821, 0x8fa30018, 0x702021, 0x64102b, 
 0x10400007, 0x2403021, 0x8cc20000, 0xac620000, 
 0x24630004, 0x64102b, 0x1440fffb, 0x24c60004, 
 0x8fa2001c, 0x501023, 0xafa2001c, 0x8e620000, 
 0x501021, 0x1000000a, 0xae620000, 0x2408821, 
 0x24053100, 0xafb00010, 0xafa30014, 0x8fa70018, 
-0x2203021, 0x2402002d, 0xc0029d3, 0xa0820000, 
-0x3c010001, 0xac313dec, 0x3c030001, 0x8c633dec, 
+0x2203021, 0x2402002d, 0xc002a03, 0xa0820000, 
+0x3c010001, 0xac313efc, 0x3c030001, 0x8c633efc, 
 0x24020400, 0x60f809, 0xaf820070, 0x8fbf0030, 
 0x8fb3002c, 0x8fb20028, 0x8fb10024, 0x8fb00020, 
 0x3e00008, 0x27bd0038, 0x0, 0x8f820040, 
@@ -5032,17 +5033,17 @@
 0xaf820078, 0x27bdffe8, 0xafbf0010, 0x8f820054, 
 0x244203e8, 0xaf820058, 0x3c020800, 0x2c21024, 
 0x10400004, 0x3c02f7ff, 0x3442ffff, 0x2c2b024, 
-0x36940040, 0x3c020001, 0x8c423d28, 0x10400027, 
-0x0, 0x3c020001, 0x8c423d14, 0x30420001, 
-0x14400010, 0x0, 0x3c020001, 0x8c423e58, 
-0x1040000c, 0x0, 0x3c020001, 0x8c423da4, 
+0x36940040, 0x3c020001, 0x8c423e38, 0x10400027, 
+0x0, 0x3c020001, 0x8c423e24, 0x30420001, 
+0x14400010, 0x0, 0x3c020001, 0x8c423f68, 
+0x1040000c, 0x0, 0x3c020001, 0x8c423eb4, 
 0x14400008, 0x0, 0x8f830224, 0x3c020001, 
-0x8c425f1c, 0x10620003, 0x0, 0xc003bad, 
+0x8c42602c, 0x10620003, 0x0, 0xc003be0, 
 0x0, 0x934205b1, 0x10400012, 0x24020001, 
 0x934305b1, 0x14620004, 0x3c0208ff, 0x24020002, 
 0x1000000c, 0xa34205b1, 0x3442fffb, 0xa34005b1, 
 0x8f830220, 0x3c040200, 0x284a025, 0x621824, 
-0xaf830220, 0x10000004, 0x3c020200, 0xc003f27, 
+0xaf830220, 0x10000004, 0x3c020200, 0xc003f57, 
 0x0, 0x3c020200, 0x2c21024, 0x10400003, 
 0x0, 0xc001de7, 0x0, 0x8f4200d8, 
 0x8f4300dc, 0x24420001, 0xaf4200d8, 0x43102b, 
@@ -5059,8 +5060,8 @@
 0xafa30014, 0xafa80018, 0x8f42010c, 0x40f809, 
 0x24c6001c, 0x14400011, 0x24020001, 0x3c010001, 
 0x370821, 0xa02240f0, 0x8f820124, 0xafa20010, 
-0x8f820128, 0x3c040001, 0x24843184, 0xafa20014, 
-0x8f46002c, 0x8f870120, 0x3c050009, 0xc0029d3, 
+0x8f820128, 0x3c040001, 0x24843248, 0xafa20014, 
+0x8f46002c, 0x8f870120, 0x3c050009, 0xc002a03, 
 0x34a50900, 0x1000005c, 0x0, 0x8f4202f0, 
 0x24420001, 0xaf4202f0, 0x8f4202f0, 0x8f42002c, 
 0xa34005b2, 0x10000027, 0xaf420038, 0x8f440160, 
@@ -5069,8 +5070,8 @@
 0x8f42010c, 0x40f809, 0x24c6001c, 0x14400011, 
 0x24020001, 0x3c010001, 0x370821, 0xa02240f1, 
 0x8f820124, 0xafa20010, 0x8f820128, 0x3c040001, 
-0x24843190, 0xafa20014, 0x8f46002c, 0x8f870120, 
-0x3c050009, 0xc0029d3, 0x34a51100, 0x10000036, 
+0x24843254, 0xafa20014, 0x8f46002c, 0x8f870120, 
+0x3c050009, 0xc002a03, 0x34a51100, 0x10000036, 
 0x0, 0x8f4202f0, 0x8f43002c, 0x24420001, 
 0xaf4202f0, 0x8f4202f0, 0x24020001, 0xa34205b2, 
 0xaf430038, 0x3c010001, 0x370821, 0xa02040f1, 
@@ -5098,8 +5099,8 @@
 0xafa80018, 0x8f42010c, 0x40f809, 0x24c6001c, 
 0x14400011, 0x24020001, 0x3c010001, 0x370821, 
 0xa02240f2, 0x8f820124, 0xafa20010, 0x8f820128, 
-0x3c040001, 0x24843198, 0xafa20014, 0x8f460044, 
-0x8f870120, 0x3c050009, 0xc0029d3, 0x34a51300, 
+0x3c040001, 0x2484325c, 0xafa20014, 0x8f460044, 
+0x8f870120, 0x3c050009, 0xc002a03, 0x34a51300, 
 0x1000000f, 0x0, 0x8f4202f4, 0x24420001, 
 0xaf4202f4, 0x8f4202f4, 0x8f420044, 0xaf42007c, 
 0x3c010001, 0x370821, 0xa02040f2, 0x10000004, 
@@ -5111,20 +5112,20 @@
 0x431024, 0xaf820060, 0x8f420000, 0x10400003, 
 0x0, 0x10000002, 0xaf80004c, 0xaf800048, 
 0x8fbf0020, 0x3e00008, 0x27bd0028, 0x3e00008, 
-0x0, 0x3c020001, 0x8c423d28, 0x27bdffa8, 
+0x0, 0x3c020001, 0x8c423e38, 0x27bdffa8, 
 0xafbf0050, 0xafbe004c, 0xafb50048, 0xafb30044, 
 0xafb20040, 0xafb1003c, 0xafb00038, 0x104000d5, 
 0x8f900044, 0x8f4200d0, 0x24430001, 0x2842000b, 
 0x144000e4, 0xaf4300d0, 0x8f420004, 0x30420002, 
 0x1440009c, 0xaf4000d0, 0x8f420004, 0x3c030001, 
-0x8c633d18, 0x34420002, 0xaf420004, 0x24020001, 
+0x8c633e28, 0x34420002, 0xaf420004, 0x24020001, 
 0x14620003, 0x3c020600, 0x10000002, 0x34423000, 
 0x34421000, 0xafa20020, 0x8f4a0018, 0xafaa0034, 
 0x27aa0020, 0xafaa002c, 0x8faa0034, 0x240200ff, 
 0x11420002, 0x1821, 0x25430001, 0x8c020228, 
 0x609821, 0x1662000e, 0x3c050009, 0x8f42032c, 
 0x24420001, 0xaf42032c, 0x8f42032c, 0x8c020228, 
-0x8fa70034, 0x3c040001, 0x24843168, 0xafa00014, 
+0x8fa70034, 0x3c040001, 0x2484322c, 0xafa00014, 
 0xafa20010, 0x8fa60020, 0x10000070, 0x34a50500, 
 0x8faa0034, 0xa38c0, 0xf71021, 0x8fa30020, 
 0x8fa40024, 0xac4304c0, 0xac4404c4, 0x8f830054, 
@@ -5139,7 +5140,7 @@
 0x32a200ff, 0x54400018, 0xaf530018, 0x8f420368, 
 0x24420001, 0xaf420368, 0x8f420368, 0x8f820120, 
 0x8faa002c, 0x8fa70034, 0xafa20010, 0x8f820124, 
-0x3c040001, 0x24843174, 0xafa20014, 0x8d460000, 
+0x3c040001, 0x24843238, 0xafa20014, 0x8d460000, 
 0x3c050009, 0x10000035, 0x34a50600, 0x8f4202f8, 
 0x24150001, 0x24420001, 0xaf4202f8, 0x8f4202f8, 
 0x1000001e, 0x32a200ff, 0x8f830054, 0x8f820054, 
@@ -5152,8 +5153,8 @@
 0x1440ffee, 0x0, 0x32a200ff, 0x14400011, 
 0x3c050009, 0x8f420368, 0x24420001, 0xaf420368, 
 0x8f420368, 0x8f820120, 0x8faa002c, 0x8fa70034, 
-0xafa20010, 0x8f820124, 0x3c040001, 0x2484317c, 
-0xafa20014, 0x8d460000, 0x34a50700, 0xc0029d3, 
+0xafa20010, 0x8f820124, 0x3c040001, 0x24843240, 
+0xafa20014, 0x8d460000, 0x34a50700, 0xc002a03, 
 0x0, 0x8f4202dc, 0x24420001, 0xaf4202dc, 
 0x8f4202dc, 0x8f420004, 0x30420001, 0x50400029, 
 0x36100040, 0x3c020400, 0x2c21024, 0x10400013, 
@@ -5176,10 +5177,10 @@
 0x8fbf0050, 0x8fbe004c, 0x8fb50048, 0x8fb30044, 
 0x8fb20040, 0x8fb1003c, 0x8fb00038, 0x3e00008, 
 0x27bd0058, 0x3e00008, 0x0, 0x3c020001, 
-0x8c423d28, 0x27bdffb0, 0xafbf0048, 0xafbe0044, 
+0x8c423e38, 0x27bdffb0, 0xafbf0048, 0xafbe0044, 
 0xafb50040, 0xafb3003c, 0xafb20038, 0xafb10034, 
 0x104000de, 0xafb00030, 0x8f4200d0, 0x3c040001, 
-0x8c843d18, 0x24430001, 0x2842000b, 0xaf4400e8, 
+0x8c843e28, 0x24430001, 0x2842000b, 0xaf4400e8, 
 0x144000fe, 0xaf4300d0, 0x8f420004, 0x30420002, 
 0x14400095, 0xaf4000d0, 0x8f420004, 0x34420002, 
 0xaf420004, 0x24020001, 0x14820003, 0x3c020600, 
@@ -5188,7 +5189,7 @@
 0x13c20002, 0xafaa002c, 0x27c30001, 0x8c020228, 
 0x609021, 0x1642000e, 0x1e38c0, 0x8f42032c, 
 0x24420001, 0xaf42032c, 0x8f42032c, 0x8c020228, 
-0x3c040001, 0x24843168, 0x3c050009, 0xafa00014, 
+0x3c040001, 0x2484322c, 0x3c050009, 0xafa00014, 
 0xafa20010, 0x8fa60020, 0x1000006d, 0x34a50500, 
 0xf71021, 0x8fa30020, 0x8fa40024, 0xac4304c0, 
 0xac4404c4, 0x8f830054, 0x8f820054, 0x247003e8, 
@@ -5202,7 +5203,7 @@
 0x1440ffe9, 0x0, 0x326200ff, 0x54400017, 
 0xaf520018, 0x8f420368, 0x24420001, 0xaf420368, 
 0x8f420368, 0x8f820120, 0x8faa002c, 0xafa20010, 
-0x8f820124, 0x3c040001, 0x24843174, 0x3c050009, 
+0x8f820124, 0x3c040001, 0x24843238, 0x3c050009, 
 0xafa20014, 0x8d460000, 0x10000035, 0x34a50600, 
 0x8f4202f8, 0x24130001, 0x24420001, 0xaf4202f8, 
 0x8f4202f8, 0x1000001e, 0x326200ff, 0x8f830054, 
@@ -5215,9 +5216,9 @@
 0x2c4203e9, 0x1440ffee, 0x0, 0x326200ff, 
 0x14400011, 0x0, 0x8f420368, 0x24420001, 
 0xaf420368, 0x8f420368, 0x8f820120, 0x8faa002c, 
-0xafa20010, 0x8f820124, 0x3c040001, 0x2484317c, 
+0xafa20010, 0x8f820124, 0x3c040001, 0x24843240, 
 0x3c050009, 0xafa20014, 0x8d460000, 0x34a50700, 
-0xc0029d3, 0x3c03821, 0x8f4202dc, 0x24420001, 
+0xc002a03, 0x3c03821, 0x8f4202dc, 0x24420001, 
 0xaf4202dc, 0x8f4202dc, 0x8f420004, 0x30420001, 
 0x10400033, 0x3c020400, 0x2c21024, 0x10400017, 
 0x0, 0x934205b0, 0x8f440240, 0x8f450244, 
@@ -5247,7 +5248,7 @@
 0x8f4300e8, 0x3042007f, 0xa34205b0, 0x24020001, 
 0x14620005, 0x0, 0x934405b0, 0x42102, 
 0x10000003, 0x348400f0, 0x934405b0, 0x3484000f, 
-0xc004b04, 0x0, 0x2402ff7f, 0x282a024, 
+0xc004b34, 0x0, 0x2402ff7f, 0x282a024, 
 0x8fbf0048, 0x8fbe0044, 0x8fb50040, 0x8fb3003c, 
 0x8fb20038, 0x8fb10034, 0x8fb00030, 0x3e00008, 
 0x27bd0050, 0x3e00008, 0x0, 0x27bdffb0, 
@@ -5300,7 +5301,7 @@
 0xafaa002c, 0x27c30001, 0x8c020228, 0x609021, 
 0x1642000e, 0x1e38c0, 0x8f42032c, 0x24420001, 
 0xaf42032c, 0x8f42032c, 0x8c020228, 0x3c040001, 
-0x24843168, 0x3c050009, 0xafa00014, 0xafa20010, 
+0x2484322c, 0x3c050009, 0xafa00014, 0xafa20010, 
 0x8fa60020, 0x1000006b, 0x34a50500, 0xf71021, 
 0x8fa30020, 0x8fa40024, 0xac4304c0, 0xac4404c4, 
 0x8f830054, 0x8f820054, 0x247003e8, 0x2021023, 
@@ -5314,7 +5315,7 @@
 0x0, 0x326200ff, 0x54400017, 0xaf520018, 
 0x8f420368, 0x24420001, 0xaf420368, 0x8f420368, 
 0x8f820120, 0x8faa002c, 0xafa20010, 0x8f820124, 
-0x3c040001, 0x24843174, 0x3c050009, 0xafa20014, 
+0x3c040001, 0x24843238, 0x3c050009, 0xafa20014, 
 0x8d460000, 0x10000033, 0x34a50600, 0x8f4202f8, 
 0x24130001, 0x24420001, 0xaf4202f8, 0x8f4202f8, 
 0x1000001c, 0x326200ff, 0x8f830054, 0x8f820054, 
@@ -5327,13 +5328,13 @@
 0x326200ff, 0x54400012, 0x24020001, 0x8f420368, 
 0x24420001, 0xaf420368, 0x8f420368, 0x8f820120, 
 0x8faa002c, 0xafa20010, 0x8f820124, 0x3c040001, 
-0x2484317c, 0x3c050009, 0xafa20014, 0x8d460000, 
-0x34a50700, 0xc0029d3, 0x3c03821, 0x1021, 
+0x24843240, 0x3c050009, 0xafa20014, 0x8d460000, 
+0x34a50700, 0xc002a03, 0x3c03821, 0x1021, 
 0x1440005b, 0x24020001, 0x10000065, 0x0, 
 0x8f510018, 0x240200ff, 0x12220002, 0x8021, 
 0x26300001, 0x8c020228, 0x1602000e, 0x1130c0, 
 0x8f42032c, 0x24420001, 0xaf42032c, 0x8f42032c, 
-0x8c020228, 0x3c040001, 0x24843150, 0x3c050009, 
+0x8c020228, 0x3c040001, 0x24843214, 0x3c050009, 
 0xafa00014, 0xafa20010, 0x8fa60020, 0x1000003f, 
 0x34a50100, 0xd71021, 0x8fa30020, 0x8fa40024, 
 0xac4304c0, 0xac4404c4, 0xc01821, 0x8f440168, 
@@ -5342,15 +5343,15 @@
 0xafa80018, 0x8f48010c, 0x24070008, 0xa32821, 
 0xa3482b, 0x822021, 0x100f809, 0x892021, 
 0x1440000b, 0x24070008, 0x8f820120, 0xafa20010, 
-0x8f820124, 0x3c040001, 0x24843158, 0x3c050009, 
+0x8f820124, 0x3c040001, 0x2484321c, 0x3c050009, 
 0xafa20014, 0x8fa60020, 0x1000001c, 0x34a50200, 
 0x8f440150, 0x8f450154, 0x8f43000c, 0xaf500018, 
 0x8f860120, 0x24020010, 0xafa20010, 0xafb00014, 
 0xafa30018, 0x8f42010c, 0x40f809, 0x24c6001c, 
 0x54400011, 0x24020001, 0x8f420330, 0x24420001, 
 0xaf420330, 0x8f420330, 0x8f820120, 0xafa20010, 
-0x8f820124, 0x3c040001, 0x24843160, 0x3c050009, 
-0xafa20014, 0x8fa60020, 0x34a50300, 0xc0029d3, 
+0x8f820124, 0x3c040001, 0x24843224, 0x3c050009, 
+0xafa20014, 0x8fa60020, 0x34a50300, 0xc002a03, 
 0x2203821, 0x1021, 0x1040000d, 0x24020001, 
 0x8f4202d8, 0xa34005b7, 0xaf4001a0, 0x24420001, 
 0xaf4202d8, 0x8f4202d8, 0x8ee20150, 0x24420001, 
@@ -5370,11 +5371,11 @@
 0x14620005, 0x0, 0x8f430124, 0x8f8200b4, 
 0x10620010, 0x0, 0x8f820104, 0xaf42011c, 
 0x8f8200b4, 0x8f43011c, 0xaf420124, 0xafa30010, 
-0x8f420124, 0x3c040001, 0x248431a0, 0xafa20014, 
+0x8f420124, 0x3c040001, 0x24843264, 0xafa20014, 
 0x8f86011c, 0x8f8700b0, 0x3c050005, 0x10000031, 
 0x34a50900, 0x8f42011c, 0xafa20010, 0x8f420124, 
-0x3c040001, 0x248431ac, 0xafa20014, 0x8f86011c, 
-0x8f8700b0, 0x3c050005, 0xc0029d3, 0x34a51000, 
+0x3c040001, 0x24843270, 0xafa20014, 0x8f86011c, 
+0x8f8700b0, 0x3c050005, 0xc002a03, 0x34a51000, 
 0x8f82011c, 0x34420002, 0xaf82011c, 0x8f830104, 
 0x8f8200b0, 0x34420001, 0xaf8200b0, 0x24020008, 
 0xaf830104, 0xafa20010, 0xafa00014, 0x8f42000c, 
@@ -5382,9 +5383,9 @@
 0x26e60028, 0x40f809, 0x24070400, 0x8f82011c, 
 0x2403fffd, 0x431024, 0xaf82011c, 0x8ee201dc, 
 0x24420001, 0xaee201dc, 0x8ee201dc, 0x8f42011c, 
-0xafa20010, 0x8f420124, 0x3c040001, 0x248431b8, 
+0xafa20010, 0x8f420124, 0x3c040001, 0x2484327c, 
 0xafa20014, 0x8f86011c, 0x8f8700b0, 0x3c050005, 
-0x34a51100, 0xc0029d3, 0x0, 0x8f8200a0, 
+0x34a51100, 0xc002a03, 0x0, 0x8f8200a0, 
 0x30420004, 0x10400069, 0x0, 0x8f430120, 
 0x8f820124, 0x14620005, 0x0, 0x8f430128, 
 0x8f8200a4, 0x10620006, 0x0, 0x8f820124, 
@@ -5397,21 +5398,21 @@
 0x0, 0x8f430128, 0x8f8200a4, 0x10620010, 
 0x0, 0x8f820124, 0xaf420120, 0x8f8200a4, 
 0x8f430120, 0xaf420128, 0xafa30010, 0x8f420128, 
-0x3c040001, 0x248431c4, 0xafa20014, 0x8f86011c, 
+0x3c040001, 0x24843288, 0xafa20014, 0x8f86011c, 
 0x8f8700a0, 0x3c050005, 0x10000032, 0x34a51200, 
 0x8f420120, 0xafa20010, 0x8f420128, 0x3c040001, 
-0x248431d0, 0xafa20014, 0x8f86011c, 0x8f8700a0, 
-0x3c050005, 0xc0029d3, 0x34a51300, 0x8f82011c, 
+0x24843294, 0xafa20014, 0x8f86011c, 0x8f8700a0, 
+0x3c050005, 0xc002a03, 0x34a51300, 0x8f82011c, 
 0x34420002, 0xaf82011c, 0x8f830124, 0x8f8200a0, 
 0x34420001, 0xaf8200a0, 0x24020080, 0xaf830124, 
 0xafa20010, 0xafa00014, 0x8f420014, 0x8c040208, 
 0x8c05020c, 0xafa20018, 0x8f420108, 0x3c060001, 
-0x24c63e14, 0x40f809, 0x24070004, 0x8f82011c, 
+0x24c63f24, 0x40f809, 0x24070004, 0x8f82011c, 
 0x2403fffd, 0x431024, 0xaf82011c, 0x8ee201dc, 
 0x24420001, 0xaee201dc, 0x8ee201dc, 0x8f420120, 
-0xafa20010, 0x8f420128, 0x3c040001, 0x248431dc, 
+0xafa20010, 0x8f420128, 0x3c040001, 0x248432a0, 
 0xafa20014, 0x8f86011c, 0x8f8700a0, 0x3c050005, 
-0x34a51400, 0xc0029d3, 0x0, 0x8fbf0020, 
+0x34a51400, 0xc002a03, 0x0, 0x8fbf0020, 
 0x3e00008, 0x27bd0028, 0x3c081000, 0x24070001, 
 0x3c060080, 0x3c050100, 0x8f820070, 0x481024, 
 0x1040fffd, 0x0, 0x8f820054, 0x24420005, 
@@ -5479,8 +5480,8 @@
 0x1000006b, 0xaf80004c, 0x10000069, 0xaf800048, 
 0x30c20001, 0x10400004, 0x24020001, 0xaf820064, 
 0x10000063, 0x0, 0x30c20002, 0x1440000b, 
-0x3c050003, 0x3c040001, 0x248432a4, 0x34a50500, 
-0x3821, 0xafa00010, 0xc0029d3, 0xafa00014, 
+0x3c050003, 0x3c040001, 0x24843364, 0x34a50500, 
+0x3821, 0xafa00010, 0xc002a03, 0xafa00014, 
 0x2402ffc0, 0x10000056, 0xaf820064, 0x8c10022c, 
 0x8c02010c, 0x12020047, 0x101080, 0x8c450300, 
 0x26020001, 0x3050003f, 0x24020003, 0xac10022c, 
@@ -5508,29 +5509,29 @@
 0x808021, 0x101602, 0x2442ffff, 0x304300ff, 
 0x2c620013, 0xafbf0050, 0xafbe004c, 0xafb50048, 
 0xafb30044, 0xafb20040, 0x104001e6, 0xafb1003c, 
-0x31080, 0x3c010001, 0x220821, 0x8c2232e8, 
+0x31080, 0x3c010001, 0x220821, 0x8c2233a8, 
 0x400008, 0x0, 0x101302, 0x30440fff, 
 0x24020001, 0x10820005, 0x24020002, 0x1082000a, 
 0x2402fffe, 0x10000021, 0x3c050003, 0x8f430004, 
-0x3c020001, 0x8c423e40, 0xaf4401f0, 0xaf4401f4, 
+0x3c020001, 0x8c423f50, 0xaf4401f0, 0xaf4401f4, 
 0x10000007, 0x34630001, 0x8f430004, 0xaf4401f0, 
-0xaf4401f4, 0x621824, 0x3c020001, 0x2442c254, 
+0xaf4401f4, 0x621824, 0x3c020001, 0x2442c344, 
 0x21100, 0x21182, 0xaf430004, 0x3c030800, 
 0x431025, 0x3c010000, 0xac224138, 0x8f840054, 
 0x41442, 0x41c82, 0x431021, 0x41cc2, 
 0x431023, 0x41d02, 0x431021, 0x41d42, 
 0x431023, 0x10000009, 0xaf4201f8, 0x3c040001, 
-0x248432b0, 0x34a51000, 0x2003021, 0x3821, 
-0xafa00010, 0xc0029d3, 0xafa00014, 0x8f420290, 
+0x24843370, 0x34a51000, 0x2003021, 0x3821, 
+0xafa00010, 0xc002a03, 0xafa00014, 0x8f420290, 
 0x24420001, 0xaf420290, 0x10000215, 0x8f420290, 
-0x27b00028, 0x2002021, 0x24050210, 0xc002a57, 
+0x27b00028, 0x2002021, 0x24050210, 0xc002a87, 
 0x24060008, 0xc0023a0, 0x2002021, 0x1000020c, 
 0x0, 0x8c06022c, 0x27a40028, 0x61880, 
 0x24c20001, 0x3046003f, 0x8c650300, 0x61080, 
 0x8c430300, 0x24c20001, 0x3042003f, 0xac02022c, 
 0xafa50028, 0xc0023a0, 0xafa3002c, 0x100001fc, 
 0x0, 0x27b00028, 0x2002021, 0x24050210, 
-0xc002a57, 0x24060008, 0xc0024df, 0x2002021, 
+0xc002a87, 0x24060008, 0xc0024df, 0x2002021, 
 0x100001f3, 0x0, 0x8c06022c, 0x27a40028, 
 0x61880, 0x24c20001, 0x3046003f, 0x8c650300, 
 0x61080, 0x8c430300, 0x24c20001, 0x3042003f, 
@@ -5550,8 +5551,8 @@
 0xaf82022c, 0x3c020001, 0x571021, 0x8c4238e0, 
 0xaf820230, 0x3c020001, 0x571021, 0x8c4238e4, 
 0xaf820234, 0x3c02fffd, 0x3442ffff, 0x10000009, 
-0x2c2b024, 0x3c040001, 0x248432bc, 0x34a51100, 
-0x2003021, 0x3821, 0xafa00010, 0xc0029d3, 
+0x2c2b024, 0x3c040001, 0x2484337c, 0x34a51100, 
+0x2003021, 0x3821, 0xafa00010, 0xc002a03, 
 0xafa00014, 0x8f4202bc, 0x24420001, 0xaf4202bc, 
 0x1000019b, 0x8f4202bc, 0x101302, 0x30450fff, 
 0x24020001, 0x10a20005, 0x24020002, 0x10a2000d, 
@@ -5560,24 +5561,24 @@
 0x621824, 0x34630008, 0xaf830220, 0x10000012, 
 0xaf450288, 0x3484fff7, 0x3c03fffb, 0x8f820220, 
 0x3463ffff, 0x2c3b024, 0x441024, 0xaf820220, 
-0x10000009, 0xaf450288, 0x3c040001, 0x248432c8, 
+0x10000009, 0xaf450288, 0x3c040001, 0x24843388, 
 0x34a51200, 0x2003021, 0x3821, 0xafa00010, 
-0xc0029d3, 0xafa00014, 0x8f4202ac, 0x24420001, 
+0xc002a03, 0xafa00014, 0x8f4202ac, 0x24420001, 
 0xaf4202ac, 0x10000172, 0x8f4202ac, 0x27840208, 
-0x24050200, 0xc002a57, 0x24060008, 0x27440214, 
-0x24050200, 0xc002a57, 0x24060008, 0x8f4202b4, 
+0x24050200, 0xc002a87, 0x24060008, 0x27440214, 
+0x24050200, 0xc002a87, 0x24060008, 0x8f4202b4, 
 0x24420001, 0xaf4202b4, 0x10000165, 0x8f4202b4, 
 0x101302, 0x30430fff, 0x24020001, 0x10620011, 
 0x28620002, 0x50400005, 0x24020002, 0x10600007, 
 0x0, 0x10000017, 0x0, 0x1062000f, 
 0x0, 0x10000013, 0x0, 0x8c060248, 
-0x2021, 0xc004878, 0x24050004, 0x10000007, 
-0x0, 0x8c060248, 0x2021, 0xc004878, 
+0x2021, 0xc0048a8, 0x24050004, 0x10000007, 
+0x0, 0x8c060248, 0x2021, 0xc0048a8, 
 0x24050004, 0x10000010, 0x0, 0x8c06024c, 
-0x2021, 0xc004878, 0x24050001, 0x1000000a, 
-0x0, 0x3c040001, 0x248432d4, 0x3c050003, 
+0x2021, 0xc0048a8, 0x24050001, 0x1000000a, 
+0x0, 0x3c040001, 0x24843394, 0x3c050003, 
 0x34a51300, 0x2003021, 0x3821, 0xafa00010, 
-0xc0029d3, 0xafa00014, 0x8f4202b0, 0x24420001, 
+0xc002a03, 0xafa00014, 0x8f4202b0, 0x24420001, 
 0xaf4202b0, 0x10000136, 0x8f4202b0, 0xc0022b4, 
 0x0, 0x10000132, 0x0, 0x24020001, 
 0xa34205b6, 0x24100100, 0x8f440198, 0x8f45019c, 
@@ -5590,7 +5591,7 @@
 0x27aa0020, 0x240200ff, 0x13c20002, 0xafaa0034, 
 0x27c30001, 0x8c020228, 0x609021, 0x1642000e, 
 0x1e38c0, 0x8f42032c, 0x24420001, 0xaf42032c, 
-0x8f42032c, 0x8c020228, 0x3c040001, 0x2484326c, 
+0x8f42032c, 0x8c020228, 0x3c040001, 0x2484332c, 
 0x3c050009, 0xafa00014, 0xafa20010, 0x8fa60020, 
 0x1000006b, 0x34a50500, 0xf71021, 0x8fa30020, 
 0x8fa40024, 0xac4304c0, 0xac4404c4, 0x8f830054, 
@@ -5605,7 +5606,7 @@
 0x326200ff, 0x54400017, 0xaf520018, 0x8f420368, 
 0x24420001, 0xaf420368, 0x8f420368, 0x8f820120, 
 0x8faa0034, 0xafa20010, 0x8f820124, 0x3c040001, 
-0x24843278, 0x3c050009, 0xafa20014, 0x8d460000, 
+0x24843338, 0x3c050009, 0xafa20014, 0x8d460000, 
 0x10000033, 0x34a50600, 0x8f4202f8, 0x24130001, 
 0x24420001, 0xaf4202f8, 0x8f4202f8, 0x1000001c, 
 0x326200ff, 0x8f830054, 0x8f820054, 0x247003e8, 
@@ -5617,26 +5618,26 @@
 0x2c4203e9, 0x1440ffef, 0x0, 0x326200ff, 
 0x14400011, 0x0, 0x8f420368, 0x24420001, 
 0xaf420368, 0x8f420368, 0x8f820120, 0x8faa0034, 
-0xafa20010, 0x8f820124, 0x3c040001, 0x24843280, 
+0xafa20010, 0x8f820124, 0x3c040001, 0x24843340, 
 0x3c050009, 0xafa20014, 0x8d460000, 0x34a50700, 
-0xc0029d3, 0x3c03821, 0x8f4202a0, 0x24420001, 
+0xc002a03, 0x3c03821, 0x8f4202a0, 0x24420001, 
 0xaf4202a0, 0x8f4202a0, 0x8f4202e8, 0x24420001, 
 0xaf4202e8, 0x1000008a, 0x8f4202e8, 0x8c02025c, 
 0x27440214, 0xaf4201e0, 0x8c020260, 0x24050200, 
-0x24060008, 0xc002a57, 0xaf4201e8, 0x8f820220, 
+0x24060008, 0xc002a87, 0xaf4201e8, 0x8f820220, 
 0x30420008, 0x14400002, 0x24020001, 0x24020002, 
 0xaf420288, 0x8f42029c, 0x24420001, 0xaf42029c, 
 0x10000077, 0x8f42029c, 0x3c0200ff, 0x3442ffff, 
 0x2021824, 0x32c20180, 0x14400006, 0x3402fffb, 
 0x43102b, 0x14400003, 0x0, 0x1000006c, 
-0xaf4300bc, 0x3c040001, 0x248432e0, 0x3c050003, 
+0xaf4300bc, 0x3c040001, 0x248433a0, 0x3c050003, 
 0x34a51500, 0x2003021, 0x3821, 0xafa00010, 
-0xc0029d3, 0xafa00014, 0x3c020700, 0x34421000, 
+0xc002a03, 0xafa00014, 0x3c020700, 0x34421000, 
 0x101e02, 0x621825, 0xafa30020, 0x8f510018, 
 0x240200ff, 0x12220002, 0x8021, 0x26300001, 
 0x8c020228, 0x1602000e, 0x1130c0, 0x8f42032c, 
 0x24420001, 0xaf42032c, 0x8f42032c, 0x8c020228, 
-0x3c040001, 0x24843254, 0x3c050009, 0xafa00014, 
+0x3c040001, 0x24843314, 0x3c050009, 0xafa00014, 
 0xafa20010, 0x8fa60020, 0x1000003f, 0x34a50100, 
 0xd71021, 0x8fa30020, 0x8fa40024, 0xac4304c0, 
 0xac4404c4, 0xc01821, 0x8f440168, 0x8f45016c, 
@@ -5645,15 +5646,15 @@
 0x8f48010c, 0x24070008, 0xa32821, 0xa3482b, 
 0x822021, 0x100f809, 0x892021, 0x1440000b, 
 0x24070008, 0x8f820120, 0xafa20010, 0x8f820124, 
-0x3c040001, 0x2484325c, 0x3c050009, 0xafa20014, 
+0x3c040001, 0x2484331c, 0x3c050009, 0xafa20014, 
 0x8fa60020, 0x1000001c, 0x34a50200, 0x8f440150, 
 0x8f450154, 0x8f43000c, 0xaf500018, 0x8f860120, 
 0x24020010, 0xafa20010, 0xafb00014, 0xafa30018, 
 0x8f42010c, 0x40f809, 0x24c6001c, 0x14400010, 
 0x0, 0x8f420330, 0x24420001, 0xaf420330, 
 0x8f420330, 0x8f820120, 0xafa20010, 0x8f820124, 
-0x3c040001, 0x24843264, 0x3c050009, 0xafa20014, 
-0x8fa60020, 0x34a50300, 0xc0029d3, 0x2203821, 
+0x3c040001, 0x24843324, 0x3c050009, 0xafa20014, 
+0x8fa60020, 0x34a50300, 0xc002a03, 0x2203821, 
 0x8f4202d0, 0x24420001, 0xaf4202d0, 0x8f4202d0, 
 0x8f4202e0, 0x24420001, 0xaf4202e0, 0x8f4202e0, 
 0x8fbf0050, 0x8fbe004c, 0x8fb50048, 0x8fb30044, 
@@ -5673,21 +5674,21 @@
 0x431024, 0x34420004, 0xaf820200, 0x8f53034c, 
 0x8f550350, 0x8f5e0354, 0x8f470358, 0xafa70014, 
 0x8f4202c0, 0x274401b0, 0x24420001, 0xaf4202c0, 
-0x8f5002c0, 0x8f5101f4, 0x8f5201f0, 0xc002a40, 
+0x8f5002c0, 0x8f5101f4, 0x8f5201f0, 0xc002a70, 
 0x24050400, 0xaf53034c, 0xaf550350, 0xaf5e0354, 
 0x8fa70014, 0xaf470358, 0xaf5002c0, 0xaf5101f4, 
 0xaf5201f0, 0x8c02025c, 0x27440214, 0xaf4201e0, 
 0x8c020260, 0x24050200, 0x24060008, 0xaf4201e8, 
-0x24020006, 0xc002a57, 0xaf4201e4, 0x3c023b9a, 
+0x24020006, 0xc002a87, 0xaf4201e4, 0x3c023b9a, 
 0x3442ca00, 0xaf4201ec, 0x240203e8, 0x24040002, 
 0x24030001, 0xaf420284, 0xaf440280, 0xaf43028c, 
 0x8f820220, 0x30420008, 0x10400004, 0x0, 
 0xaf430288, 0x10000003, 0x3021, 0xaf440288, 
-0x3021, 0x3c030001, 0x661821, 0x90633c80, 
+0x3021, 0x3c030001, 0x661821, 0x90633d90, 
 0x3461021, 0x24c60001, 0xa043021c, 0x2cc2000f, 
 0x1440fff8, 0x3461821, 0x24c60001, 0x8f820040, 
 0x24040080, 0x24050080, 0x21702, 0x24420030, 
-0xa062021c, 0x3461021, 0xc002a40, 0xa040021c, 
+0xa062021c, 0x3461021, 0xc002a70, 0xa040021c, 
 0x8fa7001c, 0x30e20004, 0x14400006, 0x0, 
 0x8f820220, 0x3c0308ff, 0x3463fffb, 0x431024, 
 0xaf820220, 0x8fa70024, 0x30e20004, 0x14400006, 
@@ -5739,15 +5740,15 @@
 0x10c00014, 0x610c0, 0x571821, 0x3c010001, 
 0x230821, 0x8c2334d0, 0x571021, 0xafa30010, 
 0x3c010001, 0x220821, 0x8c2234d4, 0x3c040001, 
-0x248433f0, 0xafa20014, 0x8e260000, 0x8e270004, 
-0x3c050004, 0xc0029d3, 0x34a50400, 0x10000063, 
+0x248434b4, 0xafa20014, 0x8e260000, 0x8e270004, 
+0x3c050004, 0xc002a03, 0x34a50400, 0x10000063, 
 0x3c020800, 0x8f450100, 0x10a00006, 0x510c0, 
 0x2e21021, 0x3c010001, 0x220821, 0x942234d0, 
 0xaf420100, 0xa03021, 0x14c00011, 0x628c0, 
 0x710c0, 0x2e21021, 0xafa70010, 0x3c010001, 
-0x220821, 0x942230d0, 0x3c040001, 0x248433fc, 
+0x220821, 0x942230d0, 0x3c040001, 0x248434c0, 
 0xafa20014, 0x8e260000, 0x8e270004, 0x3c050004, 
-0xc0029d3, 0x34a50500, 0x10000048, 0x3c020800, 
+0xc002a03, 0x34a50500, 0x10000048, 0x3c020800, 
 0xb71821, 0x3c020001, 0x96040000, 0x344234d2, 
 0x621821, 0xa4640000, 0x8e020002, 0x720c0, 
 0xac620002, 0x2e41021, 0x3c030001, 0x621821, 
@@ -5770,7 +5771,7 @@
 0x240200ff, 0x13c20002, 0xafaa002c, 0x27c30001, 
 0x8c020228, 0x609021, 0x1642000e, 0x1e38c0, 
 0x8f42032c, 0x24420001, 0xaf42032c, 0x8f42032c, 
-0x8c020228, 0x3c040001, 0x248433b8, 0x3c050009, 
+0x8c020228, 0x3c040001, 0x2484347c, 0x3c050009, 
 0xafa00014, 0xafa20010, 0x8fa60020, 0x1000006b, 
 0x34a50500, 0xf71021, 0x8fa30020, 0x8fa40024, 
 0xac4304c0, 0xac4404c4, 0x8f830054, 0x8f820054, 
@@ -5784,7 +5785,7 @@
 0x2c4203e9, 0x1440ffe9, 0x0, 0x326200ff, 
 0x54400017, 0xaf520018, 0x8f420368, 0x24420001, 
 0xaf420368, 0x8f420368, 0x8f820120, 0x8faa002c, 
-0xafa20010, 0x8f820124, 0x3c040001, 0x248433c4, 
+0xafa20010, 0x8f820124, 0x3c040001, 0x24843488, 
 0x3c050009, 0xafa20014, 0x8d460000, 0x10000033, 
 0x34a50600, 0x8f4202f8, 0x24130001, 0x24420001, 
 0xaf4202f8, 0x8f4202f8, 0x1000001c, 0x326200ff, 
@@ -5797,8 +5798,8 @@
 0x1440ffef, 0x0, 0x326200ff, 0x14400011, 
 0x0, 0x8f420368, 0x24420001, 0xaf420368, 
 0x8f420368, 0x8f820120, 0x8faa002c, 0xafa20010, 
-0x8f820124, 0x3c040001, 0x248433cc, 0x3c050009, 
-0xafa20014, 0x8d460000, 0x34a50700, 0xc0029d3, 
+0x8f820124, 0x3c040001, 0x24843490, 0x3c050009, 
+0xafa20014, 0x8d460000, 0x34a50700, 0xc002a03, 
 0x3c03821, 0x8f4202a4, 0x24420001, 0xaf4202a4, 
 0x8f4202a4, 0x8f4202e4, 0x24420001, 0xaf4202e4, 
 0x8f4202e4, 0x8fbf0048, 0x8fbe0044, 0x8fb50040, 
@@ -5818,8 +5819,8 @@
 0x94c634d0, 0x14c0ffea, 0x610c0, 0x14c00011, 
 0xafa70028, 0x810c0, 0x2e21021, 0xafa80010, 
 0x3c010001, 0x220821, 0x942230d0, 0x3c040001, 
-0x24843408, 0xafa20014, 0x8e260000, 0x8e270004, 
-0x3c050004, 0xc0029d3, 0x34a50900, 0x10000075, 
+0x248434cc, 0xafa20014, 0x8e260000, 0x8e270004, 
+0x3c050004, 0xc002a03, 0x34a50900, 0x10000075, 
 0x3c020800, 0x10e0000c, 0x610c0, 0x2e21021, 
 0x3c030001, 0x621821, 0x946334d0, 0x710c0, 
 0x2e21021, 0x3c010001, 0x220821, 0xa42334d0, 
@@ -5854,7 +5855,7 @@
 0xafab0034, 0x27c30001, 0x8c020228, 0x609021, 
 0x1642000e, 0x1e38c0, 0x8f42032c, 0x24420001, 
 0xaf42032c, 0x8f42032c, 0x8c020228, 0x3c040001, 
-0x248433b8, 0x3c050009, 0xafa00014, 0xafa20010, 
+0x2484347c, 0x3c050009, 0xafa00014, 0xafa20010, 
 0x8fa60020, 0x1000006b, 0x34a50500, 0xf71021, 
 0x8fa30020, 0x8fa40024, 0xac4304c0, 0xac4404c4, 
 0x8f830054, 0x8f820054, 0x247003e8, 0x2021023, 
@@ -5868,7 +5869,7 @@
 0x0, 0x326200ff, 0x54400017, 0xaf520018, 
 0x8f420368, 0x24420001, 0xaf420368, 0x8f420368, 
 0x8f820120, 0x8fab0034, 0xafa20010, 0x8f820124, 
-0x3c040001, 0x248433c4, 0x3c050009, 0xafa20014, 
+0x3c040001, 0x24843488, 0x3c050009, 0xafa20014, 
 0x8d660000, 0x10000033, 0x34a50600, 0x8f4202f8, 
 0x24130001, 0x24420001, 0xaf4202f8, 0x8f4202f8, 
 0x1000001c, 0x326200ff, 0x8f830054, 0x8f820054, 
@@ -5881,14 +5882,14 @@
 0x326200ff, 0x14400011, 0x0, 0x8f420368, 
 0x24420001, 0xaf420368, 0x8f420368, 0x8f820120, 
 0x8fab0034, 0xafa20010, 0x8f820124, 0x3c040001, 
-0x248433cc, 0x3c050009, 0xafa20014, 0x8d660000, 
-0x34a50700, 0xc0029d3, 0x3c03821, 0x8f4202a8, 
+0x24843490, 0x3c050009, 0xafa20014, 0x8d660000, 
+0x34a50700, 0xc002a03, 0x3c03821, 0x8f4202a8, 
 0x24420001, 0xaf4202a8, 0x8f4202a8, 0x8f4202e4, 
 0x24420001, 0xaf4202e4, 0x8f4202e4, 0x8fbf0058, 
 0x8fbe0054, 0x8fb50050, 0x8fb3004c, 0x8fb20048, 
 0x8fb10044, 0x8fb00040, 0x3e00008, 0x27bd0060, 
 0x0, 0x0, 0x0, 0x27bdffe0, 
-0x27644000, 0xafbf0018, 0xc002a40, 0x24051000, 
+0x27644000, 0xafbf0018, 0xc002a70, 0x24051000, 
 0x3c030001, 0x34632cc0, 0x3c040001, 0x34842ec8, 
 0x24020020, 0xaf82011c, 0x2e31021, 0xaf800100, 
 0xaf800104, 0xaf800108, 0xaf800110, 0xaf800114, 
@@ -5897,15 +5898,15 @@
 0x2e31021, 0xaf4200f0, 0x2e41021, 0xaf4200f4, 
 0x2e41021, 0xaf4200f8, 0x3c020001, 0x571021, 
 0x904240f4, 0x1440001c, 0x3c050001, 0x8f82011c, 
-0x3c040001, 0x248434d0, 0x3c050001, 0x34420001, 
+0x3c040001, 0x24843590, 0x3c050001, 0x34420001, 
 0xaf82011c, 0xafa00010, 0xafa00014, 0x8f86011c, 
-0x34a50100, 0xc0029d3, 0x3821, 0x8c020218, 
+0x34a50100, 0xc002a03, 0x3821, 0x8c020218, 
 0x30420040, 0x10400014, 0x0, 0x8f82011c, 
-0x3c040001, 0x248434dc, 0x3c050001, 0x34420004, 
+0x3c040001, 0x2484359c, 0x3c050001, 0x34420004, 
 0xaf82011c, 0xafa00010, 0xafa00014, 0x8f86011c, 
-0x10000007, 0x34a50200, 0x3c040001, 0x248434e4, 
+0x10000007, 0x34a50200, 0x3c040001, 0x248435a4, 
 0xafa00010, 0xafa00014, 0x8f86011c, 0x34a50300, 
-0xc0029d3, 0x3821, 0x8fbf0018, 0x3e00008, 
+0xc002a03, 0x3821, 0x8fbf0018, 0x3e00008, 
 0x27bd0020, 0x8fa90010, 0x8f83012c, 0x8faa0014, 
 0x8fab0018, 0x1060000a, 0x27624fe0, 0x14620002, 
 0x24680020, 0x27684800, 0x8f820128, 0x11020004, 
@@ -5962,189 +5963,201 @@
 0xad0b0010, 0xaf890100, 0x10000006, 0x24020001, 
 0x8f430328, 0x1021, 0x24630001, 0xaf430328, 
 0x8f430328, 0x3e00008, 0x0, 0x3e00008, 
-0x0, 0x27bdffd8, 0x3c040001, 0x248434ec, 
+0x0, 0x27bdffd8, 0x3c040001, 0x248435ac, 
 0x3c050001, 0xafbf0024, 0xafb20020, 0xafb1001c, 
 0xafb00018, 0x8f900104, 0x8f9100b0, 0x8f92011c, 
 0x34a52500, 0x8f820100, 0x2403021, 0x2203821, 
-0xafa20010, 0xc0029d3, 0xafb00014, 0x8e020008, 
-0xafa20010, 0x8e02000c, 0x3c040001, 0x248434f8, 
+0xafa20010, 0xc002a03, 0xafb00014, 0x8e020008, 
+0xafa20010, 0x8e02000c, 0x3c040001, 0x248435b8, 
 0xafa20014, 0x8e060000, 0x8e070004, 0x3c050001, 
-0xc0029d3, 0x34a52510, 0x8e020018, 0xafa20010, 
-0x8e02001c, 0x3c040001, 0x24843504, 0xafa20014, 
-0x8e060010, 0x8e070014, 0x3c050001, 0xc0029d3, 
-0x34a52520, 0x3c030200, 0x2c31024, 0x1040000d, 
+0xc002a03, 0x34a52510, 0x8e020018, 0xafa20010, 
+0x8e02001c, 0x3c040001, 0x248435c4, 0xafa20014, 
+0x8e060010, 0x8e070014, 0x3c050001, 0xc002a03, 
+0x34a52520, 0x3c027f00, 0x2221024, 0x3c030800, 
+0x54430016, 0x3c030200, 0x8f82009c, 0x3042ffff, 
+0x14400012, 0x3c030200, 0x3c040001, 0x248435d0, 
+0x3c050002, 0x34a5f030, 0x3021, 0x3821, 
+0x36420002, 0xaf82011c, 0x36220001, 0xaf8200b0, 
+0xaf900104, 0xaf92011c, 0xafa00010, 0xc002a03, 
+0xafa00014, 0x10000024, 0x0, 0x2c31024, 
+0x1040000d, 0x2231024, 0x1040000b, 0x36420002, 
+0xaf82011c, 0x36220001, 0xaf8200b0, 0xaf900104, 
+0xaf92011c, 0x8f420320, 0x24420001, 0xaf420320, 
+0x10000015, 0x8f420320, 0x3c040001, 0x248435d8, 
+0x240202a2, 0xafa20010, 0xafa00014, 0x8f860144, 
+0x3c070001, 0x24e735e0, 0xc002a03, 0x3405dead, 
+0x8f82011c, 0x34420002, 0xaf82011c, 0x8f820220, 
+0x34420004, 0xaf820220, 0x8f820140, 0x3c030001, 
+0x431025, 0xaf820140, 0x8fbf0024, 0x8fb20020, 
+0x8fb1001c, 0x8fb00018, 0x3e00008, 0x27bd0028, 
+0x27bdffd8, 0x3c040001, 0x24843608, 0x3c050001, 
+0xafbf0024, 0xafb20020, 0xafb1001c, 0xafb00018, 
+0x8f900124, 0x8f9100a0, 0x8f92011c, 0x34a52600, 
+0x8f820120, 0x2403021, 0x2203821, 0xafa20010, 
+0xc002a03, 0xafb00014, 0x8e020008, 0xafa20010, 
+0x8e02000c, 0x3c040001, 0x24843614, 0xafa20014, 
+0x8e060000, 0x8e070004, 0x3c050001, 0xc002a03, 
+0x34a52610, 0x8e020018, 0xafa20010, 0x8e02001c, 
+0x3c040001, 0x24843620, 0xafa20014, 0x8e060010, 
+0x8e070014, 0x3c050001, 0xc002a03, 0x34a52620, 
+0x3c027f00, 0x2221024, 0x3c030800, 0x54430016, 
+0x3c030200, 0x8f8200ac, 0x3042ffff, 0x14400012, 
+0x3c030200, 0x3c040001, 0x2484362c, 0x3c050001, 
+0x34a5f030, 0x3021, 0x3821, 0x36420002, 
+0xaf82011c, 0x36220001, 0xaf8200a0, 0xaf900124, 
+0xaf92011c, 0xafa00010, 0xc002a03, 0xafa00014, 
+0x10000024, 0x0, 0x2c31024, 0x1040000d, 
 0x2231024, 0x1040000b, 0x36420002, 0xaf82011c, 
-0x36220001, 0xaf8200b0, 0xaf900104, 0xaf92011c, 
-0x8f420320, 0x24420001, 0xaf420320, 0x10000015, 
-0x8f420320, 0x3c040001, 0x24843510, 0x24020290, 
+0x36220001, 0xaf8200a0, 0xaf900124, 0xaf92011c, 
+0x8f42031c, 0x24420001, 0xaf42031c, 0x10000015, 
+0x8f42031c, 0x3c040001, 0x248435d8, 0x240202db, 
 0xafa20010, 0xafa00014, 0x8f860144, 0x3c070001, 
-0x24e73518, 0xc0029d3, 0x3405dead, 0x8f82011c, 
+0x24e735e0, 0xc002a03, 0x3405dead, 0x8f82011c, 
 0x34420002, 0xaf82011c, 0x8f820220, 0x34420004, 
 0xaf820220, 0x8f820140, 0x3c030001, 0x431025, 
 0xaf820140, 0x8fbf0024, 0x8fb20020, 0x8fb1001c, 
-0x8fb00018, 0x3e00008, 0x27bd0028, 0x27bdffd8, 
-0x3c040001, 0x24843540, 0x3c050001, 0xafbf0024, 
-0xafb20020, 0xafb1001c, 0xafb00018, 0x8f900124, 
-0x8f9100a0, 0x8f92011c, 0x34a52600, 0x8f820120, 
-0x2403021, 0x2203821, 0xafa20010, 0xc0029d3, 
-0xafb00014, 0x8e020008, 0xafa20010, 0x8e02000c, 
-0x3c040001, 0x2484354c, 0xafa20014, 0x8e060000, 
-0x8e070004, 0x3c050001, 0xc0029d3, 0x34a52610, 
-0x8e020018, 0xafa20010, 0x8e02001c, 0x3c040001, 
-0x24843558, 0xafa20014, 0x8e060010, 0x8e070014, 
-0x3c050001, 0xc0029d3, 0x34a52620, 0x3c030200, 
-0x2c31024, 0x1040000d, 0x2231024, 0x1040000b, 
-0x36420002, 0xaf82011c, 0x36220001, 0xaf8200a0, 
-0xaf900124, 0xaf92011c, 0x8f42031c, 0x24420001, 
-0xaf42031c, 0x10000015, 0x8f42031c, 0x3c040001, 
-0x24843510, 0x240202bc, 0xafa20010, 0xafa00014, 
-0x8f860144, 0x3c070001, 0x24e73518, 0xc0029d3, 
-0x3405dead, 0x8f82011c, 0x34420002, 0xaf82011c, 
-0x8f820220, 0x34420004, 0xaf820220, 0x8f820140, 
-0x3c030001, 0x431025, 0xaf820140, 0x8fbf0024, 
-0x8fb20020, 0x8fb1001c, 0x8fb00018, 0x3e00008, 
-0x27bd0028, 0x6021, 0x5021, 0x3021, 
-0x2821, 0x6821, 0x4821, 0x7821, 
-0x7021, 0x8f880124, 0x8f870104, 0x1580002e, 
-0x8f8b011c, 0x11a00014, 0x31620800, 0x8f820120, 
-0x10460029, 0x0, 0x3c040001, 0x8c843e20, 
-0x8cc20000, 0x8cc30004, 0xac820000, 0xac830004, 
-0x8cc20008, 0xac820008, 0x94c2000e, 0xa482000e, 
-0x8cc20010, 0x240c0001, 0xac820010, 0x8cc20014, 
-0x10000012, 0x24c60020, 0x10400017, 0x0, 
-0x3c040001, 0x8c843e20, 0x8d020000, 0x8d030004, 
-0xac820000, 0xac830004, 0x8d020008, 0xac820008, 
-0x9502000e, 0xa482000e, 0x8d020010, 0x25060020, 
-0xac820010, 0x8d020014, 0x240c0001, 0xc01821, 
-0xac820014, 0x27624fe0, 0x43102b, 0x54400001, 
-0x27634800, 0x603021, 0x1540002f, 0x31620100, 
-0x11200014, 0x31628000, 0x8f820100, 0x1045002a, 
-0x31620100, 0x3c040001, 0x8c843e1c, 0x8ca20000, 
-0x8ca30004, 0xac820000, 0xac830004, 0x8ca20008, 
-0xac820008, 0x94a2000e, 0xa482000e, 0x8ca20010, 
-0x240a0001, 0xac820010, 0x8ca20014, 0x10000012, 
-0x24a50020, 0x10400018, 0x31620100, 0x3c040001, 
-0x8c843e1c, 0x8ce20000, 0x8ce30004, 0xac820000, 
-0xac830004, 0x8ce20008, 0xac820008, 0x94e2000e, 
-0xa482000e, 0x8ce20010, 0x24e50020, 0xac820010, 
-0x8ce20014, 0x240a0001, 0xa01821, 0xac820014, 
-0x276247e0, 0x43102b, 0x54400001, 0x27634000, 
-0x602821, 0x31620100, 0x5440001d, 0x31621000, 
-0x11a00009, 0x31a20800, 0x10400004, 0x25020020, 
-0x8f8200a8, 0xa5e20000, 0x25020020, 0xaf820124, 
-0x8f880124, 0x6821, 0x11800011, 0x31621000, 
-0x3c040001, 0x8c843e20, 0x8c820000, 0x8c830004, 
-0xaf820080, 0xaf830084, 0x8c820008, 0xaf8200a4, 
-0x9482000e, 0xaf8200ac, 0x8c820010, 0x6021, 
-0xaf8200a0, 0x8c8d0010, 0x8c8f0014, 0x31621000, 
-0x1440ff82, 0x0, 0x1120000f, 0x31220800, 
-0x10400004, 0x3c020002, 0x8f8200b8, 0xa5c20000, 
-0x3c020002, 0x1221024, 0x10400004, 0x24e20020, 
-0x8f8200b4, 0xaf8200d4, 0x24e20020, 0xaf820104, 
-0x8f870104, 0x4821, 0x1140ff70, 0x0, 
-0x3c040001, 0x8c843e1c, 0x8c820000, 0x8c830004, 
-0xaf820090, 0xaf830094, 0x8c820008, 0xaf8200b4, 
-0x9482000e, 0xaf82009c, 0x8c820010, 0x5021, 
-0xaf8200b0, 0x8c890010, 0x1000ff60, 0x8c8e0014, 
-0x3e00008, 0x0, 0x6021, 0x5821, 
-0x3021, 0x2821, 0x6821, 0x5021, 
-0x7821, 0x7021, 0x8f880124, 0x8f870104, 
-0x3c180100, 0x1580002e, 0x8f89011c, 0x11a00014, 
-0x31220800, 0x8f820120, 0x10460029, 0x0, 
-0x3c040001, 0x8c843e20, 0x8cc20000, 0x8cc30004, 
+0x8fb00018, 0x3e00008, 0x27bd0028, 0x6021, 
+0x5021, 0x3021, 0x2821, 0x6821, 
+0x4821, 0x7821, 0x7021, 0x8f880124, 
+0x8f870104, 0x1580002e, 0x8f8b011c, 0x11a00014, 
+0x31620800, 0x8f820120, 0x10460029, 0x0, 
+0x3c040001, 0x8c843f30, 0x8cc20000, 0x8cc30004, 
 0xac820000, 0xac830004, 0x8cc20008, 0xac820008, 
 0x94c2000e, 0xa482000e, 0x8cc20010, 0x240c0001, 
 0xac820010, 0x8cc20014, 0x10000012, 0x24c60020, 
-0x10400017, 0x0, 0x3c040001, 0x8c843e20, 
+0x10400017, 0x0, 0x3c040001, 0x8c843f30, 
 0x8d020000, 0x8d030004, 0xac820000, 0xac830004, 
 0x8d020008, 0xac820008, 0x9502000e, 0xa482000e, 
 0x8d020010, 0x25060020, 0xac820010, 0x8d020014, 
 0x240c0001, 0xc01821, 0xac820014, 0x27624fe0, 
 0x43102b, 0x54400001, 0x27634800, 0x603021, 
-0x1560002f, 0x31220100, 0x11400014, 0x31228000, 
-0x8f820100, 0x1045002a, 0x31220100, 0x3c040001, 
-0x8c843e1c, 0x8ca20000, 0x8ca30004, 0xac820000, 
+0x1540002f, 0x31620100, 0x11200014, 0x31628000, 
+0x8f820100, 0x1045002a, 0x31620100, 0x3c040001, 
+0x8c843f2c, 0x8ca20000, 0x8ca30004, 0xac820000, 
 0xac830004, 0x8ca20008, 0xac820008, 0x94a2000e, 
-0xa482000e, 0x8ca20010, 0x240b0001, 0xac820010, 
+0xa482000e, 0x8ca20010, 0x240a0001, 0xac820010, 
 0x8ca20014, 0x10000012, 0x24a50020, 0x10400018, 
-0x31220100, 0x3c040001, 0x8c843e1c, 0x8ce20000, 
+0x31620100, 0x3c040001, 0x8c843f2c, 0x8ce20000, 
 0x8ce30004, 0xac820000, 0xac830004, 0x8ce20008, 
 0xac820008, 0x94e2000e, 0xa482000e, 0x8ce20010, 
-0x24e50020, 0xac820010, 0x8ce20014, 0x240b0001, 
+0x24e50020, 0xac820010, 0x8ce20014, 0x240a0001, 
 0xa01821, 0xac820014, 0x276247e0, 0x43102b, 
-0x54400001, 0x27634000, 0x602821, 0x31220100, 
-0x5440001d, 0x31221000, 0x11a00009, 0x31a20800, 
+0x54400001, 0x27634000, 0x602821, 0x31620100, 
+0x5440001d, 0x31621000, 0x11a00009, 0x31a20800, 
 0x10400004, 0x25020020, 0x8f8200a8, 0xa5e20000, 
 0x25020020, 0xaf820124, 0x8f880124, 0x6821, 
-0x11800011, 0x31221000, 0x3c040001, 0x8c843e20, 
+0x11800011, 0x31621000, 0x3c040001, 0x8c843f30, 
 0x8c820000, 0x8c830004, 0xaf820080, 0xaf830084, 
 0x8c820008, 0xaf8200a4, 0x9482000e, 0xaf8200ac, 
 0x8c820010, 0x6021, 0xaf8200a0, 0x8c8d0010, 
-0x8c8f0014, 0x31221000, 0x14400022, 0x0, 
-0x1140000f, 0x31420800, 0x10400004, 0x3c020002, 
-0x8f8200b8, 0xa5c20000, 0x3c020002, 0x1421024, 
+0x8c8f0014, 0x31621000, 0x1440ff82, 0x0, 
+0x1120000f, 0x31220800, 0x10400004, 0x3c020002, 
+0x8f8200b8, 0xa5c20000, 0x3c020002, 0x1221024, 
 0x10400004, 0x24e20020, 0x8f8200b4, 0xaf8200d4, 
-0x24e20020, 0xaf820104, 0x8f870104, 0x5021, 
-0x11600010, 0x0, 0x3c040001, 0x8c843e1c, 
+0x24e20020, 0xaf820104, 0x8f870104, 0x4821, 
+0x1140ff70, 0x0, 0x3c040001, 0x8c843f2c, 
 0x8c820000, 0x8c830004, 0xaf820090, 0xaf830094, 
 0x8c820008, 0xaf8200b4, 0x9482000e, 0xaf82009c, 
-0x8c820010, 0x5821, 0xaf8200b0, 0x8c8a0010, 
-0x8c8e0014, 0x8f820070, 0x3c031000, 0x431024, 
-0x1040ff5c, 0x0, 0x8f820054, 0x24420005, 
-0xaf820078, 0x8c040234, 0x10800016, 0x1821, 
-0x3c020001, 0x571021, 0x8c4240e8, 0x24420005, 
-0x3c010001, 0x370821, 0xac2240e8, 0x3c020001, 
-0x571021, 0x8c4240e8, 0x44102b, 0x14400009, 
-0x24020001, 0x3c030080, 0x3c010001, 0x370821, 
-0xac2040e8, 0x3c010001, 0x370821, 0x1000000c, 
-0xa02240f0, 0x3c020001, 0x571021, 0x904240f0, 
-0x14400006, 0x3c020080, 0x3c020001, 0x571021, 
-0x904240f1, 0x10400002, 0x3c020080, 0x621825, 
-0x8c040230, 0x10800013, 0x0, 0x3c020001, 
-0x571021, 0x8c4240ec, 0x24420005, 0x3c010001, 
-0x370821, 0xac2240ec, 0x3c020001, 0x571021, 
-0x8c4240ec, 0x44102b, 0x14400006, 0x0, 
-0x3c010001, 0x370821, 0xac2040ec, 0x10000006, 
-0x781825, 0x3c020001, 0x571021, 0x904240f2, 
-0x54400001, 0x781825, 0x1060ff1a, 0x0, 
-0x8f420000, 0x10400007, 0x0, 0xaf80004c, 
-0x8f82004c, 0x1040fffd, 0x0, 0x10000005, 
-0x0, 0xaf800048, 0x8f820048, 0x1040fffd, 
-0x0, 0x8f820060, 0x431025, 0xaf820060, 
-0x8f420000, 0x10400003, 0x0, 0x1000ff05, 
-0xaf80004c, 0x1000ff03, 0xaf800048, 0x3e00008, 
-0x0, 0x0, 0x0, 0x3c020001, 
-0x8c423ca8, 0x27bdffe8, 0xafbf0014, 0x14400012, 
-0xafb00010, 0x3c100001, 0x26103ec0, 0x2002021, 
-0xc002a40, 0x24052000, 0x26021fe0, 0x3c010001, 
-0xac223e28, 0x3c010001, 0xac223e24, 0xac020250, 
+0x8c820010, 0x5021, 0xaf8200b0, 0x8c890010, 
+0x1000ff60, 0x8c8e0014, 0x3e00008, 0x0, 
+0x6021, 0x5821, 0x3021, 0x2821, 
+0x6821, 0x5021, 0x7821, 0x7021, 
+0x8f880124, 0x8f870104, 0x3c180100, 0x1580002e, 
+0x8f89011c, 0x11a00014, 0x31220800, 0x8f820120, 
+0x10460029, 0x0, 0x3c040001, 0x8c843f30, 
+0x8cc20000, 0x8cc30004, 0xac820000, 0xac830004, 
+0x8cc20008, 0xac820008, 0x94c2000e, 0xa482000e, 
+0x8cc20010, 0x240c0001, 0xac820010, 0x8cc20014, 
+0x10000012, 0x24c60020, 0x10400017, 0x0, 
+0x3c040001, 0x8c843f30, 0x8d020000, 0x8d030004, 
+0xac820000, 0xac830004, 0x8d020008, 0xac820008, 
+0x9502000e, 0xa482000e, 0x8d020010, 0x25060020, 
+0xac820010, 0x8d020014, 0x240c0001, 0xc01821, 
+0xac820014, 0x27624fe0, 0x43102b, 0x54400001, 
+0x27634800, 0x603021, 0x1560002f, 0x31220100, 
+0x11400014, 0x31228000, 0x8f820100, 0x1045002a, 
+0x31220100, 0x3c040001, 0x8c843f2c, 0x8ca20000, 
+0x8ca30004, 0xac820000, 0xac830004, 0x8ca20008, 
+0xac820008, 0x94a2000e, 0xa482000e, 0x8ca20010, 
+0x240b0001, 0xac820010, 0x8ca20014, 0x10000012, 
+0x24a50020, 0x10400018, 0x31220100, 0x3c040001, 
+0x8c843f2c, 0x8ce20000, 0x8ce30004, 0xac820000, 
+0xac830004, 0x8ce20008, 0xac820008, 0x94e2000e, 
+0xa482000e, 0x8ce20010, 0x24e50020, 0xac820010, 
+0x8ce20014, 0x240b0001, 0xa01821, 0xac820014, 
+0x276247e0, 0x43102b, 0x54400001, 0x27634000, 
+0x602821, 0x31220100, 0x5440001d, 0x31221000, 
+0x11a00009, 0x31a20800, 0x10400004, 0x25020020, 
+0x8f8200a8, 0xa5e20000, 0x25020020, 0xaf820124, 
+0x8f880124, 0x6821, 0x11800011, 0x31221000, 
+0x3c040001, 0x8c843f30, 0x8c820000, 0x8c830004, 
+0xaf820080, 0xaf830084, 0x8c820008, 0xaf8200a4, 
+0x9482000e, 0xaf8200ac, 0x8c820010, 0x6021, 
+0xaf8200a0, 0x8c8d0010, 0x8c8f0014, 0x31221000, 
+0x14400022, 0x0, 0x1140000f, 0x31420800, 
+0x10400004, 0x3c020002, 0x8f8200b8, 0xa5c20000, 
+0x3c020002, 0x1421024, 0x10400004, 0x24e20020, 
+0x8f8200b4, 0xaf8200d4, 0x24e20020, 0xaf820104, 
+0x8f870104, 0x5021, 0x11600010, 0x0, 
+0x3c040001, 0x8c843f2c, 0x8c820000, 0x8c830004, 
+0xaf820090, 0xaf830094, 0x8c820008, 0xaf8200b4, 
+0x9482000e, 0xaf82009c, 0x8c820010, 0x5821, 
+0xaf8200b0, 0x8c8a0010, 0x8c8e0014, 0x8f820070, 
+0x3c031000, 0x431024, 0x1040ff5c, 0x0, 
+0x8f820054, 0x24420005, 0xaf820078, 0x8c040234, 
+0x10800016, 0x1821, 0x3c020001, 0x571021, 
+0x8c4240e8, 0x24420005, 0x3c010001, 0x370821, 
+0xac2240e8, 0x3c020001, 0x571021, 0x8c4240e8, 
+0x44102b, 0x14400009, 0x24020001, 0x3c030080, 
+0x3c010001, 0x370821, 0xac2040e8, 0x3c010001, 
+0x370821, 0x1000000c, 0xa02240f0, 0x3c020001, 
+0x571021, 0x904240f0, 0x14400006, 0x3c020080, 
+0x3c020001, 0x571021, 0x904240f1, 0x10400002, 
+0x3c020080, 0x621825, 0x8c040230, 0x10800013, 
+0x0, 0x3c020001, 0x571021, 0x8c4240ec, 
+0x24420005, 0x3c010001, 0x370821, 0xac2240ec, 
+0x3c020001, 0x571021, 0x8c4240ec, 0x44102b, 
+0x14400006, 0x0, 0x3c010001, 0x370821, 
+0xac2040ec, 0x10000006, 0x781825, 0x3c020001, 
+0x571021, 0x904240f2, 0x54400001, 0x781825, 
+0x1060ff1a, 0x0, 0x8f420000, 0x10400007, 
+0x0, 0xaf80004c, 0x8f82004c, 0x1040fffd, 
+0x0, 0x10000005, 0x0, 0xaf800048, 
+0x8f820048, 0x1040fffd, 0x0, 0x8f820060, 
+0x431025, 0xaf820060, 0x8f420000, 0x10400003, 
+0x0, 0x1000ff05, 0xaf80004c, 0x1000ff03, 
+0xaf800048, 0x3e00008, 0x0, 0x3c020001, 
+0x8c423db8, 0x27bdffe8, 0xafbf0014, 0x14400012, 
+0xafb00010, 0x3c100001, 0x26103fd0, 0x2002021, 
+0xc002a70, 0x24052000, 0x26021fe0, 0x3c010001, 
+0xac223f38, 0x3c010001, 0xac223f34, 0xac020250, 
 0x24022000, 0xac100254, 0xac020258, 0x24020001, 
-0x3c010001, 0xac223ca8, 0x8fbf0014, 0x8fb00010, 
-0x3e00008, 0x27bd0018, 0x3c090001, 0x8d293e28, 
+0x3c010001, 0xac223db8, 0x8fbf0014, 0x8fb00010, 
+0x3e00008, 0x27bd0018, 0x3c090001, 0x8d293f38, 
 0x8c820000, 0x8fa30010, 0x8fa80014, 0xad220000, 
 0x8c820004, 0xad250008, 0xad220004, 0x8f820054, 
 0xad260010, 0xad270014, 0xad230018, 0xad28001c, 
-0xad22000c, 0x2529ffe0, 0x3c020001, 0x24423ec0, 
+0xad22000c, 0x2529ffe0, 0x3c020001, 0x24423fd0, 
 0x122102b, 0x10400003, 0x0, 0x3c090001, 
-0x8d293e24, 0x3c020001, 0x8c423c90, 0xad220000, 
-0x3c020001, 0x8c423c90, 0x3c010001, 0xac293e28, 
+0x8d293f34, 0x3c020001, 0x8c423da0, 0xad220000, 
+0x3c020001, 0x8c423da0, 0x3c010001, 0xac293f38, 
 0xad220004, 0xac090250, 0x3e00008, 0x0, 
-0x27bdffd0, 0xafb00010, 0x3c100001, 0x8e103e28, 
-0x3c020001, 0x8c423c90, 0xafb10014, 0x808821, 
+0x27bdffd0, 0xafb00010, 0x3c100001, 0x8e103f38, 
+0x3c020001, 0x8c423da0, 0xafb10014, 0x808821, 
 0xafbe0024, 0x8fbe0040, 0x8fa40048, 0xafb20018, 
 0xa09021, 0xafbf0028, 0xafb50020, 0xafb3001c, 
-0xae020000, 0x3c020001, 0x8c423c90, 0xc09821, 
+0xae020000, 0x3c020001, 0x8c423da0, 0xc09821, 
 0xe0a821, 0x10800006, 0xae020004, 0x26050008, 
-0xc002a4b, 0x24060018, 0x10000005, 0x2610ffe0, 
-0x26040008, 0xc002a40, 0x24050018, 0x2610ffe0, 
-0x3c030001, 0x24633ec0, 0x203102b, 0x10400003, 
-0x0, 0x3c100001, 0x8e103e24, 0x8e220000, 
+0xc002a7b, 0x24060018, 0x10000005, 0x2610ffe0, 
+0x26040008, 0xc002a70, 0x24050018, 0x2610ffe0, 
+0x3c030001, 0x24633fd0, 0x203102b, 0x10400003, 
+0x0, 0x3c100001, 0x8e103f34, 0x8e220000, 
 0xae020000, 0x8e220004, 0xae120008, 0xae020004, 
 0x8f820054, 0xae130010, 0xae150014, 0xae1e0018, 
 0x8fa80044, 0xae08001c, 0xae02000c, 0x2610ffe0, 
 0x203102b, 0x10400003, 0x0, 0x3c100001, 
-0x8e103e24, 0x3c020001, 0x8c423c90, 0xae020000, 
-0x3c020001, 0x8c423c90, 0x3c010001, 0xac303e28, 
+0x8e103f34, 0x3c020001, 0x8c423da0, 0xae020000, 
+0x3c020001, 0x8c423da0, 0x3c010001, 0xac303f38, 
 0xae020004, 0xac100250, 0x8fbf0028, 0x8fbe0024, 
 0x8fb50020, 0x8fb3001c, 0x8fb20018, 0x8fb10014, 
 0x8fb00010, 0x3e00008, 0x27bd0030, 0x851821, 
@@ -6186,7 +6199,7 @@
 0x27bdffc0, 0x32c20020, 0xafbf0038, 0xafb30034, 
 0xafb20030, 0xafb1002c, 0x10400004, 0xafb00028, 
 0x8f530028, 0x10000002, 0x0, 0x8f530020, 
-0x8f420030, 0x105300e4, 0x21100, 0x8f43001c, 
+0x8f420030, 0x105300eb, 0x21100, 0x8f43001c, 
 0x628021, 0x8e040000, 0x8e050004, 0x96120008, 
 0x8f420090, 0x9611000a, 0x3246ffff, 0x46102a, 
 0x10400017, 0x0, 0x8f8200d8, 0x8f430098, 
@@ -6194,9 +6207,9 @@
 0x2842fff9, 0x10400005, 0x0, 0x8f420090, 
 0x8f430138, 0x431021, 0xaf420090, 0x8f420090, 
 0x46102a, 0x10400006, 0x0, 0x8f420338, 
-0x24420001, 0xaf420338, 0x100000da, 0x8f420338, 
+0x24420001, 0xaf420338, 0x100000e1, 0x8f420338, 
 0x8f8200fc, 0x14400006, 0x32c20008, 0x8f420334, 
-0x24420001, 0xaf420334, 0x100000d2, 0x8f420334, 
+0x24420001, 0xaf420334, 0x100000d9, 0x8f420334, 
 0x5040000c, 0xaf4000ac, 0x934205b3, 0x10400008, 
 0x32220200, 0x10400006, 0x3c034000, 0x9602000e, 
 0xaf4300ac, 0x21400, 0x10000002, 0xaf4200b0, 
@@ -6205,7 +6218,7 @@
 0x24020004, 0xafa20010, 0x8f420030, 0xafa20014, 
 0x8f420010, 0x3c030002, 0x431025, 0xafa20018, 
 0x8f460098, 0x8f420108, 0x40f809, 0x0, 
-0x104000b0, 0x0, 0x8f42009c, 0x8f430094, 
+0x104000b7, 0x0, 0x8f42009c, 0x8f430094, 
 0x2421021, 0xaf42009c, 0xae03000c, 0x8f4200ac, 
 0x10400008, 0x3c034000, 0x8f420094, 0x431025, 
 0xafa20020, 0x8f42009c, 0x8f4300b0, 0x10000004, 
@@ -6232,123 +6245,124 @@
 0x8f420090, 0x8f430094, 0x862024, 0x441023, 
 0x65182b, 0x14600005, 0xaf420090, 0x8f420094, 
 0x8f430138, 0x431023, 0xaf420094, 0x8f420094, 
-0x10000023, 0xaf40009c, 0x3247ffff, 0x10e00021, 
-0x0, 0x14400002, 0x24020010, 0x24020002, 
+0x10000023, 0xaf40009c, 0x3247ffff, 0x50e00022, 
+0x32c20020, 0x14400002, 0x24020010, 0x24020002, 
 0xafa20010, 0x8f420030, 0xafa20014, 0x8f420010, 
 0xafa20018, 0x8f460098, 0x8f420108, 0x40f809, 
-0x0, 0x10400033, 0x3245ffff, 0x8f420098, 
+0x0, 0x1040003a, 0x3245ffff, 0x8f420098, 
 0x8f430090, 0x8f460130, 0x451021, 0xaf420098, 
 0x8f42009c, 0x8f440098, 0xa34005b3, 0x651823, 
 0xaf430090, 0x451021, 0x86202b, 0x14800005, 
 0xaf42009c, 0x8f420098, 0x8f430138, 0x431023, 
-0xaf420098, 0x8f420030, 0x8f430040, 0x24420001, 
-0x2463ffff, 0x431024, 0xaf420030, 0x8f420030, 
-0x14530018, 0x0, 0x8f420000, 0x10400007, 
-0x0, 0xaf80004c, 0x8f82004c, 0x1040fffd, 
-0x0, 0x10000005, 0x0, 0xaf800048, 
-0x8f820048, 0x1040fffd, 0x0, 0x8f820060, 
-0x2403fff7, 0x431024, 0xaf820060, 0x8f420000, 
-0x10400003, 0x0, 0x10000002, 0xaf80004c, 
-0xaf800048, 0x8fbf0038, 0x8fb30034, 0x8fb20030, 
-0x8fb1002c, 0x8fb00028, 0x3e00008, 0x27bd0040, 
-0x3e00008, 0x0, 0x27bdffd0, 0x32c20020, 
-0xafbf002c, 0xafb20028, 0xafb10024, 0x10400004, 
-0xafb00020, 0x8f520028, 0x10000002, 0x0, 
-0x8f520020, 0x8f420030, 0x105200b5, 0x21100, 
-0x8f43001c, 0x628021, 0x8e040000, 0x8e050004, 
-0x96110008, 0x8f420090, 0x9607000a, 0x3226ffff, 
-0x46102a, 0x10400017, 0x0, 0x8f8200d8, 
-0x8f430098, 0x431023, 0x2442ff80, 0xaf420090, 
-0x8f420090, 0x2842ff81, 0x10400005, 0x0, 
-0x8f420090, 0x8f430138, 0x431021, 0xaf420090, 
-0x8f420090, 0x46102a, 0x10400006, 0x0, 
-0x8f420338, 0x24420001, 0xaf420338, 0x100000ab, 
-0x8f420338, 0x8f8600fc, 0x10c0000c, 0x0, 
-0x8f8200f4, 0x2403fff8, 0x431024, 0x461023, 
-0x218c3, 0x50600001, 0x24030100, 0x8f42008c, 
-0x43102b, 0x14400006, 0x712c2, 0x8f420334, 
-0x24420001, 0xaf420334, 0x10000098, 0x8f420334, 
-0x934305b3, 0x1060000f, 0x30460001, 0x8f420010, 
-0x34480400, 0x32c20008, 0x10400008, 0x30e20200, 
-0x10400006, 0x3c034000, 0x9602000e, 0xaf4300ac, 
-0x21400, 0x10000004, 0xaf4200b0, 0x10000002, 
-0xaf4000ac, 0x8f480010, 0x30e20004, 0x10400045, 
-0x3227ffff, 0x8f4900ac, 0x11200005, 0x30c200ff, 
-0x14400006, 0x24020040, 0x10000004, 0x24020008, 
-0x14400002, 0x24020020, 0x24020004, 0xafa20010, 
-0x8f430030, 0x11200004, 0xafa30014, 0x8f4200b0, 
-0x621025, 0xafa20014, 0x3c020002, 0x1021025, 
-0xafa20018, 0x8f460098, 0x8f420108, 0x40f809, 
-0x0, 0x10400069, 0x3224ffff, 0x8f42008c, 
-0x8f430094, 0x24420001, 0xaf42008c, 0x24020001, 
-0xae03000c, 0xa34205b3, 0x8f420098, 0x2406fff8, 
-0x8f450130, 0x441021, 0x24420007, 0x461024, 
-0x24840007, 0xaf420094, 0x8f420090, 0x8f430094, 
-0x862024, 0x441023, 0x65182b, 0x14600005, 
-0xaf420090, 0x8f420094, 0x8f430138, 0x431023, 
-0xaf420094, 0x8f430094, 0x8f420134, 0x43102b, 
-0x10400009, 0x0, 0x8f430130, 0x8f440094, 
-0x8f420090, 0x8f45012c, 0x641823, 0x431023, 
-0xaf420090, 0xaf450094, 0x8f420094, 0x1000001f, 
-0xaf420098, 0x10e0001d, 0x30c200ff, 0x14400002, 
-0x24020010, 0x24020002, 0xafa20010, 0x8f420030, 
-0xafa80018, 0xafa20014, 0x8f460098, 0x8f420108, 
-0x40f809, 0x0, 0x10400030, 0x3225ffff, 
-0x8f420098, 0x8f440130, 0x451021, 0xaf420098, 
-0x8f420090, 0x8f430098, 0xa34005b3, 0x451023, 
-0x64182b, 0x14600005, 0xaf420090, 0x8f420098, 
-0x8f430138, 0x431023, 0xaf420098, 0x8f420030, 
-0x8f430040, 0x24420001, 0x2463ffff, 0x431024, 
-0xaf420030, 0x8f420030, 0x14520018, 0x0, 
-0x8f420000, 0x10400007, 0x0, 0xaf80004c, 
-0x8f82004c, 0x1040fffd, 0x0, 0x10000005, 
-0x0, 0xaf800048, 0x8f820048, 0x1040fffd, 
-0x0, 0x8f820060, 0x2403fff7, 0x431024, 
-0xaf820060, 0x8f420000, 0x10400003, 0x0, 
-0x10000002, 0xaf80004c, 0xaf800048, 0x8fbf002c, 
-0x8fb20028, 0x8fb10024, 0x8fb00020, 0x3e00008, 
-0x27bd0030, 0x3e00008, 0x0, 0x27bdffd8, 
-0x3c020001, 0x34422ec0, 0xafbf0020, 0x8f4300f0, 
-0x8f840108, 0x2e21021, 0x54620004, 0x24620008, 
-0x3c020001, 0x34422cc0, 0x2e21021, 0x401821, 
-0xaf4300f0, 0xac600000, 0x8f4200ec, 0x8c660004, 
-0x14620004, 0x3c020001, 0x24820020, 0x1000000f, 
-0xaf820108, 0x8f4300f0, 0x34422ec0, 0x2e21021, 
-0x54620004, 0x24620008, 0x3c020001, 0x34422cc0, 
-0x2e21021, 0x401821, 0x8c620004, 0x21140, 
-0x821021, 0xaf820108, 0xac600000, 0x8c850018, 
-0x30a20036, 0x1040006c, 0x30a20001, 0x8c82001c, 
-0x8f430040, 0x8f440034, 0x24420001, 0x2463ffff, 
-0x431024, 0x862021, 0xaf42002c, 0x30a20030, 
-0x14400006, 0xaf440034, 0x8f420034, 0x8c03023c, 
-0x43102b, 0x144000c9, 0x0, 0x32c20010, 
-0x10400028, 0x24070008, 0x8f440160, 0x8f450164, 
-0x8f43002c, 0x8f48000c, 0x8f860120, 0x24020080, 
-0xafa20010, 0xafa30014, 0xafa80018, 0x8f42010c, 
-0x40f809, 0x24c6001c, 0x14400011, 0x24020001, 
-0x3c010001, 0x370821, 0xa02240f1, 0x8f820124, 
-0xafa20010, 0x8f820128, 0x3c040001, 0x24843800, 
-0xafa20014, 0x8f46002c, 0x8f870120, 0x3c050009, 
-0xc0029d3, 0x34a51100, 0x10000036, 0x0, 
-0x8f4202f0, 0x8f43002c, 0x24420001, 0xaf4202f0, 
-0x8f4202f0, 0x24020001, 0xa34205b2, 0x10000026, 
-0xaf430038, 0x8f440160, 0x8f450164, 0x8f43002c, 
-0x8f48000c, 0x8f860120, 0x24020020, 0xafa20010, 
+0xaf420098, 0x32c20020, 0x10400005, 0x0, 
+0x8f420348, 0x2442ffff, 0xaf420348, 0x8f420348, 
+0x8f420030, 0x8f430040, 0x24420001, 0x2463ffff, 
+0x431024, 0xaf420030, 0x8f420030, 0x14530018, 
+0x0, 0x8f420000, 0x10400007, 0x0, 
+0xaf80004c, 0x8f82004c, 0x1040fffd, 0x0, 
+0x10000005, 0x0, 0xaf800048, 0x8f820048, 
+0x1040fffd, 0x0, 0x8f820060, 0x2403fff7, 
+0x431024, 0xaf820060, 0x8f420000, 0x10400003, 
+0x0, 0x10000002, 0xaf80004c, 0xaf800048, 
+0x8fbf0038, 0x8fb30034, 0x8fb20030, 0x8fb1002c, 
+0x8fb00028, 0x3e00008, 0x27bd0040, 0x3e00008, 
+0x0, 0x27bdffd0, 0x32c20020, 0xafbf002c, 
+0xafb20028, 0xafb10024, 0x10400004, 0xafb00020, 
+0x8f520028, 0x10000002, 0x0, 0x8f520020, 
+0x8f420030, 0x105200b5, 0x21100, 0x8f43001c, 
+0x628021, 0x8e040000, 0x8e050004, 0x96110008, 
+0x8f420090, 0x9607000a, 0x3226ffff, 0x46102a, 
+0x10400017, 0x0, 0x8f8200d8, 0x8f430098, 
+0x431023, 0x2442ff80, 0xaf420090, 0x8f420090, 
+0x2842ff81, 0x10400005, 0x0, 0x8f420090, 
+0x8f430138, 0x431021, 0xaf420090, 0x8f420090, 
+0x46102a, 0x10400006, 0x0, 0x8f420338, 
+0x24420001, 0xaf420338, 0x100000ab, 0x8f420338, 
+0x8f8600fc, 0x10c0000c, 0x0, 0x8f8200f4, 
+0x2403fff8, 0x431024, 0x461023, 0x218c3, 
+0x50600001, 0x24030100, 0x8f42008c, 0x43102b, 
+0x14400006, 0x712c2, 0x8f420334, 0x24420001, 
+0xaf420334, 0x10000098, 0x8f420334, 0x934305b3, 
+0x1060000f, 0x30460001, 0x8f420010, 0x34480400, 
+0x32c20008, 0x10400008, 0x30e20200, 0x10400006, 
+0x3c034000, 0x9602000e, 0xaf4300ac, 0x21400, 
+0x10000004, 0xaf4200b0, 0x10000002, 0xaf4000ac, 
+0x8f480010, 0x30e20004, 0x10400045, 0x3227ffff, 
+0x8f4900ac, 0x11200005, 0x30c200ff, 0x14400006, 
+0x24020040, 0x10000004, 0x24020008, 0x14400002, 
+0x24020020, 0x24020004, 0xafa20010, 0x8f430030, 
+0x11200004, 0xafa30014, 0x8f4200b0, 0x621025, 
+0xafa20014, 0x3c020002, 0x1021025, 0xafa20018, 
+0x8f460098, 0x8f420108, 0x40f809, 0x0, 
+0x10400069, 0x3224ffff, 0x8f42008c, 0x8f430094, 
+0x24420001, 0xaf42008c, 0x24020001, 0xae03000c, 
+0xa34205b3, 0x8f420098, 0x2406fff8, 0x8f450130, 
+0x441021, 0x24420007, 0x461024, 0x24840007, 
+0xaf420094, 0x8f420090, 0x8f430094, 0x862024, 
+0x441023, 0x65182b, 0x14600005, 0xaf420090, 
+0x8f420094, 0x8f430138, 0x431023, 0xaf420094, 
+0x8f430094, 0x8f420134, 0x43102b, 0x10400009, 
+0x0, 0x8f430130, 0x8f440094, 0x8f420090, 
+0x8f45012c, 0x641823, 0x431023, 0xaf420090, 
+0xaf450094, 0x8f420094, 0x1000001f, 0xaf420098, 
+0x10e0001d, 0x30c200ff, 0x14400002, 0x24020010, 
+0x24020002, 0xafa20010, 0x8f420030, 0xafa80018, 
+0xafa20014, 0x8f460098, 0x8f420108, 0x40f809, 
+0x0, 0x10400030, 0x3225ffff, 0x8f420098, 
+0x8f440130, 0x451021, 0xaf420098, 0x8f420090, 
+0x8f430098, 0xa34005b3, 0x451023, 0x64182b, 
+0x14600005, 0xaf420090, 0x8f420098, 0x8f430138, 
+0x431023, 0xaf420098, 0x8f420030, 0x8f430040, 
+0x24420001, 0x2463ffff, 0x431024, 0xaf420030, 
+0x8f420030, 0x14520018, 0x0, 0x8f420000, 
+0x10400007, 0x0, 0xaf80004c, 0x8f82004c, 
+0x1040fffd, 0x0, 0x10000005, 0x0, 
+0xaf800048, 0x8f820048, 0x1040fffd, 0x0, 
+0x8f820060, 0x2403fff7, 0x431024, 0xaf820060, 
+0x8f420000, 0x10400003, 0x0, 0x10000002, 
+0xaf80004c, 0xaf800048, 0x8fbf002c, 0x8fb20028, 
+0x8fb10024, 0x8fb00020, 0x3e00008, 0x27bd0030, 
+0x3e00008, 0x0, 0x27bdffd8, 0x3c020001, 
+0x34422ec0, 0xafbf0020, 0x8f4300f0, 0x8f840108, 
+0x2e21021, 0x54620004, 0x24620008, 0x3c020001, 
+0x34422cc0, 0x2e21021, 0x401821, 0xaf4300f0, 
+0xac600000, 0x8f4200ec, 0x8c660004, 0x14620004, 
+0x3c020001, 0x24820020, 0x1000000f, 0xaf820108, 
+0x8f4300f0, 0x34422ec0, 0x2e21021, 0x54620004, 
+0x24620008, 0x3c020001, 0x34422cc0, 0x2e21021, 
+0x401821, 0x8c620004, 0x21140, 0x821021, 
+0xaf820108, 0xac600000, 0x8c850018, 0x30a20036, 
+0x1040006c, 0x30a20001, 0x8c82001c, 0x8f430040, 
+0x8f440034, 0x24420001, 0x2463ffff, 0x431024, 
+0x862021, 0xaf42002c, 0x30a20030, 0x14400006, 
+0xaf440034, 0x8f420034, 0x8c03023c, 0x43102b, 
+0x144000c6, 0x0, 0x32c20010, 0x10400028, 
+0x24070008, 0x8f440160, 0x8f450164, 0x8f43002c, 
+0x8f48000c, 0x8f860120, 0x24020080, 0xafa20010, 
 0xafa30014, 0xafa80018, 0x8f42010c, 0x40f809, 
 0x24c6001c, 0x14400011, 0x24020001, 0x3c010001, 
-0x370821, 0xa02240f0, 0x8f820124, 0xafa20010, 
-0x8f820128, 0x3c040001, 0x248437f4, 0xafa20014, 
-0x8f46002c, 0x8f870120, 0x3c050009, 0xc0029d3, 
-0x34a50900, 0x1000000f, 0x0, 0x8f4202f0, 
-0x24420001, 0xaf4202f0, 0x8f4202f0, 0x8f42002c, 
-0xa34005b2, 0xaf420038, 0x3c010001, 0x370821, 
-0xa02040f1, 0x3c010001, 0x370821, 0xa02040f0, 
-0xaf400034, 0x8f420304, 0x24420001, 0xaf420304, 
-0x1000006e, 0x8f420304, 0x10400025, 0x30a27000, 
-0x8c85001c, 0x8f420028, 0xa22023, 0x4810003, 
-0x0, 0x8f420040, 0x822021, 0x8f420348, 
-0x8f430000, 0x441021, 0xaf420348, 0x8f42035c, 
-0xaf450028, 0x441021, 0x10600007, 0xaf42035c, 
+0x370821, 0xa02240f1, 0x8f820124, 0xafa20010, 
+0x8f820128, 0x3c040001, 0x248438e4, 0xafa20014, 
+0x8f46002c, 0x8f870120, 0x3c050009, 0xc002a03, 
+0x34a51100, 0x10000036, 0x0, 0x8f4202f0, 
+0x8f43002c, 0x24420001, 0xaf4202f0, 0x8f4202f0, 
+0x24020001, 0xa34205b2, 0x10000026, 0xaf430038, 
+0x8f440160, 0x8f450164, 0x8f43002c, 0x8f48000c, 
+0x8f860120, 0x24020020, 0xafa20010, 0xafa30014, 
+0xafa80018, 0x8f42010c, 0x40f809, 0x24c6001c, 
+0x14400011, 0x24020001, 0x3c010001, 0x370821, 
+0xa02240f0, 0x8f820124, 0xafa20010, 0x8f820128, 
+0x3c040001, 0x248438d8, 0xafa20014, 0x8f46002c, 
+0x8f870120, 0x3c050009, 0xc002a03, 0x34a50900, 
+0x1000000f, 0x0, 0x8f4202f0, 0x24420001, 
+0xaf4202f0, 0x8f4202f0, 0x8f42002c, 0xa34005b2, 
+0xaf420038, 0x3c010001, 0x370821, 0xa02040f1, 
+0x3c010001, 0x370821, 0xa02040f0, 0xaf400034, 
+0x8f420304, 0x24420001, 0xaf420304, 0x1000006b, 
+0x8f420304, 0x10400022, 0x30a27000, 0x8c85001c, 
+0x8f420028, 0xa22023, 0x4810003, 0x0, 
+0x8f420040, 0x822021, 0x8f420348, 0x8f430000, 
+0xaf450028, 0x441021, 0x10600007, 0xaf420348, 
 0xaf80004c, 0x8f82004c, 0x1040fffd, 0x0, 
 0x10000005, 0x0, 0xaf800048, 0x8f820048, 
 0x1040fffd, 0x0, 0x8f820060, 0x34420008, 
@@ -6367,7 +6381,7 @@
 0x441021, 0xaf420358, 0x3c020800, 0x2c21024, 
 0x5040001a, 0x36940040, 0x10000018, 0x0, 
 0x30a20100, 0x10400015, 0x0, 0x3c020001, 
-0x8c423c54, 0x1040000c, 0x0, 0x274301b0, 
+0x8c423d64, 0x1040000c, 0x0, 0x274301b0, 
 0x24650400, 0x65102b, 0x10400007, 0x26e40028, 
 0x8c820000, 0xac620000, 0x24630004, 0x65102b, 
 0x1440fffb, 0x24840004, 0x8f4202cc, 0xa34005b6, 
@@ -6376,7 +6390,7 @@
 0x27bdffa8, 0xafbf0050, 0xafbe004c, 0xafb50048, 
 0xafb30044, 0xafb20040, 0xafb1003c, 0xafb00038, 
 0x8f910108, 0x26220020, 0xaf820108, 0x8e320018, 
-0xa821, 0x32420024, 0x104001b1, 0xf021, 
+0xa821, 0x32420024, 0x104001b7, 0xf021, 
 0x8e26001c, 0x8f42001c, 0x61900, 0x431021, 
 0x8c50000c, 0x9603000c, 0x962d0016, 0x9453000a, 
 0x2c6205dd, 0x10400015, 0x2821, 0x32c20040, 
@@ -6400,8 +6414,8 @@
 0x431021, 0x904c0009, 0x318900ff, 0x39230006, 
 0x3182b, 0x39220011, 0x2102b, 0x621824, 
 0x1060000c, 0x3c050006, 0x8f4200a4, 0x3c040001, 
-0x24843810, 0xafa20010, 0x8f4200a0, 0x34a54600, 
-0x1203821, 0xc0029d3, 0xafa20014, 0x1000004e, 
+0x248438f4, 0xafa20010, 0x8f4200a0, 0x34a54600, 
+0x1203821, 0xc002a03, 0xafa20014, 0x1000004e, 
 0x0, 0x32c20004, 0x14400013, 0x2821, 
 0x316200ff, 0x14400004, 0x0, 0x95020002, 
 0x1000000d, 0x4a2823, 0x9505000c, 0x9502000e, 
@@ -6429,7 +6443,7 @@
 0x8f4200b4, 0x24430001, 0x210c0, 0x571021, 
 0xaf4300b4, 0x8fa30020, 0x8fa40024, 0x3c010001, 
 0x220821, 0xac2338e8, 0x3c010001, 0x220821, 
-0xac2438ec, 0x100000a5, 0xaf40009c, 0x10400064, 
+0xac2438ec, 0x100000a5, 0x32c20020, 0x10400064, 
 0x0, 0x8f4200b4, 0x24430001, 0x210c0, 
 0x571021, 0xaf4300b4, 0x8fa30020, 0x8fa40024, 
 0x3c010001, 0x220821, 0xac2338e8, 0x3c010001, 
@@ -6463,41 +6477,44 @@
 0xaf450264, 0x92020000, 0x30420001, 0x1440000c, 
 0x2402ffff, 0x8f420268, 0x8f43026c, 0x24630001, 
 0x2c640001, 0x441021, 0xaf420268, 0xaf43026c, 
-0x8f420268, 0x8f43026c, 0x1000001c, 0xaf40009c, 
+0x8f420268, 0x8f43026c, 0x1000001c, 0x32c20020, 
 0x8e030000, 0x1462000f, 0x3402ffff, 0x96030004, 
 0x1462000c, 0x0, 0x8f420278, 0x8f43027c, 
 0x24630001, 0x2c640001, 0x441021, 0xaf420278, 
 0xaf43027c, 0x8f420278, 0x8f43027c, 0x1000000b, 
-0xaf40009c, 0x8f420270, 0x8f430274, 0x24630001, 
+0x32c20020, 0x8f420270, 0x8f430274, 0x24630001, 
 0x2c640001, 0x441021, 0xaf420270, 0xaf430274, 
-0x8f420270, 0x8f430274, 0xaf40009c, 0x8e22001c, 
+0x8f420270, 0x8f430274, 0x32c20020, 0x10400005, 
+0xaf40009c, 0x8f420348, 0x2442ffff, 0xaf420348, 
+0x8f420348, 0x8e22001c, 0x8f430040, 0x24420001, 
+0x2463ffff, 0x431024, 0xaf42002c, 0x32420060, 
+0x14400008, 0x32c20010, 0x8f420034, 0x24420001, 
+0xaf420034, 0x8c03023c, 0x43102b, 0x14400114, 
+0x32c20010, 0x10400018, 0x24070008, 0x8f440160, 
+0x8f450164, 0x8f43002c, 0x8f48000c, 0x8f860120, 
+0x24020080, 0xafa20010, 0xafa30014, 0xafa80018, 
+0x8f42010c, 0x40f809, 0x24c6001c, 0x10400047, 
+0x24020001, 0x8f4202f0, 0x8f43002c, 0x24420001, 
+0xaf4202f0, 0x8f4202f0, 0x24020001, 0xa34205b2, 
+0x1000007c, 0xaf430038, 0x8f440160, 0x8f450164, 
+0x8f43002c, 0x8f48000c, 0x8f860120, 0x24020020, 
+0xafa20010, 0xafa30014, 0xafa80018, 0x8f42010c, 
+0x40f809, 0x24c6001c, 0x10400057, 0x24020001, 
+0x10000065, 0x0, 0x32420012, 0x10400075, 
+0x32420001, 0x9622000e, 0x8f43009c, 0x621821, 
+0x32c20020, 0x10400005, 0xaf43009c, 0x8f420348, 
+0x2442ffff, 0xaf420348, 0x8f420348, 0x8e22001c, 
 0x8f430040, 0x24420001, 0x2463ffff, 0x431024, 
-0xaf42002c, 0x32420060, 0x14400008, 0x32c20010, 
+0xaf42002c, 0x32420010, 0x14400008, 0x32c20010, 
 0x8f420034, 0x24420001, 0xaf420034, 0x8c03023c, 
-0x43102b, 0x14400111, 0x32c20010, 0x10400018, 
-0x24070008, 0x8f440160, 0x8f450164, 0x8f43002c, 
-0x8f48000c, 0x8f860120, 0x24020080, 0xafa20010, 
-0xafa30014, 0xafa80018, 0x8f42010c, 0x40f809, 
-0x24c6001c, 0x10400041, 0x24020001, 0x8f4202f0, 
-0x8f43002c, 0x24420001, 0xaf4202f0, 0x8f4202f0, 
-0x24020001, 0xa34205b2, 0x10000076, 0xaf430038, 
-0x8f440160, 0x8f450164, 0x8f43002c, 0x8f48000c, 
-0x8f860120, 0x24020020, 0xafa20010, 0xafa30014, 
-0xafa80018, 0x8f42010c, 0x40f809, 0x24c6001c, 
-0x10400051, 0x24020001, 0x1000005f, 0x0, 
-0x32420012, 0x1040006f, 0x32420001, 0x9623000e, 
-0x8f42009c, 0x431021, 0xaf42009c, 0x8e23001c, 
-0x8f420040, 0x24630001, 0x2442ffff, 0x621824, 
-0x32420010, 0x14400008, 0xaf43002c, 0x8f420034, 
-0x24420001, 0xaf420034, 0x8c03023c, 0x43102b, 
-0x144000d2, 0x0, 0x32c20010, 0x10400028, 
+0x43102b, 0x144000ce, 0x32c20010, 0x10400028, 
 0x24070008, 0x8f440160, 0x8f450164, 0x8f43002c, 
 0x8f48000c, 0x8f860120, 0x24020080, 0xafa20010, 
 0xafa30014, 0xafa80018, 0x8f42010c, 0x40f809, 
 0x24c6001c, 0x14400011, 0x24020001, 0x3c010001, 
 0x370821, 0xa02240f1, 0x8f820124, 0xafa20010, 
-0x8f820128, 0x3c040001, 0x24843800, 0xafa20014, 
-0x8f46002c, 0x8f870120, 0x3c050009, 0xc0029d3, 
+0x8f820128, 0x3c040001, 0x248438e4, 0xafa20014, 
+0x8f46002c, 0x8f870120, 0x3c050009, 0xc002a03, 
 0x34a51100, 0x10000036, 0x0, 0x8f4202f0, 
 0x8f43002c, 0x24420001, 0xaf4202f0, 0x8f4202f0, 
 0x24020001, 0xa34205b2, 0x10000026, 0xaf430038, 
@@ -6506,46 +6523,45 @@
 0xafa80018, 0x8f42010c, 0x40f809, 0x24c6001c, 
 0x14400011, 0x24020001, 0x3c010001, 0x370821, 
 0xa02240f0, 0x8f820124, 0xafa20010, 0x8f820128, 
-0x3c040001, 0x248437f4, 0xafa20014, 0x8f46002c, 
-0x8f870120, 0x3c050009, 0xc0029d3, 0x34a50900, 
+0x3c040001, 0x248438d8, 0xafa20014, 0x8f46002c, 
+0x8f870120, 0x3c050009, 0xc002a03, 0x34a50900, 
 0x1000000f, 0x0, 0x8f4202f0, 0x24420001, 
 0xaf4202f0, 0x8f4202f0, 0x8f42002c, 0xa34005b2, 
 0xaf420038, 0x3c010001, 0x370821, 0xa02040f1, 
 0x3c010001, 0x370821, 0xa02040f0, 0xaf400034, 
-0x8f420304, 0x24420001, 0xaf420304, 0x10000077, 
-0x8f420304, 0x10400025, 0x32427000, 0x8e25001c, 
+0x8f420304, 0x24420001, 0xaf420304, 0x10000074, 
+0x8f420304, 0x10400022, 0x32427000, 0x8e25001c, 
 0x8f420028, 0xa22023, 0x4810003, 0x0, 
 0x8f420040, 0x822021, 0x8f420348, 0x8f430000, 
-0x441021, 0xaf420348, 0x8f42035c, 0xaf450028, 
-0x441021, 0x10600007, 0xaf42035c, 0xaf80004c, 
-0x8f82004c, 0x1040fffd, 0x0, 0x10000005, 
-0x0, 0xaf800048, 0x8f820048, 0x1040fffd, 
-0x0, 0x8f820060, 0x34420008, 0xaf820060, 
-0x8f420000, 0x10400003, 0x0, 0x10000053, 
-0xaf80004c, 0x10000051, 0xaf800048, 0x1040002f, 
-0x32421000, 0x1040000c, 0x32424000, 0x8e23001c, 
-0x8f420050, 0x622023, 0x4820001, 0x24840200, 
-0x8f42034c, 0x441021, 0xaf42034c, 0x8f420358, 
-0x1000001a, 0xaf430050, 0x1040000c, 0x32c28000, 
-0x8e23001c, 0x8f420070, 0x622023, 0x4820001, 
-0x24840400, 0x8f420354, 0x441021, 0xaf420354, 
-0x8f420358, 0x1000000d, 0xaf430070, 0x1040000e, 
-0x3c020800, 0x8e23001c, 0x8f420060, 0x622023, 
-0x4820001, 0x24840100, 0x8f420350, 0x441021, 
-0xaf420350, 0x8f420358, 0xaf430060, 0x441021, 
-0xaf420358, 0x3c020800, 0x2c21024, 0x50400023, 
-0x36940040, 0x10000021, 0x0, 0x32420048, 
-0x10400007, 0x24150001, 0x8e22001c, 0x3c03ffff, 
-0x43f024, 0x3042ffff, 0x1000fd81, 0xae22001c, 
-0x32420100, 0x10400015, 0x0, 0x3c020001, 
-0x8c423c54, 0x1040000c, 0x0, 0x274301b0, 
-0x24650400, 0x65102b, 0x10400007, 0x26e40028, 
-0x8c820000, 0xac620000, 0x24630004, 0x65102b, 
-0x1440fffb, 0x24840004, 0x8f4202cc, 0xa34005b6, 
-0x24420001, 0xaf4202cc, 0x8f4202cc, 0x8fbf0050, 
-0x8fbe004c, 0x8fb50048, 0x8fb30044, 0x8fb20040, 
-0x8fb1003c, 0x8fb00038, 0x3e00008, 0x27bd0058, 
-0x3e00008, 0x0, 0x0, 0x8f8600e4, 
+0xaf450028, 0x441021, 0x10600007, 0xaf420348, 
+0xaf80004c, 0x8f82004c, 0x1040fffd, 0x0, 
+0x10000005, 0x0, 0xaf800048, 0x8f820048, 
+0x1040fffd, 0x0, 0x8f820060, 0x34420008, 
+0xaf820060, 0x8f420000, 0x10400003, 0x0, 
+0x10000053, 0xaf80004c, 0x10000051, 0xaf800048, 
+0x1040002f, 0x32421000, 0x1040000c, 0x32424000, 
+0x8e23001c, 0x8f420050, 0x622023, 0x4820001, 
+0x24840200, 0x8f42034c, 0x441021, 0xaf42034c, 
+0x8f420358, 0x1000001a, 0xaf430050, 0x1040000c, 
+0x32c28000, 0x8e23001c, 0x8f420070, 0x622023, 
+0x4820001, 0x24840400, 0x8f420354, 0x441021, 
+0xaf420354, 0x8f420358, 0x1000000d, 0xaf430070, 
+0x1040000e, 0x3c020800, 0x8e23001c, 0x8f420060, 
+0x622023, 0x4820001, 0x24840100, 0x8f420350, 
+0x441021, 0xaf420350, 0x8f420358, 0xaf430060, 
+0x441021, 0xaf420358, 0x3c020800, 0x2c21024, 
+0x50400023, 0x36940040, 0x10000021, 0x0, 
+0x32420048, 0x10400007, 0x24150001, 0x8e22001c, 
+0x3c03ffff, 0x43f024, 0x3042ffff, 0x1000fd78, 
+0xae22001c, 0x32420100, 0x10400015, 0x0, 
+0x3c020001, 0x8c423d64, 0x1040000c, 0x0, 
+0x274301b0, 0x24650400, 0x65102b, 0x10400007, 
+0x26e40028, 0x8c820000, 0xac620000, 0x24630004, 
+0x65102b, 0x1440fffb, 0x24840004, 0x8f4202cc, 
+0xa34005b6, 0x24420001, 0xaf4202cc, 0x8f4202cc, 
+0x8fbf0050, 0x8fbe004c, 0x8fb50048, 0x8fb30044, 
+0x8fb20040, 0x8fb1003c, 0x8fb00038, 0x3e00008, 
+0x27bd0058, 0x3e00008, 0x0, 0x8f8600e4, 
 0x8f8200e0, 0x2403fff8, 0x431024, 0x10c20007, 
 0x803821, 0x8cc20000, 0x8cc30004, 0xace20000, 
 0xace30004, 0x10000002, 0x24020001, 0x1021, 
@@ -6601,8 +6617,8 @@
 0x10400014, 0x307000ff, 0x8f4201d8, 0x24420001, 
 0xaf4201d8, 0x8f4201d8, 0x8faa007c, 0x8f8200e0, 
 0x354a0100, 0xafaa007c, 0xafa20010, 0x8f8200e4, 
-0x24100001, 0x3c040001, 0x248438d0, 0xafa20014, 
-0x8fa60020, 0x8fa70024, 0x3c050007, 0xc0029d3, 
+0x24100001, 0x3c040001, 0x248439b4, 0xafa20014, 
+0x8fa60020, 0x8fa70024, 0x3c050007, 0xc002a03, 
 0x34a50800, 0x12000010, 0x3c020080, 0x2c21024, 
 0x1440000e, 0x32c20400, 0x8fab007c, 0x3c020080, 
 0x34420100, 0x1621024, 0x10400005, 0x0, 
@@ -6624,22 +6640,22 @@
 0x8f420340, 0x2403ffbf, 0x283a024, 0x24420001, 
 0xaf420340, 0x1000023f, 0x8f420340, 0x2c2b025, 
 0x2402ffbf, 0x282a024, 0x8f830128, 0x3c040001, 
-0x24843900, 0x26620001, 0xafa20014, 0xafa30010, 
-0x8f860120, 0x8f870124, 0x3c050007, 0xc0029d3, 
+0x248439e4, 0x26620001, 0xafa20014, 0xafa30010, 
+0x8f860120, 0x8f870124, 0x3c050007, 0xc002a03, 
 0x34a52250, 0x1000022f, 0x0, 0x2c2b025, 
 0x2402ffbf, 0x282a024, 0x8f830128, 0x3c040001, 
-0x24843900, 0x24020002, 0xafa20014, 0xafa30010, 
-0x8f860120, 0x8f870124, 0x3c050007, 0xc0029d3, 
+0x248439e4, 0x24020002, 0xafa20014, 0xafa30010, 
+0x8f860120, 0x8f870124, 0x3c050007, 0xc002a03, 
 0x34a52450, 0x1000021f, 0x0, 0x8ea20000, 
-0x8ea30004, 0x3c040001, 0x24843918, 0xafb00010, 
-0xafbe0014, 0x8ea70018, 0x34a52800, 0xc0029d3, 
+0x8ea30004, 0x3c040001, 0x248439fc, 0xafb00010, 
+0xafbe0014, 0x8ea70018, 0x34a52800, 0xc002a03, 
 0x603021, 0x10000213, 0x0, 0xa6b1000a, 
-0x8f820124, 0x3c040001, 0x24843920, 0xafbe0014, 
+0x8f820124, 0x3c040001, 0x24843a04, 0xafbe0014, 
 0xafa20010, 0x8f460044, 0x8f870120, 0x3c050007, 
-0xc0029d3, 0x34a53000, 0x10000206, 0x0, 
+0xc002a03, 0x34a53000, 0x10000206, 0x0, 
 0xa6b1000a, 0xa6b2000e, 0x8f820124, 0x3c040001, 
-0x2484392c, 0xafbe0014, 0xafa20010, 0x8f460044, 
-0x8f870120, 0x3c050007, 0xc0029d3, 0x34a53200, 
+0x24843a10, 0xafbe0014, 0xafa20010, 0x8f460044, 
+0x8f870120, 0x3c050007, 0xc002a03, 0x34a53200, 
 0x100001f8, 0x0, 0x8f420084, 0x8faa006c, 
 0x4a102b, 0x14400007, 0x3c020001, 0x2c21024, 
 0x10400004, 0x0, 0x240b0002, 0xafab005c, 
@@ -6650,17 +6666,17 @@
 0x3403ecc0, 0xafab004c, 0x27c20001, 0x304201ff, 
 0xafa20054, 0x1e1140, 0x431021, 0x1000006b, 
 0x2e2a821, 0x8f420044, 0x8faa006c, 0x3c040001, 
-0x248438dc, 0xafaa0014, 0xafa20010, 0x8f460054, 
-0x8f470050, 0x3c050007, 0xc0029d3, 0x34a51300, 
+0x248439c0, 0xafaa0014, 0xafa20010, 0x8f460054, 
+0x8f470050, 0x3c050007, 0xc002a03, 0x34a51300, 
 0x8f430340, 0x2402ffbf, 0x282a024, 0x24630001, 
 0xaf430340, 0x100001c3, 0x8f420340, 0x1562001d, 
 0x0, 0x8f430074, 0x8f420070, 0x1062000a, 
 0x274a0074, 0x8f5e0074, 0xafaa004c, 0x27c20001, 
 0x304203ff, 0xafa20054, 0x1e1140, 0x24426cc0, 
 0x1000004a, 0x2e2a821, 0x8f420044, 0x8fab006c, 
-0x3c040001, 0x248438e8, 0x3c050007, 0xafab0014, 
+0x3c040001, 0x248439cc, 0x3c050007, 0xafab0014, 
 0xafa20010, 0x8f460074, 0x8f470070, 0x34a51500, 
-0x240a0001, 0xc0029d3, 0xafaa005c, 0x1000ffc3, 
+0x240a0001, 0xc002a03, 0xafaa005c, 0x1000ffc3, 
 0x0, 0x8f430064, 0x8f420060, 0x1062001a, 
 0x274b0064, 0x8f5e0064, 0x8faa005c, 0xafab004c, 
 0x27c20001, 0x304200ff, 0xafa20054, 0x24020004, 
@@ -6669,8 +6685,8 @@
 0x8faa006c, 0x4a102b, 0x10400024, 0x25750020, 
 0x240b0001, 0x10000021, 0xa3ab0097, 0x24424cc0, 
 0x1000001e, 0x2e2a821, 0x8f420044, 0x8faa006c, 
-0x3c040001, 0x248438f4, 0xafaa0014, 0xafa20010, 
-0x8f460064, 0x8f470060, 0x3c050007, 0xc0029d3, 
+0x3c040001, 0x248439d8, 0xafaa0014, 0xafa20010, 
+0x8f460064, 0x8f470060, 0x3c050007, 0xc002a03, 
 0x34a51800, 0x3c020008, 0x2c21024, 0x1440ff34, 
 0x0, 0x8f420360, 0x240b0001, 0xafab005c, 
 0x24420001, 0xaf420360, 0x1000ff90, 0x8f420360, 
@@ -6691,9 +6707,9 @@
 0x64102a, 0x54400001, 0x602021, 0xaf4400fc, 
 0x8f4200fc, 0xa2102a, 0x10400011, 0x24030001, 
 0x10000015, 0x306200ff, 0x8faa0064, 0x96070018, 
-0xafaa0010, 0x8e220008, 0x3c040001, 0x2484390c, 
+0xafaa0010, 0x8e220008, 0x3c040001, 0x248439f0, 
 0x8c430004, 0x8c420000, 0x34a52400, 0x2403021, 
-0xc0029d3, 0xafa30014, 0x1000002b, 0x0, 
+0xc002a03, 0xafa30014, 0x1000002b, 0x0, 
 0x8f420324, 0x1821, 0x24420001, 0xaf420324, 
 0x8f420324, 0x306200ff, 0x5040fedc, 0x3c020800, 
 0x12600021, 0x9021, 0x8fb100a4, 0x2208021, 
@@ -6745,9 +6761,9 @@
 0xafa20010, 0xafa30014, 0xafa80018, 0x8f42010c, 
 0x40f809, 0x24c6001c, 0x14400011, 0x240b0001, 
 0x3c010001, 0x370821, 0xa02b40f2, 0x8f820124, 
-0xafa20010, 0x8f820128, 0x3c040001, 0x248438c8, 
+0xafa20010, 0x8f820128, 0x3c040001, 0x248439ac, 
 0xafa20014, 0x8f460044, 0x8f870120, 0x3c050009, 
-0xc0029d3, 0x34a51300, 0x1000000b, 0x0, 
+0xc002a03, 0x34a51300, 0x1000000b, 0x0, 
 0x8f4202f4, 0x24420001, 0xaf4202f4, 0x8f4202f4, 
 0x8f420044, 0xaf42007c, 0x3c010001, 0x370821, 
 0xa02040f2, 0xaf400078, 0x8f420308, 0x24420001, 
@@ -6787,14 +6803,14 @@
 0xa7a00076, 0x10400007, 0xa7a0007e, 0x8f4c00c0, 
 0xafac0064, 0x8f4b00c8, 0x8f5e00c4, 0x10000129, 
 0xafab006c, 0x8f420114, 0x40f809, 0x27a40020, 
-0x304200ff, 0x1040029c, 0x0, 0x8fac0024, 
+0x304200ff, 0x1040029a, 0x0, 0x8fac0024, 
 0x8fbe0020, 0x3182ffff, 0x2442fffc, 0xafa20064, 
 0x3c020006, 0x2c21024, 0x14400015, 0xafac006c, 
 0x93c20000, 0x30420001, 0x10400011, 0x2402ffff, 
 0x8fc30000, 0x14620004, 0x3402ffff, 0x97c30004, 
 0x1062000b, 0x0, 0xc002343, 0x3c02021, 
 0x304200ff, 0x14400006, 0x0, 0x8f420118, 
-0x40f809, 0x0, 0x1000027f, 0x0, 
+0x40f809, 0x0, 0x1000027d, 0x0, 
 0x8fa20024, 0x3c03ffbf, 0x3463ffff, 0x431024, 
 0x3c03ffff, 0x431824, 0x14600003, 0xafa20024, 
 0x10000040, 0x8021, 0x3c020080, 0x621024, 
@@ -6817,13 +6833,13 @@
 0x10400015, 0x320200ff, 0x8f4201d8, 0x24420001, 
 0xaf4201d8, 0x8f4201d8, 0x8fac006c, 0x8f8200e0, 
 0x358c0100, 0xafac006c, 0xafa20010, 0x8f8200e4, 
-0x24100001, 0x3c040001, 0x248438d0, 0xafa20014, 
-0x8fa60020, 0x8fa70024, 0x3c050007, 0xc0029d3, 
+0x24100001, 0x3c040001, 0x248439b4, 0xafa20014, 
+0x8fa60020, 0x8fa70024, 0x3c050007, 0xc002a03, 
 0x34a53600, 0x320200ff, 0x10400010, 0x3c020080, 
 0x2c21024, 0x1440000e, 0x32c20400, 0x8fab006c, 
 0x3c020080, 0x34420100, 0x1621024, 0x10400005, 
 0x0, 0x8f4201fc, 0x24420001, 0xaf4201fc, 
-0x8f4201fc, 0x10000201, 0x8fa30064, 0x32c20400, 
+0x8f4201fc, 0x100001ff, 0x8fa30064, 0x32c20400, 
 0x10400012, 0x34028100, 0x97c3000c, 0x1462000f, 
 0x0, 0x240c0200, 0xa7ac0076, 0x97c2000e, 
 0x8fc30008, 0x8fc40004, 0x8fab0064, 0x8fc50000, 
@@ -6843,56 +6859,56 @@
 0x2c420001, 0x621825, 0x10600004, 0x3c020100, 
 0x94820002, 0x453821, 0x3c020100, 0x2c21024, 
 0x5040000e, 0xafa70064, 0x8fac0064, 0x10ec0008, 
-0x3c050007, 0x3c040001, 0x24843938, 0x8fa60064, 
-0x34a54000, 0xafa00010, 0xc0029d3, 0xafa00014, 
+0x3c050007, 0x3c040001, 0x24843a1c, 0x8fa60064, 
+0x34a54000, 0xafa00010, 0xc002a03, 0xafa00014, 
 0x8fab0064, 0x256b0004, 0xafab0064, 0x8f420080, 
 0x8fac0064, 0x4c102b, 0x1040002c, 0x32c28000, 
 0x10400034, 0x240b0003, 0x32c21000, 0x10400031, 
 0xafab005c, 0x1000002e, 0x240c0004, 0x8f420340, 
 0x2403ffbf, 0x283a024, 0x24420001, 0xaf420340, 
-0x10000175, 0x8f420340, 0x3c020800, 0x2c2b025, 
+0x10000173, 0x8f420340, 0x3c020800, 0x2c2b025, 
 0x2402ffbf, 0x282a024, 0x8f830128, 0x3c040001, 
-0x24843900, 0x26620001, 0xafa20014, 0xafa30010, 
-0x8f860120, 0x8f870124, 0x3c050007, 0xc0029d3, 
-0x34a55300, 0x10000164, 0x0, 0x8ea20000, 
-0x8ea30004, 0x3c040001, 0x24843918, 0xafb00010, 
-0xafb20014, 0x8ea70018, 0x34a55900, 0xc0029d3, 
-0x603021, 0x10000158, 0x0, 0x8f420084, 
+0x248439e4, 0x26620001, 0xafa20014, 0xafa30010, 
+0x8f860120, 0x8f870124, 0x3c050007, 0xc002a03, 
+0x34a55300, 0x10000162, 0x0, 0x8ea20000, 
+0x8ea30004, 0x3c040001, 0x248439fc, 0xafb00010, 
+0xafb10014, 0x8ea70018, 0x34a55900, 0xc002a03, 
+0x603021, 0x10000156, 0x0, 0x8f420084, 
 0x8fab0064, 0x4b102b, 0x14400007, 0x3c020001, 
 0x2c21024, 0x10400004, 0x0, 0x240c0002, 
-0xafac005c, 0x8fab0064, 0x11600168, 0x27ac0020, 
+0xafac005c, 0x8fab0064, 0x11600166, 0x27ac0020, 
 0xafac008c, 0x8fab005c, 0x240c0001, 0x556c0021, 
 0x240c0002, 0x8f430054, 0x8f420050, 0x1062000b, 
-0x274b0054, 0x8f520054, 0x3403ecc0, 0xafab004c, 
-0x26420001, 0x304201ff, 0xafa20054, 0x121140, 
+0x274b0054, 0x8f510054, 0x3403ecc0, 0xafab004c, 
+0x26220001, 0x304201ff, 0xafa20054, 0x111140, 
 0x431021, 0x1000006b, 0x2e2a821, 0x8f420044, 
-0x8fac0064, 0x3c040001, 0x248438dc, 0xafac0014, 
+0x8fac0064, 0x3c040001, 0x248439c0, 0xafac0014, 
 0xafa20010, 0x8f460054, 0x8f470050, 0x3c050007, 
-0xc0029d3, 0x34a54300, 0x8f430340, 0x2402ffbf, 
-0x282a024, 0x24630001, 0xaf430340, 0x10000126, 
+0xc002a03, 0x34a54300, 0x8f430340, 0x2402ffbf, 
+0x282a024, 0x24630001, 0xaf430340, 0x10000124, 
 0x8f420340, 0x156c001d, 0x0, 0x8f430074, 
-0x8f420070, 0x1062000a, 0x274b0074, 0x8f520074, 
-0xafab004c, 0x26420001, 0x304203ff, 0xafa20054, 
-0x121140, 0x24426cc0, 0x1000004a, 0x2e2a821, 
-0x8f420044, 0x8fac0064, 0x3c040001, 0x248438e8, 
+0x8f420070, 0x1062000a, 0x274b0074, 0x8f510074, 
+0xafab004c, 0x26220001, 0x304203ff, 0xafa20054, 
+0x111140, 0x24426cc0, 0x1000004a, 0x2e2a821, 
+0x8f420044, 0x8fac0064, 0x3c040001, 0x248439cc, 
 0x3c050007, 0xafac0014, 0xafa20010, 0x8f460074, 
-0x8f470070, 0x34a54500, 0x240b0001, 0xc0029d3, 
+0x8f470070, 0x34a54500, 0x240b0001, 0xc002a03, 
 0xafab005c, 0x1000ffc3, 0x0, 0x8f430064, 
-0x8f420060, 0x1062001a, 0x274c0064, 0x8f520064, 
-0x8fab005c, 0xafac004c, 0x26420001, 0x304200ff, 
-0xafa20054, 0x24020004, 0x1562000e, 0x121140, 
-0x121180, 0x24420cc0, 0x2e21021, 0xafa20044, 
+0x8f420060, 0x1062001a, 0x274c0064, 0x8f510064, 
+0x8fab005c, 0xafac004c, 0x26220001, 0x304200ff, 
+0xafa20054, 0x24020004, 0x1562000e, 0x111140, 
+0x111180, 0x24420cc0, 0x2e21021, 0xafa20044, 
 0x9442002a, 0x8fac0044, 0x8fab0064, 0x4b102b, 
 0x10400024, 0x25950020, 0x240c0001, 0x10000021, 
 0xa3ac0087, 0x24424cc0, 0x1000001e, 0x2e2a821, 
-0x8f420044, 0x8fab0064, 0x3c040001, 0x248438f4, 
+0x8f420044, 0x8fab0064, 0x3c040001, 0x248439d8, 
 0xafab0014, 0xafa20010, 0x8f460064, 0x8f470060, 
-0x3c050007, 0xc0029d3, 0x34a54800, 0x3c020008, 
+0x3c050007, 0xc002a03, 0x34a54800, 0x3c020008, 
 0x2c21024, 0x1440ff61, 0x0, 0x8f420360, 
 0x240c0001, 0xafac005c, 0x24420001, 0xaf420360, 
 0x1000ff90, 0x8f420360, 0x27a30036, 0x131040, 
 0x621821, 0x94620000, 0x441021, 0x1000001f, 
-0xa4620000, 0xaebe0018, 0x93a20087, 0x10400086, 
+0xa4620000, 0xaebe0018, 0x93a20087, 0x10400084, 
 0x9821, 0x8fab0044, 0x8fa40064, 0x8fa3008c, 
 0x25620020, 0xafa20028, 0x25620008, 0xafa20030, 
 0x25620010, 0xafab002c, 0xafa20034, 0x9562002a, 
@@ -6906,289 +6922,288 @@
 0x431023, 0x21943, 0x58600001, 0x24630040, 
 0x64102a, 0x54400001, 0x602021, 0xaf4400fc, 
 0x8f4200fc, 0x262102a, 0x10400016, 0x24030001, 
-0x1000001a, 0x306200ff, 0x8fac008c, 0x111040, 
-0x4c1021, 0x94470018, 0x111080, 0x4c1021, 
-0xafbe0010, 0x8c420008, 0x3c040001, 0x2484390c, 
+0x1000001a, 0x306200ff, 0x8fac008c, 0x101040, 
+0x4c1021, 0x94470018, 0x101080, 0x4c1021, 
+0xafbe0010, 0x8c420008, 0x3c040001, 0x248439f0, 
 0x3c050007, 0x8c430004, 0x8c420000, 0x34a55500, 
-0x2203021, 0xc0029d3, 0xafa30014, 0x1000003b, 
+0x2003021, 0xc002a03, 0xafa30014, 0x10000039, 
 0x0, 0x8f420324, 0x1821, 0x24420001, 
 0xaf420324, 0x8f420324, 0x306200ff, 0x1040ff06, 
-0x8821, 0x8f430008, 0x2402fbff, 0x621824, 
-0x605021, 0x1260002d, 0xaf430008, 0x2669ffff, 
-0x8fb0008c, 0x3c0b4000, 0x24b4025, 0x2009021, 
-0x8e420008, 0x96070018, 0x8c440000, 0x8c450004, 
-0x56290004, 0x240b0001, 0x240c0002, 0x10000002, 
-0xafac0010, 0xafab0010, 0x16200004, 0xafa80014, 
-0x8f420008, 0x10000002, 0xafa20018, 0xafaa0018, 
-0x8f42010c, 0x3c03021, 0xafa80098, 0xafa9009c, 
-0x40f809, 0xafaa00a0, 0x8fa80098, 0x8fa9009c, 
-0x8faa00a0, 0x1040ffc0, 0x3c02001f, 0x96030018, 
-0x3442ffff, 0x3c3f021, 0x5e102b, 0x10400003, 
-0x26100002, 0x8f42013c, 0x3c2f023, 0x26310001, 
-0x233102b, 0x1440ffda, 0x26520004, 0x8fb00064, 
-0x1000001a, 0x0, 0x96a3000a, 0x8fb00064, 
-0x70102b, 0x54400001, 0x608021, 0x8ea40000, 
-0x8ea50004, 0x8fab005c, 0x240c0002, 0xafac0010, 
-0x934305b5, 0xb1700, 0x10600003, 0x2423025, 
-0x3c020800, 0xc23025, 0xafa60014, 0x8f420008, 
-0xafa20018, 0x8f42010c, 0x3c03021, 0x40f809, 
-0x2003821, 0x1040fec9, 0x3c050007, 0x97ac0076, 
-0x11800007, 0x96a3000e, 0x934205b5, 0x14400004, 
-0x0, 0x97ab007e, 0x6c1825, 0xa6ab0016, 
-0x8fac006c, 0x3c02ffff, 0x1821024, 0x10400003, 
-0xc1402, 0x34630400, 0xa6a20014, 0xa6b0000a, 
-0x8fab0064, 0x560b0006, 0x3d0f021, 0x34620004, 
-0xafa00064, 0xa6a2000e, 0x1000000d, 0xa34005b5, 
-0x8fac0064, 0x3c02001f, 0x3442ffff, 0x5e102b, 
-0x1906023, 0xafac0064, 0xa6a3000e, 0x240b0001, 
-0x10400003, 0xa34b05b5, 0x8f42013c, 0x3c2f023, 
-0x8fab0054, 0x8fac004c, 0xad8b0000, 0x8fac0064, 
-0x1580feb8, 0x0, 0x8fab0064, 0x1160001b, 
-0x0, 0x934205b5, 0x10400006, 0x0, 
-0xaf5e00c4, 0xaf4b00c0, 0x8fac006c, 0x1000000e, 
-0xaf4c00c8, 0x97ab0076, 0x1160000b, 0x34038100, 
-0x8fa20020, 0x8c46000c, 0xa443000c, 0x97ac007e, 
-0x8c440004, 0x8c450008, 0xa44c000e, 0xac440000, 
-0xac450004, 0xac460008, 0x8f42033c, 0x24420001, 
-0xaf42033c, 0x10000010, 0x8f42033c, 0x8fab006c, 
-0x3164ffff, 0x2484fffc, 0x801821, 0x8f440240, 
-0x8f450244, 0x8f460118, 0x1021, 0xa32821, 
-0xa3382b, 0x822021, 0x872021, 0xaf440240, 
-0xc0f809, 0xaf450244, 0x8fbf00c0, 0x8fbe00bc, 
-0x8fb500b8, 0x8fb300b4, 0x8fb200b0, 0x8fb100ac, 
-0x8fb000a8, 0x3e00008, 0x27bd00c8, 0x3e00008, 
-0x0, 0x27bdffd8, 0xafbf0024, 0xafb00020, 
-0x8f43004c, 0x8f420048, 0x10620034, 0x0, 
-0x8f430048, 0x8f42004c, 0x622023, 0x4820001, 
-0x24840200, 0x8f430054, 0x8f42004c, 0x43102b, 
-0x14400004, 0x24020200, 0x8f43004c, 0x10000005, 
-0x431023, 0x8f420054, 0x8f43004c, 0x431023, 
-0x2442ffff, 0x405021, 0x8a102a, 0x54400001, 
-0x805021, 0x8f49004c, 0x8f48004c, 0x8f440178, 
-0x8f45017c, 0x8f46004c, 0x24071000, 0xafa70010, 
-0x84140, 0x1001821, 0x12a4821, 0x313001ff, 
-0xafb00014, 0x8f470014, 0x1021, 0x63140, 
-0xafa70018, 0xa32821, 0xa3382b, 0x822021, 
-0x872021, 0x3402ecc0, 0xc23021, 0x8f420108, 
-0x2e63021, 0x40f809, 0xa3940, 0x54400001, 
-0xaf50004c, 0x8f43004c, 0x8f420048, 0x14620018, 
+0x8021, 0x8f430008, 0x2402fbff, 0x1260002d, 
+0x625024, 0x3c0b4000, 0x22b4025, 0x8fb1008c, 
+0x2669ffff, 0x2209021, 0x8e420008, 0x96270018, 
+0x8c440000, 0x8c450004, 0x56090004, 0x240b0001, 
+0x240c0002, 0x10000002, 0xafac0010, 0xafab0010, 
+0x16000004, 0xafa80014, 0x8f420008, 0x10000002, 
+0xafa20018, 0xafaa0018, 0x8f42010c, 0x3c03021, 
+0xafa80098, 0xafa9009c, 0x40f809, 0xafaa00a0, 
+0x8fa80098, 0x8fa9009c, 0x8faa00a0, 0x1040ffc2, 
+0x3c02001f, 0x96230018, 0x3442ffff, 0x3c3f021, 
+0x5e102b, 0x10400003, 0x26310002, 0x8f42013c, 
+0x3c2f023, 0x26100001, 0x213102b, 0x1440ffda, 
+0x26520004, 0x8fb00064, 0x1000001a, 0x0, 
+0x96a3000a, 0x8fb00064, 0x70102b, 0x54400001, 
+0x608021, 0x8ea40000, 0x8ea50004, 0x8fab005c, 
+0x240c0002, 0xafac0010, 0x934305b5, 0xb1700, 
+0x10600003, 0x2223025, 0x3c020800, 0xc23025, 
+0xafa60014, 0x8f420008, 0xafa20018, 0x8f42010c, 
+0x3c03021, 0x40f809, 0x2003821, 0x1040fecb, 
+0x3c050007, 0x97ac0076, 0x11800007, 0x96a3000e, 
+0x934205b5, 0x14400004, 0x0, 0x97ab007e, 
+0x6c1825, 0xa6ab0016, 0x8fac006c, 0x3c02ffff, 
+0x1821024, 0x10400003, 0xc1402, 0x34630400, 
+0xa6a20014, 0xa6b0000a, 0x8fab0064, 0x560b0006, 
+0x3d0f021, 0x34620004, 0xafa00064, 0xa6a2000e, 
+0x1000000d, 0xa34005b5, 0x8fac0064, 0x3c02001f, 
+0x3442ffff, 0x5e102b, 0x1906023, 0xafac0064, 
+0xa6a3000e, 0x240b0001, 0x10400003, 0xa34b05b5, 
+0x8f42013c, 0x3c2f023, 0x8fab0054, 0x8fac004c, 
+0xad8b0000, 0x8fac0064, 0x1580feba, 0x0, 
+0x8fab0064, 0x1160001b, 0x0, 0x934205b5, 
+0x10400006, 0x0, 0xaf5e00c4, 0xaf4b00c0, 
+0x8fac006c, 0x1000000e, 0xaf4c00c8, 0x97ab0076, 
+0x1160000b, 0x34038100, 0x8fa20020, 0x8c46000c, 
+0xa443000c, 0x97ac007e, 0x8c440004, 0x8c450008, 
+0xa44c000e, 0xac440000, 0xac450004, 0xac460008, 
+0x8f42033c, 0x24420001, 0xaf42033c, 0x10000010, 
+0x8f42033c, 0x8fab006c, 0x3164ffff, 0x2484fffc, 
+0x801821, 0x8f440240, 0x8f450244, 0x8f460118, 
+0x1021, 0xa32821, 0xa3382b, 0x822021, 
+0x872021, 0xaf440240, 0xc0f809, 0xaf450244, 
+0x8fbf00c0, 0x8fbe00bc, 0x8fb500b8, 0x8fb300b4, 
+0x8fb200b0, 0x8fb100ac, 0x8fb000a8, 0x3e00008, 
+0x27bd00c8, 0x3e00008, 0x0, 0x27bdffd8, 
+0xafbf0024, 0xafb00020, 0x8f43004c, 0x8f420048, 
+0x10620034, 0x0, 0x8f430048, 0x8f42004c, 
+0x622023, 0x4820001, 0x24840200, 0x8f430054, 
+0x8f42004c, 0x43102b, 0x14400004, 0x24020200, 
+0x8f43004c, 0x10000005, 0x431023, 0x8f420054, 
+0x8f43004c, 0x431023, 0x2442ffff, 0x405021, 
+0x8a102a, 0x54400001, 0x805021, 0x8f49004c, 
+0x8f48004c, 0x8f440178, 0x8f45017c, 0x8f46004c, 
+0x24071000, 0xafa70010, 0x84140, 0x1001821, 
+0x12a4821, 0x313001ff, 0xafb00014, 0x8f470014, 
+0x1021, 0x63140, 0xafa70018, 0xa32821, 
+0xa3382b, 0x822021, 0x872021, 0x3402ecc0, 
+0xc23021, 0x8f420108, 0x2e63021, 0x40f809, 
+0xa3940, 0x54400001, 0xaf50004c, 0x8f43004c, 
+0x8f420048, 0x14620018, 0x0, 0x8f420000, 
+0x10400007, 0x0, 0xaf80004c, 0x8f82004c, 
+0x1040fffd, 0x0, 0x10000005, 0x0, 
+0xaf800048, 0x8f820048, 0x1040fffd, 0x0, 
+0x8f820060, 0x2403fdff, 0x431024, 0xaf820060, 
+0x8f420000, 0x10400003, 0x0, 0x10000002, 
+0xaf80004c, 0xaf800048, 0x8fbf0024, 0x8fb00020, 
+0x3e00008, 0x27bd0028, 0x3e00008, 0x0, 
+0x27bdffd8, 0xafbf0024, 0xafb00020, 0x8f43005c, 
+0x8f420058, 0x10620049, 0x0, 0x8f430058, 
+0x8f42005c, 0x622023, 0x4820001, 0x24840100, 
+0x8f430064, 0x8f42005c, 0x43102b, 0x14400004, 
+0x24020100, 0x8f43005c, 0x10000005, 0x431023, 
+0x8f420064, 0x8f43005c, 0x431023, 0x2442ffff, 
+0x403821, 0x87102a, 0x54400001, 0x803821, 
+0x8f42005c, 0x471021, 0x305000ff, 0x32c21000, 
+0x10400015, 0x24082000, 0x8f49005c, 0x8f440180, 
+0x8f450184, 0x8f46005c, 0x73980, 0xafa80010, 
+0xafb00014, 0x8f480014, 0x94980, 0x1201821, 
+0x1021, 0xa32821, 0xa3482b, 0x822021, 
+0x892021, 0x63180, 0xafa80018, 0x8f420108, 
+0x10000014, 0x24c60cc0, 0x8f49005c, 0x8f440180, 
+0x8f450184, 0x8f46005c, 0x73940, 0xafa80010, 
+0xafb00014, 0x8f480014, 0x94940, 0x1201821, 
+0x1021, 0xa32821, 0xa3482b, 0x822021, 
+0x892021, 0x63140, 0xafa80018, 0x8f420108, 
+0x24c64cc0, 0x40f809, 0x2e63021, 0x54400001, 
+0xaf50005c, 0x8f43005c, 0x8f420058, 0x14620018, 
 0x0, 0x8f420000, 0x10400007, 0x0, 
 0xaf80004c, 0x8f82004c, 0x1040fffd, 0x0, 
 0x10000005, 0x0, 0xaf800048, 0x8f820048, 
-0x1040fffd, 0x0, 0x8f820060, 0x2403fdff, 
+0x1040fffd, 0x0, 0x8f820060, 0x2403feff, 
 0x431024, 0xaf820060, 0x8f420000, 0x10400003, 
 0x0, 0x10000002, 0xaf80004c, 0xaf800048, 
 0x8fbf0024, 0x8fb00020, 0x3e00008, 0x27bd0028, 
 0x3e00008, 0x0, 0x27bdffd8, 0xafbf0024, 
-0xafb00020, 0x8f43005c, 0x8f420058, 0x10620049, 
-0x0, 0x8f430058, 0x8f42005c, 0x622023, 
-0x4820001, 0x24840100, 0x8f430064, 0x8f42005c, 
-0x43102b, 0x14400004, 0x24020100, 0x8f43005c, 
-0x10000005, 0x431023, 0x8f420064, 0x8f43005c, 
-0x431023, 0x2442ffff, 0x403821, 0x87102a, 
-0x54400001, 0x803821, 0x8f42005c, 0x471021, 
-0x305000ff, 0x32c21000, 0x10400015, 0x24082000, 
-0x8f49005c, 0x8f440180, 0x8f450184, 0x8f46005c, 
-0x73980, 0xafa80010, 0xafb00014, 0x8f480014, 
-0x94980, 0x1201821, 0x1021, 0xa32821, 
-0xa3482b, 0x822021, 0x892021, 0x63180, 
-0xafa80018, 0x8f420108, 0x10000014, 0x24c60cc0, 
-0x8f49005c, 0x8f440180, 0x8f450184, 0x8f46005c, 
-0x73940, 0xafa80010, 0xafb00014, 0x8f480014, 
-0x94940, 0x1201821, 0x1021, 0xa32821, 
-0xa3482b, 0x822021, 0x892021, 0x63140, 
-0xafa80018, 0x8f420108, 0x24c64cc0, 0x40f809, 
-0x2e63021, 0x54400001, 0xaf50005c, 0x8f43005c, 
-0x8f420058, 0x14620018, 0x0, 0x8f420000, 
-0x10400007, 0x0, 0xaf80004c, 0x8f82004c, 
-0x1040fffd, 0x0, 0x10000005, 0x0, 
-0xaf800048, 0x8f820048, 0x1040fffd, 0x0, 
-0x8f820060, 0x2403feff, 0x431024, 0xaf820060, 
-0x8f420000, 0x10400003, 0x0, 0x10000002, 
-0xaf80004c, 0xaf800048, 0x8fbf0024, 0x8fb00020, 
-0x3e00008, 0x27bd0028, 0x3e00008, 0x0, 
-0x27bdffd8, 0xafbf0024, 0xafb00020, 0x8f43006c, 
-0x8f420068, 0x10620033, 0x0, 0x8f430068, 
-0x8f42006c, 0x622023, 0x4820001, 0x24840400, 
-0x8f430074, 0x8f42006c, 0x43102b, 0x14400004, 
-0x24020400, 0x8f43006c, 0x10000005, 0x431023, 
-0x8f420074, 0x8f43006c, 0x431023, 0x2442ffff, 
-0x405021, 0x8a102a, 0x54400001, 0x805021, 
-0x8f49006c, 0x8f48006c, 0x8f440188, 0x8f45018c, 
-0x8f46006c, 0x24074000, 0xafa70010, 0x84140, 
-0x1001821, 0x12a4821, 0x313003ff, 0xafb00014, 
-0x8f470014, 0x1021, 0x63140, 0x24c66cc0, 
-0xafa70018, 0xa32821, 0xa3382b, 0x822021, 
-0x872021, 0x8f420108, 0x2e63021, 0x40f809, 
-0xa3940, 0x54400001, 0xaf50006c, 0x8f43006c, 
-0x8f420068, 0x14620018, 0x0, 0x8f420000, 
-0x10400007, 0x0, 0xaf80004c, 0x8f82004c, 
-0x1040fffd, 0x0, 0x10000005, 0x0, 
-0xaf800048, 0x8f820048, 0x1040fffd, 0x0, 
-0x8f820060, 0x2403f7ff, 0x431024, 0xaf820060, 
-0x8f420000, 0x10400003, 0x0, 0x10000002, 
-0xaf80004c, 0xaf800048, 0x8fbf0024, 0x8fb00020, 
-0x3e00008, 0x27bd0028, 0x3e00008, 0x0, 
-0x8f4200fc, 0x3c030001, 0x8f4400f8, 0x346330c8, 
-0x24420001, 0xaf4200fc, 0x8f850128, 0x2e31021, 
-0x54820004, 0x24820008, 0x3c020001, 0x34422ec8, 
-0x2e21021, 0x401821, 0xaf4300f8, 0xac600000, 
-0x8f4200f4, 0x14620004, 0x3c020001, 0x24a20020, 
-0x1000000f, 0xaf820128, 0x8f4300f8, 0x344230c8, 
-0x2e21021, 0x54620004, 0x24620008, 0x3c020001, 
-0x34422ec8, 0x2e21021, 0x401821, 0x8c620004, 
-0x21140, 0xa21021, 0xaf820128, 0xac600000, 
-0x8ca30018, 0x30620070, 0x1040002d, 0x30620020, 
+0xafb00020, 0x8f43006c, 0x8f420068, 0x10620033, 
+0x0, 0x8f430068, 0x8f42006c, 0x622023, 
+0x4820001, 0x24840400, 0x8f430074, 0x8f42006c, 
+0x43102b, 0x14400004, 0x24020400, 0x8f43006c, 
+0x10000005, 0x431023, 0x8f420074, 0x8f43006c, 
+0x431023, 0x2442ffff, 0x405021, 0x8a102a, 
+0x54400001, 0x805021, 0x8f49006c, 0x8f48006c, 
+0x8f440188, 0x8f45018c, 0x8f46006c, 0x24074000, 
+0xafa70010, 0x84140, 0x1001821, 0x12a4821, 
+0x313003ff, 0xafb00014, 0x8f470014, 0x1021, 
+0x63140, 0x24c66cc0, 0xafa70018, 0xa32821, 
+0xa3382b, 0x822021, 0x872021, 0x8f420108, 
+0x2e63021, 0x40f809, 0xa3940, 0x54400001, 
+0xaf50006c, 0x8f43006c, 0x8f420068, 0x14620018, 
+0x0, 0x8f420000, 0x10400007, 0x0, 
+0xaf80004c, 0x8f82004c, 0x1040fffd, 0x0, 
+0x10000005, 0x0, 0xaf800048, 0x8f820048, 
+0x1040fffd, 0x0, 0x8f820060, 0x2403f7ff, 
+0x431024, 0xaf820060, 0x8f420000, 0x10400003, 
+0x0, 0x10000002, 0xaf80004c, 0xaf800048, 
+0x8fbf0024, 0x8fb00020, 0x3e00008, 0x27bd0028, 
+0x3e00008, 0x0, 0x8f4200fc, 0x3c030001, 
+0x8f4400f8, 0x346330c8, 0x24420001, 0xaf4200fc, 
+0x8f850128, 0x2e31021, 0x54820004, 0x24820008, 
+0x3c020001, 0x34422ec8, 0x2e21021, 0x401821, 
+0xaf4300f8, 0xac600000, 0x8f4200f4, 0x14620004, 
+0x3c020001, 0x24a20020, 0x1000000f, 0xaf820128, 
+0x8f4300f8, 0x344230c8, 0x2e21021, 0x54620004, 
+0x24620008, 0x3c020001, 0x34422ec8, 0x2e21021, 
+0x401821, 0x8c620004, 0x21140, 0xa21021, 
+0xaf820128, 0xac600000, 0x8ca30018, 0x30620070, 
+0x1040002d, 0x30620020, 0x10400004, 0x3c020010, 
+0x2c21024, 0x1040000d, 0x0, 0x30620040, 
+0x10400004, 0x3c020020, 0x2c21024, 0x10400007, 
+0x0, 0x30620010, 0x1040001f, 0x3c020040, 
+0x2c21024, 0x1440001c, 0x0, 0x8f820040, 
+0x30420001, 0x14400008, 0x2021, 0x8c030104, 
+0x24020001, 0x50620005, 0x24040001, 0x8c020264, 
+0x10400003, 0x801021, 0x24040001, 0x801021, 
+0x10400006, 0x0, 0x8f4202fc, 0x24420001, 
+0xaf4202fc, 0x10000008, 0x8f4202fc, 0x8f820044, 
+0x34420004, 0xaf820044, 0x8f4202f8, 0x24420001, 
+0xaf4202f8, 0x8f4202f8, 0x3e00008, 0x0, 
+0x3e00008, 0x0, 0x27bdffa0, 0xafbf0058, 
+0xafbe0054, 0xafb50050, 0xafb3004c, 0xafb20048, 
+0xafb10044, 0xafb00040, 0x8f4200fc, 0x24420001, 
+0xaf4200fc, 0x8f880128, 0x25020020, 0xaf820128, 
+0x8d030018, 0x30620070, 0x1040002e, 0x30620020, 
 0x10400004, 0x3c020010, 0x2c21024, 0x1040000d, 
 0x0, 0x30620040, 0x10400004, 0x3c020020, 
 0x2c21024, 0x10400007, 0x0, 0x30620010, 
-0x1040001f, 0x3c020040, 0x2c21024, 0x1440001c, 
+0x10400193, 0x3c020040, 0x2c21024, 0x14400190, 
 0x0, 0x8f820040, 0x30420001, 0x14400008, 
 0x2021, 0x8c030104, 0x24020001, 0x50620005, 
 0x24040001, 0x8c020264, 0x10400003, 0x801021, 
 0x24040001, 0x801021, 0x10400006, 0x0, 
-0x8f4202fc, 0x24420001, 0xaf4202fc, 0x10000008, 
+0x8f4202fc, 0x24420001, 0xaf4202fc, 0x1000017c, 
 0x8f4202fc, 0x8f820044, 0x34420004, 0xaf820044, 
-0x8f4202f8, 0x24420001, 0xaf4202f8, 0x8f4202f8, 
-0x3e00008, 0x0, 0x3e00008, 0x0, 
-0x27bdffa0, 0xafbf0058, 0xafbe0054, 0xafb50050, 
-0xafb3004c, 0xafb20048, 0xafb10044, 0xafb00040, 
-0x8f4200fc, 0x24420001, 0xaf4200fc, 0x8f880128, 
-0x25020020, 0xaf820128, 0x8d030018, 0x30620070, 
-0x1040002e, 0x30620020, 0x10400004, 0x3c020010, 
-0x2c21024, 0x1040000d, 0x0, 0x30620040, 
-0x10400004, 0x3c020020, 0x2c21024, 0x10400007, 
-0x0, 0x30620010, 0x10400193, 0x3c020040, 
-0x2c21024, 0x14400190, 0x0, 0x8f820040, 
-0x30420001, 0x14400008, 0x2021, 0x8c030104, 
-0x24020001, 0x50620005, 0x24040001, 0x8c020264, 
-0x10400003, 0x801021, 0x24040001, 0x801021, 
-0x10400006, 0x0, 0x8f4202fc, 0x24420001, 
-0xaf4202fc, 0x1000017c, 0x8f4202fc, 0x8f820044, 
-0x34420004, 0xaf820044, 0x8f4202f8, 0x24420001, 
-0xaf4202f8, 0x10000174, 0x8f4202f8, 0x30620002, 
-0x10400135, 0x3c020800, 0x8d0a001c, 0x1422024, 
-0xafaa0024, 0xa5702, 0xafaa0034, 0x8faa0024, 
-0x314affff, 0xafaa0024, 0x950a0016, 0xafaa002c, 
-0x8faa0034, 0x24020001, 0x15420007, 0x24020002, 
-0x8faa0024, 0xa1140, 0x3403ecc0, 0x431021, 
-0x10000014, 0x2e2a821, 0x15420006, 0x24020003, 
-0x8faa0024, 0xa1140, 0x24426cc0, 0x1000000d, 
-0x2e2a821, 0x8faa0034, 0x15420006, 0x0, 
-0x8faa0024, 0xa1140, 0x24424cc0, 0x10000005, 
-0x2e2a821, 0x8faa0024, 0xa1180, 0x571021, 
-0x24550ce0, 0x96a2000e, 0x305efffc, 0x30420400, 
-0x144000c5, 0x8821, 0x10800004, 0x24091000, 
-0x97b1002e, 0x100000c1, 0x0, 0x8eb30018, 
-0x9663000c, 0x2c6205dd, 0x10400015, 0x2021, 
-0x32c20800, 0x10400015, 0x24020800, 0x96630014, 
-0x14620012, 0x3402aaaa, 0x9663000e, 0x14620007, 
-0x2821, 0x96630010, 0x24020300, 0x14620004, 
-0xa01021, 0x96620012, 0x2c450001, 0xa01021, 
-0x54400006, 0x24040016, 0x10000004, 0x0, 
-0x24020800, 0x50620001, 0x2404000e, 0x108000a2, 
-0x2649021, 0x92420000, 0x3042000f, 0x28080, 
-0x32c20100, 0x1040001e, 0x2501821, 0x3c020020, 
-0x43102b, 0x1440000e, 0x2402021, 0x2821, 
-0x94820000, 0x24840002, 0xa22821, 0x83102b, 
-0x1440fffb, 0x30a2ffff, 0x51c02, 0x622821, 
-0x51c02, 0x30a2ffff, 0x10000009, 0x622821, 
-0x8f47013c, 0x8f420110, 0x102842, 0x3c060020, 
-0x40f809, 0xafa80038, 0x3045ffff, 0x8fa80038, 
-0x50a00001, 0x3405ffff, 0x10000002, 0x37de0002, 
-0x2821, 0x32c20080, 0x1040007b, 0xa6a50010, 
-0x26430009, 0x3c02001f, 0x3442ffff, 0x43102b, 
-0x10400003, 0x0, 0x8f42013c, 0x621823, 
-0x90660000, 0x30c200ff, 0x38430006, 0x2c630001, 
-0x38420011, 0x2c420001, 0x621825, 0x1060006b, 
-0x24091000, 0x8821, 0x2602021, 0x94820000, 
-0x24840002, 0x2228821, 0x92102b, 0x1440fffb, 
-0x111c02, 0x3222ffff, 0x628821, 0x111c02, 
-0x3222ffff, 0x628821, 0x32c20200, 0x10400003, 
-0x26440006, 0x1000003e, 0x8021, 0x3c05001f, 
-0x34a5ffff, 0xa4102b, 0x10400003, 0x0, 
-0x8f42013c, 0x822023, 0x94820000, 0x30421fff, 
-0x10400004, 0x2644000c, 0x96420002, 0x10000030, 
-0x508023, 0x96420002, 0x26430014, 0x508023, 
-0x3c020020, 0x43102b, 0x1440000a, 0xd08021, 
-0x9642000c, 0x2028021, 0x9642000e, 0x96430010, 
-0x96440012, 0x2028021, 0x2038021, 0x10000020, 
-0x2048021, 0xa4102b, 0x10400003, 0x0, 
-0x8f42013c, 0x822023, 0x94820000, 0x24840002, 
-0x2028021, 0xa4102b, 0x10400003, 0x0, 
-0x8f42013c, 0x822023, 0x94820000, 0x24840002, 
-0x2028021, 0xa4102b, 0x10400003, 0x0, 
-0x8f42013c, 0x822023, 0x94820000, 0x24840002, 
-0x2028021, 0xa4102b, 0x10400003, 0x0, 
-0x8f42013c, 0x822023, 0x94820000, 0x2028021, 
-0x3c020100, 0x2c21024, 0x1040000c, 0x33c20004, 
-0x1040000a, 0x0, 0x9504000e, 0x2642021, 
-0xc003cc8, 0x2484fffc, 0x3042ffff, 0x2228821, 
-0x111c02, 0x3222ffff, 0x628821, 0x8faa002c, 
-0x1518823, 0x111402, 0x2228821, 0x2308821, 
-0x111402, 0x2228821, 0x3231ffff, 0x52200001, 
-0x3411ffff, 0x37de0001, 0x24091000, 0x33c20004, 
-0xa6b10012, 0x10400002, 0xa6be000e, 0x34098000, 
-0x8f480044, 0x8f440190, 0x8f450194, 0xafa90010, 
-0x8f490044, 0x84140, 0x1001821, 0xafa90014, 
-0x8f48000c, 0x2a03021, 0x24070020, 0xafa80018, 
-0x8f48010c, 0x1021, 0xa32821, 0xa3482b, 
-0x822021, 0x100f809, 0x892021, 0x1440000c, 
-0x0, 0x8f820128, 0x8faa0024, 0x3c040001, 
-0x24843944, 0xafaa0014, 0xafa20010, 0x8f860124, 
-0x8f870120, 0x3c050007, 0xc0029d3, 0x34a59920, 
-0x8f420358, 0x2442ffff, 0xaf420358, 0x8f420044, 
-0x8f430088, 0x24420001, 0x431024, 0xaf420044, 
-0x8faa0034, 0x8f440358, 0x24020001, 0x15420006, 
-0x24020002, 0x8f42034c, 0x2442ffff, 0xaf42034c, 
-0x10000049, 0x8f42034c, 0x15420006, 0x0, 
-0x8f420354, 0x2442ffff, 0xaf420354, 0x10000042, 
-0x8f420354, 0x8f420350, 0x2442ffff, 0xaf420350, 
-0x1000003d, 0x8f420350, 0x30621000, 0x10400005, 
-0x30628000, 0x8f420078, 0x24420001, 0x10000036, 
-0xaf420078, 0x10400034, 0x0, 0x8f420078, 
-0x24420001, 0xaf420078, 0x8c030240, 0x43102b, 
-0x1440002d, 0x24070008, 0x8f440158, 0x8f45015c, 
-0x8f430044, 0x8f48000c, 0x8f860120, 0x24020040, 
-0xafa20010, 0xafa30014, 0xafa80018, 0x8f42010c, 
-0x40f809, 0x24c6001c, 0x14400011, 0x24020001, 
-0x3c010001, 0x370821, 0xa02240f2, 0x8f820124, 
-0xafa20010, 0x8f820128, 0x3c040001, 0x248438c8, 
-0xafa20014, 0x8f460044, 0x8f870120, 0x3c050009, 
-0xc0029d3, 0x34a51300, 0x1000000b, 0x0, 
-0x8f4202f4, 0x24420001, 0xaf4202f4, 0x8f4202f4, 
-0x8f420044, 0xaf42007c, 0x3c010001, 0x370821, 
-0xa02040f2, 0xaf400078, 0x8f420308, 0x24420001, 
-0xaf420308, 0x8f420308, 0x8fbf0058, 0x8fbe0054, 
-0x8fb50050, 0x8fb3004c, 0x8fb20048, 0x8fb10044, 
-0x8fb00040, 0x3e00008, 0x27bd0060, 0x3e00008, 
-0x0, 0x0, 0x0, 0x8f420130, 
+0x8f4202f8, 0x24420001, 0xaf4202f8, 0x10000174, 
+0x8f4202f8, 0x30620002, 0x10400135, 0x3c020800, 
+0x8d0a001c, 0x1422024, 0xafaa0024, 0xa5702, 
+0xafaa0034, 0x8faa0024, 0x314affff, 0xafaa0024, 
+0x950a0016, 0xafaa002c, 0x8faa0034, 0x24020001, 
+0x15420007, 0x24020002, 0x8faa0024, 0xa1140, 
+0x3403ecc0, 0x431021, 0x10000014, 0x2e2a821, 
+0x15420006, 0x24020003, 0x8faa0024, 0xa1140, 
+0x24426cc0, 0x1000000d, 0x2e2a821, 0x8faa0034, 
+0x15420006, 0x0, 0x8faa0024, 0xa1140, 
+0x24424cc0, 0x10000005, 0x2e2a821, 0x8faa0024, 
+0xa1180, 0x571021, 0x24550ce0, 0x96a2000e, 
+0x305efffc, 0x30420400, 0x144000c5, 0x8821, 
+0x10800004, 0x24091000, 0x97b1002e, 0x100000c1, 
+0x0, 0x8eb30018, 0x9663000c, 0x2c6205dd, 
+0x10400015, 0x2021, 0x32c20800, 0x10400015, 
+0x24020800, 0x96630014, 0x14620012, 0x3402aaaa, 
+0x9663000e, 0x14620007, 0x2821, 0x96630010, 
+0x24020300, 0x14620004, 0xa01021, 0x96620012, 
+0x2c450001, 0xa01021, 0x54400006, 0x24040016, 
+0x10000004, 0x0, 0x24020800, 0x50620001, 
+0x2404000e, 0x108000a2, 0x2649021, 0x92420000, 
+0x3042000f, 0x28080, 0x32c20100, 0x1040001e, 
+0x2501821, 0x3c020020, 0x43102b, 0x1440000e, 
+0x2402021, 0x2821, 0x94820000, 0x24840002, 
+0xa22821, 0x83102b, 0x1440fffb, 0x30a2ffff, 
+0x51c02, 0x622821, 0x51c02, 0x30a2ffff, 
+0x10000009, 0x622821, 0x8f47013c, 0x8f420110, 
+0x102842, 0x3c060020, 0x40f809, 0xafa80038, 
+0x3045ffff, 0x8fa80038, 0x50a00001, 0x3405ffff, 
+0x10000002, 0x37de0002, 0x2821, 0x32c20080, 
+0x1040007b, 0xa6a50010, 0x26430009, 0x3c02001f, 
+0x3442ffff, 0x43102b, 0x10400003, 0x0, 
+0x8f42013c, 0x621823, 0x90660000, 0x30c200ff, 
+0x38430006, 0x2c630001, 0x38420011, 0x2c420001, 
+0x621825, 0x1060006b, 0x24091000, 0x8821, 
+0x2602021, 0x94820000, 0x24840002, 0x2228821, 
+0x92102b, 0x1440fffb, 0x111c02, 0x3222ffff, 
+0x628821, 0x111c02, 0x3222ffff, 0x628821, 
+0x32c20200, 0x10400003, 0x26440006, 0x1000003e, 
+0x8021, 0x3c05001f, 0x34a5ffff, 0xa4102b, 
+0x10400003, 0x0, 0x8f42013c, 0x822023, 
+0x94820000, 0x30421fff, 0x10400004, 0x2644000c, 
+0x96420002, 0x10000030, 0x508023, 0x96420002, 
+0x26430014, 0x508023, 0x3c020020, 0x43102b, 
+0x1440000a, 0xd08021, 0x9642000c, 0x2028021, 
+0x9642000e, 0x96430010, 0x96440012, 0x2028021, 
+0x2038021, 0x10000020, 0x2048021, 0xa4102b, 
+0x10400003, 0x0, 0x8f42013c, 0x822023, 
+0x94820000, 0x24840002, 0x2028021, 0xa4102b, 
+0x10400003, 0x0, 0x8f42013c, 0x822023, 
+0x94820000, 0x24840002, 0x2028021, 0xa4102b, 
+0x10400003, 0x0, 0x8f42013c, 0x822023, 
+0x94820000, 0x24840002, 0x2028021, 0xa4102b, 
+0x10400003, 0x0, 0x8f42013c, 0x822023, 
+0x94820000, 0x2028021, 0x3c020100, 0x2c21024, 
+0x1040000c, 0x33c20004, 0x1040000a, 0x0, 
+0x9504000e, 0x2642021, 0xc003cf8, 0x2484fffc, 
+0x3042ffff, 0x2228821, 0x111c02, 0x3222ffff, 
+0x628821, 0x8faa002c, 0x1518823, 0x111402, 
+0x2228821, 0x2308821, 0x111402, 0x2228821, 
+0x3231ffff, 0x52200001, 0x3411ffff, 0x37de0001, 
+0x24091000, 0x33c20004, 0xa6b10012, 0x10400002, 
+0xa6be000e, 0x34098000, 0x8f480044, 0x8f440190, 
+0x8f450194, 0xafa90010, 0x8f490044, 0x84140, 
+0x1001821, 0xafa90014, 0x8f48000c, 0x2a03021, 
+0x24070020, 0xafa80018, 0x8f48010c, 0x1021, 
+0xa32821, 0xa3482b, 0x822021, 0x100f809, 
+0x892021, 0x1440000c, 0x0, 0x8f820128, 
+0x8faa0024, 0x3c040001, 0x24843a28, 0xafaa0014, 
+0xafa20010, 0x8f860124, 0x8f870120, 0x3c050007, 
+0xc002a03, 0x34a59920, 0x8f420358, 0x2442ffff, 
+0xaf420358, 0x8f420044, 0x8f430088, 0x24420001, 
+0x431024, 0xaf420044, 0x8faa0034, 0x8f440358, 
+0x24020001, 0x15420006, 0x24020002, 0x8f42034c, 
+0x2442ffff, 0xaf42034c, 0x10000049, 0x8f42034c, 
+0x15420006, 0x0, 0x8f420354, 0x2442ffff, 
+0xaf420354, 0x10000042, 0x8f420354, 0x8f420350, 
+0x2442ffff, 0xaf420350, 0x1000003d, 0x8f420350, 
+0x30621000, 0x10400005, 0x30628000, 0x8f420078, 
+0x24420001, 0x10000036, 0xaf420078, 0x10400034, 
+0x0, 0x8f420078, 0x24420001, 0xaf420078, 
+0x8c030240, 0x43102b, 0x1440002d, 0x24070008, 
+0x8f440158, 0x8f45015c, 0x8f430044, 0x8f48000c, 
+0x8f860120, 0x24020040, 0xafa20010, 0xafa30014, 
+0xafa80018, 0x8f42010c, 0x40f809, 0x24c6001c, 
+0x14400011, 0x24020001, 0x3c010001, 0x370821, 
+0xa02240f2, 0x8f820124, 0xafa20010, 0x8f820128, 
+0x3c040001, 0x248439ac, 0xafa20014, 0x8f460044, 
+0x8f870120, 0x3c050009, 0xc002a03, 0x34a51300, 
+0x1000000b, 0x0, 0x8f4202f4, 0x24420001, 
+0xaf4202f4, 0x8f4202f4, 0x8f420044, 0xaf42007c, 
+0x3c010001, 0x370821, 0xa02040f2, 0xaf400078, 
+0x8f420308, 0x24420001, 0xaf420308, 0x8f420308, 
+0x8fbf0058, 0x8fbe0054, 0x8fb50050, 0x8fb3004c, 
+0x8fb20048, 0x8fb10044, 0x8fb00040, 0x3e00008, 
+0x27bd0060, 0x3e00008, 0x0, 0x8f420130, 
 0xaf8200c0, 0x8f420130, 0xaf8200c4, 0x8f420130, 
 0xaf8200c8, 0x8f42012c, 0xaf8200d0, 0x8f42012c, 
 0xaf8200d4, 0x8f42012c, 0x3e00008, 0xaf8200d8, 
 0x27bdffe0, 0x27840208, 0x24050200, 0xafbf0018, 
-0xc002a57, 0x24060008, 0x8c020204, 0xc003dee, 
+0xc002a87, 0x24060008, 0x8c020204, 0xc003e1e, 
 0xaf820210, 0x2021, 0x8c060248, 0x24020004, 
-0x3c010001, 0xac223d18, 0xc004878, 0x24050004, 
-0x3c020001, 0x8c423d14, 0x30420001, 0x10400007, 
-0x24020001, 0x3c010001, 0xac223d18, 0x2021, 
-0x24050001, 0xc004878, 0x3c06601b, 0x3c040001, 
-0x24843a00, 0x8f420144, 0x8f430148, 0x3c050008, 
+0x3c010001, 0xac223e28, 0xc0048a8, 0x24050004, 
+0x3c020001, 0x8c423e24, 0x30420001, 0x10400007, 
+0x24020001, 0x3c010001, 0xac223e28, 0x2021, 
+0x24050001, 0xc0048a8, 0x3c06601b, 0x3c040001, 
+0x24843af0, 0x8f420144, 0x8f430148, 0x3c050008, 
 0x8f46014c, 0x21640, 0x31940, 0x34630403, 
 0x431025, 0x633c0, 0x461025, 0xaf82021c, 
 0xafa00010, 0xafa00014, 0x8f86021c, 0x34a50200, 
-0xc0029d3, 0x3821, 0x3c010001, 0xac203d10, 
-0x3c010001, 0xac203d28, 0x8fbf0018, 0x3e00008, 
+0xc002a03, 0x3821, 0x3c010001, 0xac203e20, 
+0x3c010001, 0xac203e38, 0x8fbf0018, 0x3e00008, 
 0x27bd0020, 0x27bdffe0, 0x3c050008, 0x34a50300, 
 0xafbf0018, 0xafa00010, 0xafa00014, 0x8f860200, 
-0x3c040001, 0x24843a0c, 0xc0029d3, 0x3821, 
+0x3c040001, 0x24843afc, 0xc002a03, 0x3821, 
 0x8f420400, 0x24420001, 0xaf420400, 0x8f420400, 
 0x8fbf0018, 0x3e00008, 0x27bd0020, 0x27bdffd8, 
 0xafbf0020, 0xafb1001c, 0xafb00018, 0x8f420394, 
 0x24420001, 0xaf420394, 0x8f420394, 0x8f900220, 
-0x8f4303a8, 0x3c020001, 0x8c423d28, 0x3c040001, 
-0x24843a18, 0x3c050008, 0xafa20014, 0xafa30010, 
-0x8f4703ac, 0x34a50400, 0xc0029d3, 0x2003021, 
+0x8f4303a8, 0x3c020001, 0x8c423e38, 0x3c040001, 
+0x24843b08, 0x3c050008, 0xafa20014, 0xafa30010, 
+0x8f4703ac, 0x34a50400, 0xc002a03, 0x2003021, 
 0x3c024000, 0x2021024, 0x104000e1, 0x3c040100, 
 0x8f4203ac, 0x24420001, 0xaf4203ac, 0x8f4203ac, 
 0x8f820220, 0x3c0308ff, 0x3463ffff, 0x431024, 
@@ -7243,83 +7258,81 @@
 0x8f42013c, 0x822021, 0x8f420140, 0x2c830001, 
 0x44102b, 0x431025, 0x50400008, 0x3c02fdff, 
 0x8f820220, 0x3c0308ff, 0x3463fffb, 0x431024, 
-0x3c034000, 0x10000046, 0x431025, 0x3442ffff, 
+0x3c034000, 0x10000041, 0x431025, 0x3442ffff, 
 0x8f4303bc, 0x282a024, 0x24020001, 0xa34205b1, 
-0x24630001, 0xaf4303bc, 0x1000003e, 0x8f4203bc, 
-0x2041024, 0x10400013, 0x3c110200, 0x8f420398, 
+0x24630001, 0xaf4303bc, 0x10000039, 0x8f4203bc, 
+0x2041024, 0x1040000e, 0x3c110200, 0x8f420398, 
 0x24420001, 0xaf420398, 0x8f420398, 0x8f820220, 
 0x3c0308ff, 0x3463ffff, 0x431024, 0x441025, 
-0xaf820220, 0x3c020004, 0x2021024, 0x14400005, 
-0x3c110200, 0xc003bad, 0x0, 0x10000029, 
-0x0, 0x2111024, 0x50400008, 0x3c110400, 
-0x8f42039c, 0x24420001, 0xaf42039c, 0xc003bad, 
-0x8f42039c, 0x10000019, 0x0, 0x2111024, 
-0x1040001c, 0x0, 0x8f830224, 0x24021402, 
-0x14620009, 0x3c050008, 0x3c040001, 0x24843a24, 
-0xafa00010, 0xafa00014, 0x8f860224, 0x34a50500, 
-0xc0029d3, 0x3821, 0x8f4203a0, 0x24420001, 
-0xaf4203a0, 0x8f4203a0, 0x8f820220, 0x2002021, 
-0x34420002, 0xc004610, 0xaf820220, 0x8f820220, 
-0x3c0308ff, 0x3463ffff, 0x431024, 0x511025, 
-0xaf820220, 0x8fbf0020, 0x8fb1001c, 0x8fb00018, 
-0x3e00008, 0x27bd0028, 0x3e00008, 0x0, 
-0x3c020001, 0x8c423d28, 0x27bdffb0, 0xafbf0048, 
-0xafbe0044, 0xafb50040, 0xafb3003c, 0xafb20038, 
-0xafb10034, 0x1040000f, 0xafb00030, 0x3c040001, 
-0x24843a30, 0x3c050008, 0xafa00010, 0xafa00014, 
-0x8f860220, 0x34a50600, 0x24020001, 0x3c010001, 
-0xac203d28, 0x3c010001, 0xac223d1c, 0xc0029d3, 
-0x3821, 0x3c037fff, 0x8c020268, 0x3463ffff, 
-0x3c04fdff, 0x431024, 0xac020268, 0x8f420004, 
-0x3484ffff, 0x30420002, 0x10400092, 0x284a024, 
-0x3c040600, 0x34842000, 0x8f420004, 0x2821, 
-0x2403fffd, 0x431024, 0xaf420004, 0xafa40020, 
-0x8f5e0018, 0x27aa0020, 0x240200ff, 0x13c20002, 
-0xafaa002c, 0x27c50001, 0x8c020228, 0xa09021, 
-0x1642000e, 0x1e38c0, 0x8f42032c, 0x24420001, 
-0xaf42032c, 0x8f42032c, 0x8c020228, 0x3c040001, 
-0x248439c8, 0x3c050009, 0xafa00014, 0xafa20010, 
-0x8fa60020, 0x1000006d, 0x34a50500, 0xf71021, 
-0x8fa30020, 0x8fa40024, 0xac4304c0, 0xac4404c4, 
-0x8f830054, 0x8f820054, 0x247003e8, 0x2021023, 
-0x2c4203e9, 0x1040001b, 0x9821, 0xe08821, 
-0x263504c0, 0x8f440168, 0x8f45016c, 0x2201821, 
-0x240a0004, 0xafaa0010, 0xafb20014, 0x8f48000c, 
-0x1021, 0x2f53021, 0xafa80018, 0x8f48010c, 
-0x24070008, 0xa32821, 0xa3482b, 0x822021, 
-0x100f809, 0x892021, 0x54400006, 0x24130001, 
-0x8f820054, 0x2021023, 0x2c4203e9, 0x1440ffe9, 
-0x0, 0x326200ff, 0x54400017, 0xaf520018, 
+0xc003be0, 0xaf820220, 0x10000029, 0x0, 
+0x2111024, 0x50400008, 0x3c110400, 0x8f42039c, 
+0x24420001, 0xaf42039c, 0xc003be0, 0x8f42039c, 
+0x10000019, 0x0, 0x2111024, 0x1040001c, 
+0x0, 0x8f830224, 0x24021402, 0x14620009, 
+0x3c050008, 0x3c040001, 0x24843b14, 0xafa00010, 
+0xafa00014, 0x8f860224, 0x34a50500, 0xc002a03, 
+0x3821, 0x8f4203a0, 0x24420001, 0xaf4203a0, 
+0x8f4203a0, 0x8f820220, 0x2002021, 0x34420002, 
+0xc004640, 0xaf820220, 0x8f820220, 0x3c0308ff, 
+0x3463ffff, 0x431024, 0x511025, 0xaf820220, 
+0x8fbf0020, 0x8fb1001c, 0x8fb00018, 0x3e00008, 
+0x27bd0028, 0x3e00008, 0x0, 0x3c020001, 
+0x8c423e38, 0x27bdffb0, 0xafbf0048, 0xafbe0044, 
+0xafb50040, 0xafb3003c, 0xafb20038, 0xafb10034, 
+0x1040000f, 0xafb00030, 0x3c040001, 0x24843b20, 
+0x3c050008, 0xafa00010, 0xafa00014, 0x8f860220, 
+0x34a50600, 0x24020001, 0x3c010001, 0xac203e38, 
+0x3c010001, 0xac223e2c, 0xc002a03, 0x3821, 
+0x3c037fff, 0x8c020268, 0x3463ffff, 0x3c04fdff, 
+0x431024, 0xac020268, 0x8f420004, 0x3484ffff, 
+0x30420002, 0x10400092, 0x284a024, 0x3c040600, 
+0x34842000, 0x8f420004, 0x2821, 0x2403fffd, 
+0x431024, 0xaf420004, 0xafa40020, 0x8f5e0018, 
+0x27aa0020, 0x240200ff, 0x13c20002, 0xafaa002c, 
+0x27c50001, 0x8c020228, 0xa09021, 0x1642000e, 
+0x1e38c0, 0x8f42032c, 0x24420001, 0xaf42032c, 
+0x8f42032c, 0x8c020228, 0x3c040001, 0x24843ab8, 
+0x3c050009, 0xafa00014, 0xafa20010, 0x8fa60020, 
+0x1000006d, 0x34a50500, 0xf71021, 0x8fa30020, 
+0x8fa40024, 0xac4304c0, 0xac4404c4, 0x8f830054, 
+0x8f820054, 0x247003e8, 0x2021023, 0x2c4203e9, 
+0x1040001b, 0x9821, 0xe08821, 0x263504c0, 
+0x8f440168, 0x8f45016c, 0x2201821, 0x240a0004, 
+0xafaa0010, 0xafb20014, 0x8f48000c, 0x1021, 
+0x2f53021, 0xafa80018, 0x8f48010c, 0x24070008, 
+0xa32821, 0xa3482b, 0x822021, 0x100f809, 
+0x892021, 0x54400006, 0x24130001, 0x8f820054, 
+0x2021023, 0x2c4203e9, 0x1440ffe9, 0x0, 
+0x326200ff, 0x54400017, 0xaf520018, 0x8f420368, 
+0x24420001, 0xaf420368, 0x8f420368, 0x8f820120, 
+0x8faa002c, 0xafa20010, 0x8f820124, 0x3c040001, 
+0x24843ac4, 0x3c050009, 0xafa20014, 0x8d460000, 
+0x10000035, 0x34a50600, 0x8f4202f8, 0x24130001, 
+0x24420001, 0xaf4202f8, 0x8f4202f8, 0x1000001e, 
+0x326200ff, 0x8f830054, 0x8f820054, 0x247003e8, 
+0x2021023, 0x2c4203e9, 0x10400016, 0x9821, 
+0x3c150020, 0x24110010, 0x8f42000c, 0x8f440150, 
+0x8f450154, 0x8f860120, 0xafb10010, 0xafb20014, 
+0x551025, 0xafa20018, 0x8f42010c, 0x24070008, 
+0x40f809, 0x24c6001c, 0x1440ffe3, 0x0, 
+0x8f820054, 0x2021023, 0x2c4203e9, 0x1440ffee, 
+0x0, 0x326200ff, 0x14400011, 0x0, 
 0x8f420368, 0x24420001, 0xaf420368, 0x8f420368, 
 0x8f820120, 0x8faa002c, 0xafa20010, 0x8f820124, 
-0x3c040001, 0x248439d4, 0x3c050009, 0xafa20014, 
-0x8d460000, 0x10000035, 0x34a50600, 0x8f4202f8, 
-0x24130001, 0x24420001, 0xaf4202f8, 0x8f4202f8, 
-0x1000001e, 0x326200ff, 0x8f830054, 0x8f820054, 
-0x247003e8, 0x2021023, 0x2c4203e9, 0x10400016, 
-0x9821, 0x3c150020, 0x24110010, 0x8f42000c, 
-0x8f440150, 0x8f450154, 0x8f860120, 0xafb10010, 
-0xafb20014, 0x551025, 0xafa20018, 0x8f42010c, 
-0x24070008, 0x40f809, 0x24c6001c, 0x1440ffe3, 
-0x0, 0x8f820054, 0x2021023, 0x2c4203e9, 
-0x1440ffee, 0x0, 0x326200ff, 0x14400011, 
-0x0, 0x8f420368, 0x24420001, 0xaf420368, 
-0x8f420368, 0x8f820120, 0x8faa002c, 0xafa20010, 
-0x8f820124, 0x3c040001, 0x248439dc, 0x3c050009, 
-0xafa20014, 0x8d460000, 0x34a50700, 0xc0029d3, 
-0x3c03821, 0x8f4202dc, 0x24420001, 0xaf4202dc, 
-0x8f4202dc, 0x8fbf0048, 0x8fbe0044, 0x8fb50040, 
-0x8fb3003c, 0x8fb20038, 0x8fb10034, 0x8fb00030, 
-0x3e00008, 0x27bd0050, 0x3c020001, 0x8c423d28, 
-0x27bdffe0, 0x1440000d, 0xafbf0018, 0x3c040001, 
-0x24843a3c, 0x3c050008, 0xafa00010, 0xafa00014, 
-0x8f860220, 0x34a50700, 0x24020001, 0x3c010001, 
-0xac223d28, 0xc0029d3, 0x3821, 0x3c020004, 
-0x2c21024, 0x10400008, 0x2021, 0x8f820220, 
-0x3c0308ff, 0x3463ffff, 0x431024, 0x34420008, 
-0xaf820220, 0x2021, 0xc004981, 0x24050004, 
-0xac020268, 0x8fbf0018, 0x3e00008, 0x27bd0020, 
-0x0, 0x0, 0x0, 0x86102b, 
+0x3c040001, 0x24843acc, 0x3c050009, 0xafa20014, 
+0x8d460000, 0x34a50700, 0xc002a03, 0x3c03821, 
+0x8f4202dc, 0x24420001, 0xaf4202dc, 0x8f4202dc, 
+0x8fbf0048, 0x8fbe0044, 0x8fb50040, 0x8fb3003c, 
+0x8fb20038, 0x8fb10034, 0x8fb00030, 0x3e00008, 
+0x27bd0050, 0x3c020001, 0x8c423e38, 0x27bdffe0, 
+0x1440000d, 0xafbf0018, 0x3c040001, 0x24843b2c, 
+0x3c050008, 0xafa00010, 0xafa00014, 0x8f860220, 
+0x34a50700, 0x24020001, 0x3c010001, 0xac223e38, 
+0xc002a03, 0x3821, 0x3c020004, 0x2c21024, 
+0x10400008, 0x2021, 0x8f820220, 0x3c0308ff, 
+0x3463ffff, 0x431024, 0x34420008, 0xaf820220, 
+0x2021, 0xc0049b1, 0x24050004, 0xac020268, 
+0x8fbf0018, 0x3e00008, 0x27bd0020, 0x86102b, 
 0x50400001, 0x872023, 0xc41023, 0x24843, 
 0x125102b, 0x1040001b, 0x91040, 0x824021, 
 0x88102b, 0x10400007, 0x1821, 0x94820000, 
@@ -7359,7 +7372,7 @@
 0x90a20000, 0x822021, 0x41c02, 0x3082ffff, 
 0x622021, 0x41c02, 0x3082ffff, 0x622021, 
 0x3e00008, 0x3082ffff, 0x0, 0x8f820220, 
-0x34420002, 0xaf820220, 0x3c020001, 0x8c425f28, 
+0x34420002, 0xaf820220, 0x3c020001, 0x8c426038, 
 0x30424000, 0x10400054, 0x24040001, 0x8f820200, 
 0x24067fff, 0x8f830200, 0x30450002, 0x2402fffd, 
 0x621824, 0xaf830200, 0xaf840204, 0x8f830054, 
@@ -7406,43 +7419,43 @@
 0x43102b, 0x14400006, 0x3c026000, 0x3c024000, 
 0x10620008, 0x24020800, 0x10000008, 0x0, 
 0x10620004, 0x24020800, 0x10000004, 0x0, 
-0x24020700, 0x3c010001, 0xac223d2c, 0x3e00008, 
+0x24020700, 0x3c010001, 0xac223e3c, 0x3e00008, 
 0x0, 0x27bdffc8, 0xafbf0034, 0xafb20030, 
-0xafb1002c, 0xafb00028, 0x3c010001, 0xc0045ed, 
-0xac203d14, 0x24040001, 0x2821, 0x27a60020, 
-0x34028000, 0xc00420a, 0xa7a20020, 0x8f830054, 
+0xafb1002c, 0xafb00028, 0x3c010001, 0xc00461d, 
+0xac203e24, 0x24040001, 0x2821, 0x27a60020, 
+0x34028000, 0xc00423a, 0xa7a20020, 0x8f830054, 
 0x8f820054, 0x10000002, 0x24630064, 0x8f820054, 
 0x621023, 0x2c420065, 0x1440fffc, 0x24040001, 
-0x24050001, 0xc0041c8, 0x27a60020, 0x8f830054, 
+0x24050001, 0xc0041f8, 0x27a60020, 0x8f830054, 
 0x8f820054, 0x10000002, 0x24630064, 0x8f820054, 
 0x621023, 0x2c420065, 0x1440fffc, 0x24040001, 
-0x24050001, 0xc0041c8, 0x27a60020, 0x8f830054, 
+0x24050001, 0xc0041f8, 0x27a60020, 0x8f830054, 
 0x8f820054, 0x10000002, 0x24630064, 0x8f820054, 
 0x621023, 0x2c420065, 0x1440fffc, 0x24040001, 
-0x24050002, 0xc0041c8, 0x27a60018, 0x8f830054, 
+0x24050002, 0xc0041f8, 0x27a60018, 0x8f830054, 
 0x8f820054, 0x10000002, 0x24630064, 0x8f820054, 
 0x621023, 0x2c420065, 0x1440fffc, 0x24040001, 
-0x24050003, 0xc0041c8, 0x27a6001a, 0x97a20020, 
-0x10400029, 0x24020001, 0x3c020001, 0x8c423d14, 
-0x97a30018, 0x34420001, 0x3c010001, 0xac223d14, 
+0x24050003, 0xc0041f8, 0x27a6001a, 0x97a20020, 
+0x10400029, 0x24020001, 0x3c020001, 0x8c423e24, 
+0x97a30018, 0x34420001, 0x3c010001, 0xac223e24, 
 0x24020015, 0x14620009, 0x0, 0x97a2001a, 
 0x3843f423, 0x2c630001, 0x3842f430, 0x2c420001, 
 0x621825, 0x14600018, 0x24020003, 0x97a30018, 
 0x24027810, 0x14620014, 0x24020002, 0x97a3001a, 
 0x24020001, 0x14620010, 0x24020002, 0x1000000e, 
-0x24020004, 0x3c020001, 0x8c423d14, 0x34420008, 
-0x3c010001, 0xac223d14, 0x10000058, 0x24020004, 
-0x3c020001, 0x8c423d14, 0x34420004, 0x3c010001, 
-0x100000a9, 0xac223d14, 0x3c010001, 0xac223e70, 
+0x24020004, 0x3c020001, 0x8c423e24, 0x34420008, 
+0x3c010001, 0xac223e24, 0x10000058, 0x24020004, 
+0x3c020001, 0x8c423e24, 0x34420004, 0x3c010001, 
+0x100000a9, 0xac223e24, 0x3c010001, 0xac223f80, 
 0x24020e00, 0xaf820238, 0x8f840054, 0x8f820054, 
-0x24030008, 0x3c010001, 0xac233d18, 0x10000002, 
+0x24030008, 0x3c010001, 0xac233e28, 0x10000002, 
 0x248401f4, 0x8f820054, 0x821023, 0x2c4201f5, 
 0x1440fffc, 0x3c0200c8, 0x344201fb, 0xaf820238, 
 0x8f830054, 0x8f820054, 0x10000002, 0x246301f4, 
 0x8f820054, 0x621023, 0x2c4201f5, 0x1440fffc, 
-0x8021, 0x24120001, 0x24110009, 0xc0040e8, 
-0x0, 0x3c010001, 0xac323d30, 0xc004194, 
-0x0, 0x3c020001, 0x8c423d30, 0x1451fffb, 
+0x8021, 0x24120001, 0x24110009, 0xc004118, 
+0x0, 0x3c010001, 0xac323e40, 0xc0041c4, 
+0x0, 0x3c020001, 0x8c423e40, 0x1451fffb, 
 0x3c0200c8, 0x344201f6, 0xaf820238, 0x8f830054, 
 0x8f820054, 0x10000002, 0x2463000a, 0x8f820054, 
 0x621023, 0x2c42000b, 0x1440fffc, 0x0, 
@@ -7454,10 +7467,10 @@
 0x14440005, 0x34028000, 0x42040, 0xa4102b, 
 0x1040fff0, 0x34028000, 0x1082ffa6, 0x26100001, 
 0x2e020014, 0x1440ffcd, 0x24020004, 0x3c010001, 
-0xac223d18, 0x8021, 0x24120009, 0x3c11ffff, 
-0x36313f7f, 0xc0040e8, 0x0, 0x24020001, 
-0x3c010001, 0xac223d30, 0xc004194, 0x0, 
-0x3c020001, 0x8c423d30, 0x1452fffb, 0x0, 
+0xac223e28, 0x8021, 0x24120009, 0x3c11ffff, 
+0x36313f7f, 0xc004118, 0x0, 0x24020001, 
+0x3c010001, 0xac223e40, 0xc0041c4, 0x0, 
+0x3c020001, 0x8c423e40, 0x1452fffb, 0x0, 
 0x8f820044, 0x511024, 0x34425080, 0xaf820044, 
 0x8f830054, 0x8f820054, 0x10000002, 0x2463000a, 
 0x8f820054, 0x621023, 0x2c42000b, 0x1440fffc, 
@@ -7475,131 +7488,131 @@
 0x1440fffc, 0x0, 0x8f820224, 0x14440005, 
 0x34028000, 0x42040, 0xa4102b, 0x1040fff0, 
 0x34028000, 0x1082ff56, 0x26100001, 0x2e020064, 
-0x1440ffb0, 0x0, 0x3c020001, 0x8c423d14, 
+0x1440ffb0, 0x0, 0x3c020001, 0x8c423e24, 
 0x30420004, 0x14400007, 0x3c08fff0, 0x8f820044, 
 0x3c03ffff, 0x34633f7f, 0x431024, 0xaf820044, 
 0x3c08fff0, 0x3508bdc0, 0x8f830054, 0x97a60018, 
-0x3c070001, 0x8ce73e70, 0x3c040001, 0x24843b00, 
-0x24020001, 0x3c010001, 0xac223d1c, 0xafa60010, 
-0x3c060001, 0x8cc63d14, 0x97a2001a, 0x3c05000d, 
-0x34a50100, 0x3c010001, 0xac203d18, 0x681821, 
-0x3c010001, 0xac233e68, 0xc0029d3, 0xafa20014, 
+0x3c070001, 0x8ce73f80, 0x3c040001, 0x24843c00, 
+0x24020001, 0x3c010001, 0xac223e2c, 0xafa60010, 
+0x3c060001, 0x8cc63e24, 0x97a2001a, 0x3c05000d, 
+0x34a50100, 0x3c010001, 0xac203e28, 0x681821, 
+0x3c010001, 0xac233f78, 0xc002a03, 0xafa20014, 
 0x8fbf0034, 0x8fb20030, 0x8fb1002c, 0x8fb00028, 
 0x3e00008, 0x27bd0038, 0x27bdffe8, 0x24070004, 
-0x3c040001, 0x8c843d18, 0x3021, 0x24020001, 
-0x1482000a, 0xafbf0010, 0x3c020001, 0x8c425f2c, 
+0x3c040001, 0x8c843e28, 0x3021, 0x24020001, 
+0x1482000a, 0xafbf0010, 0x3c020001, 0x8c42603c, 
 0x3c050004, 0x30428000, 0x1040000c, 0x34a593e0, 
 0x3c05000f, 0x10000009, 0x34a54240, 0x3c020001, 
-0x8c425f2c, 0x3c05000f, 0x30428000, 0x10400003, 
+0x8c42603c, 0x3c05000f, 0x30428000, 0x10400003, 
 0x34a54240, 0x3c05001e, 0x34a58480, 0x3c020001, 
-0x8c423e68, 0x8f830054, 0x451021, 0x431023, 
+0x8c423f78, 0x8f830054, 0x451021, 0x431023, 
 0x45102b, 0x1440002e, 0x0, 0x3c020001, 
-0x8c423d20, 0x1440002a, 0x2cc20001, 0x7182b, 
+0x8c423e30, 0x1440002a, 0x2cc20001, 0x7182b, 
 0x431024, 0x1040001d, 0x0, 0x3c090001, 
-0x8d293d14, 0x240b0001, 0x3c054000, 0x3c080001, 
-0x25085f2c, 0x250afffc, 0x42042, 0x14800002, 
+0x8d293e24, 0x240b0001, 0x3c054000, 0x3c080001, 
+0x2508603c, 0x250afffc, 0x42042, 0x14800002, 
 0x24e7ffff, 0x24040008, 0x891024, 0x5040000b, 
 0x2cc20001, 0x148b0004, 0x0, 0x8d020000, 
 0x10000003, 0x451024, 0x8d420000, 0x451024, 
 0x54400001, 0x24060001, 0x2cc20001, 0x7182b, 
 0x431024, 0x5440ffed, 0x42042, 0x3c010001, 
-0x10c00020, 0xac243d18, 0x8f830054, 0x24020001, 
-0x3c010001, 0xac223d1c, 0x3c010001, 0xac233e68, 
-0x3c020001, 0x8c423d1c, 0x10400004, 0x24020001, 
-0x3c010001, 0xac203d1c, 0xaee204b8, 0x8ee304b8, 
-0x24020008, 0x10620005, 0x24020001, 0xc003f91, 
+0x10c00020, 0xac243e28, 0x8f830054, 0x24020001, 
+0x3c010001, 0xac223e2c, 0x3c010001, 0xac233f78, 
+0x3c020001, 0x8c423e2c, 0x10400004, 0x24020001, 
+0x3c010001, 0xac203e2c, 0xaee204b8, 0x8ee304b8, 
+0x24020008, 0x10620005, 0x24020001, 0xc003fc1, 
 0x0, 0x1000000b, 0x0, 0x3c030001, 
-0x8c633d18, 0x10620007, 0x2402000e, 0x3c030001, 
-0x8c635ec0, 0x10620003, 0x0, 0xc004610, 
+0x8c633e28, 0x10620007, 0x2402000e, 0x3c030001, 
+0x8c635fd0, 0x10620003, 0x0, 0xc004640, 
 0x8f840220, 0x8fbf0010, 0x3e00008, 0x27bd0018, 
-0x27bdffe0, 0x3c03fdff, 0x3c040001, 0x8c843d18, 
-0x3c020001, 0x8c423d38, 0x3463ffff, 0x283a024, 
+0x27bdffe0, 0x3c03fdff, 0x3c040001, 0x8c843e28, 
+0x3c020001, 0x8c423e48, 0x3463ffff, 0x283a024, 
 0x14820006, 0xafbf0018, 0x8ee304b8, 0x3c020001, 
-0x8c423d3c, 0x10620006, 0x0, 0x8ee204b8, 
-0x3c010001, 0xac243d38, 0x3c010001, 0xac223d3c, 
-0x3c030001, 0x8c633d18, 0x24020002, 0x1062013c, 
+0x8c423e4c, 0x10620006, 0x0, 0x8ee204b8, 
+0x3c010001, 0xac243e48, 0x3c010001, 0xac223e4c, 
+0x3c030001, 0x8c633e28, 0x24020002, 0x1062013c, 
 0x2c620003, 0x10400005, 0x24020001, 0x1062000a, 
 0x0, 0x10000134, 0x0, 0x24020004, 
 0x1062006d, 0x24020008, 0x1062009f, 0x24020001, 
 0x1000012d, 0x0, 0x8ee204b8, 0x2443ffff, 
 0x2c620008, 0x1040012a, 0x31080, 0x3c010001, 
-0x220821, 0x8c223b18, 0x400008, 0x0, 
-0xc0040e8, 0x0, 0x3c020001, 0x8c423d24, 
-0x3c010001, 0xac203cb0, 0x104000d7, 0x24020002, 
-0xaee204b8, 0x3c010001, 0x10000119, 0xac203d24, 
-0xc00424b, 0x0, 0x3c030001, 0x8c633d40, 
-0x1000009e, 0x24020011, 0x3c050001, 0x8ca53d18, 
-0x3c060001, 0x8cc65f2c, 0xc004878, 0x2021, 
-0x24020005, 0x3c010001, 0xac203d24, 0x10000108, 
-0xaee204b8, 0x3c040001, 0x24843b0c, 0x3c05000f, 
+0x220821, 0x8c223c18, 0x400008, 0x0, 
+0xc004118, 0x0, 0x3c020001, 0x8c423e34, 
+0x3c010001, 0xac203dc0, 0x104000d7, 0x24020002, 
+0xaee204b8, 0x3c010001, 0x10000119, 0xac203e34, 
+0xc00427b, 0x0, 0x3c030001, 0x8c633e50, 
+0x1000009e, 0x24020011, 0x3c050001, 0x8ca53e28, 
+0x3c060001, 0x8cc6603c, 0xc0048a8, 0x2021, 
+0x24020005, 0x3c010001, 0xac203e34, 0x10000108, 
+0xaee204b8, 0x3c040001, 0x24843c0c, 0x3c05000f, 
 0x34a50100, 0x3021, 0x3821, 0xafa00010, 
-0xc0029d3, 0xafa00014, 0x100000fd, 0x0, 
+0xc002a03, 0xafa00014, 0x100000fd, 0x0, 
 0x8f820220, 0x3c03f700, 0x431025, 0x100000a4, 
 0xaf820220, 0x8f820220, 0x3c030004, 0x431024, 
 0x144000ae, 0x24020007, 0x8f830054, 0x3c020001, 
-0x8c423e60, 0x2463d8f0, 0x431023, 0x2c422710, 
+0x8c423f70, 0x2463d8f0, 0x431023, 0x2c422710, 
 0x144000eb, 0x24020001, 0x100000e7, 0x0, 
-0x3c050001, 0x8ca53d18, 0xc004981, 0x2021, 
-0xc004a4c, 0x2021, 0x3c030001, 0x8c635f24, 
+0x3c050001, 0x8ca53e28, 0xc0049b1, 0x2021, 
+0xc004a7c, 0x2021, 0x3c030001, 0x8c636034, 
 0x46100dd, 0x24020001, 0x3c020008, 0x621024, 
 0x10400006, 0x0, 0x8f820214, 0x3c03ffff, 
 0x431024, 0x10000005, 0x3442251f, 0x8f820214, 
 0x3c03ffff, 0x431024, 0x3442241f, 0xaf820214, 
 0x8f820220, 0x3c030200, 0x283a025, 0x34420002, 
-0xaf820220, 0x24020008, 0xc003c6b, 0xaee204b8, 
+0xaf820220, 0x24020008, 0xc003c9e, 0xaee204b8, 
 0x100000c7, 0x0, 0x8ee204b8, 0x2443ffff, 
 0x2c620008, 0x104000c2, 0x31080, 0x3c010001, 
-0x220821, 0x8c223b38, 0x400008, 0x0, 
-0x3c020001, 0x8c425f28, 0x30424000, 0x10400004, 
+0x220821, 0x8c223c38, 0x400008, 0x0, 
+0x3c020001, 0x8c426038, 0x30424000, 0x10400004, 
 0x0, 0x8f820044, 0x10000006, 0x3442f080, 
 0x8f820044, 0x3c03ffff, 0x34633f7f, 0x431024, 
 0x3442a080, 0xaf820044, 0x8f830054, 0x1000005a, 
-0x24020004, 0xc003d2c, 0x0, 0x104000a6, 
+0x24020004, 0xc003d5c, 0x0, 0x104000a6, 
 0x24020001, 0x8f820214, 0x3c03ffff, 0x3c040001, 
-0x8c843e58, 0x431024, 0x3442251f, 0xaf820214, 
+0x8c843f68, 0x431024, 0x3442251f, 0xaf820214, 
 0x24020008, 0x10800005, 0xaee204b8, 0x3c020001, 
-0x8c423da4, 0x1040006d, 0x24020001, 0x8f820220, 
+0x8c423eb4, 0x1040006d, 0x24020001, 0x8f820220, 
 0x3c030008, 0x431024, 0x10400073, 0x3c020200, 
 0x10000081, 0x0, 0x8ee204b8, 0x2443ffff, 
 0x2c620007, 0x1040008e, 0x31080, 0x3c010001, 
-0x220821, 0x8c223b58, 0x400008, 0x0, 
-0xc003bad, 0x0, 0x3c010001, 0xac203d1c, 
-0xaf800204, 0x3c010001, 0xc0040e8, 0xac205f10, 
-0x24020001, 0x3c010001, 0xac223d30, 0x24020002, 
-0x1000007b, 0xaee204b8, 0xc004194, 0x0, 
-0x3c030001, 0x8c633d30, 0x24020009, 0x14620074, 
+0x220821, 0x8c223c58, 0x400008, 0x0, 
+0xc003be0, 0x0, 0x3c010001, 0xac203e2c, 
+0xaf800204, 0x3c010001, 0xc004118, 0xac206020, 
+0x24020001, 0x3c010001, 0xac223e40, 0x24020002, 
+0x1000007b, 0xaee204b8, 0xc0041c4, 0x0, 
+0x3c030001, 0x8c633e40, 0x24020009, 0x14620074, 
 0x24020003, 0x10000072, 0xaee204b8, 0x3c020001, 
-0x8c425f28, 0x30424000, 0x10400003, 0x3c0200c8, 
+0x8c426038, 0x30424000, 0x10400003, 0x3c0200c8, 
 0x10000002, 0x344201f6, 0x344201fe, 0xaf820238, 
 0x8f830054, 0x10000014, 0x24020004, 0x8f830054, 
-0x3c020001, 0x8c423e60, 0x2463d8f0, 0x431023, 
+0x3c020001, 0x8c423f70, 0x2463d8f0, 0x431023, 
 0x2c422710, 0x1440005e, 0x24020005, 0x1000005c, 
 0xaee204b8, 0x8f820220, 0x3c03f700, 0x431025, 
-0xaf820220, 0xaf800204, 0x3c010001, 0xac205f10, 
+0xaf820220, 0xaf800204, 0x3c010001, 0xac206020, 
 0x8f830054, 0x24020006, 0xaee204b8, 0x3c010001, 
-0x1000004f, 0xac233e60, 0x8f830054, 0x3c020001, 
-0x8c423e60, 0x2463fff6, 0x431023, 0x2c42000a, 
+0x1000004f, 0xac233f70, 0x8f830054, 0x3c020001, 
+0x8c423f70, 0x2463fff6, 0x431023, 0x2c42000a, 
 0x14400047, 0x0, 0x24020007, 0x10000044, 
-0xaee204b8, 0xc003d2c, 0x0, 0x1040003e, 
+0xaee204b8, 0xc003d5c, 0x0, 0x1040003e, 
 0x24020001, 0x8f820214, 0x3c03ffff, 0x3c040001, 
-0x8c843e58, 0x431024, 0x3442251f, 0xaf820214, 
+0x8c843f68, 0x431024, 0x3442251f, 0xaf820214, 
 0x24020008, 0x1080000f, 0xaee204b8, 0x3c020001, 
-0x8c423da4, 0x1440000b, 0x0, 0x8f820220, 
+0x8c423eb4, 0x1440000b, 0x0, 0x8f820220, 
 0x34420002, 0xaf820220, 0x24020001, 0x3c010001, 
-0xac225ec0, 0xc004610, 0x8f840220, 0x10000016, 
+0xac225fd0, 0xc004640, 0x8f840220, 0x10000016, 
 0x0, 0x8f820220, 0x3c030008, 0x431024, 
 0x14400011, 0x3c020200, 0x282a025, 0x2402000e, 
-0x3c010001, 0xac225ec0, 0xc004a4c, 0x2021, 
-0x8f820220, 0x34420002, 0xc003c6b, 0xaf820220, 
-0x3c050001, 0x8ca53d18, 0xc004981, 0x2021, 
-0x10000013, 0x0, 0x3c020001, 0x8c423da4, 
-0x1040000f, 0x0, 0x3c020001, 0x8c423da0, 
-0x2442ffff, 0x3c010001, 0xac223da0, 0x14400008, 
-0x24020002, 0x3c010001, 0xac203da4, 0x3c010001, 
-0x10000003, 0xac223da0, 0x3c010001, 0xac223d1c, 
+0x3c010001, 0xac225fd0, 0xc004a7c, 0x2021, 
+0x8f820220, 0x34420002, 0xc003c9e, 0xaf820220, 
+0x3c050001, 0x8ca53e28, 0xc0049b1, 0x2021, 
+0x10000013, 0x0, 0x3c020001, 0x8c423eb4, 
+0x1040000f, 0x0, 0x3c020001, 0x8c423eb0, 
+0x2442ffff, 0x3c010001, 0xac223eb0, 0x14400008, 
+0x24020002, 0x3c010001, 0xac203eb4, 0x3c010001, 
+0x10000003, 0xac223eb0, 0x3c010001, 0xac223e2c, 
 0x8fbf0018, 0x3e00008, 0x27bd0020, 0x8f820200, 
 0x8f820220, 0x8f820220, 0x34420004, 0xaf820220, 
-0x8f820200, 0x3c040001, 0x8c843d18, 0x34420004, 
+0x8f820200, 0x3c040001, 0x8c843e28, 0x34420004, 
 0xaf820200, 0x24020002, 0x1082003a, 0x2c820003, 
 0x10400005, 0x24020001, 0x1082000a, 0x3c03f0ff, 
 0x10000098, 0x0, 0x24020004, 0x10820059, 
@@ -7607,300 +7620,300 @@
 0x0, 0x8f820050, 0x3463ffff, 0x3c05ffff, 
 0x34a53f7f, 0x431024, 0x3c030700, 0x431025, 
 0xaf820050, 0x24020e00, 0xaf840200, 0xaf840220, 
-0xaf820238, 0x8f820044, 0x3c030001, 0x8c633d08, 
-0x3c040001, 0x8c843e70, 0x451024, 0x34630022, 
+0xaf820238, 0x8f820044, 0x3c030001, 0x8c633e18, 
+0x3c040001, 0x8c843f80, 0x451024, 0x34630022, 
 0xaf820044, 0x24020004, 0x1082000c, 0xaf830200, 
-0x3c020001, 0x8c423d2c, 0x3c030001, 0x8c633d10, 
-0x3c040001, 0x8c843d0c, 0x34428000, 0x621825, 
+0x3c020001, 0x8c423e3c, 0x3c030001, 0x8c633e20, 
+0x3c040001, 0x8c843e1c, 0x34428000, 0x621825, 
 0x641825, 0x1000006e, 0x34620002, 0x3c020001, 
-0x8c423d10, 0x3c030001, 0x8c633d2c, 0x3c040001, 
-0x8c843d0c, 0x431025, 0x441025, 0x10000064, 
+0x8c423e20, 0x3c030001, 0x8c633e3c, 0x3c040001, 
+0x8c843e1c, 0x431025, 0x441025, 0x10000064, 
 0x34420002, 0x8f830050, 0x3c02f0ff, 0x3442ffff, 
-0x3c040001, 0x8c843e58, 0x621824, 0x3c020d00, 
+0x3c040001, 0x8c843f68, 0x621824, 0x3c020d00, 
 0x621825, 0x24020001, 0xaf830050, 0xaf820200, 
 0xaf820220, 0x24020e00, 0x10800009, 0xaf820238, 
-0x3c020001, 0x8c423da4, 0x14400005, 0x3c033f00, 
-0x3c020001, 0x8c423d00, 0x10000005, 0x34630070, 
-0x3c020001, 0x8c423d00, 0x3c033f00, 0x34630072, 
-0x431025, 0xaf820200, 0x3c030001, 0x8c633d04, 
-0x3c04f700, 0x3c020001, 0x8c423d10, 0x3c050001, 
-0x8ca53d2c, 0x641825, 0x431025, 0x1000003c, 
+0x3c020001, 0x8c423eb4, 0x14400005, 0x3c033f00, 
+0x3c020001, 0x8c423e10, 0x10000005, 0x34630070, 
+0x3c020001, 0x8c423e10, 0x3c033f00, 0x34630072, 
+0x431025, 0xaf820200, 0x3c030001, 0x8c633e14, 
+0x3c04f700, 0x3c020001, 0x8c423e20, 0x3c050001, 
+0x8ca53e3c, 0x641825, 0x431025, 0x1000003c, 
 0x451025, 0x8f830050, 0x3c02f0ff, 0x3442ffff, 
-0x3c040001, 0x8c843e58, 0x621824, 0x3c020a00, 
+0x3c040001, 0x8c843f68, 0x621824, 0x3c020a00, 
 0x621825, 0x24020001, 0xaf830050, 0xaf820200, 
-0x1080001e, 0xaf820220, 0x3c020001, 0x8c423da4, 
-0x1440001a, 0x3c033f00, 0x3c020001, 0x8c423d00, 
+0x1080001e, 0xaf820220, 0x3c020001, 0x8c423eb4, 
+0x1440001a, 0x3c033f00, 0x3c020001, 0x8c423e10, 
 0x1000001a, 0x346300e0, 0x8f830050, 0x3c040001, 
-0x8c843e58, 0x3442ffff, 0x621824, 0x1080000f, 
-0xaf830050, 0x3c020001, 0x8c423da4, 0x1440000b, 
-0x3c043f00, 0x3c030001, 0x8c633d00, 0x348400e0, 
+0x8c843f68, 0x3442ffff, 0x621824, 0x1080000f, 
+0xaf830050, 0x3c020001, 0x8c423eb4, 0x1440000b, 
+0x3c043f00, 0x3c030001, 0x8c633e10, 0x348400e0, 
 0x24020001, 0xaf820200, 0xaf820220, 0x641825, 
 0xaf830200, 0x10000008, 0x3c05f700, 0x3c020001, 
-0x8c423d00, 0x3c033f00, 0x346300e2, 0x431025, 
+0x8c423e10, 0x3c033f00, 0x346300e2, 0x431025, 
 0xaf820200, 0x3c05f700, 0x34a58000, 0x3c030001, 
-0x8c633d04, 0x3c020001, 0x8c423d10, 0x3c040001, 
-0x8c843d2c, 0x651825, 0x431025, 0x441025, 
+0x8c633e14, 0x3c020001, 0x8c423e20, 0x3c040001, 
+0x8c843e3c, 0x651825, 0x431025, 0x441025, 
 0xaf820220, 0x3e00008, 0x0, 0x3c030001, 
-0x8c633d30, 0x3c020001, 0x8c423d34, 0x10620003, 
-0x24020002, 0x3c010001, 0xac233d34, 0x1062001d, 
+0x8c633e40, 0x3c020001, 0x8c423e44, 0x10620003, 
+0x24020002, 0x3c010001, 0xac233e44, 0x1062001d, 
 0x2c620003, 0x10400025, 0x24020001, 0x14620023, 
-0x24020004, 0x3c030001, 0x8c633d18, 0x10620006, 
+0x24020004, 0x3c030001, 0x8c633e28, 0x10620006, 
 0x24020008, 0x1462000c, 0x3c0200c8, 0x344201fb, 
 0x10000009, 0xaf820238, 0x24020e01, 0xaf820238, 
 0x8f820044, 0x3c03ffff, 0x34633f7f, 0x431024, 
 0x34420080, 0xaf820044, 0x8f830054, 0x24020002, 
-0x3c010001, 0xac223d30, 0x3c010001, 0x1000000b, 
-0xac233e64, 0x8f830054, 0x3c020001, 0x8c423e64, 
+0x3c010001, 0xac223e40, 0x3c010001, 0x1000000b, 
+0xac233f74, 0x8f830054, 0x3c020001, 0x8c423f74, 
 0x2463d8f0, 0x431023, 0x2c422710, 0x14400003, 
-0x24020009, 0x3c010001, 0xac223d30, 0x3e00008, 
+0x24020009, 0x3c010001, 0xac223e40, 0x3e00008, 
 0x0, 0x0, 0x0, 0x27bdffd8, 
 0xafb20018, 0x809021, 0xafb3001c, 0xa09821, 
 0xafb10014, 0xc08821, 0xafb00010, 0x8021, 
-0xafbf0020, 0xa6200000, 0xc0045c7, 0x24040001, 
+0xafbf0020, 0xa6200000, 0xc0045f7, 0x24040001, 
 0x26100001, 0x2e020020, 0x1440fffb, 0x0, 
-0xc0045c7, 0x2021, 0xc0045c7, 0x24040001, 
-0xc0045c7, 0x24040001, 0xc0045c7, 0x2021, 
+0xc0045f7, 0x2021, 0xc0045f7, 0x24040001, 
+0xc0045f7, 0x24040001, 0xc0045f7, 0x2021, 
 0x24100010, 0x2501024, 0x10400002, 0x2021, 
-0x24040001, 0xc0045c7, 0x108042, 0x1600fffa, 
+0x24040001, 0xc0045f7, 0x108042, 0x1600fffa, 
 0x2501024, 0x24100010, 0x2701024, 0x10400002, 
-0x2021, 0x24040001, 0xc0045c7, 0x108042, 
-0x1600fffa, 0x2701024, 0xc0045ed, 0x34108000, 
-0xc0045ed, 0x0, 0xc0045a7, 0x0, 
+0x2021, 0x24040001, 0xc0045f7, 0x108042, 
+0x1600fffa, 0x2701024, 0xc00461d, 0x34108000, 
+0xc00461d, 0x0, 0xc0045d7, 0x0, 
 0x50400005, 0x108042, 0x96220000, 0x501025, 
 0xa6220000, 0x108042, 0x1600fff7, 0x0, 
-0xc0045ed, 0x0, 0x8fbf0020, 0x8fb3001c, 
+0xc00461d, 0x0, 0x8fbf0020, 0x8fb3001c, 
 0x8fb20018, 0x8fb10014, 0x8fb00010, 0x3e00008, 
 0x27bd0028, 0x27bdffd8, 0xafb10014, 0x808821, 
 0xafb20018, 0xa09021, 0xafb3001c, 0xc09821, 
-0xafb00010, 0x8021, 0xafbf0020, 0xc0045c7, 
+0xafb00010, 0x8021, 0xafbf0020, 0xc0045f7, 
 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, 
-0x0, 0xc0045c7, 0x2021, 0xc0045c7, 
-0x24040001, 0xc0045c7, 0x2021, 0xc0045c7, 
+0x0, 0xc0045f7, 0x2021, 0xc0045f7, 
+0x24040001, 0xc0045f7, 0x2021, 0xc0045f7, 
 0x24040001, 0x24100010, 0x2301024, 0x10400002, 
-0x2021, 0x24040001, 0xc0045c7, 0x108042, 
+0x2021, 0x24040001, 0xc0045f7, 0x108042, 
 0x1600fffa, 0x2301024, 0x24100010, 0x2501024, 
-0x10400002, 0x2021, 0x24040001, 0xc0045c7, 
-0x108042, 0x1600fffa, 0x2501024, 0xc0045c7, 
-0x24040001, 0xc0045c7, 0x2021, 0x34108000, 
+0x10400002, 0x2021, 0x24040001, 0xc0045f7, 
+0x108042, 0x1600fffa, 0x2501024, 0xc0045f7, 
+0x24040001, 0xc0045f7, 0x2021, 0x34108000, 
 0x96620000, 0x501024, 0x10400002, 0x2021, 
-0x24040001, 0xc0045c7, 0x108042, 0x1600fff8, 
-0x0, 0xc0045ed, 0x0, 0x8fbf0020, 
+0x24040001, 0xc0045f7, 0x108042, 0x1600fff8, 
+0x0, 0xc00461d, 0x0, 0x8fbf0020, 
 0x8fb3001c, 0x8fb20018, 0x8fb10014, 0x8fb00010, 
-0x3e00008, 0x27bd0028, 0x3c030001, 0x8c633d40, 
-0x3c020001, 0x8c423d84, 0x27bdffd8, 0xafbf0020, 
+0x3e00008, 0x27bd0028, 0x3c030001, 0x8c633e50, 
+0x3c020001, 0x8c423e94, 0x27bdffd8, 0xafbf0020, 
 0xafb1001c, 0x10620003, 0xafb00018, 0x3c010001, 
-0xac233d84, 0x2463ffff, 0x2c620013, 0x10400349, 
-0x31080, 0x3c010001, 0x220821, 0x8c223b80, 
-0x400008, 0x0, 0xc0045ed, 0x8021, 
-0x34028000, 0xa7a20010, 0x27b10010, 0xc0045c7, 
+0xac233e94, 0x2463ffff, 0x2c620013, 0x10400349, 
+0x31080, 0x3c010001, 0x220821, 0x8c223c80, 
+0x400008, 0x0, 0xc00461d, 0x8021, 
+0x34028000, 0xa7a20010, 0x27b10010, 0xc0045f7, 
 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, 
-0x0, 0xc0045c7, 0x2021, 0xc0045c7, 
-0x24040001, 0xc0045c7, 0x2021, 0xc0045c7, 
+0x0, 0xc0045f7, 0x2021, 0xc0045f7, 
+0x24040001, 0xc0045f7, 0x2021, 0xc0045f7, 
 0x24040001, 0x24100010, 0x32020001, 0x10400002, 
-0x2021, 0x24040001, 0xc0045c7, 0x108042, 
-0x1600fffa, 0x32020001, 0x24100010, 0xc0045c7, 
+0x2021, 0x24040001, 0xc0045f7, 0x108042, 
+0x1600fffa, 0x32020001, 0x24100010, 0xc0045f7, 
 0x2021, 0x108042, 0x1600fffc, 0x0, 
-0xc0045c7, 0x24040001, 0xc0045c7, 0x2021, 
+0xc0045f7, 0x24040001, 0xc0045f7, 0x2021, 
 0x34108000, 0x96220000, 0x501024, 0x10400002, 
-0x2021, 0x24040001, 0xc0045c7, 0x108042, 
-0x1600fff8, 0x0, 0xc0045ed, 0x0, 
+0x2021, 0x24040001, 0xc0045f7, 0x108042, 
+0x1600fff8, 0x0, 0xc00461d, 0x0, 
 0x1000030e, 0x24020002, 0x27b10010, 0xa7a00010, 
-0x8021, 0xc0045c7, 0x24040001, 0x26100001, 
-0x2e020020, 0x1440fffb, 0x0, 0xc0045c7, 
-0x2021, 0xc0045c7, 0x24040001, 0xc0045c7, 
-0x24040001, 0xc0045c7, 0x2021, 0x24100010, 
+0x8021, 0xc0045f7, 0x24040001, 0x26100001, 
+0x2e020020, 0x1440fffb, 0x0, 0xc0045f7, 
+0x2021, 0xc0045f7, 0x24040001, 0xc0045f7, 
+0x24040001, 0xc0045f7, 0x2021, 0x24100010, 
 0x32020001, 0x10400002, 0x2021, 0x24040001, 
-0xc0045c7, 0x108042, 0x1600fffa, 0x32020001, 
-0x24100010, 0xc0045c7, 0x2021, 0x108042, 
-0x1600fffc, 0x0, 0xc0045ed, 0x34108000, 
-0xc0045ed, 0x0, 0xc0045a7, 0x0, 
+0xc0045f7, 0x108042, 0x1600fffa, 0x32020001, 
+0x24100010, 0xc0045f7, 0x2021, 0x108042, 
+0x1600fffc, 0x0, 0xc00461d, 0x34108000, 
+0xc00461d, 0x0, 0xc0045d7, 0x0, 
 0x50400005, 0x108042, 0x96220000, 0x501025, 
 0xa6220000, 0x108042, 0x1600fff7, 0x0, 
-0xc0045ed, 0x0, 0x97a20010, 0x30428000, 
+0xc00461d, 0x0, 0x97a20010, 0x30428000, 
 0x144002dc, 0x24020003, 0x100002d8, 0x0, 
 0x24021200, 0xa7a20010, 0x27b10010, 0x8021, 
-0xc0045c7, 0x24040001, 0x26100001, 0x2e020020, 
-0x1440fffb, 0x0, 0xc0045c7, 0x2021, 
-0xc0045c7, 0x24040001, 0xc0045c7, 0x2021, 
-0xc0045c7, 0x24040001, 0x24100010, 0x32020001, 
-0x10400002, 0x2021, 0x24040001, 0xc0045c7, 
+0xc0045f7, 0x24040001, 0x26100001, 0x2e020020, 
+0x1440fffb, 0x0, 0xc0045f7, 0x2021, 
+0xc0045f7, 0x24040001, 0xc0045f7, 0x2021, 
+0xc0045f7, 0x24040001, 0x24100010, 0x32020001, 
+0x10400002, 0x2021, 0x24040001, 0xc0045f7, 
 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 
-0xc0045c7, 0x2021, 0x108042, 0x1600fffc, 
-0x0, 0xc0045c7, 0x24040001, 0xc0045c7, 
+0xc0045f7, 0x2021, 0x108042, 0x1600fffc, 
+0x0, 0xc0045f7, 0x24040001, 0xc0045f7, 
 0x2021, 0x34108000, 0x96220000, 0x501024, 
-0x10400002, 0x2021, 0x24040001, 0xc0045c7, 
-0x108042, 0x1600fff8, 0x0, 0xc0045ed, 
+0x10400002, 0x2021, 0x24040001, 0xc0045f7, 
+0x108042, 0x1600fff8, 0x0, 0xc00461d, 
 0x0, 0x8f830054, 0x10000296, 0x24020004, 
-0x8f830054, 0x3c020001, 0x8c423e6c, 0x2463ff9c, 
+0x8f830054, 0x3c020001, 0x8c423f7c, 0x2463ff9c, 
 0x431023, 0x2c420064, 0x1440029e, 0x24020002, 
-0x3c030001, 0x8c633e70, 0x10620297, 0x2c620003, 
+0x3c030001, 0x8c633f80, 0x10620297, 0x2c620003, 
 0x14400296, 0x24020011, 0x24020003, 0x10620005, 
 0x24020004, 0x10620291, 0x2402000f, 0x1000028f, 
 0x24020011, 0x1000028d, 0x24020005, 0x24020014, 
-0xa7a20010, 0x27b10010, 0x8021, 0xc0045c7, 
+0xa7a20010, 0x27b10010, 0x8021, 0xc0045f7, 
 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, 
-0x0, 0xc0045c7, 0x2021, 0xc0045c7, 
-0x24040001, 0xc0045c7, 0x2021, 0xc0045c7, 
+0x0, 0xc0045f7, 0x2021, 0xc0045f7, 
+0x24040001, 0xc0045f7, 0x2021, 0xc0045f7, 
 0x24040001, 0x24100010, 0x32020001, 0x10400002, 
-0x2021, 0x24040001, 0xc0045c7, 0x108042, 
+0x2021, 0x24040001, 0xc0045f7, 0x108042, 
 0x1600fffa, 0x32020001, 0x24100010, 0x32020012, 
-0x10400002, 0x2021, 0x24040001, 0xc0045c7, 
-0x108042, 0x1600fffa, 0x32020012, 0xc0045c7, 
-0x24040001, 0xc0045c7, 0x2021, 0x34108000, 
+0x10400002, 0x2021, 0x24040001, 0xc0045f7, 
+0x108042, 0x1600fffa, 0x32020012, 0xc0045f7, 
+0x24040001, 0xc0045f7, 0x2021, 0x34108000, 
 0x96220000, 0x501024, 0x10400002, 0x2021, 
-0x24040001, 0xc0045c7, 0x108042, 0x1600fff8, 
-0x0, 0xc0045ed, 0x0, 0x8f830054, 
+0x24040001, 0xc0045f7, 0x108042, 0x1600fff8, 
+0x0, 0xc00461d, 0x0, 0x8f830054, 
 0x10000248, 0x24020006, 0x8f830054, 0x3c020001, 
-0x8c423e6c, 0x2463ff9c, 0x431023, 0x2c420064, 
+0x8c423f7c, 0x2463ff9c, 0x431023, 0x2c420064, 
 0x14400250, 0x24020007, 0x1000024c, 0x0, 
 0x24020006, 0xa7a20010, 0x27b10010, 0x8021, 
-0xc0045c7, 0x24040001, 0x26100001, 0x2e020020, 
-0x1440fffb, 0x0, 0xc0045c7, 0x2021, 
-0xc0045c7, 0x24040001, 0xc0045c7, 0x2021, 
-0xc0045c7, 0x24040001, 0x24100010, 0x32020001, 
-0x10400002, 0x2021, 0x24040001, 0xc0045c7, 
+0xc0045f7, 0x24040001, 0x26100001, 0x2e020020, 
+0x1440fffb, 0x0, 0xc0045f7, 0x2021, 
+0xc0045f7, 0x24040001, 0xc0045f7, 0x2021, 
+0xc0045f7, 0x24040001, 0x24100010, 0x32020001, 
+0x10400002, 0x2021, 0x24040001, 0xc0045f7, 
 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 
 0x32020013, 0x10400002, 0x2021, 0x24040001, 
-0xc0045c7, 0x108042, 0x1600fffa, 0x32020013, 
-0xc0045c7, 0x24040001, 0xc0045c7, 0x2021, 
+0xc0045f7, 0x108042, 0x1600fffa, 0x32020013, 
+0xc0045f7, 0x24040001, 0xc0045f7, 0x2021, 
 0x34108000, 0x96220000, 0x501024, 0x10400002, 
-0x2021, 0x24040001, 0xc0045c7, 0x108042, 
-0x1600fff8, 0x0, 0xc0045ed, 0x0, 
+0x2021, 0x24040001, 0xc0045f7, 0x108042, 
+0x1600fff8, 0x0, 0xc00461d, 0x0, 
 0x8f830054, 0x10000207, 0x24020008, 0x8f830054, 
-0x3c020001, 0x8c423e6c, 0x2463ff9c, 0x431023, 
+0x3c020001, 0x8c423f7c, 0x2463ff9c, 0x431023, 
 0x2c420064, 0x1440020f, 0x24020009, 0x1000020b, 
 0x0, 0x27b10010, 0xa7a00010, 0x8021, 
-0xc0045c7, 0x24040001, 0x26100001, 0x2e020020, 
-0x1440fffb, 0x0, 0xc0045c7, 0x2021, 
-0xc0045c7, 0x24040001, 0xc0045c7, 0x24040001, 
-0xc0045c7, 0x2021, 0x24100010, 0x32020001, 
-0x10400002, 0x2021, 0x24040001, 0xc0045c7, 
+0xc0045f7, 0x24040001, 0x26100001, 0x2e020020, 
+0x1440fffb, 0x0, 0xc0045f7, 0x2021, 
+0xc0045f7, 0x24040001, 0xc0045f7, 0x24040001, 
+0xc0045f7, 0x2021, 0x24100010, 0x32020001, 
+0x10400002, 0x2021, 0x24040001, 0xc0045f7, 
 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 
 0x32020018, 0x10400002, 0x2021, 0x24040001, 
-0xc0045c7, 0x108042, 0x1600fffa, 0x32020018, 
-0xc0045ed, 0x34108000, 0xc0045ed, 0x0, 
-0xc0045a7, 0x0, 0x50400005, 0x108042, 
+0xc0045f7, 0x108042, 0x1600fffa, 0x32020018, 
+0xc00461d, 0x34108000, 0xc00461d, 0x0, 
+0xc0045d7, 0x0, 0x50400005, 0x108042, 
 0x96220000, 0x501025, 0xa6220000, 0x108042, 
-0x1600fff7, 0x0, 0xc0045ed, 0x8021, 
+0x1600fff7, 0x0, 0xc00461d, 0x8021, 
 0x97a20010, 0x27b10010, 0x34420001, 0xa7a20010, 
-0xc0045c7, 0x24040001, 0x26100001, 0x2e020020, 
-0x1440fffb, 0x0, 0xc0045c7, 0x2021, 
-0xc0045c7, 0x24040001, 0xc0045c7, 0x2021, 
-0xc0045c7, 0x24040001, 0x24100010, 0x32020001, 
-0x10400002, 0x2021, 0x24040001, 0xc0045c7, 
+0xc0045f7, 0x24040001, 0x26100001, 0x2e020020, 
+0x1440fffb, 0x0, 0xc0045f7, 0x2021, 
+0xc0045f7, 0x24040001, 0xc0045f7, 0x2021, 
+0xc0045f7, 0x24040001, 0x24100010, 0x32020001, 
+0x10400002, 0x2021, 0x24040001, 0xc0045f7, 
 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 
 0x32020018, 0x10400002, 0x2021, 0x24040001, 
-0xc0045c7, 0x108042, 0x1600fffa, 0x32020018, 
-0xc0045c7, 0x24040001, 0xc0045c7, 0x2021, 
+0xc0045f7, 0x108042, 0x1600fffa, 0x32020018, 
+0xc0045f7, 0x24040001, 0xc0045f7, 0x2021, 
 0x34108000, 0x96220000, 0x501024, 0x10400002, 
-0x2021, 0x24040001, 0xc0045c7, 0x108042, 
-0x1600fff8, 0x0, 0xc0045ed, 0x0, 
+0x2021, 0x24040001, 0xc0045f7, 0x108042, 
+0x1600fff8, 0x0, 0xc00461d, 0x0, 
 0x8f830054, 0x10000193, 0x2402000a, 0x8f830054, 
-0x3c020001, 0x8c423e6c, 0x2463ff9c, 0x431023, 
+0x3c020001, 0x8c423f7c, 0x2463ff9c, 0x431023, 
 0x2c420064, 0x1440019b, 0x2402000b, 0x10000197, 
 0x0, 0x27b10010, 0xa7a00010, 0x8021, 
-0xc0045c7, 0x24040001, 0x26100001, 0x2e020020, 
-0x1440fffb, 0x0, 0xc0045c7, 0x2021, 
-0xc0045c7, 0x24040001, 0xc0045c7, 0x24040001, 
-0xc0045c7, 0x2021, 0x24100010, 0x32020001, 
-0x10400002, 0x2021, 0x24040001, 0xc0045c7, 
+0xc0045f7, 0x24040001, 0x26100001, 0x2e020020, 
+0x1440fffb, 0x0, 0xc0045f7, 0x2021, 
+0xc0045f7, 0x24040001, 0xc0045f7, 0x24040001, 
+0xc0045f7, 0x2021, 0x24100010, 0x32020001, 
+0x10400002, 0x2021, 0x24040001, 0xc0045f7, 
 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 
 0x32020017, 0x10400002, 0x2021, 0x24040001, 
-0xc0045c7, 0x108042, 0x1600fffa, 0x32020017, 
-0xc0045ed, 0x34108000, 0xc0045ed, 0x0, 
-0xc0045a7, 0x0, 0x50400005, 0x108042, 
+0xc0045f7, 0x108042, 0x1600fffa, 0x32020017, 
+0xc00461d, 0x34108000, 0xc00461d, 0x0, 
+0xc0045d7, 0x0, 0x50400005, 0x108042, 
 0x96220000, 0x501025, 0xa6220000, 0x108042, 
-0x1600fff7, 0x0, 0xc0045ed, 0x8021, 
+0x1600fff7, 0x0, 0xc00461d, 0x8021, 
 0x97a20010, 0x27b10010, 0x34420700, 0xa7a20010, 
-0xc0045c7, 0x24040001, 0x26100001, 0x2e020020, 
-0x1440fffb, 0x0, 0xc0045c7, 0x2021, 
-0xc0045c7, 0x24040001, 0xc0045c7, 0x2021, 
-0xc0045c7, 0x24040001, 0x24100010, 0x32020001, 
-0x10400002, 0x2021, 0x24040001, 0xc0045c7, 
+0xc0045f7, 0x24040001, 0x26100001, 0x2e020020, 
+0x1440fffb, 0x0, 0xc0045f7, 0x2021, 
+0xc0045f7, 0x24040001, 0xc0045f7, 0x2021, 
+0xc0045f7, 0x24040001, 0x24100010, 0x32020001, 
+0x10400002, 0x2021, 0x24040001, 0xc0045f7, 
 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 
 0x32020017, 0x10400002, 0x2021, 0x24040001, 
-0xc0045c7, 0x108042, 0x1600fffa, 0x32020017, 
-0xc0045c7, 0x24040001, 0xc0045c7, 0x2021, 
+0xc0045f7, 0x108042, 0x1600fffa, 0x32020017, 
+0xc0045f7, 0x24040001, 0xc0045f7, 0x2021, 
 0x34108000, 0x96220000, 0x501024, 0x10400002, 
-0x2021, 0x24040001, 0xc0045c7, 0x108042, 
-0x1600fff8, 0x0, 0xc0045ed, 0x0, 
+0x2021, 0x24040001, 0xc0045f7, 0x108042, 
+0x1600fff8, 0x0, 0xc00461d, 0x0, 
 0x8f830054, 0x1000011f, 0x2402000c, 0x8f830054, 
-0x3c020001, 0x8c423e6c, 0x2463ff9c, 0x431023, 
+0x3c020001, 0x8c423f7c, 0x2463ff9c, 0x431023, 
 0x2c420064, 0x14400127, 0x24020012, 0x10000123, 
 0x0, 0x27b10010, 0xa7a00010, 0x8021, 
-0xc0045c7, 0x24040001, 0x26100001, 0x2e020020, 
-0x1440fffb, 0x0, 0xc0045c7, 0x2021, 
-0xc0045c7, 0x24040001, 0xc0045c7, 0x24040001, 
-0xc0045c7, 0x2021, 0x24100010, 0x32020001, 
-0x10400002, 0x2021, 0x24040001, 0xc0045c7, 
+0xc0045f7, 0x24040001, 0x26100001, 0x2e020020, 
+0x1440fffb, 0x0, 0xc0045f7, 0x2021, 
+0xc0045f7, 0x24040001, 0xc0045f7, 0x24040001, 
+0xc0045f7, 0x2021, 0x24100010, 0x32020001, 
+0x10400002, 0x2021, 0x24040001, 0xc0045f7, 
 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 
 0x32020014, 0x10400002, 0x2021, 0x24040001, 
-0xc0045c7, 0x108042, 0x1600fffa, 0x32020014, 
-0xc0045ed, 0x34108000, 0xc0045ed, 0x0, 
-0xc0045a7, 0x0, 0x50400005, 0x108042, 
+0xc0045f7, 0x108042, 0x1600fffa, 0x32020014, 
+0xc00461d, 0x34108000, 0xc00461d, 0x0, 
+0xc0045d7, 0x0, 0x50400005, 0x108042, 
 0x96220000, 0x501025, 0xa6220000, 0x108042, 
-0x1600fff7, 0x0, 0xc0045ed, 0x8021, 
+0x1600fff7, 0x0, 0xc00461d, 0x8021, 
 0x97a20010, 0x27b10010, 0x34420010, 0xa7a20010, 
-0xc0045c7, 0x24040001, 0x26100001, 0x2e020020, 
-0x1440fffb, 0x0, 0xc0045c7, 0x2021, 
-0xc0045c7, 0x24040001, 0xc0045c7, 0x2021, 
-0xc0045c7, 0x24040001, 0x24100010, 0x32020001, 
-0x10400002, 0x2021, 0x24040001, 0xc0045c7, 
+0xc0045f7, 0x24040001, 0x26100001, 0x2e020020, 
+0x1440fffb, 0x0, 0xc0045f7, 0x2021, 
+0xc0045f7, 0x24040001, 0xc0045f7, 0x2021, 
+0xc0045f7, 0x24040001, 0x24100010, 0x32020001, 
+0x10400002, 0x2021, 0x24040001, 0xc0045f7, 
 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 
 0x32020014, 0x10400002, 0x2021, 0x24040001, 
-0xc0045c7, 0x108042, 0x1600fffa, 0x32020014, 
-0xc0045c7, 0x24040001, 0xc0045c7, 0x2021, 
+0xc0045f7, 0x108042, 0x1600fffa, 0x32020014, 
+0xc0045f7, 0x24040001, 0xc0045f7, 0x2021, 
 0x34108000, 0x96220000, 0x501024, 0x10400002, 
-0x2021, 0x24040001, 0xc0045c7, 0x108042, 
-0x1600fff8, 0x0, 0xc0045ed, 0x0, 
+0x2021, 0x24040001, 0xc0045f7, 0x108042, 
+0x1600fff8, 0x0, 0xc00461d, 0x0, 
 0x8f830054, 0x100000ab, 0x24020013, 0x8f830054, 
-0x3c020001, 0x8c423e6c, 0x2463ff9c, 0x431023, 
+0x3c020001, 0x8c423f7c, 0x2463ff9c, 0x431023, 
 0x2c420064, 0x144000b3, 0x2402000d, 0x100000af, 
 0x0, 0x27b10010, 0xa7a00010, 0x8021, 
-0xc0045c7, 0x24040001, 0x26100001, 0x2e020020, 
-0x1440fffb, 0x0, 0xc0045c7, 0x2021, 
-0xc0045c7, 0x24040001, 0xc0045c7, 0x24040001, 
-0xc0045c7, 0x2021, 0x24100010, 0x32020001, 
-0x10400002, 0x2021, 0x24040001, 0xc0045c7, 
+0xc0045f7, 0x24040001, 0x26100001, 0x2e020020, 
+0x1440fffb, 0x0, 0xc0045f7, 0x2021, 
+0xc0045f7, 0x24040001, 0xc0045f7, 0x24040001, 
+0xc0045f7, 0x2021, 0x24100010, 0x32020001, 
+0x10400002, 0x2021, 0x24040001, 0xc0045f7, 
 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 
 0x32020018, 0x10400002, 0x2021, 0x24040001, 
-0xc0045c7, 0x108042, 0x1600fffa, 0x32020018, 
-0xc0045ed, 0x34108000, 0xc0045ed, 0x0, 
-0xc0045a7, 0x0, 0x50400005, 0x108042, 
+0xc0045f7, 0x108042, 0x1600fffa, 0x32020018, 
+0xc00461d, 0x34108000, 0xc00461d, 0x0, 
+0xc0045d7, 0x0, 0x50400005, 0x108042, 
 0x96220000, 0x501025, 0xa6220000, 0x108042, 
-0x1600fff7, 0x0, 0xc0045ed, 0x8021, 
+0x1600fff7, 0x0, 0xc00461d, 0x8021, 
 0x97a20010, 0x27b10010, 0x3042fffe, 0xa7a20010, 
-0xc0045c7, 0x24040001, 0x26100001, 0x2e020020, 
-0x1440fffb, 0x0, 0xc0045c7, 0x2021, 
-0xc0045c7, 0x24040001, 0xc0045c7, 0x2021, 
-0xc0045c7, 0x24040001, 0x24100010, 0x32020001, 
-0x10400002, 0x2021, 0x24040001, 0xc0045c7, 
+0xc0045f7, 0x24040001, 0x26100001, 0x2e020020, 
+0x1440fffb, 0x0, 0xc0045f7, 0x2021, 
+0xc0045f7, 0x24040001, 0xc0045f7, 0x2021, 
+0xc0045f7, 0x24040001, 0x24100010, 0x32020001, 
+0x10400002, 0x2021, 0x24040001, 0xc0045f7, 
 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 
 0x32020018, 0x10400002, 0x2021, 0x24040001, 
-0xc0045c7, 0x108042, 0x1600fffa, 0x32020018, 
-0xc0045c7, 0x24040001, 0xc0045c7, 0x2021, 
+0xc0045f7, 0x108042, 0x1600fffa, 0x32020018, 
+0xc0045f7, 0x24040001, 0xc0045f7, 0x2021, 
 0x34108000, 0x96220000, 0x501024, 0x10400002, 
-0x2021, 0x24040001, 0xc0045c7, 0x108042, 
-0x1600fff8, 0x0, 0xc0045ed, 0x0, 
+0x2021, 0x24040001, 0xc0045f7, 0x108042, 
+0x1600fff8, 0x0, 0xc00461d, 0x0, 
 0x8f830054, 0x10000037, 0x2402000e, 0x24020840, 
-0xa7a20010, 0x27b10010, 0x8021, 0xc0045c7, 
+0xa7a20010, 0x27b10010, 0x8021, 0xc0045f7, 
 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, 
-0x0, 0xc0045c7, 0x2021, 0xc0045c7, 
-0x24040001, 0xc0045c7, 0x2021, 0xc0045c7, 
+0x0, 0xc0045f7, 0x2021, 0xc0045f7, 
+0x24040001, 0xc0045f7, 0x2021, 0xc0045f7, 
 0x24040001, 0x24100010, 0x32020001, 0x10400002, 
-0x2021, 0x24040001, 0xc0045c7, 0x108042, 
+0x2021, 0x24040001, 0xc0045f7, 0x108042, 
 0x1600fffa, 0x32020001, 0x24100010, 0x32020013, 
-0x10400002, 0x2021, 0x24040001, 0xc0045c7, 
-0x108042, 0x1600fffa, 0x32020013, 0xc0045c7, 
-0x24040001, 0xc0045c7, 0x2021, 0x34108000, 
+0x10400002, 0x2021, 0x24040001, 0xc0045f7, 
+0x108042, 0x1600fffa, 0x32020013, 0xc0045f7, 
+0x24040001, 0xc0045f7, 0x2021, 0x34108000, 
 0x96220000, 0x501024, 0x10400002, 0x2021, 
-0x24040001, 0xc0045c7, 0x108042, 0x1600fff8, 
-0x0, 0xc0045ed, 0x0, 0x8f830054, 
-0x24020010, 0x3c010001, 0xac223d40, 0x3c010001, 
-0x1000000c, 0xac233e6c, 0x8f830054, 0x3c020001, 
-0x8c423e6c, 0x2463ff9c, 0x431023, 0x2c420064, 
+0x24040001, 0xc0045f7, 0x108042, 0x1600fff8, 
+0x0, 0xc00461d, 0x0, 0x8f830054, 
+0x24020010, 0x3c010001, 0xac223e50, 0x3c010001, 
+0x1000000c, 0xac233f7c, 0x8f830054, 0x3c020001, 
+0x8c423f7c, 0x2463ff9c, 0x431023, 0x2c420064, 
 0x14400004, 0x0, 0x24020011, 0x3c010001, 
-0xac223d40, 0x8fbf0020, 0x8fb1001c, 0x8fb00018, 
+0xac223e50, 0x8fbf0020, 0x8fb1001c, 0x8fb00018, 
 0x3e00008, 0x27bd0028, 0x8f850044, 0x8f820044, 
 0x3c030001, 0x431025, 0x3c030008, 0xaf820044, 
 0x8f840054, 0x8f820054, 0xa32824, 0x10000002, 
@@ -7929,136 +7942,136 @@
 0x621023, 0x2c420002, 0x1440fffc, 0x0, 
 0x3e00008, 0x0, 0x0, 0x27bdffe8, 
 0xafbf0010, 0x8ee304b8, 0x24020008, 0x146201e0, 
-0x0, 0x3c020001, 0x8c423e58, 0x14400005, 
-0x0, 0xc003bad, 0x8f840224, 0x100001d8, 
+0x0, 0x3c020001, 0x8c423f68, 0x14400005, 
+0x0, 0xc003be0, 0x8f840224, 0x100001d8, 
 0x0, 0x8f820220, 0x3c030008, 0x431024, 
 0x10400026, 0x24020001, 0x8f840224, 0x8f820220, 
 0x3c030400, 0x431024, 0x10400006, 0x0, 
-0x3c010001, 0xac205ed0, 0x3c010001, 0x1000000b, 
-0xac205ef0, 0x3c030001, 0x24635ed0, 0x8c620000, 
+0x3c010001, 0xac205fe0, 0x3c010001, 0x1000000b, 
+0xac206000, 0x3c030001, 0x24635fe0, 0x8c620000, 
 0x24420001, 0xac620000, 0x2c420002, 0x14400003, 
-0x24020001, 0x3c010001, 0xac225ef0, 0x3c020001, 
-0x8c425ef0, 0x10400006, 0x30820040, 0x10400004, 
-0x24020001, 0x3c010001, 0x10000003, 0xac225ef4, 
-0x3c010001, 0xac205ef4, 0x3c010001, 0xac245ecc, 
-0x3c010001, 0x1000000b, 0xac205f00, 0x3c010001, 
-0xac225f00, 0x3c010001, 0xac205ef0, 0x3c010001, 
-0xac205ed0, 0x3c010001, 0xac205ef4, 0x3c010001, 
-0xac205ecc, 0x3c030001, 0x8c635ec0, 0x3c020001, 
-0x8c425ec4, 0x50620004, 0x2463ffff, 0x3c010001, 
-0xac235ec4, 0x2463ffff, 0x2c62000e, 0x10400194, 
-0x31080, 0x3c010001, 0x220821, 0x8c223bd0, 
+0x24020001, 0x3c010001, 0xac226000, 0x3c020001, 
+0x8c426000, 0x10400006, 0x30820040, 0x10400004, 
+0x24020001, 0x3c010001, 0x10000003, 0xac226004, 
+0x3c010001, 0xac206004, 0x3c010001, 0xac245fdc, 
+0x3c010001, 0x1000000b, 0xac206010, 0x3c010001, 
+0xac226010, 0x3c010001, 0xac206000, 0x3c010001, 
+0xac205fe0, 0x3c010001, 0xac206004, 0x3c010001, 
+0xac205fdc, 0x3c030001, 0x8c635fd0, 0x3c020001, 
+0x8c425fd4, 0x50620004, 0x2463ffff, 0x3c010001, 
+0xac235fd4, 0x2463ffff, 0x2c62000e, 0x10400194, 
+0x31080, 0x3c010001, 0x220821, 0x8c223cd0, 
 0x400008, 0x0, 0x24020002, 0x3c010001, 
-0xac205ef0, 0x3c010001, 0xac205ed0, 0x3c010001, 
-0xac205ecc, 0x3c010001, 0xac205ef4, 0x3c010001, 
-0xac205ee8, 0x3c010001, 0xac205ee0, 0xaf800224, 
-0x3c010001, 0xac225ec0, 0x3c020001, 0x8c425f00, 
-0x1440004f, 0x3c02fdff, 0x3442ffff, 0xc003bad, 
+0xac206000, 0x3c010001, 0xac205fe0, 0x3c010001, 
+0xac205fdc, 0x3c010001, 0xac206004, 0x3c010001, 
+0xac205ff8, 0x3c010001, 0xac205ff0, 0xaf800224, 
+0x3c010001, 0xac225fd0, 0x3c020001, 0x8c426010, 
+0x1440004f, 0x3c02fdff, 0x3442ffff, 0xc003be0, 
 0x282a024, 0xaf800204, 0x8f820200, 0x2403fffd, 
-0x431024, 0xaf820200, 0x3c010001, 0xac205f10, 
-0x8f830054, 0x3c020001, 0x8c425ee8, 0x24040001, 
-0x3c010001, 0xac245efc, 0x24420001, 0x3c010001, 
-0xac225ee8, 0x2c420004, 0x3c010001, 0xac235ee4, 
-0x14400006, 0x24020003, 0x3c010001, 0xac243d1c, 
-0x3c010001, 0x1000015e, 0xac205ee8, 0x3c010001, 
-0x1000015b, 0xac225ec0, 0x8f830054, 0x3c020001, 
-0x8c425ee4, 0x2463d8f0, 0x431023, 0x2c422710, 
-0x14400003, 0x24020004, 0x3c010001, 0xac225ec0, 
-0x3c020001, 0x8c425f00, 0x14400021, 0x3c02fdff, 
+0x431024, 0xaf820200, 0x3c010001, 0xac206020, 
+0x8f830054, 0x3c020001, 0x8c425ff8, 0x24040001, 
+0x3c010001, 0xac24600c, 0x24420001, 0x3c010001, 
+0xac225ff8, 0x2c420004, 0x3c010001, 0xac235ff4, 
+0x14400006, 0x24020003, 0x3c010001, 0xac243e2c, 
+0x3c010001, 0x1000015e, 0xac205ff8, 0x3c010001, 
+0x1000015b, 0xac225fd0, 0x8f830054, 0x3c020001, 
+0x8c425ff4, 0x2463d8f0, 0x431023, 0x2c422710, 
+0x14400003, 0x24020004, 0x3c010001, 0xac225fd0, 
+0x3c020001, 0x8c426010, 0x14400021, 0x3c02fdff, 
 0x3442ffff, 0x1000014a, 0x282a024, 0x3c040001, 
-0x8c843e5c, 0x3c010001, 0xc0047f8, 0xac205ed8, 
-0x3c020001, 0x8c425f0c, 0xaf820204, 0x3c020001, 
-0x8c425f00, 0x14400012, 0x3c03fdff, 0x8f820204, 
+0x8c843f6c, 0x3c010001, 0xc004828, 0xac205fe8, 
+0x3c020001, 0x8c42601c, 0xaf820204, 0x3c020001, 
+0x8c426010, 0x14400012, 0x3c03fdff, 0x8f820204, 
 0x3463ffff, 0x30420030, 0x1440012f, 0x283a024, 
-0x3c030001, 0x8c635f0c, 0x24020005, 0x3c010001, 
-0xac225ec0, 0x3c010001, 0x10000131, 0xac235f10, 
-0x3c020001, 0x8c425f00, 0x10400010, 0x3c02fdff, 
-0x3c020001, 0x8c423d9c, 0x24420001, 0x3c010001, 
-0xac223d9c, 0x2c420002, 0x14400125, 0x24020001, 
-0x3c010001, 0xac223da4, 0x3c010001, 0xac203d9c, 
-0x3c010001, 0x1000011e, 0xac223d1c, 0x3c030001, 
-0x8c635ef0, 0x3442ffff, 0x10600119, 0x282a024, 
-0x3c020001, 0x8c425ecc, 0x10400115, 0x0, 
-0x3c010001, 0xac225ef8, 0x24020003, 0x3c010001, 
-0xac225ed0, 0x100000b8, 0x24020006, 0x3c010001, 
-0xac205ed8, 0x8f820204, 0x34420040, 0xaf820204, 
-0x3c020001, 0x8c425f10, 0x24030007, 0x3c010001, 
-0xac235ec0, 0x34420040, 0x3c010001, 0xac225f10, 
-0x3c020001, 0x8c425ef0, 0x10400005, 0x0, 
-0x3c020001, 0x8c425ecc, 0x104000f0, 0x24020002, 
-0x3c050001, 0x24a55ed0, 0x8ca20000, 0x2c424e21, 
-0x104000ea, 0x24020002, 0x3c020001, 0x8c425ef4, 
-0x104000ef, 0x2404ffbf, 0x3c020001, 0x8c425ecc, 
-0x3c030001, 0x8c635ef8, 0x441024, 0x641824, 
+0x3c030001, 0x8c63601c, 0x24020005, 0x3c010001, 
+0xac225fd0, 0x3c010001, 0x10000131, 0xac236020, 
+0x3c020001, 0x8c426010, 0x10400010, 0x3c02fdff, 
+0x3c020001, 0x8c423eac, 0x24420001, 0x3c010001, 
+0xac223eac, 0x2c420002, 0x14400125, 0x24020001, 
+0x3c010001, 0xac223eb4, 0x3c010001, 0xac203eac, 
+0x3c010001, 0x1000011e, 0xac223e2c, 0x3c030001, 
+0x8c636000, 0x3442ffff, 0x10600119, 0x282a024, 
+0x3c020001, 0x8c425fdc, 0x10400115, 0x0, 
+0x3c010001, 0xac226008, 0x24020003, 0x3c010001, 
+0xac225fe0, 0x100000b8, 0x24020006, 0x3c010001, 
+0xac205fe8, 0x8f820204, 0x34420040, 0xaf820204, 
+0x3c020001, 0x8c426020, 0x24030007, 0x3c010001, 
+0xac235fd0, 0x34420040, 0x3c010001, 0xac226020, 
+0x3c020001, 0x8c426000, 0x10400005, 0x0, 
+0x3c020001, 0x8c425fdc, 0x104000f0, 0x24020002, 
+0x3c050001, 0x24a55fe0, 0x8ca20000, 0x2c424e21, 
+0x104000ea, 0x24020002, 0x3c020001, 0x8c426004, 
+0x104000ef, 0x2404ffbf, 0x3c020001, 0x8c425fdc, 
+0x3c030001, 0x8c636008, 0x441024, 0x641824, 
 0x10430004, 0x24020001, 0x3c010001, 0x100000e4, 
-0xac225ec0, 0x24020003, 0xaca20000, 0x24020008, 
-0x3c010001, 0xac225ec0, 0x3c020001, 0x8c425efc, 
-0x1040000c, 0x24020001, 0x3c040001, 0xc004805, 
-0x8c845ecc, 0x3c020001, 0x8c425f18, 0x14400005, 
-0x24020001, 0x3c020001, 0x8c425f14, 0x10400006, 
-0x24020001, 0x3c010001, 0xac223d1c, 0x3c010001, 
-0x100000cb, 0xac205ee8, 0x3c020001, 0x8c425ee0, 
-0x3c030001, 0x8c635ecc, 0x2c420001, 0x210c0, 
-0x30630008, 0x3c010001, 0xac225ee0, 0x3c010001, 
-0xac235edc, 0x8f830054, 0x24020009, 0x3c010001, 
-0xac225ec0, 0x3c010001, 0x100000b9, 0xac235ee4, 
-0x8f830054, 0x3c020001, 0x8c425ee4, 0x2463d8f0, 
+0xac225fd0, 0x24020003, 0xaca20000, 0x24020008, 
+0x3c010001, 0xac225fd0, 0x3c020001, 0x8c42600c, 
+0x1040000c, 0x24020001, 0x3c040001, 0xc004835, 
+0x8c845fdc, 0x3c020001, 0x8c426028, 0x14400005, 
+0x24020001, 0x3c020001, 0x8c426024, 0x10400006, 
+0x24020001, 0x3c010001, 0xac223e2c, 0x3c010001, 
+0x100000cb, 0xac205ff8, 0x3c020001, 0x8c425ff0, 
+0x3c030001, 0x8c635fdc, 0x2c420001, 0x210c0, 
+0x30630008, 0x3c010001, 0xac225ff0, 0x3c010001, 
+0xac235fec, 0x8f830054, 0x24020009, 0x3c010001, 
+0xac225fd0, 0x3c010001, 0x100000b9, 0xac235ff4, 
+0x8f830054, 0x3c020001, 0x8c425ff4, 0x2463d8f0, 
 0x431023, 0x2c422710, 0x1440009f, 0x0, 
-0x3c020001, 0x8c425ef0, 0x10400005, 0x0, 
-0x3c020001, 0x8c425ecc, 0x104000a0, 0x24020002, 
-0x3c030001, 0x24635ed0, 0x8c620000, 0x2c424e21, 
-0x1040009a, 0x24020002, 0x3c020001, 0x8c425efc, 
-0x1040000e, 0x0, 0x3c020001, 0x8c425ecc, 
-0x3c010001, 0xac205efc, 0x30420080, 0x1040002f, 
+0x3c020001, 0x8c426000, 0x10400005, 0x0, 
+0x3c020001, 0x8c425fdc, 0x104000a0, 0x24020002, 
+0x3c030001, 0x24635fe0, 0x8c620000, 0x2c424e21, 
+0x1040009a, 0x24020002, 0x3c020001, 0x8c42600c, 
+0x1040000e, 0x0, 0x3c020001, 0x8c425fdc, 
+0x3c010001, 0xac20600c, 0x30420080, 0x1040002f, 
 0x2402000c, 0x8f820204, 0x30420080, 0x1440000c, 
 0x24020003, 0x10000029, 0x2402000c, 0x3c020001, 
-0x8c425ecc, 0x30420080, 0x14400005, 0x24020003, 
+0x8c425fdc, 0x30420080, 0x14400005, 0x24020003, 
 0x8f820204, 0x30420080, 0x1040001f, 0x24020003, 
-0xac620000, 0x2402000a, 0x3c010001, 0xac225ec0, 
-0x3c040001, 0x24845f08, 0x8c820000, 0x3c030001, 
-0x8c635ee0, 0x431025, 0xaf820204, 0x8c830000, 
-0x3c040001, 0x8c845ee0, 0x2402000b, 0x3c010001, 
-0xac225ec0, 0x641825, 0x3c010001, 0xac235f10, 
-0x3c050001, 0x24a55ed0, 0x8ca20000, 0x2c424e21, 
-0x10400066, 0x24020002, 0x3c020001, 0x8c425f00, 
+0xac620000, 0x2402000a, 0x3c010001, 0xac225fd0, 
+0x3c040001, 0x24846018, 0x8c820000, 0x3c030001, 
+0x8c635ff0, 0x431025, 0xaf820204, 0x8c830000, 
+0x3c040001, 0x8c845ff0, 0x2402000b, 0x3c010001, 
+0xac225fd0, 0x641825, 0x3c010001, 0xac236020, 
+0x3c050001, 0x24a55fe0, 0x8ca20000, 0x2c424e21, 
+0x10400066, 0x24020002, 0x3c020001, 0x8c426010, 
 0x10400005, 0x0, 0x2402000c, 0x3c010001, 
-0x10000067, 0xac225ec0, 0x3c020001, 0x8c425ef0, 
-0x10400063, 0x0, 0x3c040001, 0x8c845ecc, 
-0x10800055, 0x30820008, 0x3c030001, 0x8c635edc, 
-0x1062005b, 0x24020003, 0x3c010001, 0xac245ef8, 
+0x10000067, 0xac225fd0, 0x3c020001, 0x8c426000, 
+0x10400063, 0x0, 0x3c040001, 0x8c845fdc, 
+0x10800055, 0x30820008, 0x3c030001, 0x8c635fec, 
+0x1062005b, 0x24020003, 0x3c010001, 0xac246008, 
 0xaca20000, 0x24020006, 0x3c010001, 0x10000054, 
-0xac225ec0, 0x8f820200, 0x34420002, 0xaf820200, 
-0x8f830054, 0x2402000d, 0x3c010001, 0xac225ec0, 
-0x3c010001, 0xac235ee4, 0x8f830054, 0x3c020001, 
-0x8c425ee4, 0x2463d8f0, 0x431023, 0x2c422710, 
-0x14400031, 0x0, 0x3c020001, 0x8c425f00, 
-0x10400020, 0x2402000e, 0x3c030001, 0x8c635f14, 
-0x3c010001, 0x14600015, 0xac225ec0, 0xc003c6b, 
-0x0, 0x3c050001, 0x8ca53d18, 0xc004981, 
-0x2021, 0x3c030001, 0x8c633d18, 0x24020004, 
-0x14620005, 0x2403fffb, 0x3c020001, 0x8c423d14, 
-0x10000003, 0x2403fff7, 0x3c020001, 0x8c423d14, 
-0x431024, 0x3c010001, 0xac223d14, 0x8f830224, 
-0x3c020200, 0x3c010001, 0xac235f1c, 0x10000020, 
-0x282a025, 0x3c020001, 0x8c425ef0, 0x10400005, 
-0x0, 0x3c020001, 0x8c425ecc, 0x1040000f, 
-0x24020002, 0x3c020001, 0x8c425ed0, 0x2c424e21, 
-0x1040000a, 0x24020002, 0x3c020001, 0x8c425ef0, 
-0x1040000f, 0x0, 0x3c020001, 0x8c425ecc, 
+0xac225fd0, 0x8f820200, 0x34420002, 0xaf820200, 
+0x8f830054, 0x2402000d, 0x3c010001, 0xac225fd0, 
+0x3c010001, 0xac235ff4, 0x8f830054, 0x3c020001, 
+0x8c425ff4, 0x2463d8f0, 0x431023, 0x2c422710, 
+0x14400031, 0x0, 0x3c020001, 0x8c426010, 
+0x10400020, 0x2402000e, 0x3c030001, 0x8c636024, 
+0x3c010001, 0x14600015, 0xac225fd0, 0xc003c9e, 
+0x0, 0x3c050001, 0x8ca53e28, 0xc0049b1, 
+0x2021, 0x3c030001, 0x8c633e28, 0x24020004, 
+0x14620005, 0x2403fffb, 0x3c020001, 0x8c423e24, 
+0x10000003, 0x2403fff7, 0x3c020001, 0x8c423e24, 
+0x431024, 0x3c010001, 0xac223e24, 0x8f830224, 
+0x3c020200, 0x3c010001, 0xac23602c, 0x10000020, 
+0x282a025, 0x3c020001, 0x8c426000, 0x10400005, 
+0x0, 0x3c020001, 0x8c425fdc, 0x1040000f, 
+0x24020002, 0x3c020001, 0x8c425fe0, 0x2c424e21, 
+0x1040000a, 0x24020002, 0x3c020001, 0x8c426000, 
+0x1040000f, 0x0, 0x3c020001, 0x8c425fdc, 
 0x1440000b, 0x0, 0x24020002, 0x3c010001, 
-0x10000007, 0xac225ec0, 0x3c020001, 0x8c425ef0, 
-0x10400003, 0x0, 0xc003bad, 0x0, 
+0x10000007, 0xac225fd0, 0x3c020001, 0x8c426000, 
+0x10400003, 0x0, 0xc003be0, 0x0, 
 0x8f820220, 0x3c03f700, 0x431025, 0xaf820220, 
 0x8fbf0010, 0x3e00008, 0x27bd0018, 0x3c030001, 
-0x24635f18, 0x8c620000, 0x10400005, 0x34422000, 
-0x3c010001, 0xac225f0c, 0x10000003, 0xac600000, 
-0x3c010001, 0xac245f0c, 0x3e00008, 0x0, 
+0x24636028, 0x8c620000, 0x10400005, 0x34422000, 
+0x3c010001, 0xac22601c, 0x10000003, 0xac600000, 
+0x3c010001, 0xac24601c, 0x3e00008, 0x0, 
 0x27bdffe0, 0x30820030, 0xafbf0018, 0x3c010001, 
-0xac225f14, 0x14400067, 0x3c02ffff, 0x34421f0e, 
+0xac226024, 0x14400067, 0x3c02ffff, 0x34421f0e, 
 0x821024, 0x14400061, 0x24020030, 0x30822000, 
 0x1040005d, 0x30838000, 0x31a02, 0x30820001, 
-0x21200, 0x3c040001, 0x8c843e5c, 0x621825, 
-0x331c2, 0x3c030001, 0x24633da8, 0x30828000, 
+0x21200, 0x3c040001, 0x8c843f6c, 0x621825, 
+0x331c2, 0x3c030001, 0x24633eb8, 0x30828000, 
 0x21202, 0x30840001, 0x42200, 0x441025, 
 0x239c2, 0x61080, 0x431021, 0x471021, 
 0x90430000, 0x24020001, 0x10620025, 0x0, 
@@ -8066,86 +8079,86 @@
 0x1062002c, 0x3c05000f, 0x10000037, 0x0, 
 0x8f820200, 0x2403feff, 0x431024, 0xaf820200, 
 0x8f820220, 0x3c03fffe, 0x3463ffff, 0x431024, 
-0xaf820220, 0x3c010001, 0xac205f34, 0x3c010001, 
-0x10000034, 0xac205f3c, 0x8f820200, 0x34420100, 
+0xaf820220, 0x3c010001, 0xac206044, 0x3c010001, 
+0x10000034, 0xac20604c, 0x8f820200, 0x34420100, 
 0xaf820200, 0x8f820220, 0x3c03fffe, 0x3463ffff, 
 0x431024, 0xaf820220, 0x24020100, 0x3c010001, 
-0xac225f34, 0x3c010001, 0x10000026, 0xac205f3c, 
+0xac226044, 0x3c010001, 0x10000026, 0xac20604c, 
 0x8f820200, 0x2403feff, 0x431024, 0xaf820200, 
 0x8f820220, 0x3c030001, 0x431025, 0xaf820220, 
-0x3c010001, 0xac205f34, 0x3c010001, 0x10000019, 
-0xac235f3c, 0x8f820200, 0x34420100, 0xaf820200, 
+0x3c010001, 0xac206044, 0x3c010001, 0x10000019, 
+0xac23604c, 0x8f820200, 0x34420100, 0xaf820200, 
 0x8f820220, 0x3c030001, 0x431025, 0xaf820220, 
-0x24020100, 0x3c010001, 0xac225f34, 0x3c010001, 
-0x1000000c, 0xac235f3c, 0x34a5ffff, 0x3c040001, 
-0x24843c08, 0xafa30010, 0xc0029d3, 0xafa00014, 
+0x24020100, 0x3c010001, 0xac226044, 0x3c010001, 
+0x1000000c, 0xac23604c, 0x34a5ffff, 0x3c040001, 
+0x24843d08, 0xafa30010, 0xc002a03, 0xafa00014, 
 0x10000004, 0x0, 0x24020030, 0x3c010001, 
-0xac225f18, 0x8fbf0018, 0x3e00008, 0x27bd0020, 
+0xac226028, 0x8fbf0018, 0x3e00008, 0x27bd0020, 
 0x0, 0x0, 0x0, 0x27bdffc8, 
 0xafb10024, 0x808821, 0xafb3002c, 0xa09821, 
-0xafb00020, 0xc08021, 0x3c040001, 0x24843c20, 
-0x3c050009, 0x3c020001, 0x8c423d18, 0x34a59001, 
+0xafb00020, 0xc08021, 0x3c040001, 0x24843d20, 
+0x3c050009, 0x3c020001, 0x8c423e28, 0x34a59001, 
 0x2203021, 0x2603821, 0xafbf0030, 0xafb20028, 
-0xa7a0001a, 0xafb00014, 0xc0029d3, 0xafa20010, 
+0xa7a0001a, 0xafb00014, 0xc002a03, 0xafa20010, 
 0x24020002, 0x126200eb, 0x2e620003, 0x10400005, 
 0x24020001, 0x1262000a, 0x3c02fffb, 0x100000e5, 
 0x0, 0x24020004, 0x1262006d, 0x24020008, 
 0x1262006c, 0x3c02ffec, 0x100000de, 0x0, 
 0x3442ffff, 0x2028024, 0x119140, 0x3c010001, 
-0x320821, 0xac305f2c, 0x3c024000, 0x2021024, 
+0x320821, 0xac30603c, 0x3c024000, 0x2021024, 
 0x10400046, 0x1023c2, 0x30840030, 0x101382, 
-0x3042000c, 0x3c030001, 0x24633d44, 0x431021, 
+0x3042000c, 0x3c030001, 0x24633e54, 0x431021, 
 0x823821, 0x3c020020, 0x2021024, 0x10400006, 
-0x24020100, 0x3c010001, 0x320821, 0xac225f30, 
+0x24020100, 0x3c010001, 0x320821, 0xac226040, 
 0x10000005, 0x3c020080, 0x3c010001, 0x320821, 
-0xac205f30, 0x3c020080, 0x2021024, 0x10400006, 
+0xac206040, 0x3c020080, 0x2021024, 0x10400006, 
 0x111940, 0x3c020001, 0x3c010001, 0x230821, 
-0x10000005, 0xac225f38, 0x111140, 0x3c010001, 
-0x220821, 0xac205f38, 0x94e30000, 0x32024000, 
+0x10000005, 0xac226048, 0x111140, 0x3c010001, 
+0x220821, 0xac206048, 0x94e30000, 0x32024000, 
 0x10400003, 0xa7a30018, 0x34624000, 0xa7a20018, 
 0x24040001, 0x94e20002, 0x24050004, 0x24e60002, 
-0x34420001, 0xc00420a, 0xa4e20002, 0x24040001, 
-0x2821, 0xc00420a, 0x27a60018, 0x3c020001, 
-0x8c423d18, 0x24110001, 0x3c010001, 0xac313d24, 
-0x14530004, 0x32028000, 0xc003bad, 0x0, 
-0x32028000, 0x10400097, 0x0, 0xc003bad, 
-0x0, 0x24020002, 0x3c010001, 0xac313d1c, 
-0x3c010001, 0x1000008f, 0xac223d18, 0x24040001, 
-0x24050004, 0x27b0001a, 0xc00420a, 0x2003021, 
-0x24040001, 0x2821, 0xc00420a, 0x2003021, 
-0x3c020001, 0x521021, 0x8c425f24, 0x3c040001, 
-0x8c843d18, 0x3c03bfff, 0x3463ffff, 0x3c010001, 
-0xac333d24, 0x431024, 0x3c010001, 0x320821, 
-0x10930076, 0xac225f24, 0x10000076, 0x0, 
+0x34420001, 0xc00423a, 0xa4e20002, 0x24040001, 
+0x2821, 0xc00423a, 0x27a60018, 0x3c020001, 
+0x8c423e28, 0x24110001, 0x3c010001, 0xac313e34, 
+0x14530004, 0x32028000, 0xc003be0, 0x0, 
+0x32028000, 0x10400097, 0x0, 0xc003be0, 
+0x0, 0x24020002, 0x3c010001, 0xac313e2c, 
+0x3c010001, 0x1000008f, 0xac223e28, 0x24040001, 
+0x24050004, 0x27b0001a, 0xc00423a, 0x2003021, 
+0x24040001, 0x2821, 0xc00423a, 0x2003021, 
+0x3c020001, 0x521021, 0x8c426034, 0x3c040001, 
+0x8c843e28, 0x3c03bfff, 0x3463ffff, 0x3c010001, 
+0xac333e34, 0x431024, 0x3c010001, 0x320821, 
+0x10930076, 0xac226034, 0x10000076, 0x0, 
 0x3c02ffec, 0x3442ffff, 0x2028024, 0x3c020008, 
 0x2028025, 0x111140, 0x3c010001, 0x220821, 
-0xac305f28, 0x3c022000, 0x2021024, 0x10400009, 
-0x0, 0x3c020001, 0x8c423da4, 0x14400005, 
-0x24020001, 0x3c010001, 0xac223e58, 0x10000004, 
-0x3c024000, 0x3c010001, 0xac203e58, 0x3c024000, 
+0xac306038, 0x3c022000, 0x2021024, 0x10400009, 
+0x0, 0x3c020001, 0x8c423eb4, 0x14400005, 
+0x24020001, 0x3c010001, 0xac223f68, 0x10000004, 
+0x3c024000, 0x3c010001, 0xac203f68, 0x3c024000, 
 0x2021024, 0x1440001a, 0x0, 0x3c020001, 
-0x8c423e58, 0x10400005, 0x24022020, 0x3c010001, 
-0xac223e5c, 0x24020001, 0xaee204b8, 0x3c04bfff, 
-0x111940, 0x3c020001, 0x431021, 0x8c425f20, 
-0x3c050001, 0x8ca53d18, 0x3484ffff, 0x441024, 
-0x3c010001, 0x230821, 0xac225f20, 0x24020001, 
+0x8c423f68, 0x10400005, 0x24022020, 0x3c010001, 
+0xac223f6c, 0x24020001, 0xaee204b8, 0x3c04bfff, 
+0x111940, 0x3c020001, 0x431021, 0x8c426030, 
+0x3c050001, 0x8ca53e28, 0x3484ffff, 0x441024, 
+0x3c010001, 0x230821, 0xac226030, 0x24020001, 
 0x10a20044, 0x0, 0x10000040, 0x0, 
-0x3c020001, 0x8c423e58, 0x1040001c, 0x24022000, 
-0x3c010001, 0xac223e5c, 0x3c0300a0, 0x2031024, 
+0x3c020001, 0x8c423f68, 0x1040001c, 0x24022000, 
+0x3c010001, 0xac223f6c, 0x3c0300a0, 0x2031024, 
 0x14430005, 0x111140, 0x3402a000, 0x3c010001, 
-0x1000002d, 0xac223e5c, 0x3c030001, 0x621821, 
-0x8c635f28, 0x3c020020, 0x621024, 0x10400004, 
-0x24022001, 0x3c010001, 0x10000023, 0xac223e5c, 
+0x1000002d, 0xac223f6c, 0x3c030001, 0x621821, 
+0x8c636038, 0x3c020020, 0x621024, 0x10400004, 
+0x24022001, 0x3c010001, 0x10000023, 0xac223f6c, 
 0x3c020080, 0x621024, 0x1040001f, 0x3402a001, 
-0x3c010001, 0x1000001c, 0xac223e5c, 0x3c020020, 
+0x3c010001, 0x1000001c, 0xac223f6c, 0x3c020020, 
 0x2021024, 0x10400007, 0x111940, 0x24020100, 
-0x3c010001, 0x230821, 0xac225f34, 0x10000006, 
+0x3c010001, 0x230821, 0xac226044, 0x10000006, 
 0x3c020080, 0x111140, 0x3c010001, 0x220821, 
-0xac205f34, 0x3c020080, 0x2021024, 0x10400006, 
+0xac206044, 0x3c020080, 0x2021024, 0x10400006, 
 0x111940, 0x3c020001, 0x3c010001, 0x230821, 
-0x10000005, 0xac225f3c, 0x111140, 0x3c010001, 
-0x220821, 0xac205f3c, 0x3c030001, 0x8c633d18, 
-0x24020001, 0x10620003, 0x0, 0xc003bad, 
+0x10000005, 0xac22604c, 0x111140, 0x3c010001, 
+0x220821, 0xac20604c, 0x3c030001, 0x8c633e28, 
+0x24020001, 0x10620003, 0x0, 0xc003be0, 
 0x0, 0x8fbf0030, 0x8fb3002c, 0x8fb20028, 
 0x8fb10024, 0x8fb00020, 0x3e00008, 0x27bd0038, 
 0x27bdffd0, 0xafb50028, 0x80a821, 0xafb20020, 
@@ -8155,95 +8168,95 @@
 0x10400005, 0x24020001, 0x10a2000a, 0x158140, 
 0x100000ae, 0x2201021, 0x24020004, 0x10a2005e, 
 0x24020008, 0x10a2005d, 0x152940, 0x100000a7, 
-0x2201021, 0x3c030001, 0x701821, 0x8c635f2c, 
+0x2201021, 0x3c030001, 0x701821, 0x8c63603c, 
 0x3c024000, 0x621024, 0x14400009, 0x24040001, 
 0x3c027fff, 0x3442ffff, 0x628824, 0x3c010001, 
-0x300821, 0xac315f24, 0x10000098, 0x2201021, 
-0x24050001, 0xc0041c8, 0x27a60010, 0x24040001, 
-0x24050001, 0xc0041c8, 0x27a60010, 0x97a20010, 
+0x300821, 0xac316034, 0x10000098, 0x2201021, 
+0x24050001, 0xc0041f8, 0x27a60010, 0x24040001, 
+0x24050001, 0xc0041f8, 0x27a60010, 0x97a20010, 
 0x30420004, 0x10400034, 0x3c114000, 0x3c030001, 
-0x8c633e70, 0x24020003, 0x10620008, 0x2c620004, 
+0x8c633f80, 0x24020003, 0x10620008, 0x2c620004, 
 0x14400029, 0x3c028000, 0x24020004, 0x10620014, 
 0x24040001, 0x10000024, 0x3c028000, 0x24040001, 
-0x24050011, 0x27b00012, 0xc0041c8, 0x2003021, 
-0x24040001, 0x24050011, 0xc0041c8, 0x2003021, 
+0x24050011, 0x27b00012, 0xc0041f8, 0x2003021, 
+0x24040001, 0x24050011, 0xc0041f8, 0x2003021, 
 0x97a30012, 0x30624000, 0x10400002, 0x3c130010, 
 0x3c130008, 0x3c120001, 0x10000010, 0x30628000, 
-0x24050014, 0x27b00012, 0xc0041c8, 0x2003021, 
-0x24040001, 0x24050014, 0xc0041c8, 0x2003021, 
+0x24050014, 0x27b00012, 0xc0041f8, 0x2003021, 
+0x24040001, 0x24050014, 0xc0041f8, 0x2003021, 
 0x97a30012, 0x30621000, 0x10400002, 0x3c130010, 
 0x3c130008, 0x3c120001, 0x30620800, 0x54400001, 
 0x3c120002, 0x3c028000, 0x2221025, 0x2531825, 
 0x10000007, 0x438825, 0x3c110001, 0x2308821, 
-0x8e315f2c, 0x3c027fff, 0x3442ffff, 0x2228824, 
-0x151140, 0x3c010001, 0x220821, 0xac315f24, 
+0x8e31603c, 0x3c027fff, 0x3442ffff, 0x2228824, 
+0x151140, 0x3c010001, 0x220821, 0xac316034, 
 0x1000004e, 0x2201021, 0x152940, 0x3c030001, 
-0x651821, 0x8c635f28, 0x3c024000, 0x621024, 
+0x651821, 0x8c636038, 0x3c024000, 0x621024, 
 0x14400008, 0x3c027fff, 0x3442ffff, 0x628824, 
-0x3c010001, 0x250821, 0xac315f20, 0x1000003f, 
-0x2201021, 0x3c020001, 0x8c423d28, 0x10400033, 
-0x3c11c00c, 0x3c020001, 0x8c423da4, 0x3c04c00c, 
-0x34842000, 0x3c030001, 0x8c633e58, 0x2102b, 
+0x3c010001, 0x250821, 0xac316030, 0x1000003f, 
+0x2201021, 0x3c020001, 0x8c423e38, 0x10400033, 
+0x3c11c00c, 0x3c020001, 0x8c423eb4, 0x3c04c00c, 
+0x34842000, 0x3c030001, 0x8c633f68, 0x2102b, 
 0x21023, 0x441024, 0x10600003, 0x518825, 
 0x3c022000, 0x2228825, 0x3c020001, 0x451021, 
-0x8c425f34, 0x10400003, 0x3c020020, 0x10000004, 
+0x8c426044, 0x10400003, 0x3c020020, 0x10000004, 
 0x2228825, 0x3c02ffdf, 0x3442ffff, 0x2228824, 
-0x151140, 0x3c010001, 0x220821, 0x8c225f3c, 
+0x151140, 0x3c010001, 0x220821, 0x8c22604c, 
 0x10400003, 0x3c020080, 0x10000004, 0x2228825, 
 0x3c02ff7f, 0x3442ffff, 0x2228824, 0x3c020001, 
-0x8c423d90, 0x10400002, 0x3c020800, 0x2228825, 
-0x3c020001, 0x8c423d94, 0x10400002, 0x3c020400, 
-0x2228825, 0x3c020001, 0x8c423d98, 0x10400006, 
+0x8c423ea0, 0x10400002, 0x3c020800, 0x2228825, 
+0x3c020001, 0x8c423ea4, 0x10400002, 0x3c020400, 
+0x2228825, 0x3c020001, 0x8c423ea8, 0x10400006, 
 0x3c020100, 0x10000004, 0x2228825, 0x3c027fff, 
 0x3442ffff, 0x628824, 0x151140, 0x3c010001, 
-0x220821, 0xac315f20, 0x2201021, 0x8fbf002c, 
+0x220821, 0xac316030, 0x2201021, 0x8fbf002c, 
 0x8fb50028, 0x8fb30024, 0x8fb20020, 0x8fb1001c, 
 0x8fb00018, 0x3e00008, 0x27bd0030, 0x27bdffe0, 
 0xafb20018, 0x809021, 0xafbf001c, 0xafb10014, 
-0xafb00010, 0x8f840200, 0x3c030001, 0x8c633d18, 
+0xafb00010, 0x8f840200, 0x3c030001, 0x8c633e28, 
 0x8f860220, 0x24020002, 0x106200a6, 0x2c620003, 
 0x10400005, 0x24020001, 0x1062000a, 0x121940, 
 0x100000a0, 0x0, 0x24020004, 0x10620053, 
 0x24020008, 0x10620052, 0x128940, 0x10000099, 
-0x0, 0x3c050001, 0xa32821, 0x8ca55f2c, 
-0x3c100001, 0x2038021, 0x8e105f24, 0x3c024000, 
+0x0, 0x3c050001, 0xa32821, 0x8ca5603c, 
+0x3c100001, 0x2038021, 0x8e106034, 0x3c024000, 
 0xa21024, 0x10400038, 0x3c020008, 0x2021024, 
 0x10400020, 0x34840002, 0x3c020001, 0x431021, 
-0x8c425f30, 0x10400005, 0x34840020, 0x34840100, 
+0x8c426040, 0x10400005, 0x34840020, 0x34840100, 
 0x3c020020, 0x10000006, 0x2028025, 0x2402feff, 
 0x822024, 0x3c02ffdf, 0x3442ffff, 0x2028024, 
-0x121140, 0x3c010001, 0x220821, 0x8c225f38, 
+0x121140, 0x3c010001, 0x220821, 0x8c226048, 
 0x10400005, 0x3c020001, 0xc23025, 0x3c020080, 
 0x10000016, 0x2028025, 0x3c02fffe, 0x3442ffff, 
 0xc23024, 0x3c02ff7f, 0x3442ffff, 0x1000000f, 
 0x2028024, 0x2402fedf, 0x822024, 0x3c02fffe, 
 0x3442ffff, 0xc23024, 0x3c02ff5f, 0x3442ffff, 
-0x2028024, 0x3c010001, 0x230821, 0xac205f30, 
-0x3c010001, 0x230821, 0xac205f38, 0xaf840200, 
+0x2028024, 0x3c010001, 0x230821, 0xac206040, 
+0x3c010001, 0x230821, 0xac206048, 0xaf840200, 
 0xaf860220, 0x8f820220, 0x34420002, 0xaf820220, 
 0x1000000a, 0x121140, 0x3c02bfff, 0x3442ffff, 
 0x8f830200, 0x2028024, 0x2402fffd, 0x621824, 
-0xc003bad, 0xaf830200, 0x121140, 0x3c010001, 
-0x220821, 0x1000004b, 0xac305f24, 0x128940, 
-0x3c050001, 0xb12821, 0x8ca55f28, 0x3c100001, 
-0x2118021, 0x8e105f20, 0x3c024000, 0xa21024, 
-0x14400010, 0x0, 0x3c020001, 0x8c423e58, 
+0xc003be0, 0xaf830200, 0x121140, 0x3c010001, 
+0x220821, 0x1000004b, 0xac306034, 0x128940, 
+0x3c050001, 0xb12821, 0x8ca56038, 0x3c100001, 
+0x2118021, 0x8e106030, 0x3c024000, 0xa21024, 
+0x14400010, 0x0, 0x3c020001, 0x8c423f68, 
 0x14400005, 0x3c02bfff, 0x8f820200, 0x34420002, 
-0xaf820200, 0x3c02bfff, 0x3442ffff, 0xc003bad, 
+0xaf820200, 0x3c02bfff, 0x3442ffff, 0xc003be0, 
 0x2028024, 0x3c010001, 0x310821, 0x10000031, 
-0xac305f20, 0x3c020001, 0x8c423e58, 0x10400005, 
-0x3c020020, 0x3c020001, 0x8c423da4, 0x10400025, 
+0xac306030, 0x3c020001, 0x8c423f68, 0x10400005, 
+0x3c020020, 0x3c020001, 0x8c423eb4, 0x10400025, 
 0x3c020020, 0xa21024, 0x10400007, 0x34840020, 
-0x24020100, 0x3c010001, 0x310821, 0xac225f34, 
+0x24020100, 0x3c010001, 0x310821, 0xac226044, 
 0x10000006, 0x34840100, 0x3c010001, 0x310821, 
-0xac205f34, 0x2402feff, 0x822024, 0x3c020080, 
+0xac206044, 0x2402feff, 0x822024, 0x3c020080, 
 0xa21024, 0x10400007, 0x121940, 0x3c020001, 
-0x3c010001, 0x230821, 0xac225f3c, 0x10000008, 
+0x3c010001, 0x230821, 0xac22604c, 0x10000008, 
 0xc23025, 0x121140, 0x3c010001, 0x220821, 
-0xac205f3c, 0x3c02fffe, 0x3442ffff, 0xc23024, 
+0xac20604c, 0x3c02fffe, 0x3442ffff, 0xc23024, 
 0xaf840200, 0xaf860220, 0x8f820220, 0x34420002, 
 0xaf820220, 0x121140, 0x3c010001, 0x220821, 
-0xac305f20, 0x8fbf001c, 0x8fb20018, 0x8fb10014, 
+0xac306030, 0x8fbf001c, 0x8fb20018, 0x8fb10014, 
 0x8fb00010, 0x3e00008, 0x27bd0020, 0x1821, 
 0x308400ff, 0x2405ffdf, 0x2406ffbf, 0x641007, 
 0x30420001, 0x10400004, 0x0, 0x8f820044, 
@@ -8255,11 +8268,11 @@
 u32 tigon2FwRodata[(MAX_RODATA_LEN/4) + 1] __initdata = {
 0x24486561, 0x6465723a, 0x202f7072, 
 0x6f6a6563, 0x74732f72, 0x63732f73, 0x772f6765, 
-0x2f6e6963, 0x2f667732, 0x2f636f6d, 0x6d6f6e2f, 
-0x66776d61, 0x696e2e63, 0x2c762031, 0x2e312e32, 
-0x2e343520, 0x31393939, 0x2f30312f, 0x32342030, 
-0x303a3130, 0x3a353520, 0x73687561, 0x6e672045, 
-0x78702024, 0x0, 0x65767452, 0x6e674600, 
+0x2f2e2f6e, 0x69632f66, 0x77322f63, 0x6f6d6d6f, 
+0x6e2f6677, 0x6d61696e, 0x2e632c76, 0x20312e31, 
+0x2e322e34, 0x35203139, 0x39392f30, 0x312f3234, 
+0x2030303a, 0x31303a35, 0x35207368, 0x75616e67, 
+0x20457870, 0x20240000, 0x65767452, 0x6e674600, 
 0x51657674, 0x46000000, 0x51657674, 0x505f4600, 
 0x4d657674, 0x526e6746, 0x0, 0x4d516576, 
 0x74460000, 0x4d516576, 0x505f4600, 0x5173436f, 
@@ -8326,27 +8339,27 @@
 0x5f646573, 0x63720000, 0x2b685f68, 0x665f7469, 
 0x6d657200, 0x24486561, 0x6465723a, 0x202f7072, 
 0x6f6a6563, 0x74732f72, 0x63732f73, 0x772f6765, 
-0x2f6e6963, 0x2f667732, 0x2f636f6d, 0x6d6f6e2f, 
-0x74696d65, 0x722e632c, 0x7620312e, 0x312e322e, 
-0x33352031, 0x3939392f, 0x30312f32, 0x37203139, 
-0x3a30393a, 0x35302068, 0x61796573, 0x20457870, 
-0x20240000, 0x65767452, 0x6e674600, 0x51657674, 
-0x46000000, 0x51657674, 0x505f4600, 0x4d657674, 
-0x526e6746, 0x0, 0x4d516576, 0x74460000, 
-0x4d516576, 0x505f4600, 0x5173436f, 0x6e495f46, 
-0x0, 0x5173436f, 0x6e734600, 0x51725072, 
-0x6f644600, 0x542d446d, 0x61526432, 0x0, 
-0x542d446d, 0x61526431, 0x0, 0x542d446d, 
-0x61526442, 0x0, 0x542d446d, 0x61577232, 
-0x0, 0x542d446d, 0x61577231, 0x0, 
-0x542d446d, 0x61577242, 0x0, 0x0, 
+0x2f2e2f6e, 0x69632f66, 0x77322f63, 0x6f6d6d6f, 
+0x6e2f7469, 0x6d65722e, 0x632c7620, 0x312e312e, 
+0x322e3335, 0x20313939, 0x392f3031, 0x2f323720, 
+0x31393a30, 0x393a3530, 0x20686179, 0x65732045, 
+0x78702024, 0x0, 0x65767452, 0x6e674600, 
+0x51657674, 0x46000000, 0x51657674, 0x505f4600, 
+0x4d657674, 0x526e6746, 0x0, 0x4d516576, 
+0x74460000, 0x4d516576, 0x505f4600, 0x5173436f, 
+0x6e495f46, 0x0, 0x5173436f, 0x6e734600, 
+0x51725072, 0x6f644600, 0x542d446d, 0x61526432, 
+0x0, 0x542d446d, 0x61526431, 0x0, 
+0x542d446d, 0x61526442, 0x0, 0x542d446d, 
+0x61577232, 0x0, 0x542d446d, 0x61577231, 
+0x0, 0x542d446d, 0x61577242, 0x0, 
 0x0, 0x24486561, 0x6465723a, 0x202f7072, 
 0x6f6a6563, 0x74732f72, 0x63732f73, 0x772f6765, 
-0x2f6e6963, 0x2f667732, 0x2f636f6d, 0x6d6f6e2f, 
-0x636f6d6d, 0x616e642e, 0x632c7620, 0x312e312e, 
-0x322e3238, 0x20313939, 0x392f3031, 0x2f323020, 
-0x31393a34, 0x393a3439, 0x20736875, 0x616e6720, 
-0x45787020, 0x24000000, 0x65767452, 0x6e674600, 
+0x2f2e2f6e, 0x69632f66, 0x77322f63, 0x6f6d6d6f, 
+0x6e2f636f, 0x6d6d616e, 0x642e632c, 0x7620312e, 
+0x312e322e, 0x32382031, 0x3939392f, 0x30312f32, 
+0x30203139, 0x3a34393a, 0x34392073, 0x6875616e, 
+0x67204578, 0x70202400, 0x65767452, 0x6e674600, 
 0x51657674, 0x46000000, 0x51657674, 0x505f4600, 
 0x4d657674, 0x526e6746, 0x0, 0x4d516576, 
 0x74460000, 0x4d516576, 0x505f4600, 0x5173436f, 
@@ -8363,25 +8376,25 @@
 0x8218, 0x827c, 0x0, 0x0, 
 0x0, 0x24486561, 0x6465723a, 0x202f7072, 
 0x6f6a6563, 0x74732f72, 0x63732f73, 0x772f6765, 
-0x2f6e6963, 0x2f667732, 0x2f636f6d, 0x6d6f6e2f, 
-0x6d636173, 0x742e632c, 0x7620312e, 0x312e322e, 
-0x38203139, 0x39382f31, 0x322f3038, 0x2030323a, 
-0x33363a33, 0x36207368, 0x75616e67, 0x20457870, 
-0x20240000, 0x65767452, 0x6e674600, 0x51657674, 
-0x46000000, 0x51657674, 0x505f4600, 0x4d657674, 
-0x526e6746, 0x0, 0x4d516576, 0x74460000, 
-0x4d516576, 0x505f4600, 0x5173436f, 0x6e495f46, 
-0x0, 0x5173436f, 0x6e734600, 0x51725072, 
-0x6f644600, 0x6164644d, 0x63447570, 0x0, 
-0x6164644d, 0x6346756c, 0x0, 0x64656c4d, 
-0x634e6f45, 0x0, 0x0, 0x0, 
+0x2f2e2f6e, 0x69632f66, 0x77322f63, 0x6f6d6d6f, 
+0x6e2f6d63, 0x6173742e, 0x632c7620, 0x312e312e, 
+0x322e3820, 0x31393938, 0x2f31322f, 0x30382030, 
+0x323a3336, 0x3a333620, 0x73687561, 0x6e672045, 
+0x78702024, 0x0, 0x65767452, 0x6e674600, 
+0x51657674, 0x46000000, 0x51657674, 0x505f4600, 
+0x4d657674, 0x526e6746, 0x0, 0x4d516576, 
+0x74460000, 0x4d516576, 0x505f4600, 0x5173436f, 
+0x6e495f46, 0x0, 0x5173436f, 0x6e734600, 
+0x51725072, 0x6f644600, 0x6164644d, 0x63447570, 
+0x0, 0x6164644d, 0x6346756c, 0x0, 
+0x64656c4d, 0x634e6f45, 0x0, 0x0, 
 0x0, 0x24486561, 0x6465723a, 0x202f7072, 
 0x6f6a6563, 0x74732f72, 0x63732f73, 0x772f6765, 
-0x2f6e6963, 0x2f667732, 0x2f636f6d, 0x6d6f6e2f, 
-0x646d612e, 0x632c7620, 0x312e312e, 0x322e3234, 
-0x20313939, 0x382f3132, 0x2f323120, 0x30303a33, 
-0x333a3039, 0x20736875, 0x616e6720, 0x45787020, 
-0x24000000, 0x65767452, 0x6e674600, 0x51657674, 
+0x2f2e2f6e, 0x69632f66, 0x77322f63, 0x6f6d6d6f, 
+0x6e2f646d, 0x612e632c, 0x7620312e, 0x312e322e, 
+0x32342031, 0x3939382f, 0x31322f32, 0x31203030, 
+0x3a33333a, 0x30392073, 0x6875616e, 0x67204578, 
+0x70202400, 0x65767452, 0x6e674600, 0x51657674, 
 0x46000000, 0x51657674, 0x505f4600, 0x4d657674, 
 0x526e6746, 0x0, 0x4d516576, 0x74460000, 
 0x4d516576, 0x505f4600, 0x5173436f, 0x6e495f46, 
@@ -8390,81 +8403,84 @@
 0x31446d61, 0x4f6e0000, 0x7377446d, 0x614f6e00, 
 0x2372446d, 0x6141544e, 0x0, 0x72446d61, 
 0x41544e30, 0x0, 0x72446d61, 0x41544e31, 
-0x0, 0x2a50414e, 0x49432a00, 0x2e2e2f2e, 
-0x2e2f2e2e, 0x2f2e2e2f, 0x2e2e2f73, 0x72632f6e, 
-0x69632f66, 0x77322f63, 0x6f6d6d6f, 0x6e2f646d, 
-0x612e6300, 0x2377446d, 0x6141544e, 0x0, 
-0x77446d61, 0x41544e30, 0x0, 0x77446d61, 
-0x41544e31, 0x0, 0x0, 0x0, 
+0x0, 0x72446d61, 0x34476200, 0x2a50414e, 
+0x49432a00, 0x2e2e2f2e, 0x2e2f2e2e, 0x2f2e2e2f, 
+0x2e2e2f73, 0x72632f6e, 0x69632f66, 0x77322f63, 
+0x6f6d6d6f, 0x6e2f646d, 0x612e6300, 0x2377446d, 
+0x6141544e, 0x0, 0x77446d61, 0x41544e30, 
+0x0, 0x77446d61, 0x41544e31, 0x0, 
+0x77446d61, 0x34476200, 0x0, 0x0, 
 0x0, 0x24486561, 0x6465723a, 0x202f7072, 
 0x6f6a6563, 0x74732f72, 0x63732f73, 0x772f6765, 
-0x2f6e6963, 0x2f667732, 0x2f636f6d, 0x6d6f6e2f, 
-0x74726163, 0x652e632c, 0x7620312e, 0x312e322e, 
-0x35203139, 0x39382f30, 0x392f3330, 0x2031383a, 
-0x35303a32, 0x38207368, 0x75616e67, 0x20457870, 
-0x20240000, 0x24486561, 0x6465723a, 0x202f7072, 
-0x6f6a6563, 0x74732f72, 0x63732f73, 0x772f6765, 
-0x2f6e6963, 0x2f667732, 0x2f636f6d, 0x6d6f6e2f, 
-0x64617461, 0x2e632c76, 0x20312e31, 0x2e322e31, 
-0x32203139, 0x39392f30, 0x312f3230, 0x2031393a, 
-0x34393a35, 0x31207368, 0x75616e67, 0x20457870, 
-0x20240000, 0x46575f56, 0x45525349, 0x4f4e3a20, 
-0x2331204d, 0x6f6e2046, 0x65622031, 0x2031373a, 
-0x30313a30, 0x36205053, 0x54203139, 0x39390000, 
-0x46575f43, 0x4f4d5049, 0x4c455f54, 0x494d453a, 
-0x2031373a, 0x30313a30, 0x36000000, 0x46575f43, 
-0x4f4d5049, 0x4c455f42, 0x593a2064, 0x65767263, 
-0x73000000, 0x46575f43, 0x4f4d5049, 0x4c455f48, 
-0x4f53543a, 0x20636f6d, 0x70757465, 0x0, 
-0x46575f43, 0x4f4d5049, 0x4c455f44, 0x4f4d4149, 
-0x4e3a2065, 0x6e672e61, 0x6374656f, 0x6e2e636f, 
-0x6d000000, 0x46575f43, 0x4f4d5049, 0x4c45523a, 
-0x20676363, 0x20766572, 0x73696f6e, 0x20322e37, 
-0x2e320000, 0x0, 0x12030303, 0x0, 
+0x2f2e2f6e, 0x69632f66, 0x77322f63, 0x6f6d6d6f, 
+0x6e2f7472, 0x6163652e, 0x632c7620, 0x312e312e, 
+0x322e3520, 0x31393938, 0x2f30392f, 0x33302031, 
+0x383a3530, 0x3a323820, 0x73687561, 0x6e672045, 
+0x78702024, 0x0, 0x0, 0x0, 
 0x0, 0x24486561, 0x6465723a, 0x202f7072, 
 0x6f6a6563, 0x74732f72, 0x63732f73, 0x772f6765, 
-0x2f6e6963, 0x2f667732, 0x2f636f6d, 0x6d6f6e2f, 
-0x6d656d2e, 0x632c7620, 0x312e312e, 0x322e3520, 
-0x31393938, 0x2f30392f, 0x33302031, 0x383a3530, 
-0x3a303820, 0x73687561, 0x6e672045, 0x78702024, 
+0x2f2e2f6e, 0x69632f66, 0x77322f63, 0x6f6d6d6f, 
+0x6e2f6461, 0x74612e63, 0x2c762031, 0x2e312e32, 
+0x2e313220, 0x31393939, 0x2f30312f, 0x32302031, 
+0x393a3439, 0x3a353120, 0x73687561, 0x6e672045, 
+0x78702024, 0x0, 0x46575f56, 0x45525349, 
+0x4f4e3a20, 0x23312054, 0x75652041, 0x70722032, 
+0x30203137, 0x3a32333a, 0x30322050, 0x44542031, 
+0x39393900, 0x46575f43, 0x4f4d5049, 0x4c455f54, 
+0x494d453a, 0x2031373a, 0x32333a30, 0x32000000, 
+0x46575f43, 0x4f4d5049, 0x4c455f42, 0x593a2064, 
+0x65767263, 0x73000000, 0x46575f43, 0x4f4d5049, 
+0x4c455f48, 0x4f53543a, 0x20636f6d, 0x70757465, 
+0x0, 0x46575f43, 0x4f4d5049, 0x4c455f44, 
+0x4f4d4149, 0x4e3a2065, 0x6e672e61, 0x6374656f, 
+0x6e2e636f, 0x6d000000, 0x46575f43, 0x4f4d5049, 
+0x4c45523a, 0x20676363, 0x20766572, 0x73696f6e, 
+0x20322e37, 0x2e320000, 0x0, 0x12030303, 
 0x0, 0x24486561, 0x6465723a, 0x202f7072, 
 0x6f6a6563, 0x74732f72, 0x63732f73, 0x772f6765, 
-0x2f6e6963, 0x2f667732, 0x2f636f6d, 0x6d6f6e2f, 
-0x73656e64, 0x2e632c76, 0x20312e31, 0x2e322e34, 
-0x34203139, 0x39382f31, 0x322f3231, 0x2030303a, 
-0x33333a31, 0x38207368, 0x75616e67, 0x20457870, 
-0x20240000, 0x65767452, 0x6e674600, 0x51657674, 
-0x46000000, 0x51657674, 0x505f4600, 0x4d657674, 
-0x526e6746, 0x0, 0x4d516576, 0x74460000, 
-0x4d516576, 0x505f4600, 0x5173436f, 0x6e495f46, 
-0x0, 0x5173436f, 0x6e734600, 0x51725072, 
-0x6f644600, 0x69736e74, 0x54637055, 0x0, 
+0x2f2e2f6e, 0x69632f66, 0x77322f63, 0x6f6d6d6f, 
+0x6e2f6d65, 0x6d2e632c, 0x7620312e, 0x312e322e, 
+0x35203139, 0x39382f30, 0x392f3330, 0x2031383a, 
+0x35303a30, 0x38207368, 0x75616e67, 0x20457870, 
+0x20240000, 0x24486561, 0x6465723a, 0x202f7072, 
+0x6f6a6563, 0x74732f72, 0x63732f73, 0x772f6765, 
+0x2f2e2f6e, 0x69632f66, 0x77322f63, 0x6f6d6d6f, 
+0x6e2f7365, 0x6e642e63, 0x2c762031, 0x2e312e32, 
+0x2e343420, 0x31393938, 0x2f31322f, 0x32312030, 
+0x303a3333, 0x3a313820, 0x73687561, 0x6e672045, 
+0x78702024, 0x0, 0x65767452, 0x6e674600, 
+0x51657674, 0x46000000, 0x51657674, 0x505f4600, 
+0x4d657674, 0x526e6746, 0x0, 0x4d516576, 
+0x74460000, 0x4d516576, 0x505f4600, 0x5173436f, 
+0x6e495f46, 0x0, 0x5173436f, 0x6e734600, 
+0x51725072, 0x6f644600, 0x69736e74, 0x54637055, 
 0x0, 0x24486561, 0x6465723a, 0x202f7072, 
 0x6f6a6563, 0x74732f72, 0x63732f73, 0x772f6765, 
-0x2f6e6963, 0x2f667732, 0x2f636f6d, 0x6d6f6e2f, 
-0x72656376, 0x2e632c76, 0x20312e31, 0x2e322e35, 
-0x33203139, 0x39392f30, 0x312f3136, 0x2030323a, 
-0x35353a34, 0x33207368, 0x75616e67, 0x20457870, 
-0x20240000, 0x65767452, 0x6e674600, 0x51657674, 
-0x46000000, 0x51657674, 0x505f4600, 0x4d657674, 
-0x526e6746, 0x0, 0x4d516576, 0x74460000, 
-0x4d516576, 0x505f4600, 0x5173436f, 0x6e495f46, 
-0x0, 0x5173436f, 0x6e734600, 0x51725072, 
-0x6f644600, 0x72784672, 0x6d324c67, 0x0, 
-0x72784e6f, 0x53744264, 0x0, 0x72784e6f, 
-0x4d694264, 0x0, 0x72784e6f, 0x4a6d4264, 
-0x0, 0x7278436b, 0x446d6146, 0x0, 
-0x72785144, 0x6d457846, 0x0, 0x72785144, 
-0x6d614600, 0x72785144, 0x4c426446, 0x0, 
-0x72785144, 0x6d426446, 0x0, 0x72784372, 
-0x63506164, 0x0, 0x72536d51, 0x446d6146, 
+0x2f2e2f6e, 0x69632f66, 0x77322f63, 0x6f6d6d6f, 
+0x6e2f7265, 0x63762e63, 0x2c762031, 0x2e312e32, 
+0x2e353320, 0x31393939, 0x2f30312f, 0x31362030, 
+0x323a3535, 0x3a343320, 0x73687561, 0x6e672045, 
+0x78702024, 0x0, 0x65767452, 0x6e674600, 
+0x51657674, 0x46000000, 0x51657674, 0x505f4600, 
+0x4d657674, 0x526e6746, 0x0, 0x4d516576, 
+0x74460000, 0x4d516576, 0x505f4600, 0x5173436f, 
+0x6e495f46, 0x0, 0x5173436f, 0x6e734600, 
+0x51725072, 0x6f644600, 0x72784672, 0x6d324c67, 
+0x0, 0x72784e6f, 0x53744264, 0x0, 
+0x72784e6f, 0x4d694264, 0x0, 0x72784e6f, 
+0x4a6d4264, 0x0, 0x7278436b, 0x446d6146, 
+0x0, 0x72785144, 0x6d457846, 0x0, 
+0x72785144, 0x6d614600, 0x72785144, 0x4c426446, 
+0x0, 0x72785144, 0x6d426446, 0x0, 
+0x72784372, 0x63506164, 0x0, 0x72536d51, 
+0x446d6146, 0x0, 0x0, 0x0, 
 0x0, 0x24486561, 0x6465723a, 0x202f7072, 
 0x6f6a6563, 0x74732f72, 0x63732f73, 0x772f6765, 
-0x2f6e6963, 0x2f667732, 0x2f636f6d, 0x6d6f6e2f, 
-0x6d61632e, 0x632c7620, 0x312e312e, 0x322e3232, 
-0x20313939, 0x382f3132, 0x2f303820, 0x30323a33, 
-0x363a3330, 0x20736875, 0x616e6720, 0x45787020, 
-0x24000000, 0x65767452, 0x6e674600, 0x51657674, 
+0x2f2e2f6e, 0x69632f66, 0x77322f63, 0x6f6d6d6f, 
+0x6e2f6d61, 0x632e632c, 0x7620312e, 0x312e322e, 
+0x32322031, 0x3939382f, 0x31322f30, 0x38203032, 
+0x3a33363a, 0x33302073, 0x6875616e, 0x67204578, 
+0x70202400, 0x65767452, 0x6e674600, 0x51657674, 
 0x46000000, 0x51657674, 0x505f4600, 0x4d657674, 
 0x526e6746, 0x0, 0x4d516576, 0x74460000, 
 0x4d516576, 0x505f4600, 0x5173436f, 0x6e495f46, 
@@ -8476,32 +8492,33 @@
 0x6c696e6b, 0x55500000, 0x0, 0x0, 
 0x0, 0x24486561, 0x6465723a, 0x202f7072, 
 0x6f6a6563, 0x74732f72, 0x63732f73, 0x772f6765, 
-0x2f6e6963, 0x2f667732, 0x2f636f6d, 0x6d6f6e2f, 
-0x636b7375, 0x6d2e632c, 0x7620312e, 0x312e322e, 
-0x39203139, 0x39392f30, 0x312f3134, 0x2030303a, 
-0x30333a34, 0x38207368, 0x75616e67, 0x20457870, 
-0x20240000, 0x65767452, 0x6e674600, 0x51657674, 
-0x46000000, 0x51657674, 0x505f4600, 0x4d657674, 
-0x526e6746, 0x0, 0x4d516576, 0x74460000, 
-0x4d516576, 0x505f4600, 0x5173436f, 0x6e495f46, 
-0x0, 0x5173436f, 0x6e734600, 0x51725072, 
-0x6f644600, 0x50726f62, 0x65506879, 0x0, 
-0x6c6e6b41, 0x53535254, 0x0, 0xff04, 
-0xff34, 0xff4c, 0xff78, 0xffa4, 
-0xffb8, 0xfff4, 0x10394, 0x10174, 
-0x101ac, 0x100a4, 0x10200, 0x10228, 
-0x1025c, 0x100e8, 0x10394, 0x10174, 
-0x101ac, 0x101d0, 0x10200, 0x10228, 
-0x1025c, 0x10288, 0x0, 0x0, 
-0x0, 0x1097c, 0x10a4c, 0x10b24, 
-0x10bf4, 0x10c50, 0x10d2c, 0x10d54, 
-0x10e30, 0x10e58, 0x11000, 0x11028, 
-0x111d0, 0x113c8, 0x1165c, 0x11570, 
-0x1165c, 0x11688, 0x111f8, 0x113a0, 
-0x0, 0x1198c, 0x119cc, 0x11a5c, 
-0x11aa0, 0x11b04, 0x11b90, 0x11bc4, 
-0x11c4c, 0x11ce4, 0x11db4, 0x11df4, 
-0x11e78, 0x11e9c, 0x11fac, 0x646f4261, 
+0x2f2e2f6e, 0x69632f66, 0x77322f63, 0x6f6d6d6f, 
+0x6e2f636b, 0x73756d2e, 0x632c7620, 0x312e312e, 
+0x322e3920, 0x31393939, 0x2f30312f, 0x31342030, 
+0x303a3033, 0x3a343820, 0x73687561, 0x6e672045, 
+0x78702024, 0x0, 0x65767452, 0x6e674600, 
+0x51657674, 0x46000000, 0x51657674, 0x505f4600, 
+0x4d657674, 0x526e6746, 0x0, 0x4d516576, 
+0x74460000, 0x4d516576, 0x505f4600, 0x5173436f, 
+0x6e495f46, 0x0, 0x5173436f, 0x6e734600, 
+0x51725072, 0x6f644600, 0x0, 0x0, 
+0x0, 0x50726f62, 0x65506879, 0x0, 
+0x6c6e6b41, 0x53535254, 0x0, 0xffc4, 
+0xfff4, 0x1000c, 0x10038, 0x10064, 
+0x10078, 0x100b4, 0x10454, 0x10234, 
+0x1026c, 0x10164, 0x102c0, 0x102e8, 
+0x1031c, 0x101a8, 0x10454, 0x10234, 
+0x1026c, 0x10290, 0x102c0, 0x102e8, 
+0x1031c, 0x10348, 0x0, 0x0, 
+0x0, 0x10a3c, 0x10b0c, 0x10be4, 
+0x10cb4, 0x10d10, 0x10dec, 0x10e14, 
+0x10ef0, 0x10f18, 0x110c0, 0x110e8, 
+0x11290, 0x11488, 0x1171c, 0x11630, 
+0x1171c, 0x11748, 0x112b8, 0x11460, 
+0x0, 0x11a4c, 0x11a8c, 0x11b1c, 
+0x11b60, 0x11bc4, 0x11c50, 0x11c84, 
+0x11d0c, 0x11da4, 0x11e74, 0x11eb4, 
+0x11f38, 0x11f5c, 0x1206c, 0x646f4261, 
 0x73655067, 0x0, 0x0, 0x0, 
 0x0, 0x73746d61, 0x634c4e4b, 0x0, 
 0x0, 0x0 };
diff -urN linux-2.2.11-pre2/drivers/net/bmac.c linux/drivers/net/bmac.c
--- linux-2.2.11-pre2/drivers/net/bmac.c	Wed Dec 30 10:55:07 1998
+++ linux/drivers/net/bmac.c	Mon Dec  3 18:52:26 2001
@@ -297,7 +297,6 @@
 	val = bmac_mif_readbits(dev, 17);
 	bmwrite(dev, MIFCSR, 4);
 	MIFDELAY;
-	/* printk(KERN_DEBUG "bmac_mif_read(%x) -> %x\n", addr, val); */
 	return val;
 }
 
@@ -431,18 +430,26 @@
 static int
 bmac_init_chip(struct device *dev)
 {
-	if (is_bmac_plus && bmac_mif_read(dev, 2) == 0x7810) {
-		if (bmac_mif_read(dev, 4) == 0xa1) {
-			bmac_mif_write(dev, 0, 0x1000);
-		} else {
-			bmac_mif_write(dev, 4, 0xa1);
+	unsigned int addr;
+
+	printk(KERN_DEBUG "phy registers:");
+	for (addr = 0; addr < 32; ++addr) {
+		if ((addr & 7) == 0)
+			printk("\n" KERN_DEBUG);
+		printk(" %.4x", bmac_mif_read(dev, addr));
+	}
+	printk("\n");
+	if (is_bmac_plus) {
+		unsigned int capable, ctrl;
+
+		ctrl = bmac_mif_read(dev, 0);
+		capable = ((bmac_mif_read(dev, 1) & 0xf800) >> 6) | 1;
+		if (bmac_mif_read(dev, 4) != capable
+		    || (ctrl & 0x1000) == 0) {
+			bmac_mif_write(dev, 4, capable);
 			bmac_mif_write(dev, 0, 0x1200);
-		}
-#if 0
-		/* XXX debugging */
-		bmac_mif_read(dev, 0);
-		bmac_mif_read(dev, 4);
-#endif
+		} else
+			bmac_mif_write(dev, 0, 0x1000);
 	}
 	bmac_init_registers(dev);
 	return 1;
@@ -1330,6 +1337,7 @@
 
 	dev->flags |= IFF_UP | IFF_RUNNING;
 
+	MOD_INC_USE_COUNT;
 	return 0;
 }
 
@@ -1374,6 +1382,8 @@
 	}
 	bp->reset_and_enabled = 0;
 	XXDEBUG(("bmac: all bufs freed\n"));
+
+	MOD_DEC_USE_COUNT;
 
 	return 0;
 }
diff -urN linux-2.2.11-pre2/drivers/net/cosa.c linux/drivers/net/cosa.c
--- linux-2.2.11-pre2/drivers/net/cosa.c	Mon Jun  7 16:19:58 1999
+++ linux/drivers/net/cosa.c	Mon Dec  3 18:52:26 2001
@@ -1,10 +1,7 @@
-/* $Id: cosa.c,v 1.24 1999/05/28 17:28:34 kas Exp $ */
+/* $Id: cosa.c,v 1.26 1999/07/09 15:02:37 kas Exp $ */
 
 /*
  *  Copyright (C) 1995-1997  Jan "Yenya" Kasprzak <kas@fi.muni.cz>
- * 
- * 	5/25/1999 : Marcelo Tosatti <marcelo@conectiva.com.br>
- * 		fixed a deadlock in cosa_sppp_open 
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -105,6 +102,13 @@
 #include "syncppp.h"
 #include "cosa.h"
 
+/* Linux version stuff */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,1)
+typedef struct wait_queue *wait_queue_head_t;
+#define DECLARE_WAITQUEUE(wait, current) \
+	struct wait_queue wait = { current, NULL }
+#endif
+
 /* Maximum length of the identification string. */
 #define COSA_MAX_ID_STRING	128
 
@@ -133,7 +137,7 @@
 	struct semaphore rsem, wsem;
 	char *rxdata;
 	int rxsize;
-	struct wait_queue *txwaitq, *rxwaitq;
+	wait_queue_head_t txwaitq, rxwaitq;
 	int tx_status, rx_status;
 
 	/* SPPP/HDLC device parts */
@@ -365,7 +369,7 @@
 #endif
 {
 	int i;
-	printk(KERN_INFO "cosa v1.04 (c) 1997-8 Jan Kasprzak <kas@fi.muni.cz>\n");
+	printk(KERN_INFO "cosa v1.06 (c) 1997-8 Jan Kasprzak <kas@fi.muni.cz>\n");
 #ifdef __SMP__
 	printk(KERN_INFO "cosa: SMP found. Please mail any success/failure reports to the author.\n");
 #endif
@@ -1273,10 +1277,8 @@
 			debug_status_out(cosa, 0);
 #endif
 		}
-		cosa_putdata8(cosa, 0);
 		cosa_putdata8(cosa, status);
 #ifdef DEBUG_IO
-		debug_data_cmd(cosa, 0);
 		debug_data_cmd(cosa, status);
 #endif
 	}
@@ -1651,6 +1653,14 @@
  * use the round-robin approach. The newer COSA firmwares have a simple
  * flow-control - in the status word has bits 2 and 3 set to 1 means that the
  * channel 0 or 1 doesn't want to receive data.
+ *
+ * It seems there is a bug in COSA firmware (need to trace it further):
+ * When the driver status says that the kernel has no more data for transmit
+ * (e.g. at the end of TX DMA) and then the kernel changes its mind
+ * (e.g. new packet is queued to hard_start_xmit()), the card issues
+ * the TX interrupt but does not mark the channel as ready-to-transmit.
+ * The fix seems to be to push the packet to COSA despite its request.
+ * We first try to obey the card's opinion, and then fall back to forced TX.
  */
 static inline void tx_interrupt(struct cosa_data *cosa, int status)
 {
@@ -1662,23 +1672,35 @@
 	spin_lock_irqsave(&cosa->lock, flags);
 	set_bit(TXBIT, &cosa->rxtx);
 	if (!test_bit(IRQBIT, &cosa->rxtx)) {
-		/* flow control */
+		/* flow control, see the comment above */
 		int i=0;
-		do {
-			if (i++ > cosa->nchannels) {
-				printk(KERN_WARNING
-					"%s: No channel wants data in TX IRQ\n",
-					cosa->name);
-				put_driver_status_nolock(cosa);
-				clear_bit(TXBIT, &cosa->rxtx);
-				spin_unlock_irqrestore(&cosa->lock, flags);
-				return;
-			}
+		if (!cosa->txbitmap) {
+			printk(KERN_WARNING "%s: No channel wants data "
+				"in TX IRQ. Expect DMA timeout.",
+				cosa->name);
+			put_driver_status_nolock(cosa);
+			clear_bit(TXBIT, &cosa->rxtx);
+			spin_unlock_irqrestore(&cosa->lock, flags);
+			return;
+		}
+		while(1) {
 			cosa->txchan++;
+			i++;
 			if (cosa->txchan >= cosa->nchannels)
 				cosa->txchan = 0;
-		} while ((!(cosa->txbitmap & (1<<cosa->txchan)))
-			|| status & (1<<(cosa->txchan+DRIVER_TXMAP_SHIFT)));
+			if (!(cosa->txbitmap & (1<<cosa->txchan)))
+				continue;
+			if (~status & (1 << (cosa->txchan+DRIVER_TXMAP_SHIFT)))
+				break;
+			/* in second pass, accept first ready-to-TX channel */
+			if (i > cosa->nchannels) {
+				/* Can be safely ignored */
+				printk(KERN_DEBUG "%s: Forcing TX "
+					"to not-ready channel %d\n",
+					cosa->name, cosa->txchan);
+				break;
+			}
+		}
 
 		cosa->txsize = cosa->chan[cosa->txchan].txsize;
 		if (cosa_dma_able(cosa->chan+cosa->txchan,
@@ -1788,6 +1810,7 @@
 	if (is_8bit(cosa)) {
 		if (!test_bit(IRQBIT, &cosa->rxtx)) {
 			set_bit(IRQBIT, &cosa->rxtx);
+			put_driver_status_nolock(cosa);
 			cosa->rxsize = cosa_getdata8(cosa) <<8;
 #ifdef DEBUG_IO
 			debug_data_in(cosa, cosa->rxsize >> 8);
diff -urN linux-2.2.11-pre2/drivers/net/cs89x0.c linux/drivers/net/cs89x0.c
--- linux-2.2.11-pre2/drivers/net/cs89x0.c	Mon Jun  7 16:19:58 1999
+++ linux/drivers/net/cs89x0.c	Mon Dec  3 18:52:26 2001
@@ -30,7 +30,7 @@
 */
 
 static char *version =
-"cs89x0.c:v1.02 11/26/96 Russell Nelson <nelson@crynwr.com>\n";
+"cs89x0.c:v1.03 11/26/96 Russell Nelson <nelson@crynwr.com>\n";
 
 /* ======================= configure the driver here ======================= */
 
@@ -306,7 +306,7 @@
 	else if (get_eeprom_data(dev, START_EEPROM_DATA,CHKSUM_LEN,eeprom_buff) < 0) {
 		printk("\ncs89x0: EEPROM read failed, relying on command line.\n");
         } else if (get_eeprom_cksum(START_EEPROM_DATA,CHKSUM_LEN,eeprom_buff) < 0) {
-                printk("\ncs89x0: EEPROM checksum bad, relyong on command line\n");
+                printk("\ncs89x0: EEPROM checksum bad, relying on command line\n");
         } else {
                 /* get transmission control word  but keep the autonegotiation bits */
                 if (!lp->auto_neg_cnf) lp->auto_neg_cnf = eeprom_buff[AUTO_NEG_CNF_OFFSET/2];
@@ -843,6 +843,13 @@
                                 lp->send_underrun++;
                                 if (lp->send_underrun == 3) lp->send_cmd = TX_AFTER_381;
                                 else if (lp->send_underrun == 6) lp->send_cmd = TX_AFTER_ALL;
+				/* transmit cycle is done, although
+				   frame wasn't transmitted - this
+				   avoids having to wait for the upper
+				   layers to timeout on us, in the
+				   event of a tx underrun */
+				dev->tbusy = 0;
+				mark_bh(NET_BH);	/* Inform upper layers. */
                         }
 			break;
 		case ISQ_RX_MISS_EVENT:
diff -urN linux-2.2.11-pre2/drivers/net/cs89x0.h linux/drivers/net/cs89x0.h
--- linux-2.2.11-pre2/drivers/net/cs89x0.h	Sun Feb  2 05:18:36 1997
+++ linux/drivers/net/cs89x0.h	Mon Dec  3 18:52:26 2001
@@ -319,8 +319,8 @@
 #define TX_FRAME_PORT RX_FRAME_PORT
 #define TX_CMD_PORT	0x0004
 #define TX_NOW		0x0000       /*  Tx packet after   5 bytes copied */
-#define TX_AFTER_381	0x0020       /*  Tx packet after 381 bytes copied */
-#define TX_AFTER_ALL	0x0060       /*  Tx packet after all bytes copied */
+#define TX_AFTER_381	0x0040       /*  Tx packet after 381 bytes copied */
+#define TX_AFTER_ALL	0x00c0       /*  Tx packet after all bytes copied */
 #define TX_LEN_PORT	0x0006
 #define ISQ_PORT	0x0008
 #define ADD_PORT	0x000A
diff -urN linux-2.2.11-pre2/drivers/net/mace.c linux/drivers/net/mace.c
--- linux-2.2.11-pre2/drivers/net/mace.c	Wed Mar 10 21:48:46 1999
+++ linux/drivers/net/mace.c	Mon Dec  3 18:52:26 2001
@@ -682,8 +682,10 @@
 		++mp->stats.tx_carrier_errors;
 	    if (fs & (UFLO|LCOL|RTRY))
 		++mp->stats.tx_aborted_errors;
-	} else
+	} else {
+	    mp->stats.tx_bytes += mp->tx_bufs[i]->len;
 	    ++mp->stats.tx_packets;
+	}
 	dev_kfree_skb(mp->tx_bufs[i]);
 	--mp->tx_active;
 	if (++i >= N_TX_RING)
@@ -848,6 +850,7 @@
 		skb->protocol = eth_type_trans(skb, dev);
 		netif_rx(skb);
 		mp->rx_bufs[i] = 0;
+		mp->stats.rx_bytes += skb->len;
 		++mp->stats.rx_packets;
 	    }
 	} else {
diff -urN linux-2.2.11-pre2/drivers/net/pcnet32.c linux/drivers/net/pcnet32.c
--- linux-2.2.11-pre2/drivers/net/pcnet32.c	Sat Apr 24 17:51:48 1999
+++ linux/drivers/net/pcnet32.c	Mon Dec  3 18:52:26 2001
@@ -13,7 +13,7 @@
  * 	This driver is for PCnet32 and PCnetPCI based ethercards
  */
 
-static const char *version = "pcnet32.c:v1.21 31.3.99 tsbogend@alpha.franken.de\n";
+static const char *version = "pcnet32.c:v1.23 6.7.1999 tsbogend@alpha.franken.de\n";
 
 #include <linux/config.h>
 #include <linux/module.h>
@@ -149,6 +149,13 @@
  *         rewritten PCI card detection
  *         added dwio mode to get driver working on some PPC machines
  * v1.21:  added mii selection and mii ioctl
+ * v1.22:  changed pci scanning code to make PPC people happy
+ *         fixed switching to 32bit mode in pcnet32_open() (thanks
+ *         to Michael Richard <mcr@solidum.com> for noticing this one)
+ *	   added sub vendor/device id matching (thanks again to 
+ *	   Michael Richard <mcr@solidum.com>)
+ *         added chip id for 79c973/975 (thanks to Zach Brown <zab@zabbo.net>)
+ * v1.23   fixed small bug, when manual selecting MII speed/duplex
  */
 
 
@@ -185,6 +192,16 @@
 
 #define PCNET32_TOTAL_SIZE 0x20
 
+/* some PCI ids */
+#ifndef PCI_DEVICE_ID_AMD_LANCE
+#define PCI_VENDOR_ID_AMD	      0x1022
+#define PCI_DEVICE_ID_AMD_LANCE	      0x2000
+#endif
+#ifndef PCI_DEVICE_ID_AMD_PCNETHOME
+#define PCI_DEVICE_ID_AMD_PCNETHOME   0x2001
+#endif
+
+
 #define CRC_POLYNOMIAL_LE 0xedb88320UL  /* Ethernet CRC, little endian */
 
 /* The PCNET32 Rx and Tx ring descriptors. */
@@ -272,14 +289,19 @@
 
 struct pcnet32_pci_id_info {
     const char *name;
-    u16 vendor_id, device_id, device_id_mask, flags;
+    u16 vendor_id, device_id, svid, sdid, flags;
     int io_size;
     int (*probe1) (struct device *, unsigned long, unsigned char, int, int);
 };
 
 static struct pcnet32_pci_id_info pcnet32_tbl[] = {
     { "AMD PCnetPCI series",
-	0x1022, 0x2000, 0xfffe, PCI_USES_IO|PCI_USES_MASTER, PCNET32_TOTAL_SIZE,
+	PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_LANCE, 0, 0,
+	PCI_USES_IO|PCI_USES_MASTER, PCNET32_TOTAL_SIZE,
+	pcnet32_probe1},
+    { "AMD PCnetHome series",
+	PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_PCNETHOME, 0, 0,
+	PCI_USES_IO|PCI_USES_MASTER, PCNET32_TOTAL_SIZE,
 	pcnet32_probe1},
     {0,}
 };
@@ -418,30 +440,27 @@
     
 #if defined(CONFIG_PCI)
     if (pci_present()) {
-	struct pci_dev *pdev;
-	unsigned char pci_bus, pci_device_fn;
-	int pci_index;
+	struct pci_dev *pdev = NULL;
 	
 	printk("pcnet32.c: PCI bios is present, checking for devices...\n");
-	for (pci_index = 0; pci_index < 0xff; pci_index++) {
-	    u16 vendor, device, pci_command;
+	while ((pdev = pci_find_class (PCI_CLASS_NETWORK_ETHERNET<<8, pdev))) {
+	    u16 pci_command;
 	    int chip_idx;
+	    u16 sdid,svid;
 
-	    if (pcibios_find_class (PCI_CLASS_NETWORK_ETHERNET << 8,
-				    pci_index, &pci_bus, &pci_device_fn) != PCIBIOS_SUCCESSFUL)
-		break;
-	    
-	    pcibios_read_config_word(pci_bus, pci_device_fn, PCI_VENDOR_ID, &vendor);
-	    pcibios_read_config_word(pci_bus, pci_device_fn, PCI_DEVICE_ID, &device);
-
+	    pci_read_config_word(pdev, PCI_SUBSYSTEM_VENDOR_ID, &sdid);
+	    pci_read_config_word(pdev, PCI_SUBSYSTEM_ID, &svid);
 	    for (chip_idx = 0; pcnet32_tbl[chip_idx].vendor_id; chip_idx++)
-		if (vendor == pcnet32_tbl[chip_idx].vendor_id &&
-		    (device & pcnet32_tbl[chip_idx].device_id_mask) == pcnet32_tbl[chip_idx].device_id)
+		if ((pdev->vendor == pcnet32_tbl[chip_idx].vendor_id) &&
+		    (pdev->device == pcnet32_tbl[chip_idx].device_id) &&
+		    (pcnet32_tbl[chip_idx].svid == 0 || 
+		     (svid == pcnet32_tbl[chip_idx].svid)) &&
+		    (pcnet32_tbl[chip_idx].sdid == 0 || 
+		     (sdid == pcnet32_tbl[chip_idx].sdid)))
 		    break;
 	    if (pcnet32_tbl[chip_idx].vendor_id == 0)
 		continue;
 	    
-	    pdev = pci_find_slot(pci_bus, pci_device_fn);
 	    ioaddr = pdev->base_address[0] & PCI_BASE_ADDRESS_IO_MASK;
 #if defined(ADDR_64BITS) && defined(__alpha__)
 	    ioaddr |= ((long)pdev->base_address[1]) << 32;
@@ -541,6 +560,10 @@
 	chipname = "PCnet/FAST+ 79C972";
 	fdx = 1; mii = 1;
 	break;
+     case 0x2625:
+	chipname = "PCnet/FAST III 79C973";
+	fdx = 1; mii = 1;
+	break;
      case 0x2626:
 	chipname = "PCnet/Home 79C978";
 	fdx = 1;
@@ -561,6 +584,9 @@
 	    printk("pcnet32: pcnet32 media reset to %#x.\n",  media);
 	a->write_bcr (ioaddr, 49, media);
 	break;
+     case 0x2627:
+	chipname = "PCnet/FAST III 79C975";
+	fdx = 1; mii = 1;
      default:
 	printk("pcnet32: PCnet version %#x, no PCnet32 chip.\n",chip_version);
 	return ENODEV;
@@ -693,7 +719,7 @@
     lp->a.reset (ioaddr);
 
     /* switch pcnet32 to 32bit mode */
-    lp->a.write_csr (ioaddr, 20, 2);
+    lp->a.write_bcr (ioaddr, 20, 2);
 
     if (pcnet32_debug > 1)
 	printk("%s: pcnet32_open() irq %d tx/rx rings %#x/%#x init %#x.\n",
@@ -725,7 +751,7 @@
 	val |= 0x10;
     lp->a.write_csr (ioaddr, 124, val);
     
-    if (lp->mii & (lp->options & PORT_ASEL)) {
+    if (lp->mii & !(lp->options & PORT_ASEL)) {
 	val = lp->a.read_bcr (ioaddr, 32) & ~0x38; /* disable Auto Negotiation, set 10Mpbs, HD */
 	if (lp->options & PORT_FD)
 	    val |= 0x10;
@@ -952,7 +978,7 @@
     struct device *dev = (struct device *)dev_id;
     struct pcnet32_private *lp;
     unsigned long ioaddr;
-    u16 csr0;
+    u16 csr0,rap;
     int boguscnt =  max_interrupt_work;
     int must_restart;
 
@@ -968,6 +994,7 @@
 
     dev->interrupt = 1;
 
+    rap = lp->a.read_rap(ioaddr);
     while ((csr0 = lp->a.read_csr (ioaddr, 0)) & 0x8600 && --boguscnt >= 0) {
 	/* Acknowledge all of the current interrupt sources ASAP. */
 	lp->a.write_csr (ioaddr, 0, csr0 & ~0x004f);
@@ -1069,6 +1096,7 @@
 
     /* Clear any other interrupt, and set interrupt enable. */
     lp->a.write_csr (ioaddr, 0, 0x7940);
+    lp->a.write_rap(ioaddr,rap);
 
     if (pcnet32_debug > 4)
 	printk("%s: exiting interrupt, csr0=%#4.4x.\n",
diff -urN linux-2.2.11-pre2/drivers/net/sb1000.c linux/drivers/net/sb1000.c
--- linux-2.2.11-pre2/drivers/net/sb1000.c	Wed Dec 31 16:00:00 1969
+++ linux/drivers/net/sb1000.c	Mon Dec  3 18:52:26 2001
@@ -0,0 +1,1294 @@
+/* sb1000.c: A General Instruments SB1000 driver for linux. */
+/*
+	Written 1998 by Franco Venturi.
+
+	Copyright 1998 by Franco Venturi.
+	Copyright 1994,1995 by Donald Becker.
+	Copyright 1993 United States Government as represented by the
+	Director, National Security Agency.
+
+	This driver is for the General Instruments SB1000 (internal SURFboard)
+
+	The author may be reached as fventuri@mediaone.net
+
+	This program is free software; you can redistribute it
+	and/or  modify it under  the terms of  the GNU General
+	Public  License as  published  by  the  Free  Software
+	Foundation;  either  version 2 of the License, or  (at
+	your option) any later version.
+
+	Changes:
+
+	981115 Steven Hirsch <shirsch@adelphia.net>
+
+	Linus changed the timer interface.  Should work on all recent
+	development kernels.
+
+	980608 Steven Hirsch <shirsch@adelphia.net>
+
+	Small changes to make it work with 2.1.x kernels. Hopefully,
+	nothing major will change before official release of Linux 2.2.
+	
+	Merged with 2.2 - Alan Cox
+*/
+
+static char version[] = "sb1000.c:v1.1.2 6/01/98 (fventuri@mediaone.net)\n";
+
+#include <linux/config.h>
+#include <linux/module.h>
+
+#include <linux/version.h>
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/string.h>
+#include <linux/interrupt.h>
+#include <linux/ptrace.h>
+#include <linux/errno.h>
+#include <linux/in.h>
+#include <linux/malloc.h>
+#include <linux/ioport.h>
+#include <linux/netdevice.h>
+#include <linux/if_arp.h>
+#include <linux/skbuff.h>
+#include <linux/delay.h>	/* for udelay() */
+#include <asm/processor.h>
+
+#include <asm/bitops.h>
+#include <asm/io.h>
+#include <asm/uaccess.h>
+#include <linux/etherdevice.h>
+
+/* for SIOGCM/SIOSCM stuff */
+#include <linux/if_cablemodem.h>
+
+#ifdef SB1000_DEBUG
+int sb1000_debug = SB1000_DEBUG;
+#else
+int sb1000_debug = 1;
+#endif
+
+static const int SB1000_IO_EXTENT = 8;
+/* SB1000 Maximum Receive Unit */
+static const int SB1000_MRU = 1500; /* octects */
+
+#define NPIDS 4
+struct sb1000_private {
+	struct sk_buff *rx_skb[NPIDS];
+	short rx_dlen[NPIDS];
+	unsigned int rx_bytes;
+	unsigned int rx_frames;
+	short rx_error_count;
+	short rx_error_dpc_count;
+	unsigned char rx_session_id[NPIDS];
+	unsigned char rx_frame_id[NPIDS];
+	unsigned char rx_pkt_type[NPIDS];
+	struct net_device_stats stats;
+};
+
+/* prototypes for Linux interface */
+extern int sb1000_probe(struct device *dev);
+static int sb1000_open(struct device *dev);
+static int sb1000_dev_ioctl (struct device *dev, struct ifreq *ifr, int cmd);
+static int sb1000_start_xmit(struct sk_buff *skb, struct device *dev);
+static void sb1000_interrupt(int irq, void *dev_id, struct pt_regs *regs);
+static struct enet_statistics *sb1000_stats(struct device *dev);
+static int sb1000_close(struct device *dev);
+
+/* Plug-n-Play routine */
+static inline unsigned char read_resource_data(void);
+
+/* SB1000 hardware routines to be used during open/configuration phases */
+static inline void nicedelay(unsigned long usecs);
+static inline int card_wait_for_busy_clear(const int ioaddr[],
+	const char* name);
+static inline int card_wait_for_ready(const int ioaddr[], const char* name,
+	unsigned char in[]);
+static inline int card_send_command(const int ioaddr[], const char* name,
+	const unsigned char out[], unsigned char in[]);
+
+/* SB1000 hardware routines to be used during frame rx interrupt */
+static inline int sb1000_wait_for_ready(const int ioaddr[], const char* name);
+static inline int sb1000_wait_for_ready_clear(const int ioaddr[],
+	const char* name);
+static inline void sb1000_send_command(const int ioaddr[], const char* name,
+	const unsigned char out[]);
+static inline void sb1000_read_status(const int ioaddr[], unsigned char in[]);
+static inline void sb1000_issue_read_command(const int ioaddr[],
+	const char* name);
+
+/* SB1000 commands for open/configuration */
+static inline int sb1000_reset(const int ioaddr[], const char* name);
+static inline int sb1000_check_CRC(const int ioaddr[], const char* name);
+static inline int sb1000_start_get_set_command(const int ioaddr[],
+	const char* name);
+static inline int sb1000_end_get_set_command(const int ioaddr[],
+	const char* name);
+static inline int sb1000_activate(const int ioaddr[], const char* name);
+static inline int sb1000_get_firmware_version(const int ioaddr[],
+	const char* name, unsigned char version[], int do_end);
+static inline int sb1000_get_frequency(const int ioaddr[], const char* name,
+	int* frequency);
+static inline int sb1000_set_frequency(const int ioaddr[], const char* name,
+	int frequency);
+static inline int sb1000_get_PIDs(const int ioaddr[], const char* name,
+	short PID[]);
+static inline int sb1000_set_PIDs(const int ioaddr[], const char* name,
+	const short PID[]);
+
+/* SB1000 commands for frame rx interrupt */
+static inline int sb1000_rx(struct device *dev);
+static inline void sb1000_error_dpc(struct device *dev);
+
+
+/* Plug-n-Play constants */
+static const int READ_DATA_PORT = 0x203;	/* This port number may change!!! */
+static const int ADDRESS_PORT = 0x279;
+static const int WRITE_DATA_PORT = 0xa79;
+
+/* Plug-n-Play read resource mechanism */
+static inline unsigned char
+read_resource_data(void) {
+	/* poll */
+	outb(0x05, ADDRESS_PORT);	/* Select PnP status register. */
+	while (!(inb(READ_DATA_PORT) & 0x1)) ;
+	/* read resource data */
+	outb(0x04, ADDRESS_PORT);	/* Select PnP resource data register. */
+	return inb(READ_DATA_PORT);
+}
+
+/* probe for SB1000 using Plug-n-Play mechanism */
+int
+sb1000_probe(struct device *dev)
+{
+
+	unsigned short ioaddr[2], irq;
+	short i, csn;
+	unsigned int serial_number;
+
+	const unsigned char initiation_key[] = { 0x00, 0x00, 0x6a, 0xb5, 0xda,
+		0xed, 0xf6, 0xfb, 0x7d, 0xbe, 0xdf, 0x6f, 0x37, 0x1b, 0x0d,
+		0x86, 0xc3, 0x61, 0xb0, 0x58, 0x2c, 0x16, 0x8b, 0x45, 0xa2,
+		0xd1, 0xe8, 0x74, 0x3a, 0x9d, 0xce, 0xe7, 0x73, 0x39 }; 
+	const unsigned char sb1000_vendor_ID[] = {
+		0x1d, 0x23, 0x10, 0x00 };		/* "GIC1000" */
+
+	/* Reset the ISA PnP mechanism */
+	outb(0x02, ADDRESS_PORT);		/* Select PnP config control register. */
+	outb(0x02, WRITE_DATA_PORT);	/* Return to WaitForKey state. */
+
+	/* send initiation key */
+	for (i = 0; i < sizeof(initiation_key) / sizeof(initiation_key[0]); i++) {
+		outb(initiation_key[i], ADDRESS_PORT);
+	}
+
+	/* set card CSN into configuration mode */
+	for (csn = 1; csn <= 255; csn++) {
+		outb(0x03, ADDRESS_PORT);	/* Select PnP wake[CSN] register. */
+		outb(csn, WRITE_DATA_PORT);	/* Wake[CSN] */
+		/* check card ID */
+		for (i = 0; i < 4; i++) {
+			if (read_resource_data() != sb1000_vendor_ID[i]) break;
+		}
+		if (i == 4) break;
+	}
+
+	/* SB1000 not found */
+	if (csn > 255) {
+		/* return to WaitForKey state */
+		outb(0x02, ADDRESS_PORT);	/* Select PnP config control register. */
+		outb(0x02, WRITE_DATA_PORT);/* Return to WaitForKey state. */
+		return -ENODEV;
+	}
+
+	/* found: get serial number and skip checksum */
+	serial_number = 0;
+	for (i = 0; i < 4; i++) {
+		serial_number |= read_resource_data() << (8 * i);
+	}
+	read_resource_data();
+
+	/* get I/O port base address */
+	outb(0x60, ADDRESS_PORT);		/* Select PnP I/O port base address 0. */
+	ioaddr[0] = inb(READ_DATA_PORT) << 8;
+	outb(0x61, ADDRESS_PORT);
+	ioaddr[0] |= inb(READ_DATA_PORT);
+	outb(0x62, ADDRESS_PORT);		/* Select PnP I/O port base address 1. */
+	ioaddr[1] = inb(READ_DATA_PORT) << 8;
+	outb(0x63, ADDRESS_PORT);
+	ioaddr[1] |= inb(READ_DATA_PORT);
+
+	/* get IRQ */
+	outb(0x70, ADDRESS_PORT);		/* Select PnP IRQ level select 0. */
+	irq = inb(READ_DATA_PORT);
+
+	/* return to WaitForKey state */
+	outb(0x02, ADDRESS_PORT);		/* Select PnP config control register. */
+	outb(0x02, WRITE_DATA_PORT);	/* Return to WaitForKey state. */
+
+	/* check I/O base and IRQ */
+	if (dev->base_addr != 0 && dev->base_addr != ioaddr[0]) {
+		return -ENODEV;
+	}
+	if (dev->rmem_end != 0 && dev->rmem_end != ioaddr[1]) {
+		return -ENODEV;
+	}
+	if (dev->irq != 0 && dev->irq != irq) {
+		return -ENODEV;
+	}
+
+	dev->base_addr = ioaddr[0];
+	/* rmem_end holds the second I/O address - fv */
+	dev->rmem_end = ioaddr[1];
+	dev->irq = irq;
+
+	if (sb1000_debug > 0)
+		printk(KERN_NOTICE "%s: sb1000 at (%#3.3lx,%#3.3lx), csn %d, "
+			"S/N %#8.8x, IRQ %d.\n", dev->name, dev->base_addr,
+			dev->rmem_end, csn, serial_number, dev->irq);
+
+	dev = init_etherdev(dev, 0);
+
+	/* Make up a SB1000-specific-data structure. */
+	dev->priv = kmalloc(sizeof(struct sb1000_private), GFP_KERNEL);
+	if (dev->priv == NULL)
+		return -ENOMEM;
+	memset(dev->priv, 0, sizeof(struct sb1000_private));
+
+	if (sb1000_debug > 0)
+		printk(KERN_NOTICE "%s", version);
+
+	/* The SB1000-specific entries in the device structure. */
+	dev->open = sb1000_open;
+	dev->do_ioctl = sb1000_dev_ioctl;
+	dev->hard_start_xmit = sb1000_start_xmit;
+	dev->stop = sb1000_close;
+	dev->get_stats = sb1000_stats;
+
+	/* Fill in the generic fields of the device structure. */
+	dev->change_mtu		= NULL;
+	dev->hard_header	= NULL;
+	dev->rebuild_header 	= NULL;
+	dev->set_mac_address 	= NULL;
+	dev->header_cache_update= NULL;
+
+	dev->type		= ARPHRD_ETHER;
+	dev->hard_header_len 	= 0;
+	dev->mtu		= 0;
+	dev->addr_len		= ETH_ALEN;
+	/* hardware address is 0:0:serial_number */
+	dev->dev_addr[0] = 0;
+	dev->dev_addr[1] = 0;
+	dev->dev_addr[2] = serial_number >> 24 & 0xff;
+	dev->dev_addr[3] = serial_number >> 16 & 0xff;
+	dev->dev_addr[4] = serial_number >>  8 & 0xff;
+	dev->dev_addr[5] = serial_number >>  0 & 0xff;
+	dev->tx_queue_len	= 0;
+	
+	/* New-style flags. */
+	dev->flags		= IFF_POINTOPOINT|IFF_NOARP;
+	return 0;
+}
+
+
+/*
+ * SB1000 hardware routines to be used during open/configuration phases
+ */
+const int TimeOutJiffies = (int)(8.75 * HZ);
+
+static inline void nicedelay(unsigned long usecs)
+{
+	current->state = TASK_INTERRUPTIBLE;
+	schedule_timeout(HZ);
+	return;
+}
+
+/* Card Wait For Busy Clear (cannot be used during an interrupt) */
+static inline int
+card_wait_for_busy_clear(const int ioaddr[], const char* name)
+{
+	unsigned char a;
+	unsigned long timeout;
+
+	a = inb(ioaddr[0] + 7);
+	timeout = jiffies + TimeOutJiffies;
+	while (a & 0x80 || a & 0x40) {
+		/* a little sleep */
+		current->state = TASK_INTERRUPTIBLE;
+		schedule_timeout(0);
+		a = inb(ioaddr[0] + 7);
+		if (jiffies >= timeout) {
+			printk(KERN_WARNING "%s: card_wait_for_busy_clear timeout\n",
+				name);
+			return -ETIME;
+		}
+	}
+
+	return 0;
+}
+
+/* Card Wait For Ready (cannot be used during an interrupt) */
+static inline int
+card_wait_for_ready(const int ioaddr[], const char* name, unsigned char in[])
+{
+	unsigned char a;
+	unsigned long timeout;
+
+	a = inb(ioaddr[1] + 6);
+	timeout = jiffies + TimeOutJiffies;
+	while (a & 0x80 || !(a & 0x40)) {
+		/* a little sleep */
+		current->state = TASK_INTERRUPTIBLE;
+		schedule_timeout(0);
+		a = inb(ioaddr[1] + 6);
+		if (jiffies >= timeout) {
+			printk(KERN_WARNING "%s: card_wait_for_ready timeout\n",
+				name);
+			return -ETIME;
+		}
+	}
+
+	in[1] = inb(ioaddr[0] + 1);
+	in[2] = inb(ioaddr[0] + 2);
+	in[3] = inb(ioaddr[0] + 3);
+	in[4] = inb(ioaddr[0] + 4);
+	in[0] = inb(ioaddr[0] + 5);
+	in[6] = inb(ioaddr[0] + 6);
+	in[5] = inb(ioaddr[1] + 6);
+	return 0;
+}
+
+/* Card Send Command (cannot be used during an interrupt) */
+static inline int
+card_send_command(const int ioaddr[], const char* name,
+	const unsigned char out[], unsigned char in[])
+{
+	int status, x;
+
+	if ((status = card_wait_for_busy_clear(ioaddr, name)))
+		return status;
+	outb(0xa0, ioaddr[0] + 6);
+	outb(out[2], ioaddr[0] + 1);
+	outb(out[3], ioaddr[0] + 2);
+	outb(out[4], ioaddr[0] + 3);
+	outb(out[5], ioaddr[0] + 4);
+	outb(out[1], ioaddr[0] + 5);
+	outb(0xa0, ioaddr[0] + 6);
+	outb(out[0], ioaddr[0] + 7);
+	if (out[0] != 0x20 && out[0] != 0x30) {
+		if ((status = card_wait_for_ready(ioaddr, name, in)))
+			return status;
+		inb(ioaddr[0] + 7);
+		if (sb1000_debug > 3)
+			printk(KERN_DEBUG "%s: card_send_command "
+				"out: %02x%02x%02x%02x%02x%02x  "
+				"in: %02x%02x%02x%02x%02x%02x%02x\n", name,
+				out[0], out[1], out[2], out[3], out[4], out[5],
+				in[0], in[1], in[2], in[3], in[4], in[5], in[6]);
+	} else {
+		if (sb1000_debug > 3)
+			printk(KERN_DEBUG "%s: card_send_command "
+				"out: %02x%02x%02x%02x%02x%02x\n", name,
+				out[0], out[1], out[2], out[3], out[4], out[5]);
+	}
+
+	if (out[1] == 0x1b) {
+		x = (out[2] == 0x02);
+	} else {
+		if (out[0] >= 0x80 && in[0] != (out[1] | 0x80))
+			return -EIO;
+	}
+	return 0;
+}
+
+
+/*
+ * SB1000 hardware routines to be used during frame rx interrupt
+ */
+const int Sb1000TimeOutJiffies = 7 * HZ;
+
+/* Card Wait For Ready (to be used during frame rx) */
+static inline int
+sb1000_wait_for_ready(const int ioaddr[], const char* name)
+{
+	unsigned long timeout;
+
+	timeout = jiffies + Sb1000TimeOutJiffies;
+	while (inb(ioaddr[1] + 6) & 0x80) {
+		if (jiffies >= timeout) {
+			printk(KERN_WARNING "%s: sb1000_wait_for_ready timeout\n",
+				name);
+			return -ETIME;
+		}
+	}
+	timeout = jiffies + Sb1000TimeOutJiffies;
+	while (!(inb(ioaddr[1] + 6) & 0x40)) {
+		if (jiffies >= timeout) {
+			printk(KERN_WARNING "%s: sb1000_wait_for_ready timeout\n",
+				name);
+			return -ETIME;
+		}
+	}
+	inb(ioaddr[0] + 7);
+	return 0;
+}
+
+/* Card Wait For Ready Clear (to be used during frame rx) */
+static inline int
+sb1000_wait_for_ready_clear(const int ioaddr[], const char* name)
+{
+	unsigned long timeout;
+
+	timeout = jiffies + Sb1000TimeOutJiffies;
+	while (inb(ioaddr[1] + 6) & 0x80) {
+		if (jiffies >= timeout) {
+			printk(KERN_WARNING "%s: sb1000_wait_for_ready_clear timeout\n",
+				name);
+			return -ETIME;
+		}
+	}
+	timeout = jiffies + Sb1000TimeOutJiffies;
+	while (inb(ioaddr[1] + 6) & 0x40) {
+		if (jiffies >= timeout) {
+			printk(KERN_WARNING "%s: sb1000_wait_for_ready_clear timeout\n",
+				name);
+			return -ETIME;
+		}
+	}
+	return 0;
+}
+
+/* Card Send Command (to be used during frame rx) */
+static inline void
+sb1000_send_command(const int ioaddr[], const char* name,
+	const unsigned char out[])
+{
+	outb(out[2], ioaddr[0] + 1);
+	outb(out[3], ioaddr[0] + 2);
+	outb(out[4], ioaddr[0] + 3);
+	outb(out[5], ioaddr[0] + 4);
+	outb(out[1], ioaddr[0] + 5);
+	outb(out[0], ioaddr[0] + 7);
+	if (sb1000_debug > 3)
+		printk(KERN_DEBUG "%s: sb1000_send_command out: %02x%02x%02x%02x"
+			"%02x%02x\n", name, out[0], out[1], out[2], out[3], out[4], out[5]);
+	return;
+}
+
+/* Card Read Status (to be used during frame rx) */
+static inline void
+sb1000_read_status(const int ioaddr[], unsigned char in[])
+{
+	in[1] = inb(ioaddr[0] + 1);
+	in[2] = inb(ioaddr[0] + 2);
+	in[3] = inb(ioaddr[0] + 3);
+	in[4] = inb(ioaddr[0] + 4);
+	in[0] = inb(ioaddr[0] + 5);
+	return;
+}
+
+/* Issue Read Command (to be used during frame rx) */
+static inline void
+sb1000_issue_read_command(const int ioaddr[], const char* name)
+{
+	const unsigned char Command0[6] = {0x20, 0x00, 0x00, 0x01, 0x00, 0x00};
+
+	sb1000_wait_for_ready_clear(ioaddr, name);
+	outb(0xa0, ioaddr[0] + 6);
+	sb1000_send_command(ioaddr, name, Command0);
+	return;
+}
+
+
+/*
+ * SB1000 commands for open/configuration
+ */
+/* reset SB1000 card */
+static inline int
+sb1000_reset(const int ioaddr[], const char* name)
+{
+	unsigned char st[7];
+	int port, status;
+	const unsigned char Command0[6] = {0x80, 0x16, 0x00, 0x00, 0x00, 0x00};
+
+	port = ioaddr[1] + 6;
+	outb(0x4, port);
+	inb(port);
+	udelay(1000);
+	outb(0x0, port);
+	inb(port);
+	nicedelay(60000);
+	outb(0x4, port);
+	inb(port);
+	udelay(1000);
+	outb(0x0, port);
+	inb(port);
+	udelay(0);
+
+	if ((status = card_send_command(ioaddr, name, Command0, st)))
+		return status;
+	if (st[3] != 0xf0)
+		return -EIO;
+	return 0;
+}
+
+/* check SB1000 firmware CRC */
+static inline int
+sb1000_check_CRC(const int ioaddr[], const char* name)
+{
+	unsigned char st[7];
+	int crc, status;
+	const unsigned char Command0[6] = {0x80, 0x1f, 0x00, 0x00, 0x00, 0x00};
+
+	/* check CRC */
+	if ((status = card_send_command(ioaddr, name, Command0, st)))
+		return status;
+	if (st[1] != st[3] || st[2] != st[4])
+		return -EIO;
+	crc = st[1] << 8 | st[2];
+	return 0;
+}
+
+static inline int
+sb1000_start_get_set_command(const int ioaddr[], const char* name)
+{
+	unsigned char st[7];
+	const unsigned char Command0[6] = {0x80, 0x1b, 0x00, 0x00, 0x00, 0x00};
+
+	return card_send_command(ioaddr, name, Command0, st);
+}
+
+static inline int
+sb1000_end_get_set_command(const int ioaddr[], const char* name)
+{
+	unsigned char st[7];
+	int status;
+	const unsigned char Command0[6] = {0x80, 0x1b, 0x02, 0x00, 0x00, 0x00};
+	const unsigned char Command1[6] = {0x20, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+	if ((status = card_send_command(ioaddr, name, Command0, st)))
+		return status;
+	return card_send_command(ioaddr, name, Command1, st);
+}
+
+static inline int
+sb1000_activate(const int ioaddr[], const char* name)
+{
+	unsigned char st[7];
+	int status;
+	const unsigned char Command0[6] = {0x80, 0x11, 0x00, 0x00, 0x00, 0x00};
+	const unsigned char Command1[6] = {0x80, 0x16, 0x00, 0x00, 0x00, 0x00};
+
+	nicedelay(50000);
+	if ((status = card_send_command(ioaddr, name, Command0, st)))
+		return status;
+	if ((status = card_send_command(ioaddr, name, Command1, st)))
+		return status;
+	if (st[3] != 0xf1) {
+    	if ((status = sb1000_start_get_set_command(ioaddr, name)))
+			return status;
+		return -EIO;
+	}
+	udelay(1000);
+    return sb1000_start_get_set_command(ioaddr, name);
+}
+
+/* get SB1000 firmware version */
+static inline int
+sb1000_get_firmware_version(const int ioaddr[], const char* name,
+	unsigned char version[], int do_end)
+{
+	unsigned char st[7];
+	int status;
+	const unsigned char Command0[6] = {0x80, 0x23, 0x00, 0x00, 0x00, 0x00};
+
+	if ((status = sb1000_start_get_set_command(ioaddr, name)))
+		return status;
+	if ((status = card_send_command(ioaddr, name, Command0, st)))
+		return status;
+	if (st[0] != 0xa3)
+		return -EIO;
+	version[0] = st[1];
+	version[1] = st[2];
+	if (do_end)
+		return sb1000_end_get_set_command(ioaddr, name);
+	else
+		return 0;
+}
+
+/* get SB1000 frequency */
+static inline int
+sb1000_get_frequency(const int ioaddr[], const char* name, int* frequency)
+{
+	unsigned char st[7];
+	int status;
+	const unsigned char Command0[6] = {0x80, 0x44, 0x00, 0x00, 0x00, 0x00};
+
+	udelay(1000);
+	if ((status = sb1000_start_get_set_command(ioaddr, name)))
+		return status;
+	if ((status = card_send_command(ioaddr, name, Command0, st)))
+		return status;
+	*frequency = ((st[1] << 8 | st[2]) << 8 | st[3]) << 8 | st[4];
+	return sb1000_end_get_set_command(ioaddr, name);
+}
+
+/* set SB1000 frequency */
+static inline int
+sb1000_set_frequency(const int ioaddr[], const char* name, int frequency)
+{
+	unsigned char st[7];
+	int status;
+	unsigned char Command0[6] = {0x80, 0x29, 0x00, 0x00, 0x00, 0x00};
+
+	const int FrequencyLowerLimit = 57000;
+	const int FrequencyUpperLimit = 804000;
+
+	if (frequency < FrequencyLowerLimit || frequency > FrequencyUpperLimit) {
+		printk(KERN_ERR "%s: frequency chosen (%d kHz) is not in the range "
+			"[%d,%d] kHz\n", name, frequency, FrequencyLowerLimit,
+			FrequencyUpperLimit);
+		return -EINVAL;
+	}
+	udelay(1000);
+	if ((status = sb1000_start_get_set_command(ioaddr, name)))
+		return status;
+	Command0[5] = frequency & 0xff;
+	frequency >>= 8;
+	Command0[4] = frequency & 0xff;
+	frequency >>= 8;
+	Command0[3] = frequency & 0xff;
+	frequency >>= 8;
+	Command0[2] = frequency & 0xff;
+	return card_send_command(ioaddr, name, Command0, st);
+}
+
+/* get SB1000 PIDs */
+static inline int
+sb1000_get_PIDs(const int ioaddr[], const char* name, short PID[])
+{
+	unsigned char st[7];
+	int status;
+	const unsigned char Command0[6] = {0x80, 0x40, 0x00, 0x00, 0x00, 0x00};
+	const unsigned char Command1[6] = {0x80, 0x41, 0x00, 0x00, 0x00, 0x00};
+	const unsigned char Command2[6] = {0x80, 0x42, 0x00, 0x00, 0x00, 0x00};
+	const unsigned char Command3[6] = {0x80, 0x43, 0x00, 0x00, 0x00, 0x00};
+
+	udelay(1000);
+	if ((status = sb1000_start_get_set_command(ioaddr, name)))
+		return status;
+
+	if ((status = card_send_command(ioaddr, name, Command0, st)))
+		return status;
+	PID[0] = st[1] << 8 | st[2];
+
+	if ((status = card_send_command(ioaddr, name, Command1, st)))
+		return status;
+	PID[1] = st[1] << 8 | st[2];
+
+	if ((status = card_send_command(ioaddr, name, Command2, st)))
+		return status;
+	PID[2] = st[1] << 8 | st[2];
+
+	if ((status = card_send_command(ioaddr, name, Command3, st)))
+		return status;
+	PID[3] = st[1] << 8 | st[2];
+
+	return sb1000_end_get_set_command(ioaddr, name);
+}
+
+/* set SB1000 PIDs */
+static inline int
+sb1000_set_PIDs(const int ioaddr[], const char* name, const short PID[])
+{
+	unsigned char st[7];
+	short p;
+	int status;
+	unsigned char Command0[6] = {0x80, 0x31, 0x00, 0x00, 0x00, 0x00};
+	unsigned char Command1[6] = {0x80, 0x32, 0x00, 0x00, 0x00, 0x00};
+	unsigned char Command2[6] = {0x80, 0x33, 0x00, 0x00, 0x00, 0x00};
+	unsigned char Command3[6] = {0x80, 0x34, 0x00, 0x00, 0x00, 0x00};
+	const unsigned char Command4[6] = {0x80, 0x2e, 0x00, 0x00, 0x00, 0x00};
+
+	udelay(1000);
+	if ((status = sb1000_start_get_set_command(ioaddr, name)))
+		return status;
+
+	p = PID[0];
+	Command0[3] = p & 0xff;
+	p >>= 8;
+	Command0[2] = p & 0xff;
+	if ((status = card_send_command(ioaddr, name, Command0, st)))
+		return status;
+
+	p = PID[1];
+	Command1[3] = p & 0xff;
+	p >>= 8;
+	Command1[2] = p & 0xff;
+	if ((status = card_send_command(ioaddr, name, Command1, st)))
+		return status;
+
+	p = PID[2];
+	Command2[3] = p & 0xff;
+	p >>= 8;
+	Command2[2] = p & 0xff;
+	if ((status = card_send_command(ioaddr, name, Command2, st)))
+		return status;
+
+	p = PID[3];
+	Command3[3] = p & 0xff;
+	p >>= 8;
+	Command3[2] = p & 0xff;
+	if ((status = card_send_command(ioaddr, name, Command3, st)))
+		return status;
+
+	if ((status = card_send_command(ioaddr, name, Command4, st)))
+		return status;
+	return sb1000_end_get_set_command(ioaddr, name);
+}
+
+
+static inline void
+sb1000_print_status_buffer(const char* name, unsigned char st[],
+	unsigned char buffer[], int size)
+{
+	int i, j, k;
+
+	printk(KERN_DEBUG "%s: status: %02x %02x\n", name, st[0], st[1]);
+	if (buffer[24] == 0x08 && buffer[25] == 0x00 && buffer[26] == 0x45) {
+		printk(KERN_DEBUG "%s: length: %d protocol: %d from: %d.%d.%d.%d:%d "
+			"to %d.%d.%d.%d:%d\n", name, buffer[28] << 8 | buffer[29],
+			buffer[35], buffer[38], buffer[39], buffer[40], buffer[41],
+            buffer[46] << 8 | buffer[47],
+			buffer[42], buffer[43], buffer[44], buffer[45],
+            buffer[48] << 8 | buffer[49]);
+	} else {
+		for (i = 0, k = 0; i < (size + 7) / 8; i++) {
+			printk(KERN_DEBUG "%s: %s", name, i ? "       " : "buffer:");
+			for (j = 0; j < 8 && k < size; j++, k++)
+				printk(" %02x", buffer[k]);
+			printk("\n");
+		}
+	}
+	return;
+}
+
+/*
+ * SB1000 commands for frame rx interrupt
+ */
+/* receive a single frame and assemble datagram
+ * (this is the heart of the interrupt routine)
+ */
+static inline int
+sb1000_rx(struct device *dev)
+{
+
+#define FRAMESIZE 184
+	unsigned char st[2], buffer[FRAMESIZE], session_id, frame_id;
+	short dlen;
+	int ioaddr, ns;
+	unsigned int skbsize;
+	struct sk_buff *skb;
+	struct sb1000_private *lp = (struct sb1000_private *)dev->priv;
+	struct enet_statistics *stats = &lp->stats;
+
+	/* SB1000 frame constants */
+	const int FrameSize = FRAMESIZE;
+	const int NewDatagramHeaderSkip = 8;
+	const int NewDatagramHeaderSize = NewDatagramHeaderSkip + 18;
+	const int NewDatagramDataSize = FrameSize - NewDatagramHeaderSize;
+	const int ContDatagramHeaderSkip = 7;
+	const int ContDatagramHeaderSize = ContDatagramHeaderSkip + 1;
+	const int ContDatagramDataSize = FrameSize - ContDatagramHeaderSize;
+	const int TrailerSize = 4;
+
+	ioaddr = dev->base_addr;
+
+	insw(ioaddr, (unsigned short*) st, 1);
+#ifdef XXXDEBUG
+printk("cm0: received: %02x %02x\n", st[0], st[1]);
+#endif /* XXXDEBUG */
+	lp->rx_frames++;
+
+	/* decide if it is a good or bad frame */
+	for (ns = 0; ns < NPIDS; ns++) {
+		session_id = lp->rx_session_id[ns];
+		frame_id = lp->rx_frame_id[ns];
+		if (st[0] == session_id) {
+			if (st[1] == frame_id || (!frame_id && (st[1] & 0xf0) == 0x30)) {
+				goto good_frame;
+			} else if ((st[1] & 0xf0) == 0x30 && (st[0] & 0x40)) {
+				goto skipped_frame;
+			} else {
+				goto bad_frame;
+			}
+		} else if (st[0] == (session_id | 0x40)) {
+			if ((st[1] & 0xf0) == 0x30) {
+				goto skipped_frame;
+			} else {
+				goto bad_frame;
+			}
+		}
+	}
+	goto bad_frame;
+
+skipped_frame:
+	stats->rx_frame_errors++;
+	skb = lp->rx_skb[ns];
+	if (sb1000_debug > 1)
+		printk(KERN_WARNING "%s: missing frame(s): got %02x %02x "
+			"expecting %02x %02x\n", dev->name, st[0], st[1],
+			skb ? session_id : session_id | 0x40, frame_id);
+	if (skb) {
+		dev_kfree_skb(skb);
+		skb = 0;
+	}
+
+good_frame:
+	lp->rx_frame_id[ns] = 0x30 | ((st[1] + 1) & 0x0f);
+	/* new datagram */
+	if (st[0] & 0x40) {
+		/* get data length */
+		insw(ioaddr, buffer, NewDatagramHeaderSize / 2);
+#ifdef XXXDEBUG
+printk("cm0: IP identification: %02x%02x  fragment offset: %02x%02x\n", buffer[30], buffer[31], buffer[32], buffer[33]);
+#endif /* XXXDEBUG */
+		if (buffer[0] != NewDatagramHeaderSkip) {
+			if (sb1000_debug > 1)
+				printk(KERN_WARNING "%s: new datagram header skip error: "
+					"got %02x expecting %02x\n", dev->name, buffer[0],
+					NewDatagramHeaderSkip);
+			stats->rx_length_errors++;
+			insw(ioaddr, buffer, NewDatagramDataSize / 2);
+			goto bad_frame_next;
+		}
+		dlen = ((buffer[NewDatagramHeaderSkip + 3] & 0x0f) << 8 |
+			buffer[NewDatagramHeaderSkip + 4]) - 17;
+		if (dlen > SB1000_MRU) {
+			if (sb1000_debug > 1)
+				printk(KERN_WARNING "%s: datagram length (%d) greater "
+					"than MRU (%d)\n", dev->name, dlen, SB1000_MRU);
+			stats->rx_length_errors++;
+			insw(ioaddr, buffer, NewDatagramDataSize / 2);
+			goto bad_frame_next;
+		}
+		lp->rx_dlen[ns] = dlen;
+		/* compute size to allocate for datagram */
+		skbsize = dlen + FrameSize;
+		if ((skb = alloc_skb(skbsize, GFP_ATOMIC)) == NULL) {
+			if (sb1000_debug > 1)
+				printk(KERN_WARNING "%s: can't allocate %d bytes long "
+					"skbuff\n", dev->name, skbsize);
+			stats->rx_dropped++;
+			insw(ioaddr, buffer, NewDatagramDataSize / 2);
+			goto dropped_frame;
+		}
+		skb->dev = dev;
+		skb->mac.raw = skb->data;
+		skb->protocol = (unsigned short) buffer[NewDatagramHeaderSkip + 16];
+		insw(ioaddr, skb_put(skb, NewDatagramDataSize),
+			NewDatagramDataSize / 2);
+		lp->rx_skb[ns] = skb;
+	} else {
+		/* continuation of previous datagram */
+		insw(ioaddr, buffer, ContDatagramHeaderSize / 2);
+		if (buffer[0] != ContDatagramHeaderSkip) {
+			if (sb1000_debug > 1)
+				printk(KERN_WARNING "%s: cont datagram header skip error: "
+					"got %02x expecting %02x\n", dev->name, buffer[0],
+					ContDatagramHeaderSkip);
+			stats->rx_length_errors++;
+			insw(ioaddr, buffer, ContDatagramDataSize / 2);
+			goto bad_frame_next;
+		}
+		skb = lp->rx_skb[ns];
+		insw(ioaddr, skb_put(skb, ContDatagramDataSize),
+			ContDatagramDataSize / 2);
+		dlen = lp->rx_dlen[ns];
+	}
+	if (skb->len < dlen + TrailerSize) {
+		lp->rx_session_id[ns] &= ~0x40;
+		return 0;
+	}
+
+	/* datagram completed: send to upper level */
+	skb_trim(skb, dlen);
+	netif_rx(skb);
+	stats->rx_packets++;
+	lp->rx_bytes += dlen;
+	lp->rx_skb[ns] = 0;
+	lp->rx_session_id[ns] |= 0x40;
+	return 0;
+
+bad_frame:
+	insw(ioaddr, buffer, FrameSize / 2);
+	if (sb1000_debug > 1)
+		printk(KERN_WARNING "%s: frame error: got %02x %02x\n",
+			dev->name, st[0], st[1]);
+	stats->rx_frame_errors++;
+bad_frame_next:
+	if (sb1000_debug > 2)
+		sb1000_print_status_buffer(dev->name, st, buffer, FrameSize);
+dropped_frame:
+	stats->rx_errors++;
+	if (ns < NPIDS) {
+		if ((skb = lp->rx_skb[ns])) {
+			dev_kfree_skb(skb);
+			lp->rx_skb[ns] = 0;
+		}
+		lp->rx_session_id[ns] |= 0x40;
+	}
+	return -1;
+}
+
+static inline void
+sb1000_error_dpc(struct device *dev)
+{
+	char *name;
+	unsigned char st[5];
+	int ioaddr[2];
+	struct sb1000_private *lp = (struct sb1000_private *)dev->priv;
+	const unsigned char Command0[6] = {0x80, 0x26, 0x00, 0x00, 0x00, 0x00};
+	const int ErrorDpcCounterInitialize = 200;
+
+	ioaddr[0] = dev->base_addr;
+	/* rmem_end holds the second I/O address - fv */
+	ioaddr[1] = dev->rmem_end;
+	name = dev->name;
+
+	sb1000_wait_for_ready_clear(ioaddr, name);
+	sb1000_send_command(ioaddr, name, Command0);
+	sb1000_wait_for_ready(ioaddr, name);
+	sb1000_read_status(ioaddr, st);
+	if (st[1] & 0x10)
+		lp->rx_error_dpc_count = ErrorDpcCounterInitialize;
+	return;
+}
+
+
+/*
+ * Linux interface functions
+ */
+static int
+sb1000_open(struct device *dev)
+{
+	char *name;
+	int ioaddr[2], status;
+	struct sb1000_private *lp = (struct sb1000_private *)dev->priv;
+	const unsigned short FirmwareVersion[] = {0x01, 0x01};
+
+	ioaddr[0] = dev->base_addr;
+	/* rmem_end holds the second I/O address - fv */
+	ioaddr[1] = dev->rmem_end;
+	name = dev->name;
+	request_region(ioaddr[0], SB1000_IO_EXTENT, "sb1000");
+	request_region(ioaddr[1], SB1000_IO_EXTENT, "sb1000");
+
+	/* initialize sb1000 */
+	if ((status = sb1000_reset(ioaddr, name)))
+		return status;
+	nicedelay(200000);
+	if ((status = sb1000_check_CRC(ioaddr, name)))
+		return status;
+
+	/* initialize private data before board can catch interrupts */
+	lp->rx_skb[0] = NULL;
+	lp->rx_skb[1] = NULL;
+	lp->rx_skb[2] = NULL;
+	lp->rx_skb[3] = NULL;
+	lp->rx_dlen[0] = 0;
+	lp->rx_dlen[1] = 0;
+	lp->rx_dlen[2] = 0;
+	lp->rx_dlen[3] = 0;
+	lp->rx_bytes = 0;
+	lp->rx_frames = 0;
+	lp->rx_error_count = 0;
+	lp->rx_error_dpc_count = 0;
+	lp->rx_session_id[0] = 0x50;
+	lp->rx_session_id[0] = 0x48;
+	lp->rx_session_id[0] = 0x44;
+	lp->rx_session_id[0] = 0x42;
+	lp->rx_frame_id[0] = 0;
+	lp->rx_frame_id[1] = 0;
+	lp->rx_frame_id[2] = 0;
+	lp->rx_frame_id[3] = 0;
+	if (request_irq(dev->irq, &sb1000_interrupt, 0, "sb1000", dev)) {
+		return -EAGAIN;
+	}
+
+	if (sb1000_debug > 2)
+		printk(KERN_DEBUG "%s: Opening, IRQ %d\n", name, dev->irq);
+
+	/* Activate board and check firmware version */
+	udelay(1000);
+	if ((status = sb1000_activate(ioaddr, name)))
+		return status;
+	udelay(0);
+	if ((status = sb1000_get_firmware_version(ioaddr, name, version, 0)))
+		return status;
+	if (version[0] != FirmwareVersion[0] || version[1] != FirmwareVersion[1])
+		printk(KERN_WARNING "%s: found firmware version %x.%02x "
+			"(should be %x.%02x)\n", name, version[0], version[1],
+			FirmwareVersion[0], FirmwareVersion[1]);
+
+	dev->interrupt = 0;
+	dev->tbusy = 0;
+	dev->start = 1;
+
+	MOD_INC_USE_COUNT;
+	return 0;					/* Always succeed */
+}
+
+static int sb1000_dev_ioctl(struct device *dev, struct ifreq *ifr, int cmd)
+{
+	char* name;
+	unsigned char version[2];
+	short PID[4];
+	int ioaddr[2], status, frequency;
+	unsigned int stats[5];
+	struct sb1000_private *lp = (struct sb1000_private *)dev->priv;
+
+	if (!(dev && dev->flags & IFF_UP))
+		return -ENODEV;
+
+	ioaddr[0] = dev->base_addr;
+	/* rmem_end holds the second I/O address - fv */
+	ioaddr[1] = dev->rmem_end;
+	name = dev->name;
+
+	switch (cmd) {
+	case SIOCGCMSTATS:		/* get statistics */
+		stats[0] = lp->rx_bytes;
+		stats[1] = lp->rx_frames;
+		stats[2] = lp->stats.rx_packets;
+		stats[3] = lp->stats.rx_errors;
+		stats[4] = lp->stats.rx_dropped;
+		if(copy_to_user(ifr->ifr_data, stats, sizeof(stats)))
+			return -EFAULT;
+		status = 0;
+		break;
+
+	case SIOCGCMFIRMWARE:		/* get firmware version */
+		if ((status = sb1000_get_firmware_version(ioaddr, name, version, 1)))
+			return status;
+		if(copy_to_user(ifr->ifr_data, version, sizeof(version)))
+			return -EFAULT;
+		break;
+
+	case SIOCGCMFREQUENCY:		/* get frequency */
+		if ((status = sb1000_get_frequency(ioaddr, name, &frequency)))
+			return status;
+		if(put_user(frequency, (int*) ifr->ifr_data))
+			return -EFAULT;
+		break;
+
+	case SIOCSCMFREQUENCY:		/* set frequency */
+		if (!suser())
+			return -EPERM;
+		if(get_user(frequency, (int*) ifr->ifr_data))
+			return -EFAULT;
+		if ((status = sb1000_set_frequency(ioaddr, name, frequency)))
+			return status;
+		break;
+
+	case SIOCGCMPIDS:			/* get PIDs */
+		if ((status = sb1000_get_PIDs(ioaddr, name, PID)))
+			return status;
+		if(copy_to_user(ifr->ifr_data, PID, sizeof(PID)))
+			return -EFAULT;
+		break;
+
+	case SIOCSCMPIDS:			/* set PIDs */
+		if (!suser())
+			return -EPERM;
+		if(copy_from_user(PID, ifr->ifr_data, sizeof(PID)))
+			return -EFAULT;
+		if ((status = sb1000_set_PIDs(ioaddr, name, PID)))
+			return status;
+		/* set session_id, frame_id and pkt_type too */
+		lp->rx_session_id[0] = 0x50 | (PID[0] & 0x0f);
+		lp->rx_session_id[1] = 0x48;
+		lp->rx_session_id[2] = 0x44;
+		lp->rx_session_id[3] = 0x42;
+		lp->rx_frame_id[0] = 0;
+		lp->rx_frame_id[1] = 0;
+		lp->rx_frame_id[2] = 0;
+		lp->rx_frame_id[3] = 0;
+		break;
+
+	default:
+		status = -EINVAL;
+		break;
+	}
+	return status;
+}
+
+/* transmit function: do nothing since SB1000 can't send anything out */
+static int
+sb1000_start_xmit(struct sk_buff *skb, struct device *dev)
+{
+	printk(KERN_WARNING "%s: trying to transmit!!!\n", dev->name);
+	/* sb1000 can't xmit datagrams */
+	dev_kfree_skb(skb);
+	return 0;
+}
+
+/* SB1000 interrupt handler. */
+static void sb1000_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+{
+	char *name;
+	unsigned char st;
+	int ioaddr[2];
+	struct device *dev = (struct device *) dev_id;
+	struct sb1000_private *lp = (struct sb1000_private *)dev->priv;
+
+	const unsigned char Command0[6] = {0x80, 0x2c, 0x00, 0x00, 0x00, 0x00};
+	const unsigned char Command1[6] = {0x80, 0x2e, 0x00, 0x00, 0x00, 0x00};
+	const int MaxRxErrorCount = 6;
+
+	if (dev == NULL) {
+		printk(KERN_ERR "sb1000_interrupt(): irq %d for unknown device.\n",
+			irq);
+		return;
+	}
+	if (dev->interrupt)
+		printk(KERN_ERR "%s: Re-entering the interrupt handler.\n",
+			dev->name);
+	dev->interrupt = 1;
+
+	ioaddr[0] = dev->base_addr;
+	/* rmem_end holds the second I/O address - fv */
+	ioaddr[1] = dev->rmem_end;
+	name = dev->name;
+
+	/* is it a good interrupt? */
+	st = inb(ioaddr[1] + 6);
+	if (!(st & 0x08 && st & 0x20)) {
+		dev->interrupt = 0;
+		return;
+	}
+
+	if (sb1000_debug > 3)
+		printk(KERN_DEBUG "%s: entering interrupt\n", dev->name);
+
+	st = inb(ioaddr[0] + 7);
+	if (sb1000_rx(dev))
+		lp->rx_error_count++;
+#ifdef SB1000_DELAY
+	udelay(SB1000_DELAY);
+#endif /* SB1000_DELAY */
+	sb1000_issue_read_command(ioaddr, name);
+	if (st & 0x01) {
+		sb1000_error_dpc(dev);
+		sb1000_issue_read_command(ioaddr, name);
+	}
+	if (lp->rx_error_dpc_count && !(--lp->rx_error_dpc_count)) {
+		sb1000_wait_for_ready_clear(ioaddr, name);
+		sb1000_send_command(ioaddr, name, Command0);
+		sb1000_wait_for_ready(ioaddr, name);
+		sb1000_issue_read_command(ioaddr, name);
+	}
+	if (lp->rx_error_count >= MaxRxErrorCount) {
+		sb1000_wait_for_ready_clear(ioaddr, name);
+		sb1000_send_command(ioaddr, name, Command1);
+		sb1000_wait_for_ready(ioaddr, name);
+		sb1000_issue_read_command(ioaddr, name);
+		lp->rx_error_count = 0;
+	}
+
+	dev->interrupt = 0;
+	return;
+}
+
+static struct net_device_stats *sb1000_stats(struct device *dev)
+{
+	struct sb1000_private *lp = (struct sb1000_private *)dev->priv;
+	return &lp->stats;
+}
+
+static int sb1000_close(struct device *dev)
+{
+	int i;
+	int ioaddr[2];
+	struct sb1000_private *lp = (struct sb1000_private *)dev->priv;
+
+	if (sb1000_debug > 2)
+		printk(KERN_DEBUG "%s: Shutting down sb1000.\n", dev->name);
+
+	dev->tbusy = 1;
+	dev->start = 0;
+
+	ioaddr[0] = dev->base_addr;
+	/* rmem_end holds the second I/O address - fv */
+	ioaddr[1] = dev->rmem_end;
+
+	free_irq(dev->irq, dev);
+	/* If we don't do this, we can't re-insmod it later. */
+	release_region(ioaddr[1], SB1000_IO_EXTENT);
+	release_region(ioaddr[0], SB1000_IO_EXTENT);
+
+	/* free rx_skb's if needed */
+	for (i=0; i<4; i++) {
+		if (lp->rx_skb[i]) {
+			dev_kfree_skb(lp->rx_skb[i]);
+		}
+	}
+	MOD_DEC_USE_COUNT;
+	return 0;
+}
+
+#ifdef MODULE
+MODULE_AUTHOR("Franco Venturi <fventuri@mediaone.net>");
+MODULE_DESCRIPTION("General Instruments SB1000 driver");
+MODULE_PARM(io, "1-2i");
+MODULE_PARM(irq, "i");
+
+static char devname[8] = {0, };
+static struct device dev_sb1000 = {
+        devname,
+        0, 0, 0, 0,
+        0, 0,
+        0, 0, 0, NULL, sb1000_probe };
+
+static int io[2]  = {0, 0};
+static int irq = 0;
+
+int
+init_module(void)
+{
+	int i;
+	for (i = 0; i < 100; i++) {
+		sprintf(devname, "cm%d", i);
+		if (dev_get(devname) == NULL) break;
+	}
+	if (i == 100) {
+		printk(KERN_ERR "sb1000: can't register any device cm<n>\n");
+		return -ENFILE;
+	}
+	dev_sb1000.base_addr = io[0];
+	/* rmem_end holds the second I/O address - fv */
+	dev_sb1000.rmem_end = io[1];
+	dev_sb1000.irq = irq;
+	if (register_netdev(&dev_sb1000) != 0) {
+		printk(KERN_ERR "sb1000: failed to register device (io: %03x,%03x   "
+			"irq: %d)\n", io[0], io[1], irq);
+		return -EIO;
+	}
+	return 0;
+}
+
+void cleanup_module(void)
+{
+	unregister_netdev(&dev_sb1000);
+	kfree_s(dev_sb1000.priv, sizeof(struct sb1000_private));
+	dev_sb1000.priv = NULL;
+}
+#endif /* MODULE */
+
+/*
+ * Local variables:
+ *  compile-command: "gcc -D__KERNEL__ -DMODULE -Wall -Wstrict-prototypes -O -m486 -c sb1000.c"
+ *  version-control: t
+ *  tab-width: 4
+ *  c-basic-offset: 4
+ * End:
+ */
diff -urN linux-2.2.11-pre2/drivers/net/sis900.c linux/drivers/net/sis900.c
--- linux-2.2.11-pre2/drivers/net/sis900.c	Wed Dec 31 16:00:00 1969
+++ linux/drivers/net/sis900.c	Mon Dec  3 18:52:26 2001
@@ -0,0 +1,1925 @@
+/*****************************************************************************/
+/*      sis900.c: A SiS 900 PCI Fast Ethernet driver for Linux.              */
+/*                                                                           */
+/*                Silicon Integrated System Corporation                      */ 
+/*                Revision:	1.05	Aug 7 1999                           */
+/*                                                                           */
+/*****************************************************************************/
+
+/*                                                                            
+      Modified from the driver which is originally written by Donald Becker. 
+
+      This software may be used and distributed according to the terms
+      of the GNU Public License (GPL), incorporated herein by reference.
+      Drivers based on this skeleton fall under the GPL and must retain
+      the authorship (implicit copyright) notice.
+
+      The author may be reached as becker@tidalwave.net, or
+      Donald Becker
+      312 Severn Ave. #W302
+      Annapolis MD 21403
+
+      Support and updates [to the original skeleton] available at
+      http://www.tidalwave.net/~becker/pci-skeleton.html
+*/
+
+static const char *version =
+"sis900.c:v1.05  8/07/99\n";
+
+static int max_interrupt_work = 20;
+#define sis900_debug debug
+static int sis900_debug = 0;
+
+static int multicast_filter_limit = 128;
+
+#define MAX_UNITS 8             /* More are supported, limit only on options */
+
+#define TX_BUF_SIZE     1536
+#define RX_BUF_SIZE     1536
+
+#define TX_DMA_BURST    0
+#define RX_DMA_BURST    0
+#define TX_FIFO_THRESH  16
+#define TxDRNT_100      (1536>>5)
+#define TxDRNT_10       16 //(1536>>5)
+#define RxDRNT_100      8
+#define RxDRNT_10       8 //(1536>>5)
+#define TRUE            1
+#define FALSE           0
+
+/* Operational parameters that usually are not changed. */
+/* Time in jiffies before concluding the transmitter is hung. */
+#define TX_TIMEOUT  (4*HZ)
+
+#include <linux/module.h>
+#include <linux/version.h>
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/string.h>
+#include <linux/timer.h>
+#include <linux/errno.h>
+#include <linux/ioport.h>
+#include <linux/malloc.h>
+#include <linux/interrupt.h>
+#include <linux/pci.h>
+#include <linux/netdevice.h>
+#include <linux/etherdevice.h>
+#include <linux/skbuff.h>
+#include <asm/processor.h>      /* Processor type for cache alignment. */
+#include <asm/bitops.h>
+#include <asm/io.h>
+
+#define RUN_AT(x) (jiffies + (x))
+
+#include <linux/delay.h>
+
+#if LINUX_VERSION_CODE < 0x20123
+#define test_and_set_bit(val, addr) set_bit(val, addr)
+#endif
+#if LINUX_VERSION_CODE <= 0x20139
+#define net_device_stats enet_statistics
+#else
+#define NETSTATS_VER2
+#endif
+#if LINUX_VERSION_CODE < 0x20155  ||  defined(CARDBUS)
+/* Grrrr, the PCI code changed, but did not consider CardBus... */
+#include <linux/bios32.h>
+#define PCI_SUPPORT_VER1
+#else
+#define PCI_SUPPORT_VER2
+#endif
+#if LINUX_VERSION_CODE < 0x20159
+#define dev_free_skb(skb) dev_kfree_skb(skb, FREE_WRITE);
+#else
+#define dev_free_skb(skb) dev_kfree_skb(skb);
+#endif
+
+/* The I/O extent. */
+#define SIS900_TOTAL_SIZE 0x100
+
+/* This table drives the PCI probe routines.  It's mostly boilerplate in all
+   of the drivers, and will likely be provided by some future kernel.
+   Note the matching code -- the first table entry matchs all 56** cards but
+   second only the 1234 card.
+*/
+
+enum pci_flags_bit {
+        PCI_USES_IO=1, PCI_USES_MEM=2, PCI_USES_MASTER=4,
+};
+
+struct pci_id_info {
+        const char *name;
+        u16     vendor_id, device_id, device_id_mask, flags;
+        int io_size;
+        struct device *(*probe1)(int pci_bus, int pci_devfn, struct device *dev,
+                         long ioaddr, int irq, int chip_idx, int fnd_cnt);
+};
+
+static struct device * sis900_probe1(int pci_bus, int pci_devfn,
+                                  struct device *dev, long ioaddr,
+                                  int irq, int chp_idx, int fnd_cnt);
+
+static struct pci_id_info pci_tbl[] =
+{{ "SiS 900 PCI Fast Ethernet",
+   0x1039, 0x0900, 0xffff, PCI_USES_IO|PCI_USES_MASTER, 0x100, sis900_probe1},
+  { "SiS 7016 PCI Fast Ethernet",
+   0x1039, 0x7016, 0xffff, PCI_USES_IO|PCI_USES_MASTER, 0x100, sis900_probe1},
+ {0,},                                          /* 0 terminated list. */
+};
+
+/* The capability table matches the chip table above. */
+enum {HAS_MII_XCVR=0x01, HAS_CHIP_XCVR=0x02, HAS_LNK_CHNG=0x04};
+static int sis_cap_tbl[] = {
+        HAS_MII_XCVR|HAS_CHIP_XCVR|HAS_LNK_CHNG,
+        HAS_MII_XCVR|HAS_CHIP_XCVR|HAS_LNK_CHNG,
+};
+
+/* The rest of these values should never change. */
+#define NUM_TX_DESC     16      /* Number of Tx descriptor registers. */
+#define NUM_RX_DESC     8       /* Number of Rx descriptor registers. */
+
+/* Symbolic offsets to registers. */
+enum SIS900_registers {
+        cr=0x0,                 //Command Register
+        cfg=0x4,                //Configuration Register
+        mear=0x8,               //EEPROM Access Register
+        ptscr=0xc,              //PCI Test Control Register
+        isr=0x10,               //Interrupt Status Register
+        imr=0x14,               //Interrupt Mask Register
+        ier=0x18,               //Interrupt Enable Register
+        epar=0x18,              //Enhanced PHY Access Register
+        txdp=0x20,              //Transmit Descriptor Pointer Register
+        txcfg=0x24,             //Transmit Configuration Register
+        rxdp=0x30,              //Receive Descriptor Pointer Register
+        rxcfg=0x34,             //Receive Configuration Register
+        flctrl=0x38,            //Flow Control Register
+        rxlen=0x3c,             //Receive Packet Length Register
+        rfcr=0x48,              //Receive Filter Control Register
+        rfdr=0x4C,              //Receive Filter Data Register
+        pmctrl=0xB0,            //Power Management Control Register
+        pmer=0xB4               //Power Management Wake-up Event Register
+};
+
+#define RESET           0x00000100
+#define SWI             0x00000080
+#define RxRESET         0x00000020
+#define TxRESET         0x00000010
+#define RxDIS           0x00000008
+#define RxENA           0x00000004
+#define TxDIS           0x00000002
+#define TxENA           0x00000001
+
+#define BISE            0x80000000
+#define EUPHCOM         0x00000100
+#define REQALG          0x00000080
+#define SB              0x00000040
+#define POW             0x00000020
+#define EXD             0x00000010
+#define PESEL           0x00000008
+#define LPM             0x00000004
+#define BEM             0x00000001
+
+/* Interrupt register bits, using my own meaningful names. */
+#define WKEVT           0x10000000
+#define TxPAUSEEND      0x08000000
+#define TxPAUSE         0x04000000
+#define TxRCMP          0x02000000
+#define RxRCMP          0x01000000
+#define DPERR           0x00800000
+#define SSERR           0x00400000
+#define RMABT           0x00200000
+#define RTABT           0x00100000
+#define RxSOVR          0x00010000
+#define HIBERR          0x00008000
+#define SWINT           0x00001000
+#define MIBINT          0x00000800
+#define TxURN           0x00000400
+#define TxIDLE          0x00000200
+#define TxERR           0x00000100
+#define TxDESC          0x00000080
+#define TxOK            0x00000040
+#define RxORN           0x00000020
+#define RxIDLE          0x00000010
+#define RxEARLY         0x00000008
+#define RxERR           0x00000004
+#define RxDESC          0x00000002
+#define RxOK            0x00000001
+
+#define IE              0x00000001
+
+#define TxCSI           0x80000000
+#define TxHBI           0x40000000
+#define TxMLB           0x20000000
+#define TxATP           0x10000000
+#define TxIFG           0x0C000000
+#define TxMXF           0x03800000
+#define TxMXF_shift     0x23
+#define TxMXDMA         0x00700000
+#define TxMXDMA_shift   20
+#define TxRTCNT         0x000F0000
+#define TxRTCNT_shift   16
+#define TxFILLT         0x00007F00
+#define TxFILLT_shift   8
+#define TxDRNT          0x0000007F
+
+#define RxAEP           0x80000000
+#define RxARP           0x40000000
+#define RxATP           0x10000000
+#define RxAJAB          0x08000000
+#define RxMXF           0x03800000
+#define RxMXF_shift     23
+#define RxMXDMA         0x00700000
+#define RxMXDMA_shift   20
+#define RxDRNT          0x0000007F
+
+#define RFEN            0x80000000
+#define RFAAB           0x40000000
+#define RFAAM           0x20000000
+#define RFAAP           0x10000000
+#define RFPromiscuous   (RFAAB|RFAAM|RFAAP)
+#define RFAA_shift      28
+#define RFEP            0x00070000
+#define RFEP_shift      16
+
+#define RFDAT           0x0000FFFF
+
+#define OWN             0x80000000
+#define MORE            0x40000000
+#define INTR            0x20000000
+#define OK              0x08000000
+#define DSIZE           0x00000FFF
+
+#define SUPCRC          0x10000000
+#define ABORT           0x04000000
+#define UNDERRUN        0x02000000
+#define NOCARRIER       0x01000000
+#define DEFERD          0x00800000
+#define EXCDEFER        0x00400000
+#define OWCOLL          0x00200000
+#define EXCCOLL         0x00100000
+#define COLCNT          0x000F0000
+
+#define INCCRC          0x10000000
+//      ABORT           0x04000000
+#define OVERRUN         0x02000000
+#define DEST            0x01800000
+#define BCAST           0x01800000
+#define MCAST           0x01000000
+#define UNIMATCH        0x00800000
+#define TOOLONG         0x00400000
+#define RUNT            0x00200000
+#define RXISERR         0x00100000
+#define CRCERR          0x00080000
+#define FAERR           0x00040000
+#define LOOPBK          0x00020000
+#define RXCOL           0x00010000
+
+#define EuphLiteEEMACAddr               0x08
+#define EuphLiteEEVendorID              0x02
+#define EuphLiteEEDeviceID              0x03
+#define EuphLiteEECardTypeRev           0x0b
+#define EuphLiteEEPlexusRev             0x0c
+#define EuphLiteEEChecksum              0x0f
+
+#define RXSTS_shift     18
+#define OWN             0x80000000
+#define MORE            0x40000000
+#define INTR            0x20000000
+#define OK              0x08000000
+#define DSIZE           0x00000FFF
+/* MII register offsets */
+#define MII_CONTROL             0x0000
+#define MII_STATUS              0x0001
+#define MII_PHY_ID0             0x0002
+#define MII_PHY_ID1             0x0003
+#define MII_ANAR                0x0004
+#define MII_ANLPAR              0x0005
+#define MII_ANER                0x0006
+/* MII Control register bit definitions. */
+#define MIICNTL_FDX             0x0100
+#define MIICNTL_RST_AUTO        0x0200
+#define MIICNTL_ISOLATE         0x0400
+#define MIICNTL_PWRDWN          0x0800
+#define MIICNTL_AUTO            0x1000
+#define MIICNTL_SPEED           0x2000
+#define MIICNTL_LPBK            0x4000
+#define MIICNTL_RESET           0x8000
+/* MII Status register bit significance. */
+#define MIISTAT_EXT             0x0001
+#define MIISTAT_JAB             0x0002
+#define MIISTAT_LINK            0x0004
+#define MIISTAT_CAN_AUTO        0x0008
+#define MIISTAT_FAULT           0x0010
+#define MIISTAT_AUTO_DONE       0x0020
+#define MIISTAT_CAN_T           0x0800
+#define MIISTAT_CAN_T_FDX       0x1000
+#define MIISTAT_CAN_TX          0x2000
+#define MIISTAT_CAN_TX_FDX      0x4000
+#define MIISTAT_CAN_T4          0x8000
+/* MII NWAY Register Bits ...
+** valid for the ANAR (Auto-Negotiation Advertisement) and
+** ANLPAR (Auto-Negotiation Link Partner) registers */
+#define MII_NWAY_NODE_SEL       0x001f
+#define MII_NWAY_CSMA_CD        0x0001
+#define MII_NWAY_T              0x0020
+#define MII_NWAY_T_FDX          0x0040
+#define MII_NWAY_TX             0x0080
+#define MII_NWAY_TX_FDX         0x0100
+#define MII_NWAY_T4             0x0200
+#define MII_NWAY_RF             0x2000
+#define MII_NWAY_ACK            0x4000
+#define MII_NWAY_NP             0x8000
+
+/* MII Auto-Negotiation Expansion Register Bits */
+#define MII_ANER_PDF            0x0010
+#define MII_ANER_LP_NP_ABLE     0x0008
+#define MII_ANER_NP_ABLE        0x0004
+#define MII_ANER_RX_PAGE        0x0002
+#define MII_ANER_LP_AN_ABLE     0x0001
+#define HALF_DUPLEX                     1
+#define FDX_CAPABLE_DUPLEX_UNKNOWN      2
+#define FDX_CAPABLE_HALF_SELECTED       3
+#define FDX_CAPABLE_FULL_SELECTED       4
+#define HW_SPEED_UNCONFIG       0
+#define HW_SPEED_10_MBPS        10
+#define HW_SPEED_100_MBPS       100
+#define HW_SPEED_DEFAULT        (HW_SPEED_10_MBPS)
+
+#define ACCEPT_ALL_PHYS         0x01
+#define ACCEPT_ALL_MCASTS       0x02
+#define ACCEPT_ALL_BCASTS       0x04
+#define ACCEPT_ALL_ERRORS       0x08
+#define ACCEPT_CAM_QUALIFIED    0x10
+#define MAC_LOOPBACK            0x20
+//#define FDX_CAPABLE_FULL_SELECTED     4
+#define CRC_SIZE                4
+#define MAC_HEADER_SIZE         14
+
+typedef struct _EuphLiteDesc {
+        u32     llink;
+        unsigned char*  buf;
+        u32     physAddr;
+        /* Hardware sees the physical address of descriptor */
+        u32     plink;
+        u32     cmdsts;
+        u32     bufPhys;
+} EuphLiteDesc;
+
+struct sis900_private {
+        char devname[8];                /* Used only for kernel debugging. */
+        const char *product_name;
+        struct device *next_module;
+        int chip_id;
+        int chip_revision;
+        unsigned char pci_bus, pci_devfn;
+#if LINUX_VERSION_CODE > 0x20139
+        struct net_device_stats stats;
+#else
+        struct enet_statistics stats;
+#endif
+        struct timer_list timer;        /* Media selection timer. */
+        unsigned int cur_rx;    /* Index into the Rx buffer of next Rx pkt. */
+        unsigned int cur_tx, dirty_tx, tx_flag;
+
+        /* The saved address of a sent-in-place packet/buffer, for skfree(). */
+        struct sk_buff* tx_skbuff[NUM_TX_DESC];
+        EuphLiteDesc tx_buf[NUM_TX_DESC];       /* Tx bounce buffers */
+        EuphLiteDesc rx_buf[NUM_RX_DESC];
+        unsigned char *rx_bufs;
+        unsigned char *tx_bufs;                 /* Tx bounce buffer region. */
+        char phys[4];                           /* MII device addresses. */
+        int phy_idx;
+        u16 pmd_status;
+        unsigned int tx_full;                   /* The Tx queue is full. */
+        u16 full_duplex;        /* FullHalf-duplex. */
+        u16 hunmbps;            /* 10010 Mbps. */
+        u16 LinkOn;
+        u16 LinkChange;
+};
+
+#ifdef MODULE
+#if LINUX_VERSION_CODE > 0x20115
+MODULE_AUTHOR("Silicon Integrated Systems Corporation");
+MODULE_DESCRIPTION("SiS 900 PCI Fast Ethernet driver");
+MODULE_PARM(options, "1-" __MODULE_STRING(MAX_UNITS) "i");
+MODULE_PARM(full_duplex, "1-" __MODULE_STRING(MAX_UNITS) "i");
+MODULE_PARM(multicast_filter_limit, "i");
+MODULE_PARM(max_interrupt_work, "i");
+MODULE_PARM(debug, "i");
+#endif
+#endif
+
+static int sis900_open(struct device *dev);
+static u16 read_eeprom(long ioaddr, int location);
+static int mdio_read(struct device *dev, int phy_id, int location);
+static void mdio_write(struct device *dev, int phy_id, int location, int val);
+static void sis900_timer(unsigned long data);
+static void sis900_tx_timeout(struct device *dev);
+static void sis900_init_ring(struct device *dev);
+static int sis900_start_xmit(struct sk_buff *skb, struct device *dev);
+static int sis900_rx(struct device *dev);
+static void sis900_interrupt(int irq, void *dev_instance, struct pt_regs *regs);
+static int sis900_close(struct device *dev);
+static int mii_ioctl(struct device *dev, struct ifreq *rq, int cmd);
+static struct enet_statistics *sis900_get_stats(struct device *dev);
+static void set_rx_mode(struct device *dev);
+static void sis900_reset(struct device *dev);
+static u16 elAutoNegotiate(struct device *dev, int phy_id, int *duplex, int *speed);
+static u16 elPMDreadMode(struct device *dev, int phy_id, int *speed, int *duplex);
+static u16 elMIIpollBit(struct device *dev, int phy_id, int location, u16 mask, u16 polarity, u16 *value);
+static void elSetMediaType(struct device *dev, int speed, int duplex);
+
+/* A list of all installed SiS900 devices, for removing the driver module. */
+static struct device *root_sis900_dev = NULL;
+
+/* Ideally we would detect all network cards in slot order.  That would
+   be best done a central PCI probe dispatch, which wouldn't work
+   well when dynamically adding drivers.  So instead we detect just the
+   SiS 900 cards in slot order. */
+
+int sis900_probe(struct device *dev)
+{
+        int cards_found = 0;
+        int pci_index = 0;
+        unsigned char pci_bus, pci_device_fn;
+
+        if ( ! pcibios_present())
+                return -ENODEV;
+
+        for (;pci_index < 0xff; pci_index++) {
+                u16 vendor, device, pci_command, new_command;
+                int chip_idx, irq;
+                long ioaddr;
+
+                if (pcibios_find_class (PCI_CLASS_NETWORK_ETHERNET << 8,
+                                                pci_index,
+                                                &pci_bus, &pci_device_fn)
+                                != PCIBIOS_SUCCESSFUL) {
+                        break;
+                }
+                pcibios_read_config_word(pci_bus, pci_device_fn, PCI_VENDOR_ID,
+                                                        &vendor);
+                pcibios_read_config_word(pci_bus, pci_device_fn, PCI_DEVICE_ID,
+                                                        &device);
+
+                for (chip_idx = 0; pci_tbl[chip_idx].vendor_id; chip_idx++)
+                        if (vendor == pci_tbl[chip_idx].vendor_id &&
+                                (device & pci_tbl[chip_idx].device_id_mask) ==
+                                pci_tbl[chip_idx].device_id)
+                                break;
+                if (pci_tbl[chip_idx].vendor_id == 0)   /* Compiled out! */
+                        continue;
+
+        {
+#if defined(PCI_SUPPORT_VER2)
+                struct pci_dev *pdev = pci_find_slot(pci_bus, pci_device_fn);
+                ioaddr = pdev->base_address[0] & ~3;
+                irq = pdev->irq;
+#else
+                u32 pci_ioaddr;
+                u8 pci_irq_line;
+                pcibios_read_config_byte(pci_bus, pci_device_fn,
+                                         PCI_INTERRUPT_LINE, &pci_irq_line);
+                pcibios_read_config_dword(pci_bus, pci_device_fn,
+                                         PCI_BASE_ADDRESS_0, &pci_ioaddr);
+                ioaddr = pci_ioaddr & ~3;
+                irq = pci_irq_line;
+#endif
+        }
+
+                if ((pci_tbl[chip_idx].flags & PCI_USES_IO) &&
+                        check_region(ioaddr, pci_tbl[chip_idx].io_size))
+                        continue;
+
+                /* Activate the card: fix for brain-damaged Win98 BIOSes. */
+                pcibios_read_config_word(pci_bus, pci_device_fn,
+                                         PCI_COMMAND, &pci_command);
+                new_command = pci_command | (pci_tbl[chip_idx].flags & 7);
+                if (pci_command != new_command) {
+                        printk(KERN_INFO "  The PCI BIOS has not enabled the"
+                                   " device at %d/%d!"
+                                   "Updating PCI command %4.4x->%4.4x.\n",
+                                        pci_bus, pci_device_fn,
+                                        pci_command, new_command);
+
+                        pcibios_write_config_word(pci_bus, pci_device_fn,
+                                                  PCI_COMMAND, new_command);
+                }
+
+                dev = pci_tbl[chip_idx].probe1(pci_bus,
+                                                pci_device_fn,
+                                                dev,
+                                                ioaddr,
+                                                irq,
+                                                chip_idx,
+                                                cards_found);
+
+                if (dev  && (pci_tbl[chip_idx].flags & PCI_COMMAND_MASTER)) {
+                        u8 pci_latency;
+
+                        pcibios_read_config_byte(pci_bus, pci_device_fn,
+                                        PCI_LATENCY_TIMER, &pci_latency);
+
+                        if (pci_latency < 32) {
+                           printk(KERN_NOTICE "  PCI latency timer (CFLT) is "
+                           "unreasonably low at %d.  Setting to 64 clocks.\n",
+                                           pci_latency);
+                           pcibios_write_config_byte(pci_bus, pci_device_fn,
+                                          PCI_LATENCY_TIMER, 64);
+                        }
+                }
+                dev = 0;
+                cards_found++;
+        }
+        return cards_found ? 0 : -ENODEV;
+}
+
+static struct device * sis900_probe1(   int pci_bus,
+                                        int pci_devfn,
+                                        struct device *dev,
+                                        long ioaddr,
+                                        int irq,
+                                        int chip_idx,
+                                        int found_cnt)
+{
+        static int did_version = 0;     /* Already printed version info. */
+        struct sis900_private *tp;
+        int     duplex=0;
+        int     speed=0;
+        int i;
+
+        if (did_version++ == 0)
+                printk(KERN_INFO "%s", version);
+
+        dev = init_etherdev(dev, 0);
+
+        printk(KERN_INFO "%s: %s at %#lx, IRQ %d, ",
+                   dev->name, pci_tbl[chip_idx].name, ioaddr, irq);
+
+        if ((u16)read_eeprom(ioaddr, EuphLiteEEVendorID) != 0xffff) {
+                for (i = 0; i < 3; i++)
+                        ((u16 *)(dev->dev_addr))[i] =
+                                        read_eeprom(ioaddr,i+EuphLiteEEMACAddr);
+                for (i = 0; i < 5; i++)
+                        printk("%2.2x:", (u8)dev->dev_addr[i]);
+                printk("%2.2x.\n", dev->dev_addr[i]);
+        } else
+                printk(KERN_INFO "Error EEPROM read\n");
+
+        /* We do a request_region() to register /proc/ioports info. */
+        request_region(ioaddr, pci_tbl[chip_idx].io_size, dev->name);
+
+        dev->base_addr = ioaddr;
+        dev->irq = irq;
+
+        /* Some data structures must be quadword aligned. */
+        tp = kmalloc(sizeof(*tp), GFP_KERNEL | GFP_DMA);
+        memset(tp, 0, sizeof(*tp));
+        dev->priv = tp;
+
+        tp->next_module = root_sis900_dev;
+        root_sis900_dev = dev;
+
+        tp->chip_id = chip_idx;
+        tp->pci_bus = pci_bus;
+        tp->pci_devfn = pci_devfn;
+
+        /* Find the connected MII xcvrs.
+           Doing this in open() would allow detecting external xcvrs later, but
+           takes too much time. */
+        if (sis_cap_tbl[chip_idx] & HAS_MII_XCVR) {
+                int phy, phy_idx;
+                for (phy = 0, phy_idx = 0;
+                        phy < 32 && phy_idx < sizeof(tp->phys); phy++)
+                {
+                        int mii_status = mdio_read(dev, phy, MII_STATUS);
+                        /*
+                        {
+                           int p;
+                           int l;
+                           for (p = 0 ; p < 4 ; p ++) {
+                                for (l=0 ; l<16 ; l++) {
+                                  int status = mdio_read(dev, phy, l);
+                                  status = mdio_read(dev, phy, l);
+                                  printk(KERN_INFO "MII info addr[%d][%d]=%x\n",
+                                        p, l, status);
+                                }
+                           }
+                        }
+                        */
+
+                        if (mii_status != 0xffff && mii_status != 0x0000) {
+                                tp->phy_idx = phy_idx;
+                                tp->phys[phy_idx++] = phy;
+                                tp->pmd_status=mdio_read(dev, phy, MII_STATUS);
+                                printk(KERN_INFO "%s: MII transceiver found "
+                                                 "at address %d.\n",
+                                                 dev->name, phy);
+                                break;
+                        }
+                }
+
+                if (phy_idx == 0) {
+                        printk(KERN_INFO "%s: No MII transceivers found!",
+                                        dev->name);
+                        printk(KERN_INFO "Assuming SYM transceiver.\n");
+                        tp->phys[0] = -1;
+                }
+        } else {
+                        tp->phys[0] = 32;
+        }
+
+        if (tp->pmd_status > 0) {
+                tp->pmd_status=
+                   elAutoNegotiate(dev, tp->phys[tp->phy_idx], &duplex, &speed);
+                if (tp->pmd_status & MIISTAT_LINK) {
+                        if (duplex == FDX_CAPABLE_FULL_SELECTED)
+                                tp->full_duplex=1;
+                        if (speed == HW_SPEED_100_MBPS)
+                                tp->hunmbps=1;
+                        tp->LinkOn = TRUE;
+                } else {
+                        tp->LinkOn = FALSE;
+                }
+                tp->LinkChange = FALSE;
+        }
+
+        /*
+        if (found_cnt < MAX_UNITS  &&  full_duplex[found_cnt] > 0)
+                tp->full_duplex = full_duplex[found_cnt];
+
+        if (tp->full_duplex) {
+                printk(KERN_INFO "%s: Media type is Full Duplex.\n", dev->name);
+        } else {
+                printk(KERN_INFO "%s: Media type is Half Duplex.\n", dev->name);
+        }
+        if (tp->hunmbps) {
+                printk(KERN_INFO "%s: Speed is 100mbps.\n", dev->name);
+        } else {
+                printk(KERN_INFO "%s: Speed is 10mbps.\n", dev->name);
+        }
+        */
+
+        /* The SiS900-specific entries in the device structure. */
+        dev->open = &sis900_open;
+        dev->hard_start_xmit = &sis900_start_xmit;
+        dev->stop = &sis900_close;
+        dev->get_stats = &sis900_get_stats;
+        dev->set_multicast_list = &set_rx_mode;
+        dev->do_ioctl = &mii_ioctl;
+
+        return dev;
+}
+
+/* Serial EEPROM section. */
+
+/*  EEPROM_Ctrl bits. */
+#define EECLK           0x00000004      /* EEPROM shift clock. */
+#define EECS            0x00000008      /* EEPROM chip select. */
+#define EEDO            0x00000002      /* EEPROM chip data out. */
+#define EEDI            0x00000001      /* EEPROM chip data in. */
+
+/* Delay between EEPROM clock transitions.
+   No extra delay is needed with 33Mhz PCI, but 66Mhz may change this.
+ */
+
+#define eeprom_delay()  inl(ee_addr)
+
+/* The EEPROM commands include the alway-set leading bit. */
+#define EEread          0x0180
+#define EEwrite         0x0140
+#define EEerase         0x01C0
+#define EEwriteEnable   0x0130
+#define EEwriteDisable  0x0100
+#define EEeraseAll      0x0120
+#define EEwriteAll      0x0110
+#define EEaddrMask      0x013F
+#define EEcmdShift      16
+
+static u16 read_eeprom(long ioaddr, int location)
+{
+        int i;
+        u16 retval = 0;
+        long ee_addr = ioaddr + mear;
+        u32 read_cmd = location | EEread;
+
+        outl(0, ee_addr);
+        eeprom_delay();
+        outl(EECLK, ee_addr);
+        eeprom_delay();
+
+        /* Shift the read command bits out. */
+        for (i = 8; i >= 0; i--) {
+                u32 dataval = (read_cmd & (1 << i)) ? EEDI | EECS : EECS;
+                outl(dataval, ee_addr);
+                eeprom_delay();
+                outl(dataval | EECLK, ee_addr);
+                eeprom_delay();
+        }
+        outb(EECS, ee_addr);
+        eeprom_delay();
+
+        for (i = 16; i > 0; i--) {
+                outl(EECS, ee_addr);
+                eeprom_delay();
+                outl(EECS | EECLK, ee_addr);
+                eeprom_delay();
+                retval = (retval << 1) | ((inl(ee_addr) & EEDO) ? 1 : 0);
+                eeprom_delay();
+        }
+
+        /* Terminate the EEPROM access. */
+        outl(0, ee_addr);
+        eeprom_delay();
+        outl(EECLK, ee_addr);
+        return (retval);
+}
+
+/* MII serial management: mostly bogus for now. */
+/* Read and write the MII management registers using software-generated
+   serial MDIO protocol.
+   The maximum data clock rate is 2.5 Mhz.  The minimum timing is usually
+   met by back-to-back PCI I/O cycles, but we insert a delay to avoid
+   "overclocking" issues. */
+
+#define mdio_delay()    inl(mdio_addr)
+
+#define MIIread         0x6000
+#define MIIwrite        0x6002
+#define MIIpmdMask      0x0F80
+#define MIIpmdShift     7
+#define MIIregMask      0x007C
+#define MIIregShift     2
+#define MIIturnaroundBits       2
+#define MIIcmdLen       16
+#define MIIcmdShift     16
+#define MIIreset        0xFFFFFFFF
+#define MIIwrLen        32
+
+#define MDC             0x00000040
+#define MDDIR           0x00000020
+#define MDIO            0x00000010
+
+static void mdio_idle(long mdio_addr)
+{
+        outl(MDIO | MDDIR, mdio_addr);
+        mdio_delay();
+        outl(MDIO | MDDIR | MDC, mdio_addr);
+}
+
+/* Syncronize the MII management interface by shifting 32 one bits out. */
+static void mdio_reset(long mdio_addr)
+{
+        int i;
+
+        for (i = 31; i >= 0; i--) {
+                outl(MDDIR | MDIO, mdio_addr);
+                mdio_delay();
+                outl(MDDIR | MDIO | MDC, mdio_addr);
+                mdio_delay();
+        }
+        return;
+}
+
+static int mdio_read(struct device *dev, int phy_id, int location)
+{
+        long mdio_addr = dev->base_addr + mear;
+        int mii_cmd = MIIread|(phy_id<<MIIpmdShift)|(location<<MIIregShift);
+        int retval = 0;
+        int i;
+
+        mdio_reset(mdio_addr);
+        mdio_idle(mdio_addr);
+
+        for (i = 15; i >= 0; i--) {
+                int dataval = (mii_cmd & (1 << i)) ? MDDIR | MDIO : MDDIR;
+                outl(dataval, mdio_addr);
+                outl(dataval | MDC, mdio_addr);
+        }
+
+        /* Read the two transition, 16 data, and wire-idle bits. */
+        for (i = 16; i > 0; i--) {
+                outl(0, mdio_addr);
+                //mdio_delay();
+                retval = (retval << 1) | ((inl(mdio_addr) & MDIO) ? 1 : 0);
+                outl(MDC, mdio_addr);
+                mdio_delay();
+        }
+        return retval;
+}
+
+static void mdio_write(struct device *dev, int phy_id, int location, int value)
+{
+        long mdio_addr = dev->base_addr + mear;
+        int mii_cmd = MIIwrite|(phy_id<<MIIpmdShift)|(location<<MIIregShift);
+        int i;
+
+        mdio_reset(mdio_addr);
+        mdio_idle(mdio_addr);
+
+        /* Shift the command bits out. */
+        for (i = 31; i >= 0; i--) {
+                int dataval = (mii_cmd & (1 << i)) ? MDDIR | MDIO : MDDIR;
+                outb(dataval, mdio_addr);
+                mdio_delay();
+                outb(dataval | MDC, mdio_addr);
+                mdio_delay();
+        }
+        mdio_delay();
+        /* Clear out extra bits. */
+        for (i = 2; i > 0; i--) {
+                outb(0, mdio_addr);
+                mdio_delay();
+                outb(MDC, mdio_addr);
+                mdio_delay();
+        }
+        return;
+}
+
+static int
+sis900_open(struct device *dev)
+{
+        struct sis900_private *tp = (struct sis900_private *)dev->priv;
+        long ioaddr = dev->base_addr;
+
+        if (sis900_debug > 0)
+                printk(KERN_INFO "%s sis900_open, IO Addr=%x, Irq=%x\n",
+                                dev->name, (unsigned int)ioaddr, dev->irq);
+
+        /* Soft reset the chip. */
+        outl(0, ioaddr + imr);
+        outl(0, ioaddr + ier);
+        outl(0, ioaddr + rfcr);
+        outl(RESET | RxRESET | TxRESET, ioaddr + cr);
+
+        if (request_irq(dev->irq, &sis900_interrupt, SA_SHIRQ, dev->name, dev))
+        {
+                return -EAGAIN;
+        }
+
+        MOD_INC_USE_COUNT;
+
+        tp->tx_bufs = kmalloc(TX_BUF_SIZE * NUM_TX_DESC, GFP_KERNEL);
+        tp->rx_bufs = kmalloc(RX_BUF_SIZE * NUM_RX_DESC, GFP_KERNEL);
+        if (tp->tx_bufs == NULL || tp->rx_bufs == NULL) {
+                if (tp->tx_bufs)
+                        kfree(tp->tx_bufs);
+                if (sis900_debug > 0)
+                        printk(KERN_ERR "%s: Couldn't allocate a %d byte receive ring.\n",
+                                   dev->name, TX_BUF_SIZE * NUM_TX_DESC);
+                return -ENOMEM;
+        }
+
+        {
+                u32 rfcrSave;
+                u32 w;
+                u32 i;
+
+                rfcrSave = inl(rfcr);
+                outl(rfcrSave & ~RFEN, rfcr);
+                for (i=0 ; i<3 ; i++) {
+                        w = (u16)*((u16*)(dev->dev_addr)+i);
+                        outl((((u32) i) << RFEP_shift), ioaddr + rfcr);
+                        outl((u32)w, ioaddr + rfdr);
+                        if (sis900_debug > 4) {
+                                printk(KERN_INFO "Filter Addr[%d]=%x\n",
+                                        i, inl(ioaddr + rfdr));
+                        }
+                }
+                /*
+                for (i=0 ; i<3 ; i++) {
+                        outl((((u32) i) << RFEP_shift), ioaddr + rfcr);
+                        if (sis900_debug > 4) {
+                                printk(KERN_INFO "Read Filter Addr[%d]=%x\n",
+                                        i, inl(ioaddr + rfdr));
+                        }
+                }
+                */
+                outl(rfcrSave, rfcr);
+        }
+
+        sis900_init_ring(dev);
+        outl((u32)tp->tx_buf[0].physAddr, ioaddr + txdp);
+        outl((u32)tp->rx_buf[0].physAddr, ioaddr + rxdp);
+
+        if (sis900_debug > 4)
+                printk(KERN_INFO "txdp:%8.8x\n", inl(ioaddr + txdp));
+
+        /* Check that the chip has finished the reset. */
+        {
+                u32 status;
+                int j=0;
+                status = TxRCMP | RxRCMP;
+                while (status && (j++ < 30000)) {
+                        status ^= (inl(isr) & status);
+                }
+        }
+
+        outl(PESEL, ioaddr + cfg);
+
+        /* Must enable Tx/Rx before setting transfer thresholds! */
+        /*
+                #define TX_DMA_BURST    0
+                #define RX_DMA_BURST    0
+                #define TX_FIFO_THRESH  16
+                #define TxDRNT_100      (1536>>5)
+                #define TxDRNT_10       (1536>>5)
+                #define RxDRNT_100      (1536>>5)
+                #define RxDRNT_10       (1536>>5)
+        */
+        //outl(RxENA | TxENA, ioaddr + cr);
+        outl((RX_DMA_BURST<<20) | (RxDRNT_10 << 1), ioaddr+rxcfg);
+        outl(TxATP | (TX_DMA_BURST << 20) | (TX_FIFO_THRESH<<8) | TxDRNT_10,
+                                                ioaddr + txcfg);
+        //tp->full_duplex = tp->duplex_lock;
+        if (tp->phys[tp->phy_idx] >= 0  ||
+                        (sis_cap_tbl[tp->chip_id] & HAS_MII_XCVR)) {
+                if (sis900_debug > 1)
+                        if (tp->LinkOn) {
+                          printk(KERN_INFO"%s: Setting %s%s-duplex.\n",
+                                dev->name,
+                                tp->hunmbps ? "100mbps " : "10mbps ",
+                                tp->full_duplex ? "full" : "half");
+                        } else {
+                          printk(KERN_INFO"%s: Media Link Off\n", dev->name);
+                        }
+        }
+        set_rx_mode(dev);
+
+        dev->tbusy = 0;
+        dev->interrupt = 0;
+        dev->start = 1;
+
+        /* Enable all known interrupts by setting the interrupt mask. */
+        outl((RxOK|RxERR|RxORN|RxSOVR|TxOK|TxERR|TxURN), ioaddr + imr);
+        outl(RxENA, ioaddr + cr);
+        outl(IE, ioaddr + ier);
+
+        if (sis900_debug > 1)
+                printk(KERN_INFO "%s: sis900_open() ioaddr %#lx IRQ %d \n",
+                           dev->name, ioaddr, dev->irq);
+
+        /* Set the timer to switch to check for link beat and perhaps switch
+           to an alternate media type. */
+        init_timer(&tp->timer);
+        tp->timer.expires = RUN_AT((24*HZ)/10);         /* 2.4 sec. */
+        tp->timer.data = (unsigned long)dev;
+        tp->timer.function = &sis900_timer;             /* timer handler */
+        add_timer(&tp->timer);
+
+        return 0;
+}
+
+static void sis900_timer(unsigned long data)
+{
+        struct device *dev = (struct device *)data;
+        struct sis900_private *tp = (struct sis900_private *)dev->priv;
+        long ioaddr = dev->base_addr;
+        int next_tick = 0;
+        int duplex, full_duplex=0;
+        int speed, hunmbps=0;
+        u16 status;
+
+//      printk(KERN_INFO "%s: SiS900 timer\n", dev->name);
+        elMIIpollBit(dev, tp->phys[tp->phy_idx], MII_STATUS, MIISTAT_LINK, TRUE, &status);
+        if (status & MIISTAT_LINK) {
+//              printk(KERN_INFO "%s: SiS900 timer link\n", dev->name);
+                /*
+                if (!tp->LinkOn) {
+                        printk(KERN_INFO "%s: AutoNegotiate ...\n", dev->name);
+                        tp->LinkChange=TRUE;
+                        tp->pmd_status=
+                          elAutoNegotiate(dev, tp->phys[tp->phy_idx],
+                                                &duplex, &speed);
+                }
+                 else {
+                        printk(KERN_INFO "%s: Link Still On.\n", dev->name);
+                        elPMDreadMode(dev, tp->phys[tp->phy_idx],
+                                                &speed, &duplex);
+                }
+                */
+                elPMDreadMode(dev, tp->phys[tp->phy_idx],
+                                                &speed, &duplex);
+
+
+                if (duplex == FDX_CAPABLE_FULL_SELECTED) full_duplex=1;
+                if (speed == HW_SPEED_100_MBPS) hunmbps=1;
+                if (full_duplex != tp->full_duplex || hunmbps != tp->hunmbps)
+                        tp->LinkChange = TRUE;
+                if (tp->LinkChange) {
+                        tp->full_duplex=full_duplex;
+                        tp->hunmbps=hunmbps;
+                        //elSetMediaType(dev, speed, duplex);
+                        printk(KERN_INFO "%s: Setting %s%s-duplex based on MII "
+                                   "#%d link partner ability.\n",
+                                   dev->name,
+                                   tp->hunmbps ? "100mbps " : "10mbps ",
+                                   tp->full_duplex ? "full" : "half",
+                                   tp->phys[0]);
+                }
+                tp->LinkOn=TRUE;
+                tp->LinkChange = FALSE;
+        } else {
+                if (tp->LinkOn) {
+                        tp->LinkChange = TRUE;
+                        tp->pmd_status=
+                          elAutoNegotiate(dev, tp->phys[tp->phy_idx],
+                                                &duplex, &speed);
+                        if (tp->pmd_status & MIISTAT_LINK) {
+                                if (duplex == FDX_CAPABLE_FULL_SELECTED)
+                                        tp->full_duplex=1;
+                                if (speed == HW_SPEED_100_MBPS)
+                                        tp->hunmbps=1;
+                        } else {
+                                tp->LinkOn = FALSE;
+                                printk(KERN_INFO "%s: Link Off\n", dev->name);
+                        }
+                }
+//              printk(KERN_INFO "%s: Link Off\n", dev->name);
+        }
+        next_tick = 2*HZ;
+
+        if (sis900_debug > 3) {
+                printk(KERN_INFO "%s:  Other registers are IntMask "
+                                "%4.4x IntStatus %4.4x"
+                                " RxStatus %4.4x.\n",
+                                dev->name,
+                                inw(ioaddr + imr),
+                                inw(ioaddr + isr),
+                                inl(ioaddr + rxcfg));
+        }
+
+        if (next_tick) {
+                tp->timer.expires = RUN_AT(next_tick);
+                add_timer(&tp->timer);
+        }
+}
+
+static void sis900_tx_timeout(struct device *dev)
+{
+        struct sis900_private *tp = (struct sis900_private *)dev->priv;
+        long ioaddr = dev->base_addr;
+        int i;
+
+        if (sis900_debug > 0)
+                printk(KERN_INFO "%s: Transmit timeout, status %2.2x %4.4x \n",
+                           dev->name, inl(ioaddr + cr), inl(ioaddr + isr));
+
+        /* Disable interrupts by clearing the interrupt mask. */
+        outl(0x0000, ioaddr + imr);
+        /* Emit info to figure out what went wrong. */
+        printk(KERN_INFO "%s: Tx queue start entry %d  dirty entry %d.\n",
+                   dev->name, tp->cur_tx, tp->dirty_tx);
+        for (i = 0; i < NUM_TX_DESC; i++)
+                printk(KERN_INFO "%s:  Tx descriptor %d is %8.8x.%s\n",
+                           dev->name, i, (unsigned int)&tp->tx_buf[i],
+                           i == tp->dirty_tx % NUM_TX_DESC ?
+                           " (queue head)" : "");
+        /*
+        printk(KERN_DEBUG"%s: MII #%d registers are:", dev->name, tp->phys[0]);
+        for (mii_reg = 0; mii_reg < 8; mii_reg++)
+                printk(" %4.4x", mdio_read(dev, tp->phys[0], mii_reg));
+        printk(".\n");
+        */
+
+        /* Soft reset the chip. */
+
+        tp->cur_rx = 0; //??????
+        /* Must enable Tx/Rx before setting transfer thresholds! */
+        /*
+        set_rx_mode(dev);
+        */
+        {       /* Save the unsent Tx packets. */
+                struct sk_buff *saved_skb[NUM_TX_DESC], *skb;
+                int j;
+                for (j = 0; tp->cur_tx - tp->dirty_tx > 0 ; j++, tp->dirty_tx++)
+                        saved_skb[j]=tp->tx_skbuff[tp->dirty_tx % NUM_TX_DESC];
+                tp->dirty_tx = tp->cur_tx = 0;
+
+                for (i = 0; i < j; i++) {
+                        skb = tp->tx_skbuff[i] = saved_skb[i];
+                        /* Always alignment */
+                        memcpy((unsigned char*)(tp->tx_buf[i].buf),
+                                                skb->data, skb->len);
+                        tp->tx_buf[i].cmdsts = OWN | skb->len;
+                        /* Note: the chip doesn't have auto-pad! */
+                        /*
+                        outl(tp->tx_flag|(skb->len>=ETH_ZLEN?skb->len:ETH_ZLEN),
+                                 ioaddr + TxStatus0 + i*4);
+                        */
+                }
+                outl(TxENA, ioaddr + cr);
+                tp->cur_tx = i;
+                while (i < NUM_TX_DESC)
+                        tp->tx_skbuff[i++] = 0;
+                if (tp->cur_tx - tp->dirty_tx < NUM_TX_DESC) {/* Typical path */
+                        dev->tbusy = 0;
+                        tp->tx_full = 0;
+                } else {
+                        tp->tx_full = 1;
+                }
+        }
+
+        dev->trans_start = jiffies;
+        tp->stats.tx_errors++;
+        /* Enable all known interrupts by setting the interrupt mask. */
+        outl((RxOK|RxERR|RxORN|RxSOVR|TxOK|TxERR|TxURN), ioaddr + imr);
+        return;
+}
+
+
+/* Initialize the Rx and Tx rings, along with various 'dev' bits. */
+static void
+sis900_init_ring(struct device *dev)
+{
+        struct sis900_private *tp = (struct sis900_private *)dev->priv;
+        int i;
+
+        tp->tx_full = 0;
+        tp->cur_rx = 0;
+        tp->dirty_tx = tp->cur_tx = 0;
+
+        /* Tx Buffer */
+        for (i = 0; i < NUM_TX_DESC; i++) {
+                tp->tx_skbuff[i] = 0;
+                tp->tx_buf[i].buf = &tp->tx_bufs[i*TX_BUF_SIZE];
+                tp->tx_buf[i].bufPhys =
+                                virt_to_bus(&tp->tx_bufs[i*TX_BUF_SIZE]);
+                /*
+                printk(KERN_INFO "tp->tx_buf[%d].bufPhys=%8.8x\n",
+                                i, tp->tx_buf[i].bufPhys);
+                */
+        }
+
+        /* Tx Descriptor */
+        for (i = 0; i< NUM_TX_DESC; i++) {
+                tp->tx_buf[i].llink = (u32)
+                        &(tp->tx_buf[((i+1) < NUM_TX_DESC) ? (i+1) : 0]);
+                tp->tx_buf[i].plink = (u32)
+                        virt_to_bus(&(tp->tx_buf[((i+1) < NUM_TX_DESC) ?
+                                (i+1) : 0].plink));
+                tp->tx_buf[i].physAddr=
+                                virt_to_bus(&(tp->tx_buf[i].plink));
+                tp->tx_buf[i].cmdsts=0;
+
+                /*
+                printk(KERN_INFO "tp->tx_buf[%d].PhysAddr=%8.8x\n",
+                                i, tp->tx_buf[i].physAddr);
+                */
+        }
+
+        /* Rx Buffer */
+        for (i = 0; i < NUM_RX_DESC; i++) {
+                tp->rx_buf[i].buf = &tp->rx_bufs[i*RX_BUF_SIZE];
+                tp->rx_buf[i].bufPhys =
+                                virt_to_bus(&tp->rx_bufs[i*RX_BUF_SIZE]);
+                /*
+                printk(KERN_INFO "tp->rx_buf[%d].bufPhys=%8.8x\n",
+                                i, tp->rx_buf[i].bufPhys);
+                */
+        }
+
+        /* Rx Descriptor */
+        for (i = 0; i< NUM_RX_DESC; i++) {
+                tp->rx_buf[i].llink = (u32)
+                        &(tp->rx_buf[((i+1) < NUM_RX_DESC) ? (i+1) : 0]);
+                tp->rx_buf[i].plink = (u32)
+                        virt_to_bus(&(tp->rx_buf[((i+1) < NUM_RX_DESC) ?
+                                (i+1) : 0].plink));
+                tp->rx_buf[i].physAddr=
+                                virt_to_bus(&(tp->rx_buf[i].plink));
+                tp->rx_buf[i].cmdsts=RX_BUF_SIZE;
+                /*
+                printk(KERN_INFO "tp->tx_buf[%d].PhysAddr=%8.8x\n",
+                                i, tp->tx_buf[i].physAddr);
+                */
+        }
+}
+
+static int
+sis900_start_xmit(struct sk_buff *skb, struct device *dev)
+{
+        struct sis900_private *tp = (struct sis900_private *)dev->priv;
+        long ioaddr = dev->base_addr;
+        int entry;
+
+        /* Block a timer-based transmit from overlapping.  This could better be
+           done with atomic_swap(1, dev->tbusy), but set_bit() works as well. */
+        if (test_and_set_bit(0, (void*)&dev->tbusy) != 0) {
+                if (jiffies - dev->trans_start < TX_TIMEOUT)
+                        return 1;
+                sis900_tx_timeout(dev);
+                return 1;
+        }
+
+        /* Calculate the next Tx descriptor entry. ????? */
+        entry = tp->cur_tx % NUM_TX_DESC;
+
+        tp->tx_skbuff[entry] = skb;
+
+        if (sis900_debug > 5) {
+                int i;
+                printk(KERN_INFO "%s: SKB Tx Frame contents:(len=%d)",
+                                                dev->name,skb->len);
+
+                for (i = 0; i < skb->len; i++) {
+                        printk("%2.2x ",
+                        (u8)skb->data[i]);
+                }
+                printk(".\n");
+        }
+
+        memcpy(tp->tx_buf[entry].buf,
+                                skb->data, skb->len);
+
+        tp->tx_buf[entry].cmdsts=(OWN | skb->len);
+
+        outl(TxENA, ioaddr + cr);
+        if (++tp->cur_tx - tp->dirty_tx < NUM_TX_DESC) {/* Typical path */
+                clear_bit(0, (void*)&dev->tbusy);
+        } else {
+                tp->tx_full = 1;
+        }
+
+        /* Note: the chip doesn't have auto-pad! */
+
+        dev->trans_start = jiffies;
+        if (sis900_debug > 4)
+                printk(KERN_INFO "%s: Queued Tx packet at "
+                                "%p size %d to slot %d.\n",
+                           dev->name, skb->data, (int)skb->len, entry);
+
+        return 0;
+}
+
+/* The interrupt handler does all of the Rx thread work and cleans up
+   after the Tx thread. */
+static void sis900_interrupt(int irq, void *dev_instance, struct pt_regs *regs)
+{
+        struct device *dev = (struct device *)dev_instance;
+        struct sis900_private *tp = (struct sis900_private *)dev->priv;
+        int boguscnt = max_interrupt_work;
+        int status;
+        long ioaddr = dev->base_addr;
+
+#if defined(__i386__)
+        /* A lock to prevent simultaneous entry bug on Intel SMP machines. */
+        if (test_and_set_bit(0, (void*)&dev->interrupt)) {
+                printk(KERN_INFO "%s: SMP simultaneous entry of "
+                                "an interrupt handler.\n", dev->name);
+                dev->interrupt = 0;     /* Avoid halting machine. */
+                return;
+        }
+#else
+        if (dev->interrupt) {
+                printk(KERN_INFO "%s: Re-entering the "
+                                "interrupt handler.\n", dev->name);
+                return;
+        }
+        dev->interrupt = 1;
+#endif
+
+        do {
+                status = inl(ioaddr + isr);
+                /* Acknowledge all of the current interrupt sources ASAP. */
+                outl(status, ioaddr + isr); // ?????
+
+                if (sis900_debug > 4)
+                        printk(KERN_INFO "%s: interrupt  status=%#4.4x "
+                                "new intstat=%#4.4x.\n",
+                                dev->name, status, inl(ioaddr + isr));
+
+                if ((status & (TxURN|TxERR|TxOK | RxORN|RxERR|RxOK)) == 0) {
+                        break;
+                }
+
+                if (status & (RxOK|RxORN|RxERR)) /* Rx interrupt */
+                        sis900_rx(dev);
+
+                if (status & (TxOK | TxERR)) {
+                        unsigned int dirty_tx;
+
+                        if (sis900_debug > 5) {
+                                printk(KERN_INFO "TxOK:tp->cur_tx:%d,"
+                                                "tp->dirty_tx:%x\n",
+                                        tp->cur_tx, tp->dirty_tx);
+                        }
+                        for (dirty_tx = tp->dirty_tx; dirty_tx < tp->cur_tx;
+                                dirty_tx++)
+                        {
+                                int i;
+                                int entry = dirty_tx % NUM_TX_DESC;
+                                int txstatus = tp->tx_buf[entry].cmdsts;
+
+                                if (sis900_debug > 4) {
+                                        printk(KERN_INFO "%s:     Tx Frame contents:"
+                                                "(len=%d)",
+                                                dev->name, (txstatus & DSIZE));
+
+                                        for (i = 0; i < (txstatus & DSIZE) ;
+                                                                        i++) {
+                                                printk("%2.2x ",
+                                                (u8)(tp->tx_buf[entry].buf[i]));
+                                        }
+                                        printk(".\n");
+                                }
+                                if ( ! (txstatus & (OK | UNDERRUN)))
+                                {
+                                        if (sis900_debug > 1)
+                                                printk(KERN_INFO "Tx NOT (OK,"
+                                                        "UnderRun)\n");
+                                        break;  /* It still hasn't been Txed */
+                                }
+
+                                /* Note: TxCarrierLost is always asserted
+                                                at 100mbps.                 */
+                                if (txstatus & (OWCOLL | ABORT)) {
+                                        /* There was an major error, log it. */
+                                        if (sis900_debug > 1)
+                                                printk(KERN_INFO "Tx Out of "
+                                                        " Window,Abort\n");
+#ifndef final_version
+                                        if (sis900_debug > 1)
+                                                printk(KERN_INFO "%s: Transmit "
+                                                    "error, Tx status %8.8x.\n",
+                                                           dev->name, txstatus);
+#endif
+                                        tp->stats.tx_errors++;
+                                        if (txstatus & ABORT) {
+                                                tp->stats.tx_aborted_errors++;
+                                                /*
+                                                outl((TX_DMA_BURST<<8)|
+                                                        0x03000001,
+                                                        ioaddr + TxConfig);
+                                                */
+                                        }
+                                        if (txstatus & NOCARRIER)
+                                                tp->stats.tx_carrier_errors++;
+                                        if (txstatus & OWCOLL)
+                                                tp->stats.tx_window_errors++;
+#ifdef ETHER_STATS
+                                        if ((txstatus & COLCNT)==COLCNT)
+                                                tp->stats.collisions16++;
+#endif
+                                } else {
+#ifdef ETHER_STATS
+                                        /* No count for tp->stats.tx_deferred */
+#endif
+                                        if (txstatus & UNDERRUN) {
+                                           if (sis900_debug > 1)
+                                             printk(KERN_INFO "Tx UnderRun\n");
+                                        /* Add 64 to the Tx FIFO threshold. */
+                                        /*
+                                                if (tp->tx_flag <  0x00300000)
+                                                        tp->tx_flag+=0x00020000;
+                                                tp->stats.tx_fifo_errors++;
+                                        */
+                                        }
+                                        tp->stats.collisions +=
+                                                        (txstatus >> 16) & 0xF;
+#if LINUX_VERSION_CODE > 0x20119
+                                        tp->stats.tx_bytes += txstatus & DSIZE;
+#endif
+                                        if (sis900_debug > 1)
+                                           printk(KERN_INFO "Tx Transmit OK\n");
+                                        tp->stats.tx_packets++;
+                                }
+
+                                /* Free the original skb. */
+                                if (sis900_debug > 1)
+                                        printk(KERN_INFO "Free original skb\n");
+                                dev_free_skb(tp->tx_skbuff[entry]);
+                                tp->tx_skbuff[entry] = 0;
+                        } // for dirty
+
+#ifndef final_version
+                        if (tp->cur_tx - dirty_tx > NUM_TX_DESC) {
+                                printk(KERN_INFO"%s: Out-of-sync dirty pointer,"
+                                                " %d vs. %d, full=%d.\n",
+                                                dev->name, dirty_tx,
+                                                tp->cur_tx, tp->tx_full);
+                                dirty_tx += NUM_TX_DESC;
+                        }
+#endif
+
+                        if (tp->tx_full && dirty_tx > tp->cur_tx-NUM_TX_DESC) {
+                                /* The ring is no longer full, clear tbusy. */
+                                //printk(KERN_INFO "Tx Ring NO LONGER Full\n");
+                                tp->tx_full = 0;
+                                dev->tbusy = 0;
+                                mark_bh(NET_BH);
+                        }
+
+                        tp->dirty_tx = dirty_tx;
+                        if (sis900_debug > 1)
+                                printk(KERN_INFO "TxOK release, tp->cur_tx:%d, tp->dirty:%d\n",
+                                                tp->cur_tx, tp->dirty_tx);
+                } // if (TxOK | TxERR)
+
+                /* Check uncommon events with one test. */
+                if (status & (RxORN | TxERR | RxERR)) {
+                        if (sis900_debug > 2)
+                                printk(KERN_INFO "%s: Abnormal interrupt,"
+                                        "status %8.8x.\n", dev->name, status);
+
+                        if (status == 0xffffffff)
+                                break;
+
+                        if (status & (RxORN | RxERR))
+                                tp->stats.rx_errors++;
+
+                        if (status & RxORN) {
+                                tp->stats.rx_over_errors++;
+                                /*
+                                tp->cur_rx =
+                                        inw(ioaddr + RxBufAddr) % RX_BUF_LEN;
+                                outw(tp->cur_rx - 16, ioaddr + RxBufPtr);
+                                */
+                        }
+                }
+                if (--boguscnt < 0) {
+                        printk(KERN_INFO "%s: Too much work at interrupt, "
+                                   "IntrStatus=0x%4.4x.\n",
+                                   dev->name, status);
+                        /* Clear all interrupt sources. */
+                        //outw(0xffff, ioaddr + IntrStatus);
+                        break;
+                }
+        } while (1);
+
+        if (sis900_debug > 3)
+                printk(KERN_INFO "%s: exiting interrupt, intr_status=%#4.4x.\n",
+                           dev->name, inl(ioaddr + isr));
+
+#if defined(__i386__)
+        clear_bit(0, (void*)&dev->interrupt);
+#else
+        dev->interrupt = 0;
+#endif
+        return;
+}
+
+/* The data sheet doesn't describe the Rx ring at all, so I'm guessing at the
+   field alignments and semantics. */
+static int sis900_rx(struct device *dev)
+{
+        struct sis900_private *tp = (struct sis900_private *)dev->priv;
+        long ioaddr = dev->base_addr;
+        u16 cur_rx = tp->cur_rx % NUM_RX_DESC;
+        int rx_status=tp->rx_buf[cur_rx].cmdsts;
+
+        if (sis900_debug > 4)
+                printk(KERN_INFO "%s: sis900_rx, current %4.4x,"
+                                " rx status=%8.8x\n",
+                                dev->name, cur_rx,
+                                rx_status);
+
+        while (rx_status & OWN) {
+                int rx_size = rx_status & DSIZE;
+                rx_size -= CRC_SIZE;
+
+                //printk(KERN_INFO "Rx OWN\n");
+                if (sis900_debug > 4) {
+                        int i;
+                        printk(KERN_INFO "%s:  sis900_rx, rx status %8.8x,"
+                                        " size %4.4x, cur %4.4x.\n",
+                                   dev->name, rx_status, rx_size, cur_rx);
+                        printk(KERN_INFO "%s: Rx Frame contents:", dev->name);
+
+                        for (i = 0; i < rx_size; i++) {
+                                printk("%2.2x ",
+                                (u8)(tp->rx_buf[cur_rx].buf[i]));
+                        }
+
+                        printk(".\n");
+                }
+                if (rx_status & TOOLONG) {
+                        if (sis900_debug > 1)
+                                printk(KERN_INFO "%s: Oversized Ethernet frame,"
+                                                " status %4.4x!\n",
+                                           dev->name, rx_status);
+                        tp->stats.rx_length_errors++;
+                } else if (rx_status & (RXISERR | RUNT | CRCERR | FAERR)) {
+                        if (sis900_debug > 1)
+                                printk(KERN_INFO"%s: Ethernet frame had errors,"
+                                        " status %4.4x.\n",
+                                        dev->name, rx_status);
+                        tp->stats.rx_errors++;
+                        if (rx_status & (RXISERR | FAERR))
+                                tp->stats.rx_frame_errors++;
+                        if (rx_status & (RUNT | TOOLONG))
+                                tp->stats.rx_length_errors++;
+                        if (rx_status & CRCERR) tp->stats.rx_crc_errors++;
+                        /* Reset the receiver,
+                                based on RealTek recommendation. (Bug?) */
+                        /*
+                        tp->cur_rx = 0;
+                        outl(TxENA, ioaddr + cr);
+                        outl(CmdRxEnb | CmdTxEnb, ioaddr + ChipCmd);
+                        outl((RX_FIFO_THRESH << 13) | (RX_BUF_LEN_IDX << 11) |
+                                 (RX_DMA_BURST<<8), ioaddr + RxConfig);
+                        */
+                } else {
+                        /* Malloc up new buffer, compatible with net-2e. */
+                        /* Omit the four octet CRC from the length. */
+                        struct sk_buff *skb;
+
+                        //printk(KERN_INFO "Rx OK\n");
+                        skb = dev_alloc_skb(rx_size + 2);
+                        if (skb == NULL) {
+                                printk(KERN_INFO "%s: Memory squeeze,"
+                                                "deferring packet.\n",
+                                                dev->name);
+                                /* We should check that some rx space is free.
+                                   If not,
+                                   free one and mark stats->rx_dropped++. */
+                                tp->stats.rx_dropped++;
+                                tp->rx_buf[cur_rx].cmdsts = RX_BUF_SIZE;
+                                break;
+                        }
+                        skb->dev = dev;
+                        skb_reserve(skb, 2); /* 16 byte align the IP fields. */
+                        if (rx_size+CRC_SIZE > RX_BUF_SIZE) {
+                                /*
+                                int semi_count = RX_BUF_LEN - ring_offset - 4;
+                                memcpy(skb_put(skb, semi_count),
+                                        &rx_bufs[ring_offset + 4], semi_count);
+                                memcpy(skb_put(skb, rx_size-semi_count),
+                                        rx_bufs, rx_size - semi_count);
+                                if (sis900_debug > 4) {
+                                        int i;
+                                        printk(KERN_DEBUG"%s:  Frame wrap @%d",
+                                                   dev->name, semi_count);
+                                        for (i = 0; i < 16; i++)
+                                                printk(" %2.2x", rx_bufs[i]);
+                                        printk(".\n");
+                                        memset(rx_bufs, 0xcc, 16);
+                                }
+                                */
+                                //printk(KERN_INFO "Frame Wrap....\n");
+                        } else {
+#if 0  /* USE_IP_COPYSUM */
+                                eth_copy_and_sum(skb,
+                                   tp->rx_buf[cur_rx].buf, rx_size, 0);
+                                skb_put(skb, rx_size);
+#else
+                                memcpy(skb_put(skb, rx_size),
+                                        tp->rx_buf[cur_rx].buf, rx_size);
+#endif
+                        }
+                        skb->protocol = eth_type_trans(skb, dev);
+                        netif_rx(skb);
+#if LINUX_VERSION_CODE > 0x20119
+                        tp->stats.rx_bytes += rx_size;
+#endif
+                        tp->stats.rx_packets++;
+                }
+                tp->rx_buf[cur_rx].cmdsts = RX_BUF_SIZE;
+
+                cur_rx = ((cur_rx+1) % NUM_RX_DESC);
+                rx_status = tp->rx_buf[cur_rx].cmdsts;
+                //outw(cur_rx - 16, ioaddr + RxBufPtr);
+        } // while
+        if (sis900_debug > 4)
+                printk(KERN_INFO "%s: Done sis900_rx(), current %4.4x "
+                                "Cmd %2.2x.\n",
+                           dev->name, cur_rx,
+                           inb(ioaddr + cr));
+        tp->cur_rx = cur_rx;
+        return 0;
+}
+
+static int
+sis900_close(struct device *dev)
+{
+        long ioaddr = dev->base_addr;
+        struct sis900_private *tp = (struct sis900_private *)dev->priv;
+        int i;
+
+        dev->start = 0;
+        dev->tbusy = 1;
+
+        if (sis900_debug > 1)
+                printk(KERN_DEBUG"%s: Shutting down ethercard, status was 0x%4.4x.\n",
+                           dev->name, inl(ioaddr + isr));
+
+        /* Disable interrupts by clearing the interrupt mask. */
+        outl(0x0000, ioaddr + imr);
+
+        /* Stop the chip's Tx and Rx DMA processes. */
+        outl(0x00, ioaddr + cr);
+
+        del_timer(&tp->timer);
+
+        free_irq(dev->irq, dev);
+
+        for (i = 0; i < NUM_TX_DESC; i++) {
+                if (tp->tx_skbuff[i])
+                        dev_free_skb(tp->tx_skbuff[i]);
+                tp->tx_skbuff[i] = 0;
+        }
+        kfree(tp->rx_bufs);
+        kfree(tp->tx_bufs);
+
+        /* Green! Put the chip in low-power mode. */
+
+        MOD_DEC_USE_COUNT;
+
+        return 0;
+}
+
+static int mii_ioctl(struct device *dev, struct ifreq *rq, int cmd)
+{
+        struct sis900_private *tp = (struct sis900_private *)dev->priv;
+        u16 *data = (u16 *)&rq->ifr_data;
+
+        switch(cmd) {
+        case SIOCDEVPRIVATE:            /* Get the address of the PHY in use. */
+                data[0] = tp->phys[0] & 0x3f;
+                /* Fall Through */
+        case SIOCDEVPRIVATE+1:          /* Read the specified MII register. */
+                data[3] = mdio_read(dev, data[0] & 0x1f, data[1] & 0x1f);
+                return 0;
+        case SIOCDEVPRIVATE+2:          /* Write the specified MII register */
+                if (!suser())
+                        return -EPERM;
+                mdio_write(dev, data[0] & 0x1f, data[1] & 0x1f, data[2]);
+                return 0;
+        default:
+                return -EOPNOTSUPP;
+        }
+}
+
+static struct enet_statistics *
+sis900_get_stats(struct device *dev)
+{
+        struct sis900_private *tp = (struct sis900_private *)dev->priv;
+        return &tp->stats;
+}
+
+/* Set or clear the multicast filter for this adaptor.
+   This routine is not state sensitive and need not be SMP locked. */
+
+static u16 elComputeHashTableIndex(u8 *addr)
+{
+#define POLYNOMIAL 0x04C11DB6L
+    u32      crc = 0xffffffff, msb;
+    int      i, j;
+    u8       byte;
+
+    for( i=0; i<6; i++ ) {
+        byte = *addr++;
+        for( j=0; j<8; j++ ) {
+            msb = crc >> 31;
+            crc <<= 1;
+            if( msb ^ ( byte & 1 )) {
+                crc ^= POLYNOMIAL;
+                crc |= 1;
+            }
+            byte >>= 1;
+        }
+    }
+    // 7 bit crc for 128 bit hash table
+    return( (int)(crc >> 25) );
+}
+
+static u16 elMIIpollBit(struct device *dev,
+                         int phy_id,
+                         int location,
+                         u16 mask,
+                         u16 polarity,
+                         u16 *value)
+{
+        u32 i;
+        i=0;
+        while (1) {
+                *value = mdio_read(dev, phy_id, location);
+                if (polarity) {
+                        if (mask & *value) return(TRUE);
+                } else {
+                        if (mask & ~(*value)) return(TRUE);
+                }
+                if (++i == 1200) break;
+        }
+        return(FALSE);
+}
+
+static u16 elPMDreadMode(struct device *dev,
+                         int phy_id,
+                         int *speed,
+                         int *duplex)
+{
+        u16 status;
+
+        *speed = HW_SPEED_10_MBPS;
+        *duplex = FDX_CAPABLE_HALF_SELECTED;
+
+        status = mdio_read(dev, phy_id, MII_ANLPAR);
+
+        if ( !( status &
+                (MII_NWAY_T|MII_NWAY_T_FDX | MII_NWAY_TX | MII_NWAY_TX_FDX ))) {
+//              printk(KERN_INFO "%s: Link Partner not detected.\n", dev->name);
+                while (( status = mdio_read(dev, phy_id, 18)) & 0x4000) ;
+                while (( status = mdio_read(dev, phy_id, 18)) & 0x0020) ;
+                if (status & 0x80)
+                        *speed = HW_SPEED_100_MBPS;
+                if (status & 0x40)
+                        *duplex = FDX_CAPABLE_FULL_SELECTED;
+                if (sis900_debug > 3) {
+                        printk(KERN_INFO"%s: Setting %s%s-duplex.\n",
+                                dev->name,
+                                *speed == HW_SPEED_100_MBPS ?
+                                        "100mbps " : "10mbps ",
+                                *duplex == FDX_CAPABLE_FULL_SELECTED ?
+                                        "full" : "half");
+                }
+        } else {
+//              printk(KERN_INFO "%s: Link Partner detected\n", dev->name);
+                if (status & (MII_NWAY_TX_FDX | MII_NWAY_T_FDX)) {
+                        *duplex = FDX_CAPABLE_FULL_SELECTED;
+                }
+                if (status & (MII_NWAY_TX_FDX | MII_NWAY_TX)) {
+                        *speed = HW_SPEED_100_MBPS;
+                }
+                if (sis900_debug > 3) {
+                        printk(KERN_INFO"%s: Setting %s%s-duplex based on"
+                                " auto-negotiated partner ability.\n",
+                                dev->name,
+                                *speed == HW_SPEED_100_MBPS ?
+                                        "100mbps " : "10mbps ",
+                                *duplex == FDX_CAPABLE_FULL_SELECTED ?
+                                        "full" : "half");
+                }
+        }
+        return (status);
+}
+
+static u16 elAutoNegotiate(struct device *dev, int phy_id, int *duplex, int *speed)
+{
+        u16 status;
+
+        mdio_write(dev, phy_id, MII_CONTROL, 0);
+        mdio_write(dev, phy_id, MII_CONTROL, MIICNTL_AUTO |
+                                                        MIICNTL_RST_AUTO);
+        elMIIpollBit(dev, phy_id, MII_CONTROL, MIICNTL_RST_AUTO, FALSE,&status);
+        elMIIpollBit(dev, phy_id, MII_STATUS, MIISTAT_AUTO_DONE, TRUE, &status);
+        elMIIpollBit(dev, phy_id, MII_STATUS, MIISTAT_LINK, TRUE, &status);
+        if (status & MIISTAT_LINK) {
+                elPMDreadMode(dev, phy_id, speed, duplex);
+                elSetMediaType(dev, *speed, *duplex);
+        }
+        return(status);
+}
+
+static void elSetMediaType(struct device *dev, int speed, int duplex)
+{
+        long ioaddr = dev->base_addr;
+        u32     txCfgOn = 0, txCfgOff = TxDRNT;
+        u32     rxCfgOn = 0, rxCfgOff = 0;
+
+        if (speed == HW_SPEED_100_MBPS) {
+                txCfgOn |= (TxDRNT_100 | TxHBI);
+        } else {
+                txCfgOn |= TxDRNT_10;
+        }
+
+        if (duplex == FDX_CAPABLE_FULL_SELECTED) {
+                txCfgOn |= (TxCSI | TxHBI);
+                rxCfgOn |= RxATP;
+        } else {
+                txCfgOff |= (TxCSI | TxHBI);
+                rxCfgOff |= RxATP;
+        }
+        outl( (inl(ioaddr + txcfg) & ~txCfgOff) | txCfgOn, ioaddr + txcfg);
+        outl( (inl(ioaddr + rxcfg) & ~rxCfgOff) | rxCfgOn, ioaddr + rxcfg);
+}
+
+static void set_rx_mode(struct device *dev)
+{
+        long ioaddr = dev->base_addr;
+        u16 mc_filter[8];
+        int i;
+        int rx_mode;
+        u32 rxCfgOn = 0, rxCfgOff = 0;
+        u32 txCfgOn = 0, txCfgOff = 0;
+
+        if (sis900_debug > 3)
+                printk(KERN_INFO "%s: set_rx_mode (%4.4x) done--"
+                                "RxCfg %8.8x.\n",
+                                dev->name, dev->flags, inl(ioaddr + rxcfg));
+
+        /* Note: do not reorder, GCC is clever about common statements. */
+        if (dev->flags & IFF_PROMISC) {
+                printk(KERN_NOTICE"%s: Promiscuous mode enabled.\n", dev->name);
+                rx_mode = ACCEPT_ALL_BCASTS | ACCEPT_ALL_MCASTS |
+                                ACCEPT_CAM_QUALIFIED | ACCEPT_ALL_PHYS;
+                for (i=0 ; i<8 ; i++)
+                        mc_filter[i]=0xffff;
+        } else if ((dev->mc_count > multicast_filter_limit)
+                           ||  (dev->flags & IFF_ALLMULTI)) {
+                rx_mode = ACCEPT_ALL_BCASTS | ACCEPT_ALL_MCASTS |
+                                ACCEPT_CAM_QUALIFIED;
+                for (i=0 ; i<8 ; i++)
+                        mc_filter[i]=0xffff;
+        } else {
+                struct dev_mc_list *mclist;
+                rx_mode = ACCEPT_ALL_BCASTS | ACCEPT_ALL_MCASTS |
+                                ACCEPT_CAM_QUALIFIED;
+                for (i=0 ; i<8 ; i++)
+                        mc_filter[i]=0;
+                for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count;
+                         i++, mclist = mclist->next)
+                        set_bit(elComputeHashTableIndex(mclist->dmi_addr),
+                                                mc_filter);
+        }
+
+        for (i=0 ; i<8 ; i++) {
+                outl((u32)(0x00000004+i) << 16, ioaddr + rfcr);
+                outl(mc_filter[i], ioaddr + rfdr);
+        }
+        /* We can safely update without stopping the chip. */
+        //rx_mode = ACCEPT_CAM_QUALIFIED | ACCEPT_ALL_BCASTS | ACCEPT_ALL_PHYS;
+        //rx_mode = ACCEPT_CAM_QUALIFIED | ACCEPT_ALL_BCASTS;
+        outl(RFEN | ((rx_mode & (ACCEPT_ALL_MCASTS | ACCEPT_ALL_BCASTS |
+                          ACCEPT_ALL_PHYS)) << RFAA_shift), ioaddr + rfcr);
+
+        if (rx_mode & ACCEPT_ALL_ERRORS) {
+                rxCfgOn = RxAEP | RxARP | RxAJAB;
+        } else {
+                rxCfgOff = RxAEP | RxARP | RxAJAB;
+        }
+        if (rx_mode & MAC_LOOPBACK) {
+                rxCfgOn |= RxATP;
+                txCfgOn |= TxMLB;
+        } else {
+                if (!(( (struct sis900_private *)(dev->priv) )->full_duplex))
+                        rxCfgOff |= RxATP;
+                txCfgOff |= TxMLB;
+        }
+
+        if (sis900_debug > 2) {
+                printk(KERN_INFO "Before Set TxCfg=%8.8x\n",inl(ioaddr+txcfg));
+                printk(KERN_INFO "Before Set RxCfg=%8.8x\n",inl(ioaddr+rxcfg));
+        }
+
+        outl((inl(ioaddr + rxcfg) | rxCfgOn) & ~rxCfgOff, ioaddr + rxcfg);
+        outl((inl(ioaddr + txcfg) | txCfgOn) & ~txCfgOff, ioaddr + txcfg);
+
+        if (sis900_debug > 2) {
+                printk(KERN_INFO "After Set TxCfg=%8.8x\n",inl(ioaddr+txcfg));
+                printk(KERN_INFO "After Set RxCfg=%8.8x\n",inl(ioaddr+rxcfg));
+                printk(KERN_INFO "Receive Filter Register:%8.8x\n",
+                                                        inl(ioaddr + rfcr));
+        }
+        return;
+}
+
+static void sis900_reset(struct device *dev)
+{
+        long ioaddr = dev->base_addr;
+
+        outl(0, ioaddr + ier);
+        outl(0, ioaddr + imr);
+        outl(0, ioaddr + rfcr);
+
+        outl(RxRESET | TxRESET | RESET, ioaddr + cr);
+        outl(PESEL, ioaddr + cfg);
+
+        set_rx_mode(dev);
+}
+
+#ifdef MODULE
+int init_module(void)
+{
+        return sis900_probe(0);
+}
+
+void
+cleanup_module(void)
+{
+        struct device *next_dev;
+
+        /* No need to check MOD_IN_USE, as sys_delete_module() checks. */
+        while (root_sis900_dev) {
+                struct sis900_private *tp =
+                        (struct sis900_private *)root_sis900_dev->priv;
+                next_dev = tp->next_module;
+                unregister_netdev(root_sis900_dev);
+                release_region(root_sis900_dev->base_addr,
+                                           pci_tbl[tp->chip_id].io_size);
+                kfree(tp);
+                kfree(root_sis900_dev);
+                root_sis900_dev = next_dev;
+        }
+}
+
+#endif  /* MODULE */
+/*
+ * Local variables:
+ *  compile-command: "gcc -DMODULE -D__KERNEL__ -Wall -Wstrict-prototypes -O6 -c sis900.c `[ -f /usr/include/linux/modversions.h ] && echo -DMODVERSIONS`"
+ *  SMP-compile-command: "gcc -D__SMP__ -DMODULE -D__KERNEL__ -Wall -Wstrict-prototypes -O6 -c sis900.c `[ -f /usr/include/linux/modversions.h ] && echo -DMODVERSIONS`"
+ *  c-indent-level: 4
+ *  c-basic-offset: 4
+ *  tab-width: 4
+ * End:
+ */
diff -urN linux-2.2.11-pre2/drivers/net/sk_mca.c linux/drivers/net/sk_mca.c
--- linux-2.2.11-pre2/drivers/net/sk_mca.c	Mon Jun  7 14:34:54 1999
+++ linux/drivers/net/sk_mca.c	Mon Dec  3 18:52:26 2001
@@ -62,10 +62,16 @@
 	implemented LANCE multicast filter
   Jun 6th, 1999
 	additions for Linux 2.2
+  Aug 2nd, 1999
+	small fixes (David Weinehall)
 
  *************************************************************************/
 
+#include <linux/module.h>
+#include <linux/version.h>
+
 #include <linux/kernel.h>
+#include <linux/version.h>
 #include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/errno.h>
@@ -79,11 +85,6 @@
 #include <asm/bitops.h>
 #include <asm/io.h>
 
-#ifdef MODULE
-#include <linux/module.h>
-#include <linux/version.h>
-#endif
-
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
 #include <linux/skbuff.h>
@@ -871,7 +872,7 @@
   return &(priv->stat);
 }
 
-/* we don't support runtime reconfiguration, since am MCA card can
+/* we don't support runtime reconfiguration, since an MCA card can
    be unambigously identified by its POS registers. */
 
 static int skmca_config(struct device *dev, struct ifmap *map)
@@ -962,9 +963,6 @@
 
     getaddrs(slot, junior, &base, &irq, &medium);
 
-#if 0
-    /* this should work, but it doesn't with 2.2.9 :-( 
-       somehow 'mca_is_adapter_used()' is missing in kernel syms... */
 #if LINUX_VERSION_CODE >= 0x020200
     /* slot already in use ? */
 
@@ -973,7 +971,6 @@
       slot = dofind(&junior, slot + 1);
       continue;
     }
-#endif
 #endif
 
     /* were we looking for something different ? */
diff -urN linux-2.2.11-pre2/drivers/net/sunhme.c linux/drivers/net/sunhme.c
--- linux-2.2.11-pre2/drivers/net/sunhme.c	Mon Dec  3 18:52:03 2001
+++ linux/drivers/net/sunhme.c	Mon Dec  3 18:52:26 2001
@@ -3406,7 +3406,16 @@
 	/* Set the latency timer and cache line size as well,
 	 * PROM leaves it at zero.
 	 */
-	pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 64);
+	{
+		unsigned char min_gnt, latency_timer;
+
+		pci_read_config_byte(pdev, PCI_MIN_GNT, &min_gnt);
+		if (min_gnt == 0)
+			latency_timer = 64;
+		else
+			latency_timer = ((min_gnt << 3) & 0xff);
+		pci_write_config_byte(pdev, PCI_LATENCY_TIMER, latency_timer);
+	}
 #ifdef __sparc_v9__
 	/* NOTE: Cache line size is in 32-bit word units. */
 	pci_write_config_byte(pdev, PCI_CACHE_LINE_SIZE, 0x10);
diff -urN linux-2.2.11-pre2/drivers/net/via-rhine.c linux/drivers/net/via-rhine.c
--- linux-2.2.11-pre2/drivers/net/via-rhine.c	Mon Dec  3 18:52:03 2001
+++ linux/drivers/net/via-rhine.c	Mon Dec  3 18:52:26 2001
@@ -86,6 +86,9 @@
 #if defined(__i386__)  &&  !defined(VIA_USE_MEMORY)
 #define VIA_USE_IO
 #endif
+#if defined(__alpha__)
+#define VIA_USE_IO
+#endif
 #ifdef VIA_USE_IO
 #undef readb
 #undef readw
diff -urN linux-2.2.11-pre2/drivers/net/wavelan.c linux/drivers/net/wavelan.c
--- linux-2.2.11-pre2/drivers/net/wavelan.c	Mon Dec  3 18:52:03 2001
+++ linux/drivers/net/wavelan.c	Mon Dec  3 18:52:26 2001
@@ -1616,11 +1616,8 @@
   if((frequency->e == 0) &&
      (frequency->m >= 0) && (frequency->m < BAND_NUM))
     {
-      /* frequency in units of 250 kHz (as read in the offset register) */
-      short	bands[] = { 0x30, 0x58, 0x64, 0x7A, 0x80, 0xA8, 0xD0, 0xF0, 0xF8, 0x150 };
-
       /* Get frequency offset. */
-      freq = bands[frequency->m] >> 1;
+      freq = channel_bands[frequency->m] >> 1;
     }
 
   /* Verify that the frequency is allowed. */
@@ -1791,6 +1788,7 @@
   u_short	table[10];	/* Authorized frequency table */
   long		freq = 0L;	/* offset to 2.4 GHz in .5 MHz + 12 MHz */
   int		i;		/* index in the table */
+  int		c = 0;		/* Channel number */
 
   /* Read the frequency table. */
   fee_read(ioaddr, 0x71 /* frequency table */, table, 10);
@@ -1801,6 +1799,12 @@
     /* Look in the table if the frequency is allowed */
     if(table[9 - (freq / 16)] & (1 << (freq % 16)))
       {
+	/* Compute approximate channel number */
+	while((((channel_bands[c] >> 1) - 24) < freq) &&
+	      (c < NELS(channel_bands)))
+	  c++;
+	list[i].i = c;	/* Set the list index */
+
 	/* put in the list */
 	list[i].m = (((freq + 24) * 5) + 24000L) * 10000;
 	list[i++].e = 1;
@@ -1969,14 +1973,12 @@
 	}
       else
 	{
-	  int	bands[] = { 915e6, 2.425e8, 2.46e8, 2.484e8, 2.4305e8 };
-
 	  psa_read(ioaddr, lp->hacr, (char *)&psa.psa_subband - (char *)&psa,
 		   (unsigned char *)&psa.psa_subband, 1);
 
 	  if(psa.psa_subband <= 4)
 	    {
-	      wrq->u.freq.m = bands[psa.psa_subband];
+	      wrq->u.freq.m = fixed_bands[psa.psa_subband];
 	      wrq->u.freq.e = (psa.psa_subband != 0);
 	    }
 	  else
@@ -1986,9 +1988,9 @@
 
     case SIOCSIWSENS:
       /* Set the level threshold. */
-      if(!suser())
-	return -EPERM;
-      psa.psa_thr_pre_set = wrq->u.sensitivity & 0x3F;
+      /* We should complain loudly if wrq->u.sens.fixed = 0, because we
+       * can't set auto mode... */
+      psa.psa_thr_pre_set = wrq->u.sens.value & 0x3F;
       psa_write(ioaddr, lp->hacr, (char *)&psa.psa_thr_pre_set - (char *)&psa,
 	       (unsigned char *) &psa.psa_thr_pre_set, 1);
       /* update the Wavelan checksum */
@@ -2000,7 +2002,8 @@
       /* Read the level threshold. */
       psa_read(ioaddr, lp->hacr, (char *)&psa.psa_thr_pre_set - (char *)&psa,
 	       (unsigned char *) &psa.psa_thr_pre_set, 1);
-      wrq->u.sensitivity = psa.psa_thr_pre_set & 0x3F;
+      wrq->u.sens.value = psa.psa_thr_pre_set & 0x3F;
+      wrq->u.sens.fixed = 1;
       break;
 
      case SIOCSIWENCODE:
@@ -2110,6 +2113,9 @@
 	  range.max_qual.qual = MMR_SGNL_QUAL;
 	  range.max_qual.level = MMR_SIGNAL_LVL;
 	  range.max_qual.noise = MMR_SILENCE_LVL;
+
+	  range.num_bitrates = 1;
+	  range.bitrate[0] = 2000000;	/* 2 Mb/s */
 
 	  /* Copy structure to the user buffer. */
 	  if (copy_to_user(wrq->u.data.pointer, &range, sizeof(struct iw_range)))
diff -urN linux-2.2.11-pre2/drivers/net/wavelan.h linux/drivers/net/wavelan.h
--- linux-2.2.11-pre2/drivers/net/wavelan.h	Wed Mar 10 16:51:35 1999
+++ linux/drivers/net/wavelan.h	Mon Dec  3 18:52:26 2001
@@ -19,6 +19,8 @@
 #ifndef _WAVELAN_H
 #define	_WAVELAN_H
 
+/************************** MAGIC NUMBERS ***************************/
+
 /* Detection of the WaveLAN card is done by reading the MAC
  * address from the card and checking it.  If you have a non-AT&T
  * product (OEM, like DEC RoamAbout, Digital Ocean, or Epson),
@@ -38,6 +40,25 @@
 #define WAVELAN_MTU		1500	/* Maximum size of WaveLAN packet */
 
 #define	MAXDATAZ		(WAVELAN_ADDR_SIZE + WAVELAN_ADDR_SIZE + 2 + WAVELAN_MTU)
+
+/*
+ * Constants used to convert channels to frequencies
+ */
+
+/* Frequency available in the 2.0 modem, in units of 250 kHz
+ * (as read in the offset register of the dac area).
+ * Used to map channel numbers used by `wfreqsel' to frequencies
+ */
+const short	channel_bands[] = { 0x30, 0x58, 0x64, 0x7A, 0x80, 0xA8,
+				    0xD0, 0xF0, 0xF8, 0x150 };
+
+/* Frequencies of the 1.0 modem (fixed frequencies).
+ * Use to map the PSA `subband' to a frequency
+ * Note : all frequencies apart from the first one need to be multiplied by 10
+ */
+const int	fixed_bands[] = { 915e6, 2.425e8, 2.46e8, 2.484e8, 2.4305e8 };
+
+
 
 /*************************** PC INTERFACE ****************************/
 
diff -urN linux-2.2.11-pre2/drivers/net/wavelan.p.h linux/drivers/net/wavelan.p.h
--- linux-2.2.11-pre2/drivers/net/wavelan.p.h	Thu Apr 29 11:53:41 1999
+++ linux/drivers/net/wavelan.p.h	Mon Dec  3 18:52:26 2001
@@ -32,7 +32,7 @@
  * Web page
  * --------
  *	I try to maintain a web page with the Wireless LAN Howto at :
- *		http://www-uk.hpl.hp.com/people/jt/Linux/Wavelan.html
+ *	    http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Wavelan.html
  *
  * Debugging and options
  * ---------------------
@@ -164,7 +164,7 @@
  *	Marc Meertens <Marc.Meertens@Utrecht.NCR.com>,
  *	Pauline Middelink <middelin@polyware.iaf.nl>,
  *	Robert Morris <rtm@das.harvard.edu>,
- *	Jean Tourrilhes <jt@hplb.hpl.hp.com>,
+ *	Jean Tourrilhes <jt@hpl.hp.com>,
  *	Girish Welling <welling@paul.rutgers.edu>,
  *	Clark Woodworth <clark@hiway1.exit109.com>
  *	Yongguang Zhang <ygz@isl.hrl.hac.com>
@@ -292,9 +292,17 @@
  *	- Rectify a lot of (useless) debugging code
  *	- Change the way to `#ifdef SET_PSA_CRC'
  *
+ * Changes made for release in 2.2.11 & 2.3.13 :
+ * -------------------------------------------
+ *	- Change e-mail and web page addresses
+ *	- Watchdog timer is now correctly expressed in HZ, not in jiffies
+ *	- Add channel number to the list of frequencies in range
+ *	- Add the (short) list of bit-rates in range
+ *	- Developp a new sensitivity... (sens.value & sens.fixed)
+ *
  * Wishes & dreams:
  * ----------------
- *	- roaming
+ *	- roaming (see Pcmcia driver)
  */
 
 /***************************** INCLUDES *****************************/
@@ -382,11 +390,11 @@
 /************************ CONSTANTS & MACROS ************************/
 
 #ifdef DEBUG_VERSION_SHOW
-static const char	*version	= "wavelan.c : v19 (wireless extensions) 20/4/99\n";
+static const char	*version	= "wavelan.c : v20 (wireless extensions) 29/7/99\n";
 #endif
 
 /* Watchdog temporisation */
-#define	WATCHDOG_JIFFIES	256	/* TODO:  express in HZ. */
+#define	WATCHDOG_JIFFIES	(256*HZ/100)
 
 /* Macro to get the number of elements in an array */
 #define	NELS(a)				(sizeof(a) / sizeof(a[0]))
diff -urN linux-2.2.11-pre2/drivers/sbus/audio/audio.c linux/drivers/sbus/audio/audio.c
--- linux-2.2.11-pre2/drivers/sbus/audio/audio.c	Thu Apr 22 19:24:51 1999
+++ linux/drivers/sbus/audio/audio.c	Mon Dec  3 18:52:26 2001
@@ -117,6 +117,13 @@
          * TODO: Make number of input/output buffers tunable parameters
          */
 
+#if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE > 0x202ff
+        init_waitqueue_head(&drv->open_wait);
+        init_waitqueue_head(&drv->output_write_wait);
+        init_waitqueue_head(&drv->output_drain_wait);
+        init_waitqueue_head(&drv->input_read_wait);
+#endif
+
         drv->num_output_buffers = 8;
 	drv->output_buffer_size = (4096 * 2);
 	drv->playing_count = 0;
@@ -264,6 +271,7 @@
    * If status & 2, a buffer was claimed for DMA and is still in use.
    *
    * The playing_count for non-DMA hardware should never be non-zero.
+   * Value of status for non-DMA hardware should always be 1.
    */
   if (status & 1) {
     if (drv->playing_count) 
@@ -300,8 +308,9 @@
 
   /* If we got back a buffer, see if anyone wants to write to it */
   if ((status & 1) || ((drv->output_count + drv->playing_count) 
-		  < drv->num_output_buffers)) 
+                       < drv->num_output_buffers)) {
     wake_up_interruptible(&drv->output_write_wait);
+  }
 
   /* If the output queue is empty, shut down the driver. */
   if ((drv->output_count < 1) && (drv->playing_count < 1)) {
@@ -664,7 +673,7 @@
   case SOUND_MIXER_WRITE_CD:
   case SOUND_MIXER_WRITE_LINE:
   case SOUND_MIXER_WRITE_IMIX:
-    if(get_user(k, arg))
+    if(COPY_IN(arg, k))
       return -EFAULT;
     tprintk(("setting input volume (0x%x)", k));
     if (drv->ops->get_input_channels)
@@ -695,7 +704,7 @@
   case SOUND_MIXER_WRITE_PCM:
   case SOUND_MIXER_WRITE_VOLUME:
   case SOUND_MIXER_WRITE_SPEAKER:
-    if(get_user(k, arg))
+    if(COPY_IN(arg, k))
 	return -EFAULT;
     tprintk(("setting output volume (0x%x)", k));
     if (drv->ops->get_output_channels)
@@ -736,7 +745,7 @@
   case SOUND_MIXER_WRITE_RECSRC: 
     if (!drv->ops->set_input_port)
       return -EINVAL;
-    if(get_user(k, arg))
+    if(COPY_IN(arg, k))
       return -EFAULT;
     /* only one should ever be selected */
     if (k & SOUND_MASK_IMIX) j = AUDIO_ANALOG_LOOPBACK;
diff -urN linux-2.2.11-pre2/drivers/sbus/audio/cs4231.c linux/drivers/sbus/audio/cs4231.c
--- linux-2.2.11-pre2/drivers/sbus/audio/cs4231.c	Wed Apr 28 08:47:39 1999
+++ linux/drivers/sbus/audio/cs4231.c	Mon Dec  3 18:52:26 2001
@@ -1,7 +1,9 @@
 /*
  * drivers/sbus/audio/cs4231.c
  *
- * Copyright 1996, 1997, 1998 Derrick J Brashear (shadow@andrew.cmu.edu)
+ * Copyright 1996, 1997, 1998, 1999 Derrick J Brashear (shadow@andrew.cmu.edu)
+ * The 4231/ebus support was written by David Miller, who didn't bother
+ * crediting himself here, so I will.
  *
  * Based on the AMD7930 driver:
  * Copyright 1996 Thomas K. Dyas (tdyas@noc.rutgers.edu)
@@ -11,7 +13,7 @@
  * 
  * This was culled from the Crystal docs on the 4231a, and the addendum they
  * faxed me on the 4231.
- * The APC DMA controller support unfortunately is not documented. Thanks, Sun
+ * The APC DMA controller support unfortunately is not documented. Thanks, Sun.
  */
 
 #include <linux/config.h>
@@ -69,15 +71,17 @@
 static int cs4231_play_gain(struct sparcaudio_driver *drv, int value, 
                             unsigned char balance);
 static void cs4231_ready(struct sparcaudio_driver *drv);
-static void cs4231_playintr(struct sparcaudio_driver *drv);
+static void cs4231_playintr(struct sparcaudio_driver *drv, int);
 static int cs4231_recintr(struct sparcaudio_driver *drv);
 static int cs4231_output_muted(struct sparcaudio_driver *drv, int value);
 static void cs4231_pollinput(struct sparcaudio_driver *drv);
-static void eb4231_pollinput(struct sparcaudio_driver *drv);
 static int cs4231_length_to_samplecount(struct audio_prinfo *thisdir, 
                                         unsigned int length);
 static void cs4231_getsamplecount(struct sparcaudio_driver *drv, 
                                   unsigned int length, unsigned int value);
+#ifdef EB4231_SUPPORT
+static void eb4231_pollinput(struct sparcaudio_driver *drv);
+#endif
 
 #define CHIP_READY udelay(100); cs4231_ready(drv); udelay(1000);
 
@@ -1228,11 +1232,20 @@
   MOD_DEC_USE_COUNT;
 }
 
-static void cs4231_playintr(struct sparcaudio_driver *drv)
+static void cs4231_playintr(struct sparcaudio_driver *drv, int push)
 {
   struct cs4231_chip *cs4231_chip = (struct cs4231_chip *)drv->private;
   int status = 0;
 
+  if (!push) {
+    if (!cs4231_chip->perchip_info.play.active) {
+      cs4231_chip->regs->dmapnva = cs4231_chip->output_next_dma_handle;
+      cs4231_chip->regs->dmapnc = cs4231_chip->output_next_dma_size;
+    }
+    sparcaudio_output_done(drv, 0);
+    return;
+  }
+
   if (cs4231_chip->playlen == 0 && cs4231_chip->output_size > 0) 
     cs4231_chip->playlen = cs4231_chip->output_size;
 
@@ -1421,7 +1434,7 @@
     status += 2;
   }
 
-  sparcaudio_input_done(drv, 1);
+  sparcaudio_input_done(drv, status);
 
   return 1;
 }
@@ -1489,21 +1502,20 @@
     cs4231_chip->regs->dmacsr &= ~APC_XINT_PLAY;
     cs4231_chip->regs->dmacsr &= ~APC_PPAUSE;
     
-    cs4231_playintr(drv);
+    cs4231_playintr(drv, cs4231_chip->regs->dmapnva == 0 ? 1 : 0);
 
     cs4231_chip->regs->dmacsr |= APC_PLAY_SETUP;
     cs4231_enable_play(drv);
 
     cs4231_ready(drv);
-  } else 
-    cs4231_playintr(drv);
+  }
 }
 
 #ifdef EB4231_SUPPORT
 static void eb4231_stop_output(struct sparcaudio_driver *drv)
 {
   struct cs4231_chip *cs4231_chip = (struct cs4231_chip *)drv->private;
-  int dcsr;
+  unsigned int dcsr;
 
   dprintk(("eb4231_stop_output: dcsr 0x%x dacr 0x%x dbcr %d\n",
            readl(&cs4231_chip->eb2p->dcsr),
@@ -1635,6 +1647,68 @@
   cs4231_pollinput(drv);
 }
 
+#ifdef EB4231_SUPPORT
+static void eb4231_start_input(struct sparcaudio_driver *drv, __u8 * buffer, 
+                               unsigned long count)
+{
+  struct cs4231_chip *cs4231_chip = (struct cs4231_chip *)drv->private;
+  unsigned int dcsr;
+
+  cs4231_chip->input_ptr = buffer;
+  cs4231_chip->input_size = count;
+
+  if (cs4231_chip->perchip_info.record.active || 
+      (cs4231_chip->perchip_info.record.pause))
+    return;
+
+  cs4231_ready(drv);
+
+  cs4231_chip->perchip_info.record.active = 1;
+  cs4231_chip->recording_count = 0;
+
+  dcsr = readl(&cs4231_chip->eb2c->dcsr);
+  if (!(dcsr & EBUS_DCSR_EN_DMA)) {
+    writel(EBUS_DCSR_RESET, &(cs4231_chip->eb2c->dcsr));
+    writel(EBUS_DCSR_BURST_SZ_16, &(cs4231_chip->eb2c->dcsr));
+
+    eb4231_recintr(drv);
+
+    writel(EBUS_DCSR_BURST_SZ_16 |
+           (EBUS_DCSR_EN_DMA | EBUS_DCSR_INT_EN | EBUS_DCSR_EN_CNT | EBUS_DCSR_EN_NEXT),
+           &(cs4231_chip->eb2c->dcsr));
+
+    cs4231_enable_rec(drv);
+    cs4231_ready(drv);
+  } else
+    eb4231_recintr(drv);
+}
+
+static void eb4231_stop_input(struct sparcaudio_driver *drv)
+{
+  struct cs4231_chip *cs4231_chip = (struct cs4231_chip *)drv->private;
+  unsigned int dcsr;
+
+  cs4231_chip->perchip_info.record.active = 0;
+
+  cs4231_chip->input_ptr = NULL;
+  cs4231_chip->input_size = 0;
+  if (cs4231_chip->input_dma_handle) {
+    cs4231_chip->input_dma_handle = 0;
+    cs4231_chip->input_dma_size = 0;
+  }
+  if (cs4231_chip->input_next_dma_handle) {
+    cs4231_chip->input_next_dma_handle = 0;
+    cs4231_chip->input_next_dma_size = 0;
+  }
+
+  dcsr = readl(&(cs4231_chip->eb2c->dcsr));
+  if (dcsr & EBUS_DCSR_EN_DMA)
+    writel(dcsr & ~EBUS_DCSR_EN_DMA, &(cs4231_chip->eb2c->dcsr));
+
+  cs4231_disable_rec(drv);
+}
+#endif
+
 static int cs4231_set_output_pause(struct sparcaudio_driver *drv, int value)
 {
         struct cs4231_chip *cs4231_chip = (struct cs4231_chip *)drv->private;
@@ -1763,13 +1837,25 @@
   struct cs4231_chip *cs4231_chip = (struct cs4231_chip *)drv->private;
   int dummy;
   
-  /* Read status. */
-  dummy = readl(&cs4231_chip->eb2c->dcsr);
+  /* Clear the interrupt. */
+  dummy = readl(&(cs4231_chip->eb2c->dcsr));
+  writel(dummy, &(cs4231_chip->eb2c->dcsr));
 
-  cs4231_chip->perchip_info.record.samples += 
-          cs4231_length_to_samplecount(&(cs4231_chip->perchip_info.record), 
-                                       cs4231_chip->reclen);
-  eb4231_recintr(drv);
+  if ((dummy & EBUS_DCSR_TC) != 0
+      /*&& (dummy & EBUS_DCSR_A_LOADED) != 0*/) {
+    cs4231_chip->perchip_info.record.samples += 
+      cs4231_length_to_samplecount(&(cs4231_chip->perchip_info.record), 
+                                   cs4231_chip->reclen);
+    eb4231_recintr(drv);
+  }
+
+  if ((dummy & EBUS_DCSR_A_LOADED) == 0) {
+    cs4231_chip->perchip_info.record.active = 0;
+    eb4231_recintr(drv);
+#if 1
+    eb4231_getsamplecount(drv, cs4231_chip->reclen, 1);
+#endif
+  }
 }
 
 /* ebus audio play interrupt handler. */
@@ -1827,7 +1913,8 @@
       cs4231_chip->perchip_info.play.samples += 
 	cs4231_length_to_samplecount(&(cs4231_chip->perchip_info.play), 
 				     cs4231_chip->playlen); 
-      cs4231_playintr(drv);
+      if (!(dummy & APC_XINT_EMPT))
+        cs4231_playintr(drv, 1);
     } 
     /* Any other conditions we need worry about? */
   }
@@ -1859,7 +1946,7 @@
       cs4231_chip->perchip_info.play.error = 1;
     }
     cs4231_chip->perchip_info.play.active = 0;
-    cs4231_playintr(drv);
+    cs4231_playintr(drv, 0);
 
     cs4231_getsamplecount(drv, cs4231_chip->playlen, 0);
   }
@@ -1937,8 +2024,8 @@
 	cs4231_ioctl,
 	eb4231_start_output,
 	eb4231_stop_output,
-	cs4231_start_input,
-        cs4231_stop_input,
+	eb4231_start_input,
+        eb4231_stop_input,
 	cs4231_audio_getdev,
         cs4231_set_output_volume,
         cs4231_get_output_volume,
diff -urN linux-2.2.11-pre2/drivers/sbus/audio/cs4231.h linux/drivers/sbus/audio/cs4231.h
--- linux-2.2.11-pre2/drivers/sbus/audio/cs4231.h	Thu Apr 22 19:24:51 1999
+++ linux/drivers/sbus/audio/cs4231.h	Mon Dec  3 18:52:26 2001
@@ -255,19 +255,19 @@
 #define APC_XINT_PLAY   0x40000  /* Playback ext intr */
 #define APC_XINT_CAPT   0x20000  /* Capture ext intr */
 #define APC_XINT_GENL   0x10000  /* Error ext intr */
-#define APC_XINT_EMPT   0x8000   /* Pipe empty interrupt */
-#define APC_XINT_PEMP   0x4000   /* Play pipe empty */
+#define APC_XINT_EMPT   0x8000   /* Pipe empty interrupt (0 write to pva) */
+#define APC_XINT_PEMP   0x4000   /* Play pipe empty (pva and pnva not set) */
 #define APC_XINT_PNVA   0x2000   /* Playback NVA dirty */
 #define APC_XINT_PENA   0x1000   /* play pipe empty Int enable */
 #define APC_XINT_COVF   0x800    /* Cap data dropped on floor */
 #define APC_XINT_CNVA   0x400    /* Capture NVA dirty */
-#define APC_XINT_CEMP   0x200    /* Capture pipe empty interrupt */
+#define APC_XINT_CEMP   0x200    /* Capture pipe empty (cva and cnva not set) */
 #define APC_XINT_CENA   0x100    /* Cap. pipe empty int enable */
 #define APC_PPAUSE      0x80     /* Pause the play DMA */
 #define APC_CPAUSE      0x40     /* Pause the capture DMA */
 #define APC_CDC_RESET   0x20     /* CODEC RESET */
-#define APC_PDMA_READY     0x08     /* Play DMA Go */
-#define APC_CDMA_READY     0x04     /* Capture DMA Go */
+#define APC_PDMA_READY  0x08     /* Play DMA Go */
+#define APC_CDMA_READY  0x04     /* Capture DMA Go */
 #define APC_CHIP_RESET  0x01     /* Reset the chip */
 
 #define APC_INIT_SETUP  (APC_CDMA_READY | APC_PDMA_READY | APC_XINT_ENA | APC_XINT_PLAY | APC_XINT_GENL | APC_INT_PENDING | APC_PLAY_INT | APC_CAPT_INT | APC_GENL_INT) 
diff -urN linux-2.2.11-pre2/drivers/sbus/char/bpp.c linux/drivers/sbus/char/bpp.c
--- linux-2.2.11-pre2/drivers/sbus/char/bpp.c	Mon Mar 15 16:11:30 1999
+++ linux/drivers/sbus/char/bpp.c	Mon Dec  3 18:52:26 2001
@@ -149,18 +149,18 @@
  */
 struct bpp_regs {
       /* DMA registers */
-      __u32 p_csr;		/* DMA Control/Status Register */
-      __u32 p_addr;		/* Address Register */
-      __u32 p_bcnt;		/* Byte Count Register */
-      __u32 p_tst_csr;		/* Test Control/Status (DMA2 only) */
+      __volatile__ __u32 p_csr;		/* DMA Control/Status Register */
+      __volatile__ __u32 p_addr;	/* Address Register */
+      __volatile__ __u32 p_bcnt;	/* Byte Count Register */
+      __volatile__ __u32 p_tst_csr;	/* Test Control/Status (DMA2 only) */
       /* Parallel Port registers */
-      __u16 p_hcr;		/* Hardware Configuration Register */
-      __u16 p_ocr;		/* Operation Configuration Register */
-      __u8 p_dr;		/* Parallel Data Register */
-      __u8 p_tcr;		/* Transfer Control Register */
-      __u8 p_or;		/* Output Register */
-      __u8 p_ir;		/* Input Register */
-      __u16 p_icr;		/* Interrupt Control Register */
+      __volatile__ __u16 p_hcr;		/* Hardware Configuration Register */
+      __volatile__ __u16 p_ocr;		/* Operation Configuration Register */
+      __volatile__ __u8 p_dr;		/* Parallel Data Register */
+      __volatile__ __u8 p_tcr;		/* Transfer Control Register */
+      __volatile__ __u8 p_or;		/* Output Register */
+      __volatile__ __u8 p_ir;		/* Input Register */
+      __volatile__ __u16 p_icr;		/* Interrupt Control Register */
 };
 
 /* P_CSR.  Bits of type RW1 are cleared with writting '1'. */
diff -urN linux-2.2.11-pre2/drivers/scsi/ChangeLog.ncr53c8xx linux/drivers/scsi/ChangeLog.ncr53c8xx
--- linux-2.2.11-pre2/drivers/scsi/ChangeLog.ncr53c8xx	Mon Apr 12 09:51:04 1999
+++ linux/drivers/scsi/ChangeLog.ncr53c8xx	Mon Dec  3 18:52:26 2001
@@ -1,3 +1,22 @@
+Wed Jul 21 1999 23:00 Gerard Roudier (groudier@club-internet.fr)
+	* revision 3.2a-2
+	- merge of driver 3.2a-1 with linux-2.3.11-pre3
+
+Sun May 9  15:00 1999 Gerard Roudier (groudier@club-internet.fr)
+	* revision 3.2a-1
+	- Fix the misdetection of SYM53C875E (was detected as a 876).
+	- Set the actual host ID used for each host in the scsi host data 
+	  structure. The mid-layer SCSI driver needs this information.
+
+Sun Apr 11  10:00 1999 Gerard Roudier (groudier@club-internet.fr)
+	* revision 3.2a
+	- Add 'hostid:#id' boot option. This option allows to change the 
+	  default SCSI id the driver uses for controllers.
+	- Remove nvram layouts and driver set-up structures from the C source,
+	  and use the one defined in sym53c8xx_defs.h file.
+	  (shared by both drivers).
+	- Set for now MAX LUNS to 16 (instead of 8).
+
 Thu Mar 11  23:00 1999 Gerard Roudier (groudier@club-internet.fr)
 	* revision 3.2	  (8xx-896 driver bundle)
 	- Only define the host template in ncr53c8xx.h and include the 
diff -urN linux-2.2.11-pre2/drivers/scsi/ChangeLog.sym53c8xx linux/drivers/scsi/ChangeLog.sym53c8xx
--- linux-2.2.11-pre2/drivers/scsi/ChangeLog.sym53c8xx	Mon Apr 12 09:51:04 1999
+++ linux/drivers/scsi/ChangeLog.sym53c8xx	Mon Dec  3 18:52:26 2001
@@ -1,3 +1,40 @@
+Sat Jul 24  12:00 1999 Gerard Roudier (groudier@club-internet.fr)
+	* version sym53c8xx-1.3g
+	- merge of driver 1.3f with linux-2.2.11-pre3
+	- remove the broken testing of the chip being connected to SCSI 
+	  from the SCSI interrupt handling code.   
+
+Sun May 9  15:00 1999 Gerard Roudier (groudier@club-internet.fr)
+	* version sym53c8xx-1.3f
+	- Fix the misdetection of SYM53C875E (was detected as a 876).
+	- Fix the misdetection of SYM53C810 not A (was detected as a 810A).
+	- Support for the 53C895A by Pamela Delaney <pam.delaney@lsil.com>
+	  The 53C895A contains all of the features of the 896 but has only 
+	  one channel and has a 32 bit PCI bus. It does 64 bit PCI addressing 
+	  using dual cycle PCI data transfers.
+	- Call request_region() event if MMIO is used and not normal IO.
+	  This allows sym and the ncr driver to be loaded in any order 
+	  without any risk of attaching the same device.
+	- Set the actual host ID used for each host in the scsi host data 
+	  structure. The mid-layer SCSI driver needs this information.
+	- Miscellaneous minor fixes.
+
+Tue Apr 15  10:00 1999 Gerard Roudier (groudier@club-internet.fr)
+	* version sym53c8xx-1.3e
+	- Support for any number of LUNs (64) (SPI2-compliant).
+	  (Btw, this may only be ever usefull under linux-2.2 ;-))
+
+Sun Apr 11  10:00 1999 Gerard Roudier (groudier@club-internet.fr)
+	* version sym53c8xx-1.3d
+	- Add 'hostid:#id' boot option. This option allows to change the 
+	  default SCSI id the driver uses for controllers.
+	- Make SCRIPTS not use self-mastering for PCI.
+	  There were still 2 places the driver used this feature of the 
+	  53C8XX family.
+	- Move some data structures (nvram layouts and driver set-up) to 
+	  the sym53c8xx_defs.h file. So, the both drivers will share them.
+	- Set MAX LUNS to 16 (instead of 8).
+
 Sat Mar 20  21:00 1999 Gerard Roudier (groudier@club-internet.fr)
 	* version sym53c8xx-1.3b
 	- Add support for NCR PQS PDS.
diff -urN linux-2.2.11-pre2/drivers/scsi/README.ncr53c8xx linux/drivers/scsi/README.ncr53c8xx
--- linux-2.2.11-pre2/drivers/scsi/README.ncr53c8xx	Mon Apr 12 09:51:04 1999
+++ linux/drivers/scsi/README.ncr53c8xx	Mon Dec  3 18:52:26 2001
@@ -4,7 +4,7 @@
 21 Rue Carnot
 95170 DEUIL LA BARRE - FRANCE
 
-10 March 1999
+9 May 1999
 ===============================================================================
 
 1.  Introduction
@@ -736,6 +736,13 @@
 Serial NVRAM
     nvram:n     do not look for serial NVRAM
     nvram:y     test controllers for onboard serial NVRAM
+    (alternate binary form)
+    mvram=<bits options>
+      0x01   look for NVRAM  (equivalent to nvram=y)
+      0x02   ignore NVRAM "Synchronous negotiation" parameters for all devices
+      0x04   ignore NVRAM "Wide negotiation"  parameter for all devices
+      0x08   ignore NVRAM "Scan at boot time" parameter for all devices
+      0x80   also attach controllers set to OFF in the NVRAM (sym53c8xx only)
 
 Check SCSI BUS 
     buschk:<option bits>
@@ -745,13 +752,23 @@
         0x1:   Check and donnot attach the controller on error.  
         0x2:   Check and just warn on error.
 
-Exclude hosts from being attached
+Exclude a host from being attached
     excl=<io_address>
 
     Prevent host at a given io address from being attached.
-    For example 'ncr53c8xx=excl:0xb400,excl:0xc000' indicate to the 
+    For example 'ncr53c8xx=excl:0xb400,excl:0xc000' indicates to the 
     ncr53c8xx driver not to attach hosts at address 0xb400 and 0xc000.
 
+Suggest a default SCSI id for hosts
+    hostid:255	no id suggested.
+    hostid:#x   (0 < x < 7) x suggested for hosts SCSI id.
+
+    If a host SCSI id is available from the NVRAM, the driver will ignore 
+    any value suggested as boot option. Otherwise, if a suggested value 
+    different from 255 has been supplied, it will use it. Otherwise, it will 
+    try to deduce the value previously set in the hardware and use value 
+    7 if the hardware value is zero.
+
 Boot fail safe
     safe:y	load the following assumed fail safe initial setup
 
@@ -837,7 +854,11 @@
 nvram:n     do not look for serial NVRAM
 nvram:y     test controllers for onboard serial NVRAM
 
-This option is described below (see 17. Serial NVRAM support).
+This option can also been entered as an hexadecimal value that allows 
+to control what information the driver will get from the NVRAM and what 
+information it will ignore.
+For details see '17. Serial NVRAM support'.
+
 When this option is enabled, the driver tries to detect all boards using 
 a Serial NVRAM. This memory is used to hold user set up parameters.
 
@@ -873,12 +894,17 @@
       0x02   ignore NVRAM "Synchronous negotiation" parameters for all devices
       0x04   ignore NVRAM "Wide negotiation"  parameter for all devices
       0x08   ignore NVRAM "Scan at boot time" parameter for all devices
+      0x80   also attach controllers set to OFF in the NVRAM (sym53c8xx only)
 
-My Atlas Wide only boots cleanly in 8 bits asynchronous data transfer 
-mode. However, it works flawlessly at 20 MB/second with the driver.
-Using "nvram=0x7" allows me to boot in 8 bits/async and to let the driver 
-use its setup for synchronous and wide negotiations.
-
+Option 0x80 is only supported by the sym53c8xx driver and is disabled by 
+default. Result is that, by default (option not set), the sym53c8xx driver 
+will not attach controllers set to OFF in the NVRAM.
+
+The ncr53c8xx always tries to attach all the controllers. Option 0x80 has 
+not been added to the ncr53c8xx driver, since it has been reported to 
+confuse users who use this driver since a long time. If you desire a 
+controller not to be attached by the ncr53c8xx driver at Linux boot, you 
+must use the 'excl' driver boot option.
 
 10.6 SCSI BUS checking boot option.
 
diff -urN linux-2.2.11-pre2/drivers/scsi/eata.c linux/drivers/scsi/eata.c
--- linux-2.2.11-pre2/drivers/scsi/eata.c	Fri Oct  9 11:56:59 1998
+++ linux/drivers/scsi/eata.c	Mon Dec  3 18:52:26 2001
@@ -1,6 +1,10 @@
 /*
  *      eata.c - Low-level driver for EATA/DMA SCSI host adapters.
  *
+ *      22 Jul 1999 Rev. 5.00 for linux 2.2.10 and 2.3.11
+ *        + Removed pre-2.2 source code compatibility.
+ *        + Added call to pci_set_master.
+ *
  *      26 Jul 1998 Rev. 4.33 for linux 2.0.35 and 2.1.111
  *        + Added command line option (rs:[y|n]) to reverse the scan order
  *          of PCI boards. The default is rs:y, which reverses the BIOS order
@@ -181,7 +185,7 @@
  *          This driver is based on the CAM (Common Access Method Committee)
  *          EATA (Enhanced AT Bus Attachment) rev. 2.0A, using DMA protocol.
  *
- *  Copyright (C) 1994-1998 Dario Ballabio (dario@milano.europe.dg.com)
+ *  Copyright (C) 1994-1999 Dario Ballabio (dario@milano.europe.dg.com)
  *
  *  Redistribution and use in source and binary forms, with or without
  *  modification, are permitted provided that redistributions of source
@@ -272,7 +276,7 @@
  *  After the optional list of detection probes, other possible command line
  *  options are:
  *
- *  eh:y  use new scsi code (linux 2.2 only);
+ *  eh:y  use new scsi code;
  *  eh:n  use old scsi code;
  *  et:y  force use of extended translation (255 heads, 63 sectors);
  *  et:n  use disk geometry detected by scsicam_bios_param;
@@ -359,7 +363,6 @@
 #if defined(MODULE)
 #include <linux/module.h>
 
-#if LINUX_VERSION_CODE >= LinuxVersionCode(2,1,26)
 MODULE_PARM(io_port, "1-" __MODULE_STRING(MAX_INT_PARAM) "i");
 MODULE_PARM(linked_comm, "i");
 MODULE_PARM(tagged_comm, "i");
@@ -370,7 +373,6 @@
 MODULE_PARM(ext_tran, "i");
 MODULE_PARM(rev_scan, "i");
 MODULE_AUTHOR("Dario Ballabio");
-#endif
 
 #endif
 
@@ -393,46 +395,17 @@
 #include <linux/stat.h>
 #include <linux/config.h>
 #include <linux/pci.h>
-
-#if LINUX_VERSION_CODE < LinuxVersionCode(2,1,93)
-#include <linux/bios32.h>
-#endif
-
-#if LINUX_VERSION_CODE >= LinuxVersionCode(2,1,36)
 #include <linux/init.h>
-#else
-#define __initfunc(A) A
-#define __initdata
-#define __init
-#endif
-
-#if LINUX_VERSION_CODE >= LinuxVersionCode(2,1,101)
 #include <asm/spinlock.h>
-#define IRQ_FLAGS
-#define IRQ_LOCK
-#define IRQ_LOCK_SAVE
-#define IRQ_UNLOCK
-#define IRQ_UNLOCK_RESTORE
+
 #define SPIN_FLAGS unsigned long spin_flags;
 #define SPIN_LOCK spin_lock_irq(&io_request_lock);
 #define SPIN_LOCK_SAVE spin_lock_irqsave(&io_request_lock, spin_flags);
 #define SPIN_UNLOCK spin_unlock_irq(&io_request_lock);
 #define SPIN_UNLOCK_RESTORE \
                   spin_unlock_irqrestore(&io_request_lock, spin_flags);
+
 static int use_new_eh_code = TRUE;
-#else
-#define IRQ_FLAGS unsigned long irq_flags;
-#define IRQ_LOCK cli();
-#define IRQ_LOCK_SAVE do {save_flags(irq_flags); cli();} while (0);
-#define IRQ_UNLOCK sti();
-#define IRQ_UNLOCK_RESTORE do {restore_flags(irq_flags);} while (0);
-#define SPIN_FLAGS
-#define SPIN_LOCK
-#define SPIN_LOCK_SAVE
-#define SPIN_UNLOCK
-#define SPIN_UNLOCK_RESTORE
-static int use_new_eh_code = FALSE;
-#endif
 
 struct proc_dir_entry proc_scsi_eata2x = {
     PROC_SCSI_EATA2X, 6, "eata2x",
@@ -727,9 +700,7 @@
 static void select_queue_depths(struct Scsi_Host *host, Scsi_Device *devlist) {
    Scsi_Device *dev;
    int j, ntag = 0, nuntag = 0, tqd, utqd;
-   IRQ_FLAGS
 
-   IRQ_LOCK_SAVE
    j = ((struct hostdata *) host->hostdata)->board_number;
 
    for(dev = devlist; dev; dev = dev->next) {
@@ -782,7 +753,6 @@
              dev->queue_depth, link_suffix, tag_suffix);
       }
 
-   IRQ_UNLOCK_RESTORE
    return;
 }
 
@@ -829,13 +799,43 @@
    return FALSE;
 }
 
+__initfunc (static inline void tune_pci_port(unsigned long port_base)) {
+
+#if defined(CONFIG_PCI)
+
+   unsigned int addr, k;
+   struct pci_dev *dev = NULL;
+
+   if (!pci_present()) return;
+
+   for (k = 0; k < MAX_PCI; k++) {
+
+      if (!(dev = pci_find_class(PCI_CLASS_STORAGE_SCSI << 8, dev))) break;
+
+      if (pci_read_config_dword(dev, PCI_BASE_ADDRESS_0, &addr)) continue;
+
+#if defined(DEBUG_PCI_DETECT)
+      printk("%s: tune_pci_port, bus %d, devfn 0x%x, addr 0x%x.\n",
+             driver_name, dev->bus->number, dev->devfn, addr);
+#endif
+
+      if ((addr & PCI_BASE_ADDRESS_IO_MASK) + PCI_BASE_ADDRESS_0 == port_base) {
+         pci_set_master(dev);
+         return;
+         }
+
+      }
+
+#endif /* end CONFIG_PCI */
+
+   return;
+}
+
 __initfunc (static inline int
             get_pci_irq(unsigned long port_base, unsigned char *apic_irq)) {
 
 #if defined(CONFIG_PCI)
 
-#if LINUX_VERSION_CODE >= LinuxVersionCode(2,1,93)
-
    unsigned int addr;
    struct pci_dev *dev = NULL;
 
@@ -850,9 +850,6 @@
              driver_name, dev->bus->number, dev->devfn, addr, dev->irq);
 #endif
 
-      if ((addr & PCI_BASE_ADDRESS_SPACE) != PCI_BASE_ADDRESS_SPACE_IO)
-             continue;
-
       if ((addr & PCI_BASE_ADDRESS_IO_MASK) + PCI_BASE_ADDRESS_0 == port_base) {
          *apic_irq = dev->irq;
          return TRUE;
@@ -860,8 +857,6 @@
 
       }
 
-#endif /* end new style PCI code */
-
 #endif /* end CONFIG_PCI */
 
    return FALSE;
@@ -1106,14 +1101,10 @@
       }
    else                                 tag_type = 'n';
 
-#if LINUX_VERSION_CODE >= LinuxVersionCode(2,1,101)
    sh[j]->hostt->use_new_eh_code = use_new_eh_code;
-#else
-   use_new_eh_code = FALSE;
-#endif
 
    if (j == 0) {
-      printk("EATA/DMA 2.0x: Copyright (C) 1994-1998 Dario Ballabio.\n");
+      printk("EATA/DMA 2.0x: Copyright (C) 1994-1999 Dario Ballabio.\n");
       printk("%s config options -> tc:%c, lc:%c, mq:%d, eh:%c, rs:%c, et:%c.\n",
              driver_name, tag_type, YESNO(linked_comm), max_queue_depth,
              YESNO(use_new_eh_code), YESNO(rev_scan), YESNO(ext_tran));
@@ -1149,6 +1140,7 @@
              info.pci, info.eisa, info.raidnum);
 #endif
 
+   tune_pci_port(sh[j]->io_port);
    return TRUE;
 }
 
@@ -1194,8 +1186,6 @@
 
    unsigned int addr, k;
 
-#if LINUX_VERSION_CODE >= LinuxVersionCode(2,1,93)
-
    struct pci_dev *dev = NULL;
 
    if (!pci_present()) return;
@@ -1219,36 +1209,6 @@
              (addr & PCI_BASE_ADDRESS_IO_MASK) + PCI_BASE_ADDRESS_0;
       }
 
-#else  /* else old style PCI code */
-
-   unsigned short i = 0;
-   unsigned char bus, devfn;
-
-   if (!pcibios_present()) return;
-
-   for (k = 0; k < MAX_PCI; k++) {
-
-      if (pcibios_find_class(PCI_CLASS_STORAGE_SCSI << 8, i++, &bus, &devfn)
-             != PCIBIOS_SUCCESSFUL) break;
-
-      if (pcibios_read_config_dword(bus, devfn, PCI_BASE_ADDRESS_0, &addr)
-             != PCIBIOS_SUCCESSFUL) continue;
-
-#if defined(DEBUG_PCI_DETECT)
-      printk("%s: detect, seq. %d, bus %d, devfn 0x%x, addr 0x%x.\n",
-             driver_name, k, bus, devfn, addr);
-#endif
-
-      if ((addr & PCI_BASE_ADDRESS_SPACE) != PCI_BASE_ADDRESS_SPACE_IO)
-             continue;
-
-      /* Order addresses according to rev_scan value */
-      io_port[MAX_INT_PARAM + (rev_scan ? (MAX_PCI - k) : (1 + k))] =
-             (addr & PCI_BASE_ADDRESS_IO_MASK) + PCI_BASE_ADDRESS_0;
-      }
-
-#endif /* end old style PCI code */
-
 #endif /* end CONFIG_PCI */
 
    return;
@@ -1256,9 +1216,7 @@
 
 __initfunc (int eata2x_detect(Scsi_Host_Template *tpnt)) {
    unsigned int j = 0, k;
-   IRQ_FLAGS
 
-   IRQ_LOCK_SAVE
    tpnt->proc_dir = &proc_scsi_eata2x;
 
 #if defined(MODULE)
@@ -1281,7 +1239,6 @@
       }
 
    num_boards = j;
-   IRQ_UNLOCK_RESTORE
    return j;
 }
 
@@ -1439,11 +1396,8 @@
 
 int eata2x_queuecommand(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *)) {
    int rtn;
-   IRQ_FLAGS
 
-   IRQ_LOCK_SAVE
    rtn = do_qcomm(SCpnt, done);
-   IRQ_UNLOCK_RESTORE
    return rtn;
 }
 
@@ -1515,16 +1469,11 @@
 
 int eata2x_old_abort(Scsi_Cmnd *SCarg) {
    int rtn;
-   IRQ_FLAGS
 
-   IRQ_LOCK_SAVE
    rtn = do_old_abort(SCarg);
-   IRQ_UNLOCK_RESTORE
    return rtn;
 }
 
-#if LINUX_VERSION_CODE >= LinuxVersionCode(2,1,101)
-
 static inline int do_abort(Scsi_Cmnd *SCarg) {
    unsigned int i, j;
 
@@ -1602,8 +1551,6 @@
    return do_abort(SCarg);
 }
 
-#endif /* new_eh_code */
-
 static inline int do_old_reset(Scsi_Cmnd *SCarg) {
    unsigned int i, j, time, k, c, limit = 0;
    int arg_done = FALSE;
@@ -1690,10 +1637,8 @@
 
    HD(j)->in_reset = TRUE;
    SPIN_UNLOCK
-   IRQ_UNLOCK
    time = jiffies;
    while ((jiffies - time) < (10 * HZ) && limit++ < 200000) udelay(100L);
-   IRQ_LOCK
    SPIN_LOCK
    printk("%s: reset, interrupts disabled, loops %d.\n", BN(j), limit);
 
@@ -1729,7 +1674,6 @@
          continue;
 
       SCpnt->scsi_done(SCpnt);
-      IRQ_LOCK
       }
 
    HD(j)->in_reset = FALSE;
@@ -1747,16 +1691,11 @@
 
 int eata2x_old_reset(Scsi_Cmnd *SCarg, unsigned int reset_flags) {
    int rtn;
-   IRQ_FLAGS
 
-   IRQ_LOCK_SAVE
    rtn = do_old_reset(SCarg);
-   IRQ_UNLOCK_RESTORE
    return rtn;
 }
 
-#if LINUX_VERSION_CODE >= LinuxVersionCode(2,1,101)
-
 static inline int do_reset(Scsi_Cmnd *SCarg) {
    unsigned int i, j, time, k, c, limit = 0;
    int arg_done = FALSE;
@@ -1837,10 +1776,8 @@
 
    HD(j)->in_reset = TRUE;
    SPIN_UNLOCK
-   IRQ_UNLOCK
    time = jiffies;
    while ((jiffies - time) < (10 * HZ) && limit++ < 200000) udelay(100L);
-   IRQ_LOCK
    SPIN_LOCK
    printk("%s: reset, interrupts disabled, loops %d.\n", BN(j), limit);
 
@@ -1876,7 +1813,6 @@
          continue;
 
       SCpnt->scsi_done(SCpnt);
-      IRQ_LOCK
       }
 
    HD(j)->in_reset = FALSE;
@@ -1893,8 +1829,6 @@
    return do_reset(SCarg);
 }
 
-#endif /* new_eh_code */
-
 int eata2x_biosparam(Disk *disk, kdev_t dev, int *dkinfo) {
    int size = disk->capacity;
 
@@ -2290,24 +2224,18 @@
 
 static void do_interrupt_handler(int irq, void *shap, struct pt_regs *regs) {
    unsigned int j;
-   IRQ_FLAGS
    SPIN_FLAGS
 
    /* Check if the interrupt must be processed by this handler */
    if ((j = (unsigned int)((char *)shap - sha)) >= num_boards) return;
 
    SPIN_LOCK_SAVE
-   IRQ_LOCK_SAVE
    ihdlr(irq, j);
-   IRQ_UNLOCK_RESTORE
    SPIN_UNLOCK_RESTORE
 }
 
 int eata2x_release(struct Scsi_Host *shpnt) {
    unsigned int i, j;
-   IRQ_FLAGS
-
-   IRQ_LOCK_SAVE
 
    for (j = 0; sh[j] != NULL && sh[j] != shpnt; j++);
 
@@ -2323,7 +2251,6 @@
 
    release_region(sh[j]->io_port, sh[j]->n_io_port);
    scsi_unregister(sh[j]);
-   IRQ_UNLOCK_RESTORE
    return FALSE;
 }
 
diff -urN linux-2.2.11-pre2/drivers/scsi/eata.h linux/drivers/scsi/eata.h
--- linux-2.2.11-pre2/drivers/scsi/eata.h	Tue May 11 10:36:33 1999
+++ linux/drivers/scsi/eata.h	Mon Dec  3 18:52:26 2001
@@ -16,12 +16,10 @@
 int eata2x_old_reset(Scsi_Cmnd *, unsigned int);
 int eata2x_biosparam(Disk *, kdev_t, int *);
 
-#define EATA_VERSION "4.33.00"
+#define EATA_VERSION "5.00.00"
 
 #define LinuxVersionCode(v, p, s) (((v)<<16)+((p)<<8)+(s))
 
-#if LINUX_VERSION_CODE >= LinuxVersionCode(2,1,101)
-
 #define EATA {                                                               \
                 name:              "EATA/DMA 2.0x rev. " EATA_VERSION " ",   \
                 detect:                  eata2x_detect,                      \
@@ -39,22 +37,5 @@
                 use_clustering:          ENABLE_CLUSTERING,                  \
                 use_new_eh_code:         1    /* Enable new error code */    \
              }
-
-#else /* Use old scsi code */
-
-#define EATA {                                                               \
-                name:              "EATA/DMA 2.0x rev. " EATA_VERSION " ",   \
-                detect:                  eata2x_detect,                      \
-                release:                 eata2x_release,                     \
-                queuecommand:            eata2x_queuecommand,                \
-                abort:                   eata2x_old_abort,                   \
-                reset:                   eata2x_old_reset,                   \
-                bios_param:              eata2x_biosparam,                   \
-                this_id:                 7,                                  \
-                unchecked_isa_dma:       1,                                  \
-                use_clustering:          ENABLE_CLUSTERING                   \
-             }
-
-#endif
 
 #endif
diff -urN linux-2.2.11-pre2/drivers/scsi/i91uscsi.c linux/drivers/scsi/i91uscsi.c
--- linux-2.2.11-pre2/drivers/scsi/i91uscsi.c	Thu Jan 14 10:31:41 1999
+++ linux/drivers/scsi/i91uscsi.c	Mon Dec  3 18:52:26 2001
@@ -218,8 +218,8 @@
 
 
 static void tul_do_pause(unsigned amount)
-{				/* Pause for amount*10 milliseconds */
-	unsigned long the_time = jiffies + amount;	/* 0.01 seconds per jiffy */
+{				/* Pause for amount jiffies */
+	unsigned long the_time = jiffies + amount;
 
 #if LINUX_VERSION_CODE >= CVT_LINUX_VERSION(2,1,95)
 	while (time_before_eq(jiffies, the_time));
@@ -579,7 +579,7 @@
 
 	/* Stall for a while, wait for target's firmware ready,make it 2 sec ! */
 	/* SONY 5200 tape drive won't work if only stall for 1 sec */
-	tul_do_pause(seconds * 100);
+	tul_do_pause(seconds * HZ);
 
 	TUL_RD(pCurHcb->HCS_Base, TUL_SInt);
 
diff -urN linux-2.2.11-pre2/drivers/scsi/ide-scsi.c linux/drivers/scsi/ide-scsi.c
--- linux-2.2.11-pre2/drivers/scsi/ide-scsi.c	Mon Dec  3 18:52:03 2001
+++ linux/drivers/scsi/ide-scsi.c	Mon Dec  3 18:52:26 2001
@@ -219,7 +219,7 @@
 
 	if (!test_bit(PC_TRANSFORM, &pc->flags))
 		return;
-	if (drive->media == ide_cdrom || drive->media == ide_optical) {
+	if (!pc->scsi_cmd->use_sg && (drive->media == ide_cdrom || drive->media == ide_optical)) {
 		if (pc->c[0] == MODE_SENSE_10 && sc[0] == MODE_SENSE) {
 			scsi_buf[0] = atapi_buf[1];		/* Mode data length */
 			scsi_buf[1] = atapi_buf[2];		/* Medium type */
diff -urN linux-2.2.11-pre2/drivers/scsi/ini9100u.c linux/drivers/scsi/ini9100u.c
--- linux-2.2.11-pre2/drivers/scsi/ini9100u.c	Tue Jan 19 11:23:23 1999
+++ linux/drivers/scsi/ini9100u.c	Mon Dec  3 18:52:26 2001
@@ -95,6 +95,15 @@
  *		  pSRB_tail members of the HCS structure.
  * 09/01/99 bv	- v1.03d
  *		- Fixed a deadlock problem in SMP.
+ * 21/01/99 bv	- v1.03e
+ *		- Add support for the Domex 3192U PCI SCSI
+ *		  This is a slightly modified patch by
+ *		  Brian Macy <bmacy@sunshinecomputing.com>
+ * 22/02/99 bv	- v1.03f
+ *		- Didn't detect the INIC-950 in 2.0.x correctly.
+ *		  Now fixed.
+ * 05/07/99 bv	- v1.03g
+ *		- Changed the assumption that HZ = 100
  **************************************************************************/
 
 #define CVT_LINUX_VERSION(V,P,S)        (V * 65536 + P * 256 + S)
@@ -175,7 +184,7 @@
 char *i91uCopyright = "Copyright (C) 1996-98";
 char *i91uInitioName = "by Initio Corporation";
 char *i91uProductName = "INI-9X00U/UW";
-char *i91uVersion = "v1.03d";
+char *i91uVersion = "v1.03g";
 
 #if LINUX_VERSION_CODE >= CVT_LINUX_VERSION(1,3,0)
 struct proc_dir_entry proc_scsi_ini9100u =
@@ -247,17 +256,12 @@
 				/* ---- EXTERNAL VARIABLES ---- */
 extern HCS tul_hcs[];
 
-struct id {
-  int vendor_id;
-  int device_id;
-};
-
-const struct id id_table[] = {
-  { INI_VENDOR_ID, I950_DEVICE_ID },
-  { INI_VENDOR_ID, I940_DEVICE_ID },
-  { INI_VENDOR_ID, I935_DEVICE_ID },
-  { INI_VENDOR_ID, 0x0002 },
-  { DMX_VENDOR_ID, 0x0002 },
+const PCI_ID i91u_pci_devices[] = {
+	{ INI_VENDOR_ID, I950_DEVICE_ID },
+	{ INI_VENDOR_ID, I940_DEVICE_ID },
+	{ INI_VENDOR_ID, I935_DEVICE_ID },
+	{ INI_VENDOR_ID, I920_DEVICE_ID },
+	{ DMX_VENDOR_ID, I920_DEVICE_ID },
 };
 
 /*
@@ -351,14 +355,13 @@
 	int iAdapters = 0;
 	long dRegValue;
 	WORD wBIOS;
-	const int iNumIdEntries = sizeof(id_table)/sizeof(id_table[0]);
 	int i = 0;
 
 	init_i91uAdapter_table();
 
-	for (i=0; i < iNumIdEntries; i++) {
-		struct id curId = id_table[i];
-		while ((pDev = pci_find_device(curId.vendor_id, curId.device_id, pDev)) != NULL) {
+	for (i = 0; i < TULSZ(i91u_pci_devices); i++)
+	{
+		while ((pDev = pci_find_device(i91u_pci_devices[i].vendor_id, i91u_pci_devices[i].device_id, pDev)) != NULL) {
 			pci_read_config_dword(pDev, 0x44, (u32 *) & dRegValue);
 			wBIOS = (UWORD) (dRegValue & 0xFF);
 			if (((dRegValue & 0xFF00) >> 8) == 0xFF)
@@ -366,8 +369,8 @@
 			wBIOS = (wBIOS << 8) + ((UWORD) ((dRegValue & 0xFF00) >> 8));
 			if (Addi91u_into_Adapter_table(wBIOS,
 							(pDev->base_address[0] & 0xFFFE),
-						       	pDev->irq,
-						       	pDev->bus->number,
+					       		pDev->irq,
+					       		pDev->bus->number,
 					       		(pDev->devfn >> 3)
 		    		) == 0)
 				iAdapters++;
@@ -394,17 +397,6 @@
 	unsigned short command;
 	WORD wBIOS, wBASE;
 	BYTE bPCIBusNum, bInterrupt, bPCIDeviceNum;
-	struct {
-		unsigned short vendor_id;
-		unsigned short device_id;
-	} const i91u_pci_devices[] =
-	{
-		{INI_VENDOR_ID, I935_DEVICE_ID},
-		{INI_VENDOR_ID, I940_DEVICE_ID},
-		{INI_VENDOR_ID, I950_DEVICE_ID},
-		{INI_VENDOR_ID, I920_DEVICE_ID}
-	};
-
 
 	iAdapters = 0;
 	/*
@@ -415,57 +407,25 @@
 		unsigned long page_offset, base;
 #endif
 
-#if LINUX_VERSION_CODE > CVT_LINUX_VERSION(2,1,92)
-		struct pci_dev *pdev = NULL;
-#else
 		int index;
 		unsigned char pci_bus, pci_devfn;
-#endif
 
 		bPCIBusNum = 0;
 		bPCIDeviceNum = 0;
 		init_i91uAdapter_table();
 		for (i = 0; i < TULSZ(i91u_pci_devices); i++) {
-#if LINUX_VERSION_CODE > CVT_LINUX_VERSION(2,1,92)
-			pdev = NULL;
-			while ((pdev = pci_find_device(i91u_pci_devices[i].vendor_id,
-					   i91u_pci_devices[i].device_id,
-						       pdev)))
-#else
 			index = 0;
 			while (!(pcibios_find_device(i91u_pci_devices[i].vendor_id,
 					   i91u_pci_devices[i].device_id,
 					 index++, &pci_bus, &pci_devfn)))
-#endif
 			{
-				if (i == 0) {
-					/*
+				if (i == 2) {
 					   printk("i91u: The RAID controller is not supported by\n");
 					   printk("i91u:         this driver, we are ignoring it.\n");
-					 */
 				} else {
 					/*
 					 * Read sundry information from PCI BIOS.
 					 */
-#if LINUX_VERSION_CODE > CVT_LINUX_VERSION(2,1,92)
-					bPCIBusNum = pdev->bus->number;
-					bPCIDeviceNum = pdev->devfn;
-					dRegValue = pdev->base_address[0];
-					if (dRegValue == -1) {	/* Check return code            */
-						printk("\n\ri91u: tulip read configuration error.\n");
-						return (0);	/* Read configuration space error  */
-					}
-					/* <02> read from base address + 0x50 offset to get the wBIOS balue. */
-					wBASE = (WORD) dRegValue;
-
-					/* Now read the interrupt line  */
-					dRegValue = pdev->irq;
-					bInterrupt = dRegValue & 0xFF;	/* Assign interrupt line      */
-					pci_read_config_word(pdev, PCI_COMMAND, &command);
-					pci_write_config_word(pdev, PCI_COMMAND,
-							      command | PCI_COMMAND_MASTER | PCI_COMMAND_IO);
-
-#else
 					bPCIBusNum = pci_bus;
 					bPCIDeviceNum = pci_devfn;
 					pcibios_read_config_dword(pci_bus, pci_devfn, PCI_BASE_ADDRESS_0,
@@ -484,7 +444,6 @@
 					pcibios_read_config_word(pci_bus, pci_devfn, PCI_COMMAND, &command);
 					pcibios_write_config_word(pci_bus, pci_devfn, PCI_COMMAND,
 								  command | PCI_COMMAND_MASTER | PCI_COMMAND_IO);
-#endif
 					wBASE &= PCI_BASE_ADDRESS_IO_MASK;
 					wBIOS = TUL_RDWORD(wBASE, 0x50);
 
diff -urN linux-2.2.11-pre2/drivers/scsi/ini9100u.h linux/drivers/scsi/ini9100u.h
--- linux-2.2.11-pre2/drivers/scsi/ini9100u.h	Tue May 11 10:36:58 1999
+++ linux/drivers/scsi/ini9100u.h	Mon Dec  3 18:52:26 2001
@@ -63,7 +63,9 @@
  *		- Removed unused code
  * 12/13/98 bv	- v1.03b
  *		- Add spinlocks to HCS structure.
-*******************************************************************************/
+ * 21/01/99 bv	- v1.03e
+ *		- Added PCI_ID structure
+ **************************************************************************/
 
 #ifndef	CVT_LINUX_VERSION
 #define	CVT_LINUX_VERSION(V,P,S)	(((V) * 65536) + ((P) * 256) + (S))
@@ -88,7 +90,7 @@
 extern int i91u_biosparam(Disk *, int, int *);	/*for linux v1.13 */
 #endif
 
-#define i91u_REVID "Initio INI-9X00U/UW SCSI device driver; Revision: 1.03d"
+#define i91u_REVID "Initio INI-9X00U/UW SCSI device driver; Revision: 1.03g"
 
 #if LINUX_VERSION_CODE < CVT_LINUX_VERSION(1, 3, 0)
 #define INI9100U	{ \
@@ -207,11 +209,19 @@
 #define SENSE_SIZE		14
 
 #define INI_VENDOR_ID   0x1101	/* Initio's PCI vendor ID       */
-#define DMX_VENDOR_ID   0x134a	/* Domex's PCI vendor ID       */
+#define DMX_VENDOR_ID	0x134a	/* Domex's PCI vendor ID	*/
 #define I950_DEVICE_ID	0x9500	/* Initio's inic-950 product ID   */
 #define I940_DEVICE_ID	0x9400	/* Initio's inic-940 product ID   */
 #define I935_DEVICE_ID	0x9401	/* Initio's inic-935 product ID   */
 #define I920_DEVICE_ID	0x0002	/* Initio's other product ID      */
+
+/************************************************************************/
+/*              Vendor ID/Device ID Pair Structure			*/
+/************************************************************************/
+typedef struct PCI_ID_Struc {
+	unsigned short vendor_id;
+	unsigned short device_id;
+} PCI_ID;
 
 /************************************************************************/
 /*              Scatter-Gather Element Structure                        */
diff -urN linux-2.2.11-pre2/drivers/scsi/ncr53c8xx.c linux/drivers/scsi/ncr53c8xx.c
--- linux-2.2.11-pre2/drivers/scsi/ncr53c8xx.c	Mon Dec  3 18:52:03 2001
+++ linux/drivers/scsi/ncr53c8xx.c	Mon Dec  3 18:52:26 2001
@@ -73,7 +73,7 @@
 */
 
 /*
-**	March 7 1999, version 3.2
+**	July 20 1999, version 3.2a-2
 **
 **	Supported SCSI-II features:
 **	    Synchronous negotiation
@@ -91,6 +91,8 @@
 **		53C860		(8 bits, Fast 20,     no rom BIOS)
 **		53C875		(Wide,   Fast 20,     on board rom BIOS)
 **		53C895		(Wide,   Fast 40,     on board rom BIOS)
+**		53C895A		(Wide,   Fast 40,     on board rom BIOS)
+**		53C896		(Wide,   Fast 40,     on board rom BIOS)
 **
 **	Other features:
 **		Memory mapped IO (linux-1.3.X and above only)
@@ -101,7 +103,7 @@
 /*
 **	Name and version of the driver
 */
-#define SCSI_NCR_DRIVER_NAME	"ncr53c8xx - version 3.2"
+#define SCSI_NCR_DRIVER_NAME	"ncr53c8xx - version 3.2a-2"
 
 #define SCSI_NCR_DEBUG_FLAGS	(0)
 
@@ -737,34 +739,6 @@
 **	This structure is initialized from linux config options.
 **	It can be overridden at boot-up by the boot command line.
 */
-#define SCSI_NCR_MAX_EXCLUDES 8
-struct ncr_driver_setup {
-	u_char	master_parity;
-	u_char	scsi_parity;
-	u_char	disconnection;
-	u_char	special_features;
-	u_char	ultra_scsi;
-	u_char	force_sync_nego;
-	u_char	reverse_probe;
-	u_char	pci_fix_up;
-	u_char	use_nvram;
-	u_char	verbose;
-	u_char	default_tags;
-	u_short	default_sync;
-	u_short	debug;
-	u_char	burst_max;
-	u_char	led_pin;
-	u_char	max_wide;
-	u_char	settle_delay;
-	u_char	diff_support;
-	u_char	irqm;
-	u_char	bus_check;
-	u_char	optimize;
-	u_char	recovery;
-	u_int	excludes[SCSI_NCR_MAX_EXCLUDES];
-	char	tag_ctrl[100];
-};
-
 static struct ncr_driver_setup
 	driver_setup			= SCSI_NCR_DRIVER_SETUP;
 
@@ -794,108 +768,7 @@
 #define bootverbose (np->verbose)
 
 #ifdef SCSI_NCR_NVRAM_SUPPORT
-/*
-**	Symbios NvRAM data format
-*/
-#define SYMBIOS_NVRAM_SIZE 368
-#define SYMBIOS_NVRAM_ADDRESS 0x100
-
-struct Symbios_nvram {
-/* Header 6 bytes */
-	u_short start_marker;	/* 0x0000 */
-	u_short byte_count;	/* excluding header/trailer */
-	u_short checksum;
-
-/* Controller set up 20 bytes */
-	u_short	word0;		/* 0x3000 */
-	u_short	word2;		/* 0x0000 */
-	u_short	word4;		/* 0x0000 */
-	u_short	flags;
-#define SYMBIOS_SCAM_ENABLE	(1)
-#define SYMBIOS_PARITY_ENABLE	(1<<1)
-#define SYMBIOS_VERBOSE_MSGS	(1<<2)
-#define SYMBIOS_CHS_MAPPING	(1<<3)
-	u_short	flags1;
-#define SYMBIOS_SCAN_HI_LO	(1)
-	u_short	word10;		/* 0x00 */
-	u_short	flags3;		/* 0x00 */
-#define SYMBIOS_REMOVABLE_FLAGS	(3)		/* 0=none, 1=bootable, 2=all */
-	u_char	host_id;
-	u_char	byte15;		/* 0x04 */
-	u_short	word16;		/* 0x0410 */
-	u_short	word18;		/* 0x0000 */
-
-/* Boot order 14 bytes * 4 */
-	struct Symbios_host{
-		u_char	word0;		/* 0x0004:ok / 0x0000:nok */
-		u_short	device_id;	/* PCI device id */
-		u_short	vendor_id;	/* PCI vendor id */
-		u_char	byte6;		/* 0x00 */
-		u_char	device_fn;	/* PCI device/function number << 3*/
-		u_short	word8;
-		u_short	flags;
-#define	SYMBIOS_INIT_SCAN_AT_BOOT	(1)
-		u_short	io_port;	/* PCI io_port address */
-	} host[4];
-
-/* Targets 8 bytes * 16 */
-	struct Symbios_target {
-		u_short	flags;
-#define SYMBIOS_DISCONNECT_ENABLE	(1)
-#define SYMBIOS_SCAN_AT_BOOT_TIME	(1<<1)
-#define SYMBIOS_SCAN_LUNS		(1<<2)
-#define SYMBIOS_QUEUE_TAGS_ENABLED	(1<<3)
-		u_char	bus_width;	/* 0x08/0x10 */
-		u_char	sync_offset;
-		u_char	sync_period;	/* 4*period factor */
-		u_char	byte6;		/* 0x00 */
-		u_short	timeout;
-	} target[16];
-	u_char	spare_devices[19*8];
-	u_char	trailer[6];		/* 0xfe 0xfe 0x00 0x00 0x00 0x00 */
-};
-typedef struct Symbios_nvram	Symbios_nvram;
-typedef struct Symbios_host	Symbios_host;
-typedef struct Symbios_target	Symbios_target;
-
-/*
-**	Tekram NvRAM data format.
-*/
-#define TEKRAM_NVRAM_SIZE 64
-#define TEKRAM_NVRAM_ADDRESS 0
-
-struct Tekram_nvram {
-	struct Tekram_target {
-		u_char	flags;
-#define	TEKRAM_PARITY_CHECK		(1)
-#define TEKRAM_SYNC_NEGO		(1<<1)
-#define TEKRAM_DISCONNECT_ENABLE	(1<<2)
-#define	TEKRAM_START_CMD		(1<<3)
-#define TEKRAM_TAGGED_COMMANDS		(1<<4)
-#define TEKRAM_WIDE_NEGO		(1<<5)
-		u_char	sync_index;
-		u_short	word2;
-	} target[16];
-	u_char	host_id;
-	u_char	flags;
-#define TEKRAM_MORE_THAN_2_DRIVES	(1)
-#define TEKRAM_DRIVES_SUP_1GB		(1<<1)
-#define	TEKRAM_RESET_ON_POWER_ON	(1<<2)
-#define TEKRAM_ACTIVE_NEGATION		(1<<3)
-#define TEKRAM_IMMEDIATE_SEEK		(1<<4)
-#define	TEKRAM_SCAN_LUNS		(1<<5)
-#define	TEKRAM_REMOVABLE_FLAGS		(3<<6)	/* 0: disable; 1: boot device; 2:all */
-	u_char	boot_delay_index;
-	u_char	max_tags_index;
-	u_short	flags1;
-#define TEKRAM_F2_F6_ENABLED		(1)
-	u_short	spare[29];
-};
-typedef struct Tekram_nvram	Tekram_nvram;
-typedef struct Tekram_target	Tekram_target;
-
 static u_char Tekram_sync[12] __initdata = {25,31,37,43,50,62,75,125,12,15,18,21};
-
 #endif /* SCSI_NCR_NVRAM_SUPPORT */
 
 /*
@@ -934,6 +807,7 @@
 	ncr_slot  slot;
 	ncr_chip  chip;
 	ncr_nvram *nvram;
+	u_char	  host_id;
 	int attach_done;
 } ncr_device;
 
@@ -4246,9 +4120,11 @@
 	/*
 	**  Get SCSI addr of host adapter (set by bios?).
 	*/
-	if (!np->myaddr) np->myaddr = INB(nc_scid) & 0x07;
-	if (!np->myaddr) np->myaddr = SCSI_NCR_MYADDR;
-
+	if (np->myaddr == 255) {
+		np->myaddr = INB(nc_scid) & 0x07;
+		if (!np->myaddr)
+			np->myaddr = SCSI_NCR_MYADDR;
+	}
 
 #endif /* SCSI_NCR_TRUST_BIOS_SETTING */
 
@@ -4520,6 +4396,7 @@
 	np->clock_divn	= device->chip.nr_divisor;
 	np->maxoffs	= device->chip.offset_max;
 	np->maxburst	= device->chip.burst_max;
+	np->myaddr	= device->host_id;
 
 	np->script0  = (struct script *)
 		(((u_long) &host_data->script_data) & CACHE_LINE_MASK);
@@ -4569,6 +4446,7 @@
 
 	request_region(device->slot.io_port, 128, "ncr53c8xx");
 	np->port = device->slot.io_port;
+	np->myaddr = 255;
 
 #ifdef SCSI_NCR_NVRAM_SUPPORT
 	if (nvram) {
@@ -4607,6 +4485,7 @@
 	**	Fill Linux host instance structure
 	*/
 	instance->max_channel	= 0;
+	instance->this_id       = np->myaddr;
 	instance->max_id	= np->maxwide ? 16 : 8;
 	instance->max_lun	= SCSI_NCR_MAX_LUN;
 #ifndef NCR_IOMAPPED
@@ -9324,6 +9203,8 @@
 			if (xi < SCSI_NCR_MAX_EXCLUDES)
 				driver_setup.excludes[xi++] = val;
 		}
+		else if	(!strncmp(cur, "hostid:", 7))
+			driver_setup.host_id	= val;
 		else
 			printk("ncr53c8xx_setup: unexpected boot option '%.*s' ignored\n", (int)(pc-cur+1), cur);
 
@@ -9859,9 +9740,15 @@
 	}
 
 	if (!latency_timer) {
-		latency_timer = 64;
-		if (initverbose >= 2)
-			printk("ncr53c8xx: setting PCI_LATENCY_TIMER to %d bus clocks (fixup)\n", latency_timer);
+		unsigned char min_gnt;
+
+		pcibios_read_config_byte(bus, device_fn,
+					 PCI_MIN_GNT, &min_gnt);
+		if (min_gnt == 0)
+			latency_timer = 128;
+		else
+			latency_timer = ((min_gnt << 3) & 0xff);
+		printk("ncr53c8xx: setting PCI_LATENCY_TIMER to %d bus clocks (fixup)\n", latency_timer);
 		pcibios_write_config_byte(bus, device_fn,
 					  PCI_LATENCY_TIMER, latency_timer);
 		pcibios_read_config_byte(bus, device_fn,
@@ -10974,8 +10861,8 @@
 	nvram_stop(np, &gpreg);
 	
 #ifdef SCSI_NCR_DEBUG_NVRAM
-printk("ncr53c8xx: NvRAM marker=%x trailer=%x %x %x %x %x %x byte_count=%d/%d checksum=%x/%x\n",
-	nvram->start_marker,
+printk("ncr53c8xx: NvRAM type=%x trailer=%x %x %x %x %x %x byte_count=%d/%d checksum=%x/%x\n",
+	nvram->type,
 	nvram->trailer[0], nvram->trailer[1], nvram->trailer[2],
 	nvram->trailer[3], nvram->trailer[4], nvram->trailer[5],
 	nvram->byte_count, sizeof(*nvram) - 12,
@@ -10983,7 +10870,7 @@
 #endif
 
 	/* check valid NVRAM signature, verify byte count and checksum */
-	if (nvram->start_marker == 0 &&
+	if (nvram->type == 0 &&
 	    !memcmp(nvram->trailer, Symbios_trailer, 6) &&
 	    nvram->byte_count == sizeof(*nvram) - 12 &&
 	    csum == nvram->checksum)
diff -urN linux-2.2.11-pre2/drivers/scsi/qlogicisp.c linux/drivers/scsi/qlogicisp.c
--- linux-2.2.11-pre2/drivers/scsi/qlogicisp.c	Mon Dec  3 18:52:03 2001
+++ linux/drivers/scsi/qlogicisp.c	Mon Dec  3 18:52:26 2001
@@ -1209,7 +1209,16 @@
 	pci_write_config_word(pdev, PCI_COMMAND, command);
 	pci_read_config_word(pdev, PCI_COMMAND, &command);
 	pci_write_config_byte(pdev, PCI_CACHE_LINE_SIZE, 16);
-	pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 64);
+	{
+		unsigned char min_gnt, latency_timer;
+
+		pci_read_config_byte(pdev, PCI_MIN_GNT, &min_gnt);
+		if (min_gnt == 0)
+			latency_timer = 64;
+		else
+			latency_timer = ((min_gnt << 3) & 0xff);
+		pci_write_config_byte(pdev, PCI_LATENCY_TIMER, latency_timer);
+	}
 #endif
 
 	if (command & PCI_COMMAND_IO && (io_base & 3) == 1)
diff -urN linux-2.2.11-pre2/drivers/scsi/sd.c linux/drivers/scsi/sd.c
--- linux-2.2.11-pre2/drivers/scsi/sd.c	Mon Dec  3 18:52:03 2001
+++ linux/drivers/scsi/sd.c	Mon Dec  3 18:52:26 2001
@@ -74,7 +74,7 @@
  *  Time out in seconds for disks and Magneto-opticals (which are slower).
  */
 
-#define SD_TIMEOUT (15 * HZ)
+#define SD_TIMEOUT (30 * HZ)
 #define SD_MOD_TIMEOUT (75 * HZ)
 
 #define CLUSTERABLE_DEVICE(SC) (SC->host->use_clustering && \
diff -urN linux-2.2.11-pre2/drivers/scsi/sym53c8xx.c linux/drivers/scsi/sym53c8xx.c
--- linux-2.2.11-pre2/drivers/scsi/sym53c8xx.c	Sat May 22 13:42:53 1999
+++ linux/drivers/scsi/sym53c8xx.c	Mon Dec  3 18:52:26 2001
@@ -55,7 +55,7 @@
 */
 
 /*
-**	April 2 1999, sym53c8xx version 1.3c
+**	July 24 1999, sym53c8xx version 1.3g
 **
 **	Supported SCSI features:
 **	    Synchronous data transfers
@@ -71,6 +71,7 @@
 **		53C875	  (Wide,   Fast 20,	 on-board rom BIOS)
 **		53C876	  (Wide,   Fast 20 Dual, on-board rom BIOS)
 **		53C895	  (Wide,   Fast 40,	 on-board rom BIOS)
+**		53C895A	  (Wide,   Fast 40,	 on-board rom BIOS)
 **		53C896	  (Wide,   Fast 40 Dual, on-board rom BIOS)
 **
 **	Other features:
@@ -82,7 +83,7 @@
 /*
 **	Name and version of the driver
 */
-#define SCSI_NCR_DRIVER_NAME	"sym53c8xx - version 1.3c"
+#define SCSI_NCR_DRIVER_NAME	"sym53c8xx - version 1.3g"
 
 /* #define DEBUG_896R1 */
 #define SCSI_NCR_OPTIMIZE_896
@@ -289,6 +290,21 @@
 
 /*==========================================================
 **
+**	This driver ensures that no PCI self-mastering will 
+**	be attempted by the PCI chip at any time, provided 
+**	that we can load the on-chip RAM from the C code.
+**	For now, I can only check that on x86, and the 
+**	the SCSI_NCR_PCI_MEM_NOT_SUPPORTED option is here 
+**	to provide previous behaviour for other platforms.
+**
+**==========================================================
+*/
+#if	!defined(__i386__)
+#define	SCSI_NCR_PCI_MEM_NOT_SUPPORTED
+#endif
+
+/*==========================================================
+**
 **	Configuration and Debugging
 **
 **==========================================================
@@ -354,7 +370,7 @@
 */
 
 #ifdef SCSI_NCR_MAX_LUN
-#define MAX_LUN    SCSI_NCR_MAX_LUN
+#define MAX_LUN    64
 #else
 #define MAX_LUN    (1)
 #endif
@@ -421,7 +437,7 @@
 **    Io mapped or memory mapped.
 */
 
-#if defined(SCSI_NCR_IOMAPPED)
+#if defined(SCSI_NCR_IOMAPPED) || defined(SCSI_NCR_PCI_MEM_NOT_SUPPORTED)
 #define NCR_IOMAPPED
 #endif
 
@@ -569,15 +585,19 @@
 #endif
 
 #ifdef __sparc__
-#define remap_pci_mem(base, size)	((u_long) __va(base))
-#define unmap_pci_mem(vaddr, size)
-#define pcivtobus(p)			((p) & pci_dvma_mask)
+#  define ioremap(base, size)		((u_long) __va(base))
+#  define iounmap(vaddr)
+#  define pcivtobus(p)			((p) & pci_dvma_mask)
+#  define memcpy_to_pci(a, b, c)	memcpy_toio((u_long) (a), (b), (c))
 #elif defined(__alpha__)
-#define pcivtobus(p)			((p) & 0xfffffffful)
-#else	/* __sparc__ */
-#define pcivtobus(p)			(p)
+#  define pcivtobus(p)			((p) & 0xfffffffful)
+#  define memcpy_to_pci(a, b, c)	memcpy_toio((a), (b), (c))
+#else	/* others */
+#  define pcivtobus(p)			(p)
+#  define memcpy_to_pci(a, b, c)	memcpy_toio((a), (b), (c))
+#endif
 
-#if !defined(NCR_IOMAPPED) || defined(__i386__)
+#ifndef SCSI_NCR_PCI_MEM_NOT_SUPPORTED
 __initfunc(
 static u_long remap_pci_mem(u_long base, u_long size)
 )
@@ -596,8 +616,8 @@
 	if (vaddr)
 		iounmap((void *) (vaddr & PAGE_MASK));
 }
-#endif	/* !NCR_IOMAPPED || __i386__ */
-#endif	/* __sparc__ */
+
+#endif /* not def SCSI_NCR_PCI_MEM_NOT_SUPPORTED */
 
 /*
 **	Insert a delay in micro-seconds and milli-seconds.
@@ -768,7 +788,7 @@
 	NCR_UNLOCK_DRIVER(flags);
 
 	if (DEBUG_FLAGS & DEBUG_ALLOC)
-		printk ("new %s[%d] @%p.\n", name, size, p);
+		printk ("new %-10s[%4d] @%p.\n", name, size, p);
 
 	if (p)
 		memset(p, 0, size);
@@ -783,7 +803,7 @@
 	u_long flags;
 
 	if (DEBUG_FLAGS & DEBUG_ALLOC)
-		printk ("freeing %s[%d] @%p.\n", name, size, ptr);
+		printk ("freeing %-10s[%4d] @%p.\n", name, size, ptr);
 
 	NCR_LOCK_DRIVER(flags);
 	__m_free(ptr, size);
@@ -839,34 +859,6 @@
 **	This structure is initialized from linux config options.
 **	It can be overridden at boot-up by the boot command line.
 */
-#define SCSI_NCR_MAX_EXCLUDES 8
-struct ncr_driver_setup {
-	u_char	master_parity;
-	u_char	scsi_parity;
-	u_char	disconnection;
-	u_char	special_features;
-	u_char	ultra_scsi;
-	u_char	force_sync_nego;
-	u_char	reverse_probe;
-	u_char	pci_fix_up;
-	u_char	use_nvram;
-	u_char	verbose;
-	u_char	default_tags;
-	u_short	default_sync;
-	u_short	debug;
-	u_char	burst_max;
-	u_char	led_pin;
-	u_char	max_wide;
-	u_char	settle_delay;
-	u_char	diff_support;
-	u_char	irqm;
-	u_char	bus_check;
-	u_char	optimize;
-	u_char	recovery;
-	u_int	excludes[SCSI_NCR_MAX_EXCLUDES];
-	char	tag_ctrl[100];
-};
-
 static struct ncr_driver_setup
 	driver_setup			= SCSI_NCR_DRIVER_SETUP;
 
@@ -896,134 +888,7 @@
 #define bootverbose (np->verbose)
 
 #ifdef SCSI_NCR_NVRAM_SUPPORT
-/*
-**	Symbios NvRAM data format
-*/
-#define SYMBIOS_NVRAM_SIZE 368
-#define SYMBIOS_NVRAM_ADDRESS 0x100
-
-struct Symbios_nvram {
-/* Header 6 bytes */
-	u_short type;		/* 0x0000 */
-	u_short byte_count;	/* excluding header/trailer */
-	u_short checksum;
-
-/* Controller set up 20 bytes */
-	u_char	v_major;	/* 0x00 */
-	u_char	v_minor;	/* 0x30 */
-	u_int32	boot_crc;
-	u_short	flags;
-#define SYMBIOS_SCAM_ENABLE	(1)
-#define SYMBIOS_PARITY_ENABLE	(1<<1)
-#define SYMBIOS_VERBOSE_MSGS	(1<<2)
-#define SYMBIOS_CHS_MAPPING	(1<<3)
-#define SYMBIOS_NO_NVRAM	(1<<3)	/* ??? */
-	u_short	flags1;
-#define SYMBIOS_SCAN_HI_LO	(1)
-	u_short	term_state;
-#define SYMBIOS_TERM_CANT_PROGRAM	(0)
-#define SYMBIOS_TERM_ENABLED		(1)
-#define SYMBIOS_TERM_DISABLED		(2)
-	u_short	rmvbl_flags;
-#define SYMBIOS_RMVBL_NO_SUPPORT	(0)
-#define SYMBIOS_RMVBL_BOOT_DEVICE	(1)
-#define SYMBIOS_RMVBL_MEDIA_INSTALLED	(2)
-	u_char	host_id;
-	u_char	num_hba;	/* 0x04 */
-	u_char	num_devices;	/* 0x10 */
-	u_char	max_scam_devices;	/* 0x04 */
-	u_char	num_valid_scam_devives;	/* 0x00 */
-	u_char	rsvd;
-
-/* Boot order 14 bytes * 4 */
-	struct Symbios_host{
-		u_short	type;		/* 4:8xx / 0:nok */
-		u_short	device_id;	/* PCI device id */
-		u_short	vendor_id;	/* PCI vendor id */
-		u_char	bus_nr;		/* PCI bus number */
-		u_char	device_fn;	/* PCI device/function number << 3*/
-		u_short	word8;
-		u_short	flags;
-#define	SYMBIOS_INIT_SCAN_AT_BOOT	(1)
-		u_short	io_port;	/* PCI io_port address */
-	} host[4];
-
-/* Targets 8 bytes * 16 */
-	struct Symbios_target {
-		u_char	flags;
-#define SYMBIOS_DISCONNECT_ENABLE	(1)
-#define SYMBIOS_SCAN_AT_BOOT_TIME	(1<<1)
-#define SYMBIOS_SCAN_LUNS		(1<<2)
-#define SYMBIOS_QUEUE_TAGS_ENABLED	(1<<3)
-		u_char	rsvd;
-		u_char	bus_width;	/* 0x08/0x10 */
-		u_char	sync_offset;
-		u_short	sync_period;	/* 4*period factor */
-		u_short	timeout;
-	} target[16];
-/* Scam table 8 bytes * 4 */
-	struct Symbios_scam {
-		u_short	id;
-		u_short	method;
-#define SYMBIOS_SCAM_DEFAULT_METHOD	(0)
-#define SYMBIOS_SCAM_DONT_ASSIGN	(1)
-#define SYMBIOS_SCAM_SET_SPECIFIC_ID	(2)
-#define SYMBIOS_SCAM_USE_ORDER_GIVEN	(3)
-		u_short status;
-#define SYMBIOS_SCAM_UNKNOWN		(0)
-#define SYMBIOS_SCAM_DEVICE_NOT_FOUND	(1)
-#define SYMBIOS_SCAM_ID_NOT_SET		(2)
-#define SYMBIOS_SCAM_ID_VALID		(3)
-		u_char	target_id;
-		u_char	rsvd;
-	} scam[4];
-
-	u_char	spare_devices[15*8];
-	u_char	trailer[6];		/* 0xfe 0xfe 0x00 0x00 0x00 0x00 */
-};
-typedef struct Symbios_nvram	Symbios_nvram;
-typedef struct Symbios_host	Symbios_host;
-typedef struct Symbios_target	Symbios_target;
-typedef struct Symbios_scam	Symbios_scam;
-
-/*
-**	Tekram NvRAM data format.
-*/
-#define TEKRAM_NVRAM_SIZE 64
-#define TEKRAM_NVRAM_ADDRESS 0
-
-struct Tekram_nvram {
-	struct Tekram_target {
-		u_char	flags;
-#define	TEKRAM_PARITY_CHECK		(1)
-#define TEKRAM_SYNC_NEGO		(1<<1)
-#define TEKRAM_DISCONNECT_ENABLE	(1<<2)
-#define	TEKRAM_START_CMD		(1<<3)
-#define TEKRAM_TAGGED_COMMANDS		(1<<4)
-#define TEKRAM_WIDE_NEGO		(1<<5)
-		u_char	sync_index;
-		u_short	word2;
-	} target[16];
-	u_char	host_id;
-	u_char	flags;
-#define TEKRAM_MORE_THAN_2_DRIVES	(1)
-#define TEKRAM_DRIVES_SUP_1GB		(1<<1)
-#define	TEKRAM_RESET_ON_POWER_ON	(1<<2)
-#define TEKRAM_ACTIVE_NEGATION		(1<<3)
-#define TEKRAM_IMMEDIATE_SEEK		(1<<4)
-#define	TEKRAM_SCAN_LUNS		(1<<5)
-#define	TEKRAM_REMOVABLE_FLAGS		(3<<6)	/* 0: disable; 1: boot device; 2:all */
-	u_char	boot_delay_index;
-	u_char	max_tags_index;
-	u_short	flags1;
-#define TEKRAM_F2_F6_ENABLED		(1)
-	u_short	spare[29];
-};
-typedef struct Tekram_nvram	Tekram_nvram;
-typedef struct Tekram_target	Tekram_target;
-
 static u_char Tekram_sync[12] __initdata = {25,31,37,43,50,62,75,125,12,15,18,21};
-
 #endif /* SCSI_NCR_NVRAM_SUPPORT */
 
 /*
@@ -1451,8 +1316,10 @@
 	*/
 	u_int32		*luntbl;	/* lcbs bus address table	*/
 	u_int32		b_luntbl;	/* bus address of this table	*/
-	lcb_p		lp[MAX_LUN];	/* The lcb's of this tcb	*/
-
+	lcb_p		l0p;		/* lcb of LUN #0 (normal case)	*/
+#if MAX_LUN > 1
+	lcb_p		*lmp;		/* Other lcb's [1..MAX_LUN]	*/
+#endif
 	/*----------------------------------------------------------------
 	**	Target capabilities.
 	**----------------------------------------------------------------
@@ -1649,6 +1516,18 @@
 };
 
 /*
+**	LUN control block lookup.
+**	We use a direct pointer for LUN #0, and a table of pointers 
+**	which is only allocated for devices that support LUN(s) > 0.
+*/
+#if MAX_LUN <= 1
+#define ncr_lp(np, tp, lun) (!lun) ? (tp)->l0p : 0
+#else
+#define ncr_lp(np, tp, lun) \
+	(!lun) ? (tp)->l0p : (tp)->lmp ? (tp)->lmp[(lun)] : 0
+#endif
+
+/*
 **	The status bytes are used by the host and the script processor.
 **
 **	The last four bytes (status[4]) are copied to the scratchb register
@@ -1907,11 +1786,15 @@
 	**	Virtual and physical bus addresses of the chip.
 	**----------------------------------------------------------------
 	*/
+#ifndef SCSI_NCR_PCI_MEM_NOT_SUPPORTED
 	u_long		base_va;	/* MMIO base virtual address	*/
+	u_long		base2_va;	/* On-chip RAM virtual address	*/
+#endif
 	u_long		base_ba;	/* MMIO base bus address	*/
 	u_long		base_io;	/* IO space base address	*/
 	u_long		base_ws;	/* (MM)IO window size		*/
-	u_long		base2_ba;	/* On-chip RAM bus address.	*/
+	u_long		base2_ba;	/* On-chip RAM bus address	*/
+	u_long		base2_ws;	/* On-chip RAM window size	*/
 	u_int		irq;		/* IRQ number			*/
 	volatile			/* Pointer to volatile for 	*/
 	struct ncr_reg	*reg;		/*  memory mapped IO.		*/
@@ -2111,12 +1994,6 @@
 	ncrcmd  data_out2	[  4];
 	ncrcmd  pm0_data	[ 16];
 	ncrcmd  pm1_data	[ 16];
-
-	/* Data area */
-	ncrcmd	saved_dsa	[  1];
-	ncrcmd	done_pos	[  1];
-	ncrcmd	startpos	[  1];
-	ncrcmd	targtbl		[  1];
 };
 
 /*
@@ -2170,16 +2047,20 @@
 	/* Data area */
 	ncrcmd	pm0_data_addr	[  1];
 	ncrcmd	pm1_data_addr	[  1];
+	ncrcmd	saved_dsa	[  1];
+	ncrcmd	done_pos	[  1];
+	ncrcmd	startpos	[  1];
+	ncrcmd	targtbl		[  1];
 	/* End of data area */
 
+#ifdef SCSI_NCR_PCI_MEM_NOT_SUPPORTED
 	ncrcmd	start_ram	[  1];
 	ncrcmd	script0_ba	[  4];
-
 	ncrcmd	start_ram64	[  3];
 	ncrcmd	script0_ba64	[  3];
 	ncrcmd	scripth0_ba64	[  6];
 	ncrcmd	ram_seg64	[  1];
-
+#endif
 	ncrcmd	snooptest	[  6];
 	ncrcmd	snoopend	[  2];
 };
@@ -2351,14 +2232,14 @@
 	**	and the the next queue position points to the next JOB.
 	*/
 	SCR_LOAD_ABS (scratcha, 4),
-		PADDR (startpos),
+		PADDRH (startpos),
 	SCR_LOAD_ABS (dsa, 4),
-		PADDR (startpos),
+		PADDRH (startpos),
 	SCR_LOAD_REL (temp, 4),
 		4,
 }/*-------------------------< GETJOB_BEGIN >------------------*/,{
 	SCR_STORE_ABS (temp, 4),
-		PADDR (startpos),
+		PADDRH (startpos),
 	SCR_LOAD_REL (dsa, 4),
 		0,
 }/*-------------------------< GETJOB_END >--------------------*/,{
@@ -2525,7 +2406,7 @@
 	SCR_FROM_REG (sstat0),
 		0,
 	SCR_JUMPR ^ IFTRUE (MASK (IRST, IRST)),
-		-8,
+		-16,
 	SCR_JUMP,
 		PADDR (start),
 }/*-------------------------< CLRACK >----------------------*/,{
@@ -2668,11 +2549,11 @@
 	**	the completed CCB will be lost.
 	*/
 	SCR_STORE_ABS (dsa, 4),
-		PADDR (saved_dsa),
+		PADDRH (saved_dsa),
 	SCR_LOAD_ABS (dsa, 4),
-		PADDR (done_pos),
+		PADDRH (done_pos),
 	SCR_LOAD_ABS (scratcha, 4),
-		PADDR(saved_dsa),
+		PADDRH (saved_dsa),
 	SCR_STORE_REL (scratcha, 4),
 		0,
 	/*
@@ -2687,7 +2568,7 @@
 	SCR_INT_FLY,
 		0,
 	SCR_STORE_ABS (temp, 4),
-		PADDR (done_pos),
+		PADDRH (done_pos),
 }/*------------------------< DONE_END >-----------------*/,{
 	SCR_JUMP,
 		PADDR (start),
@@ -2809,7 +2690,7 @@
 	SCR_LOAD_REG (dsa, 0xff),
 		0,
 	SCR_STORE_ABS (scratcha, 4),
-		PADDR (startpos),
+		PADDRH (startpos),
 }/*-------------------------< RESELECT >--------------------*/,{
 	/*
 	**	make the host status invalid.
@@ -2842,7 +2723,7 @@
 	**	load the target control block address
 	*/
 	SCR_LOAD_ABS (dsa, 4),
-		PADDR (targtbl),
+		PADDRH (targtbl),
 	SCR_SFBR_REG (dsa, SCR_SHL, 0),
 		0,
 	SCR_REG_REG (dsa, SCR_SHL, 0),
@@ -3082,16 +2963,7 @@
 		offsetof (struct ccb, phys.pm1.ret),
 	SCR_RETURN,
 		0,
-
-}/*-------------------------< SAVED_DSA >-------------------*/,{
-	SCR_DATA_ZERO,
-}/*-------------------------< DONE_POS >--------------------*/,{
-	SCR_DATA_ZERO,
-}/*-------------------------< STARTPOS >--------------------*/,{
-	SCR_DATA_ZERO,
-}/*-------------------------< TARGTBL >---------------------*/,{
-	SCR_DATA_ZERO,
-}/*--------------------------------------------------------*/
+}/*---------------------------------------------------------*/
 };
 
 static	struct scripth scripth0 __initdata = {
@@ -3596,7 +3468,7 @@
 	**	call the C code.
 	*/
 	SCR_LOAD_ABS (scratcha, 4),
-		PADDR (startpos),
+		PADDRH (startpos),
 	SCR_INT ^ IFTRUE (DATA (S_QUEUE_FULL)),
 		SIR_BAD_STATUS,
 	SCR_INT ^ IFTRUE (DATA (S_CHECK_COND)),
@@ -3737,6 +3609,25 @@
 	SCR_DATA_ZERO,
 }/*-------------------------< PM1_DATA_ADDR >---------------*/,{
 	SCR_DATA_ZERO,
+}/*-------------------------< SAVED_DSA >-------------------*/,{
+	SCR_DATA_ZERO,
+}/*-------------------------< DONE_POS >--------------------*/,{
+	SCR_DATA_ZERO,
+}/*-------------------------< STARTPOS >--------------------*/,{
+	SCR_DATA_ZERO,
+}/*-------------------------< TARGTBL >---------------------*/,{
+	SCR_DATA_ZERO,
+
+
+/*
+** We may use MEMORY MOVE instructions to load the on chip-RAM,
+** if it happens that mapping PCI memory is not possible.
+** But writing the RAM from the CPU is the preferred method, 
+** since PCI 2.2 seems to disallow PCI self-mastering.
+*/
+
+#ifdef SCSI_NCR_PCI_MEM_NOT_SUPPORTED
+
 }/*-------------------------< START_RAM >-------------------*/,{
 	/*
 	**	Load the script into on-chip RAM, 
@@ -3776,6 +3667,9 @@
 		PADDRH (start64),
 }/*-------------------------< RAM_SEG64 >--------------------*/,{
 		0,
+
+#endif /* SCSI_NCR_PCI_MEM_NOT_SUPPORTED */
+
 }/*-------------------------< SNOOPTEST >-------------------*/,{
 	/*
 	**	Read the variable.
@@ -4793,11 +4687,22 @@
 	if (np->base2_ba) {
 		np->p_script	= pcivtobus(np->base2_ba);
 		if (np->features & FE_RAM8K) {
+			np->base2_ws = 8192;
 			np->p_scripth = np->p_script + 4096;
 #if BITS_PER_LONG > 32
 			np->scr_ram_seg = cpu_to_scr(np->base2_ba >> 32);
 #endif
 		}
+		else
+			np->base2_ws = 4096;
+#ifndef SCSI_NCR_PCI_MEM_NOT_SUPPORTED
+		np->base2_va = remap_pci_mem(np->base2_ba, np->base2_ws);
+		if (!np->base2_va) {
+			printk(KERN_ERR "%s: can't map PCI MEMORY region\n",
+			       ncr_name(np));
+			goto attach_error;
+		}
+#endif
 	}
 
 	ncr_script_copy_and_bind (np, (ncrcmd *) &script0, (ncrcmd *) np->script0, sizeof(struct script));
@@ -4811,11 +4716,12 @@
 	np->scripth0->pm1_data_addr[0] = 
 			cpu_to_scr(NCB_SCRIPT_PHYS(np, pm1_data));
 
+#ifdef SCSI_NCR_PCI_MEM_NOT_SUPPORTED
 	np->scripth0->script0_ba[0]	= cpu_to_scr(vtobus(np->script0));
 	np->scripth0->script0_ba64[0]	= cpu_to_scr(vtobus(np->script0));
 	np->scripth0->scripth0_ba64[0]	= cpu_to_scr(vtobus(np->scripth0));
 	np->scripth0->ram_seg64[0]	= np->scr_ram_seg;
-
+#endif
 	/*
 	**	Prepare the idle and invalid task actions.
 	*/
@@ -4851,7 +4757,7 @@
 	/*
 	**	Prepare the target bus address array.
 	*/
-	np->script0->targtbl[0] = cpu_to_scr(vtobus(np->targtbl));
+	np->scripth0->targtbl[0] = cpu_to_scr(vtobus(np->targtbl));
 	for (i = 0 ; i < MAX_TARGET ; i++) {
 		np->targtbl[i] = cpu_to_scr(vtobus(&np->target[i]));
 		np->target[i].b_luntbl = cpu_to_scr(vtobus(np->badluntbl));
@@ -4981,8 +4887,9 @@
 	**	and return success.
 	*/
 	instance->max_channel	= 0;
+	instance->this_id	= np->myaddr;
 	instance->max_id	= np->maxwide ? 16 : 8;
-	instance->max_lun	= SCSI_NCR_MAX_LUN;
+	instance->max_lun	= MAX_LUN;
 #ifndef NCR_IOMAPPED
 	instance->base		= (char *) np->reg;
 #endif
@@ -5026,9 +4933,11 @@
 		free_irq(np->irq, np);
 	if (np->base_io)
 		release_region(np->base_io, np->base_ws);
-#ifndef NCR_IOMAPPED
+#ifndef SCSI_NCR_PCI_MEM_NOT_SUPPORTED
 	if (np->base_va)
 		unmap_pci_mem(np->base_va, np->base_ws);
+	if (np->base2_va)
+		unmap_pci_mem(np->base2_va, np->base2_ws);
 #endif
 	if (np->scripth0)
 		m_free(np->scripth0, sizeof(struct scripth), "SCRIPTH");
@@ -5050,13 +4959,17 @@
 	for (target = 0; target < MAX_TARGET ; target++) {
 		tp = &np->target[target];
 		for (lun = 0 ; lun < MAX_LUN ; lun++) {
-			lp = tp->lp[lun];
+			lp = ncr_lp(np, tp, lun);
 			if (!lp)
 				continue;
 			if (lp->tasktbl != &lp->tasktbl_0)
 				m_free(lp->tasktbl, 256, "TASKTBL");
 			m_free(lp, sizeof(*lp), "LCB");
 		}
+#if MAX_LUN > 1
+		if (tp->lmp)
+			m_free(tp->lmp, MAX_LUN * sizeof(lcb_p), "LMP");
+#endif 
 	}
 
 	m_free(np, sizeof(*np), "NCB");
@@ -5112,7 +5025,7 @@
 {
 /*	Scsi_Device        *device    = cmd->device; */
 	tcb_p tp                      = &np->target[cmd->target];
-	lcb_p lp		      = tp->lp[cmd->lun];
+	lcb_p lp		      = ncr_lp(np, tp, cmd->lun);
 	ccb_p cp;
 
 	int	segments;
@@ -5941,7 +5854,7 @@
 	cmd = cp->cmd;
 	cp->cmd = NULL;
 	tp = &np->target[cp->target];
-	lp = tp->lp[cp->lun];
+	lp = ncr_lp(np, tp, cp->lun);
 
 	/*
 	**	We donnot queue more than 1 ccb per target 
@@ -6274,7 +6187,7 @@
 	**	Start at first entry.
 	*/
 	np->squeueput = 0;
-	np->script0->startpos[0] = cpu_to_scr(phys);
+	np->scripth0->startpos[0] = cpu_to_scr(phys);
 
 	/*
 	**	Clear Done Queue
@@ -6289,7 +6202,7 @@
 	/*
 	**	Start at first entry.
 	*/
-	np->script0->done_pos[0] = cpu_to_scr(phys);
+	np->scripth0->done_pos[0] = cpu_to_scr(phys);
 	np->dqueueget = 0;
 
 	/*
@@ -6414,17 +6327,35 @@
 	}
 
 	/*
-	**    Start script processor.
+	**    Download SCSI SCRIPTS to on-chip RAM if present,
+	**    and start script processor.
+	**    We do the download preferently from the CPU.
+	**    For platforms that may not support PCI memory mapping,
+	**    we use a simple SCRIPTS that performs MEMORY MOVEs.
 	*/
 	MEMORY_BARRIER();
 	if (np->base2_ba) {
 		if (bootverbose)
 			printk ("%s: Downloading SCSI SCRIPTS.\n",
 				ncr_name(np));
-		if (np->features & FE_RAM8K)
+#ifdef SCSI_NCR_PCI_MEM_NOT_SUPPORTED
+		if (np->base2_ws == 8192)
 			phys = NCB_SCRIPTH0_PHYS (np, start_ram64);
 		else
 			phys = NCB_SCRIPTH_PHYS (np, start_ram);
+#else
+		if (np->base2_ws == 8192) {
+			memcpy_to_pci(np->base2_va + 4096,
+					np->scripth0, sizeof(struct scripth));
+			OUTL (nc_mmws, np->scr_ram_seg);
+			OUTL (nc_mmrs, np->scr_ram_seg);
+			OUTL (nc_sfs,  np->scr_ram_seg);
+			phys = NCB_SCRIPTH_PHYS (np, start64);
+		}
+		else
+			phys = NCB_SCRIPT_PHYS (np, init);
+		memcpy_to_pci(np->base2_va, np->script0, sizeof(struct script));
+#endif /* SCSI_NCR_PCI_MEM_NOT_SUPPORTED */
 	}
 	else
 		phys = NCB_SCRIPT_PHYS (np, init);
@@ -6729,7 +6660,7 @@
 static void ncr_setup_tags (ncb_p np, u_char tn, u_char ln)
 {
 	tcb_p tp = &np->target[tn];
-	lcb_p lp = tp->lp[ln];
+	lcb_p lp = ncr_lp(np, tp, ln);
 	u_char   reqtags, maxdepth;
 
 	/*
@@ -6844,7 +6775,7 @@
 			if (!((np->user.target>>t)&1)) continue;
 			np->target[t].usrtags = np->user.data;
 			for (ln = 0; ln < MAX_LUN; ln++) {
-				lcb_p lp = np->target[t].lp[ln];
+				lcb_p lp = ncr_lp(np, &np->target[t], ln);
 				if (!lp)
 					continue;
 				lp->maxtags = lp->numtags = np->user.data;
@@ -7339,17 +7270,9 @@
 {
 	u_int32	dsp	= INL (nc_dsp);
 	u_int32	dsa	= INL (nc_dsa);
-	u_char	scntl1	= INB (nc_scntl1);
 	ccb_p cp	= ncr_ccb_from_dsa(np, dsa);
 
 	/*
-	**	If we are connected to the SCSI BUS, we only 
-	**	can reset the BUS.
-	*/
-	if (scntl1 & ISCON)
-		goto reset_all;
-
-	/*
 	**	If we haven't been interrupted inside the SCRIPTS 
 	**	critical pathes, we can safely restart the SCRIPTS 
 	**	and trust the DSA value if it matches a CCB.
@@ -7920,7 +7843,7 @@
 {
 	Scsi_Cmnd *cmd	= cp->cmd;
 	tcb_p tp	= &np->target[cp->target];
-	lcb_p lp	= tp->lp[cp->lun];
+	lcb_p lp	= ncr_lp(np, tp, cp->lun);
 	ccb_p		cp2;
 	int		busyccbs = 1;
 	u_int32		startp;
@@ -8167,8 +8090,8 @@
 		**	message still exist, this should help.
 		**	We just assume lun=0, 1 CCB, no tag.
 		*/
-		if (tp->lp[0]) { 
-			OUTL (nc_dsa, scr_to_cpu(tp->lp[0]->tasktbl[0]));
+		if (tp->l0p) { 
+			OUTL (nc_dsa, scr_to_cpu(tp->l0p->tasktbl[0]));
 			OUTL (nc_dsp, NCB_SCRIPT_PHYS (np, resel_go));
 			return;
 		}
@@ -8623,7 +8546,7 @@
 static	ccb_p ncr_get_ccb (ncb_p np, u_char tn, u_char ln)
 {
 	tcb_p tp = &np->target[tn];
-	lcb_p lp = tp->lp[ln];
+	lcb_p lp = ncr_lp(np, tp, ln);
 	u_char tag = NO_TAG;
 	XPT_QUEHEAD *qp;
 	ccb_p cp = (ccb_p) 0;
@@ -8715,7 +8638,7 @@
 static void ncr_free_ccb (ncb_p np, ccb_p cp)
 {
 	tcb_p tp = &np->target[cp->target];
-	lcb_p lp = tp->lp[cp->lun];
+	lcb_p lp = ncr_lp(np, tp, cp->lun);
 
 	if (DEBUG_FLAGS & DEBUG_TAGS) {
 		PRINT_LUN(np, cp->target, cp->lun);
@@ -8882,7 +8805,7 @@
 static lcb_p ncr_alloc_lcb (ncb_p np, u_char tn, u_char ln)
 {
 	tcb_p tp = &np->target[tn];
-	lcb_p lp = tp->lp[ln];
+	lcb_p lp = ncr_lp(np, tp, ln);
 
 	/*
 	**	Already done, return.
@@ -8898,12 +8821,24 @@
 		goto fail;
 
 	/*
+	**	Allocate the table of pointers for LUN(s) > 0, if needed.
+	*/
+	if (ln && !tp->lmp) {
+		tp->lmp = m_calloc(MAX_LUN * sizeof(lcb_p), "LMP", MEMO_WARN);
+		if (!tp->lmp)
+			goto fail;
+	}
+
+	/*
 	**	Allocate the lcb.
 	*/
 	lp = m_calloc(sizeof(struct lcb), "LCB", MEMO_WARN);
 	if (!lp)
 		goto fail;
-	tp->lp[ln] = lp;
+	if (ln)
+		tp->lmp[ln] = lp;
+	else
+		tp->l0p = lp;
 
 	/*
 	**	Make it available to the chip.
@@ -8948,7 +8883,7 @@
 static lcb_p ncr_setup_lcb (ncb_p np, u_char tn, u_char ln, u_char *inq_data)
 {
 	tcb_p tp = &np->target[tn];
-	lcb_p lp = tp->lp[ln];
+	lcb_p lp = ncr_lp(np, tp, ln);
 	u_char inq_byte7;
 	int i;
 
@@ -9624,6 +9559,7 @@
 #define OPT_SAFE_SETUP		22
 #define OPT_USE_NVRAM		23
 #define OPT_EXCLUDE		24
+#define OPT_HOST_ID		25
 
 static char setup_token[] __initdata = 
 	"tags:"   "mpar:"
@@ -9638,7 +9574,7 @@
 	"buschk:" "optim:"
 	"recovery:"
 	"safe:"   "nvram:"
-	"excl:";
+	"excl:"   "hostid:";
 
 #ifdef MODULE
 #define	ARG_SEP	' '
@@ -9772,6 +9708,9 @@
 			if (xi < SCSI_NCR_MAX_EXCLUDES)
 				driver_setup.excludes[xi++] = val;
 			break;
+		case OPT_HOST_ID:
+			driver_setup.host_id = val;
+			break;
 		default:
 			printk("sym53c8xx_setup: unexpected boot option '%.*s' ignored\n", (int)(pc-cur+1), cur);
 			break;
@@ -9988,7 +9927,7 @@
 		}
 		++index;
 		devp = &devtbl[count];
-		devp->host_id = 255;
+		devp->host_id = driver_setup.host_id;
 		devp->attach_done = 0;
 		if (sym53c8xx_pci_init(tpnt, bus, device_fn, devp)) {
 			continue;
@@ -10221,18 +10160,18 @@
 		if (revision > ncr_chip_table[i].revision_id)
 			continue;
 		if (!(ncr_chip_table[i].features & FE_LDSTR))
-			continue;
+			break;
 		chip = &device->chip;
 		memcpy(chip, &ncr_chip_table[i], sizeof(*chip));
 		chip->revision_id = revision;
 		break;
 	}
 
-#if defined(__i386__)
 	/*
 	**	Ignore Symbios chips controlled by SISL RAID controller.
 	**	This controller sets value 0x52414944 at RAM end - 16.
 	*/
+#if defined(__i386__) && !defined(SCSI_NCR_PCI_MEM_NOT_SUPPORTED)
 	if (chip && (base_2 & PCI_BASE_ADDRESS_MEM_MASK)) {
 		unsigned int ram_size, ram_val;
 		u_long ram_ptr;
@@ -10254,7 +10193,7 @@
 			}
 		}
 	}
-#endif
+#endif /* not def SCSI_NCR_PCI_MEM_NOT_SUPPORTED */
 
 	if (!chip) {
 		printk(NAME53C8XX ": not initializing, device not supported\n");
@@ -10341,8 +10280,15 @@
 	/*
 	**    Check availability of IO space, memory space.
 	**    Enable master capability if not yet.
+	**
+	**    We shouldn't have to care about the IO region when 
+	**    we are using MMIO. But calling check_region() from 
+	**    both the ncr53c8xx and the sym53c8xx drivers prevents 
+	**    from attaching devices from the both drivers.
+	**    If you have a better idea, let me know.
 	*/
-#ifdef NCR_IOMAPPED
+/* #ifdef NCR_IOMAPPED */
+#if 1
 	if (!(command & PCI_COMMAND_IO) || !(io_port & 1)) { 
 		printk(NAME53C8XX ": I/O base address (0x%lx) disabled.\n",
 			(long) io_port);
@@ -10358,7 +10304,8 @@
 	base	&= PCI_BASE_ADDRESS_MEM_MASK;
 	base_2	&= PCI_BASE_ADDRESS_MEM_MASK;
 
-#ifdef NCR_IOMAPPED
+/* #ifdef NCR_IOMAPPED */
+#if 1
 	if (io_port && check_region (io_port, 128)) {
 		printk(NAME53C8XX ": IO region 0x%lx[0..127] is in use\n",
 			(long) io_port);
@@ -10366,7 +10313,8 @@
 	}
 	if (!io_port)
 		return -1;
-#else
+#endif
+#ifndef NCR_IOMAPPED
 	if (!base) {
 		printk(NAME53C8XX ": MMIO base address disabled.\n");
 		return -1;
@@ -10583,7 +10531,7 @@
 
 		np = ((struct host_data *) host->hostdata)->ncb;
 		tp = &np->target[device->id];
-		lp = tp->lp[device->lun];
+		lp = ncr_lp(np, tp, device->lun);
 
 		/*
 		**	Select queue depth from driver setup.
@@ -11403,8 +11351,8 @@
 	nvram_stop(np, &gpreg);
 	
 #ifdef SCSI_NCR_DEBUG_NVRAM
-printk("sym53c8xx: NvRAM marker=%x trailer=%x %x %x %x %x %x byte_count=%d/%d checksum=%x/%x\n",
-	nvram->start_marker,
+printk("sym53c8xx: NvRAM type=%x trailer=%x %x %x %x %x %x byte_count=%d/%d checksum=%x/%x\n",
+	nvram->type,
 	nvram->trailer[0], nvram->trailer[1], nvram->trailer[2],
 	nvram->trailer[3], nvram->trailer[4], nvram->trailer[5],
 	nvram->byte_count, sizeof(*nvram) - 12,
diff -urN linux-2.2.11-pre2/drivers/scsi/sym53c8xx_defs.h linux/drivers/scsi/sym53c8xx_defs.h
--- linux-2.2.11-pre2/drivers/scsi/sym53c8xx_defs.h	Tue May 11 10:36:31 1999
+++ linux/drivers/scsi/sym53c8xx_defs.h	Mon Dec  3 18:52:26 2001
@@ -271,7 +271,7 @@
 #define SCSI_NCR_TIMER_INTERVAL	(HZ)
 
 #if 1 /* defined CONFIG_SCSI_MULTI_LUN */
-#define SCSI_NCR_MAX_LUN	(8)
+#define SCSI_NCR_MAX_LUN	(16)
 #else
 #define SCSI_NCR_MAX_LUN	(1)
 #endif
@@ -384,6 +384,10 @@
 #define PCI_DEVICE_ID_NCR_53C896 0xb
 #endif
 
+#ifndef PCI_DEVICE_ID_NCR_53C895A
+#define PCI_DEVICE_ID_NCR_53C895A 0x12
+#endif
+
 /*
 **   NCR53C8XX devices features table.
 */
@@ -463,7 +467,10 @@
  {PCI_DEVICE_ID_NCR_53C875, 0x0f, "875",  6, 16, 5,			\
  FE_WIDE|FE_ULTRA|FE_DBLR|FE_CACHE0_SET|FE_BOF|FE_DFS|FE_LDSTR|FE_PFEN|FE_RAM}\
  ,									\
- {PCI_DEVICE_ID_NCR_53C875, 0xff, "876",  6, 16, 5,			\
+ {PCI_DEVICE_ID_NCR_53C875, 0x1f, "876",  6, 16, 5,			\
+ FE_WIDE|FE_ULTRA|FE_DBLR|FE_CACHE0_SET|FE_BOF|FE_DFS|FE_LDSTR|FE_PFEN|FE_RAM}\
+ ,									\
+ {PCI_DEVICE_ID_NCR_53C875, 0x2f, "875E",  6, 16, 5,			\
  FE_WIDE|FE_ULTRA|FE_DBLR|FE_CACHE0_SET|FE_BOF|FE_DFS|FE_LDSTR|FE_PFEN|FE_RAM}\
  ,									\
  {PCI_DEVICE_ID_NCR_53C875J,0xff, "875J", 6, 16, 5,			\
@@ -478,6 +485,10 @@
  {PCI_DEVICE_ID_NCR_53C896, 0xff, "896",  7, 31, 7,			\
  FE_WIDE|FE_ULTRA2|FE_QUAD|FE_CACHE_SET|FE_BOF|FE_DFS|FE_LDSTR|FE_PFEN|FE_RAM|\
  FE_RAM8K|FE_64BIT|FE_IO256|FE_NOPM|FE_LEDC}\
+ ,									\
+ {PCI_DEVICE_ID_NCR_53C895A, 0xff, "895a",  6, 31, 7,			\
+ FE_WIDE|FE_ULTRA2|FE_QUAD|FE_CACHE_SET|FE_BOF|FE_DFS|FE_LDSTR|FE_PFEN|FE_RAM|\
+ FE_RAM8K|FE_64BIT|FE_IO256|FE_NOPM|FE_LEDC}\
 }
 
 /*
@@ -494,10 +505,46 @@
 	PCI_DEVICE_ID_NCR_53C875J,	\
 	PCI_DEVICE_ID_NCR_53C885,	\
 	PCI_DEVICE_ID_NCR_53C895,	\
-	PCI_DEVICE_ID_NCR_53C896	\
+	PCI_DEVICE_ID_NCR_53C896,	\
+	PCI_DEVICE_ID_NCR_53C895A	\
 }
 
 /*
+**	Driver setup structure.
+**
+**	This structure is initialized from linux config options.
+**	It can be overridden at boot-up by the boot command line.
+*/
+#define SCSI_NCR_MAX_EXCLUDES 8
+struct ncr_driver_setup {
+	u_char	master_parity;
+	u_char	scsi_parity;
+	u_char	disconnection;
+	u_char	special_features;
+	u_char	ultra_scsi;
+	u_char	force_sync_nego;
+	u_char	reverse_probe;
+	u_char	pci_fix_up;
+	u_char	use_nvram;
+	u_char	verbose;
+	u_char	default_tags;
+	u_short	default_sync;
+	u_short	debug;
+	u_char	burst_max;
+	u_char	led_pin;
+	u_char	max_wide;
+	u_char	settle_delay;
+	u_char	diff_support;
+	u_char	irqm;
+	u_char	bus_check;
+	u_char	optimize;
+	u_char	recovery;
+	u_char	host_id;
+	u_int	excludes[SCSI_NCR_MAX_EXCLUDES];
+	char	tag_ctrl[100];
+};
+
+/*
 **	Initial setup.
 **	Can be overriden at startup by a command line.
 */
@@ -524,7 +571,8 @@
 	0,					\
 	1,					\
 	0,					\
-	0					\
+	0,					\
+	255					\
 }
 
 /*
@@ -555,8 +603,138 @@
 	1,					\
 	1,					\
 	0,					\
-	0					\
+	0,					\
+	255					\
 }
+
+#ifdef SCSI_NCR_NVRAM_SUPPORT
+/*
+**	Symbios NvRAM data format
+*/
+#define SYMBIOS_NVRAM_SIZE 368
+#define SYMBIOS_NVRAM_ADDRESS 0x100
+
+struct Symbios_nvram {
+/* Header 6 bytes */
+	u_short type;		/* 0x0000 */
+	u_short byte_count;	/* excluding header/trailer */
+	u_short checksum;
+
+/* Controller set up 20 bytes */
+	u_char	v_major;	/* 0x00 */
+	u_char	v_minor;	/* 0x30 */
+	u_int32	boot_crc;
+	u_short	flags;
+#define SYMBIOS_SCAM_ENABLE	(1)
+#define SYMBIOS_PARITY_ENABLE	(1<<1)
+#define SYMBIOS_VERBOSE_MSGS	(1<<2)
+#define SYMBIOS_CHS_MAPPING	(1<<3)
+#define SYMBIOS_NO_NVRAM	(1<<3)	/* ??? */
+	u_short	flags1;
+#define SYMBIOS_SCAN_HI_LO	(1)
+	u_short	term_state;
+#define SYMBIOS_TERM_CANT_PROGRAM	(0)
+#define SYMBIOS_TERM_ENABLED		(1)
+#define SYMBIOS_TERM_DISABLED		(2)
+	u_short	rmvbl_flags;
+#define SYMBIOS_RMVBL_NO_SUPPORT	(0)
+#define SYMBIOS_RMVBL_BOOT_DEVICE	(1)
+#define SYMBIOS_RMVBL_MEDIA_INSTALLED	(2)
+	u_char	host_id;
+	u_char	num_hba;	/* 0x04 */
+	u_char	num_devices;	/* 0x10 */
+	u_char	max_scam_devices;	/* 0x04 */
+	u_char	num_valid_scam_devives;	/* 0x00 */
+	u_char	rsvd;
+
+/* Boot order 14 bytes * 4 */
+	struct Symbios_host{
+		u_short	type;		/* 4:8xx / 0:nok */
+		u_short	device_id;	/* PCI device id */
+		u_short	vendor_id;	/* PCI vendor id */
+		u_char	bus_nr;		/* PCI bus number */
+		u_char	device_fn;	/* PCI device/function number << 3*/
+		u_short	word8;
+		u_short	flags;
+#define	SYMBIOS_INIT_SCAN_AT_BOOT	(1)
+		u_short	io_port;	/* PCI io_port address */
+	} host[4];
+
+/* Targets 8 bytes * 16 */
+	struct Symbios_target {
+		u_char	flags;
+#define SYMBIOS_DISCONNECT_ENABLE	(1)
+#define SYMBIOS_SCAN_AT_BOOT_TIME	(1<<1)
+#define SYMBIOS_SCAN_LUNS		(1<<2)
+#define SYMBIOS_QUEUE_TAGS_ENABLED	(1<<3)
+		u_char	rsvd;
+		u_char	bus_width;	/* 0x08/0x10 */
+		u_char	sync_offset;
+		u_short	sync_period;	/* 4*period factor */
+		u_short	timeout;
+	} target[16];
+/* Scam table 8 bytes * 4 */
+	struct Symbios_scam {
+		u_short	id;
+		u_short	method;
+#define SYMBIOS_SCAM_DEFAULT_METHOD	(0)
+#define SYMBIOS_SCAM_DONT_ASSIGN	(1)
+#define SYMBIOS_SCAM_SET_SPECIFIC_ID	(2)
+#define SYMBIOS_SCAM_USE_ORDER_GIVEN	(3)
+		u_short status;
+#define SYMBIOS_SCAM_UNKNOWN		(0)
+#define SYMBIOS_SCAM_DEVICE_NOT_FOUND	(1)
+#define SYMBIOS_SCAM_ID_NOT_SET		(2)
+#define SYMBIOS_SCAM_ID_VALID		(3)
+		u_char	target_id;
+		u_char	rsvd;
+	} scam[4];
+
+	u_char	spare_devices[15*8];
+	u_char	trailer[6];		/* 0xfe 0xfe 0x00 0x00 0x00 0x00 */
+};
+typedef struct Symbios_nvram	Symbios_nvram;
+typedef struct Symbios_host	Symbios_host;
+typedef struct Symbios_target	Symbios_target;
+typedef struct Symbios_scam	Symbios_scam;
+
+/*
+**	Tekram NvRAM data format.
+*/
+#define TEKRAM_NVRAM_SIZE 64
+#define TEKRAM_NVRAM_ADDRESS 0
+
+struct Tekram_nvram {
+	struct Tekram_target {
+		u_char	flags;
+#define	TEKRAM_PARITY_CHECK		(1)
+#define TEKRAM_SYNC_NEGO		(1<<1)
+#define TEKRAM_DISCONNECT_ENABLE	(1<<2)
+#define	TEKRAM_START_CMD		(1<<3)
+#define TEKRAM_TAGGED_COMMANDS		(1<<4)
+#define TEKRAM_WIDE_NEGO		(1<<5)
+		u_char	sync_index;
+		u_short	word2;
+	} target[16];
+	u_char	host_id;
+	u_char	flags;
+#define TEKRAM_MORE_THAN_2_DRIVES	(1)
+#define TEKRAM_DRIVES_SUP_1GB		(1<<1)
+#define	TEKRAM_RESET_ON_POWER_ON	(1<<2)
+#define TEKRAM_ACTIVE_NEGATION		(1<<3)
+#define TEKRAM_IMMEDIATE_SEEK		(1<<4)
+#define	TEKRAM_SCAN_LUNS		(1<<5)
+#define	TEKRAM_REMOVABLE_FLAGS		(3<<6)	/* 0: disable; 1: boot device; 2:all */
+	u_char	boot_delay_index;
+	u_char	max_tags_index;
+	u_short	flags1;
+#define TEKRAM_F2_F6_ENABLED		(1)
+	u_short	spare[29];
+};
+typedef struct Tekram_nvram	Tekram_nvram;
+typedef struct Tekram_target	Tekram_target;
+
+#endif /* SCSI_NCR_NVRAM_SUPPORT */
 
 /**************** ORIGINAL CONTENT of ncrreg.h from FreeBSD ******************/
 
diff -urN linux-2.2.11-pre2/drivers/sound/dmasound.c linux/drivers/sound/dmasound.c
--- linux-2.2.11-pre2/drivers/sound/dmasound.c	Mon Dec  3 18:52:03 2001
+++ linux/drivers/sound/dmasound.c	Mon Dec  3 18:52:26 2001
@@ -784,6 +784,7 @@
 
 struct sound_mixer {
     int busy;
+    int modify_counter;
 };
 
 static struct sound_mixer mixer;
@@ -3811,10 +3812,23 @@
 		       u_long arg)
 {
 	int data;
+	if (_SIOC_DIR(cmd) & _SIOC_WRITE)
+	    mixer.modify_counter++;
+	if (cmd == OSS_GETVERSION)
+	    return IOCTL_OUT(arg, SOUND_VERSION);
 	switch (sound.mach.type) {
 #ifdef CONFIG_ATARI
 	case DMASND_FALCON:
 		switch (cmd) {
+		case SOUND_MIXER_INFO: {
+		    mixer_info info;
+		    strncpy(info.id, "FALCON", sizeof(info.id));
+		    strncpy(info.name, "FALCON", sizeof(info.name));
+		    info.name[sizeof(info.name)-1] = 0;
+		    info.modify_counter = mixer.modify_counter;
+		    copy_to_user_ret((int *)arg, &info, sizeof(info), -EFAULT);
+		    return 0;
+		}
 		case SOUND_MIXER_READ_DEVMASK:
 			return IOCTL_OUT(arg, SOUND_MASK_VOLUME | SOUND_MASK_MIC | SOUND_MASK_SPEAKER);
 		case SOUND_MIXER_READ_RECMASK:
@@ -3866,6 +3880,15 @@
 
 	case DMASND_TT:
 		switch (cmd) {
+		case SOUND_MIXER_INFO: {
+		    mixer_info info;
+		    strncpy(info.id, "TT", sizeof(info.id));
+		    strncpy(info.name, "TT", sizeof(info.name));
+		    info.name[sizeof(info.name)-1] = 0;
+		    info.modify_counter = mixer.modify_counter;
+		    copy_to_user_ret((int *)arg, &info, sizeof(info), -EFAULT);
+		    return 0;
+		}
 		case SOUND_MIXER_READ_DEVMASK:
 			return IOCTL_OUT(arg,
 					 SOUND_MASK_VOLUME | SOUND_MASK_TREBLE | SOUND_MASK_BASS |
@@ -3927,6 +3950,15 @@
 #ifdef CONFIG_AMIGA
 	case DMASND_AMIGA:
 		switch (cmd) {
+		case SOUND_MIXER_INFO: {
+		    mixer_info info;
+		    strncpy(info.id, "AMIGA", sizeof(info.id));
+		    strncpy(info.name, "AMIGA", sizeof(info.name));
+		    info.name[sizeof(info.name)-1] = 0;
+		    info.modify_counter = mixer.modify_counter;
+		    copy_to_user_ret((int *)arg, &info, sizeof(info), -EFAULT);
+		    return 0;
+		}
 		case SOUND_MIXER_READ_DEVMASK:
 			return IOCTL_OUT(arg, SOUND_MASK_VOLUME | SOUND_MASK_TREBLE);
 		case SOUND_MIXER_READ_RECMASK:
@@ -3953,6 +3985,16 @@
 	case DMASND_AWACS:
 		if (awacs_revision<AWACS_BURGUNDY) { /* Different IOCTLS for burgundy*/
 			switch (cmd) {
+			case SOUND_MIXER_INFO: {
+			    mixer_info info;
+			    strncpy(info.id, "AWACS", sizeof(info.id));
+			    strncpy(info.name, "AWACS", sizeof(info.name));
+			    info.name[sizeof(info.name)-1] = 0;
+			    info.modify_counter = mixer.modify_counter;
+			    copy_to_user_ret((int *)arg, &info, 
+					     sizeof(info), -EFAULT);
+			    return 0;
+			}
 			case SOUND_MIXER_READ_DEVMASK:
 				data = SOUND_MASK_VOLUME | SOUND_MASK_SPEAKER
 					| SOUND_MASK_LINE | SOUND_MASK_MIC
@@ -4066,6 +4108,16 @@
 		} else {
 			/* We are, we are, we are... Burgundy or better */
 			switch(cmd) {
+			case SOUND_MIXER_INFO: {
+			    mixer_info info;
+			    strncpy(info.id, "AWACS", sizeof(info.id));
+			    strncpy(info.name, "AWACS", sizeof(info.name));
+			    info.name[sizeof(info.name)-1] = 0;
+			    info.modify_counter = mixer.modify_counter;
+			    copy_to_user_ret((int *)arg, &info, 
+					     sizeof(info), -EFAULT);
+			    return 0;
+			}
 			case SOUND_MIXER_READ_DEVMASK:
 				data = SOUND_MASK_VOLUME | SOUND_MASK_CD |
 					SOUND_MASK_LINE | SOUND_MASK_MIC |
diff -urN linux-2.2.11-pre2/drivers/sound/es1371.c linux/drivers/sound/es1371.c
--- linux-2.2.11-pre2/drivers/sound/es1371.c	Mon Dec  3 18:52:03 2001
+++ linux/drivers/sound/es1371.c	Mon Dec  3 18:52:26 2001
@@ -68,6 +68,8 @@
  *    15.06.99   0.12  Fix bad allocation bug.
  *                     Thanks to Deti Fliegl <fliegl@in.tum.de>
  *    28.06.99   0.13  Add pci_set_master
+ *    21.07.99   0.14  S/PDIF module option for cards revision >= 4. Initial version
+ *                     by Dave Platt <dplatt@snulbug.mtview.ca.us>.
  *
  */
 
@@ -143,6 +145,7 @@
 static const unsigned sample_size[] = { 1, 2, 2, 4 };
 static const unsigned sample_shift[] = { 0, 1, 1, 2 };
 
+#define CTRL_SPDIFEN_B  0x04000000
 #define CTRL_JOY_SHIFT  24
 #define CTRL_JOY_MASK   3
 #define CTRL_JOY_200    0x00000000  /* joystick base address */
@@ -178,6 +181,9 @@
 
 
 #define STAT_INTR       0x80000000  /* wired or of all interrupt bits */
+#define STAT_EN_SPDIF   0x00040000  /* enable S/PDIF circuitry */
+#define STAT_TS_SPDIF   0x00020000  /* test S/PDIF circuitry */
+#define STAT_TESTMODE   0x00010000  /* test ASIC */
 #define STAT_SYNC_ERR   0x00000100  /* 1 = codec sync error */
 #define STAT_VC         0x000000c0  /* CCB int source, 0=DAC1, 1=DAC2, 2=ADC, 3=undef */
 #define STAT_SH_VC      6
@@ -2701,6 +2707,7 @@
 #else
 static int joystick[NR_DEVICE] = { 0, };
 #endif
+static int spdif[NR_DEVICE] = { 0, };
 
 /* --------------------------------------------------------------------- */
 
@@ -2733,6 +2740,8 @@
 	struct pci_dev *pcidev = NULL;
 	mm_segment_t fs;
 	int i, val, val2, index = 0;
+	u8 revision;
+	unsigned cssr;
 
 	if (!pci_present())   /* No PCI bus in this machine! */
 		return -ENODEV;
@@ -2789,6 +2798,18 @@
 			}
 		}
 		s->sctrl = 0;
+		cssr = 0;
+		/* check to see if s/pdif mode is being requested */
+		pci_read_config_byte(pcidev, PCI_REVISION_ID, &revision);
+		if (spdif[index]) {
+			if (revision >= 4) {
+				printk(KERN_INFO "es1371: enabling S/PDIF output\n");
+				cssr |= STAT_EN_SPDIF;
+				s->ctrl |= CTRL_SPDIFEN_B;
+			} else {
+				printk(KERN_ERR "es1371: revision %d does not support S/PDIF\n", revision);
+			}
+		}
 		/* initialize the chips */
 		outl(s->ctrl, s->io+ES1371_REG_CONTROL);
 		outl(s->sctrl, s->io+ES1371_REG_SERIAL_CONTROL);
@@ -2863,6 +2884,8 @@
 			mixer_ioctl(s, initvol[i].mixch, (unsigned long)&val);
 		}
 		set_fs(fs);
+		/* turn on S/PDIF output driver if requested */
+		outl(cssr, s->io+ES1371_REG_STATUS);
 		/* queue it for later freeing */
 		s->next = devs;
 		devs = s;
@@ -2894,6 +2917,8 @@
 
 MODULE_PARM(joystick, "1-" __MODULE_STRING(NR_DEVICE) "i");
 MODULE_PARM_DESC(joystick, "sets address and enables joystick interface (still need separate driver)");
+MODULE_PARM(spdif, "1-" __MODULE_STRING(NR_DEVICE) "i");
+MODULE_PARM_DESC(spdif, "if 1 the output is in S/PDIF digital mode");
 
 MODULE_AUTHOR("Thomas M. Sailer, sailer@ife.ee.ethz.ch, hb9jnx@hb9w.che.eu");
 MODULE_DESCRIPTION("ES1371 AudioPCI97 Driver");
diff -urN linux-2.2.11-pre2/drivers/video/atyfb.c linux/drivers/video/atyfb.c
--- linux-2.2.11-pre2/drivers/video/atyfb.c	Thu Apr 22 19:30:08 1999
+++ linux/drivers/video/atyfb.c	Mon Dec  3 18:52:29 2001
@@ -1,4 +1,4 @@
-/*  $Id: atyfb.c,v 1.106 1999/04/16 11:20:49 geert Exp $
+/*  $Id: atyfb.c,v 1.106.2.2 1999/08/07 10:49:25 davem Exp $
  *  linux/drivers/video/atyfb.c -- Frame buffer device for ATI Mach64
  *
  *	Copyright (C) 1997-1998  Geert Uytterhoeven
@@ -200,6 +200,7 @@
     struct atyfb_par default_par;
     struct atyfb_par current_par;
     u32 total_vram;
+    u32 ref_clk_per;
     u32 pll_per;
     u32 mclk_per;
     u16 chip_type;
@@ -326,9 +327,7 @@
 static void init_engine(const struct atyfb_par *par, struct fb_info_aty *info);
 static void aty_st_514(int offset, u8 val, const struct fb_info_aty *info);
 static void aty_st_pll(int offset, u8 val, const struct fb_info_aty *info);
-#if defined(__sparc__) || defined(DEBUG)
 static u8 aty_ld_pll(int offset, const struct fb_info_aty *info);
-#endif
 static void aty_set_crtc(const struct fb_info_aty *info,
 			 const struct crtc *crtc);
 static int aty_var_to_crtc(const struct fb_info_aty *info,
@@ -341,7 +340,8 @@
 			   const struct pll_gx *pll);
 static int aty_var_to_pll_18818(u32 vclk_per, struct pll_gx *pll);
 static int aty_var_to_pll_514(u32 vclk_per, struct pll_gx *pll);
-static int aty_pll_gx_to_var(const struct pll_gx *pll, u32 *vclk_per);
+static int aty_pll_gx_to_var(const struct pll_gx *pll, u32 *vclk_per,
+			     const struct fb_info_aty *info);
 static void aty_set_pll_ct(const struct fb_info_aty *info,
 			   const struct pll_ct *pll);
 static int aty_dsp_gt(const struct fb_info_aty *info, u8 mclk_fb_div,
@@ -349,7 +349,8 @@
 		      u8 bpp, struct pll_ct *pll);
 static int aty_var_to_pll_ct(const struct fb_info_aty *info, u32 vclk_per,
 			     u8 bpp, struct pll_ct *pll);
-static int aty_pll_ct_to_var(const struct pll_ct *pll, u32 *vclk_per);
+static int aty_pll_ct_to_var(const struct pll_ct *pll, u32 *vclk_per,
+			     const struct fb_info_aty *info);
 static void atyfb_set_par(const struct atyfb_par *par,
 			  struct fb_info_aty *info);
 static int atyfb_decode_var(const struct fb_var_screeninfo *var,
@@ -405,8 +406,6 @@
 static int default_pll __initdata = 0;
 static int default_mclk __initdata = 0;
 
-static const u32 ref_clk_per = 1000000000000ULL/14318180;
-
 #if defined(CONFIG_PPC)
 static int default_vmode __initdata = VMODE_NVRAM;
 static int default_cmode __initdata = CMODE_NVRAM;
@@ -474,7 +473,7 @@
 
 #if defined(__powerpc__)
     temp = info->ati_regbase;
-    asm("lwbrx %0,%1,%2" : "=r"(val) : "r" (regindex), "r" (temp));
+    asm("lwbrx %0,%1,%2" : "=r"(val) : "b" (regindex), "r" (temp));
 #elif defined(__sparc_v9__)
     temp = info->ati_regbase + regindex;
     asm("lduwa [%1] %2, %0" : "=r" (val) : "r" (temp), "i" (ASI_PL));
@@ -492,7 +491,7 @@
 
 #if defined(__powerpc__)
     temp = info->ati_regbase;
-    asm("stwbrx %0,%1,%2" : : "r" (val), "r" (regindex), "r" (temp) :
+    asm("stwbrx %0,%1,%2" : : "r" (val), "b" (regindex), "r" (temp) :
 	"memory");
 #elif defined(__sparc_v9__)
     temp = info->ati_regbase + regindex;
@@ -689,7 +688,6 @@
     aty_st_8(CLOCK_CNTL + 1, (offset << 2) & ~PLL_WR_EN, info);
 }
 
-#if defined(__sparc__) || defined(DEBUG)
 static u8 aty_ld_pll(int offset, const struct fb_info_aty *info)
 {
     u8 res;
@@ -702,7 +700,6 @@
     eieio();
     return res;
 }
-#endif
 
 #if defined(CONFIG_PPC)
 
@@ -1455,7 +1452,8 @@
 
     /* FIXME: ATI18818?? */
 
-static int aty_pll_gx_to_var(const struct pll_gx *pll, u32 *vclk_per)
+static int aty_pll_gx_to_var(const struct pll_gx *pll, u32 *vclk_per,
+			     const struct fb_info_aty *info)
 {
     u8 df, vco_div_count, ref_div_count;
 
@@ -1463,7 +1461,7 @@
     vco_div_count = pll->m & 0x3f;
     ref_div_count = pll->n;
 
-    *vclk_per = ((ref_clk_per*ref_div_count)<<(3-df))/(vco_div_count+65);
+    *vclk_per = ((info->ref_clk_per*ref_div_count)<<(3-df))/(vco_div_count+65);
 
     return 0;
 }
@@ -1526,7 +1524,7 @@
     }
     dsp_precision -= 5;
     /* fifo_off<<6 */
-    fifo_off = ((xclks_per_row*(fifo_size-1))>>5)+(1<<6);
+    fifo_off = ((xclks_per_row*(fifo_size-1))>>5)+(3<<6);
 
     if (info->total_vram > 1*1024*1024) {
 	if (info->ram_type >= SDRAM) {
@@ -1553,7 +1551,7 @@
     if (xclks_per_row >= (page_size<<11))
 	fifo_on = ((2*page_size+1)<<6)+(xclks_per_row>>5);
     else
-	fifo_on = (3*page_size)<<6;
+	fifo_on = (3*page_size+2)<<6;
 
     dsp_xclks_per_row = xclks_per_row>>dsp_precision;
     dsp_on = fifo_on>>dsp_precision;
@@ -1579,10 +1577,10 @@
 
     pll->pll_vclk_cntl = 0x03;	/* VCLK = PLL_VCLK/VCLKx_POST */
 
-    pll_ref_div = info->pll_per*2*255/ref_clk_per;
+    pll_ref_div = info->pll_per*2*255/info->ref_clk_per;
 
     /* FIXME: use the VTB/GTB /3 post divider if it's better suited */
-    q = ref_clk_per*pll_ref_div*4/info->mclk_per;	/* actually 8*q */
+    q = info->ref_clk_per*pll_ref_div*4/info->mclk_per;	/* actually 8*q */
     if (q < 16*8 || q > 255*8)
 	FAIL("mclk out of range");
     else if (q < 32*8)
@@ -1596,7 +1594,7 @@
     mclk_fb_div = q*mclk_post_div/8;
 
     /* FIXME: use the VTB/GTB /{3,6,12} post dividers if they're better suited */
-    q = ref_clk_per*pll_ref_div*4/vclk_per;	/* actually 8*q */
+    q = info->ref_clk_per*pll_ref_div*4/vclk_per;	/* actually 8*q */
     if (q < 16*8 || q > 255*8)
 	FAIL("vclk out of range");
     else if (q < 32*8)
@@ -1677,7 +1675,8 @@
     return 0;
 }
 
-static int aty_pll_ct_to_var(const struct pll_ct *pll, u32 *vclk_per)
+static int aty_pll_ct_to_var(const struct pll_ct *pll, u32 *vclk_per,
+			     const struct fb_info_aty *info)
 {
     u8 pll_ref_div = pll->pll_ref_div;
     u8 vclk_fb_div = pll->vclk_fb_div;
@@ -1691,7 +1690,7 @@
 				    (vclk_post_div & 3)];
     if (vpostdiv == 0)
 	return -EINVAL;
-    *vclk_per = pll_ref_div*vpostdiv*ref_clk_per/vclk_fb_div/2;
+    *vclk_per = pll_ref_div*vpostdiv*info->ref_clk_per/vclk_fb_div/2;
     return 0;
 }
 
@@ -1845,9 +1844,9 @@
     if ((err = aty_crtc_to_var(&par->crtc, var)))
 	return err;
     if ((Gx == GX_CHIP_ID) || (Gx == CX_CHIP_ID))
-	err = aty_pll_gx_to_var(&par->pll.gx, &var->pixclock);
+	err = aty_pll_gx_to_var(&par->pll.gx, &var->pixclock, info);
     else
-	err = aty_pll_ct_to_var(&par->pll.ct, &var->pixclock);
+	err = aty_pll_ct_to_var(&par->pll.ct, &var->pixclock, info);
     if (err)
 	return err;
 
@@ -2432,11 +2431,12 @@
     int j, k;
     struct fb_var_screeninfo var;
     struct display *disp;
-    const char *chipname = NULL, *ramname = NULL;
+    const char *chipname = NULL, *ramname = NULL, *xtal;
     int pll, mclk, gtb_memsize;
 #if defined(CONFIG_PPC)
     int sense;
 #endif
+    u8 pll_ref_div;
 
     info->aty_cmap_regs = (struct aty_cmap_regs *)(info->ati_regbase+0xc0);
     chip_id = aty_ld_le32(CONFIG_CHIP_ID, info);
@@ -2524,6 +2524,25 @@
 	}
     }
 
+    info->ref_clk_per = 1000000000000ULL/14318180;
+    xtal = "14.31818";
+    if (!(Gx == GX_CHIP_ID || Gx == CX_CHIP_ID || Gx == CT_CHIP_ID ||
+	  Gx == ET_CHIP_ID ||
+	  ((Gx == VT_CHIP_ID || Gx == GT_CHIP_ID) && !(Rev & 0x07))) &&
+	(pll_ref_div = aty_ld_pll(PLL_REF_DIV, info))) {
+	int diff1, diff2;
+	diff1 = 510*14/pll_ref_div-pll;
+	diff2 = 510*29/pll_ref_div-pll;
+	if (diff1 < 0)
+	    diff1 = -diff1;
+	if (diff2 < 0)
+	    diff2 = -diff2;
+	if (diff2 < diff1) {
+	    info->ref_clk_per = 1000000000000ULL/29498928;
+	    xtal = "29.498928";
+	}
+    }
+
     i = aty_ld_le32(MEM_CNTL, info);
     gtb_memsize = !(Gx == GX_CHIP_ID || Gx == CX_CHIP_ID || Gx == CT_CHIP_ID ||
 		    Gx == ET_CHIP_ID ||
@@ -2602,9 +2621,9 @@
     if (default_mclk)
 	mclk = default_mclk;
 
-    printk("%d%c %s, %d MHz PLL, %d Mhz MCLK\n", 
+    printk("%d%c %s, %s MHz XTAL, %d MHz PLL, %d Mhz MCLK\n", 
     	   info->total_vram == 0x80000 ? 512 : (info->total_vram >> 20), 
-    	   info->total_vram == 0x80000 ? 'K' : 'M', ramname, pll, mclk);
+    	   info->total_vram == 0x80000 ? 'K' : 'M', ramname, xtal, pll, mclk);
 
     if (mclk < 44)
 	info->mem_refresh_rate = 0;	/* 000 = 10 Mhz - 43 Mhz */
diff -urN linux-2.2.11-pre2/drivers/video/controlfb.c linux/drivers/video/controlfb.c
--- linux-2.2.11-pre2/drivers/video/controlfb.c	Thu Feb 25 10:02:11 1999
+++ linux/drivers/video/controlfb.c	Mon Dec  3 18:52:29 2001
@@ -720,9 +720,11 @@
 	p->total_vram = (bank1 + bank2) * 0x200000;
 	/* If we don't have bank 1 installed, we hope we have bank 2 :-) */
 	p->control_use_bank2 = !bank1;
-	if (p->control_use_bank2)
+	if (p->control_use_bank2) {
 		p->frame_buffer += 0x600000;
-
+		p->frame_buffer_phys += 0x600000;
+	}
+	
 	init_control(p);
 }
 
diff -urN linux-2.2.11-pre2/drivers/video/imsttfb.c linux/drivers/video/imsttfb.c
--- linux-2.2.11-pre2/drivers/video/imsttfb.c	Mon Dec 21 14:48:04 1998
+++ linux/drivers/video/imsttfb.c	Mon Dec  3 18:52:29 2001
@@ -1079,7 +1079,7 @@
 	out_le32(&p->dc_regs[BI], 0xffffffff);
 	out_le32(&p->dc_regs[MBC], 0xffffffff);
 	out_le32(&p->dc_regs[CLR], bgc);
-	out_le32(&p->dc_regs[BLTCTL], 0x200000);
+	out_le32(&p->dc_regs[BLTCTL], 0x840); /* 0x200000 */
 	while(in_le32(&p->dc_regs[SSTATUS]) & 0x80);
 	while(in_le32(&p->dc_regs[SSTATUS]) & 0x40);
 }
diff -urN linux-2.2.11-pre2/drivers/video/platinumfb.c linux/drivers/video/platinumfb.c
--- linux-2.2.11-pre2/drivers/video/platinumfb.c	Thu Oct  1 10:02:21 1998
+++ linux/drivers/video/platinumfb.c	Mon Dec  3 18:52:29 2001
@@ -10,7 +10,7 @@
  *
  *  Hardware information from:
  *    platinum.c: Console support for PowerMac "platinum" display adaptor.
- *    Copyright (C) 1996 Paul Mackerras
+ *    Copyright (C) 1996 Paul Mackerras and Mark Abene
  *
  *  This file is subject to the terms and conditions of the GNU General Public
  *  License. See the file COPYING in the main directory of this archive for
@@ -66,6 +66,7 @@
 struct fb_info_platinum {
 	struct fb_info			fb_info;
 	struct display			disp;
+	struct display_switch		dispsw;
 	struct fb_par_platinum		default_par;
 	struct fb_par_platinum		current_par;
 
@@ -145,6 +146,8 @@
 static int platinum_encode_fix(struct fb_fix_screeninfo *fix,
 			       const struct fb_par_platinum *par,
 			       const struct fb_info_platinum *info);
+static void platinum_set_disp(struct display *disp, struct fb_info_platinum *info,
+			      int cmode, int accel);
 static int platinum_getcolreg(u_int regno, u_int *red, u_int *green, u_int *blue,
 			      u_int *transp, struct fb_info *fb);
 static int platinum_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
@@ -219,6 +222,36 @@
 	return 0;
 }
 
+static void platinum_set_disp(struct display *disp, struct fb_info_platinum *info,
+			      int cmode, int accel)
+{
+	switch(cmode) {
+#ifdef FBCON_HAS_CFB8
+	    case CMODE_8:
+		info->dispsw = fbcon_cfb8;
+		disp->dispsw = &info->dispsw;
+		break;
+#endif
+#ifdef FBCON_HAS_CFB16
+	    case CMODE_16:
+		info->dispsw = fbcon_cfb16;
+		disp->dispsw = &info->dispsw;
+		disp->dispsw_data = info->fbcon_cmap.cfb16;
+		break;
+#endif
+#ifdef FBCON_HAS_CFB32
+	    case CMODE_32:
+		info->dispsw = fbcon_cfb32;
+		disp->dispsw = &info->dispsw;
+		disp->dispsw_data = info->fbcon_cmap.cfb32;
+		break;
+#endif
+	    default:
+		disp->dispsw = &fbcon_dummy;
+		break;
+	}
+}
+
 static int platinum_set_var(struct fb_var_screeninfo *var, int con,
 			    struct fb_info *fb)
 {
@@ -227,6 +260,7 @@
 	struct display *display;
 	int oldxres, oldyres, oldvxres, oldvyres, oldbpp, err;
 	int activate = var->activate;
+	struct platinum_regvals *init;
 
 	display = (con >= 0) ? &fb_display[con] : fb->disp;
 
@@ -242,6 +276,8 @@
 		return 0;
 	}
 
+	init = platinum_reg_init[par.vmode-1];
+
 	oldxres = display->var.xres;
 	oldyres = display->var.yres;
 	oldvxres = display->var.xres_virtual;
@@ -255,7 +291,7 @@
 	    struct fb_fix_screeninfo fix;
 
 	    platinum_encode_fix(&fix, &par, info);
-	    display->screen_base = (char *) info->frame_buffer + 0x1000;
+	    display->screen_base = (char *) info->frame_buffer + init->fb_offset + 0x20;
 	    display->visual = fix.visual;
 	    display->type = fix.type;
 	    display->type_aux = fix.type_aux;
@@ -264,36 +300,14 @@
 	    display->line_length = fix.line_length;
 	    display->can_soft_blank = 1;
 	    display->inverse = 0;
-
-	    switch(par.cmode) {
-#ifdef FBCON_HAS_CFB8
-	     case CMODE_8:
-		display->dispsw = &fbcon_cfb8;
-		break;
-#endif
-#ifdef FBCON_HAS_CFB16
-	     case CMODE_16:
-		display->dispsw = &fbcon_cfb16;
-		display->dispsw_data = info->fbcon_cmap.cfb16;
-		break;
-#endif
-#ifdef FBCON_HAS_CFB32
-	     case CMODE_32:
-		display->dispsw = &fbcon_cfb32;
-		display->dispsw_data = info->fbcon_cmap.cfb32;
-		break;
-#endif
-	     default:
-		display->dispsw = &fbcon_dummy;
-		break;
-	    }
-	    
+	    platinum_set_disp(display, info, par.cmode, 0);
 	    display->scrollmode = SCROLL_YREDRAW;
 	    if (info->fb_info.changevar)
 	      (*info->fb_info.changevar)(con);
 	}
 
-	if (con == currcon)
+	if (!info->fb_info.display_fg ||
+	    info->fb_info.display_fg->vc_num == con)
 		platinum_set_par(&par, info);
 
 	if (oldbpp != var->bits_per_pixel) {
@@ -322,7 +336,8 @@
 static int platinum_get_cmap(struct fb_cmap *cmap, int kspc, int con,
 			     struct fb_info *info)
 {
-	if (con == currcon)		/* current console? */
+	if (!info->display_fg ||
+	    info->display_fg->vc_num == con)	/* current console? */
 		return fb_get_cmap(cmap, kspc, platinum_getcolreg, info);
 	if (fb_display[con].cmap.len)	/* non default colormap? */
 		fb_copy_cmap(&fb_display[con].cmap, cmap, kspc ? 0 : 2);
@@ -337,17 +352,23 @@
 			     struct fb_info *info)
 {
 	int err;
+	struct display *disp;
 
-	if (!fb_display[con].cmap.len) {
-		int size = fb_display[con].var.bits_per_pixel == 16 ? 32 : 256;
-		err = fb_alloc_cmap(&fb_display[con].cmap, size, 0);
-		if (err)
+	if (con >= 0)
+		disp = &fb_display[con];
+	else
+		disp = info->disp;
+	if (!disp->cmap.len) {     /* no colormap allocated? */
+		int size = disp->var.bits_per_pixel == 16 ? 32 : 256;
+		if ((err = fb_alloc_cmap(&disp->cmap, size, 0)))
 			return err;
 	}
 
-	if (con == currcon)
+	if (!info->display_fg ||
+	    info->display_fg->vc_num == con)	/* current console? */
 		return fb_set_cmap(cmap, kspc, platinum_setcolreg, info);
-	fb_copy_cmap(cmap, &fb_display[con].cmap, kspc ? 0 : 1);
+	else
+		fb_copy_cmap(cmap, &disp->cmap, kspc ? 0 : 1);
 	return 0;
 }
 
@@ -368,8 +389,9 @@
 			    fb);
 	currcon = con;
 
-	platinum_var_to_par(&fb_display[currcon].var, &par, info);
+	platinum_var_to_par(&fb_display[con].var, &par, info);
 	platinum_set_par(&par, info);
+	platinum_set_disp(&fb_display[con], info, par.cmode, 0);
 	do_install_cmap(con, fb);
 
 	return 1;
@@ -431,7 +453,6 @@
 {
 	struct fb_info_platinum *info = (struct fb_info_platinum *) fb;
 	volatile struct cmap_regs *cmap_regs = info->cmap_regs;
-	int scale;
 
 	if (regno > 255)
 		return 1;
@@ -444,12 +465,10 @@
 	info->palette[regno].green = green;
 	info->palette[regno].blue = blue;
 
-	scale = (info->current_par.cmode == CMODE_16) ? 3 : 0;
-
 	out_8(&cmap_regs->addr, regno);		/* tell clut what addr to fill	*/
-	out_8(&cmap_regs->lut, red<<scale);	/* send one color channel at	*/
-	out_8(&cmap_regs->lut, green<<scale);	/* a time...			*/
-	out_8(&cmap_regs->lut, blue<<scale);
+	out_8(&cmap_regs->lut, red);		/* send one color channel at	*/
+	out_8(&cmap_regs->lut, green);		/* a time...			*/
+	out_8(&cmap_regs->lut, blue);
 
 	if(regno < 16) {
 #ifdef FBCON_HAS_CFB16
@@ -538,7 +557,7 @@
 	out_be32(&platinum_regs->reg[26+32].r, (info->total_vram == 0x100000 ?
 						init->offset[cmode] + 4 - cmode :
 						init->offset[cmode]));
-	out_be32(&platinum_regs->reg[16].r, (unsigned) info->frame_buffer_phys + 0x1000 - 0x10);
+	out_be32(&platinum_regs->reg[16].r, (unsigned) info->frame_buffer_phys+init->fb_offset+0x10);
 	out_be32(&platinum_regs->reg[18].r, init->pitch[cmode]);
 	out_be32(&platinum_regs->reg[19].r, (info->total_vram == 0x100000 ?
 					     init->mode[cmode+1] :
@@ -571,7 +590,7 @@
 		display_info.mode = vmode;
 		strncpy(display_info.name, "platinum",
 			sizeof(display_info.name));
-		display_info.fb_address = info->frame_buffer_phys + 0x1000;
+		display_info.fb_address = info->frame_buffer_phys + init->fb_offset + 0x20;
 		display_info.cmap_adr_address = info->cmap_regs_phys;
 		display_info.cmap_data_address = info->cmap_regs_phys + 0x30;
 		display_info.disp_reg_address = info->platinum_regs_phys;
@@ -664,7 +683,7 @@
 
 #ifdef __powerpc__
 #define invalidate_cache(addr) \
-	asm volatile("eieio; dcbi 0,%1" \
+	asm volatile("eieio; dcbf 0,%1" \
 	: "=m" (*(addr)) : "r" (addr) : "memory");
 #else
 #define invalidate_cache(addr)
@@ -674,6 +693,7 @@
 {
 	struct fb_info_platinum	*info;
 	unsigned long		addr, size;
+	volatile __u8		*fbuffer;
 	int			i, bank0, bank1, bank2, bank3;
 
 	if(dp->n_addrs != 2)
@@ -708,19 +728,20 @@
 	out_be32(&info->platinum_regs->reg[20].r, 0x1011);	/* select max vram */
 	out_be32(&info->platinum_regs->reg[24].r, 0);	/* switch in vram */
 
-	info->base_frame_buffer[0x100000] = 0x34;
-	info->base_frame_buffer[0x100008] = 0x0;
-	invalidate_cache(&info->base_frame_buffer[0x100000]);
-	info->base_frame_buffer[0x200000] = 0x56;
-	info->base_frame_buffer[0x200008] = 0x0;
-	invalidate_cache(&info->base_frame_buffer[0x200000]);
-	info->base_frame_buffer[0x300000] = 0x78;
-	info->base_frame_buffer[0x300008] = 0x0;
-	invalidate_cache(&info->base_frame_buffer[0x300000]);
+	fbuffer = info->base_frame_buffer;
+	fbuffer[0x100000] = 0x34;
+	fbuffer[0x100008] = 0x0;
+	invalidate_cache(&fbuffer[0x100000]);
+	fbuffer[0x200000] = 0x56;
+	fbuffer[0x200008] = 0x0;
+	invalidate_cache(&fbuffer[0x200000]);
+	fbuffer[0x300000] = 0x78;
+	fbuffer[0x300008] = 0x0;
+	invalidate_cache(&fbuffer[0x300000]);
 	bank0 = 1; /* builtin 1MB vram, always there */
-	bank1 = info->base_frame_buffer[0x100000] == 0x34;
-	bank2 = info->base_frame_buffer[0x200000] == 0x56;
-	bank3 = info->base_frame_buffer[0x300000] == 0x78;
+	bank1 = fbuffer[0x100000] == 0x34;
+	bank2 = fbuffer[0x200000] == 0x56;
+	bank3 = fbuffer[0x300000] == 0x78;
 	info->total_vram = (bank0 + bank1 + bank2 + bank3) * 0x100000;
 	printk(KERN_INFO "Total VRAM = %dMB %d%d%d%d\n", (int) (info->total_vram / 1024 / 1024), bank3, bank2, bank1, bank0);
 
@@ -832,10 +853,14 @@
 			       const struct fb_par_platinum *par,
 			       const struct fb_info_platinum *info)
 {
+	struct platinum_regvals *init;
+
+	init = platinum_reg_init[par->vmode-1];
+
 	memset(fix, 0, sizeof(*fix));
 	strcpy(fix->id, "platinum");
-	fix->smem_start = (void *) (info->frame_buffer_phys + 0x1000);
-	fix->smem_len = (u32) info->total_vram - 0x1000;
+	fix->smem_start = (void *) (info->frame_buffer_phys) + init->fb_offset + 0x20;
+	fix->smem_len = (u32) info->total_vram;
 	fix->mmio_start = (char *) (info->platinum_regs_phys);
 	fix->mmio_len = 0x1000;
 	fix->type = FB_TYPE_PACKED_PIXELS;
@@ -881,6 +906,7 @@
 		} else if (!strncmp(this_opt, "cmode:", 6)) {
 			int depth = simple_strtoul(this_opt+6, NULL, 0);
 			switch (depth) {
+			 case 0:
 			 case 8:
 			    default_cmode = CMODE_8;
 			    break;
diff -urN linux-2.2.11-pre2/fs/coda/cache.c linux/fs/coda/cache.c
--- linux-2.2.11-pre2/fs/coda/cache.c	Mon Dec  3 18:52:04 2001
+++ linux/fs/coda/cache.c	Mon Dec  3 18:52:29 2001
@@ -65,7 +65,7 @@
         if ( ! list_empty(&el->cc_cclist) )
 	        list_del(&el->cc_cclist);
 	else
-		printk("coda_cnremove: loose cc entry!");
+		printk("coda_ccremove: loose cc entry!");
 }
 
 /* remove a cache entry from the inode's list */
@@ -139,7 +139,7 @@
 /* remove all cached acl matches from an inode */
 void coda_cache_clear_inode(struct inode *inode)
 {
-	struct list_head *lh, *le;
+	struct list_head *le;
 	struct coda_inode_info *cii;
 	struct coda_cache *cc;
 	ENTRY;
@@ -150,9 +150,10 @@
 	}
 	cii = ITOC(inode);
 	
-	lh = le = &cii->c_cnhead;
-	while ( (le = le->next ) != lh ) {
+	le = cii->c_cnhead.next;
+	while ( le != &cii->c_cnhead ) {
 		cc = list_entry(le, struct coda_cache, cc_cnlist);
+		le = le->next;
 		coda_cnremove(cc);
 		coda_ccremove(cc);
 		CODA_FREE(cc, sizeof(*cc));
@@ -162,7 +163,7 @@
 /* remove all acl caches */
 void coda_cache_clear_all(struct super_block *sb)
 {
-	struct list_head *lh, *le;
+	struct list_head *le;
 	struct coda_cache *cc;
 	struct coda_sb_info *sbi = coda_sbp(sb);
 
@@ -174,9 +175,10 @@
 	if ( list_empty(&sbi->sbi_cchead) )
 		return;
 
-	lh = le = &sbi->sbi_cchead;
-	while ( (le = le->next ) != lh ) {
+	le = sbi->sbi_cchead.next;
+	while ( le != &sbi->sbi_cchead ) {
 		cc = list_entry(le, struct coda_cache, cc_cclist);
+		le = le->next;
 		coda_cnremove(cc);
 		coda_ccremove(cc);
 		CODA_FREE(cc, sizeof(*cc));
@@ -186,7 +188,7 @@
 /* remove all acl caches for a principal */
 void coda_cache_clear_cred(struct super_block *sb, struct coda_cred *cred)
 {
-	struct list_head *lh, *le;
+	struct list_head *le;
 	struct coda_cache *cc;
 	struct coda_sb_info *sbi = coda_sbp(sb);
 
@@ -198,9 +200,10 @@
 	if (list_empty(&sbi->sbi_cchead))
 		return;
 
-	lh = le = &sbi->sbi_cchead;
-	while ( (le = le->next ) != lh ) {
+	le = sbi->sbi_cchead.next;
+	while ( le != &sbi->sbi_cchead ) {
 		cc = list_entry(le, struct coda_cache, cc_cclist);
+		le = le->next;
 		if ( coda_cred_eq(&cc->cc_cred, cred)) {
 			coda_cnremove(cc);
 			coda_ccremove(cc);
diff -urN linux-2.2.11-pre2/fs/coda/cnode.c linux/fs/coda/cnode.c
--- linux-2.2.11-pre2/fs/coda/cnode.c	Mon Dec  3 18:52:04 2001
+++ linux/fs/coda/cnode.c	Mon Dec  3 18:52:29 2001
@@ -120,10 +120,10 @@
 	if ( coda_f2i(fid) != ino ) {
 	        if ( !coda_fid_is_weird(fid) ) 
 		        printk("Coda: unknown weird fid: ino %ld, fid %s."
-			       "Tell Peter.\n", ino, coda_f2s(&cnp->c_fid));
+			       "Tell Peter.\n", (long)ino, coda_f2s(&cnp->c_fid));
 		list_add(&cnp->c_volrootlist, &sbi->sbi_volroothead);
 		CDEBUG(D_UPCALL, "Added %ld ,%s to volroothead\n",
-		       ino, coda_f2s(&cnp->c_fid));
+		       (long)ino, coda_f2s(&cnp->c_fid));
 	}
 
         coda_fill_inode(*inode, &attr);
@@ -211,7 +211,7 @@
 	inode = iget(sb, nr);
 	if ( !inode ) {
 		printk("coda_fid_to_inode: null from iget, sb %p, nr %ld.\n",
-		       sb, nr);
+		       sb, (long)nr);
 		return NULL;
 	}
 
diff -urN linux-2.2.11-pre2/fs/coda/dir.c linux/fs/coda/dir.c
--- linux-2.2.11-pre2/fs/coda/dir.c	Mon Dec  3 18:52:04 2001
+++ linux/fs/coda/dir.c	Mon Dec  3 18:52:29 2001
@@ -124,12 +124,12 @@
 
 	if ( length > CODA_MAXNAMLEN ) {
 	        printk("name too long: lookup, %s (%*s)\n", 
-		       coda_f2s(&dircnp->c_fid), length, name);
+		       coda_f2s(&dircnp->c_fid), (int)length, name);
 		return ERR_PTR(-ENAMETOOLONG);
 	}
 
-        CDEBUG(D_INODE, "name %s, len %d in ino %ld, fid %s\n", 
-	       name, length, dir->i_ino, coda_f2s(&dircnp->c_fid));
+        CDEBUG(D_INODE, "name %s, len %ld in ino %ld, fid %s\n", 
+	       name, (long)length, dir->i_ino, coda_f2s(&dircnp->c_fid));
 
         /* control object, create inode on the fly */
         if (coda_isroot(dir) && coda_iscontrol(name, length)) {
@@ -156,7 +156,7 @@
 			return ERR_PTR(error);
 	} else if (error != -ENOENT) {
 	        CDEBUG(D_INODE, "error for %s(%*s)%d\n",
-		       coda_f2s(&dircnp->c_fid), length, name, error);
+		       coda_f2s(&dircnp->c_fid), (int)length, name, error);
 		return ERR_PTR(error);
 	}
 	CDEBUG(D_INODE, "lookup: %s is (%s), type %d result %d, dropme %d\n",
@@ -503,10 +503,10 @@
         old_cnp = ITOC(old_dir);
         new_cnp = ITOC(new_dir);
 
-        CDEBUG(D_INODE, "old: %s, (%d length, %d strlen), new: %s"
-	       "(%d length, %d strlen).old:d_count: %d, new:d_count: %d\n", 
-	       old_name, old_length, strlen(old_name), new_name, new_length, 
-	       strlen(new_name),old_dentry->d_count, new_dentry->d_count);
+        CDEBUG(D_INODE, "old: %s, (%d length, %ld strlen), new: %s"
+	       "(%d length, %ld strlen).old:d_count: %d, new:d_count: %d\n", 
+	       old_name, old_length, (long)strlen(old_name), new_name, new_length, 
+	       (long)strlen(new_name),old_dentry->d_count, new_dentry->d_count);
 
 	/* the C library will do unlink/create etc */
 	if ( coda_crossvol_rename == 0 && 
@@ -593,12 +593,12 @@
 	error = venus_open(i->i_sb, &(cnp->c_fid), coda_flags, &ino, &dev); 
 	if (error) {
 	        CDEBUG(D_FILE, "venus: dev %d, inode %ld, out->result %d\n",
-		       dev, ino, error);
+		       dev, (long)ino, error);
 		return error;
 	}
 
         /* coda_upcall returns ino number of cached object, get inode */
-        CDEBUG(D_FILE, "cache file dev %d, ino %ld\n", dev, ino);
+        CDEBUG(D_FILE, "cache file dev %d, ino %ld\n", dev, (long)ino);
 	error = coda_inode_grab(dev, ino, &cont_inode);
 	
 	if ( error || !cont_inode ){
@@ -621,9 +621,9 @@
 
         CDEBUG(D_FILE, "result %d, coda i->i_count is %d for ino %ld\n", 
 	       error, i->i_count, i->i_ino);
-        CDEBUG(D_FILE, "cache ino: %ld, count %d, ops %x\n", 
+        CDEBUG(D_FILE, "cache ino: %ld, count %d, ops %p\n", 
 	       cnp->c_ovp->i_ino, cnp->c_ovp->i_count,
-	       (int)(cnp->c_ovp->i_op));
+	       (cnp->c_ovp->i_op));
         EXIT;
         return 0;
 }
diff -urN linux-2.2.11-pre2/fs/coda/file.c linux/fs/coda/file.c
--- linux-2.2.11-pre2/fs/coda/file.c	Mon Aug 31 15:46:10 1998
+++ linux/fs/coda/file.c	Mon Dec  3 18:52:29 2001
@@ -155,8 +155,8 @@
         result = cont_file.f_op->read(&cont_file , buff, count, 
 				      &(cont_file.f_pos));
 
-        CDEBUG(D_FILE, "ops at %x result %d, count %d, position: %d\n", 
-	       (int)cont_file.f_op, result, count, (int)cont_file.f_pos);
+        CDEBUG(D_FILE, "ops at %p result %d, count %ld, position: %d\n", 
+	       cont_file.f_op, result, (long)count, (int)cont_file.f_pos);
 
         coda_restore_codafile(coda_inode, coda_file, cont_inode, &cont_file);
         return result;
@@ -292,10 +292,10 @@
 
         if ( *ind == NULL ) {
                 printk("coda_inode_grab: iget(dev: %d, ino: %ld) 
-                       returns NULL.\n", dev, ino);
+                       returns NULL.\n", dev, (long)ino);
                 return -ENOENT;
         }
-	CDEBUG(D_FILE, "ino: %ld, ops at %x\n", ino, (int)(*ind)->i_op);
+	CDEBUG(D_FILE, "ino: %ld, ops at %p\n", (long)ino, (*ind)->i_op);
         return 0;
 }
 
diff -urN linux-2.2.11-pre2/fs/coda/inode.c linux/fs/coda/inode.c
--- linux-2.2.11-pre2/fs/coda/inode.c	Mon Dec  3 18:52:04 2001
+++ linux/fs/coda/inode.c	Mon Dec  3 18:52:29 2001
@@ -205,7 +205,7 @@
 	
 	coda_cache_clear_inode(inode);
 	CDEBUG(D_DOWNCALL, "clearing inode: %ld, %x\n", inode->i_ino, cii->c_flags);
-	inode->u.generic_ip = NULL;
+	inode->u.coda_i.c_magic = 0;
         clear_inode(inode);
 	EXIT;
 }
diff -urN linux-2.2.11-pre2/fs/coda/psdev.c linux/fs/coda/psdev.c
--- linux-2.2.11-pre2/fs/coda/psdev.c	Wed Jun  2 11:29:28 1999
+++ linux/fs/coda/psdev.c	Mon Dec  3 18:52:29 2001
@@ -98,8 +98,8 @@
 	if (copy_from_user(&hdr, buf, 2 * sizeof(u_long)))
 	        return -EFAULT;
 
-	CDEBUG(D_PSDEV, "(process,opc,uniq)=(%d,%ld,%ld), count %d\n", 
-	       current->pid, hdr.opcode, hdr.unique, count);
+	CDEBUG(D_PSDEV, "(process,opc,uniq)=(%d,%ld,%ld), count %ld\n", 
+	       current->pid, hdr.opcode, hdr.unique, (long)count);
 
         if (DOWNCALL(hdr.opcode)) {
 		struct super_block *sb = NULL;
@@ -160,8 +160,8 @@
 
         /* move data into response buffer. */
         if (req->uc_outSize < count) {
-                printk("psdev_write: too much cnt: %d, cnt: %d, opc: %ld, uniq: %ld.\n",
-		       req->uc_outSize, count, hdr.opcode, hdr.unique);
+                printk("psdev_write: too much cnt: %d, cnt: %ld, opc: %ld, uniq: %ld.\n",
+		       req->uc_outSize, (long)count, hdr.opcode, hdr.unique);
 		count = req->uc_outSize; /* don't have more space! */
 	}
         if (copy_from_user(req->uc_data, buf, count))
@@ -172,8 +172,8 @@
         req->uc_flags |= REQ_WRITE;
 
 	CDEBUG(D_PSDEV, 
-	       "Found! Count %d for (opc,uniq)=(%ld,%ld), upc_req at %x\n", 
-	        count, hdr.opcode, hdr.unique, (int)&req);
+	       "Found! Count %ld for (opc,uniq)=(%ld,%ld), upc_req at %p\n", 
+	        (long)count, hdr.opcode, hdr.unique, &req);
 
         wake_up(&req->uc_sleep);
         return(count);  
@@ -190,7 +190,7 @@
         struct upc_req *req;
 	int result = count ;
 
-        CDEBUG(D_PSDEV, "count %d\n", count);
+        CDEBUG(D_PSDEV, "count %ld\n", (long)count);
         if (list_empty(&(vcp->vc_pending))) {
               return -1;	
         }
@@ -203,8 +203,8 @@
               result = req->uc_inSize;
 
         if (count < req->uc_inSize) {
-                printk ("psdev_read: Venus read %d bytes of %d in message\n",
-			count, req->uc_inSize);
+                printk ("psdev_read: Venus read %ld bytes of %d in message\n",
+			(long)count, req->uc_inSize);
         }
 
         if ( copy_to_user(buf, req->uc_data, result))
diff -urN linux-2.2.11-pre2/fs/coda/upcall.c linux/fs/coda/upcall.c
--- linux-2.2.11-pre2/fs/coda/upcall.c	Mon Dec  3 18:52:04 2001
+++ linux/fs/coda/upcall.c	Mon Dec  3 18:52:29 2001
@@ -710,8 +710,8 @@
 	/* Append msg to pending queue and poke Venus. */
 	list_add(&(req->uc_chain), vcommp->vc_pending.prev);
 	CDEBUG(D_UPCALL, 
-	       "Proc %d wake Venus for(opc,uniq) =(%d,%d) msg at %x.zzz.\n",
-	       current->pid, req->uc_opcode, req->uc_unique, (int)req);
+	       "Proc %d wake Venus for(opc,uniq) =(%d,%d) msg at %p.zzz.\n",
+	       current->pid, req->uc_opcode, req->uc_unique, req);
 
 	wake_up_interruptible(&vcommp->vc_waitq);
 	/* We can be interrupted while we wait for Venus to process
@@ -731,8 +731,8 @@
 	       req->uc_opcode, jiffies - req->uc_posttime, 
 	       req->uc_unique, req->uc_outSize);
 	CDEBUG(D_UPCALL, 
-	       "..process %d woken up by Venus for req at 0x%x, data at %x\n", 
-	       current->pid, (int)req, (int)req->uc_data);
+	       "..process %d woken up by Venus for req at %p, data at %p\n", 
+	       current->pid, req, req->uc_data);
 	if (vcommp->vc_pid) {      /* i.e. Venus is still alive */
 	    /* Op went through, interrupt or not... */
 	    if (req->uc_flags & REQ_WRITE) {
diff -urN linux-2.2.11-pre2/fs/ext2/file.c linux/fs/ext2/file.c
--- linux-2.2.11-pre2/fs/ext2/file.c	Mon Dec  3 18:52:04 2001
+++ linux/fs/ext2/file.c	Mon Dec  3 18:52:29 2001
@@ -229,7 +229,7 @@
 			if (!count)
 				return -EFBIG;
 		}
-		if (((pos + count) >> 33) && 
+		if (((pos + count) >> 31) && 
 		    !(sb->u.ext2_sb.s_es->s_feature_ro_compat &
 		      cpu_to_le32(EXT2_FEATURE_RO_COMPAT_LARGE_FILE))) {
 			/* If this is the first large file created, add a flag
diff -urN linux-2.2.11-pre2/fs/ext2/inode.c linux/fs/ext2/inode.c
--- linux-2.2.11-pre2/fs/ext2/inode.c	Mon Dec  3 18:52:04 2001
+++ linux/fs/ext2/inode.c	Mon Dec  3 18:52:29 2001
@@ -707,15 +707,18 @@
 	unsigned int	flags;
 	
 	retval = -EPERM;
-	if (iattr->ia_valid & ATTR_ATTR_FLAG &&
-	    ((!(iattr->ia_attr_flags & ATTR_FLAG_APPEND) !=
+	if (iattr->ia_valid & ATTR_ATTR_FLAG)
+	{
+	     if((!(iattr->ia_attr_flags & ATTR_FLAG_APPEND) !=
 	      !(inode->u.ext2_i.i_flags & EXT2_APPEND_FL)) ||
-	     (!(iattr->ia_attr_flags & ATTR_FLAG_IMMUTABLE) !=
-	      !(inode->u.ext2_i.i_flags & EXT2_IMMUTABLE_FL)))) {
+	      (!(iattr->ia_attr_flags & ATTR_FLAG_IMMUTABLE) !=
+	      !(inode->u.ext2_i.i_flags & EXT2_IMMUTABLE_FL))) {
 		if (!capable(CAP_LINUX_IMMUTABLE))
 			goto out;
-	} else if ((current->fsuid != inode->i_uid) && !capable(CAP_FOWNER))
+	     }
+	     else if ((current->fsuid != inode->i_uid) && !capable(CAP_FOWNER))
 		goto out;
+	}
 
 	if (iattr->ia_valid & ATTR_SIZE) {
 		off_t size = iattr->ia_size;
diff -urN linux-2.2.11-pre2/fs/fat/inode.c linux/fs/fat/inode.c
--- linux-2.2.11-pre2/fs/fat/inode.c	Mon Dec  3 18:52:04 2001
+++ linux/fs/fat/inode.c	Mon Dec  3 18:52:29 2001
@@ -515,7 +515,7 @@
 
 		/* Must be FAT32 */
 		fat32 = 1;
-		MSDOS_SB(sb)->fat_length= CF_LE_W(b->fat32_length)*sector_mult;
+		MSDOS_SB(sb)->fat_length= CF_LE_L(b->fat32_length)*sector_mult;
 		MSDOS_SB(sb)->root_cluster = CF_LE_L(b->root_cluster);
 
 		/* MC - if info_sector is 0, don't multiply by 0 */
diff -urN linux-2.2.11-pre2/fs/lockd/clntlock.c linux/fs/lockd/clntlock.c
--- linux-2.2.11-pre2/fs/lockd/clntlock.c	Mon Jan  4 10:23:42 1999
+++ linux/fs/lockd/clntlock.c	Mon Dec  3 18:52:29 2001
@@ -172,7 +172,7 @@
 
 	/* First, reclaim all locks that have been granted previously. */
 	do {
-		for (fl = file_lock_table; fl; fl = fl->fl_next) {
+		for (fl = file_lock_table; fl; fl = fl->fl_nextlink) {
 			inode = fl->fl_file->f_dentry->d_inode;
 			if (inode->i_sb->s_magic == NFS_SUPER_MAGIC
 			 && nlm_cmp_addr(NFS_ADDR(inode), &host->h_addr)
diff -urN linux-2.2.11-pre2/fs/lockd/svclock.c linux/fs/lockd/svclock.c
--- linux-2.2.11-pre2/fs/lockd/svclock.c	Wed Feb 17 09:44:33 1999
+++ linux/fs/lockd/svclock.c	Mon Dec  3 18:52:29 2001
@@ -335,9 +335,12 @@
 	/* Append to list of blocked */
 	nlmsvc_insert_block(block, NLM_NEVER);
 
-	/* Now add block to block list of the conflicting lock */
-	dprintk("lockd: blocking on this lock.\n");
-	posix_block_lock(conflock, &block->b_call.a_args.lock.fl);
+	if (!block->b_call.a_args.lock.fl.fl_prevblock) {
+		/* Now add block to block list of the conflicting lock
+		   if we haven't done so. */
+		dprintk("lockd: blocking on this lock.\n");
+		posix_block_lock(conflock, &block->b_call.a_args.lock.fl);
+	}
 
 	up(&file->f_sema);
 	return nlm_lck_blocked;
@@ -440,7 +443,7 @@
 	dprintk("lockd: VFS unblock notification for block %p\n", fl);
 	posix_unblock_lock(fl);
 	for (bp = &nlm_blocked; (block = *bp); bp = &block->b_next) {
-		if (&block->b_call.a_args.lock.fl == fl) {
+		if (nlm_compare_locks(&block->b_call.a_args.lock.fl, fl)) {
 			svc_wake_up(block->b_daemon);
 			nlmsvc_insert_block(block, 0);
 			return;
diff -urN linux-2.2.11-pre2/fs/locks.c linux/fs/locks.c
--- linux-2.2.11-pre2/fs/locks.c	Mon Dec  3 18:52:04 2001
+++ linux/fs/locks.c	Mon Dec  3 18:52:29 2001
@@ -193,6 +193,14 @@
 {
 	struct file_lock *prevblock;
 
+	if (waiter->fl_prevblock) {
+		printk(KERN_ERR "locks_insert_block: remove duplicated lock "
+			"(pid=%d %ld-%ld type=%d)\n",
+			waiter->fl_pid, waiter->fl_start,
+			waiter->fl_end, waiter->fl_type);
+		locks_delete_block(waiter->fl_prevblock, waiter);
+	}
+
 	if (blocker->fl_prevblock == NULL)
 		/* No previous waiters - list is empty */
 		prevblock = blocker;
diff -urN linux-2.2.11-pre2/fs/ncpfs/dir.c linux/fs/ncpfs/dir.c
--- linux-2.2.11-pre2/fs/ncpfs/dir.c	Mon Dec  3 18:52:04 2001
+++ linux/fs/ncpfs/dir.c	Mon Dec  3 18:52:30 2001
@@ -350,9 +350,8 @@
 	struct ncpfs_inode_info finfo;
 	__u8 __name[dentry->d_name.len + 1];
         
-	if (!dir) {
+	if (!dentry->d_inode || !dir)
 		return 0;
-	}
 	
 	server = NCP_SERVER(dir);
 
diff -urN linux-2.2.11-pre2/fs/nfs/dir.c linux/fs/nfs/dir.c
--- linux-2.2.11-pre2/fs/nfs/dir.c	Sat May  8 23:18:22 1999
+++ linux/fs/nfs/dir.c	Mon Dec  3 18:52:30 2001
@@ -463,6 +463,8 @@
 
 	/* Filehandle matches? */
 	if (memcmp(dentry->d_fsdata, &fhandle, sizeof(struct nfs_fh))) {
+		if (!list_empty(&dentry->d_subdirs))
+			shrink_dcache_parent(dentry);
 		if (dentry->d_count < 2)
 			goto out_bad;
 	}
diff -urN linux-2.2.11-pre2/include/asm-alpha/core_cia.h linux/include/asm-alpha/core_cia.h
--- linux-2.2.11-pre2/include/asm-alpha/core_cia.h	Mon Dec  3 18:52:04 2001
+++ linux/include/asm-alpha/core_cia.h	Mon Dec  3 18:52:30 2001
@@ -77,14 +77,24 @@
 #define CIA_MEM_R2_MASK 0x07ffffff  /* SPARSE Mem region 2 mask is 27 bits */
 #define CIA_MEM_R3_MASK 0x03ffffff  /* SPARSE Mem region 3 mask is 26 bits */
 
-#define CIA_DMA_WIN_BASE_DEFAULT	(2UL*1024*1024*1024)
-#define CIA_DMA_WIN_SIZE_DEFAULT	(2UL*1024*1024*1024)
+#define CIA_DMA_WIN_BASE_DEFAULT	(1024*1024*1024U)
+#define CIA_DMA_WIN_SIZE_DEFAULT	(2*1024*1024*1024U)
+
+/* window 0 at 1GB size 1GB mapping to 0 */
+#define CIA_DMA_WIN0_BASE_DEFAULT	(1024*1024*1024U)
+#define CIA_DMA_WIN0_SIZE_DEFAULT	(1024*1024*1024U)
+#define CIA_DMA_WIN0_TRAN_DEFAULT	(0U)
+
+/* window 1 at 2GB size 1GB mapping to 1GB */
+#define CIA_DMA_WIN1_BASE_DEFAULT	(2*1024*1024*1024U)
+#define CIA_DMA_WIN1_SIZE_DEFAULT	(1024*1024*1024U)
+#define CIA_DMA_WIN1_TRAN_DEFAULT	(1024*1024*1024U)
 
 #if defined(CONFIG_ALPHA_GENERIC) || defined(CONFIG_ALPHA_SRM_SETUP)
 #define CIA_DMA_WIN_BASE		alpha_mv.dma_win_base
 #define CIA_DMA_WIN_SIZE		alpha_mv.dma_win_size
 #else
-#define CIA_DMA_WIN_BASE		CIA_DMA_WIN_BASE_DEFAULT
+#define CIA_DMA_WIN_BASE		CIA_DMA_WIN_SIZE_DEFAULT
 #define CIA_DMA_WIN_SIZE		CIA_DMA_WIN_SIZE_DEFAULT
 #endif
 
diff -urN linux-2.2.11-pre2/include/asm-alpha/core_pyxis.h linux/include/asm-alpha/core_pyxis.h
--- linux-2.2.11-pre2/include/asm-alpha/core_pyxis.h	Mon Dec  3 18:52:04 2001
+++ linux/include/asm-alpha/core_pyxis.h	Mon Dec  3 18:52:30 2001
@@ -74,8 +74,18 @@
 #define PYXIS_MEM_R2_MASK 0x07ffffff  /* SPARSE Mem region 2 mask is 27 bits */
 #define PYXIS_MEM_R3_MASK 0x03ffffff  /* SPARSE Mem region 3 mask is 26 bits */
 
-#define PYXIS_DMA_WIN_BASE_DEFAULT	(2UL*1024*1024*1024)
-#define PYXIS_DMA_WIN_SIZE_DEFAULT	(2UL*1024*1024*1024)
+#define PYXIS_DMA_WIN_BASE_DEFAULT	(1024*1024*1024U)
+#define PYXIS_DMA_WIN_SIZE_DEFAULT	(2*1024*1024*1024U)
+
+/* window 0 at 1GB size 1GB mapping 0 */
+#define PYXIS_DMA_WIN0_BASE_DEFAULT	(1024*1024*1024U)
+#define PYXIS_DMA_WIN0_SIZE_DEFAULT	(1024*1024*1024U)
+#define PYXIS_DMA_WIN0_TRAN_DEFAULT	(0U)
+
+/* window 0 at 2GB size 1GB mapping 1GB */
+#define PYXIS_DMA_WIN1_BASE_DEFAULT	(2*1024*1024*1024U)
+#define PYXIS_DMA_WIN1_SIZE_DEFAULT	(1024*1024*1024U)
+#define PYXIS_DMA_WIN1_TRAN_DEFAULT	(1024*1024*1024U)
 
 #if defined(CONFIG_ALPHA_GENERIC) || defined(CONFIG_ALPHA_SRM_SETUP)
 #define PYXIS_DMA_WIN_BASE		alpha_mv.dma_win_base
diff -urN linux-2.2.11-pre2/include/asm-alpha/core_tsunami.h linux/include/asm-alpha/core_tsunami.h
--- linux-2.2.11-pre2/include/asm-alpha/core_tsunami.h	Sun Jan 10 09:59:59 1999
+++ linux/include/asm-alpha/core_tsunami.h	Mon Dec  3 18:52:30 2001
@@ -16,8 +16,24 @@
  *
  */
 
+/*
+ * We must actually use 2 windows to direct-map the 2GB space, because
+ * of an "idiot-syncracy" of the CYPRESS chip used on DS20 and others.
+ * It may respond to a PCI bus address in the last 1MB of the 4GB
+ * address range, and that is where real memory may appear.
+ *
+ * Sigh...
+ */
 #define TSUNAMI_DMA_WIN_BASE_DEFAULT    (1024*1024*1024U)
-#define TSUNAMI_DMA_WIN_SIZE_DEFAULT    (1024*1024*1024U)
+#define TSUNAMI_DMA_WIN_SIZE_DEFAULT    (2*1024*1024*1024U)
+
+#define TSUNAMI_DMA_WIN0_BASE_DEFAULT    (1024*1024*1024UL)
+#define TSUNAMI_DMA_WIN0_SIZE_DEFAULT    (1024*1024*1024UL)
+#define TSUNAMI_DMA_WIN0_TRAN_DEFAULT    (0UL)
+
+#define TSUNAMI_DMA_WIN1_BASE_DEFAULT    (2*1024*1024*1024UL)
+#define TSUNAMI_DMA_WIN1_SIZE_DEFAULT    (1024*1024*1024UL)
+#define TSUNAMI_DMA_WIN1_TRAN_DEFAULT    (1024*1024*1024UL)
 
 #if defined(CONFIG_ALPHA_GENERIC) || defined(CONFIG_ALPHA_SRM_SETUP)
 #define TSUNAMI_DMA_WIN_BASE		alpha_mv.dma_win_base
diff -urN linux-2.2.11-pre2/include/asm-alpha/fpu.h linux/include/asm-alpha/fpu.h
--- linux-2.2.11-pre2/include/asm-alpha/fpu.h	Mon May 10 09:55:21 1999
+++ linux/include/asm-alpha/fpu.h	Mon Dec  3 18:52:30 2001
@@ -4,6 +4,8 @@
 /*
  * Alpha floating-point control register defines:
  */
+#define FPCR_DNOD	(1UL<<47)	/* denorm INV trap disable */
+#define FPCR_DNZ	(1UL<<48)	/* denorms to zero */
 #define FPCR_INVD	(1UL<<49)	/* invalid op disable (opt.) */
 #define FPCR_DZED	(1UL<<50)	/* division by zero disable (opt.) */
 #define FPCR_OVFD	(1UL<<51)	/* overflow disable (optional) */
@@ -42,9 +44,16 @@
 #define IEEE_TRAP_ENABLE_OVF	(1UL<<3)	/* overflow */
 #define IEEE_TRAP_ENABLE_UNF	(1UL<<4)	/* underflow */
 #define IEEE_TRAP_ENABLE_INE	(1UL<<5)	/* inexact */
+#define IEEE_TRAP_ENABLE_DNO	(1UL<<6)	/* denorm */
 #define IEEE_TRAP_ENABLE_MASK	(IEEE_TRAP_ENABLE_INV | IEEE_TRAP_ENABLE_DZE |\
 				 IEEE_TRAP_ENABLE_OVF | IEEE_TRAP_ENABLE_UNF |\
-				 IEEE_TRAP_ENABLE_INE)
+				 IEEE_TRAP_ENABLE_INE | IEEE_TRAP_ENABLE_DNO)
+
+/* Denorm and Underflow flushing */
+#define IEEE_MAP_DMZ		(1UL<<12)	/* Map denorm inputs to zero */
+#define IEEE_MAP_UMZ		(1UL<<13)	/* Map underflowed outputs to zero */
+
+#define IEEE_MAP_MASK		(IEEE_MAP_DMZ | IEEE_MAP_UMZ)
 
 /* status bits coming from fpcr: */
 #define IEEE_STATUS_INV		(1UL<<17)
@@ -52,12 +61,16 @@
 #define IEEE_STATUS_OVF		(1UL<<19)
 #define IEEE_STATUS_UNF		(1UL<<20)
 #define IEEE_STATUS_INE		(1UL<<21)
+#define IEEE_STATUS_DNO		(1UL<<22)
 
 #define IEEE_STATUS_MASK	(IEEE_STATUS_INV | IEEE_STATUS_DZE |	\
 				 IEEE_STATUS_OVF | IEEE_STATUS_UNF |	\
-				 IEEE_STATUS_INE)
+				 IEEE_STATUS_INE | IEEE_STATUS_DNO)
+
+#define IEEE_SW_MASK		(IEEE_TRAP_ENABLE_MASK | IEEE_STATUS_MASK | IEEE_MAP_MASK)
 
-#define IEEE_SW_MASK		(IEEE_TRAP_ENABLE_MASK | IEEE_STATUS_MASK)
+#define IEEE_CURRENT_RM_SHIFT	32
+#define IEEE_CURRENT_RM_MASK	(3UL<<IEEE_CURRENT_RM_SHIFT)
 
 #define IEEE_STATUS_TO_EXCSUM_SHIFT	16
 
@@ -78,6 +91,7 @@
 		      | IEEE_TRAP_ENABLE_DZE
 		      | IEEE_TRAP_ENABLE_OVF)) << 48;
 	fp |= (~sw & (IEEE_TRAP_ENABLE_UNF | IEEE_TRAP_ENABLE_INE)) << 57;
+	fp |= (~sw & IEEE_TRAP_ENABLE_DNO) << 41;
 	return fp;
 }
 
@@ -90,6 +104,7 @@
 			     | IEEE_TRAP_ENABLE_DZE
 			     | IEEE_TRAP_ENABLE_OVF);
 	sw |= (~fp >> 57) & (IEEE_TRAP_ENABLE_UNF | IEEE_TRAP_ENABLE_INE);
+	sw |= (~fp >> 41) & IEEE_TRAP_ENABLE_DNO;
 	return sw;
 }
 
diff -urN linux-2.2.11-pre2/include/asm-alpha/io.h linux/include/asm-alpha/io.h
--- linux-2.2.11-pre2/include/asm-alpha/io.h	Sat Jun 12 11:52:52 1999
+++ linux/include/asm-alpha/io.h	Mon Dec  3 18:52:30 2001
@@ -144,6 +144,8 @@
 # include <asm/jensen.h>
 #elif defined(CONFIG_ALPHA_RX164)
 # include <asm/core_polaris.h>
+#elif defined(CONFIG_ALPHA_LX164)
+# include <asm/core_pyxis.h>
 #else
 #error "What system is this?"
 #endif
diff -urN linux-2.2.11-pre2/include/asm-alpha/pgtable.h linux/include/asm-alpha/pgtable.h
--- linux-2.2.11-pre2/include/asm-alpha/pgtable.h	Mon Dec  3 18:52:04 2001
+++ linux/include/asm-alpha/pgtable.h	Mon Dec  3 18:52:30 2001
@@ -70,7 +70,7 @@
 			   struct vm_area_struct *vma,
 			   unsigned long addr)
 {
-	tbi(((vma->vm_flags & VM_EXEC) != 0) ? 3 : 2, addr);
+	tbi(2 + ((vma->vm_flags & VM_EXEC) != 0), addr);
 }
 
 __EXTERN_INLINE void
diff -urN linux-2.2.11-pre2/include/asm-alpha/processor.h linux/include/asm-alpha/processor.h
--- linux-2.2.11-pre2/include/asm-alpha/processor.h	Mon Jan 18 09:55:30 1999
+++ linux/include/asm-alpha/processor.h	Mon Dec  3 18:52:30 2001
@@ -48,9 +48,12 @@
 	/*
 	 * The fields below are Linux-specific:
 	 *
-	 * bit 1..5: IEEE_TRAP_ENABLE bits (see fpu.h)
-	 * bit 6..8: UAC bits (see sysinfo.h)
-	 * bit 17..21: IEEE_STATUS_MASK bits (see fpu.h)
+	 * bit 1..6: IEEE_TRAP_ENABLE bits (see fpu.h)
+	 * bit 7..8: IEEE_MAP_XXX bits (see fpu.h)
+	 * bit 14..16: UAC bits (see sysinfo.h)
+	 * bit 17..22: IEEE_STATUS_MASK bits (see fpu.h)
+	 * bit 32..33: Current IEEE rounding mode (only used
+	 *             during floating emulation - see fpu.h)
 	 * bit 63: die_if_kernel recursion lock
 	 */
 	unsigned long flags;
diff -urN linux-2.2.11-pre2/include/asm-alpha/ptrace.h linux/include/asm-alpha/ptrace.h
--- linux-2.2.11-pre2/include/asm-alpha/ptrace.h	Mon Apr  7 11:35:31 1997
+++ linux/include/asm-alpha/ptrace.h	Mon Dec  3 18:52:30 2001
@@ -67,7 +67,7 @@
 };
 
 #ifdef __KERNEL__
-#define user_mode(regs) ((regs)->ps & 8)
+#define user_mode(regs) (((regs)->ps & 8) != 0)
 #define instruction_pointer(regs) ((regs)->pc)
 extern void show_regs(struct pt_regs *);
 #endif
diff -urN linux-2.2.11-pre2/include/asm-alpha/smplock.h linux/include/asm-alpha/smplock.h
--- linux-2.2.11-pre2/include/asm-alpha/smplock.h	Mon Dec  3 18:52:04 2001
+++ linux/include/asm-alpha/smplock.h	Sun Sep  6 10:34:33 1998
@@ -13,23 +13,22 @@
 /*
  * Release global kernel lock and global interrupt lock
  */
-#define release_kernel_lock(task, cpu) \
-do { \
-	if (task->lock_depth >= 0) \
-		spin_unlock(&kernel_flag); \
-	release_irqlock(cpu); \
-	__sti(); \
-} while (0)
+static __inline__ void release_kernel_lock(struct task_struct *task, int cpu)
+{
+	if (task->lock_depth >= 0)
+		spin_unlock(&kernel_flag);
+	release_irqlock(cpu);
+	__sti();
+}
 
 /*
  * Re-acquire the kernel lock
  */
-#define reacquire_kernel_lock(task) \
-do { \
-	if (task->lock_depth >= 0) \
-		spin_lock(&kernel_flag); \
-} while (0)
-
+static __inline__ void reacquire_kernel_lock(struct task_struct *task)
+{
+	if (task->lock_depth >= 0)
+		spin_lock(&kernel_flag);
+}
 
 /*
  * Getting the big kernel lock.
@@ -38,14 +37,14 @@
  * so we only need to worry about other
  * CPU's.
  */
-#define lock_kernel() \
-do { \
-	if (!++current->lock_depth) \
-		spin_lock(&kernel_flag); \
-} while(0)
+static __inline__ void lock_kernel(void)
+{
+	if (!++current->lock_depth)
+		spin_lock(&kernel_flag);
+}
 
-#define unlock_kernel() \
-do { \
-	if (--current->lock_depth < 0) \
-		spin_unlock(&kernel_flag); \
-} while(0)
+static __inline__ void unlock_kernel(void)
+{
+	if (--current->lock_depth < 0)
+		spin_unlock(&kernel_flag);
+}
diff -urN linux-2.2.11-pre2/include/asm-alpha/sysinfo.h linux/include/asm-alpha/sysinfo.h
--- linux-2.2.11-pre2/include/asm-alpha/sysinfo.h	Sun Mar 21 20:53:46 1999
+++ linux/include/asm-alpha/sysinfo.h	Mon Dec  3 18:52:30 2001
@@ -31,7 +31,7 @@
 
 /* This is the shift that is applied to the UAC bits as stored in the 
    per-thread flags.  */
-#define UAC_SHIFT			6
+#define UAC_SHIFT			14
 
 #endif
 
diff -urN linux-2.2.11-pre2/include/asm-i386/bugs.h linux/include/asm-i386/bugs.h
--- linux-2.2.11-pre2/include/asm-i386/bugs.h	Mon Dec  3 18:52:04 2001
+++ linux/include/asm-i386/bugs.h	Mon Dec  3 18:52:30 2001
@@ -46,7 +46,7 @@
 __initfunc(static void copro_timeout(void))
 {
 	fpu_error = 1;
-	timer_table[COPRO_TIMER].expires = jiffies+100;
+	timer_table[COPRO_TIMER].expires = jiffies+HZ;
 	timer_active |= 1<<COPRO_TIMER;
 	printk(KERN_ERR "387 failed: trying to reset\n");
 	send_sig(SIGFPE, current, 1);
@@ -104,7 +104,7 @@
 	 * should get there first..
 	 */
 	printk(KERN_INFO "Checking 386/387 coupling... ");
-	timer_table[COPRO_TIMER].expires = jiffies+50;
+	timer_table[COPRO_TIMER].expires = jiffies+HZ/2;
 	timer_table[COPRO_TIMER].fn = copro_timeout;
 	timer_active |= 1<<COPRO_TIMER;
 	__asm__("clts ; fninit ; fnstcw %0 ; fwait":"=m" (*&control_word));
diff -urN linux-2.2.11-pre2/include/asm-i386/elf.h linux/include/asm-i386/elf.h
--- linux-2.2.11-pre2/include/asm-i386/elf.h	Tue Jan 26 15:21:02 1999
+++ linux/include/asm-i386/elf.h	Mon Dec  3 18:52:30 2001
@@ -51,7 +51,9 @@
    the loader.  We need to make sure that it is out of the way of the program
    that it will "exec", and that there is sufficient room for the brk.  */
 
-#define ELF_ET_DYN_BASE         (2 * TASK_SIZE / 3)
+#define ELF_ET_DYN_BASE         ((TASK_SIZE & 0x80000000) \
+				 ? TASK_SIZE / 3 * 2 \
+				 : 2 * TASK_SIZE / 3)
 
 /* Wow, the "main" arch needs arch dependent functions too.. :) */
 
diff -urN linux-2.2.11-pre2/include/asm-i386/semaphore.h linux/include/asm-i386/semaphore.h
--- linux-2.2.11-pre2/include/asm-i386/semaphore.h	Tue May 11 10:35:43 1999
+++ linux/include/asm-i386/semaphore.h	Mon Dec  3 18:52:30 2001
@@ -17,6 +17,10 @@
  *		       potential and subtle race discovered by Ulrich Schmid
  *		       in down_interruptible(). Since I started to play here I
  *		       also implemented the `trylock' semaphore operation.
+ *          1999-07-02 Artur Skawina <skawina@geocities.com>
+ *                     Optimized "0(ecx)" -> "(ecx)" (the assembler does not
+ *                     do this). Changed calling sequences from push/jmp to
+ *                     traditional call/ret.
  *
  * If you would like to see an analysis of this implementation, please
  * ftp to gcom.com and download the file
@@ -63,12 +67,12 @@
 #ifdef __SMP__
 		"lock ; "
 #endif
-		"decl 0(%0)\n\t"
+		"decl (%0)\n\t"     /* --sem->count */
 		"js 2f\n"
 		"1:\n"
 		".section .text.lock,\"ax\"\n"
-		"2:\tpushl $1b\n\t"
-		"jmp __down_failed\n"
+		"2:\tcall __down_failed\n\t"
+		"jmp 1b\n"
 		".previous"
 		:/* no outputs */
 		:"c" (sem)
@@ -84,13 +88,13 @@
 #ifdef __SMP__
 		"lock ; "
 #endif
-		"decl 0(%1)\n\t"
+		"decl (%1)\n\t"     /* --sem->count */
 		"js 2f\n\t"
 		"xorl %0,%0\n"
 		"1:\n"
 		".section .text.lock,\"ax\"\n"
-		"2:\tpushl $1b\n\t"
-		"jmp __down_failed_interruptible\n"
+		"2:\tcall __down_failed_interruptible\n\t"
+		"jmp 1b\n"
 		".previous"
 		:"=a" (result)
 		:"c" (sem)
@@ -107,13 +111,13 @@
 #ifdef __SMP__
 		"lock ; "
 #endif
-		"decl 0(%1)\n\t"
+		"decl (%1)\n\t"     /* --sem->count */
 		"js 2f\n\t"
 		"xorl %0,%0\n"
 		"1:\n"
 		".section .text.lock,\"ax\"\n"
-		"2:\tpushl $1b\n\t"
-		"jmp __down_failed_trylock\n"
+		"2:\tcall __down_failed_trylock\n\t"
+		"jmp 1b\n"
 		".previous"
 		:"=a" (result)
 		:"c" (sem)
@@ -134,12 +138,12 @@
 #ifdef __SMP__
 		"lock ; "
 #endif
-		"incl 0(%0)\n\t"
+		"incl (%0)\n\t"     /* ++sem->count */
 		"jle 2f\n"
 		"1:\n"
 		".section .text.lock,\"ax\"\n"
-		"2:\tpushl $1b\n\t"
-		"jmp __up_wakeup\n"
+		"2:\tcall __up_wakeup\n\t"
+		"jmp 1b\n"
 		".previous"
 		:/* no outputs */
 		:"c" (sem)
diff -urN linux-2.2.11-pre2/include/asm-i386/socket.h linux/include/asm-i386/socket.h
--- linux-2.2.11-pre2/include/asm-i386/socket.h	Mon Dec  3 18:52:04 2001
+++ linux/include/asm-i386/socket.h	Mon Dec  3 18:52:30 2001
@@ -40,7 +40,7 @@
 #define SO_DETACH_FILTER        27
 
 /* Nasty libc5 fixup - bletch */
-#if defined(__KERNEL__) || (LIBC_VERSION < 6)
+#if defined(__KERNEL__)
 /* Socket types. */
 #define SOCK_STREAM	1		/* stream (connection) socket	*/
 #define SOCK_DGRAM	2		/* datagram (conn.less) socket	*/
diff -urN linux-2.2.11-pre2/include/asm-ppc/ide.h linux/include/asm-ppc/ide.h
--- linux-2.2.11-pre2/include/asm-ppc/ide.h	Thu May  6 23:14:37 1999
+++ linux/include/asm-ppc/ide.h	Mon Dec  3 18:52:30 2001
@@ -109,6 +109,7 @@
         ppc_ide_md.fix_driveid(id);
 }
 
+#if 0	/* standard inb/outb is OK now -- paulus */
 #undef inb
 #define inb(port)	in_8((unsigned char *)((port) + ppc_ide_md.io_base))
 #undef inb_p
@@ -119,6 +120,7 @@
 	out_8((unsigned char *)((port) + ppc_ide_md.io_base), (val) )
 #undef outb_p
 #define outb_p(val, port)	outb(val, port)
+#endif
 
 typedef union {
 	unsigned all			: 8;	/* all of the bits together */
diff -urN linux-2.2.11-pre2/include/asm-ppc/io.h linux/include/asm-ppc/io.h
--- linux-2.2.11-pre2/include/asm-ppc/io.h	Thu Apr 29 12:39:01 1999
+++ linux/include/asm-ppc/io.h	Mon Dec  3 18:52:30 2001
@@ -77,7 +77,7 @@
 #define outb_p(val, port)	out_8((unsigned char *)((port)+_IO_BASE), (val))
 #define inw_p(port)		in_le16((unsigned short *)((port)+_IO_BASE))
 #define outw_p(val, port)	out_le16((unsigned short *)((port)+_IO_BASE), (val))
-#define inl_p(port)		in_le32(((unsigned *)(port)+_IO_BASE))
+#define inl_p(port)		in_le32((unsigned *)((port)+_IO_BASE))
 #define outl_p(val, port)	out_le32((unsigned *)((port)+_IO_BASE), (val))
 
 extern void _insb(volatile unsigned char *port, void *buf, int ns);
diff -urN linux-2.2.11-pre2/include/asm-ppc/irq.h linux/include/asm-ppc/irq.h
--- linux-2.2.11-pre2/include/asm-ppc/irq.h	Thu Apr 29 12:39:01 1999
+++ linux/include/asm-ppc/irq.h	Mon Dec  3 18:52:30 2001
@@ -6,6 +6,7 @@
 #include <asm/machdep.h>		/* ppc_md */
 
 extern void disable_irq(unsigned int);
+extern void disable_irq_nosync(unsigned int);
 extern void enable_irq(unsigned int);
 
 #ifndef CONFIG_8xx
diff -urN linux-2.2.11-pre2/include/asm-ppc/processor.h linux/include/asm-ppc/processor.h
--- linux-2.2.11-pre2/include/asm-ppc/processor.h	Tue May 11 08:24:32 1999
+++ linux/include/asm-ppc/processor.h	Mon Dec  3 18:52:30 2001
@@ -198,6 +198,11 @@
 void release_thread(struct task_struct *);
 
 /*
+ * Create a new kernel thread.
+ */
+extern long kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
+
+/*
  * Bus types
  */
 #define EISA_bus 0
diff -urN linux-2.2.11-pre2/include/asm-ppc/shmparam.h linux/include/asm-ppc/shmparam.h
--- linux-2.2.11-pre2/include/asm-ppc/shmparam.h	Sat Nov 25 09:49:06 1995
+++ linux/include/asm-ppc/shmparam.h	Mon Dec  3 18:52:30 2001
@@ -33,7 +33,7 @@
  * SHMMAX <= (PAGE_SIZE << _SHM_IDX_BITS).
  */
 
-#define SHMMAX 0x3fa000			/* max shared seg size (bytes) */
+#define SHMMAX 0x2000000		/* max shared seg size (bytes) */
 #define SHMMIN 1 /* really PAGE_SIZE */	/* min shared seg size (bytes) */
 #define SHMMNI (1<<_SHM_ID_BITS)	/* max num of segs system wide */
 #define SHMALL				/* max shm system wide (pages) */ \
diff -urN linux-2.2.11-pre2/include/asm-ppc/spinlock.h linux/include/asm-ppc/spinlock.h
--- linux-2.2.11-pre2/include/asm-ppc/spinlock.h	Wed Mar 10 21:30:32 1999
+++ linux/include/asm-ppc/spinlock.h	Mon Dec  3 18:52:30 2001
@@ -18,7 +18,7 @@
 
 #define spin_lock_init(lock)	do { } while(0)
 #define spin_lock(lock)		do { } while(0)
-#define spin_trylock(lock)	do { } while(0)
+#define spin_trylock(lock)	(1)
 #define spin_unlock_wait(lock)	do { } while(0)
 #define spin_unlock(lock)	do { } while(0)
 #define spin_lock_irq(lock)	cli()
diff -urN linux-2.2.11-pre2/include/asm-ppc/unistd.h linux/include/asm-ppc/unistd.h
--- linux-2.2.11-pre2/include/asm-ppc/unistd.h	Wed Mar 10 21:30:32 1999
+++ linux/include/asm-ppc/unistd.h	Mon Dec  3 18:52:30 2001
@@ -378,16 +378,6 @@
  */
 
 /*
- * Create a new kernel thread.
- */
-extern long __kernel_thread(unsigned long, int (*)(void *), void *);
-
-static inline long kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
-{
-	return __kernel_thread(flags | CLONE_VM, fn, arg);
-}
-
-/*
  * System call prototypes.
  */
 #define __NR__exit __NR_exit
diff -urN linux-2.2.11-pre2/include/asm-sparc/keyboard.h linux/include/asm-sparc/keyboard.h
--- linux-2.2.11-pre2/include/asm-sparc/keyboard.h	Mon Dec  3 18:52:04 2001
+++ linux/include/asm-sparc/keyboard.h	Mon Dec  3 18:52:30 2001
@@ -1,4 +1,4 @@
-/* $Id: keyboard.h,v 1.2 1999/04/28 11:59:07 davem Exp $
+/* $Id: keyboard.h,v 1.2.2.1 1999/08/07 10:52:45 davem Exp $
  * linux/include/asm-sparc/keyboard.h
  *
  * sparc64 Created Aug 29 1997 by Eddie C. Dost (ecd@skynet.be)
diff -urN linux-2.2.11-pre2/include/asm-sparc/pgtable.h linux/include/asm-sparc/pgtable.h
--- linux-2.2.11-pre2/include/asm-sparc/pgtable.h	Mon Dec  3 18:52:04 2001
+++ linux/include/asm-sparc/pgtable.h	Mon Dec  3 18:52:30 2001
@@ -1,4 +1,4 @@
-/* $Id: pgtable.h,v 1.78 1999/01/07 14:14:05 jj Exp $ */
+/* $Id: pgtable.h,v 1.78.2.1 1999/08/07 10:52:48 davem Exp $ */
 #ifndef _SPARC_PGTABLE_H
 #define _SPARC_PGTABLE_H
 
diff -urN linux-2.2.11-pre2/include/asm-sparc/socket.h linux/include/asm-sparc/socket.h
--- linux-2.2.11-pre2/include/asm-sparc/socket.h	Mon Dec  3 18:52:04 2001
+++ linux/include/asm-sparc/socket.h	Mon Dec  3 18:52:30 2001
@@ -1,4 +1,4 @@
-/* $Id: socket.h,v 1.12 1998/07/22 22:06:48 davem Exp $ */
+/* $Id: socket.h,v 1.12.2.1 1999/08/07 10:52:51 davem Exp $ */
 #ifndef _ASM_SOCKET_H
 #define _ASM_SOCKET_H
 
diff -urN linux-2.2.11-pre2/include/asm-sparc64/apb.h linux/include/asm-sparc64/apb.h
--- linux-2.2.11-pre2/include/asm-sparc64/apb.h	Tue Apr 14 17:44:24 1998
+++ linux/include/asm-sparc64/apb.h	Mon Dec  3 18:52:30 2001
@@ -1,4 +1,4 @@
-/* $Id: apb.h,v 1.2 1998/04/01 20:41:49 ecd Exp $
+/* $Id: apb.h,v 1.2.2.1 1999/08/09 13:00:53 davem Exp $
  * apb.h: Advanced PCI Bridge Configuration Registers and Bits
  *
  * Copyright (C) 1998  Eddie C. Dost  (ecd@skynet.be)
@@ -18,6 +18,11 @@
 #define APB_DMA_TARGET_LATENCY_TIMER		0xdb
 #define APB_SECONDARY_MASTER_RETRY_LIMIT	0xdc
 #define APB_SECONDARY_CONTROL			0xdd
+#  define APB_SECONDARY_CTL_PIO_PREF			(1 << 0)
+#  define APB_SECONDARY_CTL_MRM_CVRT			(1 << 1)
+#  define APB_SECONDARY_CTL_RIACK			(1 << 2)
+#  define APB_SECONDARY_CTL_MIACK			(1 << 3)
+#  define APB_SECONDARY_CTL_DISCON_FULL			(1 << 4) /* rev >1.3 only */
 #define APB_IO_ADDRESS_MAP			0xde
 #define APB_MEM_ADDRESS_MAP			0xdf
 
diff -urN linux-2.2.11-pre2/include/asm-sparc64/floppy.h linux/include/asm-sparc64/floppy.h
--- linux-2.2.11-pre2/include/asm-sparc64/floppy.h	Sun Mar 21 07:23:38 1999
+++ linux/include/asm-sparc64/floppy.h	Mon Dec  3 18:52:30 2001
@@ -1,4 +1,4 @@
-/* $Id: floppy.h,v 1.18 1999/03/21 10:51:38 davem Exp $
+/* $Id: floppy.h,v 1.18.2.1 1999/08/03 08:00:20 davem Exp $
  * asm-sparc64/floppy.h: Sparc specific parts of the Floppy driver.
  *
  * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
@@ -548,6 +548,7 @@
 #ifdef CONFIG_PCI
 		struct linux_ebus *ebus;
 		struct linux_ebus_device *edev = 0;
+		unsigned long auxio_reg;
 
 		for_each_ebus(ebus) {
 			for_each_ebusdev(edev, ebus) {
@@ -575,6 +576,12 @@
 
 		sun_fdc = (struct sun_flpy_controller *)edev->base_address[0];
 		FLOPPY_IRQ = edev->irqs[0];
+
+		/* Make sure the high density bit is set, some systems
+		 * (most notably Ultra5/Ultra10) come up with it clear.
+		 */
+		auxio_reg = edev->base_address[2];
+		writel(readl(auxio_reg)|0x2, auxio_reg);
 
 		sun_pci_fd_ebus_dma = (struct linux_ebus_dma *)
 							edev->base_address[1];
diff -urN linux-2.2.11-pre2/include/asm-sparc64/pgtable.h linux/include/asm-sparc64/pgtable.h
--- linux-2.2.11-pre2/include/asm-sparc64/pgtable.h	Mon Dec  3 18:52:04 2001
+++ linux/include/asm-sparc64/pgtable.h	Mon Dec  3 18:52:30 2001
@@ -1,4 +1,4 @@
-/* $Id: pgtable.h,v 1.103 1999/03/28 08:40:04 davem Exp $
+/* $Id: pgtable.h,v 1.103.2.1 1999/08/07 10:52:55 davem Exp $
  * pgtable.h: SpitFire page table operations.
  *
  * Copyright 1996,1997 David S. Miller (davem@caip.rutgers.edu)
diff -urN linux-2.2.11-pre2/include/asm-sparc64/socket.h linux/include/asm-sparc64/socket.h
--- linux-2.2.11-pre2/include/asm-sparc64/socket.h	Mon Dec  3 18:52:04 2001
+++ linux/include/asm-sparc64/socket.h	Mon Dec  3 18:52:30 2001
@@ -1,4 +1,4 @@
-/* $Id: socket.h,v 1.5 1998/07/22 22:06:49 davem Exp $ */
+/* $Id: socket.h,v 1.5.2.1 1999/08/07 10:52:59 davem Exp $ */
 #ifndef _ASM_SOCKET_H
 #define _ASM_SOCKET_H
 
diff -urN linux-2.2.11-pre2/include/linux/arcdevice.h linux/include/linux/arcdevice.h
--- linux-2.2.11-pre2/include/linux/arcdevice.h	Tue Dec 29 11:18:18 1998
+++ linux/include/linux/arcdevice.h	Mon Dec  3 18:52:30 2001
@@ -69,7 +69,7 @@
  * increased.  The larger it is, though, the longer it will be between
  * necessary transmits - don't set this too large.
  */
-#define TX_TIMEOUT 20
+#define TX_TIMEOUT (20*HZ/100)
 
 
 /* Display warnings about the driver being an ALPHA version.
diff -urN linux-2.2.11-pre2/include/linux/coda_fs_i.h linux/include/linux/coda_fs_i.h
--- linux-2.2.11-pre2/include/linux/coda_fs_i.h	Mon Jan 25 11:17:50 1999
+++ linux/include/linux/coda_fs_i.h	Mon Dec  3 18:52:30 2001
@@ -20,6 +20,13 @@
  * coda fs inode data
  */
 struct coda_inode_info {
+	/*
+	 * This is a place holder so named pipes work (more or less
+	 * correctly). This must be first in the struct because the
+	 * data is really accessed via inode->u.pipe_i.
+	 */
+	struct pipe_inode_info  pipeinfo;
+
         struct ViceFid     c_fid;	/* Coda identifier */
         u_short	           c_flags;     /* flags (see below) */
         u_short	           c_ocount;    /* count of openers */
diff -urN linux-2.2.11-pre2/include/linux/coda_linux.h linux/include/linux/coda_linux.h
--- linux-2.2.11-pre2/include/linux/coda_linux.h	Mon Jan 25 10:28:35 1999
+++ linux/include/linux/coda_linux.h	Mon Dec  3 18:52:30 2001
@@ -113,10 +113,10 @@
 do {                                                                      \
     if (size < 3000) {                                                    \
         ptr = (cast)kmalloc((unsigned long) size, GFP_KERNEL);            \
-                CDEBUG(D_MALLOC, "kmalloced: %x at %x.\n", (int) size, (int) ptr);\
+                CDEBUG(D_MALLOC, "kmalloced: %lx at %p.\n", (long)size, ptr);\
      }  else {                                                             \
         ptr = (cast)vmalloc((unsigned long) size);                        \
-	CDEBUG(D_MALLOC, "vmalloced: %x at %x.\n", (int) size, (int) ptr);}\
+	CDEBUG(D_MALLOC, "vmalloced: %lx at %p .\n", (long)size, ptr);}\
     if (ptr == 0) {                                                       \
         printk("kernel malloc returns 0 at %s:%d\n", __FILE__, __LINE__);  \
     }                                                                     \
@@ -124,7 +124,7 @@
 } while (0)
 
 
-#define CODA_FREE(ptr,size) do {if (size < 3000) { kfree_s((ptr), (size)); CDEBUG(D_MALLOC, "kfreed: %x at %x.\n", (int) size, (int) ptr); } else { vfree((ptr)); CDEBUG(D_MALLOC, "vfreed: %x at %x.\n", (int) size, (int) ptr);} } while (0)
+#define CODA_FREE(ptr,size) do {if (size < 3000) { kfree_s((ptr), (size)); CDEBUG(D_MALLOC, "kfreed: %lx at %p.\n", (long) size, ptr); } else { vfree((ptr)); CDEBUG(D_MALLOC, "vfreed: %lx at %p.\n", (long) size, ptr);} } while (0)
 
 /* inode to cnode */
 
diff -urN linux-2.2.11-pre2/include/linux/if_cablemodem.h linux/include/linux/if_cablemodem.h
--- linux-2.2.11-pre2/include/linux/if_cablemodem.h	Wed Dec 31 16:00:00 1969
+++ linux/include/linux/if_cablemodem.h	Mon Dec  3 18:52:30 2001
@@ -0,0 +1,22 @@
+#ifndef _LINUX_CABLEMODEM_H_
+#define _LINUX_CABLEMODEM_H_
+/*
+ *		Author: Franco Venturi <fventuri@mediaone.net>
+ *		Copyright 1998 Franco Venturi
+ *
+ *		This program is free software; you can redistribute it
+ *		and/or  modify it under  the terms of  the GNU General
+ *		Public  License as  published  by  the  Free  Software
+ *		Foundation;  either  version 2 of the License, or  (at
+ *		your option) any later version.
+ */
+
+/* some useful defines for sb1000.c e cmconfig.c - fv */
+#define SIOCGCMSTATS		SIOCDEVPRIVATE+0	/* get cable modem stats */
+#define SIOCGCMFIRMWARE		SIOCDEVPRIVATE+1	/* get cm firmware version */
+#define SIOCGCMFREQUENCY	SIOCDEVPRIVATE+2	/* get cable modem frequency */
+#define SIOCSCMFREQUENCY	SIOCDEVPRIVATE+3	/* set cable modem frequency */
+#define SIOCGCMPIDS			SIOCDEVPRIVATE+4	/* get cable modem PIDs */
+#define SIOCSCMPIDS			SIOCDEVPRIVATE+5	/* set cable modem PIDs */
+
+#endif
diff -urN linux-2.2.11-pre2/include/linux/in.h linux/include/linux/in.h
--- linux-2.2.11-pre2/include/linux/in.h	Tue May 11 10:35:43 1999
+++ linux/include/linux/in.h	Mon Dec  3 18:52:30 2001
@@ -38,6 +38,10 @@
 
   IPPROTO_PIM    = 103,		/* Protocol Independent Multicast	*/
 
+  IPPROTO_ESP = 50,            /* Encapsulation Security Payload protocol */
+  IPPROTO_AH = 51,             /* Authentication Header protocol       */
+  IPPROTO_COMP   = 108,                /* Compression Header protocol */
+
   IPPROTO_RAW	 = 255,		/* Raw IP packets			*/
   IPPROTO_MAX
 };
diff -urN linux-2.2.11-pre2/include/linux/in6.h linux/include/linux/in6.h
--- linux-2.2.11-pre2/include/linux/in6.h	Thu Apr 22 19:45:19 1999
+++ linux/include/linux/in6.h	Mon Dec  3 18:52:30 2001
@@ -129,8 +129,6 @@
 #define IPPROTO_HOPOPTS		0	/* IPv6 hop-by-hop options	*/
 #define IPPROTO_ROUTING		43	/* IPv6 routing header		*/
 #define IPPROTO_FRAGMENT	44	/* IPv6 fragmentation header	*/
-#define IPPROTO_ESP		50	/* encapsulating security payload */
-#define IPPROTO_AH		51	/* authentication header	*/
 #define IPPROTO_ICMPV6		58	/* ICMPv6			*/
 #define IPPROTO_NONE		59	/* IPv6 no next header		*/
 #define IPPROTO_DSTOPTS		60	/* IPv6 destination options	*/
diff -urN linux-2.2.11-pre2/include/linux/socket.h linux/include/linux/socket.h
--- linux-2.2.11-pre2/include/linux/socket.h	Mon Dec  3 18:52:04 2001
+++ linux/include/linux/socket.h	Mon Dec  3 18:52:30 2001
@@ -146,7 +146,7 @@
 #define AF_DECnet	12	/* Reserved for DECnet project	*/
 #define AF_NETBEUI	13	/* Reserved for 802.2LLC project*/
 #define AF_SECURITY	14	/* Security callback pseudo AF */
-#define pseudo_AF_KEY   15      /* PF_KEY key management API */
+#define AF_KEY   15      /* PF_KEY key management API */
 #define AF_NETLINK	16
 #define AF_ROUTE	AF_NETLINK /* Alias to emulate 4.4BSD */
 #define AF_PACKET	17	/* Packet family		*/
@@ -174,7 +174,7 @@
 #define PF_DECnet	AF_DECnet
 #define PF_NETBEUI	AF_NETBEUI
 #define PF_SECURITY	AF_SECURITY
-#define PF_KEY          pseudo_AF_KEY
+#define PF_KEY      AF_KEY
 #define PF_NETLINK	AF_NETLINK
 #define PF_ROUTE	AF_ROUTE
 #define PF_PACKET	AF_PACKET
@@ -261,4 +261,20 @@
 extern int put_cmsg(struct msghdr*, int level, int type, int len, void *data);
 #endif
 #endif /* not kernel and not glibc */
+
+#if !defined(__KERNEL__) && (!defined(__GLIBC__) || (__GLIBC__ < 2))
+
+/* Socket types for libc5 compatibility -- KTK */
+
+#define SOCK_STREAM    1		/* stream (connection) socket	*/
+#define SOCK_DGRAM     2		/* datagram (conn.less) socket	*/
+#define SOCK_RAW       3		/* raw socket			*/
+#define SOCK_RDM       4		/* reliably-delivered message	*/
+#define SOCK_SEQPACKET 5		/* sequential packet socket	*/
+#define SOCK_PACKET    10		/* linux specific way of	*/
+					/* getting packets at the dev	*/
+					/* level.  For writing rarp and */
+					/* other similar things on the	*/
+					/* user level.			*/
+#endif /* libc<=5 && !kernel */
 #endif /* _LINUX_SOCKET_H */
diff -urN linux-2.2.11-pre2/include/linux/sysctl.h linux/include/linux/sysctl.h
--- linux-2.2.11-pre2/include/linux/sysctl.h	Mon Dec  3 18:52:04 2001
+++ linux/include/linux/sysctl.h	Mon Dec  3 18:52:30 2001
@@ -470,6 +470,7 @@
 
 extern ctl_handler sysctl_string;
 extern ctl_handler sysctl_intvec;
+extern ctl_handler sysctl_jiffies;
 
 extern int do_string (
 	void *oldval, size_t *oldlenp, void *newval, size_t newlen,
diff -urN linux-2.2.11-pre2/include/linux/wireless.h linux/include/linux/wireless.h
--- linux-2.2.11-pre2/include/linux/wireless.h	Sat Apr 24 17:51:48 1999
+++ linux/include/linux/wireless.h	Mon Dec  3 18:52:30 2001
@@ -1,9 +1,9 @@
 /*
  * This file define a set of standard wireless extensions
  *
- * Version :	7	23.4.99
+ * Version :	8	28.7.99
  *
- * Authors :	Jean Tourrilhes - HPLB - <jt@hplb.hpl.hp.com>
+ * Authors :	Jean Tourrilhes - HPL - <jt@hpl.hp.com>
  */
 
 #ifndef _LINUX_WIRELESS_H
@@ -63,7 +63,7 @@
  * (there is some stuff that will be added in the future...)
  * I just plan to increment with each new version.
  */
-#define WIRELESS_EXT	6
+#define WIRELESS_EXT	8
 
 /*
  * Changes :
@@ -90,6 +90,12 @@
  * V6 to V7
  * --------
  *	- define IW_ESSID_MAX_SIZE and IW_MAX_AP
+ *
+ * V7 to V8
+ * --------
+ *	- Changed my e-mail address
+ *	- More 802.11 support (nickname, rate, rts, frag)
+ *	- List index in frequencies
  */
 
 /* -------------------------- IOCTL LIST -------------------------- */
@@ -117,24 +123,34 @@
 #define SIOCGIWSPY	0x8B11		/* get spy info (quality of link) */
 
 /* Access Point manipulation */
-#define SIOCSIWAP	0x8B14		/* set access point hardware addresses */
-#define SIOCGIWAP	0x8B15		/* get access point hardware addresses */
+#define SIOCSIWAP	0x8B14		/* set access point MAC addresses */
+#define SIOCGIWAP	0x8B15		/* get access point MAC addresses */
 #define SIOCGIWAPLIST	0x8B17		/* get list of access point in range */
 
 /* 802.11 specific support */
 #define SIOCSIWESSID	0x8B1A		/* set ESSID (network name) */
 #define SIOCGIWESSID	0x8B1B		/* get ESSID */
-/* As the ESSID is a string up to 32 bytes long, it doesn't fit within the
- * 'iwreq' structure, so we need to use the 'data' member to point to a
- * string in user space, like it is done for RANGE...
- * The "flags" member indicate if the ESSID is active or not.
+#define SIOCSIWNICKN	0x8B1C		/* set node name/nickname */
+#define SIOCGIWNICKN	0x8B1D		/* get node name/nickname */
+/* As the ESSID and NICKN are strings up to 32 bytes long, it doesn't fit
+ * within the 'iwreq' structure, so we need to use the 'data' member to
+ * point to a string in user space, like it is done for RANGE...
+ * The "flags" member indicate if the ESSID is active or not (promiscuous).
  */
 
+/* Other parameters usefull in 802.11 and some other devices */
+#define SIOCSIWRATE	0x8B20		/* set default bit rate (bps) */
+#define SIOCGIWRATE	0x8B21		/* get default bit rate (bps) */
+#define SIOCSIWRTS	0x8B22		/* set RTS/CTS threshold (bytes) */
+#define SIOCGIWRTS	0x8B23		/* get RTS/CTS threshold (bytes) */
+#define SIOCSIWFRAG	0x8B24		/* set fragmentation thr (bytes) */
+#define SIOCGIWFRAG	0x8B25		/* get fragmentation thr (bytes) */
+
 /* ------------------------- IOCTL STUFF ------------------------- */
 
 /* The first and the last (range) */
 #define SIOCIWFIRST	0x8B00
-#define SIOCIWLAST	0x8B1B
+#define SIOCIWLAST	0x8B25
 
 /* Even : get (world access), odd : set (root access) */
 #define IW_IS_SET(cmd)	(!((cmd) & 0x1))
@@ -171,6 +187,9 @@
  * don't increase this constant and don't fill the frequency list.
  * The user will be able to set by channel anyway... */
 
+/* Maximum bit rates in the range struct */
+#define IW_MAX_BITRATES		8
+
 /* Maximum of address that you may set with SPY */
 #define IW_MAX_SPY		8
 
@@ -178,7 +197,7 @@
    list of access points in range */
 #define IW_MAX_AP		8
 
-/* Maximum size of the ESSID string */
+/* Maximum size of the ESSID and NICKN strings */
 #define IW_ESSID_MAX_SIZE	32
 
 /****************************** TYPES ******************************/
@@ -186,15 +205,17 @@
 /* --------------------------- SUBTYPES --------------------------- */
 /*
  *	A frequency
- *	For numbers lower than 10^9, we encode the number in 'mant' and
- *	set 'exp' to 0
- *	For number greater than 10^9, we divide it by a power of 10.
- *	The power of 10 is in 'exp', the result is in 'mant'.
+ *	For numbers lower than 10^9, we encode the number in 'm' and
+ *	set 'e' to 0
+ *	For number greater than 10^9, we divide it by the lowest power
+ *	of 10 to get 'm' lower than 10^9, with 'm'= f / (10^'e')...
+ *	The power of 10 is in 'e', the result of the division is in 'm'.
  */
 struct	iw_freq
 {
 	__u32		m;		/* Mantissa */
 	__u16		e;		/* Exponent */
+	__u8		i;		/* List index (when in range struct) */
 };
 
 /*
@@ -229,6 +250,15 @@
   __u64	code;			/* Data/key used for algorithm */
 };
 
+/*
+ *	Generic format for parameters
+ */
+struct	iw_param
+{
+  __s32		value;		/* The value of the parameter itself */
+  __u8		fixed;		/* Hardware should not use auto select */
+};
+
 
 /* ------------------------ WIRELESS STATS ------------------------ */
 /*
@@ -258,7 +288,7 @@
 {
 	union
 	{
-		char	ifrn_name[IFNAMSIZ];	/* if name, e.g. "en0" */
+		char	ifrn_name[IFNAMSIZ];	/* if name, e.g. "eth0" */
 	} ifr_ifrn;
 
 	/* Data part */
@@ -281,7 +311,11 @@
 
 		struct iw_encoding	encoding;	/* Encoding stuff */
 
-		__u32	sensitivity;		/* signal level threshold */
+		__u32	sensitivity;		/* Obsolete, but compatible */
+		struct iw_param	sens;		/* signal level threshold */
+		struct iw_param	bitrate;	/* default bit rate */
+		struct iw_param	rts;		/* RTS threshold threshold */
+		struct iw_param	frag;		/* Fragmentation threshold */
 
 		struct sockaddr	ap_addr;	/* Access point address */
 
@@ -309,6 +343,12 @@
 {
 	/* Informative stuff (to choose between different interface) */
 	__u32		throughput;	/* To give an idea... */
+	/* In theory this value should be the maximum benchmarked
+	 * TCP/IP throughput, because with most of these devices the
+	 * bit rate is meaningless (overhead an co) to estimate how
+	 * fast the connection will go and pick the fastest one.
+	 * I suggest people to play with Netperf or any benchmark...
+	 */
 
 	/* NWID (or domain id) */
 	__u32		min_nwid;	/* Minimal NWID we are able to set */
@@ -321,13 +361,25 @@
 	/* Note : this frequency list doesn't need to fit channel numbers */
 
 	/* signal level threshold range */
-	__u32	sensitivity;
+	__s32	sensitivity;
 
 	/* Quality of link & SNR stuff */
 	struct iw_quality	max_qual;	/* Quality of the link */
 
 	/* Encoder stuff */
 	struct iw_encoding	max_encoding;	/* Encoding max range */
+
+	/* Rates */
+	__u8		num_bitrates;	/* Number of entries in the list */
+	__s32		bitrate[IW_MAX_BITRATES];	/* list, in bps */
+
+	/* RTS threshold */
+	__s32		min_rts;	/* Minimal RTS threshold */
+	__s32		max_rts;	/* Maximal RTS threshold */
+
+	/* Frag threshold */
+	__s32		min_frag;	/* Minimal frag threshold */
+	__s32		max_frag;	/* Maximal frag threshold */
 };
 
 /*
diff -urN linux-2.2.11-pre2/include/linux/yam.h linux/include/linux/yam.h
--- linux-2.2.11-pre2/include/linux/yam.h	Wed Dec 31 16:00:00 1969
+++ linux/include/linux/yam.h	Mon Dec  3 18:52:30 2001
@@ -0,0 +1,82 @@
+/*****************************************************************************/
+
+/*
+ *	yam.h  -- YAM radio modem driver.
+ *
+ *	Copyright (C) 1998 Frederic Rible F1OAT (frible@teaser.fr)
+ *	Adapted from baycom.c driver written by Thomas Sailer (sailer@ife.ee.ethz.ch)
+ *
+ *	This program is free software; you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation; either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	This program is distributed in the hope that it will be useful,
+ *	but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *	GNU General Public License for more details.
+ *
+ *	You should have received a copy of the GNU General Public License
+ *	along with this program; if not, write to the Free Software
+ *	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ *
+ */
+
+/*****************************************************************************/
+
+#define SIOCYAMRESERVED	(0)
+#define SIOCYAMSCFG 	(1)	/* Set configuration */
+#define SIOCYAMGCFG 	(2)	/* Get configuration */
+#define SIOCYAMSMCS 	(3)	/* Set mcs data */
+
+#define YAM_IOBASE   (1 << 0)
+#define YAM_IRQ      (1 << 1)
+#define YAM_BITRATE  (1 << 2) /* Bit rate of radio port ->57600 */
+#define YAM_MODE     (1 << 3) /* 0=simplex 1=duplex 2=duplex+tempo */
+#define YAM_HOLDDLY  (1 << 4) /* duplex tempo (sec) */
+#define YAM_TXDELAY  (1 << 5) /* Tx Delay (ms) */
+#define YAM_TXTAIL   (1 << 6) /* Tx Tail  (ms) */
+#define YAM_PERSIST  (1 << 7) /* Persist  (ms) */
+#define YAM_SLOTTIME (1 << 8) /* Slottime (ms) */
+#define YAM_BAUDRATE (1 << 9) /* Baud rate of rs232 port ->115200 */
+
+#define YAM_MAXBITRATE  57600
+#define YAM_MAXBAUDRATE 115200
+#define YAM_MAXMODE     2
+#define YAM_MAXHOLDDLY  99
+#define YAM_MAXTXDELAY  999
+#define YAM_MAXTXTAIL   999
+#define YAM_MAXPERSIST  255
+#define YAM_MAXSLOTTIME 999
+
+#define YAM_FPGA_SIZE	5302
+
+struct yamcfg {
+	unsigned int mask;		/* Mask of commands */
+	unsigned int iobase;	/* IO Base of COM port */
+	unsigned int irq;		/* IRQ of COM port */
+	unsigned int bitrate;	/* Bit rate of radio port */
+	unsigned int baudrate;	/* Baud rate of the RS232 port */
+	unsigned int txdelay;	/* TxDelay */
+	unsigned int txtail;	/* TxTail */
+	unsigned int persist;	/* Persistence */
+	unsigned int slottime;	/* Slottime */
+	unsigned int mode;		/* mode 0 (simp), 1(Dupl), 2(Dupl+delay) */
+	unsigned int holddly;	/* PTT delay in FullDuplex 2 mode */
+};
+
+struct yamdrv_ioctl_cfg {
+	int cmd;
+	struct yamcfg cfg;
+};
+
+struct yamdrv_ioctl_mcs {
+	int cmd;
+	int bitrate;
+	unsigned char bits[YAM_FPGA_SIZE];
+};
diff -urN linux-2.2.11-pre2/include/net/br.h linux/include/net/br.h
--- linux-2.2.11-pre2/include/net/br.h	Sun Mar  7 15:25:23 1999
+++ linux/include/net/br.h	Mon Dec  3 18:52:30 2001
@@ -42,7 +42,7 @@
 
 /* broacast/multicast storm limitation. This per source. */
 #define MAX_MCAST_PER_PERIOD    4
-#define MCAST_HOLD_TIME		10	/* in jiffies unit (10ms increment) */
+#define MCAST_HOLD_TIME		(10*HZ/100)
 
 #define Default_path_cost 10
 
diff -urN linux-2.2.11-pre2/include/net/pkt_cls.h linux/include/net/pkt_cls.h
--- linux-2.2.11-pre2/include/net/pkt_cls.h	Thu Mar 25 09:23:34 1999
+++ linux/include/net/pkt_cls.h	Mon Dec  3 18:52:30 2001
@@ -79,9 +79,12 @@
 
 extern __inline__ unsigned long cls_set_class(unsigned long *clp, unsigned long cl)
 {
-	cl = xchg(clp, cl);
+	unsigned long old_cl; 
+
+	old_cl = *clp;
+	*clp = cl;
 	synchronize_bh();
-	return cl;
+	return old_cl;
 }
 
 extern int register_tcf_proto_ops(struct tcf_proto_ops *ops);
diff -urN linux-2.2.11-pre2/include/net/sock.h linux/include/net/sock.h
--- linux-2.2.11-pre2/include/net/sock.h	Mon Dec  3 18:52:04 2001
+++ linux/include/net/sock.h	Mon Dec  3 18:52:30 2001
@@ -300,6 +300,7 @@
 
 	__u32	last_seg_size;	/* Size of last incoming segment */
 	__u32	rcv_mss;	/* MSS used for delayed ACK decisions */ 
+	__u32 	partial_writers; /* # of clients wanting at the head packet */
 
 	struct open_request	*syn_wait_queue;
 	struct open_request	**syn_wait_last;
@@ -672,6 +673,7 @@
 #if 0
 /* debugging code: the test isn't even 100% correct, but it can catch bugs */
 /* Note that a double lock is ok in theory - it's just _usually_ a bug */
+/* Actually it can easily happen with multiple writers */ 
 	if (atomic_read(&sk->sock_readers)) {
 		printk("double lock on socket at %p\n", gethere());
 here:
diff -urN linux-2.2.11-pre2/include/net/tcp.h linux/include/net/tcp.h
--- linux-2.2.11-pre2/include/net/tcp.h	Mon Dec  3 18:52:04 2001
+++ linux/include/net/tcp.h	Mon Dec  3 18:52:30 2001
@@ -120,6 +120,8 @@
 	/* These _must_ match the beginning of struct sock precisely.
 	 * XXX Yes I know this is gross, but I'd have to edit every single
 	 * XXX networking file if I created a "struct sock_header". -DaveM
+	 * Just don't forget -fno-strict-aliasing, but it should be really
+	 * fixed -AK
 	 */
 	struct sock		*sklist_next;
 	struct sock		*sklist_prev;
@@ -140,12 +142,13 @@
 				nonagle;
 
 	/* And these are ours. */
-	__u32			rcv_nxt;
+	__u32			rcv_nxt,snd_nxt;
 	struct tcp_func		*af_specific;
 	struct tcp_bind_bucket	*tb;
 	struct tcp_tw_bucket	*next_death;
 	struct tcp_tw_bucket	**pprev_death;
 	int			death_slot;
+	
 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
 	struct in6_addr		v6_daddr;
 	struct in6_addr		v6_rcv_saddr;
@@ -476,7 +479,13 @@
 						    struct tcphdr *th, 
 						    unsigned len);
 
-extern int			tcp_timewait_state_process(struct tcp_tw_bucket *tw,
+enum tcp_tw_status {
+		TCP_TW_SUCCESS = 0,
+		TCP_TW_RST = 1,
+		TCP_TW_ACK = 2
+		};
+
+extern enum tcp_tw_status tcp_timewait_state_process(struct tcp_tw_bucket *tw,
 							   struct sk_buff *skb,
 							   struct tcphdr *th,
 							   unsigned len);
diff -urN linux-2.2.11-pre2/kernel/fork.c linux/kernel/fork.c
--- linux-2.2.11-pre2/kernel/fork.c	Mon Apr 12 12:44:26 1999
+++ linux/kernel/fork.c	Mon Dec  3 18:52:30 2001
@@ -610,7 +610,7 @@
 	{
 		int i;
 		p->has_cpu = 0;
-		p->processor = NO_PROC_ID;
+		p->processor = current->processor;
 		/* ?? should we just memset this ?? */
 		for(i = 0; i < smp_num_cpus; i++)
 			p->per_cpu_utime[i] = p->per_cpu_stime[i] = 0;
diff -urN linux-2.2.11-pre2/kernel/sysctl.c linux/kernel/sysctl.c
--- linux-2.2.11-pre2/kernel/sysctl.c	Mon Dec  3 18:52:04 2001
+++ linux/kernel/sysctl.c	Mon Dec  3 18:52:30 2001
@@ -1035,6 +1035,34 @@
 	return 0;
 }
 
+/* Strategy function to convert jiffies to seconds */ 
+int sysctl_jiffies(ctl_table *table, int *name, int nlen,
+		void *oldval, size_t *oldlenp,
+		void *newval, size_t newlen, void **context)
+{
+	if (oldval) {
+		size_t olen;
+		if (oldlenp) { 
+			if (get_user(olen, oldlenp))
+				return -EFAULT;
+			if (olen!=sizeof(int))
+				return -EINVAL; 
+		}
+		if (put_user(*(int *)(table->data) / HZ, (int *)oldval) || 
+		    (oldlenp && put_user(sizeof(int),oldlenp)))
+			return -EFAULT;
+	}
+	if (newval && newlen) { 
+		int new;
+		if (newlen != sizeof(int))
+			return -EINVAL; 
+		if (get_user(new, (int *)newval))
+			return -EFAULT;
+		*(int *)(table->data) = new*HZ; 
+	}
+	return 1;
+}
+
 int do_string (
 	void *oldval, size_t *oldlenp, void *newval, size_t newlen,
 	int rdwr, char *data, size_t max)
diff -urN linux-2.2.11-pre2/lib/string.c linux/lib/string.c
--- linux-2.2.11-pre2/lib/string.c	Mon Dec  3 18:52:04 2001
+++ linux/lib/string.c	Mon Dec  3 18:52:30 2001
@@ -343,13 +343,13 @@
 #ifndef __HAVE_ARCH_MEMCHR
 void *memchr(const void *s, int c, size_t n)
 {
-	unsigned char *p = s;
+	const unsigned char *p = s;
 	while (n-- != 0) {
         	if ((unsigned char)c == *p++) {
-			return p-1;
+			return (void *)p-1;
 		}
 	}
 	return NULL;
 }
 
-#endif
\ No newline at end of file
+#endif
diff -urN linux-2.2.11-pre2/mm/mmap.c linux/mm/mmap.c
--- linux-2.2.11-pre2/mm/mmap.c	Tue May  4 15:44:38 1999
+++ linux/mm/mmap.c	Mon Dec  3 18:52:30 2001
@@ -359,8 +359,11 @@
 
 	if (len > TASK_SIZE)
 		return 0;
-	if (!addr)
-		addr = TASK_UNMAPPED_BASE;
+	if (!addr) {
+		addr = current->rlim[RLIMIT_DATA].rlim_cur;
+		if (addr >= RLIM_INFINITY)
+			addr = TASK_UNMAPPED_BASE;
+	}
 	addr = PAGE_ALIGN(addr);
 
 	for (vmm = find_vma(current->mm, addr); ; vmm = vmm->vm_next) {
diff -urN linux-2.2.11-pre2/net/bridge/br.c linux/net/bridge/br.c
--- linux-2.2.11-pre2/net/bridge/br.c	Mon Dec  3 18:52:04 2001
+++ linux/net/bridge/br.c	Mon Dec  3 18:52:30 2001
@@ -39,6 +39,8 @@
  *	Alan Cox:	Merged Jean-Rene's stuff, reformatted stuff a bit
  *			so blame me first if its broken ;)
  *
+ *	Robert Pintarelli:	fixed bug in bpdu time values
+ *	
  *	Todo:
  *		Don't bring up devices automatically. Start ports disabled
  *	and use a netlink notifier so a daemon can maintain the bridge
@@ -284,13 +286,13 @@
 			config_bpdu.message_age = Zero;	/* (4.6.1.3.2(5)) */
 		} else {
 			config_bpdu.message_age
-				= message_age_timer[bridge_info.root_port].value
-				+ Message_age_increment;	/* (4.6.1.3.2(6)) */
+				= (message_age_timer[bridge_info.root_port].value
+				+ Message_age_increment) << 8;	/* (4.6.1.3.2(6)) */
 		}
 
-		config_bpdu.max_age = bridge_info.max_age;/* (4.6.1.3.2(7)) */
-		config_bpdu.hello_time = bridge_info.hello_time;
-		config_bpdu.forward_delay = bridge_info.forward_delay;
+		config_bpdu.max_age = bridge_info.max_age << 8;/* (4.6.1.3.2(7)) */
+		config_bpdu.hello_time = bridge_info.hello_time << 8;
+		config_bpdu.forward_delay = bridge_info.forward_delay << 8;
 		config_bpdu.top_change_ack = 
 			port_info[port_no].top_change_ack;
 							/* (4.6.1.3.2(8)) */
@@ -363,10 +365,10 @@
 
 static void record_config_timeout_values(Config_bpdu *config)		  /* (4.6.3)	 */
 {
-	bridge_info.max_age = config->max_age;	  /* (4.6.3.3)	 */
-	bridge_info.hello_time = config->hello_time;
-	bridge_info.forward_delay = config->forward_delay;
-	bridge_info.top_change = config->top_change;
+	bridge_info.max_age = config->max_age >> 8;	  /* (4.6.3.3)	 */
+	bridge_info.hello_time = config->hello_time >> 8;
+	bridge_info.forward_delay = config->forward_delay >> 8;
+	bridge_info.top_change = config->top_change >> 8;
 }
 
 static void config_bpdu_generation(void)
diff -urN linux-2.2.11-pre2/net/ipv4/af_inet.c linux/net/ipv4/af_inet.c
--- linux-2.2.11-pre2/net/ipv4/af_inet.c	Mon Dec  3 18:52:04 2001
+++ linux/net/ipv4/af_inet.c	Mon Dec  3 18:52:30 2001
@@ -5,7 +5,7 @@
  *
  *		PF_INET protocol family socket handler.
  *
- * Version:	$Id: af_inet.c,v 1.87.2.3 1999/07/01 10:43:51 davem Exp $
+ * Version:	$Id: af_inet.c,v 1.87.2.5 1999/08/08 08:43:10 davem Exp $
  *
  * Authors:	Ross Biro, <bir7@leland.Stanford.Edu>
  *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
@@ -187,7 +187,6 @@
 			atomic_read(&sk->rmem_alloc),
 			atomic_read(&sk->wmem_alloc)));
 
-	sk->destroy = 1;
 	sk->ack_backlog = 0;
 	release_sock(sk);
 	net_reset_timer(sk, TIME_DESTROY, SOCK_DESTROY_TIME);
@@ -202,9 +201,11 @@
   	 */
   	net_delete_timer(sk);
 
-	if (sk->prot->destroy)
+	if (sk->prot->destroy && !sk->destroy)
 		sk->prot->destroy(sk);
 
+	sk->destroy = 1;
+
 	kill_sk_queues(sk);
 
 	/* Now if everything is gone we can free the socket
@@ -303,6 +304,9 @@
 			}
 			sk->sport = htons(sk->num);
 			add_to_prot_sklist(sk);
+		} else {
+			if (sk->prev)
+				((struct tcp_bind_bucket*)sk->prev)->fastreuse = 0;
 		}
 
 		dst_release(xchg(&sk->dst_cache, NULL));
diff -urN linux-2.2.11-pre2/net/ipv4/devinet.c linux/net/ipv4/devinet.c
--- linux-2.2.11-pre2/net/ipv4/devinet.c	Mon Dec  3 18:52:04 2001
+++ linux/net/ipv4/devinet.c	Mon Dec  3 18:52:30 2001
@@ -1,7 +1,7 @@
 /*
  *	NET3	IP device support routines.
  *
- *	Version: $Id: devinet.c,v 1.28.2.1 1999/06/28 10:39:30 davem Exp $
+ *	Version: $Id: devinet.c,v 1.28.2.2 1999/08/07 10:56:18 davem Exp $
  *
  *		This program is free software; you can redistribute it and/or
  *		modify it under the terms of the GNU General Public License
@@ -652,9 +652,10 @@
 	for_primary_ifa(in_dev) {
 		if (ifa->ifa_scope > scope)
 			continue;
-		addr = ifa->ifa_local;
 		if (!dst || inet_ifa_match(dst, ifa))
-			return addr;
+			return ifa->ifa_local;
+		if (!addr)
+			addr = ifa->ifa_local;
 	} endfor_ifa(in_dev);
 	
 	if (addr || scope >= RT_SCOPE_LINK)
diff -urN linux-2.2.11-pre2/net/ipv4/igmp.c linux/net/ipv4/igmp.c
--- linux-2.2.11-pre2/net/ipv4/igmp.c	Thu Mar 25 09:23:34 1999
+++ linux/net/ipv4/igmp.c	Mon Dec  3 18:52:30 2001
@@ -8,7 +8,7 @@
  *	the older version didn't come out right using gcc 2.5.8, the newer one
  *	seems to fall out with gcc 2.6.2.
  *
- *	Version: $Id: igmp.c,v 1.30 1999/03/25 10:04:10 davem Exp $
+ *	Version: $Id: igmp.c,v 1.30.2.1 1999/07/23 15:29:22 davem Exp $
  *
  *	Authors:
  *		Alan Cox <Alan.Cox@linux.org>
@@ -242,7 +242,7 @@
 
 	/* Timers are only set for non-local groups */
 
-	if (LOCAL_MCAST(group))
+	if (group == IGMP_ALL_HOSTS)
 		return;
 
 	for (im=in_dev->mc_list; im!=NULL; im=im->next) {
@@ -284,7 +284,7 @@
 	for (im=in_dev->mc_list; im!=NULL; im=im->next) {
 		if (group && group != im->multiaddr)
 			continue;
-		if (LOCAL_MCAST(im->multiaddr))
+		if (im->multiaddr == IGMP_ALL_HOSTS)
 			continue;
 		im->unsolicit_count = 0;
 		if (im->tm_running && (long)(im->timer.expires-jiffies) > max_delay)
@@ -377,7 +377,7 @@
 	}
 
 #ifdef CONFIG_IP_MULTICAST
-	if (LOCAL_MCAST(im->multiaddr))
+	if (im->multiaddr == IGMP_ALL_HOSTS)
 		return;
 
 	start_bh_atomic();
@@ -397,7 +397,7 @@
 	}
 
 #ifdef CONFIG_IP_MULTICAST
-	if (LOCAL_MCAST(im->multiaddr))
+	if (im->multiaddr == IGMP_ALL_HOSTS)
 		return;
 
 	start_bh_atomic();
diff -urN linux-2.2.11-pre2/net/ipv4/ip_fw.c linux/net/ipv4/ip_fw.c
--- linux-2.2.11-pre2/net/ipv4/ip_fw.c	Tue Jun  8 20:33:07 1999
+++ linux/net/ipv4/ip_fw.c	Mon Dec  3 18:52:30 2001
@@ -37,6 +37,9 @@
  * 19-May-1999: Star Wars: The Phantom Menace opened.  Rule num
  *		printed in log (modified from Michael Hasenstein's patch).
  *		Added SYN in log message. --RR
+ * 23-Jul-1999: Fixed small fragment security exposure opened on 15-May-1998.
+ *              John McDonald <jm@dataprotect.com>
+ *              Thomas Lopatic <tl@dataprotect.com>
  */
 
 /*
@@ -645,6 +648,18 @@
 			size_req = 0;
 		}
 		offset = (ntohs(ip->tot_len) < (ip->ihl<<2)+size_req);
+
+		/* If it is a truncated first fragment then it can be
+		 * used to rewrite port information, and thus should
+		 * be blocked.
+		 */
+		if (offset && (ntohs(ip->frag_off) & IP_MF)) {
+			if (!testing && net_ratelimit()) {
+				printk("Suspect short first fragment.\n");
+				dump_packet(ip,rif,NULL,NULL,0,0,0,0);
+			}
+			return FW_BLOCK;
+		}
 	}
 
 	src = ip->saddr;
diff -urN linux-2.2.11-pre2/net/ipv4/ip_masq.c linux/net/ipv4/ip_masq.c
--- linux-2.2.11-pre2/net/ipv4/ip_masq.c	Mon Dec  3 18:52:04 2001
+++ linux/net/ipv4/ip_masq.c	Mon Dec  3 18:52:30 2001
@@ -4,7 +4,7 @@
  *
  * 	Copyright (c) 1994 Pauline Middelink
  *
- *	$Id: ip_masq.c,v 1.34.2.1 1999/07/02 10:10:00 davem Exp $
+ *	$Id: ip_masq.c,v 1.34.2.2 1999/08/07 10:56:28 davem Exp $
  *
  *
  *	See ip_fw.c for original log
diff -urN linux-2.2.11-pre2/net/ipv4/ip_masq_user.c linux/net/ipv4/ip_masq_user.c
--- linux-2.2.11-pre2/net/ipv4/ip_masq_user.c	Mon Dec  3 18:52:04 2001
+++ linux/net/ipv4/ip_masq_user.c	Mon Dec  3 18:52:30 2001
@@ -2,7 +2,7 @@
  *	IP_MASQ_USER user space control module
  *
  *
- *	$Id: ip_masq_user.c,v 1.1 1998/08/29 23:51:08 davem Exp $
+ *	$Id: ip_masq_user.c,v 1.1.2.1 1999/08/07 10:56:33 davem Exp $
  */
 
 #include <linux/config.h>
diff -urN linux-2.2.11-pre2/net/ipv4/route.c linux/net/ipv4/route.c
--- linux-2.2.11-pre2/net/ipv4/route.c	Mon Dec  3 18:52:04 2001
+++ linux/net/ipv4/route.c	Mon Dec  3 18:52:30 2001
@@ -5,7 +5,7 @@
  *
  *		ROUTE - implementation of the IP router.
  *
- * Version:	$Id: route.c,v 1.67.2.1 1999/06/28 10:39:11 davem Exp $
+ * Version:	$Id: route.c,v 1.67.2.3 1999/08/08 08:43:12 davem Exp $
  *
  * Authors:	Ross Biro, <bir7@leland.Stanford.Edu>
  *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
@@ -957,7 +957,7 @@
 
 	if (rt->key.iif == 0)
 		src = rt->rt_src;
-	else if (fib_lookup(&rt->key, &res) == 0)
+	else if (fib_lookup(&rt->key, &res) == 0 && res.type != RTN_NAT)
 		src = FIB_RES_PREFSRC(res);
 	else
 		src = inet_select_addr(rt->u.dst.dev, rt->rt_gateway, RT_SCOPE_UNIVERSE);
@@ -1927,16 +1927,30 @@
 		return -EINVAL;
 }
 
+static int ipv4_sysctl_rtcache_flush_strategy(ctl_table *table, int *name, int nlen,
+			 void *oldval, size_t *oldlenp,
+			 void *newval, size_t newlen, 
+			 void **context)
+{
+	int delay;
+	if (newlen != sizeof(int))
+		return -EINVAL;
+	if (get_user(delay,(int *)newval))
+		return -EFAULT; 
+	rt_cache_flush(delay); 
+	return 0;
+}
+
 ctl_table ipv4_route_table[] = {
         {NET_IPV4_ROUTE_FLUSH, "flush",
-         &flush_delay, sizeof(int), 0200, NULL,
-         &ipv4_sysctl_rtcache_flush},
+         &flush_delay, sizeof(int), 0644, NULL,
+         &ipv4_sysctl_rtcache_flush, &ipv4_sysctl_rtcache_flush_strategy },
 	{NET_IPV4_ROUTE_MIN_DELAY, "min_delay",
          &ip_rt_min_delay, sizeof(int), 0644, NULL,
-         &proc_dointvec_jiffies},
+         &proc_dointvec_jiffies, &sysctl_jiffies},
 	{NET_IPV4_ROUTE_MAX_DELAY, "max_delay",
          &ip_rt_max_delay, sizeof(int), 0644, NULL,
-         &proc_dointvec_jiffies},
+         &proc_dointvec_jiffies, &sysctl_jiffies},
 	{NET_IPV4_ROUTE_GC_THRESH, "gc_thresh",
          &ipv4_dst_ops.gc_thresh, sizeof(int), 0644, NULL,
          &proc_dointvec},
@@ -1945,13 +1959,13 @@
          &proc_dointvec},
 	{NET_IPV4_ROUTE_GC_MIN_INTERVAL, "gc_min_interval",
          &ip_rt_gc_min_interval, sizeof(int), 0644, NULL,
-         &proc_dointvec_jiffies},
+         &proc_dointvec_jiffies, &sysctl_jiffies},
 	{NET_IPV4_ROUTE_GC_TIMEOUT, "gc_timeout",
          &ip_rt_gc_timeout, sizeof(int), 0644, NULL,
-         &proc_dointvec_jiffies},
+         &proc_dointvec_jiffies, &sysctl_jiffies},
 	{NET_IPV4_ROUTE_GC_INTERVAL, "gc_interval",
          &ip_rt_gc_interval, sizeof(int), 0644, NULL,
-         &proc_dointvec_jiffies},
+         &proc_dointvec_jiffies, &sysctl_jiffies},
 	{NET_IPV4_ROUTE_REDIRECT_LOAD, "redirect_load",
          &ip_rt_redirect_load, sizeof(int), 0644, NULL,
          &proc_dointvec},
@@ -1972,7 +1986,7 @@
          &proc_dointvec},
 	{NET_IPV4_ROUTE_MTU_EXPIRES, "mtu_expires",
          &ip_rt_mtu_expires, sizeof(int), 0644, NULL,
-         &proc_dointvec_jiffies},
+         &proc_dointvec_jiffies, &sysctl_jiffies},
 	 {0}
 };
 #endif
diff -urN linux-2.2.11-pre2/net/ipv4/syncookies.c linux/net/ipv4/syncookies.c
--- linux-2.2.11-pre2/net/ipv4/syncookies.c	Tue Mar 16 21:52:05 1999
+++ linux/net/ipv4/syncookies.c	Mon Dec  3 18:52:30 2001
@@ -9,7 +9,7 @@
  *      as published by the Free Software Foundation; either version
  *      2 of the License, or (at your option) any later version.
  * 
- *  $Id: syncookies.c,v 1.7 1999/03/17 02:34:57 davem Exp $
+ *  $Id: syncookies.c,v 1.7.2.1 1999/08/08 08:43:13 davem Exp $
  *
  *  Missing: IPv6 support. 
  */
@@ -145,7 +145,10 @@
  	req->rmt_port = skb->h.th->source;
 	req->af.v4_req.loc_addr = skb->nh.iph->daddr;
 	req->af.v4_req.rmt_addr = skb->nh.iph->saddr;
-	req->class = &or_ipv4; /* for savety */
+	req->class = &or_ipv4; /* for safety */
+#ifdef CONFIG_IP_TRANSPARENT_PROXY 
+	req->lcl_port = skb->h.th->dest;
+#endif
 
 	req->af.v4_req.opt = NULL;
 
diff -urN linux-2.2.11-pre2/net/ipv4/sysctl_net_ipv4.c linux/net/ipv4/sysctl_net_ipv4.c
--- linux-2.2.11-pre2/net/ipv4/sysctl_net_ipv4.c	Mon Jan  4 15:31:35 1999
+++ linux/net/ipv4/sysctl_net_ipv4.c	Mon Dec  3 18:52:30 2001
@@ -1,7 +1,7 @@
 /*
  * sysctl_net_ipv4.c: sysctl interface to net IPV4 subsystem.
  *
- * $Id: sysctl_net_ipv4.c,v 1.38 1999/01/02 16:51:48 davem Exp $
+ * $Id: sysctl_net_ipv4.c,v 1.38.2.1 1999/08/08 08:43:14 davem Exp $
  *
  * Begun April 1, 1996, Mike Shaver.
  * Added /proc/sys/net/ipv4 directory entry (empty =) ). [MS]
@@ -90,9 +90,23 @@
 	if (write && ipv4_devconf.forwarding != val)
 		inet_forward_change();
 
-        return ret;
+	return ret;
 }
 
+static int ipv4_sysctl_forward_strategy(ctl_table *table, int *name, int nlen,
+			 void *oldval, size_t *oldlenp,
+			 void *newval, size_t newlen, 
+			 void **context)
+{
+	int new;
+	if (newlen != sizeof(int))
+		return -EINVAL;
+	if (get_user(new,(int *)newval))
+		return -EFAULT; 
+	if (new != ipv4_devconf.forwarding) 
+		inet_forward_change(); 
+	return 0; /* caller does change again and handles handles oldval */ 
+}
 
 ctl_table ipv4_table[] = {
         {NET_IPV4_TCP_TIMESTAMPS, "tcp_timestamps",
@@ -109,7 +123,7 @@
          &proc_dointvec},
         {NET_IPV4_FORWARD, "ip_forward",
          &ipv4_devconf.forwarding, sizeof(int), 0644, NULL,
-         &ipv4_sysctl_forward},
+         &ipv4_sysctl_forward,&ipv4_sysctl_forward_strategy},
         {NET_IPV4_DEFAULT_TTL, "ip_default_ttl",
          &ip_statistics.IpDefaultTTL, sizeof(int), 0644, NULL,
          &proc_dointvec},
@@ -132,12 +146,13 @@
 	 &sysctl_ip_masq_debug, sizeof(int), 0644, NULL, &proc_dointvec},
 #endif
 	{NET_IPV4_IPFRAG_TIME, "ipfrag_time",
-	 &sysctl_ipfrag_time, sizeof(int), 0644, NULL, &proc_dointvec_jiffies},
+	 &sysctl_ipfrag_time, sizeof(int), 0644, NULL, &proc_dointvec_jiffies, 
+	 &sysctl_jiffies},
 	{NET_IPV4_TCP_MAX_KA_PROBES, "tcp_max_ka_probes",
 	 &sysctl_tcp_max_ka_probes, sizeof(int), 0644, NULL, &proc_dointvec},
 	{NET_IPV4_TCP_KEEPALIVE_TIME, "tcp_keepalive_time",
 	 &sysctl_tcp_keepalive_time, sizeof(int), 0644, NULL, 
-	 &proc_dointvec_jiffies},
+	 &proc_dointvec_jiffies, &sysctl_jiffies},
 	{NET_IPV4_TCP_KEEPALIVE_PROBES, "tcp_keepalive_probes",
 	 &sysctl_tcp_keepalive_probes, sizeof(int), 0644, NULL, 
 	 &proc_dointvec},
@@ -148,7 +163,7 @@
 	 &sysctl_tcp_retries2, sizeof(int), 0644, NULL, &proc_dointvec},
 	{NET_IPV4_TCP_FIN_TIMEOUT, "tcp_fin_timeout",
 	 &sysctl_tcp_fin_timeout, sizeof(int), 0644, NULL, 
-	 &proc_dointvec_jiffies},
+	 &proc_dointvec_jiffies, &sysctl_jiffies},
 #ifdef CONFIG_SYN_COOKIES
 	{NET_TCP_SYNCOOKIES, "tcp_syncookies",
 	 &sysctl_tcp_syncookies, sizeof(int), 0644, NULL, &proc_dointvec},
diff -urN linux-2.2.11-pre2/net/ipv4/tcp.c linux/net/ipv4/tcp.c
--- linux-2.2.11-pre2/net/ipv4/tcp.c	Mon Dec  3 18:52:04 2001
+++ linux/net/ipv4/tcp.c	Mon Dec  3 18:52:30 2001
@@ -5,7 +5,7 @@
  *
  *		Implementation of the Transmission Control Protocol(TCP).
  *
- * Version:	$Id: tcp.c,v 1.140.2.1 1999/05/29 04:16:48 davem Exp $
+ * Version:	$Id: tcp.c,v 1.140.2.4 1999/08/09 03:13:12 davem Exp $
  *
  * Authors:	Ross Biro, <bir7@leland.Stanford.Edu>
  *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
@@ -725,6 +725,23 @@
 	lock_sock(sk);
 }
 
+/*
+ * Wait for a buffer.
+ */ 
+static int wait_for_buffer(struct sock *sk) 
+{ 
+	struct wait_queue wait = { current, NULL }; 
+
+	release_sock(sk); 
+	add_wait_queue(sk->sleep, &wait); 
+	current->state = TASK_INTERRUPTIBLE; 
+	schedule(); 
+	current->state = TASK_RUNNING; 
+	remove_wait_queue(sk->sleep, &wait);
+	lock_sock(sk); 
+	return 0; 
+} 
+
 /* When all user supplied data has been queued set the PSH bit */
 #define PSH_NEEDED (seglen == 0 && iovlen == 0)
 
@@ -802,11 +819,21 @@
 				    tp->snd_nxt < TCP_SKB_CB(skb)->end_seq) {
 					int last_byte_was_odd = (copy % 4);
 
+					/* 
+					 * Check for parallel writers sleeping in user access.
+					 */ 
+					if (tp->partial_writers++ > 0) { 
+						wait_for_buffer(sk);
+						tp->partial_writers--;
+						continue; 
+					}
+				
 					copy = mss_now - copy;
 					if(copy > skb_tailroom(skb))
 						copy = skb_tailroom(skb);
 					if(copy > seglen)
 						copy = seglen;
+		
 					if(last_byte_was_odd) {
 						if(copy_from_user(skb_put(skb, copy),
 								  from, copy))
@@ -819,6 +846,7 @@
 							from, skb_put(skb, copy),
 							copy, skb->csum, &err);
 					}
+		
 					/*
 					 * FIXME: the *_user functions should
 					 *	  return how much data was
@@ -838,6 +866,10 @@
 					seglen -= copy;
 					if (PSH_NEEDED)
 						TCP_SKB_CB(skb)->flags |= TCPCB_FLAG_PSH;
+
+					if (--tp->partial_writers > 0) 
+						wake_up_interruptible(sk->sleep); 
+
 					continue;
 				}
 			}
@@ -1335,8 +1367,8 @@
 	if(copied >= 0 && msg->msg_name) {
 		tp->af_specific->addr2sockaddr(sk, (struct sockaddr *)
 					       msg->msg_name);       
-	if(addr_len)
-		*addr_len = tp->af_specific->sockaddr_len;
+		if(addr_len)
+			*addr_len = tp->af_specific->sockaddr_len;
 	}
 
 	remove_wait_queue(sk->sleep, &wait);
diff -urN linux-2.2.11-pre2/net/ipv4/tcp_input.c linux/net/ipv4/tcp_input.c
--- linux-2.2.11-pre2/net/ipv4/tcp_input.c	Mon Dec  3 18:52:04 2001
+++ linux/net/ipv4/tcp_input.c	Mon Dec  3 18:52:30 2001
@@ -5,7 +5,7 @@
  *
  *		Implementation of the Transmission Control Protocol(TCP).
  *
- * Version:	$Id: tcp_input.c,v 1.164.2.5 1999/06/30 09:27:05 davem Exp $
+ * Version:	$Id: tcp_input.c,v 1.164.2.6 1999/08/08 08:43:18 davem Exp $
  *
  * Authors:	Ross Biro, <bir7@leland.Stanford.Edu>
  *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
@@ -213,21 +213,19 @@
 extern __inline__ void tcp_replace_ts_recent(struct sock *sk, struct tcp_opt *tp,
 					     __u32 start_seq, __u32 end_seq)
 {
-	/* From draft-ietf-tcplw-high-performance: the correct
-	 * test is last_ack_sent <= end_seq.
-	 * (RFC1323 stated last_ack_sent < end_seq.)
-	 *
-	 * HOWEVER: The current check contradicts the draft statements.
-	 * It has been done for good reasons.
-	 * The implemented check improves security and eliminates
-	 * unnecessary RTT overestimation.
-	 *		1998/06/27  Andrey V. Savochkin <saw@msu.ru>
+	/* It is start_seq <= last_ack_seq combined
+	   with in window check. If start_seq<=last_ack_seq<=rcv_nxt,
+	   then segment is in window if end_seq>=rcv_nxt.
 	 */
-	if (!before(end_seq, tp->last_ack_sent - sk->rcvbuf) &&
-	    !after(start_seq, tp->rcv_wup + tp->rcv_wnd)) {
+	if (!after(start_seq, tp->last_ack_sent) &&
+	    !before(end_seq, tp->rcv_nxt)) {
 		/* PAWS bug workaround wrt. ACK frames, the PAWS discard
 		 * extra check below makes sure this can only happen
 		 * for pure ACK frames.  -DaveM
+		 *
+		 * Plus: expired timestamps.
+		 *
+		 * Plus: resets failing PAWS.
 		 */
 		if((s32)(tp->rcv_tsval - tp->ts_recent) >= 0) {
 			tp->ts_recent = tp->rcv_tsval;
@@ -240,11 +238,10 @@
 
 extern __inline__ int tcp_paws_discard(struct tcp_opt *tp, struct tcphdr *th, unsigned len)
 {
-	/* ts_recent must be younger than 24 days */
-	return (((s32)(tcp_time_stamp - tp->ts_recent_stamp) >= PAWS_24DAYS) ||
-		(((s32)(tp->rcv_tsval - tp->ts_recent) < 0) &&
-		 /* Sorry, PAWS as specified is broken wrt. pure-ACKs -DaveM */
-		 (len != (th->doff * 4))));
+	return ((s32)(tp->rcv_tsval - tp->ts_recent) < 0 &&
+		(s32)(tcp_time_stamp - tp->ts_recent_stamp) < PAWS_24DAYS &&
+		/* Sorry, PAWS as specified is broken wrt. pure-ACKs -DaveM */
+		len != (th->doff * 4));
 }
 
 
@@ -946,11 +943,13 @@
 
 /* We come here as a special case from the AF specific TCP input processing,
  * and the SKB has no owner.  Essentially handling this is very simple,
- * we just keep silently eating rx'd packets until none show up for the
- * entire timeout period.  The only special cases are for BSD TIME_WAIT
- * reconnects and SYN/RST bits being set in the TCP header.
+ * we just keep silently eating rx'd packets, acking them if necessary,
+ * until none show up for the entire timeout period. 
+ *
+ * Return 0, TCP_TW_ACK, TCP_TW_RST
  */
-int tcp_timewait_state_process(struct tcp_tw_bucket *tw, struct sk_buff *skb,
+enum tcp_tw_status 
+tcp_timewait_state_process(struct tcp_tw_bucket *tw, struct sk_buff *skb,
 			       struct tcphdr *th, unsigned len)
 {
 	/*	RFC 1122:
@@ -971,7 +970,7 @@
 		struct tcp_func *af_specific = tw->af_specific;
 		__u32 isn;
 
-		isn = tw->rcv_nxt + 128000;
+		isn = tw->snd_nxt + 128000;
 		if(isn == 0)
 			isn++;
 		tcp_tw_deschedule(tw);
@@ -984,7 +983,7 @@
 		skb_set_owner_r(skb, sk);
 		af_specific = sk->tp_pinfo.af_tcp.af_specific;
 		if(af_specific->conn_request(sk, skb, isn) < 0)
-			return 1; /* Toss a reset back. */
+			return TCP_TW_RST; /* Toss a reset back. */
 		return 0; /* Discard the frame. */
 	}
 
@@ -999,13 +998,17 @@
 			tcp_timewait_kill(tw);
 		}
 		if(!th->rst)
-			return 1; /* toss a reset back */
+			return TCP_TW_RST; /* toss a reset back */
+		return 0;
 	} else {
 		/* In this case we must reset the TIMEWAIT timer. */
 		if(th->ack)
 			tcp_tw_reschedule(tw);
 	}
-	return 0; /* Discard the frame. */
+	/* Ack old packets if necessary */ 
+	if (!after(TCP_SKB_CB(skb)->end_seq, tw->rcv_nxt)) 
+		return TCP_TW_ACK; 
+	return 0; 
 }
 
 /* Enter the time wait state.  This is always called from BH
@@ -1064,6 +1067,7 @@
 		tw->family	= sk->family;
 		tw->reuse	= sk->reuse;
 		tw->rcv_nxt	= sk->tp_pinfo.af_tcp.rcv_nxt;
+		tw->snd_nxt = sk->tp_pinfo.af_tcp.snd_nxt;
 		tw->af_specific	= sk->tp_pinfo.af_tcp.af_specific;
 
 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
@@ -1535,7 +1539,6 @@
 	 * Now tell the user we may have some data.
 	 */
 	if (!sk->dead) {
-		SOCK_DEBUG(sk, "Data wakeup.\n");
 		sk->data_ready(sk,0);
 	}
 	return(1);
@@ -1975,7 +1978,7 @@
 	flg &= __constant_htonl(0x00170000);
 	/* Only SYN set? */
 	if (flg == __constant_htonl(0x00020000)) {
-		if (!after(TCP_SKB_CB(skb)->seq, req->rcv_isn)) {
+		if (TCP_SKB_CB(skb)->seq == req->rcv_isn) {
 			/*	retransmited syn.
 			 */
 			req->class->rtx_syn_ack(sk, req); 
diff -urN linux-2.2.11-pre2/net/ipv4/tcp_ipv4.c linux/net/ipv4/tcp_ipv4.c
--- linux-2.2.11-pre2/net/ipv4/tcp_ipv4.c	Mon Dec  3 18:52:04 2001
+++ linux/net/ipv4/tcp_ipv4.c	Mon Dec  3 18:52:30 2001
@@ -5,7 +5,7 @@
  *
  *		Implementation of the Transmission Control Protocol(TCP).
  *
- * Version:	$Id: tcp_ipv4.c,v 1.175.2.6 1999/07/02 10:09:59 davem Exp $
+ * Version:	$Id: tcp_ipv4.c,v 1.175.2.8 1999/08/08 08:43:20 davem Exp $
  *
  *		IPv4 specific functions
  *
@@ -178,6 +178,17 @@
 {
 	struct tcp_bind_bucket *tb = (struct tcp_bind_bucket *)sk->prev;
 
+#ifdef CONFIG_IP_TRANSPARENT_PROXY
+	if (child->num != sk->num) {
+		unsigned short snum = ntohs(child->num);
+		for(tb = tcp_bound_hash[tcp_bhashfn(snum)];
+		    tb && tb->port != snum;
+		    tb = tb->next)
+			;
+		if (tb == NULL)
+			tb = (struct tcp_bind_bucket *)sk->prev;
+	}
+#endif
 	if ((child->bind_next = tb->owners) != NULL)
 		tb->owners->bind_pprev = &child->bind_next;
 	tb->owners = child;
@@ -542,7 +553,8 @@
 			 * so it actually scales.
 			 */
 			sk = __tcp_v4_lookup(NULL, sk->daddr, sk->dport,
-					     sk->rcv_saddr, snum, sk->bound_dev_if);
+					     sk->rcv_saddr, htons(snum),
+					     sk->bound_dev_if);
 			if((sk != NULL) && (sk->state != TCP_LISTEN))
 				retval = 0;
 			break;
@@ -1007,6 +1019,46 @@
 	tcp_statistics.TcpOutRsts++;
 }
 
+/* 
+ *	Send an ACK for a socket less packet (needed for time wait) 
+ *
+ *  FIXME: Does not echo timestamps yet.
+ *
+ *  Assumes that the caller did basic address and flag checks.
+ */
+static void tcp_v4_send_ack(struct sk_buff *skb, __u32 seq, __u32 ack)
+{
+	struct tcphdr *th = skb->h.th;
+	struct tcphdr rth;
+	struct ip_reply_arg arg;
+
+	/* Swap the send and the receive. */
+	memset(&rth, 0, sizeof(struct tcphdr)); 
+	rth.dest = th->source;
+	rth.source = th->dest; 
+	rth.doff = sizeof(struct tcphdr)/4;
+
+	rth.seq = seq;
+	rth.ack_seq = ack; 
+	rth.ack = 1;
+
+	memset(&arg, 0, sizeof arg); 
+	arg.iov[0].iov_base = (unsigned char *)&rth; 
+	arg.iov[0].iov_len  = sizeof rth;
+	arg.csum = csum_tcpudp_nofold(skb->nh.iph->daddr, 
+				      skb->nh.iph->saddr, /*XXX*/
+				      sizeof(struct tcphdr),
+				      IPPROTO_TCP,
+				      0); 
+	arg.n_iov = 1;
+	arg.csumoffset = offsetof(struct tcphdr, check) / 2; 
+
+	ip_send_reply(tcp_socket->sk, skb, &arg, sizeof rth);
+
+	tcp_statistics.TcpOutSegs++;
+}
+
+
 #ifdef CONFIG_IP_TRANSPARENT_PROXY
 
 /*
@@ -1560,7 +1612,7 @@
 			sk = tcp_check_req(sk, skb, req);
 		}
 #ifdef CONFIG_SYN_COOKIES
-		else {
+		else if (flg == __constant_htonl(0x00120000))  {
 			sk = cookie_v4_check(sk, skb, &(IPCB(skb)->opt));
 		}
 #endif
@@ -1720,10 +1772,19 @@
   	return 0;
 
 do_time_wait:
-	if(tcp_timewait_state_process((struct tcp_tw_bucket *)sk,
-				      skb, th, skb->len))
-		goto no_tcp_socket;
-	goto discard_it;
+	/* Sorry for the ugly switch. 2.3 will have a better solution. */ 
+	switch (tcp_timewait_state_process((struct tcp_tw_bucket *)sk,
+							   skb, th, skb->len)) {
+	case TCP_TW_ACK:
+		tcp_v4_send_ack(skb, ((struct tcp_tw_bucket *)sk)->snd_nxt,
+						((struct tcp_tw_bucket *)sk)->rcv_nxt); 
+		break; 
+	case TCP_TW_RST:
+		goto no_tcp_socket; 
+	default:
+		goto discard_it; 
+	}
+	return 0;
 }
 
 static void __tcp_v4_rehash(struct sock *sk)
diff -urN linux-2.2.11-pre2/net/ipv4/udp.c linux/net/ipv4/udp.c
--- linux-2.2.11-pre2/net/ipv4/udp.c	Mon Dec  3 18:52:04 2001
+++ linux/net/ipv4/udp.c	Mon Dec  3 18:52:30 2001
@@ -5,7 +5,7 @@
  *
  *		The User Datagram Protocol (UDP).
  *
- * Version:	$Id: udp.c,v 1.66.2.1 1999/06/20 20:14:48 davem Exp $
+ * Version:	$Id: udp.c,v 1.66.2.3 1999/08/07 10:56:36 davem Exp $
  *
  * Authors:	Ross Biro, <bir7@leland.Stanford.Edu>
  *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
@@ -687,8 +687,15 @@
 		connected = 0;
 	}
 
-	if (connected)
-		rt = (struct rtable*)dst_clone(sk->dst_cache);
+	if (connected && sk->dst_cache) {
+		rt = (struct rtable*)sk->dst_cache;
+		if (rt->u.dst.obsolete) {
+			sk->dst_cache = NULL;
+			dst_release(&rt->u.dst);
+			rt = NULL;
+		} else
+			dst_clone(&rt->u.dst);
+	}
 
 	if (rt == NULL) {
 		err = ip_route_output(&rt, daddr, ufh.saddr,
@@ -702,6 +709,8 @@
 		err = -EACCES;
 		if (rt->rt_flags&RTCF_BROADCAST && !sk->broadcast) 
 			goto out;
+		if (connected && sk->dst_cache == NULL)
+			sk->dst_cache = dst_clone(&rt->u.dst);
 	}
 
 	ufh.saddr = rt->rt_src;
diff -urN linux-2.2.11-pre2/net/ipv6/ip6_fw.c linux/net/ipv6/ip6_fw.c
--- linux-2.2.11-pre2/net/ipv6/ip6_fw.c	Mon Dec  3 18:52:04 2001
+++ linux/net/ipv6/ip6_fw.c	Mon Dec  3 18:52:30 2001
@@ -5,7 +5,7 @@
  *	Authors:
  *	Pedro Roque		<roque@di.fc.ul.pt>	
  *
- *	$Id: ip6_fw.c,v 1.10 1998/08/26 12:04:57 davem Exp $
+ *	$Id: ip6_fw.c,v 1.10.2.1 1999/08/07 10:56:39 davem Exp $
  *
  *	This program is free software; you can redistribute it and/or
  *      modify it under the terms of the GNU General Public License
diff -urN linux-2.2.11-pre2/net/ipv6/tcp_ipv6.c linux/net/ipv6/tcp_ipv6.c
--- linux-2.2.11-pre2/net/ipv6/tcp_ipv6.c	Mon Dec  3 18:52:04 2001
+++ linux/net/ipv6/tcp_ipv6.c	Mon Dec  3 18:52:30 2001
@@ -5,7 +5,7 @@
  *	Authors:
  *	Pedro Roque		<roque@di.fc.ul.pt>	
  *
- *	$Id: tcp_ipv6.c,v 1.104.2.4 1999/06/30 09:27:12 davem Exp $
+ *	$Id: tcp_ipv6.c,v 1.104.2.6 1999/08/08 08:43:23 davem Exp $
  *
  *	Based on: 
  *	linux/net/ipv4/tcp.c
@@ -342,7 +342,8 @@
 			 */
 			sk = __tcp_v6_lookup(NULL, &sk->net_pinfo.af_inet6.daddr,
 					     sk->dport,
-					     &sk->net_pinfo.af_inet6.rcv_saddr, snum,
+					     &sk->net_pinfo.af_inet6.rcv_saddr,
+					     htons(snum),
 					     sk->bound_dev_if);
 			if((sk != NULL) && (sk->state != TCP_LISTEN))
 				retval = 0;
@@ -1120,6 +1121,57 @@
 	kfree_skb(buff);
 }
 
+static void tcp_v6_send_ack(struct sk_buff *skb, __u32 seq, __u32 ack)
+{
+	struct tcphdr *th = skb->h.th, *t1; 
+	struct sk_buff *buff;
+	struct flowi fl;
+
+	buff = alloc_skb(MAX_HEADER + sizeof(struct ipv6hdr), GFP_ATOMIC);
+	if (buff == NULL) 
+	  	return;
+
+	skb_reserve(buff, MAX_HEADER + sizeof(struct ipv6hdr));
+
+	t1 = (struct tcphdr *) skb_push(buff,sizeof(struct tcphdr));
+
+	/* Swap the send and the receive. */
+	memset(t1, 0, sizeof(*t1));
+	t1->dest = th->source;
+	t1->source = th->dest;
+	t1->doff = sizeof(*t1)/4;
+	t1->ack = 1;
+	t1->seq = seq;
+	t1->ack_seq = ack; 
+
+	buff->csum = csum_partial((char *)t1, sizeof(*t1), 0);
+
+	fl.nl_u.ip6_u.daddr = &skb->nh.ipv6h->saddr;
+	fl.nl_u.ip6_u.saddr = &skb->nh.ipv6h->daddr;
+	fl.fl6_flowlabel = 0;
+
+	t1->check = csum_ipv6_magic(fl.nl_u.ip6_u.saddr,
+				    fl.nl_u.ip6_u.daddr, 
+				    sizeof(*t1), IPPROTO_TCP,
+				    buff->csum);
+
+	fl.proto = IPPROTO_TCP;
+	fl.oif = tcp_v6_iif(skb);
+	fl.uli_u.ports.dport = t1->dest;
+	fl.uli_u.ports.sport = t1->source;
+
+	/* sk = NULL, but it is safe for now. static socket required. */
+	buff->dst = ip6_route_output(NULL, &fl);
+
+	if (buff->dst->error == 0) {
+		ip6_xmit(NULL, buff, &fl, NULL);
+		tcp_statistics.TcpOutSegs++;
+		return;
+	}
+
+	kfree_skb(buff);
+}
+
 static struct open_request *tcp_v6_search_req(struct tcp_opt *tp,
 					      struct ipv6hdr *ip6h,
 					      struct tcphdr *th,
@@ -1408,10 +1460,19 @@
 	return 0;
 
 do_time_wait:
-	if(tcp_timewait_state_process((struct tcp_tw_bucket *)sk,
-				      skb, th, skb->len))
+	switch (tcp_timewait_state_process((struct tcp_tw_bucket *)sk,
+									   skb, th, skb->len)) {
+	case TCP_TW_ACK:
+		tcp_v6_send_ack(skb, ((struct tcp_tw_bucket *)sk)->snd_nxt,
+						((struct tcp_tw_bucket *)sk)->rcv_nxt); 
+		break; 
+	case TCP_TW_RST:
 		goto no_tcp_socket;
-	goto discard_it;
+	default:
+		goto discard_it; 
+	}
+
+	return 0;
 }
 
 static int tcp_v6_rebuild_header(struct sock *sk)
diff -urN linux-2.2.11-pre2/net/netsyms.c linux/net/netsyms.c
--- linux-2.2.11-pre2/net/netsyms.c	Mon Dec  3 18:52:04 2001
+++ linux/net/netsyms.c	Mon Dec  3 18:52:30 2001
@@ -21,6 +21,7 @@
 #include <net/dst.h>
 #include <net/checksum.h>
 #include <linux/etherdevice.h>
+#include <net/route.h>
 #ifdef CONFIG_HIPPI
 #include <linux/hippidevice.h>
 #endif
@@ -177,6 +178,7 @@
 EXPORT_SYMBOL(neigh_parms_alloc);
 EXPORT_SYMBOL(neigh_parms_release);
 EXPORT_SYMBOL(neigh_rand_reach_time);
+EXPORT_SYMBOL(neigh_compat_output); 
 
 /*	dst_entry	*/
 EXPORT_SYMBOL(dst_alloc);
@@ -238,6 +240,7 @@
 EXPORT_SYMBOL(inet_dgram_ops);
 EXPORT_SYMBOL(ip_cmsg_recv);
 EXPORT_SYMBOL(__release_sock);
+EXPORT_SYMBOL(inet_addr_type); 
 
 /* Route manipulation */
 EXPORT_SYMBOL(ip_rt_ioctl);
@@ -321,7 +324,6 @@
 EXPORT_SYMBOL(tcp_v4_syn_recv_sock);
 EXPORT_SYMBOL(tcp_v4_do_rcv);
 EXPORT_SYMBOL(tcp_v4_connect);
-EXPORT_SYMBOL(inet_addr_type);
 EXPORT_SYMBOL(net_reset_timer);
 EXPORT_SYMBOL(net_delete_timer);
 EXPORT_SYMBOL(udp_prot);
diff -urN linux-2.2.11-pre2/net/sched/sch_cbq.c linux/net/sched/sch_cbq.c
--- linux-2.2.11-pre2/net/sched/sch_cbq.c	Sat Apr 24 17:51:48 1999
+++ linux/net/sched/sch_cbq.c	Mon Dec  3 18:52:30 2001
@@ -176,6 +176,7 @@
 	struct cbq_class	*tx_borrowed;
 	int			tx_len;
 	psched_time_t		now;		/* Cached timestamp */
+	psched_time_t		now_rt;		/* Cached real time */
 	unsigned		pmask;
 
 	struct timer_list	delay_timer;
@@ -375,9 +376,11 @@
 
 	if (toplevel > cl->level && !(cl->q->flags&TCQ_F_THROTTLED)) {
 		psched_time_t now;
+		psched_tdiff_t incr;
+
 		PSCHED_GET_TIME(now);
-		if (PSCHED_TLESS(now, q->now))
-			now = q->now;
+		incr = PSCHED_TDIFF(now, q->now_rt);
+		PSCHED_TADD2(q->now, incr, now);
 
 		do {
 			if (PSCHED_TLESS(cl->undertime, now)) {
@@ -503,7 +506,7 @@
 			}
 		}
 
-		q->wd_expires = delay;
+		q->wd_expires = base_delay;
 	}
 }
 
@@ -756,14 +759,19 @@
 		         idle = (now - last) - last_pktlen/rate
 		 */
 
-		idle = PSCHED_TDIFF(q->now, cl->last) - L2T(cl, len);
+		idle = PSCHED_TDIFF(q->now, cl->last);
+		if ((unsigned long)idle > 128*1024*1024) {
+			avgidle = cl->maxidle;
+		} else {
+			idle -= L2T(cl, len);
 
 		/* true_avgidle := (1-W)*true_avgidle + W*idle,
 		   where W=2^{-ewma_log}. But cl->avgidle is scaled:
 		   cl->avgidle == true_avgidle/W,
 		   hence:
 		 */
-		avgidle += idle - (avgidle>>cl->ewma_log);
+			avgidle += idle - (avgidle>>cl->ewma_log);
+		}
 
 		if (avgidle <= 0) {
 			/* Overlimit or at-limit */
@@ -980,10 +988,13 @@
 	struct sk_buff *skb;
 	struct cbq_sched_data *q = (struct cbq_sched_data *)sch->data;
 	psched_time_t now;
+	psched_tdiff_t incr;
 
 	PSCHED_GET_TIME(now);
+	incr = PSCHED_TDIFF(now, q->now_rt);
 
 	if (q->tx_class) {
+		psched_tdiff_t incr2;
 		/* Time integrator. We calculate EOS time
 		   by adding expected packet transmittion time.
 		   If real time is greater, we warp artificial clock,
@@ -991,12 +1002,14 @@
 
 		   cbq_time = max(real_time, work);
 		 */
-		PSCHED_TADD(q->now, L2T(&q->link, q->tx_len));
-		if (PSCHED_TLESS(q->now, now))
-			q->now = now;
+		incr2 = L2T(&q->link, q->tx_len);
+		PSCHED_TADD(q->now, incr2);
 		cbq_update(q);
-	} else if (PSCHED_TLESS(q->now, now))
-		q->now = now;
+		if ((incr -= incr2) < 0)
+			incr = 0;
+	}
+	PSCHED_TADD(q->now, incr);
+	q->now_rt = now;
 
 	for (;;) {
 		q->wd_expires = 0;
@@ -1044,6 +1057,11 @@
 			del_timer(&q->wd_timer);
 			if (delay <= 0)
 				delay = 1;
+			if (delay > 10*HZ) {
+				if (net_ratelimit())
+					printk(KERN_DEBUG "CBQ delay %ld > 10sec\n", delay);
+				delay = 10*HZ;
+			}
 			q->wd_timer.expires = jiffies + delay;
 			add_timer(&q->wd_timer);
 			sch->flags |= TCQ_F_THROTTLED;
@@ -1224,7 +1242,7 @@
 	struct cbq_class *cl, *cl_head;
 	int prio;
 
-	for (prio = TC_CBQ_MAXPRIO; prio >= 0; prio++) {
+	for (prio = TC_CBQ_MAXPRIO; prio >= 0; prio--) {
 		if ((cl_head = q->active[prio]) == NULL)
 			continue;
 
@@ -1252,6 +1270,8 @@
 	del_timer(&q->wd_timer);
 	del_timer(&q->delay_timer);
 	q->toplevel = TC_CBQ_MAXLEVEL;
+	PSCHED_GET_TIME(q->now);
+	q->now_rt = q->now;
 
 	for (prio = 0; prio <= TC_CBQ_MAXPRIO; prio++)
 		q->active[prio] = NULL;
@@ -1425,6 +1445,8 @@
 	q->delay_timer.data = (unsigned long)sch;
 	q->delay_timer.function = cbq_undelay;
 	q->toplevel = TC_CBQ_MAXLEVEL;
+	PSCHED_GET_TIME(q->now);
+	q->now_rt = q->now;
 
 	cbq_link_class(&q->link);
 
diff -urN linux-2.2.11-pre2/net/unix/af_unix.c linux/net/unix/af_unix.c
--- linux-2.2.11-pre2/net/unix/af_unix.c	Mon Dec  3 18:52:04 2001
+++ linux/net/unix/af_unix.c	Mon Dec  3 18:52:30 2001
@@ -8,7 +8,7 @@
  *		as published by the Free Software Foundation; either version
  *		2 of the License, or (at your option) any later version.
  *
- * Version:	$Id: af_unix.c,v 1.76.2.1 1999/06/28 10:40:07 davem Exp $
+ * Version:	$Id: af_unix.c,v 1.76.2.2 1999/08/07 10:56:48 davem Exp $
  *
  * Fixes:
  *		Linus Torvalds	:	Assorted bug cures.
diff -urN linux-2.2.11-pre2/scripts/ksymoops/ksymoops.c linux/scripts/ksymoops/ksymoops.c
--- linux-2.2.11-pre2/scripts/ksymoops/ksymoops.c	Tue Jan  5 11:13:56 1999
+++ linux/scripts/ksymoops/ksymoops.c	Mon Dec  3 18:52:30 2001
@@ -482,6 +482,10 @@
 	multi_opt(spec_l, spec_L, 'l', *lsmod);
 	multi_opt(spec_m, spec_M, 'm', *system_map);
 
+	printf("WARNING: This version of ksymoops is obsolete.\n");
+	printf("WARNING: The current version can be obtained from ftp://ftp.ocs.com.au/pub/ksymoops\n");
+	warnings += 2;
+
 	printf("Options used:");
 	if (*vmlinux)
 		printf(" -v %s", *vmlinux);
