diff -u --recursive --new-file v2.4.8/linux/CREDITS linux/CREDITS
--- v2.4.8/linux/CREDITS	Wed Jul 25 17:10:16 2001
+++ linux/CREDITS	Sun Aug 12 17:36:24 2001
@@ -687,6 +687,17 @@
 S: Deering NH 03244
 S: USA
 
+N: Matt Domsch
+E: Matt_Domsch@dell.com
+W: http://www.dell.com/linux
+W: http://domsch.com/linux
+D: Linux/IA-64
+D: Dell PowerEdge server, SCSI layer, misc drivers, and other patches
+S: Dell Computer Corporation
+S: One Dell Way
+S: Round Rock, TX  78681
+S: USA
+
 N: Eddie C. Dost
 E: ecd@skynet.be
 D: Linux/Sparc kernel hacker
@@ -732,14 +743,27 @@
 S: USA
 
 N: Randy Dunlap
-E: randy.dunlap@intel.com
+E: rddunlap@osdlab.org
 W: http://home.att.net/~randy.dunlap/
+W: http://home.att.net/~rddunlap/
 W: http://www.linux-usb.org
 D: Linux-USB subsystem, USB core/UHCI/printer/storage drivers
-S: 5200 NE Elam Young Pkwy., M/S HF3-77
-S: Hillsboro, Oregon 97124
+D: x86 SMP, ACPI, bootflag hacking
+S: 15275 SW Koll Parkway, Suite H
+S: Beaverton, Oregon 97006
 S: USA
 
+N: Bob Dunlop
+E: rjd@xyzzy.clara.co.uk
+E: bob.dunlop@farsite.co.uk
+W: www.farsite.co.uk
+D: FarSync card device driver
+S: FarSite Communications Ltd
+S: Tempus Business Centre
+S: 60 Kingsclere Road
+S: Basingstoke       RG21 6XG
+S: UK
+
 N: Cyrus Durgin
 E: cider@speakeasy.org
 W: http://www.speakeasy.org/~cider/
@@ -924,6 +948,15 @@
 S: San Jose, California 95131
 S: USA
 
+N: Fernando Fuganti
+E: fuganti@conectiva.com.br
+E: fuganti@netbank.com.br
+D: random kernel hacker, ZF MachZ Watchdog driver
+S: Conectiva S.A.
+S: R. Tocantins, 89 - Cristo Rei
+S: 80050-430 - Curitiba - Paraná
+S: Brazil
+
 N: Nigel Gamble
 E: nigel@nrg.org
 E: nigel@sgi.com
@@ -1114,7 +1147,7 @@
 
 N: Andre Hedrick
 E: andre@linux-ide.org
-E: ahedrick@atipa.com
+E: andre@aslab.com
 E: andre@suse.com
 W: http://www.linux-ide.org/
 D: Random SMP kernel hacker...
@@ -1125,8 +1158,8 @@
 D: ATA-Smart Kernel Daemon
 S: Linux ATA Development (LAD)
 S: Concord, CA
-S: Atipa Linux Solutions
-S: 6000 Connecticut  Kansas City, MO  64120
+S: ASL, Inc. 1-877-ASL-3535
+S: 1757 Houret Court, Milpitas, CA 95035
 S: SuSE Linux, Inc.
 S: 580 Second Street, Suite 210  Oakland, CA  94607
 S: USA
@@ -2483,6 +2516,15 @@
 S: 52 Moore St
 S: Turner ACT 2612
 S: Australia
+
+N: Richard Russon (FlatCap)
+E: kernel@flatcap.org
+W: http://www.flatcap.org
+D: NTFS support
+D: LDM support (Win2000/XP Logical Disk Manager/Dynamic Disks)
+S: 50 Swansea Road
+S: Reading
+S: United Kingdom
 
 N: Bill Ryder
 E: bryder@sgi.com
diff -u --recursive --new-file v2.4.8/linux/Documentation/Configure.help linux/Documentation/Configure.help
--- v2.4.8/linux/Documentation/Configure.help	Sun Aug 12 13:27:58 2001
+++ linux/Documentation/Configure.help	Sun Aug 12 10:51:41 2001
@@ -2323,6 +2323,7 @@
   Ruffian             RPX164-2, AlphaPC164-UX, AlphaPC164-BX
   SX164               AlphaPC164-SX
   Sable               AS 2000, AS 2100
+  Shark		      DS 20L
   Takara              Takara
   Titan               Privateer
   Wildfire            AlphaServer GS 40/80/160/320
@@ -15585,8 +15586,30 @@
 
 Creative EMU10K1 based PCI sound cards
 CONFIG_SOUND_EMU10K1
-  Say Y or M if you have a PCI sound card using the EMU10K1
-  chipset, such as the Creative SBLive!,  SB PCI512 or Emu-APS.
+  Say Y or M if you have a PCI sound card using the EMU10K1 chipset,
+  such as the Creative SBLive!, SB PCI512 or Emu-APS.
+
+  For more information about the degree of support for the different
+  card models please check:
+
+       http://opensource.creative.com
+
+  It is now possible to load dsp microcode patches into the EMU10K1
+  chip.  These patches are used to implement real time sound processing
+  effects which include for example: signal routing, bass/treble control,
+  AC3 passthrough, ...
+  Userspace tools to create new patches and load/unload them can be found
+  at the above link. You need to get the source snapshot and then type:
+
+	% make tools
+	% make install-tools
+
+  in the top directory.
+
+Creative EMU10K1 MIDI
+CONFIG_MIDI_EMU10K1
+  Say Y if you want to be able to use the OSS /dev/sequencer interface.
+  This code is still experimental.
 
 Crystal SoundFusion (CS4280/461x)
 CONFIG_SOUND_FUSION
@@ -17971,6 +17994,16 @@
 
   If you're not sure, say N.
 
+SRM environment variables in procfs
+CONFIG_SRM_ENV
+  If you enable this option, a subdirectory called srm_environment
+  will give you access to the most important SRM environment
+  variables. If you've got an Alpha style system supporting
+  SRC, then it is a good idea to say Yes or Module to this driver.
+
+  This driver is also available as a module and will be called
+  srm_env.o if you build it as a module.
+  
 Footbridge internal watchdog
 CONFIG_21285_WATCHDOG
   The Intel Footbridge chip contains a builtin watchdog circuit. Say Y 
diff -u --recursive --new-file v2.4.8/linux/Documentation/SubmittingDrivers linux/Documentation/SubmittingDrivers
--- v2.4.8/linux/Documentation/SubmittingDrivers	Fri Apr  6 10:42:55 2001
+++ linux/Documentation/SubmittingDrivers	Sun Aug 12 10:38:47 2001
@@ -2,7 +2,7 @@
 ---------------------------------------
 
 This document is intended to explain how to submit device drivers to the
-Linux 2.2 and 2.4test kernel trees. Note that if you are interested in video
+Linux 2.2 and 2.4 kernel trees. Note that if you are interested in video
 card drivers you should probably talk to XFree86 (http://wwww.xfree86.org) 
 instead.
 
@@ -34,7 +34,7 @@
 	maintainer does not respond or you cannot find the appropriate
 	maintainer then please contact Alan Cox <alan@lxorguk.ukuu.org.uk>
 
-Linux 2.4test:
+Linux 2.4:
 	This kernel tree is under active development. The same rules apply
 	as 2.2 but you may wish to submit your driver via linux-kernel (see
 	resources) and follow that list to track changes in API's. These
diff -u --recursive --new-file v2.4.8/linux/Documentation/devices.txt linux/Documentation/devices.txt
--- v2.4.8/linux/Documentation/devices.txt	Sat May 19 17:43:05 2001
+++ linux/Documentation/devices.txt	Sun Aug 12 17:36:24 2001
@@ -1,17 +1,19 @@
+
 		       LINUX ALLOCATED DEVICES
 	     Maintained by H. Peter Anvin <device@lanana.org>
 
-		   Last revised: December 29, 2000
+		      Last revised: 3 June 2001
 
 This list is the Linux Device List, the official registry of allocated
 device numbers and /dev directory nodes for the Linux operating
 system.
 
-The latest version of this list is included with the Linux kernel
-sources.  It is also available separately from 
-http://www.kernel.org/pub/linux/docs/device-list/ or
-ftp://ftp.kernel.org/pub/linux/docs/device-list/.  The LaTeX version
-of this document is no longer maintained.
+The latest version of this list is available from
+http://www.lanana.org/docs/device-list/ or
+ftp://ftp.kernel.org/pub/linux/docs/device-list/.  This version may be
+newer than the one distributed with the Linux kernel.
+
+The LaTeX version of this document is no longer maintained.
 
 This document is included by reference into the Filesystem Hierarchy
 Standard (FHS).	 The FHS is available from http://www.pathname.com/fhs/.
@@ -38,6 +40,13 @@
 
 	  **** DEVICE DRIVERS AUTHORS PLEASE READ THIS ****
 
+THE DEVICE REGISTRY IS OFFICIALLY FROZEN FOR LINUS TORVALDS' KERNEL
+TREE.  At Linus' request, no more allocations will be made official
+for Linus' kernel tree; the 3 June 2001 version of this list is the
+official final version of this registry.  At Alan Cox' request,
+however, the registry will continue to be maintained for the -ac
+series of kernels, and registrations will be accepted.
+
 To have a major number allocated, or a minor number in situations
 where that applies (e.g. busmice), please contact me with the
 appropriate device information.	 Also, if you have additional
@@ -391,12 +400,25 @@
 		199 = /dev/scanners/cuecat :CueCat barcode scanner
 		200 = /dev/net/tun	TAP/TUN network device
 		201 = /dev/button/gulpb	Transmeta GULP-B buttons
-		204 = /dev/video/em8300	    EM8300 DVD decoder control
-		205 = /dev/video/em8300_mv  EM8300 DVD decoder video
-		206 = /dev/video/em8300_ma  EM8300 DVD decoder audio
-		207 = /dev/video/em8300_sp  EM8300 DVD decoder subpicture
-		208 = /dev/compaq/cpqphpc Compaq PCI Hot Plug Controller
-		209 = /dev/compaq/cpqrid  Compaq Remote Insight Driver
+		204 = /dev/video/em8300		EM8300 DVD decoder control
+		205 = /dev/video/em8300_mv	EM8300 DVD decoder video
+		206 = /dev/video/em8300_ma	EM8300 DVD decoder audio
+		207 = /dev/video/em8300_sp	EM8300 DVD decoder subpicture
+		208 = /dev/compaq/cpqphpc	Compaq PCI Hot Plug Controller
+		209 = /dev/compaq/cpqrid	Compaq Remote Insight Driver
+		210 = /dev/impi/bt	IMPI coprocessor block transfer	
+		211 = /dev/impi/smic	IMPI coprocessor stream interface
+		212 = /dev/watchdogs/0	First watchdog device
+		213 = /dev/watchdogs/1	Second watchdog device
+		214 = /dev/watchdogs/2	Third watchdog device
+		215 = /dev/watchdogs/3	Fourth watchdog device
+		216 = /dev/fujitsu/apanel	Fujitsu/Siemens application panel
+		217 = /dev/ni/natmotn		National Instruments Motion
+		218 = /dev/kchuid	Inter-process chuid control
+		219 = /dev/modems/mwave	MWave modem firmware upload
+		220 = /dev/mptctl	Message passing technology (MPT) control
+		221 = /dev/mvista/hssdsi	Montavista PICMG hot swap system driver
+		222 = /dev/mvista/hasi		Montavista PICMG high availability
 		240-255			Reserved for local use
 
  11 char	Raw keyboard device
@@ -430,14 +452,19 @@
 		  1 = /dev/dos_cd1	Second MSCDEX CD-ROM
 		    ...
 
- 13 char	PC speaker (OBSOLETE)
-		  0 = /dev/pcmixer	Emulates /dev/mixer
-		  1 = /dev/pcsp		Emulates /dev/dsp (8-bit)
-		  4 = /dev/pcaudio	Emulates /dev/audio
-		  5 = /dev/pcsp16	Emulates /dev/dsp (16-bit)
+ 13 char	Input core
+		  0 = /dev/input/js0	First joystick
+		  1 = /dev/input/js1	Second joystick
+		    ...
+		 32 = /dev/input/mouse0	First mouse
+		 33 = /dev/input/mouse1	Second mouse
+		    ...
+		 63 = /dev/input/mice	Unified mouse
+		 64 = /dev/input/event0	First event queue
+		 65 = /dev/input/event1	Second event queue
+		    ...
 
-		The current PC speaker driver uses the Open Sound
-		System interface, and these devices are obsolete.
+		Each device type has 5 bits (32 minors).
 
     block	8-bit MFM/RLL/IDE controller
 		  0 = /dev/xda		First XT disk whole disk
@@ -664,13 +691,12 @@
 		    ...
 		 31 = /dev/fb31		32nd frame buffer
 
-		Backward compatibility aliases {2.6}
-
-		 32 = /dev/fb1		Second frame buffer
+		For backwards compatibility {2.6} the following
+		progression is also handled by current kernels:
+		  0 = /dev/fb0
+		 32 = /dev/fb1
 		    ...
-		224 = /dev/fb7		Eighth frame buffer
-
-		All additional minor numbers are reserved.
+		224 = /dev/fb7
 
     block	Aztech/Orchid/Okano/Wearnes CD-ROM
 		  0 = /dev/aztcd	Aztech CD-ROM
@@ -945,7 +971,7 @@
 		  0 = /dev/rd/c0d0	First disk, whole disk
 		  8 = /dev/rd/c0d1	Second disk, whole disk
 		    ...
-		248 = /dev/rd/c0d15	16th disk, whole disk
+		248 = /dev/rd/c0d15	32nd disk, whole disk
 
 		For partitions add:
 		  0 = /dev/rd/c?d?	Whole disk
@@ -961,7 +987,7 @@
 		  0 = /dev/rd/c1d0	First disk, whole disk
 		  8 = /dev/rd/c1d1	Second disk, whole disk
 		    ...
-		248 = /dev/rd/c1d15	16th disk, whole disk
+		248 = /dev/rd/c1d31	32nd disk, whole disk
 
 		Partitions are handled as for major 48.
 
@@ -971,7 +997,7 @@
 		  0 = /dev/rd/c2d0	First disk, whole disk
 		  8 = /dev/rd/c2d1	Second disk, whole disk
 		    ...
-		248 = /dev/rd/c2d15	16th disk, whole disk
+		248 = /dev/rd/c2d31	32nd disk, whole disk
 
  51 char	Baycom radio modem
 		  0 = /dev/bc0		First Baycom radio modem
@@ -981,7 +1007,7 @@
 		  0 = /dev/rd/c3d0	First disk, whole disk
 		  8 = /dev/rd/c3d1	Second disk, whole disk
 		    ...
-		248 = /dev/rd/c3d15	16th disk, whole disk
+		248 = /dev/rd/c3d31	32nd disk, whole disk
 
 		Partitions are handled as for major 48.
 
@@ -994,7 +1020,7 @@
 		  0 = /dev/rd/c4d0	First disk, whole disk
 		  8 = /dev/rd/c4d1	Second disk, whole disk
 		    ...
-		248 = /dev/rd/c4d15	16th disk, whole disk
+		248 = /dev/rd/c4d31	32nd disk, whole disk
 
 		Partitions are handled as for major 48.
 
@@ -1016,7 +1042,7 @@
 		  0 = /dev/rd/c5d0	First disk, whole disk
 		  8 = /dev/rd/c5d1	Second disk, whole disk
 		    ...
-		248 = /dev/rd/c5d15	16th disk, whole disk
+		248 = /dev/rd/c5d31	32nd disk, whole disk
 
 		Partitions are handled as for major 48.
 
@@ -1033,7 +1059,7 @@
 		  0 = /dev/rd/c6d0	First disk, whole disk
 		  8 = /dev/rd/c6d1	Second disk, whole disk
 		    ...
-		248 = /dev/rd/c6d15	16th disk, whole disk
+		248 = /dev/rd/c6d31	32nd disk, whole disk
 
 		Partitions are handled as for major 48.
 
@@ -1043,7 +1069,7 @@
 		  0 = /dev/rd/c7d0	First disk, whole disk
 		  8 = /dev/rd/c7d1	Second disk, whole disk
 		    ...
-		248 = /dev/rd/c7d15	16th disk, whole disk
+		248 = /dev/rd/c7d31	32nd disk, whole disk
 
 		Partitions are handled as for major 48.
 
@@ -1541,7 +1567,6 @@
 		Partitions are handled the same way as for the first
 		interface (see major number 3).
 
-
  89 char	I2C bus interface
 		  0 = /dev/i2c-0	First I2C adapter
 		  1 = /dev/i2c-1	Second I2C adapter
@@ -1610,23 +1635,29 @@
 		  1 = /dev/dcxx1	Second capture card
 		    ...
 
+    block	IBM S/390 DASD block storage
+		  0 = /dev/dasda	First DASD device, major
+		  1 = /dev/dasda1	First DASD device, block 1
+		  2 = /dev/dasda2	First DASD device, block 2
+		  3 = /dev/dasda3	First DASD device, block 3
+		  4 = /dev/dasdb	Second DASD device, major
+		  5 = /dev/dasdb1	Second DASD device, block 1
+		  6 = /dev/dasdb2	Second DASD device, block 2
+		  7 = /dev/dasdb3	Second DASD device, block 3
+		    ...
+
  95 char	IP filter
 		  0 = /dev/ipl		Filter control device/log file
 		  1 = /dev/ipnat	NAT control device/log file
 		  2 = /dev/ipstate	State information log file
 		  3 = /dev/ipauth	Authentication control device/log file
-
-    block	IBM S/390 DASD block storage
-		  0 = /dev/dasd0	First DASD device, major
-		  1 = /dev/dasd0a	First DASD device, block 1
-		  2 = /dev/dasd0b	First DASD device, block 2
-		  3 = /dev/dasd0c	First DASD device, block 3
-		  4 = /dev/dasd1	Second DASD device, major
-		  5 = /dev/dasd1a	Second DASD device, block 1
-		  6 = /dev/dasd1b	Second DASD device, block 2
-		  7 = /dev/dasd1c	Second DASD device, block 3
 		    ...		
 
+    block	IBM S/390 VM/ESA minidisk
+		  0 = /dev/mnda		First VM/ESA minidisk
+		  1 = /dev/mndb		Second VM/ESA minidisk
+		    ...
+
  96 char	Parallel port ATAPI tape devices
 		  0 = /dev/pt0		First parallel port ATAPI tape
 		  1 = /dev/pt1		Second parallel port ATAPI tape
@@ -1635,11 +1666,6 @@
 		129 = /dev/npt1		Second p.p. ATAPI tape, no rewind
 		    ...
 
-    block	IBM S/390 VM/ESA minidisk
-		  0 = /dev/msd0		First VM/ESA minidisk
-		  1 = /dev/msd1		Second VM/ESA minidisk
-		    ...
-
  97 char	Parallel port generic ATAPI interface
 		  0 = /dev/pg0		First parallel port ATAPI device
 		  1 = /dev/pg1		Second parallel port ATAPI device
@@ -1706,6 +1732,16 @@
 		  2 = /dev/tlk2		Third Teletext decoder
 		  3 = /dev/tlk3		Fourth Teletext decoder
 
+    block	Compressed block device
+		  0 = /dev/cbd/a	First compressed block device, whole device
+		 16 = /dev/cbd/b	Second compressed block device, whole device
+		    ...
+		240 = /dev/cbd/p	16th compressed block device, whole device
+
+		Partitions are handled in the same way as for IDE
+		disks (see major number 3) except that the limit on
+		partitions is 15.
+
 103 char	Arla network file system
 		  0 = /dev/xfs0		Arla XFS
 
@@ -1837,11 +1873,30 @@
 		There is currently a device-naming conflict between
 		these and PAM multimodems (major 78).
 
+    block	IBM iSeries virtual disk
+		  0 = /dev/iseries/vda	First virtual disk, whole disk
+		  8 = /dev/iseries/vdb	Second virtual disk, whole disk
+		    ...
+		200 = /dev/iseries/vdz	26th virtual disk, whole disk
+		208 = /dev/iseries/vdaa	27th virtual disk, whole disk
+		    ...
+		240 = /dev/iseries/vdaf	32nd virtual disk, whole disk
+
+		Partitions are handled in the same way as for IDE
+		disks (see major number 3) except that the limit on
+		partitions is 7.
+
 113 char	ISI serial card - alternate devices
 		  0 = /dev/cum0		Callout device for ttyM0
 		  1 = /dev/cum1		Callout device for ttyM1
 		    ...
 
+    block	IBM iSeries virtual CD-ROM
+
+		  0 = /dev/iseries/vcda	First virtual CD-ROM
+		  1 = /dev/iseries/vcdb	Second virtual CD-ROM
+		    ...
+
 114 char	Picture Elements ISE board
 		  0 = /dev/ise0		First ISE board
 		  1 = /dev/ise1		Second ISE board
@@ -2005,9 +2060,9 @@
 		    ...
 
 162 char	Raw block device interface
-		  0 = /dev/raw		Raw I/O control device
-		  1 = /dev/raw1		First raw I/O device
-		  2 = /dev/raw2		Second raw I/O device
+		  0 = /dev/rawctl	Raw I/O control device
+		  1 = /dev/raw/raw1	First raw I/O device
+		  2 = /dev/raw/raw2	Second raw I/O device
 		    ...
 
 163 char	Radio Tech BIM-XXX-RS232 radio modem
@@ -2219,7 +2274,22 @@
 		    ...
 		255 = /dev/nvidiactl		Nvidia card control device
 
-196-197		UNASSIGNED
+196 char	Tormenta T1 card
+		  0 = /dev/tor/0		Master control channel for all cards
+		  1 = /dev/tor/1		First DS0
+		  2 = /dev/tor/2		Second DS0
+		    ...
+		 48 = /dev/tor/48		48th DS0
+		 49 = /dev/tor/49		First pseudo-channel
+		 50 = /dev/tor/50		Second pseudo-channel
+		    ...
+
+197 char	OpenTNF tracing facility
+		  0 = /dev/tnf/t0		Trace 0 data extraction
+		  1 = /dev/tnf/t1		Trace 1 data extraction
+		    ...
+		128 = /dev/tnf/status		Tracing facility status
+		130 = /dev/tnf/trace		Tracing device
 
 198 char	Total Impact TPMP2 quad coprocessor PCI card
 		  0 = /dev/tpmp2/0		First card
@@ -2288,6 +2358,9 @@
 		 16 = /dev/ttyAM0		ARM "AMBA" serial port 0
 		    ...
 		 31 = /dev/ttyAM15		ARM "AMBA" serial port 15
+		 32 = /dev/ttyDB0		DataBooster serial port 0
+		    ...
+		 39 = /dev/ttyDB7		DataBooster serial port 7
 
 205 char	Low-density serial ports (alternate device)
 		  0 = /dev/culu0		Callout device for ttyLU0
@@ -2309,6 +2382,9 @@
 		 16 = /dev/cuam0		Callout device for ttyAM0
 		    ...
 		 31 = /dev/cuam15		Callout device for ttyAM15
+		 32 = /dev/cudb0		Callout device for ttyDB0
+		    ...
+		 39 = /dev/cudb7		Callout device for ttyDB7
 
 206 char	OnStream SC-x0 tape devices
 		  0 = /dev/osst0		First OnStream SCSI tape, mode 0
@@ -2450,7 +2526,59 @@
 		  1 = /dev/cuy1			Callout device for ttyY1
 		    ...
 
-226-239		UNASSIGNED
+226 char	Direct Rendering Infrastructure (DRI)
+		  0 = /dev/dri/card0		First graphics card
+		  1 = /dev/dri/card1		Second graphics card
+		    ...
+
+227 char	IBM 3270 terminal block-mode access
+		  0 = /dev/3270/tub		Controlling interface
+		  1 = /dev/3270/tub1		First 3270 terminal
+		  2 = /dev/3270/tub2		Second 3270 terminal
+		    ...
+
+228 char	IBM 3270 terminal Unix tty access
+		  1 = /dev/3270/tty1		First 3270 terminal
+		  2 = /dev/3270/tty2		Seconds 3270 terminal
+		    ...
+
+229 char	IBM iSeries virtual console
+		  0 = /dev/iseries/vtty0	First console port
+		  1 = /dev/iseries/vtty1	Second console port
+		    ...
+
+230 char	IBM iSeries virtual tape
+		  0 = /dev/iseries/vt0		First virtual tape, mode 0
+		  1 = /dev/iseries/vt1		Second virtual tape, mode 0
+		    ...
+		 32 = /dev/iseries/vt0l		First virtual tape, mode 1
+		 33 = /dev/iseries/vt1l		Second virtual tape, mode 1
+		    ...
+		 64 = /dev/iseries/vt0m		First virtual tape, mode 2
+		 65 = /dev/iseries/vt1m		Second virtual tape, mode 2
+		    ...
+		 96 = /dev/iseries/vt0a		First virtual tape, mode 3
+		 97 = /dev/iseries/vt1a		Second virtual tape, mode 3
+		      ...
+		128 = /dev/iseries/nvt0		First virtual tape, mode 0, no rewind
+		129 = /dev/iseries/nvt1		Second virtual tape, mode 0, no rewind
+		    ...
+		160 = /dev/iseries/nvt0l	First virtual tape, mode 1, no rewind
+		161 = /dev/iseries/nvt1l	Second virtual tape, mode 1, no rewind
+		    ...
+		192 = /dev/iseries/nvt0m	First virtual tape, mode 2, no rewind
+		193 = /dev/iseries/nvt1m	Second virtual tape, mode 2, no rewind
+		    ...
+		224 = /dev/iseries/nvt0a	First virtual tape, mode 3, no rewind
+		225 = /dev/iseries/nvt1a	Second virtual tape, mode 3, no rewind
+		    ...
+
+		"No rewind" refers to the omission of the default
+		automatic rewind on device close.  The MTREW or MTOFFL
+		ioctl()'s can be used to rewind the tape regardless of
+		the device used to access it.
+
+231-239		UNASSIGNED
 
 240-254		LOCAL/EXPERIMENTAL USE
 
@@ -2647,3 +2775,4 @@
 in our notation).  This removes the problem of exhausting the
 namespace and enables the kernel to automatically create the device
 nodes for the slaves on demand using the "devpts" filesystem.
+
diff -u --recursive --new-file v2.4.8/linux/Documentation/networking/vortex.txt linux/Documentation/networking/vortex.txt
--- v2.4.8/linux/Documentation/networking/vortex.txt	Tue Jul  3 17:08:18 2001
+++ linux/Documentation/networking/vortex.txt	Sun Aug 12 12:27:36 2001
@@ -88,7 +88,7 @@
   The individual options are composed of a number of bitfields which
   have the following meanings:
 
-  ssible media type settings
+  Possible media type settings
 	0	10baseT
 	1	10Mbs AUI
 	2	undefined
@@ -104,8 +104,11 @@
   When generating a value for the 'options' setting, the above media
   selection values may be OR'ed (or added to) the following:
 
-  512  (0x200)	Force full duplex mode.
-  16   (0x10)	Bus-master enable bit (Old Vortex cards only)
+  0x8000  Set driver debugging level to 7
+  0x4000  Set driver debugging level to 2
+  0x0400  Enable Wake-on-LAN
+  0x0200  Force full duplex mode.
+  0x0010  Bus-master enable bit (Old Vortex cards only)
 
   For example:
 
@@ -359,6 +362,11 @@
      8K byte-wide RAM 5:3 Rx:Tx split, autoselect/Autonegotiate interface.
      MII transceiver found at address 24, status 782d.
      Enabling bus-master transmits and whole-frame receives.
+
+     NOTE: You must provide the `debug=2' modprobe option to generate
+     a full detection message.  Please do this:
+
+	modprobe 3c59x debug=2
 
    o If it is a PCI device, the relevant output from 'lspci -vx', eg:
 
diff -u --recursive --new-file v2.4.8/linux/Documentation/parisc/mm linux/Documentation/parisc/mm
--- v2.4.8/linux/Documentation/parisc/mm	Tue Dec  5 12:29:38 2000
+++ linux/Documentation/parisc/mm	Wed Dec 31 16:00:00 1969
@@ -1,31 +0,0 @@
-
-The current state of Linux/PA-RISC mm is BROKEN.
-
-Someone needs to sit down and thoroughly rewrite all the cache flushing
-macro definitions.  Here are some of the problems, followed by what I
-think needs to be done about them.
-
-(1) We're using fdce / fice everywhere.  This has to stop (except in
-the routines which flush the entire cache).  The right instructions to
-be using are fdc/fic.
-
-(2) fdc/fic will throw exceptions if the address they reference isn't
-mapped.  Therefore we need to check the page is mapped before flushing
-(we're guaranteed not to have the page dirty if we don't have a software
-mapping for it any longer, right?)
-
-(3) the flush macros are right now tunnelled down to one routine to flush
-the data cache and one routine to flush the insn cache.  this is wrong.
-we should take hints from how we're called and optimise our routines
-accordingly.
-
-(4) fdc/fic actually take space register arguments.  fic takes an 3-bit sr
-argument and fdc takes a 2-bit sr argument.  right now, there's a lot of
-pissing about with %sr1 and all the macros use %sr1.  This is crazy.  We
-normally _know_ what's being referred to, and it's the current task.  So
-if we want to flush that, just use %sr3.  If it happens to be kernel,
-use %sr0 for fdc and %sr4 for fic.
-
-(5) we need to write flush_kernel_dcache_range and use it on kernel
-addresses.  all the macros are defined to work on the _current task's_
-virtual address space.
diff -u --recursive --new-file v2.4.8/linux/Documentation/usb/philips.txt linux/Documentation/usb/philips.txt
--- v2.4.8/linux/Documentation/usb/philips.txt	Wed Jul 25 17:10:17 2001
+++ linux/Documentation/usb/philips.txt	Sun Aug 12 17:36:24 2001
@@ -1,5 +1,5 @@
 This file contains some additional information for the Philips webcams.
-E-mail: webcam@smcc.demon.nl                        Last updated: 2001-04-25
+E-mail: webcam@smcc.demon.nl                        Last updated: 2001-07-27
 
 The main webpage for the Philips driver is http://www.smcc.demon.nl/webcam/.
 It contains a lot of extra information, a FAQ, and the binary plugin
@@ -29,10 +29,9 @@
 
 palette
    Specifies the desired colour order that should be delivered by read() and
-   mmap(). The string can be one of bgr24, rgb24, rgb32, bgr32, yuyv,
-   yuv420, yuv420p. If the tool you use produces odd colours (more
-   specificly, red and blue are swapped), try palette=bgr24 or
-   palette=rgb24.
+   mmap(). The string can be one of yuv420 or yuv420p; however, yuv420 will
+   be phased out, leaving only yuv420p, so this option will disappear
+   entirely.
 
    Only the native yuv420/yuv420p format is supported by the in kernel driver. 
    If you want to use other formats with in-kernel conversion download the
@@ -73,7 +72,7 @@
 
 compression (only useful with the plugin)
    With this option you can control the compression factor that the camera
-   use to squeeze the image through the USB bus. You can set the 
+   uses to squeeze the image through the USB bus. You can set the 
    parameter between 0 and 3:
      0 = prefer uncompressed images; if the requested mode is not available
          in an uncompressed format, the driver will silently switch to low
@@ -83,7 +82,7 @@
      3 = high compression.
       
    High compression takes less bandwidth of course, but it could also
-   introduce some unwanted artefacts. The default is 2, medium compression. 
+   introduce some unwanted artefacts. The default is 2, medium compression.
    See the FAQ on the website for an overview of which modes require
    compression.
       
@@ -91,7 +90,6 @@
    The 645 and 646 have fixed compression parameters.      
 
 trace
-
    In order to better detect problems, it is now possible to turn on a
    'trace' of some of the calls the module makes; it logs all items in your
    kernel log at debug level.
diff -u --recursive --new-file v2.4.8/linux/MAINTAINERS linux/MAINTAINERS
--- v2.4.8/linux/MAINTAINERS	Sun Aug 12 13:27:58 2001
+++ linux/MAINTAINERS	Sun Aug 12 17:36:24 2001
@@ -227,6 +227,12 @@
 L:	linux-kernel@vger.kernel.org
 S:	Maintained
 
+BLUETOOTH SUBSYSTEM (BlueZ)
+P:	Maxim Krasnyansky
+M:	maxk@qualcomm.com
+W:	http://bluez.sf.net
+S:	Maintained
+
 BTTV VIDEO4LINUX DRIVER
 P:	Gerd Knorr
 M:	kraxel@goldbach.in-berlin.de
@@ -471,7 +477,7 @@
 
 EMU10K1 SOUND DRIVER
 P:	Rui Sousa	
-M:	rsousa@grad.physics.sunysb.edu	
+M:	rui.p.m.sousa@clix.pt	
 L:	emu10k1-devel@opensource.creative.com
 W:	http://opensource.creative.com/
 S:	Maintained
@@ -500,6 +506,13 @@
 L:	linux-kernel@vger.kernel.org
 S:	Maintained
 
+FARSYNC SYNCHRONOUS DRIVER
+P:	Bob Dunlop
+M:	rjd@xyzzy.clara.co.uk
+M:	bob.dunlop@farsite.co.uk
+W:	http://www.farsite.co.uk/
+S:	Supported
+
 FILE LOCKING (flock() and fcntl()/lockf())
 P:	Matthew Wilcox
 M:	matthew@wil.cx
@@ -637,7 +650,7 @@
 IDE DRIVER [GENERAL]
 P:	Andre Hedrick
 M:	andre@linux-ide.org
-M:	ahedrick@atipa.com
+M:	andre@aslab.com
 M:	andre@suse.com
 L:	linux-kernel@vger.kernel.org
 W:	http://www.kernel.org/pub/linux/kernel/people/hedrick/
@@ -693,6 +706,12 @@
 L:	linux1394-devel@lists.sourceforge.net
 S:	Maintained
 
+IMS TWINTURBO FRAMEBUFFER DRIVER
+P:	Paul Mundt
+M:	lethal@chaoticdreams.org
+L:	linux-fbdev-devel@lists.sourceforge.net
+S:	Maintained
+
 INTEL APIC/IOAPIC, LOWLEVEL X86 SMP SUPPORT
 P:	Ingo Molnar
 M:	mingo@redhat.com
@@ -823,6 +842,13 @@
 L:	linuxppc-dev@lists.linuxppc.org
 S:	Maintained
 
+LOGICAL DISK MANAGER SUPPORT (LDM, Windows 2000/XP Dynamic Disks)
+P:	Richard Russon (FlatCap)
+M:	ldm@flatcap.org
+L:	ldm-devel@lists.sourceforge.net	
+W:	http://ldm.sourceforge.net
+S:	Maintained
+
 LOGICAL VOLUME MANAGER
 P:     Heinz Mauelshagen
 M:     mge@sistina.de
@@ -1594,17 +1620,18 @@
 L:	linux-hams@vger.kernel.org
 S:	Maintained
 
+ZF MACHZ WATCHDOG
+P:	Fernando Fuganti
+M:	fuganti@conectiva.com.br
+M:	fuganti@netbank.com.br
+W:	http://cvs.conectiva.com.br/drivers/ZFL-watchdog/
+S:	Maintained
+
 ZR36120 VIDEO FOR LINUX DRIVER
 P:	Pauline Middelink
 M:	middelin@polyware.nl
 W:	http://www.polyware.nl/~middelin/En/hobbies.html
 W:	http://www.polyware.nl/~middelin/hobbies.html
-S:	Maintained
-
-Bluetooth Subsystem (BlueZ)
-P:	Maxim Krasnyansky
-M:	maxk@qualcomm.com
-W:	http://bluez.sf.net
 S:	Maintained
 
 THE REST
diff -u --recursive --new-file v2.4.8/linux/Makefile linux/Makefile
--- v2.4.8/linux/Makefile	Sun Aug 12 13:27:58 2001
+++ linux/Makefile	Sun Aug 12 16:18:42 2001
@@ -1,7 +1,7 @@
 VERSION = 2
 PATCHLEVEL = 4
-SUBLEVEL = 8
-EXTRAVERSION =
+SUBLEVEL = 9
+EXTRAVERSION =-pre2
 
 KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
 
diff -u --recursive --new-file v2.4.8/linux/arch/alpha/config.in linux/arch/alpha/config.in
--- v2.4.8/linux/arch/alpha/config.in	Wed Jul 25 17:10:17 2001
+++ linux/arch/alpha/config.in	Sun Aug 12 10:51:41 2001
@@ -54,12 +54,13 @@
 	 RX164			CONFIG_ALPHA_RX164		\
 	 SX164			CONFIG_ALPHA_SX164		\
 	 Sable			CONFIG_ALPHA_SABLE		\
+	 Shark			CONFIG_ALPHA_SHARK		\
 	 Takara			CONFIG_ALPHA_TAKARA		\
 	 Titan			CONFIG_ALPHA_TITAN		\
 	 Wildfire		CONFIG_ALPHA_WILDFIRE" Generic
 
 # clear all implied options (don't want default values for those):
-unset CONFIG_ALPHA_EV4 CONFIG_ALPHA_EV5 CONFIG_ALPHA_EV6
+unset CONFIG_ALPHA_EV4 CONFIG_ALPHA_EV5 CONFIG_ALPHA_EV6 CONFIG_ALPHA_EV67
 unset CONFIG_ALPHA_EISA
 unset CONFIG_ALPHA_LCA CONFIG_ALPHA_APECS CONFIG_ALPHA_CIA
 unset CONFIG_ALPHA_T2 CONFIG_ALPHA_PYXIS CONFIG_ALPHA_POLARIS
@@ -142,6 +143,11 @@
 	define_bool CONFIG_ALPHA_EV6 y
 	define_bool CONFIG_ALPHA_TSUNAMI y
 fi
+if [ "$CONFIG_ALPHA_SHARK" = "y" ]
+then
+	define_bool CONFIG_ALPHA_EV67 y
+	define_bool CONFIG_ALPHA_TSUNAMI y
+fi
 if [ "$CONFIG_ALPHA_WILDFIRE" = "y" -o "$CONFIG_ALPHA_TITAN" = "y" ]
 then
         define_bool CONFIG_ALPHA_EV6 y
@@ -170,7 +176,7 @@
 	-o "$CONFIG_ALPHA_SABLE" = "y" -o "$CONFIG_ALPHA_NORITAKE" = "y" \
 	-o "$CONFIG_ALPHA_DP264" = "y" -o "$CONFIG_ALPHA_RAWHIDE" = "y" \
 	-o "$CONFIG_ALPHA_EIGER" = "y" -o "$CONFIG_ALPHA_WILDFIRE" = "y" \
-	-o "$CONFIG_ALPHA_TITAN" = "y" ]
+	-o "$CONFIG_ALPHA_TITAN" = "y" -o "$CONFIG_ALPHA_SHARK" = "y" ]
 then
 	define_bool CONFIG_ALPHA_SRM y
 fi
@@ -179,7 +185,7 @@
 	-o "$CONFIG_ALPHA_TAKARA" = "y" -o "$CONFIG_ALPHA_EB164" = "y" \
 	-o "$CONFIG_ALPHA_ALCOR" = "y"  -o "$CONFIG_ALPHA_MIATA" = "y" \
 	-o "$CONFIG_ALPHA_LX164" = "y"  -o "$CONFIG_ALPHA_SX164" = "y" \
-	-o "$CONFIG_ALPHA_NAUTILUS" = "y" ]
+	-o "$CONFIG_ALPHA_NAUTILUS" = "y" -o "$CONFIG_ALPHA_NONAME" = "y" ]
 then
   bool 'Use SRM as bootloader' CONFIG_ALPHA_SRM
 fi
@@ -201,7 +207,8 @@
 
 if [ "$CONFIG_ALPHA_SABLE" = "y" -o "$CONFIG_ALPHA_RAWHIDE" = "y" \
 	-o "$CONFIG_ALPHA_DP264" = "y" -o "$CONFIG_ALPHA_WILDFIRE" = "y" \
-	-o "$CONFIG_ALPHA_TITAN" = "y" -o "$CONFIG_ALPHA_GENERIC" = "y" ]
+	-o "$CONFIG_ALPHA_TITAN" = "y" -o "$CONFIG_ALPHA_GENERIC" = "y" \
+	-o "$CONFIG_ALPHA_SHARK" = "y" ]
 then
 	bool 'Symmetric multi-processing support' CONFIG_SMP
 fi
@@ -235,6 +242,10 @@
 	"ELF		CONFIG_KCORE_ELF	\
 	 A.OUT		CONFIG_KCORE_AOUT" ELF
 fi
+if [ "$CONFIG_PROC_FS" != "n" -a "$CONFIG_ALPHA_SRM" = "y" ]; then
+   tristate 'SRM environment through procfs' CONFIG_SRM_ENV
+fi
+ 
 tristate 'Kernel support for a.out (ECOFF) binaries' CONFIG_BINFMT_AOUT
 tristate 'Kernel support for ELF binaries' CONFIG_BINFMT_ELF
 tristate 'Kernel support for MISC binaries' CONFIG_BINFMT_MISC
diff -u --recursive --new-file v2.4.8/linux/arch/alpha/defconfig linux/arch/alpha/defconfig
--- v2.4.8/linux/arch/alpha/defconfig	Fri May  4 15:16:28 2001
+++ linux/arch/alpha/defconfig	Sun Aug 12 10:38:47 2001
@@ -44,6 +44,7 @@
 # CONFIG_ALPHA_RX164 is not set
 # CONFIG_ALPHA_SX164 is not set
 # CONFIG_ALPHA_SABLE is not set
+# CONFIG_ALPHA_SHARK is not set
 # CONFIG_ALPHA_TAKARA is not set
 # CONFIG_ALPHA_TITAN is not set
 # CONFIG_ALPHA_WILDFIRE is not set
diff -u --recursive --new-file v2.4.8/linux/arch/alpha/kernel/Makefile linux/arch/alpha/kernel/Makefile
--- v2.4.8/linux/arch/alpha/kernel/Makefile	Fri Feb  9 11:38:01 2001
+++ linux/arch/alpha/kernel/Makefile	Sun Aug 12 10:51:41 2001
@@ -32,6 +32,7 @@
 
 obj-$(CONFIG_SMP)    += smp.o irq_smp.o
 obj-$(CONFIG_PCI)    += pci.o pci_iommu.o
+obj-$(CONFIG_SRM_ENV)	+= srm_env.o
 
 ifdef CONFIG_ALPHA_GENERIC
 
@@ -67,6 +68,7 @@
 endif
 
 obj-$(CONFIG_ALPHA_DP264) += sys_dp264.o
+obj-$(CONFIG_ALPHA_SHARK) += sys_dp264.o
 obj-$(CONFIG_ALPHA_TITAN) += sys_titan.o
 
 ifneq ($(CONFIG_ALPHA_EB64P)$(CONFIG_ALPHA_EB66),)
diff -u --recursive --new-file v2.4.8/linux/arch/alpha/kernel/alpha_ksyms.c linux/arch/alpha/kernel/alpha_ksyms.c
--- v2.4.8/linux/arch/alpha/kernel/alpha_ksyms.c	Wed Jul 25 17:10:17 2001
+++ linux/arch/alpha/kernel/alpha_ksyms.c	Sun Aug 12 10:51:41 2001
@@ -19,6 +19,7 @@
 #include <linux/delay.h>
 
 #include <asm/io.h>
+#include <asm/console.h>
 #include <asm/hwrpb.h>
 #include <asm/uaccess.h>
 #include <asm/processor.h>
@@ -57,6 +58,11 @@
 EXPORT_SYMBOL(probe_irq_mask);
 EXPORT_SYMBOL(screen_info);
 EXPORT_SYMBOL(perf_irq);
+#ifdef CONFIG_ALPHA_SRM
+EXPORT_SYMBOL(callback_getenv);
+EXPORT_SYMBOL(callback_setenv);
+EXPORT_SYMBOL(callback_save_env);
+#endif /* CONFIG_ALPHA_SRM */
 
 /* platform dependent support */
 EXPORT_SYMBOL(_inb);
diff -u --recursive --new-file v2.4.8/linux/arch/alpha/kernel/irq.c linux/arch/alpha/kernel/irq.c
--- v2.4.8/linux/arch/alpha/kernel/irq.c	Tue Jul  3 17:08:18 2001
+++ linux/arch/alpha/kernel/irq.c	Sun Aug 12 10:38:48 2001
@@ -580,6 +580,9 @@
  * SMP cross-CPU interrupts have their own specific
  * handlers).
  */
+
+#define MAX_ILLEGAL_IRQS 16
+
 void
 handle_irq(int irq, struct pt_regs * regs)
 {	
@@ -597,9 +600,11 @@
 	irq_desc_t *desc = irq_desc + irq;
 	struct irqaction * action;
 	unsigned int status;
-
-	if ((unsigned) irq > ACTUAL_NR_IRQS) {
+	static unsigned int illegal_count=0;
+	
+	if ((unsigned) irq > ACTUAL_NR_IRQS && illegal_count < MAX_ILLEGAL_IRQS ) {
 		irq_err_count++;
+		illegal_count++;
 		printk(KERN_CRIT "device_interrupt: illegal interrupt %d\n",
 		       irq);
 		return;
diff -u --recursive --new-file v2.4.8/linux/arch/alpha/kernel/osf_sys.c linux/arch/alpha/kernel/osf_sys.c
--- v2.4.8/linux/arch/alpha/kernel/osf_sys.c	Tue Jul  3 17:08:18 2001
+++ linux/arch/alpha/kernel/osf_sys.c	Sun Aug 12 15:04:07 2001
@@ -105,7 +105,7 @@
 	int error;
 };
 
-static int osf_filldir(void *__buf, const char *name, int namlen, off_t offset,
+static int osf_filldir(void *__buf, const char *name, int namlen, loff_t offset,
 		       ino_t ino, unsigned int d_type)
 {
 	struct osf_dirent *dirent;
diff -u --recursive --new-file v2.4.8/linux/arch/alpha/kernel/pci_iommu.c linux/arch/alpha/kernel/pci_iommu.c
--- v2.4.8/linux/arch/alpha/kernel/pci_iommu.c	Fri May 25 09:54:50 2001
+++ linux/arch/alpha/kernel/pci_iommu.c	Sun Aug 12 10:51:41 2001
@@ -55,9 +55,9 @@
 	base = arena->dma_base;
 	size = arena->size;
 	if (base + size > 0xfff00000) {
-		int i = (0xfff00000 - base) >> PAGE_SHIFT;
-		for (; i < (0x100000 >> PAGE_SHIFT); i++)
-			arena->ptes[i] = IOMMU_INVALID_PTE;
+		int i, fixup_start = (0xfff00000 - base) >> PAGE_SHIFT;
+		for (i= 0; i < (0x100000 >> PAGE_SHIFT); i++)
+			arena->ptes[fixup_start+i] = IOMMU_INVALID_PTE;
 	}
 }
 
@@ -354,7 +354,7 @@
    Write dma_length of each leader with the combined lengths of
    the mergable followers.  */
 
-static inline void
+static void
 sg_classify(struct scatterlist *sg, struct scatterlist *end, int virt_ok)
 {
 	unsigned long next_vaddr;
@@ -436,10 +436,7 @@
 
 		/* Otherwise, break up the remaining virtually contiguous
 		   hunks into individual direct maps.  */
-		for (sg = leader; sg < end; ++sg)
-			if (sg->dma_address == 1 || sg->dma_address == -2)
-				sg->dma_address = 0;
-
+		sg_classify(leader, end, 0);
 		/* Retry.  */
 		return sg_fill(leader, end, out, arena, max_dma);
 	}
diff -u --recursive --new-file v2.4.8/linux/arch/alpha/kernel/setup.c linux/arch/alpha/kernel/setup.c
--- v2.4.8/linux/arch/alpha/kernel/setup.c	Thu May 24 15:20:18 2001
+++ linux/arch/alpha/kernel/setup.c	Sun Aug 12 10:38:47 2001
@@ -154,6 +154,7 @@
 WEAK(rx164_mv);
 WEAK(sable_mv);
 WEAK(sable_gamma_mv);
+WEAK(shark_mv);
 WEAK(sx164_mv);
 WEAK(takara_mv);
 WEAK(webbrick_mv);
@@ -665,9 +666,10 @@
 
 static char tsunami_names[][16] = {
 	"0", "DP264", "Warhol", "Windjammer", "Monet", "Clipper",
-	"Goldrush", "Webbrick", "Catamaran"
+	"Goldrush", "Webbrick", "Catamaran", "Brisbane", "Melbourne",
+	"Flying Clipper", "Shark"
 };
-static int tsunami_indices[] = {0,1,2,3,4,5,6,7,8};
+static int tsunami_indices[] = {0,1,2,3,4,5,6,7,8,9,10,11,12};
 
 static struct alpha_machine_vector * __init
 get_sysvec(long type, long variation, long cpu)
@@ -767,6 +769,10 @@
 		&dp264_mv,		/* goldrush */
 		&webbrick_mv,		/* webbrick */
 		&dp264_mv,		/* catamaran */
+		NULL,			/* brisbane? */
+		NULL,			/* melbourne? */
+		NULL,			/* flying clipper? */
+		&shark_mv,		/* shark */
 	};
 
 	/* ??? Do we need to distinguish between Rawhides?  */
@@ -880,6 +886,7 @@
 		&rx164_mv,
 		&sable_mv,
 		&sable_gamma_mv,
+		&shark_mv,
 		&sx164_mv,
 		&takara_mv,
 		&webbrick_mv,
diff -u --recursive --new-file v2.4.8/linux/arch/alpha/kernel/smp.c linux/arch/alpha/kernel/smp.c
--- v2.4.8/linux/arch/alpha/kernel/smp.c	Tue Jul  3 17:08:18 2001
+++ linux/arch/alpha/kernel/smp.c	Sun Aug 12 10:51:41 2001
@@ -211,13 +211,14 @@
  * We are not told how much cache there is, so we have to guess.
  */
 static void __init
-smp_tune_scheduling (void)
+smp_tune_scheduling (int cpuid)
 {
 	struct percpu_struct *cpu;
 	unsigned long on_chip_cache;
 	unsigned long freq;
 
-	cpu = (struct percpu_struct*)((char*)hwrpb + hwrpb->processor_offset);
+	cpu = (struct percpu_struct*)((char*)hwrpb + hwrpb->processor_offset
+				      + cpuid * hwrpb->processor_size);
 	switch (cpu->type)
 	{
 	case EV45_CPU:
@@ -599,7 +600,7 @@
 	current->processor = boot_cpuid;
 
 	smp_store_cpu_info(boot_cpuid);
-	smp_tune_scheduling();
+	smp_tune_scheduling(boot_cpuid);
 	smp_setup_percpu_timer(boot_cpuid);
 
 	init_idle();
diff -u --recursive --new-file v2.4.8/linux/arch/alpha/kernel/srm_env.c linux/arch/alpha/kernel/srm_env.c
--- v2.4.8/linux/arch/alpha/kernel/srm_env.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/alpha/kernel/srm_env.c	Sun Aug 12 10:51:41 2001
@@ -0,0 +1,219 @@
+/*
+ * srm_env.c - Access to SRC environment variables through
+ *             the linux procfs
+ *
+ * (C)2001, Jan-Benedict Glaw <jbgaw@lug-owl.de>
+ *
+ * This driver is at all a modified version of Erik Mouw's
+ * ./linux/Documentation/DocBook/procfs_example.c, so: thanky
+ * you, erik! He can be reached via email at
+ * <J.A.K.Mouw@its.tudelft.nl>. It is based on an idea
+ * provided by DEC^WCompaq's "Jumpstart" CD. They included
+ * a patch like this as well. Thanks for idea!
+ *
+ *
+ * This software has been developed while working on the LART
+ * computing board (http://www.lart.tudelft.nl/). The
+ * development has been sponsored by the Mobile Multi-media
+ * Communications (http://www.mmc.tudelft.nl/) and Ubiquitous
+ * Communications (http://www.ubicom.tudelft.nl/) projects.
+ *
+ * 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 version 2.
+ *
+ * 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., 59 Temple Place,
+ * Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#include <linux/kernel.h>
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/proc_fs.h>
+#include <asm/console.h>
+#include <asm/uaccess.h>
+
+#define DIRNAME		"srm_environment"	/* Subdir in /proc/	*/
+#define VERSION		"0.0.1"			/* Module version	*/
+#define NAME		"srm_env"		/* Module name		*/
+#define DEBUG
+
+MODULE_AUTHOR("Jan-Benedict Glaw <jbglaw@lug-owl.de>");
+MODULE_DESCRIPTION("Accessing Alpha SRM environment through procfs interface");
+EXPORT_NO_SYMBOLS;
+
+typedef struct _srm_env {
+	char			*name;
+	unsigned long		id;
+	struct proc_dir_entry	*proc_entry;
+} srm_env_t;
+
+static struct proc_dir_entry	*directory;
+static srm_env_t	srm_entries[] = {
+	{ "auto_action",	ENV_AUTO_ACTION		},
+	{ "boot_dev",		ENV_BOOT_DEV		},
+	{ "bootdef_dev",	ENV_BOOTDEF_DEV		},
+	{ "booted_dev",		ENV_BOOTED_DEV		},
+	{ "boot_file",		ENV_BOOT_FILE		},
+	{ "booted_file",	ENV_BOOTED_FILE		},
+	{ "boot_osflags",	ENV_BOOT_OSFLAGS	},
+	{ "booted_osflags",	ENV_BOOTED_OSFLAGS	},
+	{ "boot_reset",		ENV_BOOT_RESET		},
+	{ "dump_dev",		ENV_DUMP_DEV		},
+	{ "enable_audit",	ENV_ENABLE_AUDIT	},
+	{ "license",		ENV_LICENSE		},
+	{ "char_set",		ENV_CHAR_SET		},
+	{ "language",		ENV_LANGUAGE		},
+	{ "tty_dev",		ENV_TTY_DEV		},
+	{ NULL,			0			},
+};
+
+static int srm_env_read(char *page, char **start, off_t off, int count,
+		int *eof, void *data)
+{
+	int		nbytes;
+	unsigned long	ret;
+	srm_env_t	*entry;
+
+	MOD_INC_USE_COUNT;
+
+	if(off != 0) {
+		MOD_DEC_USE_COUNT;
+		return -EFAULT;
+	}
+
+	entry	= (srm_env_t *)data;
+	ret	= callback_getenv(entry->id, page, count);
+
+	if((ret >> 61) == 0)
+		nbytes = (int)ret;
+	else
+		nbytes = -EFAULT;
+
+	MOD_DEC_USE_COUNT;
+
+	return nbytes;
+}
+
+
+static int srm_env_write(struct file *file, const char *buffer,
+		unsigned long count, void *data)
+{
+#define BUFLEN	512
+	int		nbytes;
+	srm_env_t	*entry;
+	char		buf[BUFLEN];
+	unsigned long	ret1, ret2;
+
+	MOD_INC_USE_COUNT;
+
+	entry = (srm_env_t *) data;
+
+	nbytes = strlen(buffer) + 1;
+	if(nbytes > BUFLEN) {
+		MOD_DEC_USE_COUNT;
+		return -ENOMEM;
+	}
+		
+	//memcpy(aligned_buffer, buffer, nbytes)
+
+	if(copy_from_user(buf, buffer, count)) {
+		MOD_DEC_USE_COUNT;
+		return -EFAULT;
+	}
+	buf[count] = 0x00;
+
+	ret1 = callback_setenv(entry->id, buf, count);
+	if((ret1 >> 61) == 0) {
+		do 
+			ret2 = callback_save_env();
+		while((ret2 >> 61) == 1);
+		nbytes = (int)ret1;
+	} else
+		nbytes = -EFAULT;
+
+	MOD_DEC_USE_COUNT;
+
+	return nbytes;
+}
+
+static void srm_env_cleanup(void)
+{
+	srm_env_t	*entry;
+
+	if(directory) {
+		entry = srm_entries;
+		while(entry->name != NULL && entry->id != 0) {
+			if(entry->proc_entry) {
+				remove_proc_entry(entry->name, directory);
+				entry->proc_entry = NULL;
+			}
+			entry++;
+		}
+		remove_proc_entry(DIRNAME, NULL);
+	}
+
+	return;
+}
+
+static int __init srm_env_init(void)
+{
+	srm_env_t	*entry;
+	
+	if(!alpha_using_srm) {
+		printk(KERN_INFO "%s: This Alpha system doesn't "
+				"know about SRM...\n", __FUNCTION__);
+		return -ENODEV;
+	}
+
+	directory = proc_mkdir(DIRNAME, NULL);
+	if(directory == NULL)
+		return -ENOMEM;
+	
+	directory->owner = THIS_MODULE;
+	
+	/* Now create all the nodes... */
+	entry = srm_entries;
+	while(entry->name != NULL && entry->id != 0) {
+		entry->proc_entry = create_proc_entry(entry->name, 0644,
+				directory);
+		if(entry->proc_entry == NULL)
+			goto cleanup;
+		entry->proc_entry->data		= entry;
+		entry->proc_entry->read_proc	= srm_env_read;
+		entry->proc_entry->write_proc	= srm_env_write;
+		entry->proc_entry->owner	= THIS_MODULE;
+		entry++;
+	}
+	
+	printk(KERN_INFO "%s: version %s loaded successfully\n", NAME,
+			VERSION);
+	return 0;
+
+cleanup:
+	srm_env_cleanup();
+	return -ENOMEM;
+}
+
+
+static void __exit srm_env_exit(void)
+{
+	srm_env_cleanup();
+	printk(KERN_INFO "%s: unloaded successfully\n", NAME);
+	return;
+}
+
+module_init(srm_env_init);
+module_exit(srm_env_exit);
+
diff -u --recursive --new-file v2.4.8/linux/arch/alpha/kernel/sys_dp264.c linux/arch/alpha/kernel/sys_dp264.c
--- v2.4.8/linux/arch/alpha/kernel/sys_dp264.c	Tue Jul  3 17:08:18 2001
+++ linux/arch/alpha/kernel/sys_dp264.c	Sun Aug 12 10:38:47 2001
@@ -5,6 +5,10 @@
  *	Copyright (C) 1996, 1999 Jay A Estabrook
  *	Copyright (C) 1998, 1999 Richard Henderson
  *
+ *	Modified by Christopher C. Chimelis, 2001 to
+ *	add support for the addition of Shark to the
+ *	Tsunami family.
+ *
  * Code supporting the DP264 (EV6+TSUNAMI).
  */
 
@@ -632,6 +636,34 @@
 
 struct alpha_machine_vector clipper_mv __initmv = {
 	vector_name:		"Clipper",
+	DO_EV6_MMU,
+	DO_DEFAULT_RTC,
+	DO_TSUNAMI_IO,
+	DO_TSUNAMI_BUS,
+	machine_check:		tsunami_machine_check,
+	max_dma_address:	ALPHA_MAX_DMA_ADDRESS,
+	min_io_address:		DEFAULT_IO_BASE,
+	min_mem_address:	DEFAULT_MEM_BASE,
+
+	nr_irqs:		64,
+	device_interrupt:	dp264_device_interrupt,
+
+	init_arch:		tsunami_init_arch,
+	init_irq:		clipper_init_irq,
+	init_rtc:		common_init_rtc,
+	init_pci:		common_init_pci,
+	kill_arch:		tsunami_kill_arch,
+	pci_map_irq:		clipper_map_irq,
+	pci_swizzle:		common_swizzle,
+};
+
+/* Sharks strongly resemble Clipper, at least as far
+ * as interrupt routing, etc, so we're using the
+ * same functions as Clipper does
+ */
+
+struct alpha_machine_vector shark_mv __initmv = {
+	vector_name:		"Shark",
 	DO_EV6_MMU,
 	DO_DEFAULT_RTC,
 	DO_TSUNAMI_IO,
diff -u --recursive --new-file v2.4.8/linux/arch/alpha/kernel/time.c linux/arch/alpha/kernel/time.c
--- v2.4.8/linux/arch/alpha/kernel/time.c	Wed Jul 25 17:10:17 2001
+++ linux/arch/alpha/kernel/time.c	Sun Aug 12 10:38:48 2001
@@ -300,7 +300,9 @@
 
 	/* PC-like is standard; used for year < 20 || year >= 70 */
 	epoch = 1900;
-	if (year >= 20 && year < 48)
+	if (year < 20)
+		epoch = 2000;
+	else if (year >= 20 && year < 48)
 		/* NT epoch */
 		epoch = 1980;
 	else if (year >= 48 && year < 70)
diff -u --recursive --new-file v2.4.8/linux/arch/alpha/kernel/traps.c linux/arch/alpha/kernel/traps.c
--- v2.4.8/linux/arch/alpha/kernel/traps.c	Wed Jul 25 17:10:17 2001
+++ linux/arch/alpha/kernel/traps.c	Sun Aug 12 10:35:37 2001
@@ -197,11 +197,11 @@
 			regs.pc -= 4;	/* make pc point to former bpt */
 		}
 		send_sig(SIGTRAP, current, 1);
-		break;
+		return;
 
 	      case 1: /* bugcheck */
 		send_sig(SIGTRAP, current, 1);
-		break;
+		return;
 
 	      case 2: /* gentrap */
 		/*
@@ -216,7 +216,7 @@
 		      case GEN_FLTDIV: case GEN_FLTUND: case GEN_FLTINV:
 		      case GEN_FLTINE: case GEN_ROPRAND:
 			send_sig(SIGFPE, current, 1);
-			break;
+			return;
 
 		      case GEN_DECOVF:
 		      case GEN_DECDIV:
@@ -236,14 +236,10 @@
 		      case GEN_SUBRNG6:
 		      case GEN_SUBRNG7:
 			send_sig(SIGTRAP, current, 1);
-			break;
+			return;
 		}
 		break;
 
-	      case 3: /* FEN fault */
-		send_sig(SIGILL, current, 1);
-		break;
-
 	      case 4: /* opDEC */
 		if (implver() == IMPLVER_EV4) {
 			/* EV4 does not implement anything except normal
@@ -252,12 +248,12 @@
 			if (alpha_fp_emul(regs.pc-4))
 				return;
 		}
-		send_sig(SIGILL, current, 1);
-		break;
-
-	      default:
-		panic("do_entIF: unexpected instruction-fault type");
+		/* fallthrough as illegal instruction .. */
+	      case 3: /* FEN fault */
+	      case 5: /* illoc */
+	      default: /* unexpected instruction-fault type */
 	}
+	send_sig(SIGILL, current, 1);
 }
 
 /* There is an ifdef in the PALcode in MILO that enables a 
diff -u --recursive --new-file v2.4.8/linux/arch/alpha/mm/numa.c linux/arch/alpha/mm/numa.c
--- v2.4.8/linux/arch/alpha/mm/numa.c	Thu May 24 15:20:18 2001
+++ linux/arch/alpha/mm/numa.c	Sun Aug 12 10:38:48 2001
@@ -260,9 +260,9 @@
 			       phys_to_virt(PFN_PHYS(max_low_pfn)));
 			initrd_start = initrd_end = 0;
 		} else {
-			/* Assume the initrd to be in the first node */
-			reserve_bootmem_node(NODE_DATA(nid), virt_to_phys((void *)initrd_start),
-					INITRD_SIZE);
+			reserve_bootmem_node(NODE_DATA(KVADDR_TO_NID(initrd_start)),
+					     virt_to_phys((void *)initrd_start),
+					     INITRD_SIZE);
 		}
 	}
 #endif /* CONFIG_BLK_DEV_INITRD */
diff -u --recursive --new-file v2.4.8/linux/arch/arm/Makefile linux/arch/arm/Makefile
--- v2.4.8/linux/arch/arm/Makefile	Tue Jul  3 17:08:18 2001
+++ linux/arch/arm/Makefile	Sun Aug 12 11:13:59 2001
@@ -22,14 +22,18 @@
 # Select CPU dependent flags.  Note that order of declaration is important;
 # the options further down the list override previous items.
 #
-apcs-y				:=
-apcs-$(CONFIG_CPU_26)		:=-mcpu=arm3 -Os
+# Note!  For APCS-26 YOU MUST HAVE AN APCS-26 LIBGCC.A
+#
+apcs-y				:=-mapcs-32
+apcs-$(CONFIG_CPU_26)		:=-mapcs-26 -mcpu=arm3 -Os
 
+# This selects which instruction set is used.
 arch-y				:=
 arch-$(CONFIG_CPU_32v3)		:=-march=armv3
 arch-$(CONFIG_CPU_32v4)		:=-march=armv4
 arch-$(CONFIG_CPU_32v5)		:=-march=armv5
 
+# This selects how we optimise for the processor.
 tune-y				:=
 tune-$(CONFIG_CPU_ARM610)	:=-mtune=arm610
 tune-$(CONFIG_CPU_ARM710)	:=-mtune=arm710
@@ -38,8 +42,8 @@
 tune-$(CONFIG_CPU_SA110)	:=-mtune=strongarm110
 tune-$(CONFIG_CPU_SA1100)	:=-mtune=strongarm1100
 
-CFLAGS		+= -mapcs-32 $(apcs-y) $(arch-y) $(tune-y) -mshort-load-bytes -msoft-float
-AFLAGS		+= -mapcs-32 $(apcs-y) $(arch-y) -mno-fpu
+CFLAGS		+=$(apcs-y) $(arch-y) $(tune-y) -mshort-load-bytes -msoft-float
+AFLAGS		+=$(apcs-y) $(arch-y) -mno-fpu
 
 LIBGCC		:= $(shell $(CC) $(CFLAGS) --print-libgcc-file-name)
 
diff -u --recursive --new-file v2.4.8/linux/arch/arm/boot/compressed/head.S linux/arch/arm/boot/compressed/head.S
--- v2.4.8/linux/arch/arm/boot/compressed/head.S	Tue Jul  3 17:08:18 2001
+++ linux/arch/arm/boot/compressed/head.S	Sun Aug 12 11:13:59 2001
@@ -102,19 +102,24 @@
 1:		mov	r7, r1			@ save architecture ID
 		mov	r8, #0			@ save r0
 
+#ifndef __ARM_ARCH_2__
 		/*
 		 * Booting from Angel - need to enter SVC mode and disable
 		 * FIQs/IRQs (numeric definitions from angel arm.h source).
 		 * We only do this if we were in user mode on entry.
 		 */
-		mrs	r0, cpsr		@ get current mode
-		tst	r0, #3			@ not user?
+		mrs	r2, cpsr		@ get current mode
+		tst	r2, #3			@ not user?
 		bne	not_angel
 		mov	r0, #0x17		@ angel_SWIreason_EnterSVC
 		swi	0x123456		@ angel_SWI_ARM
-not_angel:	mrs	r0, cpsr		@ turn off interrupts to
-		orr	r0, r0, #0xc0		@ prevent angel from running
-		msr	cpsr_c, r0
+not_angel:
+		mrs	r2, cpsr		@ turn off interrupts to
+		orr	r2, r2, #0xc0		@ prevent angel from running
+		msr	cpsr_c, r2
+#else
+		teqp	pc, #0x0c000003		@ turn off interrupts
+#endif
 
 		/*
 		 * Note that some cache flushing and other stuff may
diff -u --recursive --new-file v2.4.8/linux/arch/arm/boot/compressed/misc.c linux/arch/arm/boot/compressed/misc.c
--- v2.4.8/linux/arch/arm/boot/compressed/misc.c	Thu Oct 21 12:15:36 1999
+++ linux/arch/arm/boot/compressed/misc.c	Sun Aug 12 11:13:59 2001
@@ -73,7 +73,7 @@
 		*u.ucp++ = 0;
 }
 
-extern __inline__ __ptr_t memcpy(__ptr_t __dest, __const __ptr_t __src,
+static inline __ptr_t memcpy(__ptr_t __dest, __const __ptr_t __src,
 			    size_t __n)
 {
 	int i = 0;
diff -u --recursive --new-file v2.4.8/linux/arch/arm/boot/compressed/ofw-shark.c linux/arch/arm/boot/compressed/ofw-shark.c
--- v2.4.8/linux/arch/arm/boot/compressed/ofw-shark.c	Thu Apr 12 12:03:50 2001
+++ linux/arch/arm/boot/compressed/ofw-shark.c	Sun Aug 12 11:13:59 2001
@@ -20,14 +20,20 @@
 create_params (unsigned long *buffer)
 {
 	/* Is there a better address? Also change in mach-shark/arch.c */
-	struct param_struct *params = (struct param_struct *) 0x08003000;
+	struct tag *tag = (struct tag *) 0x08003000;
 	int j,i,m,k,nr_banks,size;
+	unsigned char *c;
 
-	for (j=0;j<256;j++) params->u1.unused[j]=0;
+	/* Head of the taglist */
+	tag->hdr.tag  = ATAG_CORE;
+	tag->hdr.size = tag_size(tag_core);
+	tag->u.core.flags = FLAG_READONLY;
+	tag->u.core.pagesize = PAGE_SIZE;
+	tag->u.core.rootdev = 0;
 
+	/* Build up one tagged block for each memory region */
 	size=0;
 	nr_banks=(unsigned int) buffer[0];
-	if (nr_banks > NR_BANKS) nr_banks = NR_BANKS;
 	for (j=0;j<nr_banks;j++){
 		/* search the lowest address and put it into the next entry   */
 		/* not a fast sort algorithm, but there are at most 8 entries */
@@ -40,23 +46,38 @@
 			}
 		}
 	  
-		/* using pages_in_bank for startaddress and size               */
-		/* start is in bytes, size in pages and not bigger than 0x2000 */
-		/* This is decoded in fixup_shark in arch/arm/kernel/arch.c    */
-		params->u1.s.pages_in_bank[j]=buffer[2*k+1]|(buffer[2*k+2]/PAGE_SIZE);
+		tag = tag_next(tag);
+		tag->hdr.tag = ATAG_MEM;
+		tag->hdr.size = tag_size(tag_mem32);
+		tag->u.mem.size = buffer[2*k+2];
+		tag->u.mem.start = buffer[2*k+1];
+
 		size += buffer[2*k+2];
 
-		buffer[2*k+1]=0xffffffff;                    /* mark as copied             */
+		buffer[2*k+1]=0xffffffff;                    /* mark as copied */
 	}
 	
-	params->u1.s.page_size = PAGE_SIZE;
-	params->u1.s.nr_pages  = size/PAGE_SIZE;
-	params->u1.s.flags     = FLAG_READONLY;
+	/* The command line */
+	tag = tag_next(tag);
+	tag->hdr.tag = ATAG_CMDLINE;
 	
-	/* Copy over the bootargs */
-	for (j=0;j<128/4;j++) {
-		((unsigned long *) params->commandline)[j]=buffer[33+j];
-	}
+	c=(unsigned char *)(&buffer[34]);
+	j=0;
+	while (*c) tag->u.cmdline.cmdline[j++]=*c++;
+
+	tag->u.cmdline.cmdline[j]=0;
+	tag->hdr.size = (j + 7 + sizeof(struct tag_header)) >> 2;
+
+	/* Hardware revision */
+	tag = tag_next(tag);
+	tag->hdr.tag = ATAG_REVISION;
+	tag->hdr.size = tag_size(tag_revision);
+	tag->u.revision.rev = ((unsigned char) buffer[33])-'0';
+
+	/* End of the taglist */
+	tag = tag_next(tag);
+	tag->hdr.tag = 0;
+	tag->hdr.size = 0;
 }
 
 
@@ -165,7 +186,7 @@
 asmlinkage void ofw_init(ofw_handle_t o, int *nomr, int *pointer)
 {
 	int phandle,i,mem_len,buffer[32];
-	char temp[12];
+	char temp[15];
   
 	temp[0]='/';
 	temp[1]='m';
@@ -212,6 +233,26 @@
 
 	mem_len = OF_getproplen(o,phandle, temp);
 	OF_getprop(o,phandle, temp, buffer, mem_len);
-	for (i=0; i<=mem_len/4; i++) pointer[i+32]=buffer[i];
-  
+	if (mem_len > 128) mem_len=128;
+	for (i=0; i<=mem_len/4; i++) pointer[i+33]=buffer[i];
+	pointer[i+33]=0;
+
+	temp[0]='/';
+	temp[1]='\0';
+	phandle=OF_finddevice(o,temp);
+	temp[0]='b';
+	temp[1]='a';
+	temp[2]='n';
+	temp[3]='n';
+	temp[4]='e';
+	temp[5]='r';
+	temp[6]='-';
+	temp[7]='n';
+	temp[8]='a';
+	temp[9]='m';
+	temp[10]='e';
+	temp[11]='\0';
+	mem_len = OF_getproplen(o,phandle, temp);
+	OF_getprop(o,phandle, temp, buffer, mem_len);
+	(unsigned char) pointer[32] = ((unsigned char *) buffer)[mem_len-2];
 }
diff -u --recursive --new-file v2.4.8/linux/arch/arm/config.in linux/arch/arm/config.in
--- v2.4.8/linux/arch/arm/config.in	Tue Jul  3 17:08:18 2001
+++ linux/arch/arm/config.in	Sun Aug 12 17:36:24 2001
@@ -31,17 +31,19 @@
 mainmenu_option next_comment
 comment 'System Type'
 
-choice 'ARM system type'	\
-	"Archimedes/A5000	CONFIG_ARCH_ARCA5K \
+choice 'ARM system type' \
+	"Anakin			CONFIG_ARCH_ANAKIN \
+	 Archimedes/A5000	CONFIG_ARCH_ARCA5K \
 	 Cirrus-CL-PS7500FE     CONFIG_ARCH_CLPS7500 \
+ 	 CLPS711x/EP721x-based	CONFIG_ARCH_CLPS711X \
 	 Co-EBSA285		CONFIG_ARCH_CO285 \
 	 EBSA-110		CONFIG_ARCH_EBSA110 \
-	 LinkUp-L7200		CONFIG_ARCH_L7200 \
 	 FootBridge		CONFIG_ARCH_FOOTBRIDGE \
 	 Integrator		CONFIG_ARCH_INTEGRATOR \
+	 LinkUp-L7200		CONFIG_ARCH_L7200 \
 	 RiscPC			CONFIG_ARCH_RPC \
  	 SA1100-based		CONFIG_ARCH_SA1100 \
- 	 CLPS711x/EP721x-based	CONFIG_ARCH_CLPS711X" RiscPC
+	 Shark			CONFIG_ARCH_SHARK" RiscPC
 
 mainmenu_option next_comment
 comment 'Archimedes/A5000 Implementations'
@@ -68,20 +70,37 @@
 dep_bool '    Include support for Neponset' CONFIG_ASSABET_NEPONSET $CONFIG_SA1100_ASSABET
 dep_bool '  Brutus' CONFIG_SA1100_BRUTUS $CONFIG_ARCH_SA1100
 dep_bool '  CerfBoard' CONFIG_SA1100_CERF $CONFIG_ARCH_SA1100
+if [ "$CONFIG_SA1100_CERF" = "y" ]; then
+   bool '    32MB Cerf support' CONFIG_SA1100_CERF_32MB
+fi
 dep_bool '  Compaq iPAQ H3600 (Bitsy)' CONFIG_SA1100_BITSY $CONFIG_ARCH_SA1100
 #dep_bool '  Empeg' CONFIG_SA1100_EMPEG $CONFIG_ARCH_SA1100
-#dep_bool '  Itsy' CONFIG_SA1100_ITSY $CONFIG_ARCH_SA1100
+dep_bool '  Extenex HandHeld Theater (Squashtail)' CONFIG_SA1100_EXTENEX1 $CONFIG_ARCH_SA1100
+if [ "$CONFIG_SA1100_EXTENEX1" = "y" ]; then
+   bool '    Support 16 MB of DRAM (not just 8)' CONFIG_SA1100_EXTENEX1_16MB
+fi
+dep_bool '  FlexaNet' CONFIG_SA1100_FLEXANET $CONFIG_ARCH_SA1100
+dep_bool '  FreeBird-v1.1' CONFIG_SA1100_FREEBIRD $CONFIG_ARCH_SA1100
+dep_bool '  GraphicsClient Plus' CONFIG_SA1100_GRAPHICSCLIENT $CONFIG_ARCH_SA1100
+dep_bool '  HP Jornada 720' CONFIG_SA1100_JORNADA720 $CONFIG_ARCH_SA1100
+dep_bool '  HuW WebPanel' CONFIG_SA1100_HUW_WEBPANEL $CONFIG_ARCH_SA1100
+dep_bool '  Itsy' CONFIG_SA1100_ITSY $CONFIG_ARCH_SA1100
 dep_bool '  LART' CONFIG_SA1100_LART $CONFIG_ARCH_SA1100
-#dep_bool '  PLEB' CONFIG_SA1100_PLEB $CONFIG_ARCH_SA1100
-dep_bool '  GraphicsClient' CONFIG_SA1100_GRAPHICSCLIENT $CONFIG_ARCH_SA1100
 dep_bool '  nanoEngine' CONFIG_SA1100_NANOENGINE $CONFIG_ARCH_SA1100
-dep_bool '  Victor' CONFIG_SA1100_VICTOR $CONFIG_ARCH_SA1100
+dep_bool '  OmniMeter' CONFIG_SA1100_OMNIMETER $CONFIG_ARCH_SA1100
+dep_bool '  Pangolin' CONFIG_SA1100_PANGOLIN $CONFIG_ARCH_SA1100
+dep_bool '  PLEB' CONFIG_SA1100_PLEB $CONFIG_ARCH_SA1100
 dep_bool '  Sherman' CONFIG_SA1100_SHERMAN $CONFIG_ARCH_SA1100
+dep_bool '  Simpad' CONFIG_SA1100_SIMPAD $CONFIG_ARCH_SA1100
+dep_bool '  Tulsa' CONFIG_SA1100_PFS168 $CONFIG_ARCH_SA1100
+dep_bool '  Victor' CONFIG_SA1100_VICTOR $CONFIG_ARCH_SA1100
 dep_bool '  XP860' CONFIG_SA1100_XP860 $CONFIG_ARCH_SA1100
-dep_bool '  Pangolin' CONFIG_SA1100_PANGOLIN $CONFIG_ARCH_SA1100
+dep_bool '  Yopy' CONFIG_SA1100_YOPY $CONFIG_ARCH_SA1100
 
 # Determine if SA1111 support is required
 if [ "$CONFIG_ASSABET_NEPONSET" = "y" -o \
+     "$CONFIG_SA1100_JORNADA720" = "y" -o \
+     "$CONFIG_SA1100_PFS168" = "y" -o \
      "$CONFIG_SA1100_XP860" = "y" ]; then
    define_bool CONFIG_SA1111 y
 fi
@@ -148,7 +167,7 @@
      "$CONFIG_ARCH_TBOX"       = "y" -o "$CONFIG_ARCH_SHARK"    = "y" -o \
      "$CONFIG_ARCH_NEXUSPCI"   = "y" -o "$CONFIG_ARCH_CLPS711X" = "y" -o \
      "$CONFIG_ARCH_INTEGRATOR" = "y" -o "$CONFIG_ARCH_SA1100"   = "y" -o \
-     "$CONFIG_ARCH_L7200"      = "y" ]; then
+     "$CONFIG_ARCH_L7200"      = "y" -o "$CONFIG_ARCH_ANAKIN"	= "y" ]; then
    define_bool CONFIG_CPU_32v4 y
 else
    define_bool CONFIG_CPU_32v4 n
@@ -219,7 +238,7 @@
 # SA110
 if [ "$CONFIG_ARCH_EBSA110"  = "y" -o "$CONFIG_FOOTBRIDGE" = "y" -o \
      "$CONFIG_ARCH_TBOX"     = "y" -o "$CONFIG_ARCH_SHARK" = "y" -o \
-     "$CONFIG_ARCH_NEXUSPCI" = "y" ]; then
+     "$CONFIG_ARCH_NEXUSPCI" = "y" -o "$CONFIG_ARCH_ANAKIN" = "y" ]; then
    define_bool CONFIG_CPU_SA110 y
 else
    if [ "$CONFIG_ARCH_RPC" = "y" ]; then
@@ -252,9 +271,6 @@
 mainmenu_option next_comment
 comment 'General setup'
 
-comment 'Please ensure that you have read the help on the next option'
-bool 'Load kernel using Angel Debug Monitor' CONFIG_ANGELBOOT
-
 # Now handle the bus types
 if [ "$CONFIG_ARCH_FTVPCI" = "y" -o \
      "$CONFIG_ARCH_SHARK" = "y" -o \
@@ -272,7 +288,8 @@
 if [ "$CONFIG_FOOTBRIDGE_HOST" = "y" -o \
      "$CONFIG_ARCH_SHARK" = "y" -o \
      "$CONFIG_ARCH_CLPS7500" = "y" -o \
-     "$CONFIG_ARCH_EBSA110" = "y" ]; then
+     "$CONFIG_ARCH_EBSA110" = "y" -o \
+     "$CONFIG_ARCH_SA1100" = "y" ]; then
    define_bool CONFIG_ISA y
 else
    define_bool CONFIG_ISA n
@@ -285,6 +302,11 @@
    define_bool CONFIG_ISA_DMA n
 fi
 
+if [ "$CONFIG_ARCH_SA1100" = "y" -o \
+     "$CONFIG_ARCH_INTEGRATOR" = "y" ]; then
+   dep_bool 'Support CPU clock change (EXPERIMENTAL)' CONFIG_CPU_FREQ $CONFIG_EXPERIMENTAL
+fi
+
 source drivers/pci/Config.in
 bool 'Support hot-pluggable devices' CONFIG_HOTPLUG
 if [ "$CONFIG_HOTPLUG" = "y" ]; then
@@ -312,8 +334,8 @@
      "$CONFIG_ARCH_CLPS7500" = "y" -o        \
      "$CONFIG_ARCH_PERSONAL_SERVER" = "y" -o \
      "$CONFIG_ARCH_CATS" = "y" -o            \
-     "$CONFIG_ARCH_INTEGRATOR" = "y" -o      \
-     "$CONFIG_ARCH_P720T" = "y" ]; then
+     "$CONFIG_ARCH_P720T" = "y" -o	     \
+     "$CONFIG_ARCH_ANAKIN" = "y" ]; then
    string 'Default kernel command string' CONFIG_CMDLINE ""
 fi
 if [ "$CONFIG_ARCH_NETWINDER" = "y" -o  \
@@ -348,7 +370,11 @@
 endmenu
 
 source drivers/parport/Config.in
-source drivers/mtd/Config.in
+
+if [ "$CONFIG_ALIGNMENT_TRAP" = "y" ]; then
+  source drivers/mtd/Config.in
+fi
+
 source drivers/pnp/Config.in
 source drivers/block/Config.in
 source drivers/md/Config.in
@@ -403,7 +429,7 @@
 
 source drivers/ieee1394/Config.in
 
-source drivers/message/i2o/Config.in
+source drivers/i2o/Config.in
 
 mainmenu_option next_comment
 comment 'ISDN subsystem'
@@ -446,6 +472,9 @@
       define_bool CONFIG_KMI_KEYB y
       define_bool CONFIG_KMI_MOUSE y
    fi
+   if [ "$CONFIG_ARCH_L7200" = "y" ]; then
+      define_bool CONFIG_L7200_KEYB y
+   fi
 
    # Do we use the PC-type keyboard map?
    if [ "$CONFIG_FOOTBRIDGE_HOST" = "y" -o \
@@ -454,13 +483,13 @@
         "$CONFIG_ARCH_INTEGRATOR" = "y" -o \
         "$CONFIG_ARCH_TBOX" = "y" -o       \
         "$CONFIG_ARCH_CLPS7500" = "y" -o   \
-        "$CONFIG_ARCH_P720T" = "y" ]; then
+        "$CONFIG_ARCH_P720T" = "y" -o      \
+        "$CONFIG_ARCH_ANAKIN" = "y" ]; then
       define_bool CONFIG_PC_KEYMAP y
    fi
    if [ "$CONFIG_ARCH_ACORN" != "y" -a "$CONFIG_ARCH_EBSA110" != "y" ]; then
       bool 'VGA text console' CONFIG_VGA_CONSOLE
    fi
-   bool 'Support Frame buffer devices' CONFIG_FB
    source drivers/video/Config.in
    endmenu
 fi
@@ -469,6 +498,7 @@
      "$CONFIG_ARCH_CLPS7500" = "y" -o \
      "$CONFIG_ARCH_TBOX" = "y" -o \
      "$CONFIG_ARCH_SHARK" = "y" -o \
+     "$CONFIG_ARCH_SA1100" = "y" -o \
      "$CONFIG_PCI" = "y" ]; then
    mainmenu_option next_comment
    comment 'Sound'
diff -u --recursive --new-file v2.4.8/linux/arch/arm/def-configs/anakin linux/arch/arm/def-configs/anakin
--- v2.4.8/linux/arch/arm/def-configs/anakin	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/def-configs/anakin	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,465 @@
+#
+# Automatically generated make config: don't edit
+#
+CONFIG_ARM=y
+# CONFIG_EISA is not set
+# CONFIG_SBUS is not set
+# CONFIG_MCA is not set
+CONFIG_UID16=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+# CONFIG_OBSOLETE is not set
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_KMOD is not set
+
+#
+# System Type
+#
+# CONFIG_ARCH_ARCA5K is not set
+# CONFIG_ARCH_CLPS7500 is not set
+# CONFIG_ARCH_CO285 is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_L7200 is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_CLPS711X is not set
+CONFIG_ARCH_ANAKIN=y
+
+#
+# Archimedes/A5000 Implementations
+#
+
+#
+# Archimedes/A5000 Implementations (select only ONE)
+#
+# CONFIG_ARCH_ARC is not set
+# CONFIG_ARCH_A5K is not set
+
+#
+# Footbridge Implementations
+#
+# CONFIG_ARCH_CATS is not set
+# CONFIG_ARCH_PERSONAL_SERVER is not set
+# CONFIG_ARCH_EBSA285_ADDIN is not set
+# CONFIG_ARCH_EBSA285_HOST is not set
+# CONFIG_ARCH_NETWINDER is not set
+
+#
+# SA11x0 Implementations
+#
+# CONFIG_SA1100_ASSABET is not set
+# CONFIG_ASSABET_NEPONSET is not set
+# CONFIG_SA1100_BRUTUS is not set
+# CONFIG_SA1100_CERF is not set
+# CONFIG_SA1100_BITSY is not set
+# CONFIG_SA1100_EXTENEX1 is not set
+# CONFIG_SA1100_FREEBIRD is not set
+# CONFIG_SA1100_GRAPHICSCLIENT is not set
+# CONFIG_SA1100_JORNADA720 is not set
+# CONFIG_SA1100_HUW_WEBPANEL is not set
+# CONFIG_SA1100_ITSY is not set
+# CONFIG_SA1100_LART is not set
+# CONFIG_SA1100_NANOENGINE is not set
+# CONFIG_SA1100_OMNIMETER is not set
+# CONFIG_SA1100_PANGOLIN is not set
+# CONFIG_SA1100_PLEB is not set
+# CONFIG_SA1100_SHERMAN is not set
+# CONFIG_SA1100_PFS168 is not set
+# CONFIG_SA1100_VICTOR is not set
+# CONFIG_SA1100_XP860 is not set
+# CONFIG_SA1100_YOPY is not set
+
+#
+# CLPS711X/EP721X Implementations
+#
+# CONFIG_ARCH_P720T is not set
+# CONFIG_ARCH_ACORN is not set
+# CONFIG_FOOTBRIDGE is not set
+# CONFIG_FOOTBRIDGE_HOST is not set
+# CONFIG_FOOTBRIDGE_ADDIN is not set
+CONFIG_CPU_32=y
+# CONFIG_CPU_26 is not set
+
+#
+# Processor Type
+#
+# CONFIG_CPU_32v3 is not set
+CONFIG_CPU_32v4=y
+# CONFIG_CPU_ARM610 is not set
+# CONFIG_CPU_ARM710 is not set
+# CONFIG_CPU_ARM720T is not set
+# CONFIG_CPU_ARM920T is not set
+# CONFIG_CPU_ARM1020 is not set
+CONFIG_CPU_SA110=y
+# CONFIG_CPU_SA1100 is not set
+# CONFIG_DISCONTIGMEM is not set
+
+#
+# General setup
+#
+# CONFIG_PCI is not set
+# CONFIG_ISA is not set
+# CONFIG_ISA_DMA is not set
+# CONFIG_HOTPLUG is not set
+# CONFIG_PCMCIA is not set
+CONFIG_NET=y
+# CONFIG_SYSVIPC is not set
+# CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_SYSCTL is not set
+CONFIG_FPE_NWFPE=y
+# CONFIG_FPE_FASTFPE is not set
+CONFIG_KCORE_ELF=y
+# CONFIG_KCORE_AOUT is not set
+CONFIG_BINFMT_AOUT=y
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_MISC is not set
+# CONFIG_PM is not set
+# CONFIG_ARTHUR is not set
+CONFIG_CMDLINE=""
+# CONFIG_ALIGNMENT_TRAP is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play configuration
+#
+# CONFIG_PNP is not set
+# CONFIG_ISAPNP is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_DEV_XD is not set
+# CONFIG_PARIDE is not set
+# CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
+# CONFIG_BLK_DEV_DAC960 is not set
+# CONFIG_BLK_DEV_LOOP is not set
+# CONFIG_BLK_DEV_NBD is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_SIZE=8192
+CONFIG_BLK_DEV_INITRD=y
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+# CONFIG_BLK_DEV_MD is not set
+# CONFIG_MD_LINEAR is not set
+# CONFIG_MD_RAID0 is not set
+# CONFIG_MD_RAID1 is not set
+# CONFIG_MD_RAID5 is not set
+# CONFIG_BLK_DEV_LVM is not set
+
+#
+# Networking options
+#
+# CONFIG_PACKET is not set
+# CONFIG_NETLINK is not set
+# CONFIG_NETFILTER is not set
+# CONFIG_FILTER is not set
+CONFIG_UNIX=y
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# CONFIG_IP_ADVANCED_ROUTER is not set
+# CONFIG_IP_PNP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_INET_ECN is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_IPV6 is not set
+# CONFIG_KHTTPD is not set
+# CONFIG_ATM is not set
+
+#
+#  
+#
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_DECNET is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_LLC is not set
+# CONFIG_NET_DIVERT is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+# CONFIG_NET_FASTROUTE is not set
+# CONFIG_NET_HW_FLOWCONTROL is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED is not set
+
+#
+# Network device support
+#
+# CONFIG_NETDEVICES is not set
+
+#
+# Amateur Radio support
+#
+# CONFIG_HAMRADIO is not set
+
+#
+# IrDA (infrared) support
+#
+CONFIG_IRDA=y
+
+#
+# IrDA protocols
+#
+# CONFIG_IRLAN is not set
+# CONFIG_IRCOMM is not set
+# CONFIG_IRDA_ULTRA is not set
+# CONFIG_IRDA_OPTIONS is not set
+
+#
+# Infrared-port device drivers
+#
+
+#
+# SIR device drivers
+#
+CONFIG_IRTTY_SIR=y
+# CONFIG_IRPORT_SIR is not set
+
+#
+# FIR device drivers
+#
+# CONFIG_NSC_FIR is not set
+# CONFIG_WINBOND_FIR is not set
+# CONFIG_TOSHIBA_FIR is not set
+# CONFIG_SMC_IRCC_FIR is not set
+# CONFIG_SA1100_FIR is not set
+
+#
+# Dongle support
+#
+# CONFIG_DONGLE is not set
+
+#
+# ATA/IDE/MFM/RLL support
+#
+# CONFIG_IDE is not set
+# CONFIG_BLK_DEV_IDE_MODES is not set
+# CONFIG_BLK_DEV_HD is not set
+
+#
+# SCSI support
+#
+# CONFIG_SCSI is not set
+
+#
+# I2O device support
+#
+# CONFIG_I2O is not set
+# CONFIG_I2O_BLOCK is not set
+# CONFIG_I2O_LAN is not set
+# CONFIG_I2O_SCSI is not set
+# CONFIG_I2O_PROC is not set
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Input core support
+#
+# CONFIG_INPUT is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+# CONFIG_VT_CONSOLE is not set
+# CONFIG_SERIAL is not set
+# CONFIG_SERIAL_EXTENDED is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+CONFIG_SERIAL_ANAKIN=y
+CONFIG_SERIAL_ANAKIN_CONSOLE=y
+CONFIG_ANAKIN_DEFAULT_BAUDRATE=115200
+CONFIG_TOUCHSCREEN_ANAKIN=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_UNIX98_PTYS is not set
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# Mice
+#
+# CONFIG_BUSMOUSE is not set
+# CONFIG_MOUSE is not set
+
+#
+# Joysticks
+#
+# CONFIG_JOYSTICK is not set
+
+#
+# Input core support is needed for joysticks
+#
+# CONFIG_QIC02_TAPE is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_INTEL_RNG is not set
+# CONFIG_NVRAM is not set
+# CONFIG_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_FTAPE is not set
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# File systems
+#
+# CONFIG_QUOTA is not set
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_AUTOFS4_FS is not set
+# CONFIG_REISERFS_FS is not set
+# CONFIG_REISERFS_CHECK is not set
+# CONFIG_ADFS_FS is not set
+# CONFIG_ADFS_FS_RW is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_FAT_FS is not set
+# CONFIG_MSDOS_FS is not set
+# CONFIG_UMSDOS_FS is not set
+# CONFIG_VFAT_FS is not set
+# CONFIG_EFS_FS is not set
+# CONFIG_JFFS_FS is not set
+# CONFIG_CRAMFS is not set
+# CONFIG_TMPFS is not set
+# CONFIG_RAMFS is not set
+# CONFIG_ISO9660_FS is not set
+# CONFIG_JOLIET is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_NTFS_FS is not set
+# CONFIG_NTFS_RW is not set
+# CONFIG_HPFS_FS is not set
+CONFIG_PROC_FS=y
+# CONFIG_DEVFS_FS is not set
+# CONFIG_DEVFS_MOUNT is not set
+# CONFIG_DEVFS_DEBUG is not set
+# CONFIG_DEVPTS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_QNX4FS_RW is not set
+# CONFIG_ROMFS_FS is not set
+CONFIG_EXT2_FS=y
+# CONFIG_SYSV_FS is not set
+# CONFIG_SYSV_FS_WRITE is not set
+# CONFIG_UDF_FS is not set
+# CONFIG_UDF_RW is not set
+# CONFIG_UFS_FS is not set
+# CONFIG_UFS_FS_WRITE is not set
+
+#
+# Network File Systems
+#
+# CONFIG_CODA_FS is not set
+# CONFIG_NFS_FS is not set
+# CONFIG_NFS_V3 is not set
+# CONFIG_ROOT_NFS is not set
+# CONFIG_NFSD is not set
+# CONFIG_NFSD_V3 is not set
+# CONFIG_SUNRPC is not set
+# CONFIG_LOCKD is not set
+# CONFIG_SMB_FS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_NCPFS_PACKET_SIGNING is not set
+# CONFIG_NCPFS_IOCTL_LOCKING is not set
+# CONFIG_NCPFS_STRONG is not set
+# CONFIG_NCPFS_NFS_NS is not set
+# CONFIG_NCPFS_OS2_NS is not set
+# CONFIG_NCPFS_SMALLDOS is not set
+# CONFIG_NCPFS_NLS is not set
+# CONFIG_NCPFS_EXTRAS is not set
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+# CONFIG_SMB_NLS is not set
+# CONFIG_NLS is not set
+
+#
+# Console drivers
+#
+CONFIG_PC_KEYMAP=y
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_FB=y
+
+#
+# Frame-buffer support
+#
+CONFIG_FB=y
+CONFIG_DUMMY_CONSOLE=y
+# CONFIG_FB_ACORN is not set
+# CONFIG_FB_CLPS711X is not set
+# CONFIG_FB_CYBER2000 is not set
+# CONFIG_FB_SA1100 is not set
+CONFIG_FB_ANAKIN=y
+# CONFIG_FB_E1355 is not set
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FBCON_ADVANCED is not set
+CONFIG_FBCON_CFB16=y
+# CONFIG_FBCON_FONTWIDTH8_ONLY is not set
+# CONFIG_FBCON_FONTS is not set
+CONFIG_FONT_8x8=y
+CONFIG_FONT_8x16=y
+
+#
+# USB support
+#
+# CONFIG_USB is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_NO_FRAME_POINTER is not set
+CONFIG_DEBUG_ERRORS=y
+CONFIG_DEBUG_USER=y
+# CONFIG_DEBUG_INFO is not set
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_NO_PGT_CACHE is not set
+# CONFIG_DEBUG_LL is not set
+# CONFIG_DEBUG_DC21285_PORT is not set
+# CONFIG_DEBUG_CLPS711X_UART2 is not set
diff -u --recursive --new-file v2.4.8/linux/arch/arm/def-configs/assabet linux/arch/arm/def-configs/assabet
--- v2.4.8/linux/arch/arm/def-configs/assabet	Mon Nov 27 17:07:59 2000
+++ linux/arch/arm/def-configs/assabet	Sun Aug 12 11:13:59 2001
@@ -2,8 +2,12 @@
 # Automatically generated make config: don't edit
 #
 CONFIG_ARM=y
+# CONFIG_EISA is not set
 # CONFIG_SBUS is not set
+# CONFIG_MCA is not set
 CONFIG_UID16=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
 
 #
 # Code maturity level options
@@ -21,22 +25,37 @@
 #
 # System Type
 #
+# CONFIG_ARCH_ANAKIN is not set
 # CONFIG_ARCH_ARCA5K is not set
 # CONFIG_ARCH_CLPS7500 is not set
+# CONFIG_ARCH_CLPS711X is not set
 # CONFIG_ARCH_CO285 is not set
 # CONFIG_ARCH_EBSA110 is not set
 # CONFIG_ARCH_FOOTBRIDGE is not set
 # CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_L7200 is not set
 # CONFIG_ARCH_RPC is not set
 CONFIG_ARCH_SA1100=y
+# CONFIG_ARCH_SHARK is not set
 
 #
 # Archimedes/A5000 Implementations
 #
 
 #
+# Archimedes/A5000 Implementations (select only ONE)
+#
+# CONFIG_ARCH_ARC is not set
+# CONFIG_ARCH_A5K is not set
+
+#
 # Footbridge Implementations
 #
+# CONFIG_ARCH_CATS is not set
+# CONFIG_ARCH_PERSONAL_SERVER is not set
+# CONFIG_ARCH_EBSA285_ADDIN is not set
+# CONFIG_ARCH_EBSA285_HOST is not set
+# CONFIG_ARCH_NETWINDER is not set
 
 #
 # SA11x0 Implementations
@@ -46,16 +65,32 @@
 # CONFIG_SA1100_BRUTUS is not set
 # CONFIG_SA1100_CERF is not set
 # CONFIG_SA1100_BITSY is not set
-# CONFIG_SA1100_LART is not set
+# CONFIG_SA1100_EXTENEX1 is not set
+# CONFIG_SA1100_FLEXANET is not set
+# CONFIG_SA1100_FREEBIRD is not set
 # CONFIG_SA1100_GRAPHICSCLIENT is not set
+# CONFIG_SA1100_JORNADA720 is not set
+# CONFIG_SA1100_HUW_WEBPANEL is not set
+# CONFIG_SA1100_ITSY is not set
+# CONFIG_SA1100_LART is not set
 # CONFIG_SA1100_NANOENGINE is not set
-# CONFIG_SA1100_VICTOR is not set
+# CONFIG_SA1100_OMNIMETER is not set
+# CONFIG_SA1100_PANGOLIN is not set
+# CONFIG_SA1100_PLEB is not set
 # CONFIG_SA1100_SHERMAN is not set
+# CONFIG_SA1100_SIMPAD is not set
+# CONFIG_SA1100_PFS168 is not set
+# CONFIG_SA1100_VICTOR is not set
 # CONFIG_SA1100_XP860 is not set
-# CONFIG_SA1100_PANGOLIN is not set
-CONFIG_ANGELBOOT=y
-CONFIG_SA1100_FREQUENCY_SCALE=y
-# CONFIG_SA1100_VOLTAGE_SCALE is not set
+# CONFIG_SA1100_YOPY is not set
+CONFIG_SA1100_USB=m
+CONFIG_SA1100_USB_NETLINK=m
+# CONFIG_SA1100_USB_CHAR is not set
+
+#
+# CLPS711X/EP721X Implementations
+#
+# CONFIG_ARCH_P720T is not set
 # CONFIG_ARCH_ACORN is not set
 # CONFIG_FOOTBRIDGE is not set
 # CONFIG_FOOTBRIDGE_HOST is not set
@@ -66,9 +101,17 @@
 #
 # Processor Type
 #
+# CONFIG_CPU_32v3 is not set
 CONFIG_CPU_32v4=y
+# CONFIG_CPU_ARM610 is not set
+# CONFIG_CPU_ARM710 is not set
+# CONFIG_CPU_ARM720T is not set
+# CONFIG_CPU_ARM920T is not set
+# CONFIG_CPU_ARM1020 is not set
+# CONFIG_CPU_SA110 is not set
 CONFIG_CPU_SA1100=y
 CONFIG_DISCONTIGMEM=y
+# CONFIG_CPU_BIG_ENDIAN is not set
 
 #
 # General setup
@@ -76,29 +119,33 @@
 # CONFIG_PCI is not set
 # CONFIG_ISA is not set
 # CONFIG_ISA_DMA is not set
-CONFIG_PC_KEYMAP=y
+CONFIG_CPU_FREQ=y
 CONFIG_HOTPLUG=y
 
 #
 # PCMCIA/CardBus support
 #
 CONFIG_PCMCIA=y
-# CONFIG_PCMCIA_DEBUG is not set
-CONFIG_SA1100_PCMCIA=y
-CONFIG_VIRTUAL_BUS=y
+# CONFIG_I82365 is not set
+# CONFIG_TCIC is not set
+# CONFIG_PCMCIA_CLPS6700 is not set
+CONFIG_PCMCIA_SA1100=y
 CONFIG_NET=y
 CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
-CONFIG_NWFPE=y
+CONFIG_FPE_NWFPE=y
+# CONFIG_FPE_FASTFPE is not set
 CONFIG_KCORE_ELF=y
 # CONFIG_KCORE_AOUT is not set
 # CONFIG_BINFMT_AOUT is not set
 CONFIG_BINFMT_ELF=y
 # CONFIG_BINFMT_MISC is not set
-# CONFIG_PM is not set
+CONFIG_PM=y
+# CONFIG_APM is not set
 # CONFIG_ARTHUR is not set
-CONFIG_CMDLINE="keepinitrd"
+CONFIG_CMDLINE=""
+# CONFIG_PFS168_CMDLINE is not set
 CONFIG_LEDS=y
 CONFIG_LEDS_TIMER=y
 CONFIG_LEDS_CPU=y
@@ -112,7 +159,94 @@
 #
 # Memory Technology Devices (MTD)
 #
-# CONFIG_MTD is not set
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+CONFIG_MTD_PARTITIONS=y
+CONFIG_MTD_REDBOOT_PARTS=y
+# CONFIG_MTD_BOOTLDR_PARTS is not set
+# CONFIG_MTD_AFS_PARTS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLOCK=y
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
+
+#
+# RAM/ROM/Flash chip drivers
+#
+CONFIG_MTD_CFI=y
+CONFIG_MTD_CFI_ADV_OPTIONS=y
+CONFIG_MTD_CFI_NOSWAP=y
+# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
+# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
+CONFIG_MTD_CFI_GEOMETRY=y
+# CONFIG_MTD_CFI_B1 is not set
+# CONFIG_MTD_CFI_B2 is not set
+CONFIG_MTD_CFI_B4=y
+# CONFIG_MTD_CFI_I1 is not set
+CONFIG_MTD_CFI_I2=y
+# CONFIG_MTD_CFI_I4 is not set
+CONFIG_MTD_CFI_INTELEXT=y
+# CONFIG_MTD_CFI_AMDSTD is not set
+# CONFIG_MTD_AMDSTD is not set
+# CONFIG_MTD_SHARP is not set
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_JEDEC is not set
+
+#
+# Mapping drivers for chip access
+#
+# CONFIG_MTD_PHYSMAP is not set
+# CONFIG_MTD_SUN_UFLASH is not set
+# CONFIG_MTD_NORA is not set
+# CONFIG_MTD_PNC2000 is not set
+# CONFIG_MTD_RPXLITE is not set
+# CONFIG_MTD_TQM8XXL is not set
+# CONFIG_MTD_SC520CDP is not set
+# CONFIG_MTD_NETSC520 is not set
+# CONFIG_MTD_SBC_GXX is not set
+# CONFIG_MTD_ELAN_104NC is not set
+CONFIG_MTD_SA1100=y
+CONFIG_MTD_SA1100_REDBOOT_PARTITIONS=y
+# CONFIG_MTD_SA1100_BOOTLDR_PARTITIONS is not set
+# CONFIG_MTD_DC21285 is not set
+# CONFIG_MTD_IQ80310 is not set
+# CONFIG_MTD_DBOX2 is not set
+# CONFIG_MTD_CSTM_MIPS_IXX is not set
+# CONFIG_MTD_CFI_FLAGADM is not set
+# CONFIG_MTD_ARM_INTEGRATOR is not set
+# CONFIG_MTD_SOLUTIONENGINE is not set
+# CONFIG_MTD_MIXMEM is not set
+# CONFIG_MTD_OCTAGON is not set
+# CONFIG_MTD_VMAX is not set
+# CONFIG_MTD_OCELOT is not set
+# CONFIG_MTD_L440GX is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_PMC551 is not set
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_LART is not set
+# CONFIG_MTD_MTDRAM is not set
+# CONFIG_MTD_BLKMTD is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOC1000 is not set
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOCPROBE is not set
+
+#
+# NAND Flash Device Drivers
+#
+# CONFIG_MTD_NAND is not set
 
 #
 # Plug and Play configuration
@@ -127,19 +261,24 @@
 # CONFIG_BLK_DEV_XD is not set
 # CONFIG_PARIDE is not set
 # CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
 # CONFIG_BLK_DEV_DAC960 is not set
-# CONFIG_BLK_DEV_LOOP is not set
+CONFIG_BLK_DEV_LOOP=m
 # CONFIG_BLK_DEV_NBD is not set
-# CONFIG_BLK_DEV_LVM is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BLK_DEV_INITRD=y
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
 # CONFIG_BLK_DEV_MD is not set
 # CONFIG_MD_LINEAR is not set
 # CONFIG_MD_RAID0 is not set
 # CONFIG_MD_RAID1 is not set
 # CONFIG_MD_RAID5 is not set
-CONFIG_BLK_DEV_RAM=y
-CONFIG_BLK_DEV_RAM_SIZE=4096
-CONFIG_BLK_DEV_INITRD=y
-# CONFIG_BLK_DEV_FLASH is not set
+# CONFIG_BLK_DEV_LVM is not set
 
 #
 # Networking options
@@ -171,6 +310,7 @@
 # CONFIG_X25 is not set
 # CONFIG_LAPB is not set
 # CONFIG_LLC is not set
+# CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
 # CONFIG_NET_FASTROUTE is not set
@@ -194,18 +334,20 @@
 # CONFIG_BONDING is not set
 # CONFIG_EQUALIZER is not set
 # CONFIG_TUN is not set
-# CONFIG_NET_SB1000 is not set
 
 #
 # Ethernet (10 or 100Mbit)
 #
 CONFIG_NET_ETHERNET=y
+# CONFIG_SUNLANCE is not set
+# CONFIG_SUNBMAC is not set
+# CONFIG_SUNQE is not set
+# CONFIG_SUNLANCE is not set
+# CONFIG_SUNGEM is not set
 # CONFIG_NET_VENDOR_3COM is not set
 # CONFIG_LANCE is not set
 # CONFIG_NET_VENDOR_SMC is not set
 # CONFIG_NET_VENDOR_RACAL is not set
-# CONFIG_AT1700 is not set
-# CONFIG_DEPCA is not set
 # CONFIG_NET_ISA is not set
 # CONFIG_NET_PCI is not set
 # CONFIG_NET_POCKET is not set
@@ -213,11 +355,15 @@
 #
 # Ethernet (1000 Mbit)
 #
-# CONFIG_YELLOWFIN is not set
 # CONFIG_ACENIC is not set
+# CONFIG_ACENIC_OMIT_TIGON_I is not set
+# CONFIG_MYRI_SBUS is not set
+# CONFIG_HAMACHI is not set
+# CONFIG_YELLOWFIN is not set
 # CONFIG_SK98LIN is not set
 # CONFIG_FDDI is not set
 # CONFIG_HIPPI is not set
+# CONFIG_PLIP is not set
 # CONFIG_PPP is not set
 # CONFIG_SLIP is not set
 
@@ -253,7 +399,6 @@
 # CONFIG_ARCNET_COM20020_CS is not set
 # CONFIG_PCMCIA_IBMTR is not set
 # CONFIG_NET_PCMCIA_RADIO is not set
-CONFIG_PCMCIA_NETCARD=y
 
 #
 # Amateur Radio support
@@ -263,7 +408,41 @@
 #
 # IrDA (infrared) support
 #
-# CONFIG_IRDA is not set
+CONFIG_IRDA=m
+
+#
+# IrDA protocols
+#
+CONFIG_IRLAN=m
+# CONFIG_IRNET is not set
+# CONFIG_IRCOMM is not set
+# CONFIG_IRDA_ULTRA is not set
+# CONFIG_IRDA_OPTIONS is not set
+
+#
+# Infrared-port device drivers
+#
+
+#
+# SIR device drivers
+#
+# CONFIG_IRTTY_SIR is not set
+# CONFIG_IRPORT_SIR is not set
+
+#
+# Dongle support
+#
+# CONFIG_DONGLE is not set
+
+#
+# FIR device drivers
+#
+# CONFIG_USB_IRDA is not set
+# CONFIG_NSC_FIR is not set
+# CONFIG_WINBOND_FIR is not set
+# CONFIG_TOSHIBA_FIR is not set
+# CONFIG_SMC_IRCC_FIR is not set
+CONFIG_SA1100_FIR=m
 
 #
 # ATA/IDE/MFM/RLL support
@@ -328,6 +507,11 @@
 # CONFIG_ISDN is not set
 
 #
+# Input core support
+#
+# CONFIG_INPUT is not set
+
+#
 # Character devices
 #
 CONFIG_VT=y
@@ -335,13 +519,31 @@
 # CONFIG_SERIAL is not set
 # CONFIG_SERIAL_EXTENDED is not set
 # CONFIG_SERIAL_NONSTANDARD is not set
+# CONFIG_SERIAL_21285 is not set
+# CONFIG_SERIAL_21285_OLD is not set
+# CONFIG_SERIAL_21285_CONSOLE is not set
+# CONFIG_SERIAL_AMBA is not set
+# CONFIG_SERIAL_AMBA_CONSOLE is not set
+# CONFIG_SERIAL_CLPS711X is not set
+# CONFIG_SERIAL_CLPS711X_CONSOLE is not set
 CONFIG_SERIAL_SA1100=y
 CONFIG_SERIAL_SA1100_CONSOLE=y
-CONFIG_SA1100_DEFAULT_BAUDRATE=9600
-CONFIG_TOUCHSCREEN_UCB1200=y
-# CONFIG_TOUCHSCREEN_BITSY is not set
+CONFIG_SA1100_DEFAULT_BAUDRATE=38400
+CONFIG_SERIAL_8250=m
+# CONFIG_SERIAL_8250_CONSOLE is not set
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_UNIX98_PTYS=y
 CONFIG_UNIX98_PTY_COUNT=32
+CONFIG_UCB1200=y
+CONFIG_TOUCHSCREEN_UCB1200=y
+# CONFIG_AUDIO_UCB1200 is not set
+CONFIG_ADC_UCB1200=y
+# CONFIG_TOUCHSCREEN_BITSY is not set
+# CONFIG_PROFILER is not set
+# CONFIG_PFS168_SPI is not set
+# CONFIG_PFS168_DTMF is not set
+# CONFIG_PFS168_MISC is not set
 
 #
 # I2C support
@@ -371,6 +573,7 @@
 # CONFIG_INTEL_RNG is not set
 # CONFIG_NVRAM is not set
 # CONFIG_RTC is not set
+CONFIG_SA1100_RTC=y
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
 # CONFIG_APPLICOM is not set
@@ -381,7 +584,15 @@
 # CONFIG_FTAPE is not set
 # CONFIG_AGP is not set
 # CONFIG_DRM is not set
-# CONFIG_PCMCIA_SERIAL is not set
+
+#
+# PCMCIA character devices
+#
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
 
 #
 # File systems
@@ -389,6 +600,8 @@
 # CONFIG_QUOTA is not set
 # CONFIG_AUTOFS_FS is not set
 # CONFIG_AUTOFS4_FS is not set
+# CONFIG_REISERFS_FS is not set
+# CONFIG_REISERFS_CHECK is not set
 # CONFIG_ADFS_FS is not set
 # CONFIG_ADFS_FS_RW is not set
 # CONFIG_AFFS_FS is not set
@@ -399,12 +612,17 @@
 # CONFIG_UMSDOS_FS is not set
 # CONFIG_VFAT_FS is not set
 # CONFIG_EFS_FS is not set
-# CONFIG_JFFS_FS is not set
+CONFIG_JFFS_FS=m
+CONFIG_JFFS_FS_VERBOSE=0
+CONFIG_JFFS2_FS=y
+CONFIG_JFFS2_FS_DEBUG=0
 # CONFIG_CRAMFS is not set
+CONFIG_TMPFS=y
 # CONFIG_RAMFS is not set
 # CONFIG_ISO9660_FS is not set
 # CONFIG_JOLIET is not set
 # CONFIG_MINIX_FS is not set
+# CONFIG_VXFS_FS is not set
 # CONFIG_NTFS_FS is not set
 # CONFIG_NTFS_RW is not set
 # CONFIG_HPFS_FS is not set
@@ -418,7 +636,6 @@
 # CONFIG_ROMFS_FS is not set
 CONFIG_EXT2_FS=y
 # CONFIG_SYSV_FS is not set
-# CONFIG_SYSV_FS_WRITE is not set
 # CONFIG_UDF_FS is not set
 # CONFIG_UDF_RW is not set
 # CONFIG_UFS_FS is not set
@@ -443,8 +660,6 @@
 # CONFIG_NCPFS_NFS_NS is not set
 # CONFIG_NCPFS_OS2_NS is not set
 # CONFIG_NCPFS_SMALLDOS is not set
-# CONFIG_NCPFS_MOUNT_SUBDIR is not set
-# CONFIG_NCPFS_NDS_DOMAINS is not set
 # CONFIG_NCPFS_NLS is not set
 # CONFIG_NCPFS_EXTRAS is not set
 
@@ -459,11 +674,13 @@
 # CONFIG_MAC_PARTITION is not set
 CONFIG_MSDOS_PARTITION=y
 # CONFIG_BSD_DISKLABEL is not set
+# CONFIG_MINIX_SUBPARTITION is not set
 # CONFIG_SOLARIS_X86_PARTITION is not set
 # CONFIG_UNIXWARE_DISKLABEL is not set
 # CONFIG_SGI_PARTITION is not set
 # CONFIG_ULTRIX_PARTITION is not set
 # CONFIG_SUN_PARTITION is not set
+# CONFIG_SMB_NLS is not set
 CONFIG_NLS=y
 
 #
@@ -485,11 +702,13 @@
 # CONFIG_NLS_CODEPAGE_865 is not set
 # CONFIG_NLS_CODEPAGE_866 is not set
 # CONFIG_NLS_CODEPAGE_869 is not set
-# CONFIG_NLS_CODEPAGE_874 is not set
-# CONFIG_NLS_CODEPAGE_932 is not set
 # CONFIG_NLS_CODEPAGE_936 is not set
-# CONFIG_NLS_CODEPAGE_949 is not set
 # CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
 # CONFIG_NLS_ISO8859_1 is not set
 # CONFIG_NLS_ISO8859_2 is not set
 # CONFIG_NLS_ISO8859_3 is not set
@@ -497,27 +716,31 @@
 # CONFIG_NLS_ISO8859_5 is not set
 # CONFIG_NLS_ISO8859_6 is not set
 # CONFIG_NLS_ISO8859_7 is not set
-# CONFIG_NLS_ISO8859_8 is not set
 # CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
 # CONFIG_NLS_ISO8859_14 is not set
 # CONFIG_NLS_ISO8859_15 is not set
 # CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
 # CONFIG_NLS_UTF8 is not set
 
 #
 # Console drivers
 #
+CONFIG_PC_KEYMAP=y
 # CONFIG_VGA_CONSOLE is not set
-CONFIG_FB=y
 
 #
 # Frame-buffer support
 #
 CONFIG_FB=y
 CONFIG_DUMMY_CONSOLE=y
+# CONFIG_FB_ACORN is not set
+# CONFIG_FB_CLPS711X is not set
 # CONFIG_FB_CYBER2000 is not set
 CONFIG_FB_SA1100=y
-# CONFIG_FB_MQ200 is not set
+# CONFIG_FB_ANAKIN is not set
+# CONFIG_FB_E1355 is not set
 # CONFIG_FB_VIRTUAL is not set
 # CONFIG_FBCON_ADVANCED is not set
 CONFIG_FBCON_CFB2=y
@@ -536,20 +759,26 @@
 # Sound
 #
 CONFIG_SOUND=y
-CONFIG_SOUND_UDA1341=y
-# CONFIG_SOUND_SA1100_SSP is not set
+CONFIG_SOUND_ASSABET_UDA1341=y
+# CONFIG_SOUND_BITSY_UDA1341 is not set
+# CONFIG_SOUND_SA1111_UDA1341 is not set
+# CONFIG_SOUND_SA1100SSP is not set
 # CONFIG_SOUND_CMPCI is not set
 # CONFIG_SOUND_EMU10K1 is not set
 # CONFIG_SOUND_FUSION is not set
+# CONFIG_SOUND_CS4281 is not set
 # CONFIG_SOUND_ES1370 is not set
 # CONFIG_SOUND_ES1371 is not set
 # CONFIG_SOUND_ESSSOLO1 is not set
 # CONFIG_SOUND_MAESTRO is not set
+# CONFIG_SOUND_MAESTRO3 is not set
+# CONFIG_SOUND_ICH is not set
 # CONFIG_SOUND_SONICVIBES is not set
 # CONFIG_SOUND_TRIDENT is not set
 # CONFIG_SOUND_MSNDCLAS is not set
 # CONFIG_SOUND_MSNDPIN is not set
 # CONFIG_SOUND_VIA82CXXX is not set
+# CONFIG_MIDI_VIA82CXXX is not set
 # CONFIG_SOUND_OSS is not set
 # CONFIG_SOUND_TVMIXER is not set
 
@@ -559,11 +788,19 @@
 # CONFIG_USB is not set
 
 #
+# Bluetooth support
+#
+# CONFIG_BLUEZ is not set
+
+#
 # Kernel hacking
 #
-CONFIG_FRAME_POINTER=y
+# CONFIG_NO_FRAME_POINTER is not set
 CONFIG_DEBUG_ERRORS=y
 CONFIG_DEBUG_USER=y
 # CONFIG_DEBUG_INFO is not set
-# CONFIG_MAGIC_SYSRQ is not set
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_NO_PGT_CACHE is not set
 # CONFIG_DEBUG_LL is not set
+# CONFIG_DEBUG_DC21285_PORT is not set
+# CONFIG_DEBUG_CLPS711X_UART2 is not set
diff -u --recursive --new-file v2.4.8/linux/arch/arm/def-configs/bitsy linux/arch/arm/def-configs/bitsy
--- v2.4.8/linux/arch/arm/def-configs/bitsy	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/def-configs/bitsy	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,763 @@
+#
+# Automatically generated make config: don't edit
+#
+CONFIG_ARM=y
+# CONFIG_EISA is not set
+# CONFIG_SBUS is not set
+# CONFIG_MCA is not set
+CONFIG_UID16=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+# CONFIG_OBSOLETE is not set
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_KMOD is not set
+
+#
+# System Type
+#
+# CONFIG_ARCH_ANAKIN is not set
+# CONFIG_ARCH_ARCA5K is not set
+# CONFIG_ARCH_CLPS7500 is not set
+# CONFIG_ARCH_CLPS711X is not set
+# CONFIG_ARCH_CO285 is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_L7200 is not set
+# CONFIG_ARCH_RPC is not set
+CONFIG_ARCH_SA1100=y
+# CONFIG_ARCH_SHARK is not set
+
+#
+# Archimedes/A5000 Implementations
+#
+
+#
+# Archimedes/A5000 Implementations (select only ONE)
+#
+# CONFIG_ARCH_ARC is not set
+# CONFIG_ARCH_A5K is not set
+
+#
+# Footbridge Implementations
+#
+# CONFIG_ARCH_CATS is not set
+# CONFIG_ARCH_PERSONAL_SERVER is not set
+# CONFIG_ARCH_EBSA285_ADDIN is not set
+# CONFIG_ARCH_EBSA285_HOST is not set
+# CONFIG_ARCH_NETWINDER is not set
+
+#
+# SA11x0 Implementations
+#
+# CONFIG_SA1100_ASSABET is not set
+# CONFIG_ASSABET_NEPONSET is not set
+# CONFIG_SA1100_BRUTUS is not set
+# CONFIG_SA1100_CERF is not set
+CONFIG_SA1100_BITSY=y
+# CONFIG_SA1100_EXTENEX1 is not set
+# CONFIG_SA1100_FLEXANET is not set
+# CONFIG_SA1100_FREEBIRD is not set
+# CONFIG_SA1100_GRAPHICSCLIENT is not set
+# CONFIG_SA1100_JORNADA720 is not set
+# CONFIG_SA1100_HUW_WEBPANEL is not set
+# CONFIG_SA1100_ITSY is not set
+# CONFIG_SA1100_LART is not set
+# CONFIG_SA1100_NANOENGINE is not set
+# CONFIG_SA1100_OMNIMETER is not set
+# CONFIG_SA1100_PANGOLIN is not set
+# CONFIG_SA1100_PLEB is not set
+# CONFIG_SA1100_SHERMAN is not set
+# CONFIG_SA1100_SIMPAD is not set
+# CONFIG_SA1100_PFS168 is not set
+# CONFIG_SA1100_VICTOR is not set
+# CONFIG_SA1100_XP860 is not set
+# CONFIG_SA1100_YOPY is not set
+CONFIG_SA1100_USB=m
+CONFIG_SA1100_USB_NETLINK=m
+# CONFIG_SA1100_USB_CHAR is not set
+
+#
+# CLPS711X/EP721X Implementations
+#
+# CONFIG_ARCH_P720T is not set
+# CONFIG_ARCH_ACORN is not set
+# CONFIG_FOOTBRIDGE is not set
+# CONFIG_FOOTBRIDGE_HOST is not set
+# CONFIG_FOOTBRIDGE_ADDIN is not set
+CONFIG_CPU_32=y
+# CONFIG_CPU_26 is not set
+
+#
+# Processor Type
+#
+# CONFIG_CPU_32v3 is not set
+CONFIG_CPU_32v4=y
+# CONFIG_CPU_ARM610 is not set
+# CONFIG_CPU_ARM710 is not set
+# CONFIG_CPU_ARM720T is not set
+# CONFIG_CPU_ARM920T is not set
+# CONFIG_CPU_ARM1020 is not set
+# CONFIG_CPU_SA110 is not set
+CONFIG_CPU_SA1100=y
+CONFIG_DISCONTIGMEM=y
+# CONFIG_CPU_BIG_ENDIAN is not set
+
+#
+# General setup
+#
+# CONFIG_PCI is not set
+# CONFIG_ISA is not set
+# CONFIG_ISA_DMA is not set
+CONFIG_CPU_FREQ=y
+CONFIG_HOTPLUG=y
+
+#
+# PCMCIA/CardBus support
+#
+CONFIG_PCMCIA=y
+# CONFIG_I82365 is not set
+# CONFIG_TCIC is not set
+# CONFIG_PCMCIA_CLPS6700 is not set
+CONFIG_PCMCIA_SA1100=y
+CONFIG_NET=y
+CONFIG_SYSVIPC=y
+# CONFIG_BSD_PROCESS_ACCT is not set
+CONFIG_SYSCTL=y
+CONFIG_FPE_NWFPE=y
+# CONFIG_FPE_FASTFPE is not set
+CONFIG_KCORE_ELF=y
+# CONFIG_KCORE_AOUT is not set
+# CONFIG_BINFMT_AOUT is not set
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_MISC is not set
+CONFIG_PM=y
+CONFIG_APM=m
+# CONFIG_ARTHUR is not set
+CONFIG_CMDLINE=""
+# CONFIG_PFS168_CMDLINE is not set
+# CONFIG_LEDS is not set
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+CONFIG_MTD_PARTITIONS=y
+CONFIG_MTD_REDBOOT_PARTS=y
+CONFIG_MTD_BOOTLDR_PARTS=y
+# CONFIG_MTD_AFS_PARTS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLOCK=y
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
+
+#
+# RAM/ROM/Flash chip drivers
+#
+CONFIG_MTD_CFI=y
+CONFIG_MTD_CFI_ADV_OPTIONS=y
+CONFIG_MTD_CFI_NOSWAP=y
+# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
+# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
+# CONFIG_MTD_CFI_GEOMETRY is not set
+CONFIG_MTD_CFI_INTELEXT=y
+# CONFIG_MTD_CFI_AMDSTD is not set
+# CONFIG_MTD_AMDSTD is not set
+# CONFIG_MTD_SHARP is not set
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_JEDEC is not set
+
+#
+# Mapping drivers for chip access
+#
+# CONFIG_MTD_PHYSMAP is not set
+# CONFIG_MTD_SUN_UFLASH is not set
+# CONFIG_MTD_NORA is not set
+# CONFIG_MTD_PNC2000 is not set
+# CONFIG_MTD_RPXLITE is not set
+# CONFIG_MTD_TQM8XXL is not set
+# CONFIG_MTD_SC520CDP is not set
+# CONFIG_MTD_NETSC520 is not set
+# CONFIG_MTD_SBC_GXX is not set
+# CONFIG_MTD_ELAN_104NC is not set
+# CONFIG_MTD_SA1100 is not set
+# CONFIG_MTD_SA1100_REDBOOT_PARTITIONS is not set
+# CONFIG_MTD_SA1100_BOOTLDR_PARTITIONS is not set
+# CONFIG_MTD_DC21285 is not set
+# CONFIG_MTD_IQ80310 is not set
+# CONFIG_MTD_DBOX2 is not set
+# CONFIG_MTD_CSTM_MIPS_IXX is not set
+# CONFIG_MTD_CFI_FLAGADM is not set
+# CONFIG_MTD_ARM_INTEGRATOR is not set
+# CONFIG_MTD_SOLUTIONENGINE is not set
+# CONFIG_MTD_MIXMEM is not set
+# CONFIG_MTD_OCTAGON is not set
+# CONFIG_MTD_VMAX is not set
+# CONFIG_MTD_OCELOT is not set
+# CONFIG_MTD_L440GX is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_PMC551 is not set
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_LART is not set
+# CONFIG_MTD_MTDRAM is not set
+# CONFIG_MTD_BLKMTD is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOC1000 is not set
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOCPROBE is not set
+
+#
+# NAND Flash Device Drivers
+#
+# CONFIG_MTD_NAND is not set
+
+#
+# Plug and Play configuration
+#
+# CONFIG_PNP is not set
+# CONFIG_ISAPNP is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_DEV_XD is not set
+# CONFIG_PARIDE is not set
+# CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
+# CONFIG_BLK_DEV_DAC960 is not set
+CONFIG_BLK_DEV_LOOP=m
+# CONFIG_BLK_DEV_NBD is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_SIZE=8192
+CONFIG_BLK_DEV_INITRD=y
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+# CONFIG_BLK_DEV_MD is not set
+# CONFIG_MD_LINEAR is not set
+# CONFIG_MD_RAID0 is not set
+# CONFIG_MD_RAID1 is not set
+# CONFIG_MD_RAID5 is not set
+# CONFIG_BLK_DEV_LVM is not set
+
+#
+# Networking options
+#
+# CONFIG_PACKET is not set
+# CONFIG_NETLINK is not set
+# CONFIG_NETFILTER is not set
+# CONFIG_FILTER is not set
+CONFIG_UNIX=y
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# CONFIG_IP_ADVANCED_ROUTER is not set
+# CONFIG_IP_PNP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_INET_ECN is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_IPV6 is not set
+# CONFIG_KHTTPD is not set
+# CONFIG_ATM is not set
+
+#
+#
+#
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_DECNET is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_LLC is not set
+# CONFIG_NET_DIVERT is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+# CONFIG_NET_FASTROUTE is not set
+# CONFIG_NET_HW_FLOWCONTROL is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED is not set
+
+#
+# Network device support
+#
+CONFIG_NETDEVICES=y
+
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+# CONFIG_NET_ETHERNET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+# CONFIG_ACENIC is not set
+# CONFIG_ACENIC_OMIT_TIGON_I is not set
+# CONFIG_MYRI_SBUS is not set
+# CONFIG_HAMACHI is not set
+# CONFIG_YELLOWFIN is not set
+# CONFIG_SK98LIN is not set
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI is not set
+# CONFIG_PLIP is not set
+CONFIG_PPP=m
+# CONFIG_PPP_MULTILINK is not set
+# CONFIG_PPP_FILTER is not set
+CONFIG_PPP_ASYNC=m
+# CONFIG_PPP_SYNC_TTY is not set
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+# CONFIG_PPPOE is not set
+# CONFIG_SLIP is not set
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Token Ring devices
+#
+# CONFIG_TR is not set
+# CONFIG_NET_FC is not set
+# CONFIG_RCPCI is not set
+# CONFIG_SHAPER is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+
+#
+# PCMCIA network device support
+#
+CONFIG_NET_PCMCIA=y
+# CONFIG_PCMCIA_3C589 is not set
+# CONFIG_PCMCIA_3C574 is not set
+# CONFIG_PCMCIA_FMVJ18X is not set
+CONFIG_PCMCIA_PCNET=y
+# CONFIG_PCMCIA_NMCLAN is not set
+# CONFIG_PCMCIA_SMC91C92 is not set
+# CONFIG_PCMCIA_XIRC2PS is not set
+# CONFIG_ARCNET_COM20020_CS is not set
+# CONFIG_PCMCIA_IBMTR is not set
+# CONFIG_NET_PCMCIA_RADIO is not set
+
+#
+# Amateur Radio support
+#
+# CONFIG_HAMRADIO is not set
+
+#
+# IrDA (infrared) support
+#
+# CONFIG_IRDA is not set
+
+#
+# ATA/IDE/MFM/RLL support
+#
+CONFIG_IDE=m
+
+#
+# IDE, ATA and ATAPI Block devices
+#
+CONFIG_BLK_DEV_IDE=m
+
+#
+# Please see Documentation/ide.txt for help/info on IDE drives
+#
+# CONFIG_BLK_DEV_HD_IDE is not set
+# CONFIG_BLK_DEV_HD is not set
+CONFIG_BLK_DEV_IDEDISK=m
+# CONFIG_IDEDISK_MULTI_MODE is not set
+# CONFIG_BLK_DEV_IDEDISK_VENDOR is not set
+# CONFIG_BLK_DEV_IDEDISK_FUJITSU is not set
+# CONFIG_BLK_DEV_IDEDISK_IBM is not set
+# CONFIG_BLK_DEV_IDEDISK_MAXTOR is not set
+# CONFIG_BLK_DEV_IDEDISK_QUANTUM is not set
+# CONFIG_BLK_DEV_IDEDISK_SEAGATE is not set
+# CONFIG_BLK_DEV_IDEDISK_WD is not set
+# CONFIG_BLK_DEV_COMMERIAL is not set
+# CONFIG_BLK_DEV_TIVO is not set
+# CONFIG_BLK_DEV_IDECS is not set
+CONFIG_BLK_DEV_IDECD=m
+# CONFIG_BLK_DEV_IDETAPE is not set
+# CONFIG_BLK_DEV_IDEFLOPPY is not set
+# CONFIG_BLK_DEV_IDESCSI is not set
+
+#
+# IDE chipset support/bugfixes
+#
+# CONFIG_BLK_DEV_CMD640 is not set
+# CONFIG_BLK_DEV_CMD640_ENHANCED is not set
+# CONFIG_BLK_DEV_ISAPNP is not set
+# CONFIG_IDE_CHIPSETS is not set
+# CONFIG_IDEDMA_AUTO is not set
+# CONFIG_DMA_NONPCI is not set
+# CONFIG_BLK_DEV_IDE_MODES is not set
+
+#
+# SCSI support
+#
+# CONFIG_SCSI is not set
+
+#
+# I2O device support
+#
+# CONFIG_I2O is not set
+# CONFIG_I2O_BLOCK is not set
+# CONFIG_I2O_LAN is not set
+# CONFIG_I2O_SCSI is not set
+# CONFIG_I2O_PROC is not set
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Input core support
+#
+# CONFIG_INPUT is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+# CONFIG_VT_CONSOLE is not set
+CONFIG_SERIAL=m
+# CONFIG_SERIAL_EXTENDED is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+# CONFIG_SERIAL_21285 is not set
+# CONFIG_SERIAL_21285_OLD is not set
+# CONFIG_SERIAL_21285_CONSOLE is not set
+# CONFIG_SERIAL_AMBA is not set
+# CONFIG_SERIAL_AMBA_CONSOLE is not set
+# CONFIG_SERIAL_CLPS711X is not set
+# CONFIG_SERIAL_CLPS711X_CONSOLE is not set
+CONFIG_SERIAL_SA1100=y
+CONFIG_SERIAL_SA1100_CONSOLE=y
+CONFIG_SA1100_DEFAULT_BAUDRATE=38400
+CONFIG_SERIAL_8250=m
+# CONFIG_SERIAL_8250_CONSOLE is not set
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_UNIX98_PTY_COUNT=32
+# CONFIG_UCB1200 is not set
+# CONFIG_TOUCHSCREEN_UCB1200 is not set
+# CONFIG_AUDIO_UCB1200 is not set
+# CONFIG_ADC_UCB1200 is not set
+CONFIG_TOUCHSCREEN_BITSY=y
+CONFIG_PROFILER=m
+# CONFIG_PFS168_SPI is not set
+# CONFIG_PFS168_DTMF is not set
+# CONFIG_PFS168_MISC is not set
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# Mice
+#
+# CONFIG_BUSMOUSE is not set
+CONFIG_MOUSE=m
+# CONFIG_PSMOUSE is not set
+# CONFIG_82C710_MOUSE is not set
+# CONFIG_PC110_PAD is not set
+
+#
+# Joysticks
+#
+# CONFIG_JOYSTICK is not set
+
+#
+# Input core support is needed for joysticks
+#
+# CONFIG_QIC02_TAPE is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_INTEL_RNG is not set
+# CONFIG_NVRAM is not set
+# CONFIG_RTC is not set
+CONFIG_SA1100_RTC=m
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_FTAPE is not set
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+
+#
+# PCMCIA character devices
+#
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# File systems
+#
+# CONFIG_QUOTA is not set
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_AUTOFS4_FS is not set
+# CONFIG_REISERFS_FS is not set
+# CONFIG_REISERFS_CHECK is not set
+# CONFIG_ADFS_FS is not set
+# CONFIG_ADFS_FS_RW is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_BFS_FS is not set
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
+# CONFIG_UMSDOS_FS is not set
+CONFIG_VFAT_FS=m
+# CONFIG_EFS_FS is not set
+CONFIG_JFFS_FS=m
+CONFIG_JFFS_FS_VERBOSE=2
+CONFIG_JFFS2_FS=m
+CONFIG_JFFS2_FS_DEBUG=0
+CONFIG_CRAMFS=m
+# CONFIG_TMPFS is not set
+CONFIG_RAMFS=y
+# CONFIG_ISO9660_FS is not set
+# CONFIG_JOLIET is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_VXFS_FS is not set
+# CONFIG_NTFS_FS is not set
+# CONFIG_NTFS_RW is not set
+# CONFIG_HPFS_FS is not set
+CONFIG_PROC_FS=y
+# CONFIG_DEVFS_FS is not set
+# CONFIG_DEVFS_MOUNT is not set
+# CONFIG_DEVFS_DEBUG is not set
+CONFIG_DEVPTS_FS=y
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_QNX4FS_RW is not set
+# CONFIG_ROMFS_FS is not set
+CONFIG_EXT2_FS=y
+# CONFIG_SYSV_FS is not set
+# CONFIG_UDF_FS is not set
+# CONFIG_UDF_RW is not set
+# CONFIG_UFS_FS is not set
+# CONFIG_UFS_FS_WRITE is not set
+
+#
+# Network File Systems
+#
+# CONFIG_CODA_FS is not set
+CONFIG_NFS_FS=y
+# CONFIG_NFS_V3 is not set
+# CONFIG_ROOT_NFS is not set
+CONFIG_NFSD=m
+# CONFIG_NFSD_V3 is not set
+CONFIG_SUNRPC=y
+CONFIG_LOCKD=y
+CONFIG_SMB_FS=m
+# CONFIG_SMB_NLS_DEFAULT is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_NCPFS_PACKET_SIGNING is not set
+# CONFIG_NCPFS_IOCTL_LOCKING is not set
+# CONFIG_NCPFS_STRONG is not set
+# CONFIG_NCPFS_NFS_NS is not set
+# CONFIG_NCPFS_OS2_NS is not set
+# CONFIG_NCPFS_SMALLDOS is not set
+# CONFIG_NCPFS_NLS is not set
+# CONFIG_NCPFS_EXTRAS is not set
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+CONFIG_SMB_NLS=y
+CONFIG_NLS=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS_DEFAULT="iso8859-1"
+# CONFIG_NLS_CODEPAGE_437 is not set
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+# CONFIG_NLS_CODEPAGE_850 is not set
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
+# CONFIG_NLS_ISO8859_1 is not set
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+# CONFIG_NLS_ISO8859_15 is not set
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+# CONFIG_NLS_UTF8 is not set
+
+#
+# Console drivers
+#
+CONFIG_PC_KEYMAP=y
+# CONFIG_VGA_CONSOLE is not set
+
+#
+# Frame-buffer support
+#
+CONFIG_FB=y
+CONFIG_DUMMY_CONSOLE=y
+# CONFIG_FB_ACORN is not set
+# CONFIG_FB_CLPS711X is not set
+# CONFIG_FB_CYBER2000 is not set
+CONFIG_FB_SA1100=y
+# CONFIG_FB_ANAKIN is not set
+# CONFIG_FB_E1355 is not set
+# CONFIG_FB_VIRTUAL is not set
+CONFIG_FBCON_ADVANCED=y
+# CONFIG_FBCON_MFB is not set
+# CONFIG_FBCON_CFB2 is not set
+# CONFIG_FBCON_CFB4 is not set
+# CONFIG_FBCON_CFB8 is not set
+CONFIG_FBCON_CFB16=y
+# CONFIG_FBCON_CFB24 is not set
+# CONFIG_FBCON_CFB32 is not set
+# CONFIG_FBCON_AFB is not set
+# CONFIG_FBCON_ILBM is not set
+# CONFIG_FBCON_IPLAN2P2 is not set
+# CONFIG_FBCON_IPLAN2P4 is not set
+# CONFIG_FBCON_IPLAN2P8 is not set
+# CONFIG_FBCON_MAC is not set
+# CONFIG_FBCON_VGA_PLANES is not set
+# CONFIG_FBCON_VGA is not set
+# CONFIG_FBCON_HGA is not set
+CONFIG_FBCON_FONTWIDTH8_ONLY=y
+CONFIG_FBCON_FONTS=y
+CONFIG_FONT_8x8=y
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+
+#
+# Sound
+#
+CONFIG_SOUND=y
+# CONFIG_SOUND_ASSABET_UDA1341 is not set
+CONFIG_SOUND_BITSY_UDA1341=m
+# CONFIG_SOUND_SA1111_UDA1341 is not set
+# CONFIG_SOUND_SA1100SSP is not set
+# CONFIG_SOUND_CMPCI is not set
+# CONFIG_SOUND_EMU10K1 is not set
+# CONFIG_SOUND_FUSION is not set
+# CONFIG_SOUND_CS4281 is not set
+# CONFIG_SOUND_ES1370 is not set
+# CONFIG_SOUND_ES1371 is not set
+# CONFIG_SOUND_ESSSOLO1 is not set
+# CONFIG_SOUND_MAESTRO is not set
+# CONFIG_SOUND_MAESTRO3 is not set
+# CONFIG_SOUND_ICH is not set
+# CONFIG_SOUND_SONICVIBES is not set
+# CONFIG_SOUND_TRIDENT is not set
+# CONFIG_SOUND_MSNDCLAS is not set
+# CONFIG_SOUND_MSNDPIN is not set
+# CONFIG_SOUND_VIA82CXXX is not set
+# CONFIG_MIDI_VIA82CXXX is not set
+# CONFIG_SOUND_OSS is not set
+# CONFIG_SOUND_TVMIXER is not set
+
+#
+# USB support
+#
+# CONFIG_USB is not set
+
+#
+# Bluetooth support
+#
+# CONFIG_BLUEZ is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_NO_FRAME_POINTER is not set
+CONFIG_DEBUG_ERRORS=y
+# CONFIG_DEBUG_USER is not set
+# CONFIG_DEBUG_INFO is not set
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_NO_PGT_CACHE is not set
+# CONFIG_DEBUG_LL is not set
+# CONFIG_DEBUG_DC21285_PORT is not set
+# CONFIG_DEBUG_CLPS711X_UART2 is not set
diff -u --recursive --new-file v2.4.8/linux/arch/arm/def-configs/brutus linux/arch/arm/def-configs/brutus
--- v2.4.8/linux/arch/arm/def-configs/brutus	Mon Nov 27 17:07:59 2000
+++ linux/arch/arm/def-configs/brutus	Sun Aug 12 11:13:59 2001
@@ -80,7 +80,7 @@
 CONFIG_LEDS=y
 CONFIG_LEDS_TIMER=y
 CONFIG_LEDS_CPU=y
-# CONFIG_ALIGNMENT_TRAP is not set
+CONFIG_ALIGNMENT_TRAP=y
 
 #
 # Parallel port support
diff -u --recursive --new-file v2.4.8/linux/arch/arm/def-configs/ebsa110 linux/arch/arm/def-configs/ebsa110
--- v2.4.8/linux/arch/arm/def-configs/ebsa110	Wed May 16 10:31:27 2001
+++ linux/arch/arm/def-configs/ebsa110	Sun Aug 12 11:13:59 2001
@@ -6,6 +6,8 @@
 # CONFIG_SBUS is not set
 # CONFIG_MCA is not set
 CONFIG_UID16=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
 
 #
 # Code maturity level options
@@ -27,27 +29,62 @@
 # CONFIG_ARCH_CLPS7500 is not set
 # CONFIG_ARCH_CO285 is not set
 CONFIG_ARCH_EBSA110=y
+# CONFIG_ARCH_L7200 is not set
 # CONFIG_ARCH_FOOTBRIDGE is not set
 # CONFIG_ARCH_INTEGRATOR is not set
 # CONFIG_ARCH_RPC is not set
 # CONFIG_ARCH_SA1100 is not set
 # CONFIG_ARCH_CLPS711X is not set
+# CONFIG_ARCH_ANAKIN is not set
 
 #
 # Archimedes/A5000 Implementations
 #
 
 #
+# Archimedes/A5000 Implementations (select only ONE)
+#
+# CONFIG_ARCH_ARC is not set
+# CONFIG_ARCH_A5K is not set
+
+#
 # Footbridge Implementations
 #
+# CONFIG_ARCH_CATS is not set
+# CONFIG_ARCH_PERSONAL_SERVER is not set
+# CONFIG_ARCH_EBSA285_ADDIN is not set
+# CONFIG_ARCH_EBSA285_HOST is not set
+# CONFIG_ARCH_NETWINDER is not set
 
 #
 # SA11x0 Implementations
 #
+# CONFIG_SA1100_ASSABET is not set
+# CONFIG_ASSABET_NEPONSET is not set
+# CONFIG_SA1100_BRUTUS is not set
+# CONFIG_SA1100_CERF is not set
+# CONFIG_SA1100_BITSY is not set
+# CONFIG_SA1100_EXTENEX1 is not set
+# CONFIG_SA1100_FREEBIRD is not set
+# CONFIG_SA1100_GRAPHICSCLIENT is not set
+# CONFIG_SA1100_JORNADA720 is not set
+# CONFIG_SA1100_HUW_WEBPANEL is not set
+# CONFIG_SA1100_ITSY is not set
+# CONFIG_SA1100_LART is not set
+# CONFIG_SA1100_NANOENGINE is not set
+# CONFIG_SA1100_OMNIMETER is not set
+# CONFIG_SA1100_PANGOLIN is not set
+# CONFIG_SA1100_PLEB is not set
+# CONFIG_SA1100_SHERMAN is not set
+# CONFIG_SA1100_PFS168 is not set
+# CONFIG_SA1100_VICTOR is not set
+# CONFIG_SA1100_XP860 is not set
+# CONFIG_SA1100_YOPY is not set
 
 #
 # CLPS711X/EP721X Implementations
 #
+# CONFIG_ARCH_P720T is not set
 # CONFIG_ARCH_ACORN is not set
 # CONFIG_FOOTBRIDGE is not set
 # CONFIG_FOOTBRIDGE_HOST is not set
@@ -58,24 +95,39 @@
 #
 # Processor Type
 #
+# CONFIG_CPU_32v3 is not set
 CONFIG_CPU_32v4=y
+# CONFIG_CPU_ARM610 is not set
+# CONFIG_CPU_ARM710 is not set
+# CONFIG_CPU_ARM720T is not set
+# CONFIG_CPU_ARM920T is not set
+# CONFIG_CPU_ARM1020 is not set
 CONFIG_CPU_SA110=y
+# CONFIG_CPU_SA1100 is not set
 # CONFIG_DISCONTIGMEM is not set
 
 #
 # General setup
 #
-# CONFIG_ANGELBOOT is not set
 # CONFIG_PCI is not set
-# CONFIG_ISA is not set
+CONFIG_ISA=y
 # CONFIG_ISA_DMA is not set
-# CONFIG_HOTPLUG is not set
-# CONFIG_PCMCIA is not set
+CONFIG_HOTPLUG=y
+
+#
+# PCMCIA/CardBus support
+#
+CONFIG_PCMCIA=m
+CONFIG_I82365=y
+# CONFIG_TCIC is not set
+# CONFIG_PCMCIA_CLPS6700 is not set
+# CONFIG_PCMCIA_SA1100 is not set
 CONFIG_NET=y
 CONFIG_SYSVIPC=y
 CONFIG_BSD_PROCESS_ACCT=y
 CONFIG_SYSCTL=y
-# CONFIG_NWFPE is not set
+CONFIG_FPE_NWFPE=y
+CONFIG_FPE_FASTFPE=y
 CONFIG_KCORE_ELF=y
 # CONFIG_KCORE_AOUT is not set
 CONFIG_BINFMT_AOUT=y
@@ -94,6 +146,7 @@
 CONFIG_PARPORT_PC=y
 CONFIG_PARPORT_PC_FIFO=y
 # CONFIG_PARPORT_PC_SUPERIO is not set
+# CONFIG_PARPORT_PC_PCMCIA is not set
 # CONFIG_PARPORT_ARC is not set
 # CONFIG_PARPORT_AMIGA is not set
 # CONFIG_PARPORT_MFC3 is not set
@@ -103,11 +156,6 @@
 CONFIG_PARPORT_1284=y
 
 #
-# Memory Technology Devices (MTD)
-#
-# CONFIG_MTD is not set
-
-#
 # Plug and Play configuration
 #
 # CONFIG_PNP is not set
@@ -129,10 +177,21 @@
 # CONFIG_BLK_DEV_INITRD is not set
 
 #
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+# CONFIG_BLK_DEV_MD is not set
+# CONFIG_MD_LINEAR is not set
+# CONFIG_MD_RAID0 is not set
+# CONFIG_MD_RAID1 is not set
+# CONFIG_MD_RAID5 is not set
+# CONFIG_BLK_DEV_LVM is not set
+
+#
 # Networking options
 #
-CONFIG_PACKET=m
-# CONFIG_PACKET_MMAP is not set
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
 CONFIG_NETLINK=y
 CONFIG_RTNETLINK=y
 # CONFIG_NETLINK_DEV is not set
@@ -153,55 +212,58 @@
 CONFIG_IP_ROUTE_VERBOSE=y
 # CONFIG_IP_ROUTE_LARGE_TABLES is not set
 CONFIG_IP_PNP=y
+# CONFIG_IP_PNP_DHCP is not set
 CONFIG_IP_PNP_BOOTP=y
 # CONFIG_IP_PNP_RARP is not set
 # CONFIG_NET_IPIP is not set
 # CONFIG_NET_IPGRE is not set
 # CONFIG_IP_MROUTE is not set
 # CONFIG_ARPD is not set
-# CONFIG_INET_ECN is not set
+CONFIG_INET_ECN=y
 CONFIG_SYN_COOKIES=y
 
 #
 #   IP: Netfilter Configuration
 #
-CONFIG_IP_NF_CONNTRACK=m
-CONFIG_IP_NF_FTP=m
+CONFIG_IP_NF_CONNTRACK=y
+CONFIG_IP_NF_FTP=y
+CONFIG_IP_NF_IRC=y
 # CONFIG_IP_NF_QUEUE is not set
-CONFIG_IP_NF_IPTABLES=m
-CONFIG_IP_NF_MATCH_LIMIT=m
+CONFIG_IP_NF_IPTABLES=y
+CONFIG_IP_NF_MATCH_LIMIT=y
 # CONFIG_IP_NF_MATCH_MAC is not set
-CONFIG_IP_NF_MATCH_MARK=m
-CONFIG_IP_NF_MATCH_MULTIPORT=m
-CONFIG_IP_NF_MATCH_TOS=m
-CONFIG_IP_NF_MATCH_STATE=m
-CONFIG_IP_NF_MATCH_UNCLEAN=m
+CONFIG_IP_NF_MATCH_MARK=y
+CONFIG_IP_NF_MATCH_MULTIPORT=y
+CONFIG_IP_NF_MATCH_TOS=y
+# CONFIG_IP_NF_MATCH_TCPMSS is not set
+CONFIG_IP_NF_MATCH_STATE=y
+CONFIG_IP_NF_MATCH_UNCLEAN=y
 # CONFIG_IP_NF_MATCH_OWNER is not set
-CONFIG_IP_NF_FILTER=m
-CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_FILTER=y
+CONFIG_IP_NF_TARGET_REJECT=y
 # CONFIG_IP_NF_TARGET_MIRROR is not set
-CONFIG_IP_NF_NAT=m
-CONFIG_IP_NF_NAT_NEEDED=y
-CONFIG_IP_NF_TARGET_MASQUERADE=m
-CONFIG_IP_NF_TARGET_REDIRECT=m
-CONFIG_IP_NF_MANGLE=m
-CONFIG_IP_NF_TARGET_TOS=m
-CONFIG_IP_NF_TARGET_MARK=m
-CONFIG_IP_NF_TARGET_LOG=m
-CONFIG_IP_NF_COMPAT_IPCHAINS=m
+CONFIG_IP_NF_NAT=y
 CONFIG_IP_NF_NAT_NEEDED=y
-# CONFIG_IP_NF_COMPAT_IPFWADM is not set
-CONFIG_IPV6=m
+CONFIG_IP_NF_TARGET_MASQUERADE=y
+CONFIG_IP_NF_TARGET_REDIRECT=y
+CONFIG_IP_NF_NAT_IRC=y
+CONFIG_IP_NF_NAT_FTP=y
+CONFIG_IP_NF_MANGLE=y
+CONFIG_IP_NF_TARGET_TOS=y
+CONFIG_IP_NF_TARGET_MARK=y
+CONFIG_IP_NF_TARGET_LOG=y
+# CONFIG_IP_NF_TARGET_TCPMSS is not set
+CONFIG_IPV6=y
 
 #
 #   IPv6: Netfilter Configuration
 #
-CONFIG_IP6_NF_IPTABLES=m
-CONFIG_IP6_NF_MATCH_LIMIT=m
-CONFIG_IP6_NF_MATCH_MARK=m
-CONFIG_IP6_NF_FILTER=m
-CONFIG_IP6_NF_MANGLE=m
-CONFIG_IP6_NF_TARGET_MARK=m
+CONFIG_IP6_NF_IPTABLES=y
+CONFIG_IP6_NF_MATCH_LIMIT=y
+CONFIG_IP6_NF_MATCH_MARK=y
+CONFIG_IP6_NF_FILTER=y
+CONFIG_IP6_NF_MANGLE=y
+CONFIG_IP6_NF_TARGET_MARK=y
 # CONFIG_KHTTPD is not set
 # CONFIG_ATM is not set
 
@@ -253,6 +315,7 @@
 # CONFIG_NET_VENDOR_RACAL is not set
 # CONFIG_AT1700 is not set
 # CONFIG_DEPCA is not set
+# CONFIG_HP100 is not set
 # CONFIG_NET_ISA is not set
 # CONFIG_NET_PCI is not set
 # CONFIG_NET_POCKET is not set
@@ -267,9 +330,10 @@
 # CONFIG_FDDI is not set
 # CONFIG_HIPPI is not set
 # CONFIG_PLIP is not set
-CONFIG_PPP=y
+CONFIG_PPP=m
 # CONFIG_PPP_MULTILINK is not set
-CONFIG_PPP_ASYNC=y
+# CONFIG_PPP_FILTER is not set
+CONFIG_PPP_ASYNC=m
 # CONFIG_PPP_SYNC_TTY is not set
 CONFIG_PPP_DEFLATE=m
 CONFIG_PPP_BSDCOMP=m
@@ -295,6 +359,21 @@
 # CONFIG_WAN is not set
 
 #
+# PCMCIA network device support
+#
+CONFIG_NET_PCMCIA=y
+# CONFIG_PCMCIA_3C589 is not set
+# CONFIG_PCMCIA_3C574 is not set
+# CONFIG_PCMCIA_FMVJ18X is not set
+CONFIG_PCMCIA_PCNET=m
+# CONFIG_PCMCIA_NMCLAN is not set
+# CONFIG_PCMCIA_SMC91C92 is not set
+# CONFIG_PCMCIA_XIRC2PS is not set
+# CONFIG_ARCNET_COM20020_CS is not set
+# CONFIG_PCMCIA_IBMTR is not set
+# CONFIG_NET_PCMCIA_RADIO is not set
+
+#
 # Amateur Radio support
 #
 # CONFIG_HAMRADIO is not set
@@ -348,6 +427,15 @@
 # CONFIG_SERIAL_MULTIPORT is not set
 # CONFIG_HUB6 is not set
 # CONFIG_SERIAL_NONSTANDARD is not set
+# CONFIG_SERIAL_21285 is not set
+# CONFIG_SERIAL_21285_OLD is not set
+# CONFIG_SERIAL_21285_CONSOLE is not set
+# CONFIG_SERIAL_SA1100 is not set
+# CONFIG_SERIAL_SA1100_CONSOLE is not set
+# CONFIG_SERIAL_AMBA is not set
+# CONFIG_SERIAL_AMBA_CONSOLE is not set
+# CONFIG_SERIAL_CLPS711X is not set
+# CONFIG_SERIAL_CLPS711X_CONSOLE is not set
 CONFIG_UNIX98_PTYS=y
 CONFIG_UNIX98_PTY_COUNT=256
 CONFIG_PRINTER=m
@@ -385,9 +473,11 @@
 # CONFIG_WDTPCI is not set
 # CONFIG_PCWATCHDOG is not set
 # CONFIG_ACQUIRE_WDT is not set
+# CONFIG_ADVANTECH_WDT is not set
 # CONFIG_60XX_WDT is not set
 # CONFIG_MIXCOMWD is not set
 # CONFIG_I810_TCO is not set
+# CONFIG_MACHZ_WDT is not set
 # CONFIG_INTEL_RNG is not set
 # CONFIG_NVRAM is not set
 # CONFIG_RTC is not set
@@ -403,6 +493,11 @@
 # CONFIG_DRM is not set
 
 #
+# PCMCIA character devices
+#
+# CONFIG_PCMCIA_SERIAL_CS is not set
+
+#
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
@@ -413,6 +508,8 @@
 # CONFIG_QUOTA is not set
 # CONFIG_AUTOFS_FS is not set
 CONFIG_AUTOFS4_FS=y
+# CONFIG_REISERFS_FS is not set
+# CONFIG_REISERFS_CHECK is not set
 # CONFIG_ADFS_FS is not set
 # CONFIG_ADFS_FS_RW is not set
 # CONFIG_AFFS_FS is not set
@@ -424,11 +521,14 @@
 # CONFIG_VFAT_FS is not set
 # CONFIG_EFS_FS is not set
 # CONFIG_JFFS_FS is not set
+# CONFIG_JFFS2_FS is not set
 # CONFIG_CRAMFS is not set
+# CONFIG_TMPFS is not set
 # CONFIG_RAMFS is not set
 # CONFIG_ISO9660_FS is not set
 # CONFIG_JOLIET is not set
-CONFIG_MINIX_FS=m
+CONFIG_MINIX_FS=y
+# CONFIG_VXFS_FS is not set
 # CONFIG_NTFS_FS is not set
 # CONFIG_NTFS_RW is not set
 # CONFIG_HPFS_FS is not set
@@ -436,7 +536,7 @@
 # CONFIG_DEVFS_FS is not set
 # CONFIG_DEVFS_MOUNT is not set
 # CONFIG_DEVFS_DEBUG is not set
-# CONFIG_DEVPTS_FS is not set
+CONFIG_DEVPTS_FS=y
 # CONFIG_QNX4FS_FS is not set
 # CONFIG_QNX4FS_RW is not set
 # CONFIG_ROMFS_FS is not set
@@ -467,8 +567,6 @@
 # CONFIG_NCPFS_NFS_NS is not set
 # CONFIG_NCPFS_OS2_NS is not set
 # CONFIG_NCPFS_SMALLDOS is not set
-# CONFIG_NCPFS_MOUNT_SUBDIR is not set
-# CONFIG_NCPFS_NDS_DOMAINS is not set
 # CONFIG_NCPFS_NLS is not set
 # CONFIG_NCPFS_EXTRAS is not set
 
@@ -485,6 +583,7 @@
 # CONFIG_SGI_PARTITION is not set
 # CONFIG_ULTRIX_PARTITION is not set
 # CONFIG_SUN_PARTITION is not set
+# CONFIG_SMB_NLS is not set
 # CONFIG_NLS is not set
 
 #
@@ -495,9 +594,12 @@
 #
 # Kernel hacking
 #
-CONFIG_FRAME_POINTER=y
+# CONFIG_NO_FRAME_POINTER is not set
 CONFIG_DEBUG_ERRORS=y
 # CONFIG_DEBUG_USER is not set
 # CONFIG_DEBUG_INFO is not set
-# CONFIG_MAGIC_SYSRQ is not set
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_NO_PGT_CACHE is not set
 # CONFIG_DEBUG_LL is not set
+# CONFIG_DEBUG_DC21285_PORT is not set
+# CONFIG_DEBUG_CLPS711X_UART2 is not set
diff -u --recursive --new-file v2.4.8/linux/arch/arm/def-configs/flexanet linux/arch/arm/def-configs/flexanet
--- v2.4.8/linux/arch/arm/def-configs/flexanet	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/def-configs/flexanet	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,691 @@
+#
+# Automatically generated make config: don't edit
+#
+CONFIG_ARM=y
+# CONFIG_EISA is not set
+# CONFIG_SBUS is not set
+# CONFIG_MCA is not set
+CONFIG_UID16=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+# CONFIG_OBSOLETE is not set
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_KMOD is not set
+
+#
+# System Type
+#
+# CONFIG_ARCH_ARCA5K is not set
+# CONFIG_ARCH_CLPS7500 is not set
+# CONFIG_ARCH_CO285 is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_L7200 is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_RPC is not set
+CONFIG_ARCH_SA1100=y
+# CONFIG_ARCH_CLPS711X is not set
+# CONFIG_ARCH_ANAKIN is not set
+
+#
+# Archimedes/A5000 Implementations
+#
+
+#
+# Archimedes/A5000 Implementations (select only ONE)
+#
+
+#
+# Footbridge Implementations
+#
+
+#
+# SA11x0 Implementations
+#
+# CONFIG_SA1100_ASSABET is not set
+# CONFIG_SA1100_BRUTUS is not set
+# CONFIG_SA1100_CERF is not set
+# CONFIG_SA1100_BITSY is not set
+# CONFIG_SA1100_EXTENEX1 is not set
+CONFIG_SA1100_FLEXANET=y
+# CONFIG_SA1100_FREEBIRD is not set
+# CONFIG_SA1100_GRAPHICSCLIENT is not set
+# CONFIG_SA1100_JORNADA720 is not set
+# CONFIG_SA1100_HUW_WEBPANEL is not set
+# CONFIG_SA1100_ITSY is not set
+# CONFIG_SA1100_LART is not set
+# CONFIG_SA1100_NANOENGINE is not set
+# CONFIG_SA1100_OMNIMETER is not set
+# CONFIG_SA1100_PANGOLIN is not set
+# CONFIG_SA1100_PLEB is not set
+# CONFIG_SA1100_SHERMAN is not set
+# CONFIG_SA1100_PFS168 is not set
+# CONFIG_SA1100_VICTOR is not set
+# CONFIG_SA1100_XP860 is not set
+# CONFIG_SA1100_YOPY is not set
+CONFIG_SA1100_USB=y
+CONFIG_SA1100_USB_NETLINK=y
+# CONFIG_SA1100_USB_CHAR is not set
+# CONFIG_SA1100_FREQUENCY_SCALE is not set
+
+#
+# CLPS711X/EP721X Implementations
+#
+# CONFIG_ARCH_ACORN is not set
+# CONFIG_FOOTBRIDGE is not set
+# CONFIG_FOOTBRIDGE_HOST is not set
+# CONFIG_FOOTBRIDGE_ADDIN is not set
+CONFIG_CPU_32=y
+# CONFIG_CPU_26 is not set
+
+#
+# Processor Type
+#
+# CONFIG_CPU_32v3 is not set
+CONFIG_CPU_32v4=y
+# CONFIG_CPU_ARM610 is not set
+# CONFIG_CPU_ARM710 is not set
+# CONFIG_CPU_ARM720T is not set
+# CONFIG_CPU_ARM920T is not set
+# CONFIG_CPU_ARM1020 is not set
+# CONFIG_CPU_SA110 is not set
+CONFIG_CPU_SA1100=y
+CONFIG_DISCONTIGMEM=y
+# CONFIG_CPU_BIG_ENDIAN is not set
+
+#
+# General setup
+#
+# CONFIG_PCI is not set
+# CONFIG_ISA is not set
+# CONFIG_ISA_DMA is not set
+# CONFIG_CPU_CLOCK is not set
+CONFIG_HOTPLUG=y
+
+#
+# PCMCIA/CardBus support
+#
+CONFIG_PCMCIA=y
+# CONFIG_I82365 is not set
+# CONFIG_TCIC is not set
+CONFIG_PCMCIA_SA1100=y
+CONFIG_NET=y
+CONFIG_SYSVIPC=y
+# CONFIG_BSD_PROCESS_ACCT is not set
+CONFIG_SYSCTL=y
+CONFIG_FPE_NWFPE=y
+CONFIG_FPE_FASTFPE=y
+CONFIG_KCORE_ELF=y
+# CONFIG_KCORE_AOUT is not set
+# CONFIG_BINFMT_AOUT is not set
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_MISC is not set
+# CONFIG_PM is not set
+# CONFIG_ARTHUR is not set
+CONFIG_CMDLINE=""
+CONFIG_LEDS=y
+CONFIG_LEDS_TIMER=y
+CONFIG_LEDS_CPU=y
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+CONFIG_MTD_PARTITIONS=y
+# CONFIG_MTD_REDBOOT_PARTS is not set
+# CONFIG_MTD_BOOTLDR_PARTS is not set
+# CONFIG_MTD_AFS_PARTS is not set
+
+#
+# User Modules And Translation Layers
+#
+# CONFIG_MTD_CHAR is not set
+CONFIG_MTD_BLOCK=y
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
+
+#
+# RAM/ROM/Flash chip drivers
+#
+CONFIG_MTD_CFI=y
+# CONFIG_MTD_CFI_VIRTUAL_ER is not set
+CONFIG_MTD_CFI_ADV_OPTIONS=y
+CONFIG_MTD_CFI_NOSWAP=y
+# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
+# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
+# CONFIG_MTD_CFI_LART_BIT_SWAP is not set
+# CONFIG_MTD_CFI_GEOMETRY is not set
+CONFIG_MTD_CFI_INTELEXT=y
+# CONFIG_MTD_CFI_AMDSTD is not set
+# CONFIG_MTD_AMDSTD is not set
+# CONFIG_MTD_SHARP is not set
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_JEDEC is not set
+
+#
+# Mapping drivers for chip access
+#
+# CONFIG_MTD_PHYSMAP is not set
+# CONFIG_MTD_SUN_UFLASH is not set
+# CONFIG_MTD_NORA is not set
+# CONFIG_MTD_PNC2000 is not set
+# CONFIG_MTD_RPXLITE is not set
+# CONFIG_MTD_SC520CDP is not set
+# CONFIG_MTD_NETSC520 is not set
+# CONFIG_MTD_SBC_GXX is not set
+# CONFIG_MTD_ELAN_104NC is not set
+CONFIG_MTD_SA1100=y
+# CONFIG_MTD_IQ80310 is not set
+# CONFIG_MTD_CFI_FLAGADM is not set
+# CONFIG_MTD_ARMFLASH is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_MTDRAM is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOC1000 is not set
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOCPROBE is not set
+
+#
+# NAND Flash Device Drivers
+#
+# CONFIG_MTD_NAND is not set
+
+#
+# Plug and Play configuration
+#
+# CONFIG_PNP is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_FD is not set
+CONFIG_BLK_DEV_LOOP=y
+# CONFIG_BLK_DEV_NBD is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BLK_DEV_INITRD=y
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+
+#
+# Networking options
+#
+# CONFIG_PACKET is not set
+# CONFIG_NETLINK is not set
+# CONFIG_NETFILTER is not set
+# CONFIG_FILTER is not set
+CONFIG_UNIX=y
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_PNP=y
+CONFIG_IP_PNP_DHCP=y
+# CONFIG_IP_PNP_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_INET_ECN is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_IPV6 is not set
+# CONFIG_KHTTPD is not set
+# CONFIG_ATM is not set
+
+#
+#
+#
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_DECNET is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_LLC is not set
+# CONFIG_NET_DIVERT is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+# CONFIG_NET_FASTROUTE is not set
+# CONFIG_NET_HW_FLOWCONTROL is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED is not set
+
+#
+# Network device support
+#
+CONFIG_NETDEVICES=y
+
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+# CONFIG_NET_SB1000 is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+# CONFIG_NET_VENDOR_3COM is not set
+CONFIG_NET_VENDOR_SMC=y
+# CONFIG_WD80x3 is not set
+# CONFIG_ULTRA is not set
+CONFIG_SMC9194=y
+# CONFIG_NET_VENDOR_RACAL is not set
+# CONFIG_AT1700 is not set
+# CONFIG_DEPCA is not set
+# CONFIG_NET_PCI is not set
+# CONFIG_NET_POCKET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+# CONFIG_ACENIC_OMIT_TIGON_I is not set
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI is not set
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Token Ring devices
+#
+# CONFIG_TR is not set
+# CONFIG_NET_FC is not set
+# CONFIG_SHAPER is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+
+#
+# PCMCIA network device support
+#
+CONFIG_NET_PCMCIA=y
+# CONFIG_PCMCIA_3C589 is not set
+# CONFIG_PCMCIA_3C574 is not set
+# CONFIG_PCMCIA_FMVJ18X is not set
+CONFIG_PCMCIA_PCNET=y
+# CONFIG_PCMCIA_NMCLAN is not set
+# CONFIG_PCMCIA_SMC91C92 is not set
+# CONFIG_PCMCIA_XIRC2PS is not set
+# CONFIG_NET_PCMCIA_RADIO is not set
+CONFIG_PCMCIA_NETCARD=y
+
+#
+# Amateur Radio support
+#
+# CONFIG_HAMRADIO is not set
+
+#
+# IrDA (infrared) support
+#
+# CONFIG_IRDA is not set
+
+#
+# ATA/IDE/MFM/RLL support
+#
+CONFIG_IDE=y
+
+#
+# IDE, ATA and ATAPI Block devices
+#
+CONFIG_BLK_DEV_IDE=y
+
+#
+# Please see Documentation/ide.txt for help/info on IDE drives
+#
+# CONFIG_BLK_DEV_HD_IDE is not set
+# CONFIG_BLK_DEV_HD is not set
+CONFIG_BLK_DEV_IDEDISK=y
+# CONFIG_IDEDISK_MULTI_MODE is not set
+# CONFIG_BLK_DEV_IDEDISK_VENDOR is not set
+# CONFIG_BLK_DEV_COMMERIAL is not set
+CONFIG_BLK_DEV_IDECS=y
+# CONFIG_BLK_DEV_IDECD is not set
+# CONFIG_BLK_DEV_IDETAPE is not set
+# CONFIG_BLK_DEV_IDEFLOPPY is not set
+
+#
+# IDE chipset support/bugfixes
+#
+# CONFIG_BLK_DEV_CMD640 is not set
+# CONFIG_IDE_CHIPSETS is not set
+# CONFIG_IDEDMA_AUTO is not set
+# CONFIG_DMA_NONPCI is not set
+# CONFIG_BLK_DEV_IDE_MODES is not set
+
+#
+# SCSI support
+#
+# CONFIG_SCSI is not set
+
+#
+# I2O device support
+#
+# CONFIG_I2O is not set
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Input core support
+#
+# CONFIG_INPUT is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+# CONFIG_VT_CONSOLE is not set
+# CONFIG_SERIAL is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+CONFIG_SERIAL_SA1100=y
+# CONFIG_SERIAL_SA1100_OLD is not set
+CONFIG_SERIAL_SA1100_CONSOLE=y
+CONFIG_SA1100_DEFAULT_BAUDRATE=57600
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_UNIX98_PTY_COUNT=32
+CONFIG_UCB1200=y
+CONFIG_TOUCHSCREEN_UCB1200=y
+CONFIG_AUDIO_UCB1200=y
+CONFIG_ADC_UCB1200=y
+# CONFIG_TOUCHSCREEN_BITSY is not set
+# CONFIG_PROFILER is not set
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# Mice
+#
+# CONFIG_BUSMOUSE is not set
+# CONFIG_MOUSE is not set
+
+#
+# Joysticks
+#
+
+#
+# Game port support
+#
+
+#
+# Gameport joysticks
+#
+
+#
+# Serial port support
+#
+
+#
+# Serial port joysticks
+#
+
+#
+# Parallel port joysticks
+#
+
+#
+#   Parport support is needed for parallel port joysticks
+#
+# CONFIG_QIC02_TAPE is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_NVRAM is not set
+# CONFIG_RTC is not set
+CONFIG_SA1100_RTC=y
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_FTAPE is not set
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+
+#
+# PCMCIA character devices
+#
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# File systems
+#
+# CONFIG_QUOTA is not set
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_AUTOFS4_FS is not set
+# CONFIG_REISERFS_FS is not set
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_FAT_FS is not set
+# CONFIG_EFS_FS is not set
+# CONFIG_JFFS_FS is not set
+# CONFIG_JFFS2_FS is not set
+CONFIG_CRAMFS=y
+# CONFIG_TMPFS is not set
+CONFIG_RAMFS=y
+# CONFIG_ISO9660_FS is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_VXFS_FS is not set
+# CONFIG_NTFS_FS is not set
+# CONFIG_HPFS_FS is not set
+CONFIG_PROC_FS=y
+# CONFIG_DEVFS_FS is not set
+CONFIG_DEVPTS_FS=y
+# CONFIG_QNX4FS_FS is not set
+CONFIG_ROMFS_FS=y
+CONFIG_EXT2_FS=y
+# CONFIG_SYSV_FS is not set
+# CONFIG_UDF_FS is not set
+# CONFIG_UFS_FS is not set
+
+#
+# Network File Systems
+#
+# CONFIG_CODA_FS is not set
+CONFIG_NFS_FS=y
+# CONFIG_NFS_V3 is not set
+CONFIG_ROOT_NFS=y
+# CONFIG_NFSD is not set
+CONFIG_SUNRPC=y
+CONFIG_LOCKD=y
+# CONFIG_SMB_FS is not set
+# CONFIG_NCP_FS is not set
+
+#
+# Partition Types
+#
+CONFIG_PARTITION_ADVANCED=y
+# CONFIG_ACORN_PARTITION is not set
+# CONFIG_OSF_PARTITION is not set
+# CONFIG_AMIGA_PARTITION is not set
+# CONFIG_ATARI_PARTITION is not set
+# CONFIG_MAC_PARTITION is not set
+CONFIG_MSDOS_PARTITION=y
+# CONFIG_BSD_DISKLABEL is not set
+# CONFIG_MINIX_SUBPARTITION is not set
+# CONFIG_SOLARIS_X86_PARTITION is not set
+# CONFIG_UNIXWARE_DISKLABEL is not set
+# CONFIG_SGI_PARTITION is not set
+# CONFIG_ULTRIX_PARTITION is not set
+# CONFIG_SUN_PARTITION is not set
+# CONFIG_SMB_NLS is not set
+# CONFIG_NLS is not set
+
+#
+# Console drivers
+#
+CONFIG_PC_KEYMAP=y
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_FB=y
+
+#
+# Frame-buffer support
+#
+CONFIG_FB=y
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FB_SA1100=y
+# CONFIG_FB_E1355 is not set
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FBCON_ADVANCED is not set
+CONFIG_FBCON_CFB2=y
+CONFIG_FBCON_CFB4=y
+CONFIG_FBCON_CFB8=y
+CONFIG_FBCON_CFB16=y
+# CONFIG_FBCON_FONTWIDTH8_ONLY is not set
+# CONFIG_FBCON_FONTS is not set
+CONFIG_FONT_8x8=y
+CONFIG_FONT_8x16=y
+
+#
+# Sound
+#
+CONFIG_SOUND=y
+# CONFIG_SOUND_SA1100_SSP is not set
+# CONFIG_SOUND_FUSION is not set
+# CONFIG_SOUND_CS4281 is not set
+# CONFIG_SOUND_ESSSOLO1 is not set
+# CONFIG_SOUND_MAESTRO is not set
+# CONFIG_SOUND_SONICVIBES is not set
+# CONFIG_SOUND_TRIDENT is not set
+# CONFIG_SOUND_MSNDCLAS is not set
+# CONFIG_SOUND_MSNDPIN is not set
+# CONFIG_SOUND_OSS is not set
+
+#
+# USB support
+#
+CONFIG_USB=y
+CONFIG_USB_DEBUG=y
+
+#
+# Miscellaneous USB options
+#
+# CONFIG_USB_DEVICEFS is not set
+# CONFIG_USB_BANDWIDTH is not set
+
+#
+# USB Controllers
+#
+# CONFIG_USB_UHCI is not set
+# CONFIG_USB_UHCI_ALT is not set
+# CONFIG_USB_OHCI is not set
+
+#
+# USB Device Class drivers
+#
+# CONFIG_USB_AUDIO is not set
+# CONFIG_USB_BLUETOOTH is not set
+# CONFIG_USB_STORAGE_DEBUG is not set
+# CONFIG_USB_STORAGE_FREECOM is not set
+# CONFIG_USB_STORAGE_DPCM is not set
+# CONFIG_USB_ACM is not set
+# CONFIG_USB_PRINTER is not set
+
+#
+# USB Human Interface Devices (HID)
+#
+
+#
+#   Input core support is needed for USB HID
+#
+
+#
+# USB Imaging devices
+#
+# CONFIG_USB_DC2XX is not set
+# CONFIG_USB_MDC800 is not set
+# CONFIG_USB_SCANNER is not set
+
+#
+# USB Multimedia devices
+#
+# CONFIG_USB_DABUSB is not set
+
+#
+# USB Network adaptors
+#
+# CONFIG_USB_PLUSB is not set
+# CONFIG_USB_PEGASUS is not set
+# CONFIG_USB_NET1080 is not set
+# CONFIG_USB_USBNET is not set
+
+#
+# USB port drivers
+#
+
+#
+# USB Serial Converter support
+#
+# CONFIG_USB_SERIAL is not set
+
+#
+# USB misc drivers
+#
+# CONFIG_USB_RIO500 is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_NO_FRAME_POINTER is not set
+CONFIG_DEBUG_ERRORS=y
+CONFIG_DEBUG_USER=y
+# CONFIG_DEBUG_INFO is not set
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_DEBUG_LL is not set
diff -u --recursive --new-file v2.4.8/linux/arch/arm/def-configs/freebird linux/arch/arm/def-configs/freebird
--- v2.4.8/linux/arch/arm/def-configs/freebird	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/def-configs/freebird	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,625 @@
+#
+# Automatically generated by make menuconfig: don't edit
+#
+CONFIG_ARM=y
+# CONFIG_EISA is not set
+# CONFIG_SBUS is not set
+# CONFIG_MCA is not set
+CONFIG_UID16=y
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+# CONFIG_OBSOLETE is not set
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_KMOD is not set
+
+#
+# System Type
+#
+# CONFIG_ARCH_ARCA5K is not set
+# CONFIG_ARCH_CLPS7500 is not set
+# CONFIG_ARCH_CO285 is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_L7200 is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_RPC is not set
+CONFIG_ARCH_SA1100=y
+# CONFIG_ARCH_CLPS711X is not set
+
+#
+# Archimedes/A5000 Implementations
+#
+# CONFIG_ARCH_ARC is not set
+# CONFIG_ARCH_A5K is not set
+
+#
+# Footbridge Implementations
+#
+# CONFIG_ARCH_CATS is not set
+# CONFIG_ARCH_PERSONAL_SERVER is not set
+# CONFIG_ARCH_EBSA285_ADDIN is not set
+# CONFIG_ARCH_EBSA285_HOST is not set
+# CONFIG_ARCH_NETWINDER is not set
+
+#
+# SA11x0 Implementations
+#
+# CONFIG_SA1100_ASSABET is not set
+# CONFIG_ASSABET_NEPONSET is not set
+# CONFIG_SA1100_BRUTUS is not set
+# CONFIG_SA1100_CERF is not set
+# CONFIG_SA1100_BITSY is not set
+# CONFIG_SA1100_EXTENEX1 is not set
+CONFIG_SA1100_FREEBIRD=y
+# CONFIG_SA1100_GRAPHICSCLIENT is not set
+# CONFIG_SA1100_HUW_WEBPANEL is not set
+# CONFIG_SA1100_LART is not set
+# CONFIG_SA1100_PLEB is not set
+# CONFIG_SA1100_NANOENGINE is not set
+# CONFIG_SA1100_PANGOLIN is not set
+# CONFIG_SA1100_SHERMAN is not set
+# CONFIG_SA1100_VICTOR is not set
+# CONFIG_SA1100_XP860 is not set
+# CONFIG_SA1100_YOPY is not set
+# CONFIG_SA1100_PFS168 is not set
+CONFIG_SA1100_FREEBIRD_OLD=y
+# CONFIG_SA1100_FREEBIRD_NEW is not set
+CONFIG_SA1100_FL=y
+CONFIG_SA1100_USB=m
+CONFIG_SA1100_USB_NETLINK=m
+CONFIG_SA1100_USB_CHAR=m
+# CONFIG_SA1100_FREQUENCY_SCALE is not set
+# CONFIG_SA1100_VOLTAGE_SCALE is not set
+
+#
+# CLPS711X/EP721X Implementations
+#
+# CONFIG_ARCH_P720T is not set
+# CONFIG_ARCH_ACORN is not set
+# CONFIG_FOOTBRIDGE is not set
+# CONFIG_FOOTBRIDGE_HOST is not set
+# CONFIG_FOOTBRIDGE_ADDIN is not set
+CONFIG_CPU_32=y
+# CONFIG_CPU_26 is not set
+# CONFIG_CPU_32v3 is not set
+CONFIG_CPU_32v4=y
+# CONFIG_CPU_ARM610 is not set
+# CONFIG_CPU_ARM710 is not set
+# CONFIG_CPU_ARM720T is not set
+# CONFIG_CPU_ARM920T is not set
+# CONFIG_CPU_ARM1020 is not set
+# CONFIG_CPU_SA110 is not set
+CONFIG_CPU_SA1100=y
+CONFIG_DISCONTIGMEM=y
+
+#
+# General setup
+#
+# CONFIG_ANGELBOOT is not set
+# CONFIG_PCI is not set
+# CONFIG_ISA is not set
+# CONFIG_ISA_DMA is not set
+CONFIG_HOTPLUG=y
+
+#
+# PCMCIA/CardBus support
+#
+CONFIG_PCMCIA=y
+# CONFIG_I82365 is not set
+# CONFIG_TCIC is not set
+# CONFIG_PCMCIA_CLPS6700 is not set
+CONFIG_PCMCIA_SA1100=y
+CONFIG_NET=y
+CONFIG_SYSVIPC=y
+# CONFIG_BSD_PROCESS_ACCT is not set
+CONFIG_SYSCTL=y
+# CONFIG_FPE_NWFPE is not set
+# CONFIG_FPE_FASTFPE is not set
+CONFIG_KCORE_ELF=y
+# CONFIG_KCORE_AOUT is not set
+CONFIG_BINFMT_AOUT=m
+CONFIG_BINFMT_ELF=y
+CONFIG_BINFMT_MISC=m
+CONFIG_PM=y
+CONFIG_APM=y
+# CONFIG_ARTHUR is not set
+CONFIG_CMDLINE="mem=32M"
+# CONFIG_PFS168_CMDLINE is not set
+# CONFIG_LEDS is not set
+CONFIG_ALIGNMENT_TRAP=y
+# CONFIG_UCB1200 is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+# CONFIG_MTD_DOC1000 is not set
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOCPROBE is not set
+# CONFIG_MTD_PMC551 is not set
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_MTDRAM is not set
+CONFIG_MTD_CFI=y
+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
+CONFIG_MTD_CFI_INTELEXT=y
+# CONFIG_MTD_CFI_AMDSTD is not set
+# CONFIG_MTD_AMDSTD is not set
+# CONFIG_MTD_SHARP is not set
+# CONFIG_MTD_PHYSMAP is not set
+# CONFIG_MTD_NORA is not set
+# CONFIG_MTD_PNC2000 is not set
+# CONFIG_MTD_RPXLITE is not set
+# CONFIG_MTD_SC520CDP is not set
+# CONFIG_MTD_SBC_MEDIAGX is not set
+# CONFIG_MTD_ELAN_104NC is not set
+CONFIG_MTD_SA1100=y
+# CONFIG_MTD_DC21285 is not set
+# CONFIG_MTD_IQ80310 is not set
+# CONFIG_MTD_CSTM_CFI_JEDEC is not set
+# CONFIG_MTD_JEDEC is not set
+# CONFIG_MTD_MIXMEM is not set
+# CONFIG_MTD_OCTAGON is not set
+# CONFIG_MTD_VMAX is not set
+# CONFIG_MTD_NAND is not set
+# CONFIG_MTD_NAND_SPIA is not set
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLOCK=y
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
+
+#
+# Plug and Play configuration
+#
+# CONFIG_PNP is not set
+# CONFIG_ISAPNP is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_DEV_XD is not set
+# CONFIG_PARIDE is not set
+# CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
+# CONFIG_BLK_DEV_DAC960 is not set
+CONFIG_BLK_DEV_LOOP=m
+CONFIG_BLK_DEV_NBD=m
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BLK_DEV_INITRD=y
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+# CONFIG_BLK_DEV_MD is not set
+# CONFIG_MD_LINEAR is not set
+# CONFIG_MD_RAID0 is not set
+# CONFIG_MD_RAID1 is not set
+# CONFIG_MD_RAID5 is not set
+# CONFIG_BLK_DEV_LVM is not set
+
+#
+# Networking options
+#
+# CONFIG_PACKET is not set
+# CONFIG_NETLINK is not set
+# CONFIG_NETFILTER is not set
+# CONFIG_FILTER is not set
+CONFIG_UNIX=y
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# CONFIG_IP_ADVANCED_ROUTER is not set
+# CONFIG_IP_PNP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_INET_ECN is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_IPV6 is not set
+# CONFIG_KHTTPD is not set
+# CONFIG_ATM is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_DECNET is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_LLC is not set
+# CONFIG_NET_DIVERT is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+# CONFIG_NET_FASTROUTE is not set
+# CONFIG_NET_HW_FLOWCONTROL is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED is not set
+
+#
+# Network device support
+#
+CONFIG_NETDEVICES=y
+
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+# CONFIG_NET_SB1000 is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+# CONFIG_NET_ETHERNET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+# CONFIG_ACENIC is not set
+# CONFIG_HAMACHI is not set
+# CONFIG_YELLOWFIN is not set
+# CONFIG_SK98LIN is not set
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI is not set
+CONFIG_PPP=m
+# CONFIG_PPP_MULTILINK is not set
+CONFIG_PPP_ASYNC=m
+# CONFIG_PPP_SYNC_TTY is not set
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+# CONFIG_PPPOE is not set
+# CONFIG_SLIP is not set
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Token Ring devices
+#
+# CONFIG_TR is not set
+# CONFIG_NET_FC is not set
+# CONFIG_RCPCI is not set
+# CONFIG_SHAPER is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+
+#
+# PCMCIA network device support
+#
+CONFIG_NET_PCMCIA=y
+# CONFIG_PCMCIA_3C589 is not set
+# CONFIG_PCMCIA_3C574 is not set
+# CONFIG_PCMCIA_FMVJ18X is not set
+CONFIG_PCMCIA_PCNET=m
+# CONFIG_PCMCIA_NMCLAN is not set
+# CONFIG_PCMCIA_SMC91C92 is not set
+# CONFIG_PCMCIA_XIRC2PS is not set
+# CONFIG_ARCNET_COM20020_CS is not set
+# CONFIG_PCMCIA_IBMTR is not set
+# CONFIG_NET_PCMCIA_RADIO is not set
+
+#
+# Amateur Radio support
+#
+# CONFIG_HAMRADIO is not set
+
+#
+# IrDA (infrared) support
+#
+CONFIG_IRDA=m
+# CONFIG_IRLAN is not set
+# CONFIG_IRNET is not set
+# CONFIG_IRCOMM is not set
+# CONFIG_IRDA_ULTRA is not set
+# CONFIG_IRDA_OPTIONS is not set
+
+#
+# Infrared-port device drivers
+#
+CONFIG_IRTTY_SIR=m
+# CONFIG_IRPORT_SIR is not set
+# CONFIG_NSC_FIR is not set
+# CONFIG_WINBOND_FIR is not set
+# CONFIG_TOSHIBA_FIR is not set
+# CONFIG_SMC_IRCC_FIR is not set
+CONFIG_SA1100_FIR=m
+# CONFIG_DONGLE is not set
+
+#
+# ATA/IDE/MFM/RLL support
+#
+CONFIG_IDE=y
+
+#
+# IDE, ATA and ATAPI Block devices
+#
+CONFIG_BLK_DEV_IDE=y
+# CONFIG_BLK_DEV_HD_IDE is not set
+# CONFIG_BLK_DEV_HD is not set
+CONFIG_BLK_DEV_IDEDISK=m
+# CONFIG_IDEDISK_MULTI_MODE is not set
+# CONFIG_BLK_DEV_IDEDISK_VENDOR is not set
+# CONFIG_BLK_DEV_IDEDISK_FUJITSU is not set
+# CONFIG_BLK_DEV_IDEDISK_IBM is not set
+# CONFIG_BLK_DEV_IDEDISK_MAXTOR is not set
+# CONFIG_BLK_DEV_IDEDISK_QUANTUM is not set
+# CONFIG_BLK_DEV_IDEDISK_SEAGATE is not set
+# CONFIG_BLK_DEV_IDEDISK_WD is not set
+# CONFIG_BLK_DEV_COMMERIAL is not set
+# CONFIG_BLK_DEV_TIVO is not set
+CONFIG_BLK_DEV_IDECS=m
+# CONFIG_BLK_DEV_IDECD is not set
+# CONFIG_BLK_DEV_IDETAPE is not set
+# CONFIG_BLK_DEV_IDEFLOPPY is not set
+# CONFIG_BLK_DEV_IDESCSI is not set
+# CONFIG_BLK_DEV_CMD640 is not set
+# CONFIG_BLK_DEV_CMD640_ENHANCED is not set
+# CONFIG_BLK_DEV_ISAPNP is not set
+# CONFIG_IDE_CHIPSETS is not set
+# CONFIG_IDEDMA_AUTO is not set
+# CONFIG_DMA_NONPCI is not set
+# CONFIG_BLK_DEV_IDE_MODES is not set
+
+#
+# SCSI support
+#
+# CONFIG_SCSI is not set
+
+#
+# I2O device support
+#
+# CONFIG_I2O is not set
+# CONFIG_I2O_BLOCK is not set
+# CONFIG_I2O_LAN is not set
+# CONFIG_I2O_SCSI is not set
+# CONFIG_I2O_PROC is not set
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Input core support
+#
+# CONFIG_INPUT is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+# CONFIG_VT_CONSOLE is not set
+# CONFIG_SERIAL is not set
+# CONFIG_SERIAL_EXTENDED is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+CONFIG_SERIAL_SA1100=y
+CONFIG_SERIAL_SA1100_CONSOLE=y
+CONFIG_SA1100_DEFAULT_BAUDRATE=9600
+# CONFIG_TOUCHSCREEN_UCB1200 is not set
+# CONFIG_TOUCHSCREEN_BITSY is not set
+CONFIG_FB_TS_BT=y
+# CONFIG_PROFILER is not set
+# CONFIG_PFS168_SPI is not set
+# CONFIG_PFS168_DTMF is not set
+# CONFIG_PFS168_MISC is not set
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_UNIX98_PTY_COUNT=32
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# Mice
+#
+# CONFIG_BUSMOUSE is not set
+# CONFIG_MOUSE is not set
+
+#
+# Joysticks
+#
+# CONFIG_JOYSTICK is not set
+# CONFIG_QIC02_TAPE is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_INTEL_RNG is not set
+# CONFIG_NVRAM is not set
+# CONFIG_RTC is not set
+CONFIG_SA1100_RTC=y
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_FTAPE is not set
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+# CONFIG_PCMCIA_SERIAL is not set
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# File systems
+#
+# CONFIG_QUOTA is not set
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_AUTOFS4_FS is not set
+# CONFIG_REISERFS_FS is not set
+# CONFIG_REISERFS_CHECK is not set
+# CONFIG_ADFS_FS is not set
+# CONFIG_ADFS_FS_RW is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_FAT_FS is not set
+# CONFIG_MSDOS_FS is not set
+# CONFIG_UMSDOS_FS is not set
+# CONFIG_VFAT_FS is not set
+# CONFIG_EFS_FS is not set
+# CONFIG_JFFS_FS is not set
+# CONFIG_JFFS2_FS is not set
+# CONFIG_CRAMFS is not set
+CONFIG_RAMFS=y
+# CONFIG_ISO9660_FS is not set
+# CONFIG_JOLIET is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_NTFS_FS is not set
+# CONFIG_NTFS_RW is not set
+# CONFIG_HPFS_FS is not set
+CONFIG_PROC_FS=y
+# CONFIG_DEVFS_FS is not set
+# CONFIG_DEVFS_MOUNT is not set
+# CONFIG_DEVFS_DEBUG is not set
+CONFIG_DEVPTS_FS=y
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_QNX4FS_RW is not set
+# CONFIG_ROMFS_FS is not set
+CONFIG_EXT2_FS=y
+# CONFIG_SYSV_FS is not set
+# CONFIG_SYSV_FS_WRITE is not set
+# CONFIG_UDF_FS is not set
+# CONFIG_UDF_RW is not set
+# CONFIG_UFS_FS is not set
+# CONFIG_UFS_FS_WRITE is not set
+
+#
+# Network File Systems
+#
+# CONFIG_CODA_FS is not set
+# CONFIG_NFS_FS is not set
+# CONFIG_NFS_V3 is not set
+# CONFIG_ROOT_NFS is not set
+# CONFIG_NFSD is not set
+# CONFIG_NFSD_V3 is not set
+# CONFIG_SUNRPC is not set
+# CONFIG_LOCKD is not set
+# CONFIG_SMB_FS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_NCPFS_PACKET_SIGNING is not set
+# CONFIG_NCPFS_IOCTL_LOCKING is not set
+# CONFIG_NCPFS_STRONG is not set
+# CONFIG_NCPFS_NFS_NS is not set
+# CONFIG_NCPFS_OS2_NS is not set
+# CONFIG_NCPFS_SMALLDOS is not set
+# CONFIG_NCPFS_NLS is not set
+# CONFIG_NCPFS_EXTRAS is not set
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+# CONFIG_SMB_NLS is not set
+# CONFIG_NLS is not set
+
+#
+# Console drivers
+#
+CONFIG_PC_KEYMAP=y
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_FB=y
+
+#
+# Frame-buffer support
+#
+CONFIG_FB=y
+CONFIG_DUMMY_CONSOLE=y
+# CONFIG_FB_ACORN is not set
+# CONFIG_FB_CLPS711X is not set
+# CONFIG_FB_CYBER2000 is not set
+CONFIG_FB_SA1100=y
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FBCON_ADVANCED is not set
+CONFIG_FBCON_CFB2=y
+CONFIG_FBCON_CFB4=y
+CONFIG_FBCON_CFB8=y
+CONFIG_FBCON_CFB16=y
+# CONFIG_FBCON_FONTWIDTH8_ONLY is not set
+CONFIG_FBCON_FONTS=y
+CONFIG_FONT_8x8=y
+CONFIG_FONT_8x16=y
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_SUN12x22 is not set
+# CONFIG_FONT_6x11 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+
+#
+# Sound
+#
+CONFIG_SOUND=y
+CONFIG_SOUND_UDA1341=y
+# CONFIG_SOUND_UDA1341_GSM is not set
+# CONFIG_SOUND_SA1100_SSP is not set
+# CONFIG_SOUND_CMPCI is not set
+# CONFIG_SOUND_EMU10K1 is not set
+# CONFIG_SOUND_FUSION is not set
+# CONFIG_SOUND_CS4281 is not set
+# CONFIG_SOUND_ES1370 is not set
+# CONFIG_SOUND_ES1371 is not set
+# CONFIG_SOUND_ESSSOLO1 is not set
+# CONFIG_SOUND_MAESTRO is not set
+# CONFIG_SOUND_MAESTRO3 is not set
+# CONFIG_SOUND_ICH is not set
+# CONFIG_SOUND_SONICVIBES is not set
+# CONFIG_SOUND_TRIDENT is not set
+# CONFIG_SOUND_MSNDCLAS is not set
+# CONFIG_SOUND_MSNDPIN is not set
+# CONFIG_SOUND_VIA82CXXX is not set
+# CONFIG_SOUND_OSS is not set
+# CONFIG_SOUND_TVMIXER is not set
+
+#
+# USB support
+#
+# CONFIG_USB is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_NO_FRAME_POINTER is not set
+CONFIG_DEBUG_ERRORS=y
+CONFIG_DEBUG_USER=y
+# CONFIG_DEBUG_INFO is not set
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_NO_PGT_CACHE is not set
+# CONFIG_DEBUG_LL is not set
+# CONFIG_DEBUG_DC21285_PORT is not set
+# CONFIG_DEBUG_CLPS711X_UART2 is not set
diff -u --recursive --new-file v2.4.8/linux/arch/arm/def-configs/freebird_new linux/arch/arm/def-configs/freebird_new
--- v2.4.8/linux/arch/arm/def-configs/freebird_new	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/def-configs/freebird_new	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,645 @@
+#
+# Automatically generated by make menuconfig: don't edit
+#
+CONFIG_ARM=y
+# CONFIG_EISA is not set
+# CONFIG_SBUS is not set
+# CONFIG_MCA is not set
+CONFIG_UID16=y
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+# CONFIG_OBSOLETE is not set
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+# CONFIG_MODVERSIONS is not set
+CONFIG_KMOD=y
+
+#
+# System Type
+#
+# CONFIG_ARCH_ARCA5K is not set
+# CONFIG_ARCH_CLPS7500 is not set
+# CONFIG_ARCH_CO285 is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_L7200 is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_RPC is not set
+CONFIG_ARCH_SA1100=y
+# CONFIG_ARCH_CLPS711X is not set
+
+#
+# Archimedes/A5000 Implementations
+#
+# CONFIG_ARCH_ARC is not set
+# CONFIG_ARCH_A5K is not set
+
+#
+# Footbridge Implementations
+#
+# CONFIG_ARCH_CATS is not set
+# CONFIG_ARCH_PERSONAL_SERVER is not set
+# CONFIG_ARCH_EBSA285_ADDIN is not set
+# CONFIG_ARCH_EBSA285_HOST is not set
+# CONFIG_ARCH_NETWINDER is not set
+
+#
+# SA11x0 Implementations
+#
+# CONFIG_SA1100_ASSABET is not set
+# CONFIG_ASSABET_NEPONSET is not set
+# CONFIG_SA1100_BRUTUS is not set
+# CONFIG_SA1100_CERF is not set
+# CONFIG_SA1100_BITSY is not set
+# CONFIG_SA1100_EXTENEX1 is not set
+CONFIG_SA1100_FREEBIRD=y
+# CONFIG_SA1100_GRAPHICSCLIENT is not set
+# CONFIG_SA1100_HUW_WEBPANEL is not set
+# CONFIG_SA1100_LART is not set
+# CONFIG_SA1100_PLEB is not set
+# CONFIG_SA1100_NANOENGINE is not set
+# CONFIG_SA1100_PANGOLIN is not set
+# CONFIG_SA1100_SHERMAN is not set
+# CONFIG_SA1100_VICTOR is not set
+# CONFIG_SA1100_XP860 is not set
+# CONFIG_SA1100_YOPY is not set
+# CONFIG_SA1100_PFS168 is not set
+# CONFIG_SA1100_FREEBIRD_OLD is not set
+CONFIG_SA1100_FREEBIRD_NEW=y
+CONFIG_SA1100_FL=m
+CONFIG_SA1100_USB=m
+CONFIG_SA1100_USB_NETLINK=m
+CONFIG_SA1100_USB_CHAR=m
+CONFIG_SA1100_FREQUENCY_SCALE=y
+# CONFIG_SA1100_VOLTAGE_SCALE is not set
+
+#
+# CLPS711X/EP721X Implementations
+#
+# CONFIG_ARCH_P720T is not set
+# CONFIG_ARCH_ACORN is not set
+# CONFIG_FOOTBRIDGE is not set
+# CONFIG_FOOTBRIDGE_HOST is not set
+# CONFIG_FOOTBRIDGE_ADDIN is not set
+CONFIG_CPU_32=y
+# CONFIG_CPU_26 is not set
+# CONFIG_CPU_32v3 is not set
+CONFIG_CPU_32v4=y
+# CONFIG_CPU_ARM610 is not set
+# CONFIG_CPU_ARM710 is not set
+# CONFIG_CPU_ARM720T is not set
+# CONFIG_CPU_ARM920T is not set
+# CONFIG_CPU_ARM1020 is not set
+# CONFIG_CPU_SA110 is not set
+CONFIG_CPU_SA1100=y
+CONFIG_DISCONTIGMEM=y
+
+#
+# General setup
+#
+# CONFIG_ANGELBOOT is not set
+# CONFIG_PCI is not set
+# CONFIG_ISA is not set
+# CONFIG_ISA_DMA is not set
+CONFIG_HOTPLUG=y
+
+#
+# PCMCIA/CardBus support
+#
+CONFIG_PCMCIA=m
+# CONFIG_I82365 is not set
+# CONFIG_TCIC is not set
+# CONFIG_PCMCIA_CLPS6700 is not set
+CONFIG_PCMCIA_SA1100=m
+CONFIG_NET=y
+CONFIG_SYSVIPC=y
+# CONFIG_BSD_PROCESS_ACCT is not set
+CONFIG_SYSCTL=y
+# CONFIG_FPE_NWFPE is not set
+# CONFIG_FPE_FASTFPE is not set
+CONFIG_KCORE_ELF=y
+# CONFIG_KCORE_AOUT is not set
+# CONFIG_BINFMT_AOUT is not set
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_MISC is not set
+CONFIG_PM=y
+CONFIG_APM=y
+# CONFIG_ARTHUR is not set
+CONFIG_CMDLINE="noinitrd console=ttySA0 init=/linuxrc root=1f04 mem=32m"
+# CONFIG_PFS168_CMDLINE is not set
+# CONFIG_LEDS is not set
+CONFIG_ALIGNMENT_TRAP=y
+# CONFIG_UCB1200 is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+# CONFIG_MTD_DOC1000 is not set
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOCPROBE is not set
+# CONFIG_MTD_PMC551 is not set
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_MTDRAM is not set
+CONFIG_MTD_CFI=y
+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
+CONFIG_MTD_CFI_INTELEXT=y
+# CONFIG_MTD_CFI_AMDSTD is not set
+# CONFIG_MTD_AMDSTD is not set
+# CONFIG_MTD_SHARP is not set
+# CONFIG_MTD_PHYSMAP is not set
+# CONFIG_MTD_NORA is not set
+# CONFIG_MTD_PNC2000 is not set
+# CONFIG_MTD_RPXLITE is not set
+# CONFIG_MTD_SC520CDP is not set
+# CONFIG_MTD_SBC_MEDIAGX is not set
+# CONFIG_MTD_ELAN_104NC is not set
+CONFIG_MTD_SA1100=y
+# CONFIG_MTD_DC21285 is not set
+# CONFIG_MTD_IQ80310 is not set
+# CONFIG_MTD_CSTM_CFI_JEDEC is not set
+# CONFIG_MTD_JEDEC is not set
+# CONFIG_MTD_MIXMEM is not set
+# CONFIG_MTD_OCTAGON is not set
+# CONFIG_MTD_VMAX is not set
+# CONFIG_MTD_NAND is not set
+# CONFIG_MTD_NAND_SPIA is not set
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLOCK=y
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
+
+#
+# Plug and Play configuration
+#
+# CONFIG_PNP is not set
+# CONFIG_ISAPNP is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_DEV_XD is not set
+# CONFIG_PARIDE is not set
+# CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
+# CONFIG_BLK_DEV_DAC960 is not set
+CONFIG_BLK_DEV_LOOP=m
+CONFIG_BLK_DEV_NBD=m
+# CONFIG_BLK_DEV_RAM is not set
+# CONFIG_BLK_DEV_INITRD is not set
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+# CONFIG_BLK_DEV_MD is not set
+# CONFIG_MD_LINEAR is not set
+# CONFIG_MD_RAID0 is not set
+# CONFIG_MD_RAID1 is not set
+# CONFIG_MD_RAID5 is not set
+# CONFIG_BLK_DEV_LVM is not set
+
+#
+# Networking options
+#
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
+CONFIG_NETLINK=y
+CONFIG_RTNETLINK=y
+# CONFIG_NETLINK_DEV is not set
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+# CONFIG_FILTER is not set
+CONFIG_UNIX=y
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# CONFIG_IP_ADVANCED_ROUTER is not set
+# CONFIG_IP_PNP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_ARPD is not set
+# CONFIG_INET_ECN is not set
+# CONFIG_SYN_COOKIES is not set
+
+#
+#   IP: Netfilter Configuration
+#
+# CONFIG_IP_NF_CONNTRACK is not set
+# CONFIG_IP_NF_QUEUE is not set
+# CONFIG_IP_NF_IPTABLES is not set
+# CONFIG_IP_NF_COMPAT_IPCHAINS is not set
+# CONFIG_IP_NF_COMPAT_IPFWADM is not set
+# CONFIG_IPV6 is not set
+# CONFIG_KHTTPD is not set
+# CONFIG_ATM is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_DECNET is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_LLC is not set
+# CONFIG_NET_DIVERT is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+# CONFIG_NET_FASTROUTE is not set
+# CONFIG_NET_HW_FLOWCONTROL is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED is not set
+
+#
+# Network device support
+#
+CONFIG_NETDEVICES=y
+
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+# CONFIG_ETHERTAP is not set
+# CONFIG_NET_SB1000 is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+# CONFIG_NET_ETHERNET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+# CONFIG_ACENIC is not set
+# CONFIG_HAMACHI is not set
+# CONFIG_YELLOWFIN is not set
+# CONFIG_SK98LIN is not set
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI is not set
+CONFIG_PPP=m
+# CONFIG_PPP_MULTILINK is not set
+CONFIG_PPP_ASYNC=m
+# CONFIG_PPP_SYNC_TTY is not set
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+# CONFIG_PPPOE is not set
+# CONFIG_SLIP is not set
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Token Ring devices
+#
+# CONFIG_TR is not set
+# CONFIG_NET_FC is not set
+# CONFIG_RCPCI is not set
+# CONFIG_SHAPER is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+
+#
+# PCMCIA network device support
+#
+CONFIG_NET_PCMCIA=y
+# CONFIG_PCMCIA_3C589 is not set
+# CONFIG_PCMCIA_3C574 is not set
+# CONFIG_PCMCIA_FMVJ18X is not set
+CONFIG_PCMCIA_PCNET=m
+# CONFIG_PCMCIA_NMCLAN is not set
+# CONFIG_PCMCIA_SMC91C92 is not set
+# CONFIG_PCMCIA_XIRC2PS is not set
+# CONFIG_ARCNET_COM20020_CS is not set
+# CONFIG_PCMCIA_IBMTR is not set
+# CONFIG_NET_PCMCIA_RADIO is not set
+
+#
+# Amateur Radio support
+#
+# CONFIG_HAMRADIO is not set
+
+#
+# IrDA (infrared) support
+#
+CONFIG_IRDA=m
+# CONFIG_IRLAN is not set
+# CONFIG_IRNET is not set
+# CONFIG_IRCOMM is not set
+# CONFIG_IRDA_ULTRA is not set
+# CONFIG_IRDA_OPTIONS is not set
+
+#
+# Infrared-port device drivers
+#
+# CONFIG_IRTTY_SIR is not set
+# CONFIG_IRPORT_SIR is not set
+# CONFIG_NSC_FIR is not set
+# CONFIG_WINBOND_FIR is not set
+# CONFIG_TOSHIBA_FIR is not set
+# CONFIG_SMC_IRCC_FIR is not set
+CONFIG_SA1100_FIR=m
+# CONFIG_DONGLE is not set
+
+#
+# ATA/IDE/MFM/RLL support
+#
+CONFIG_IDE=m
+
+#
+# IDE, ATA and ATAPI Block devices
+#
+CONFIG_BLK_DEV_IDE=m
+# CONFIG_BLK_DEV_HD_IDE is not set
+# CONFIG_BLK_DEV_HD is not set
+CONFIG_BLK_DEV_IDEDISK=m
+# CONFIG_IDEDISK_MULTI_MODE is not set
+# CONFIG_BLK_DEV_IDEDISK_VENDOR is not set
+# CONFIG_BLK_DEV_IDEDISK_FUJITSU is not set
+# CONFIG_BLK_DEV_IDEDISK_IBM is not set
+# CONFIG_BLK_DEV_IDEDISK_MAXTOR is not set
+# CONFIG_BLK_DEV_IDEDISK_QUANTUM is not set
+# CONFIG_BLK_DEV_IDEDISK_SEAGATE is not set
+# CONFIG_BLK_DEV_IDEDISK_WD is not set
+# CONFIG_BLK_DEV_COMMERIAL is not set
+# CONFIG_BLK_DEV_TIVO is not set
+CONFIG_BLK_DEV_IDECS=m
+# CONFIG_BLK_DEV_IDECD is not set
+# CONFIG_BLK_DEV_IDETAPE is not set
+# CONFIG_BLK_DEV_IDEFLOPPY is not set
+# CONFIG_BLK_DEV_IDESCSI is not set
+# CONFIG_BLK_DEV_CMD640 is not set
+# CONFIG_BLK_DEV_CMD640_ENHANCED is not set
+# CONFIG_BLK_DEV_ISAPNP is not set
+# CONFIG_IDE_CHIPSETS is not set
+# CONFIG_IDEDMA_AUTO is not set
+# CONFIG_DMA_NONPCI is not set
+# CONFIG_BLK_DEV_IDE_MODES is not set
+
+#
+# SCSI support
+#
+# CONFIG_SCSI is not set
+
+#
+# I2O device support
+#
+# CONFIG_I2O is not set
+# CONFIG_I2O_BLOCK is not set
+# CONFIG_I2O_LAN is not set
+# CONFIG_I2O_SCSI is not set
+# CONFIG_I2O_PROC is not set
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Input core support
+#
+# CONFIG_INPUT is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+# CONFIG_VT_CONSOLE is not set
+CONFIG_SERIAL=m
+# CONFIG_SERIAL_EXTENDED is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+CONFIG_SERIAL_SA1100=y
+CONFIG_SERIAL_SA1100_CONSOLE=y
+CONFIG_SA1100_DEFAULT_BAUDRATE=9600
+# CONFIG_TOUCHSCREEN_UCB1200 is not set
+# CONFIG_TOUCHSCREEN_BITSY is not set
+CONFIG_FB_TS_BT=y
+# CONFIG_PROFILER is not set
+# CONFIG_PFS168_SPI is not set
+# CONFIG_PFS168_DTMF is not set
+# CONFIG_PFS168_MISC is not set
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_UNIX98_PTY_COUNT=32
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# Mice
+#
+# CONFIG_BUSMOUSE is not set
+# CONFIG_MOUSE is not set
+
+#
+# Joysticks
+#
+# CONFIG_JOYSTICK is not set
+# CONFIG_QIC02_TAPE is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_INTEL_RNG is not set
+# CONFIG_NVRAM is not set
+# CONFIG_RTC is not set
+CONFIG_SA1100_RTC=y
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_FTAPE is not set
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+CONFIG_PCMCIA_SERIAL=m
+
+#
+# PCMCIA character device support
+#
+CONFIG_PCMCIA_SERIAL_CS=m
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# File systems
+#
+# CONFIG_QUOTA is not set
+CONFIG_AUTOFS_FS=m
+# CONFIG_AUTOFS4_FS is not set
+# CONFIG_REISERFS_FS is not set
+# CONFIG_REISERFS_CHECK is not set
+# CONFIG_ADFS_FS is not set
+# CONFIG_ADFS_FS_RW is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_FAT_FS is not set
+# CONFIG_MSDOS_FS is not set
+# CONFIG_UMSDOS_FS is not set
+# CONFIG_VFAT_FS is not set
+# CONFIG_EFS_FS is not set
+CONFIG_JFFS_FS=m
+CONFIG_JFFS_FS_VERBOSE=0
+# CONFIG_JFFS2_FS is not set
+CONFIG_CRAMFS=y
+CONFIG_RAMFS=y
+# CONFIG_ISO9660_FS is not set
+# CONFIG_JOLIET is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_NTFS_FS is not set
+# CONFIG_NTFS_RW is not set
+# CONFIG_HPFS_FS is not set
+CONFIG_PROC_FS=y
+# CONFIG_DEVFS_FS is not set
+# CONFIG_DEVFS_MOUNT is not set
+# CONFIG_DEVFS_DEBUG is not set
+CONFIG_DEVPTS_FS=y
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_QNX4FS_RW is not set
+# CONFIG_ROMFS_FS is not set
+CONFIG_EXT2_FS=m
+# CONFIG_SYSV_FS is not set
+# CONFIG_SYSV_FS_WRITE is not set
+# CONFIG_UDF_FS is not set
+# CONFIG_UDF_RW is not set
+# CONFIG_UFS_FS is not set
+# CONFIG_UFS_FS_WRITE is not set
+
+#
+# Network File Systems
+#
+# CONFIG_CODA_FS is not set
+CONFIG_NFS_FS=m
+# CONFIG_NFS_V3 is not set
+# CONFIG_ROOT_NFS is not set
+# CONFIG_NFSD is not set
+# CONFIG_NFSD_V3 is not set
+CONFIG_SUNRPC=m
+CONFIG_LOCKD=m
+# CONFIG_SMB_FS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_NCPFS_PACKET_SIGNING is not set
+# CONFIG_NCPFS_IOCTL_LOCKING is not set
+# CONFIG_NCPFS_STRONG is not set
+# CONFIG_NCPFS_NFS_NS is not set
+# CONFIG_NCPFS_OS2_NS is not set
+# CONFIG_NCPFS_SMALLDOS is not set
+# CONFIG_NCPFS_NLS is not set
+# CONFIG_NCPFS_EXTRAS is not set
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+# CONFIG_SMB_NLS is not set
+# CONFIG_NLS is not set
+
+#
+# Console drivers
+#
+CONFIG_PC_KEYMAP=y
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_FB=y
+
+#
+# Frame-buffer support
+#
+CONFIG_FB=y
+CONFIG_DUMMY_CONSOLE=y
+# CONFIG_FB_ACORN is not set
+# CONFIG_FB_CLPS711X is not set
+# CONFIG_FB_CYBER2000 is not set
+CONFIG_FB_SA1100=y
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FBCON_ADVANCED is not set
+CONFIG_FBCON_CFB2=y
+CONFIG_FBCON_CFB4=y
+CONFIG_FBCON_CFB8=y
+CONFIG_FBCON_CFB16=y
+# CONFIG_FBCON_FONTWIDTH8_ONLY is not set
+CONFIG_FBCON_FONTS=y
+CONFIG_FONT_8x8=y
+CONFIG_FONT_8x16=y
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_SUN12x22 is not set
+# CONFIG_FONT_6x11 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+
+#
+# Sound
+#
+CONFIG_SOUND=y
+CONFIG_SOUND_UDA1341=y
+# CONFIG_SOUND_UDA1341_GSM is not set
+# CONFIG_SOUND_SA1100_SSP is not set
+# CONFIG_SOUND_CMPCI is not set
+# CONFIG_SOUND_EMU10K1 is not set
+# CONFIG_SOUND_FUSION is not set
+# CONFIG_SOUND_CS4281 is not set
+# CONFIG_SOUND_ES1370 is not set
+# CONFIG_SOUND_ES1371 is not set
+# CONFIG_SOUND_ESSSOLO1 is not set
+# CONFIG_SOUND_MAESTRO is not set
+# CONFIG_SOUND_MAESTRO3 is not set
+# CONFIG_SOUND_ICH is not set
+# CONFIG_SOUND_SONICVIBES is not set
+# CONFIG_SOUND_TRIDENT is not set
+# CONFIG_SOUND_MSNDCLAS is not set
+# CONFIG_SOUND_MSNDPIN is not set
+# CONFIG_SOUND_VIA82CXXX is not set
+# CONFIG_SOUND_OSS is not set
+# CONFIG_SOUND_TVMIXER is not set
+
+#
+# USB support
+#
+# CONFIG_USB is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_NO_FRAME_POINTER is not set
+CONFIG_DEBUG_ERRORS=y
+# CONFIG_DEBUG_USER is not set
+# CONFIG_DEBUG_INFO is not set
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_NO_PGT_CACHE is not set
+# CONFIG_DEBUG_LL is not set
+# CONFIG_DEBUG_DC21285_PORT is not set
+# CONFIG_DEBUG_CLPS711X_UART2 is not set
diff -u --recursive --new-file v2.4.8/linux/arch/arm/def-configs/graphicsclient linux/arch/arm/def-configs/graphicsclient
--- v2.4.8/linux/arch/arm/def-configs/graphicsclient	Mon Nov 27 17:07:59 2000
+++ linux/arch/arm/def-configs/graphicsclient	Sun Aug 12 11:13:59 2001
@@ -2,7 +2,9 @@
 # Automatically generated make config: don't edit
 #
 CONFIG_ARM=y
+# CONFIG_EISA is not set
 # CONFIG_SBUS is not set
+# CONFIG_MCA is not set
 CONFIG_UID16=y
 
 #
@@ -25,35 +27,63 @@
 # CONFIG_ARCH_CLPS7500 is not set
 # CONFIG_ARCH_CO285 is not set
 # CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_L7200 is not set
 # CONFIG_ARCH_FOOTBRIDGE is not set
 # CONFIG_ARCH_INTEGRATOR is not set
 # CONFIG_ARCH_RPC is not set
 CONFIG_ARCH_SA1100=y
+# CONFIG_ARCH_CLPS711X is not set
 
 #
 # Archimedes/A5000 Implementations
 #
 
 #
+# Archimedes/A5000 Implementations (select only ONE)
+#
+# CONFIG_ARCH_ARC is not set
+# CONFIG_ARCH_A5K is not set
+
+#
 # Footbridge Implementations
 #
+# CONFIG_ARCH_CATS is not set
+# CONFIG_ARCH_PERSONAL_SERVER is not set
+# CONFIG_ARCH_EBSA285_ADDIN is not set
+# CONFIG_ARCH_EBSA285_HOST is not set
+# CONFIG_ARCH_NETWINDER is not set
 
 #
 # SA11x0 Implementations
 #
 # CONFIG_SA1100_ASSABET is not set
+# CONFIG_ASSABET_NEPONSET is not set
 # CONFIG_SA1100_BRUTUS is not set
 # CONFIG_SA1100_CERF is not set
 # CONFIG_SA1100_BITSY is not set
-# CONFIG_SA1100_LART is not set
+# CONFIG_SA1100_EXTENEX1 is not set
+# CONFIG_SA1100_FREEBIRD is not set
 CONFIG_SA1100_GRAPHICSCLIENT=y
+# CONFIG_SA1100_HUW_WEBPANEL is not set
+# CONFIG_SA1100_LART is not set
+# CONFIG_SA1100_PLEB is not set
 # CONFIG_SA1100_NANOENGINE is not set
-# CONFIG_SA1100_VICTOR is not set
+# CONFIG_SA1100_PANGOLIN is not set
 # CONFIG_SA1100_SHERMAN is not set
+# CONFIG_SA1100_VICTOR is not set
 # CONFIG_SA1100_XP860 is not set
-# CONFIG_ANGELBOOT is not set
+# CONFIG_SA1100_YOPY is not set
+# CONFIG_SA1100_PFS168 is not set
+CONFIG_SA1100_USB=m
+CONFIG_SA1100_USB_NETLINK=m
+CONFIG_SA1100_USB_CHAR=m
 # CONFIG_SA1100_FREQUENCY_SCALE is not set
 # CONFIG_SA1100_VOLTAGE_SCALE is not set
+
+#
+# CLPS711X/EP721X Implementations
+#
+# CONFIG_ARCH_P720T is not set
 # CONFIG_ARCH_ACORN is not set
 # CONFIG_FOOTBRIDGE is not set
 # CONFIG_FOOTBRIDGE_HOST is not set
@@ -64,31 +94,44 @@
 #
 # Processor Type
 #
+# CONFIG_CPU_32v3 is not set
 CONFIG_CPU_32v4=y
+# CONFIG_CPU_ARM610 is not set
+# CONFIG_CPU_ARM710 is not set
+# CONFIG_CPU_ARM720T is not set
+# CONFIG_CPU_ARM920T is not set
+# CONFIG_CPU_ARM1020 is not set
+# CONFIG_CPU_SA110 is not set
 CONFIG_CPU_SA1100=y
 CONFIG_DISCONTIGMEM=y
 
 #
 # General setup
 #
+
+#
+# Please ensure that you have read the help on the next option
+#
+# CONFIG_ANGELBOOT is not set
 # CONFIG_PCI is not set
 # CONFIG_ISA is not set
 # CONFIG_ISA_DMA is not set
-CONFIG_PC_KEYMAP=y
 CONFIG_HOTPLUG=y
 
 #
 # PCMCIA/CardBus support
 #
 CONFIG_PCMCIA=y
-# CONFIG_PCMCIA_DEBUG is not set
-CONFIG_SA1100_PCMCIA=y
-CONFIG_VIRTUAL_BUS=y
+# CONFIG_I82365 is not set
+# CONFIG_TCIC is not set
+# CONFIG_PCMCIA_CLPS6700 is not set
+CONFIG_PCMCIA_SA1100=m
 CONFIG_NET=y
 CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
-CONFIG_NWFPE=y
+CONFIG_FPE_NWFPE=y
+# CONFIG_FPE_FASTFPE is not set
 CONFIG_KCORE_ELF=y
 # CONFIG_KCORE_AOUT is not set
 # CONFIG_BINFMT_AOUT is not set
@@ -97,8 +140,10 @@
 # CONFIG_PM is not set
 # CONFIG_ARTHUR is not set
 CONFIG_CMDLINE="root=nfs"
+# CONFIG_PFS168_CMDLINE is not set
 # CONFIG_LEDS is not set
 CONFIG_ALIGNMENT_TRAP=y
+# CONFIG_UCB1200 is not set
 
 #
 # Parallel port support
@@ -108,7 +153,65 @@
 #
 # Memory Technology Devices (MTD)
 #
-# CONFIG_MTD is not set
+CONFIG_MTD=m
+# CONFIG_MTD_DEBUG is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOC1000 is not set
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOCPROBE is not set
+
+#
+# RAM/ROM Device Drivers
+#
+# CONFIG_MTD_PMC551 is not set
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_MTDRAM is not set
+
+#
+# Linearly Mapped Flash Device Drivers
+#
+CONFIG_MTD_CFI=m
+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
+CONFIG_MTD_CFI_INTELEXT=m
+# CONFIG_MTD_CFI_AMDSTD is not set
+# CONFIG_MTD_AMDSTD is not set
+# CONFIG_MTD_SHARP is not set
+# CONFIG_MTD_PHYSMAP is not set
+# CONFIG_MTD_NORA is not set
+# CONFIG_MTD_PNC2000 is not set
+# CONFIG_MTD_RPXLITE is not set
+# CONFIG_MTD_SC520CDP is not set
+# CONFIG_MTD_SBC_MEDIAGX is not set
+# CONFIG_MTD_ELAN_104NC is not set
+CONFIG_MTD_SA1100=m
+# CONFIG_MTD_DC21285 is not set
+# CONFIG_MTD_IQ80310 is not set
+# CONFIG_MTD_CSTM_CFI_JEDEC is not set
+# CONFIG_MTD_JEDEC is not set
+# CONFIG_MTD_MIXMEM is not set
+# CONFIG_MTD_OCTAGON is not set
+# CONFIG_MTD_VMAX is not set
+
+#
+# NAND Flash Device Drivers
+#
+# CONFIG_MTD_NAND is not set
+# CONFIG_MTD_NAND_SPIA is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=m
+CONFIG_MTD_BLOCK=m
+# CONFIG_MTD_BLOCK_RO is not set
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
 
 #
 # Plug and Play configuration
@@ -123,19 +226,24 @@
 # CONFIG_BLK_DEV_XD is not set
 # CONFIG_PARIDE is not set
 # CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
 # CONFIG_BLK_DEV_DAC960 is not set
-# CONFIG_BLK_DEV_LOOP is not set
+CONFIG_BLK_DEV_LOOP=m
 # CONFIG_BLK_DEV_NBD is not set
-# CONFIG_BLK_DEV_LVM is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_SIZE=8192
+CONFIG_BLK_DEV_INITRD=y
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
 # CONFIG_BLK_DEV_MD is not set
 # CONFIG_MD_LINEAR is not set
 # CONFIG_MD_RAID0 is not set
 # CONFIG_MD_RAID1 is not set
 # CONFIG_MD_RAID5 is not set
-CONFIG_BLK_DEV_RAM=y
-CONFIG_BLK_DEV_RAM_SIZE=8192
-CONFIG_BLK_DEV_INITRD=y
-# CONFIG_BLK_DEV_FLASH is not set
+# CONFIG_BLK_DEV_LVM is not set
 
 #
 # Networking options
@@ -170,6 +278,7 @@
 # CONFIG_X25 is not set
 # CONFIG_LAPB is not set
 # CONFIG_LLC is not set
+# CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
 # CONFIG_NET_FASTROUTE is not set
@@ -199,7 +308,6 @@
 # Ethernet (10 or 100Mbit)
 #
 CONFIG_NET_ETHERNET=y
-# CONFIG_ARM_AM79C961A is not set
 # CONFIG_NET_VENDOR_3COM is not set
 # CONFIG_LANCE is not set
 CONFIG_NET_VENDOR_SMC=y
@@ -217,8 +325,9 @@
 #
 # Ethernet (1000 Mbit)
 #
-# CONFIG_YELLOWFIN is not set
 # CONFIG_ACENIC is not set
+# CONFIG_HAMACHI is not set
+# CONFIG_YELLOWFIN is not set
 # CONFIG_SK98LIN is not set
 # CONFIG_FDDI is not set
 # CONFIG_HIPPI is not set
@@ -331,6 +440,11 @@
 # CONFIG_ISDN is not set
 
 #
+# Input core support
+#
+# CONFIG_INPUT is not set
+
+#
 # Character devices
 #
 CONFIG_VT=y
@@ -340,9 +454,15 @@
 # CONFIG_SERIAL_NONSTANDARD is not set
 CONFIG_SERIAL_SA1100=y
 CONFIG_SERIAL_SA1100_CONSOLE=y
-CONFIG_SA1100_DEFAULT_BAUDRATE=38400
+CONFIG_SA1100_DEFAULT_BAUDRATE=9600
 # CONFIG_TOUCHSCREEN_UCB1200 is not set
 # CONFIG_TOUCHSCREEN_BITSY is not set
+# CONFIG_PROFILER is not set
+# CONFIG_PFS168_SPI is not set
+# CONFIG_PFS168_DTMF is not set
+# CONFIG_PFS168_MISC is not set
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_UNIX98_PTYS=y
 CONFIG_UNIX98_PTY_COUNT=32
 
@@ -374,6 +494,7 @@
 # CONFIG_INTEL_RNG is not set
 # CONFIG_NVRAM is not set
 # CONFIG_RTC is not set
+# CONFIG_SA1100_RTC is not set
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
 # CONFIG_APPLICOM is not set
@@ -387,11 +508,18 @@
 # CONFIG_PCMCIA_SERIAL is not set
 
 #
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
 # File systems
 #
 # CONFIG_QUOTA is not set
 # CONFIG_AUTOFS_FS is not set
 # CONFIG_AUTOFS4_FS is not set
+# CONFIG_REISERFS_FS is not set
+# CONFIG_REISERFS_CHECK is not set
 # CONFIG_ADFS_FS is not set
 # CONFIG_ADFS_FS_RW is not set
 # CONFIG_AFFS_FS is not set
@@ -402,9 +530,12 @@
 # CONFIG_UMSDOS_FS is not set
 CONFIG_VFAT_FS=m
 # CONFIG_EFS_FS is not set
-# CONFIG_JFFS_FS is not set
+CONFIG_JFFS_FS=m
+CONFIG_JFFS_FS_VERBOSE=0
+CONFIG_JFFS2_FS=m
+CONFIG_JFFS2_FS_DEBUG=0
 # CONFIG_CRAMFS is not set
-CONFIG_RAMFS=y
+CONFIG_RAMFS=m
 # CONFIG_ISO9660_FS is not set
 # CONFIG_JOLIET is not set
 # CONFIG_MINIX_FS is not set
@@ -446,8 +577,6 @@
 # CONFIG_NCPFS_NFS_NS is not set
 # CONFIG_NCPFS_OS2_NS is not set
 # CONFIG_NCPFS_SMALLDOS is not set
-# CONFIG_NCPFS_MOUNT_SUBDIR is not set
-# CONFIG_NCPFS_NDS_DOMAINS is not set
 # CONFIG_NCPFS_NLS is not set
 # CONFIG_NCPFS_EXTRAS is not set
 
@@ -456,6 +585,7 @@
 #
 # CONFIG_PARTITION_ADVANCED is not set
 CONFIG_MSDOS_PARTITION=y
+# CONFIG_SMB_NLS is not set
 CONFIG_NLS=y
 
 #
@@ -499,6 +629,7 @@
 #
 # Console drivers
 #
+CONFIG_PC_KEYMAP=y
 # CONFIG_VGA_CONSOLE is not set
 CONFIG_FB=y
 
@@ -507,6 +638,8 @@
 #
 CONFIG_FB=y
 CONFIG_DUMMY_CONSOLE=y
+# CONFIG_FB_ACORN is not set
+# CONFIG_FB_CLPS711X is not set
 # CONFIG_FB_CYBER2000 is not set
 CONFIG_FB_SA1100=y
 # CONFIG_FB_VIRTUAL is not set
@@ -536,9 +669,12 @@
 #
 # Kernel hacking
 #
-CONFIG_FRAME_POINTER=y
+# CONFIG_NO_FRAME_POINTER is not set
 CONFIG_DEBUG_ERRORS=y
 CONFIG_DEBUG_USER=y
 # CONFIG_DEBUG_INFO is not set
 # CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_NO_PGT_CACHE is not set
 # CONFIG_DEBUG_LL is not set
+# CONFIG_DEBUG_DC21285_PORT is not set
+# CONFIG_DEBUG_CLPS711X_UART2 is not set
diff -u --recursive --new-file v2.4.8/linux/arch/arm/def-configs/h3600 linux/arch/arm/def-configs/h3600
--- v2.4.8/linux/arch/arm/def-configs/h3600	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/def-configs/h3600	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,604 @@
+#
+# Automatically generated make config: don't edit
+#
+CONFIG_ARM=y
+# CONFIG_SBUS is not set
+CONFIG_UID16=y
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+# CONFIG_OBSOLETE is not set
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+# CONFIG_MODVERSIONS is not set
+CONFIG_KMOD=y
+
+#
+# System Type
+#
+# CONFIG_ARCH_ARCA5K is not set
+# CONFIG_ARCH_CLPS7500 is not set
+# CONFIG_ARCH_CO285 is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_RPC is not set
+CONFIG_ARCH_SA1100=y
+
+#
+# Archimedes/A5000 Implementations
+#
+
+#
+# Footbridge Implementations
+#
+
+#
+# SA11x0 Implementations
+#
+# CONFIG_SA1100_ASSABET is not set
+# CONFIG_SA1100_BRUTUS is not set
+# CONFIG_SA1100_CERF is not set
+CONFIG_SA1100_BITSY=y
+# CONFIG_SA1100_LART is not set
+# CONFIG_SA1100_GRAPHICSCLIENT is not set
+# CONFIG_SA1100_NANOENGINE is not set
+# CONFIG_SA1100_VICTOR is not set
+# CONFIG_SA1100_SHERMAN is not set
+# CONFIG_SA1100_XP860 is not set
+# CONFIG_SA1100_PANGOLIN is not set
+# CONFIG_ANGELBOOT is not set
+CONFIG_SA1100_USB=m
+CONFIG_SA1100_FREQUENCY_SCALE=y
+# CONFIG_SA1100_VOLTAGE_SCALE is not set
+# CONFIG_ARCH_ACORN is not set
+# CONFIG_FOOTBRIDGE is not set
+# CONFIG_FOOTBRIDGE_HOST is not set
+# CONFIG_FOOTBRIDGE_ADDIN is not set
+CONFIG_CPU_32=y
+# CONFIG_CPU_26 is not set
+
+#
+# Processor Type
+#
+CONFIG_CPU_32v4=y
+CONFIG_CPU_SA1100=y
+CONFIG_DISCONTIGMEM=y
+
+#
+# General setup
+#
+# CONFIG_PCI is not set
+# CONFIG_ISA is not set
+# CONFIG_ISA_DMA is not set
+CONFIG_PC_KEYMAP=y
+CONFIG_HOTPLUG=y
+
+#
+# PCMCIA/CardBus support
+#
+CONFIG_PCMCIA=m
+CONFIG_PCMCIA_DEBUG=y
+PCMCIA_DEBUG=1
+CONFIG_SA1100_PCMCIA=y
+CONFIG_VIRTUAL_BUS=y
+CONFIG_NET=y
+CONFIG_SYSVIPC=y
+# CONFIG_BSD_PROCESS_ACCT is not set
+CONFIG_SYSCTL=y
+CONFIG_NWFPE=y
+CONFIG_KCORE_ELF=y
+# CONFIG_KCORE_AOUT is not set
+CONFIG_BINFMT_AOUT=y
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_MISC is not set
+CONFIG_PM=y
+# CONFIG_ARTHUR is not set
+CONFIG_CMDLINE=""
+# CONFIG_LEDS is not set
+# CONFIG_ALIGNMENT_TRAP is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+CONFIG_MTD=y
+# CONFIG_MTD_DOC1000 is not set
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOCPROBE is not set
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PMC551 is not set
+# CONFIG_MTD_MTDRAM is not set
+
+#
+# MTD drivers for mapped chips
+#
+CONFIG_MTD_CFI=m
+CONFIG_MTD_CFI_INTELEXT=m
+CONFIG_MTD_CFI_AMDSTD=m
+# CONFIG_MTD_JEDEC is not set
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+CONFIG_MTD_PHYSMAP=m
+CONFIG_MTD_PHYSMAP_START=0
+CONFIG_MTD_PHYSMAP_LEN=0
+
+#
+# Drivers for chip mappings
+#
+# CONFIG_MTD_MIXMEM is not set
+# CONFIG_MTD_NORA is not set
+# CONFIG_MTD_OCTAGON is not set
+# CONFIG_MTD_PNC2000 is not set
+# CONFIG_MTD_RPXLITE is not set
+# CONFIG_MTD_VMAX is not set
+
+#
+# User modules and translation layers for MTD devices
+#
+CONFIG_MTD_CHAR=m
+CONFIG_MTD_BLOCK=m
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
+
+#
+# Plug and Play configuration
+#
+# CONFIG_PNP is not set
+# CONFIG_ISAPNP is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_DEV_XD is not set
+# CONFIG_PARIDE is not set
+# CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_DEV_DAC960 is not set
+CONFIG_BLK_DEV_LOOP=m
+CONFIG_BLK_DEV_NBD=m
+# CONFIG_BLK_DEV_LVM is not set
+# CONFIG_BLK_DEV_MD is not set
+# CONFIG_MD_LINEAR is not set
+# CONFIG_MD_RAID0 is not set
+# CONFIG_MD_RAID1 is not set
+# CONFIG_MD_RAID5 is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_BLK_DEV_FLASH=y
+
+#
+# Networking options
+#
+CONFIG_PACKET=y
+# CONFIG_PACKET_MMAP is not set
+CONFIG_NETLINK=y
+CONFIG_RTNETLINK=y
+CONFIG_NETLINK_DEV=y
+# CONFIG_NETFILTER is not set
+# CONFIG_FILTER is not set
+CONFIG_UNIX=y
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+# CONFIG_IP_ADVANCED_ROUTER is not set
+# CONFIG_IP_PNP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_IP_MROUTE is not set
+# CONFIG_ARPD is not set
+# CONFIG_INET_ECN is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_IPV6 is not set
+# CONFIG_KHTTPD is not set
+# CONFIG_ATM is not set
+
+#
+#
+#
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_DECNET is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_LLC is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+# CONFIG_NET_FASTROUTE is not set
+# CONFIG_NET_HW_FLOWCONTROL is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED is not set
+
+#
+# Network device support
+#
+CONFIG_NETDEVICES=y
+
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+# CONFIG_ETHERTAP is not set
+# CONFIG_NET_SB1000 is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+# CONFIG_NET_ETHERNET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+# CONFIG_YELLOWFIN is not set
+# CONFIG_ACENIC is not set
+# CONFIG_SK98LIN is not set
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI is not set
+CONFIG_PPP=m
+# CONFIG_PPP_MULTILINK is not set
+CONFIG_PPP_ASYNC=m
+# CONFIG_PPP_SYNC_TTY is not set
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+# CONFIG_PPPOE is not set
+# CONFIG_SLIP is not set
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Token Ring devices
+#
+# CONFIG_TR is not set
+# CONFIG_NET_FC is not set
+# CONFIG_RCPCI is not set
+# CONFIG_SHAPER is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+
+#
+# PCMCIA network device support
+#
+CONFIG_NET_PCMCIA=y
+# CONFIG_PCMCIA_3C589 is not set
+# CONFIG_PCMCIA_3C574 is not set
+# CONFIG_PCMCIA_FMVJ18X is not set
+CONFIG_PCMCIA_PCNET=m
+# CONFIG_PCMCIA_NMCLAN is not set
+# CONFIG_PCMCIA_SMC91C92 is not set
+# CONFIG_PCMCIA_XIRC2PS is not set
+# CONFIG_ARCNET_COM20020_CS is not set
+# CONFIG_PCMCIA_IBMTR is not set
+CONFIG_NET_PCMCIA_RADIO=y
+# CONFIG_PCMCIA_RAYCS is not set
+# CONFIG_PCMCIA_NETWAVE is not set
+# CONFIG_PCMCIA_WAVELAN is not set
+# CONFIG_AIRONET4500_CS is not set
+
+#
+# Amateur Radio support
+#
+# CONFIG_HAMRADIO is not set
+
+#
+# IrDA (infrared) support
+#
+# CONFIG_IRDA is not set
+
+#
+# ATA/IDE/MFM/RLL support
+#
+CONFIG_IDE=m
+
+#
+# IDE, ATA and ATAPI Block devices
+#
+CONFIG_BLK_DEV_IDE=m
+
+#
+# Please see Documentation/ide.txt for help/info on IDE drives
+#
+# CONFIG_BLK_DEV_HD_IDE is not set
+# CONFIG_BLK_DEV_HD is not set
+CONFIG_BLK_DEV_IDEDISK=m
+# CONFIG_IDEDISK_MULTI_MODE is not set
+# CONFIG_BLK_DEV_IDEDISK_VENDOR is not set
+# CONFIG_BLK_DEV_IDEDISK_FUJITSU is not set
+# CONFIG_BLK_DEV_IDEDISK_IBM is not set
+# CONFIG_BLK_DEV_IDEDISK_MAXTOR is not set
+# CONFIG_BLK_DEV_IDEDISK_QUANTUM is not set
+# CONFIG_BLK_DEV_IDEDISK_SEAGATE is not set
+# CONFIG_BLK_DEV_IDEDISK_WD is not set
+# CONFIG_BLK_DEV_COMMERIAL is not set
+# CONFIG_BLK_DEV_TIVO is not set
+CONFIG_BLK_DEV_IDECS=m
+CONFIG_BLK_DEV_IDECD=m
+CONFIG_BLK_DEV_IDETAPE=m
+CONFIG_BLK_DEV_IDEFLOPPY=m
+# CONFIG_BLK_DEV_IDESCSI is not set
+
+#
+# IDE chipset support/bugfixes
+#
+# CONFIG_BLK_DEV_CMD640 is not set
+# CONFIG_BLK_DEV_CMD640_ENHANCED is not set
+# CONFIG_BLK_DEV_ISAPNP is not set
+# CONFIG_IDE_CHIPSETS is not set
+# CONFIG_IDEDMA_AUTO is not set
+# CONFIG_DMA_NONPCI is not set
+# CONFIG_BLK_DEV_IDE_MODES is not set
+
+#
+# SCSI support
+#
+# CONFIG_SCSI is not set
+
+#
+# I2O device support
+#
+# CONFIG_I2O is not set
+# CONFIG_I2O_BLOCK is not set
+# CONFIG_I2O_LAN is not set
+# CONFIG_I2O_SCSI is not set
+# CONFIG_I2O_PROC is not set
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Input core support
+#
+# CONFIG_INPUT is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_VT_CONSOLE=y
+# CONFIG_SERIAL is not set
+# CONFIG_SERIAL_EXTENDED is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+CONFIG_SERIAL_SA1100=y
+CONFIG_SERIAL_SA1100_CONSOLE=y
+CONFIG_SA1100_DEFAULT_BAUDRATE=115200
+# CONFIG_TOUCHSCREEN_UCB1200 is not set
+CONFIG_TOUCHSCREEN_BITSY=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_UNIX98_PTY_COUNT=32
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# Mice
+#
+# CONFIG_BUSMOUSE is not set
+# CONFIG_MOUSE is not set
+
+#
+# Joysticks
+#
+# CONFIG_JOYSTICK is not set
+
+#
+# Input core support is needed for joysticks
+#
+# CONFIG_QIC02_TAPE is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_INTEL_RNG is not set
+# CONFIG_NVRAM is not set
+# CONFIG_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_FTAPE is not set
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+# CONFIG_PCMCIA_SERIAL is not set
+
+#
+# File systems
+#
+# CONFIG_QUOTA is not set
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_AUTOFS4_FS is not set
+# CONFIG_ADFS_FS is not set
+# CONFIG_ADFS_FS_RW is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_BFS_FS is not set
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
+# CONFIG_UMSDOS_FS is not set
+CONFIG_VFAT_FS=m
+# CONFIG_EFS_FS is not set
+CONFIG_JFFS_FS=m
+CONFIG_JFFS_FS_VERBOSE=2
+CONFIG_CRAMFS=y
+CONFIG_RAMFS=y
+# CONFIG_ISO9660_FS is not set
+# CONFIG_JOLIET is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_NTFS_FS is not set
+# CONFIG_NTFS_RW is not set
+# CONFIG_HPFS_FS is not set
+CONFIG_PROC_FS=y
+# CONFIG_DEVFS_FS is not set
+# CONFIG_DEVFS_MOUNT is not set
+# CONFIG_DEVFS_DEBUG is not set
+CONFIG_DEVPTS_FS=y
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_QNX4FS_RW is not set
+# CONFIG_ROMFS_FS is not set
+CONFIG_EXT2_FS=y
+# CONFIG_SYSV_FS is not set
+# CONFIG_SYSV_FS_WRITE is not set
+# CONFIG_UDF_FS is not set
+# CONFIG_UDF_RW is not set
+# CONFIG_UFS_FS is not set
+# CONFIG_UFS_FS_WRITE is not set
+
+#
+# Network File Systems
+#
+# CONFIG_CODA_FS is not set
+CONFIG_NFS_FS=m
+# CONFIG_NFS_V3 is not set
+# CONFIG_ROOT_NFS is not set
+CONFIG_NFSD=m
+# CONFIG_NFSD_V3 is not set
+CONFIG_SUNRPC=m
+CONFIG_LOCKD=m
+CONFIG_SMB_FS=m
+CONFIG_SMB_NLS_REMOTE=""
+# CONFIG_NCP_FS is not set
+# CONFIG_NCPFS_PACKET_SIGNING is not set
+# CONFIG_NCPFS_IOCTL_LOCKING is not set
+# CONFIG_NCPFS_STRONG is not set
+# CONFIG_NCPFS_NFS_NS is not set
+# CONFIG_NCPFS_OS2_NS is not set
+# CONFIG_NCPFS_SMALLDOS is not set
+# CONFIG_NCPFS_MOUNT_SUBDIR is not set
+# CONFIG_NCPFS_NDS_DOMAINS is not set
+# CONFIG_NCPFS_NLS is not set
+# CONFIG_NCPFS_EXTRAS is not set
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+CONFIG_NLS=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS_DEFAULT="iso8859-1"
+# CONFIG_NLS_CODEPAGE_437 is not set
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+# CONFIG_NLS_CODEPAGE_850 is not set
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_ISO8859_1 is not set
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+# CONFIG_NLS_ISO8859_15 is not set
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_UTF8 is not set
+
+#
+# Console drivers
+#
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_FB=y
+
+#
+# Frame-buffer support
+#
+CONFIG_FB=y
+CONFIG_DUMMY_CONSOLE=y
+# CONFIG_FB_CYBER2000 is not set
+CONFIG_FB_SA1100=y
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FBCON_ADVANCED is not set
+CONFIG_FBCON_CFB2=y
+CONFIG_FBCON_CFB4=y
+CONFIG_FBCON_CFB8=y
+CONFIG_FBCON_CFB16=y
+# CONFIG_FBCON_FONTWIDTH8_ONLY is not set
+# CONFIG_FBCON_FONTS is not set
+CONFIG_FONT_8x8=y
+CONFIG_FONT_8x16=y
+
+#
+# Sound
+#
+CONFIG_SOUND=m
+CONFIG_SOUND_UDA1341=m
+# CONFIG_SOUND_SA1100_SSP is not set
+# CONFIG_SOUND_CMPCI is not set
+# CONFIG_SOUND_EMU10K1 is not set
+# CONFIG_SOUND_FUSION is not set
+# CONFIG_SOUND_ES1370 is not set
+# CONFIG_SOUND_ES1371 is not set
+# CONFIG_SOUND_ESSSOLO1 is not set
+# CONFIG_SOUND_MAESTRO is not set
+# CONFIG_SOUND_SONICVIBES is not set
+# CONFIG_SOUND_TRIDENT is not set
+# CONFIG_SOUND_MSNDCLAS is not set
+# CONFIG_SOUND_MSNDPIN is not set
+# CONFIG_SOUND_VIA82CXXX is not set
+# CONFIG_SOUND_OSS is not set
+# CONFIG_SOUND_TVMIXER is not set
+
+#
+# USB support
+#
+# CONFIG_USB is not set
+
+#
+# Kernel hacking
+#
+CONFIG_FRAME_POINTER=y
+CONFIG_DEBUG_ERRORS=y
+# CONFIG_DEBUG_USER is not set
+# CONFIG_DEBUG_INFO is not set
+# CONFIG_MAGIC_SYSRQ is not set
+CONFIG_DEBUG_LL=y
diff -u --recursive --new-file v2.4.8/linux/arch/arm/def-configs/huw_webpanel linux/arch/arm/def-configs/huw_webpanel
--- v2.4.8/linux/arch/arm/def-configs/huw_webpanel	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/def-configs/huw_webpanel	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,435 @@
+#
+# Automatically generated by make menuconfig: don't edit
+#
+CONFIG_ARM=y
+# CONFIG_EISA is not set
+# CONFIG_SBUS is not set
+# CONFIG_MCA is not set
+CONFIG_UID16=y
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+# CONFIG_OBSOLETE is not set
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_KMOD is not set
+
+#
+# System Type
+#
+# CONFIG_ARCH_ARCA5K is not set
+# CONFIG_ARCH_CLPS7500 is not set
+# CONFIG_ARCH_CO285 is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_RPC is not set
+CONFIG_ARCH_SA1100=y
+# CONFIG_ARCH_CLPS711X is not set
+
+#
+# Archimedes/A5000 Implementations
+#
+
+#
+# Footbridge Implementations
+#
+
+#
+# SA11x0 Implementations
+#
+# CONFIG_SA1100_ASSABET is not set
+CONFIG_SA1100_HUW_WEBPANEL=y
+# CONFIG_SA1100_BRUTUS is not set
+# CONFIG_SA1100_CERF is not set
+# CONFIG_SA1100_BITSY is not set
+# CONFIG_SA1100_LART is not set
+# CONFIG_SA1100_GRAPHICSCLIENT is not set
+# CONFIG_SA1100_NANOENGINE is not set
+# CONFIG_SA1100_VICTOR is not set
+# CONFIG_SA1100_YOPY is not set
+# CONFIG_SA1100_SHERMAN is not set
+# CONFIG_SA1100_XP860 is not set
+# CONFIG_SA1100_PANGOLIN is not set
+# CONFIG_SA1100_FREEBIRD is not set
+# CONFIG_SA1100_USB is not set
+# CONFIG_SA1100_FREQUENCY_SCALE is not set
+# CONFIG_SA1100_VOLTAGE_SCALE is not set
+
+#
+# CLPS711X/EP721X Implementations
+#
+# CONFIG_ARCH_ACORN is not set
+# CONFIG_FOOTBRIDGE is not set
+# CONFIG_FOOTBRIDGE_HOST is not set
+# CONFIG_FOOTBRIDGE_ADDIN is not set
+CONFIG_CPU_32=y
+# CONFIG_CPU_26 is not set
+CONFIG_CPU_32v4=y
+CONFIG_CPU_SA1100=y
+CONFIG_DISCONTIGMEM=y
+
+#
+# General setup
+#
+# CONFIG_ANGELBOOT is not set
+# CONFIG_PCI is not set
+# CONFIG_ISA is not set
+# CONFIG_ISA_DMA is not set
+# CONFIG_HOTPLUG is not set
+# CONFIG_PCMCIA is not set
+CONFIG_NET=y
+CONFIG_SYSVIPC=y
+# CONFIG_BSD_PROCESS_ACCT is not set
+CONFIG_SYSCTL=y
+CONFIG_NWFPE=y
+CONFIG_KCORE_ELF=y
+# CONFIG_KCORE_AOUT is not set
+# CONFIG_BINFMT_AOUT is not set
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_MISC is not set
+# CONFIG_PM is not set
+# CONFIG_ARTHUR is not set
+CONFIG_CMDLINE="keepinitrd"
+# CONFIG_LEDS is not set
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+# CONFIG_MTD_DOC1000 is not set
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOCPROBE is not set
+# CONFIG_MTD_PMC551 is not set
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_MTDRAM is not set
+CONFIG_MTD_CFI=y
+CONFIG_MTD_CFI_GEOMETRY=y
+# CONFIG_MTD_CFI_B1 is not set
+# CONFIG_MTD_CFI_B2 is not set
+CONFIG_MTD_CFI_B4=y
+# CONFIG_MTD_CFI_I1 is not set
+CONFIG_MTD_CFI_I2=y
+# CONFIG_MTD_CFI_I4 is not set
+CONFIG_MTD_CFI_INTELEXT=y
+# CONFIG_MTD_CFI_AMDSTD is not set
+# CONFIG_MTD_SHARP is not set
+# CONFIG_MTD_PHYSMAP is not set
+# CONFIG_MTD_NORA is not set
+# CONFIG_MTD_PNC2000 is not set
+# CONFIG_MTD_RPXLITE is not set
+# CONFIG_MTD_SBC_MEDIAGX is not set
+# CONFIG_MTD_ELAN_104NC is not set
+CONFIG_MTD_SA1100=y
+# CONFIG_MTD_DC21285 is not set
+# CONFIG_MTD_JEDEC is not set
+# CONFIG_MTD_MIXMEM is not set
+# CONFIG_MTD_OCTAGON is not set
+# CONFIG_MTD_VMAX is not set
+# CONFIG_MTD_NAND is not set
+# CONFIG_MTD_NAND_SPIA is not set
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLOCK=y
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
+
+#
+# Plug and Play configuration
+#
+# CONFIG_PNP is not set
+# CONFIG_ISAPNP is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_DEV_XD is not set
+# CONFIG_PARIDE is not set
+# CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
+# CONFIG_BLK_DEV_DAC960 is not set
+CONFIG_BLK_DEV_LOOP=y
+# CONFIG_BLK_DEV_NBD is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BLK_DEV_INITRD=y
+# CONFIG_BLK_DEV_FLASH is not set
+
+#
+# Networking options
+#
+# CONFIG_PACKET is not set
+# CONFIG_NETLINK is not set
+# CONFIG_NETFILTER is not set
+# CONFIG_FILTER is not set
+CONFIG_UNIX=y
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# CONFIG_IP_ADVANCED_ROUTER is not set
+# CONFIG_IP_PNP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_INET_ECN is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_IPV6 is not set
+# CONFIG_KHTTPD is not set
+# CONFIG_ATM is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_DECNET is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_LLC is not set
+# CONFIG_NET_DIVERT is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+# CONFIG_NET_FASTROUTE is not set
+# CONFIG_NET_HW_FLOWCONTROL is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED is not set
+
+#
+# Network device support
+#
+# CONFIG_NETDEVICES is not set
+
+#
+# Amateur Radio support
+#
+# CONFIG_HAMRADIO is not set
+
+#
+# IrDA (infrared) support
+#
+# CONFIG_IRDA is not set
+
+#
+# ATA/IDE/MFM/RLL support
+#
+# CONFIG_IDE is not set
+# CONFIG_BLK_DEV_IDE_MODES is not set
+# CONFIG_BLK_DEV_HD is not set
+
+#
+# SCSI support
+#
+# CONFIG_SCSI is not set
+
+#
+# I2O device support
+#
+# CONFIG_I2O is not set
+# CONFIG_I2O_BLOCK is not set
+# CONFIG_I2O_LAN is not set
+# CONFIG_I2O_SCSI is not set
+# CONFIG_I2O_PROC is not set
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Input core support
+#
+# CONFIG_INPUT is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+# CONFIG_VT_CONSOLE is not set
+# CONFIG_SERIAL is not set
+# CONFIG_SERIAL_EXTENDED is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+CONFIG_SERIAL_SA1100=y
+CONFIG_SERIAL_SA1100_CONSOLE=y
+CONFIG_SA1100_DEFAULT_BAUDRATE=115200
+CONFIG_TOUCHSCREEN_UCB1200=y
+# CONFIG_TOUCHSCREEN_BITSY is not set
+# CONFIG_PROFILER is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_UNIX98_PTY_COUNT=32
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# Mice
+#
+# CONFIG_BUSMOUSE is not set
+# CONFIG_MOUSE is not set
+
+#
+# Joysticks
+#
+# CONFIG_JOYSTICK is not set
+# CONFIG_QIC02_TAPE is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_INTEL_RNG is not set
+# CONFIG_NVRAM is not set
+# CONFIG_RTC is not set
+# CONFIG_SA1100_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_FTAPE is not set
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# File systems
+#
+# CONFIG_QUOTA is not set
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_AUTOFS4_FS is not set
+# CONFIG_ADFS_FS is not set
+# CONFIG_ADFS_FS_RW is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_FAT_FS is not set
+# CONFIG_MSDOS_FS is not set
+# CONFIG_UMSDOS_FS is not set
+# CONFIG_VFAT_FS is not set
+# CONFIG_EFS_FS is not set
+# CONFIG_JFFS_FS is not set
+CONFIG_CRAMFS=y
+# CONFIG_RAMFS is not set
+# CONFIG_ISO9660_FS is not set
+# CONFIG_JOLIET is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_NTFS_FS is not set
+# CONFIG_NTFS_RW is not set
+# CONFIG_HPFS_FS is not set
+CONFIG_PROC_FS=y
+# CONFIG_DEVFS_FS is not set
+# CONFIG_DEVFS_MOUNT is not set
+# CONFIG_DEVFS_DEBUG is not set
+CONFIG_DEVPTS_FS=y
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_QNX4FS_RW is not set
+CONFIG_ROMFS_FS=y
+CONFIG_EXT2_FS=y
+# CONFIG_SYSV_FS is not set
+# CONFIG_SYSV_FS_WRITE is not set
+# CONFIG_UDF_FS is not set
+# CONFIG_UDF_RW is not set
+# CONFIG_UFS_FS is not set
+# CONFIG_UFS_FS_WRITE is not set
+
+#
+# Network File Systems
+#
+# CONFIG_CODA_FS is not set
+# CONFIG_NFS_FS is not set
+# CONFIG_NFS_V3 is not set
+# CONFIG_ROOT_NFS is not set
+# CONFIG_NFSD is not set
+# CONFIG_NFSD_V3 is not set
+# CONFIG_SUNRPC is not set
+# CONFIG_LOCKD is not set
+# CONFIG_SMB_FS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_NCPFS_PACKET_SIGNING is not set
+# CONFIG_NCPFS_IOCTL_LOCKING is not set
+# CONFIG_NCPFS_STRONG is not set
+# CONFIG_NCPFS_NFS_NS is not set
+# CONFIG_NCPFS_OS2_NS is not set
+# CONFIG_NCPFS_SMALLDOS is not set
+# CONFIG_NCPFS_MOUNT_SUBDIR is not set
+# CONFIG_NCPFS_NDS_DOMAINS is not set
+# CONFIG_NCPFS_NLS is not set
+# CONFIG_NCPFS_EXTRAS is not set
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+# CONFIG_NLS is not set
+
+#
+# Console drivers
+#
+CONFIG_PC_KEYMAP=y
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_FB=y
+
+#
+# Frame-buffer support
+#
+CONFIG_FB=y
+CONFIG_DUMMY_CONSOLE=y
+# CONFIG_FB_ACORN is not set
+# CONFIG_FB_CLPS711X is not set
+# CONFIG_FB_CYBER2000 is not set
+CONFIG_FB_SA1100=y
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FBCON_ADVANCED is not set
+CONFIG_FBCON_CFB2=y
+CONFIG_FBCON_CFB4=y
+CONFIG_FBCON_CFB8=y
+CONFIG_FBCON_CFB16=y
+CONFIG_FBCON_FONTWIDTH8_ONLY=y
+CONFIG_FBCON_FONTS=y
+CONFIG_FONT_8x8=y
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+
+#
+# USB support
+#
+# CONFIG_USB is not set
+
+#
+# Kernel hacking
+#
+CONFIG_FRAME_POINTER=y
+CONFIG_DEBUG_ERRORS=y
+CONFIG_DEBUG_USER=y
+# CONFIG_DEBUG_INFO is not set
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_DEBUG_LL is not set
diff -u --recursive --new-file v2.4.8/linux/arch/arm/def-configs/integrator linux/arch/arm/def-configs/integrator
--- v2.4.8/linux/arch/arm/def-configs/integrator	Sat May 19 17:43:05 2001
+++ linux/arch/arm/def-configs/integrator	Sun Aug 12 11:13:59 2001
@@ -6,6 +6,8 @@
 # CONFIG_SBUS is not set
 # CONFIG_MCA is not set
 CONFIG_UID16=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
 
 #
 # Code maturity level options
@@ -16,7 +18,9 @@
 #
 # Loadable module support
 #
-# CONFIG_MODULES is not set
+CONFIG_MODULES=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_KMOD is not set
 
 #
 # System Type
@@ -31,22 +35,56 @@
 # CONFIG_ARCH_RPC is not set
 # CONFIG_ARCH_SA1100 is not set
 # CONFIG_ARCH_CLPS711X is not set
+# CONFIG_ARCH_ANAKIN is not set
 
 #
 # Archimedes/A5000 Implementations
 #
 
 #
+# Archimedes/A5000 Implementations (select only ONE)
+#
+# CONFIG_ARCH_ARC is not set
+# CONFIG_ARCH_A5K is not set
+
+#
 # Footbridge Implementations
 #
+# CONFIG_ARCH_CATS is not set
+# CONFIG_ARCH_PERSONAL_SERVER is not set
+# CONFIG_ARCH_EBSA285_ADDIN is not set
+# CONFIG_ARCH_EBSA285_HOST is not set
+# CONFIG_ARCH_NETWINDER is not set
 
 #
 # SA11x0 Implementations
 #
+# CONFIG_SA1100_ASSABET is not set
+# CONFIG_ASSABET_NEPONSET is not set
+# CONFIG_SA1100_BRUTUS is not set
+# CONFIG_SA1100_CERF is not set
+# CONFIG_SA1100_BITSY is not set
+# CONFIG_SA1100_EXTENEX1 is not set
+# CONFIG_SA1100_FREEBIRD is not set
+# CONFIG_SA1100_GRAPHICSCLIENT is not set
+# CONFIG_SA1100_JORNADA720 is not set
+# CONFIG_SA1100_HUW_WEBPANEL is not set
+# CONFIG_SA1100_ITSY is not set
+# CONFIG_SA1100_LART is not set
+# CONFIG_SA1100_NANOENGINE is not set
+# CONFIG_SA1100_OMNIMETER is not set
+# CONFIG_SA1100_PANGOLIN is not set
+# CONFIG_SA1100_PLEB is not set
+# CONFIG_SA1100_SHERMAN is not set
+# CONFIG_SA1100_PFS168 is not set
+# CONFIG_SA1100_VICTOR is not set
+# CONFIG_SA1100_XP860 is not set
+# CONFIG_SA1100_YOPY is not set
 
 #
 # CLPS711X/EP721X Implementations
 #
+# CONFIG_ARCH_P720T is not set
 # CONFIG_ARCH_ACORN is not set
 # CONFIG_FOOTBRIDGE is not set
 # CONFIG_FOOTBRIDGE_HOST is not set
@@ -75,15 +113,11 @@
 #
 # General setup
 #
-
-#
-# Please ensure that you have read the help on the next option
-#
-# CONFIG_ANGELBOOT is not set
 CONFIG_PCI_INTEGRATOR=y
 CONFIG_PCI=y
 # CONFIG_ISA is not set
 # CONFIG_ISA_DMA is not set
+CONFIG_CPU_CLOCK=y
 CONFIG_PCI_NAMES=y
 # CONFIG_HOTPLUG is not set
 # CONFIG_PCMCIA is not set
@@ -91,15 +125,16 @@
 CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
-CONFIG_NWFPE=y
+# CONFIG_FPE_NWFPE is not set
+CONFIG_FPE_FASTFPE=y
 CONFIG_KCORE_ELF=y
 # CONFIG_KCORE_AOUT is not set
 CONFIG_BINFMT_AOUT=y
 CONFIG_BINFMT_ELF=y
 # CONFIG_BINFMT_MISC is not set
-# CONFIG_PM is not set
+CONFIG_PM=y
 # CONFIG_ARTHUR is not set
-CONFIG_CMDLINE="root=1f04 mem=32M"
+CONFIG_CMDLINE="root=1f03 mem=32M"
 CONFIG_LEDS=y
 CONFIG_LEDS_TIMER=y
 CONFIG_LEDS_CPU=y
@@ -115,51 +150,83 @@
 #
 CONFIG_MTD=y
 # CONFIG_MTD_DEBUG is not set
+CONFIG_MTD_PARTITIONS=y
+# CONFIG_MTD_REDBOOT_PARTS is not set
+# CONFIG_MTD_BOOTLDR_PARTS is not set
+CONFIG_MTD_AFS_PARTS=y
 
 #
-# Disk-On-Chip Device Drivers
-#
-# CONFIG_MTD_DOC1000 is not set
-# CONFIG_MTD_DOC2000 is not set
-# CONFIG_MTD_DOC2001 is not set
-# CONFIG_MTD_DOCPROBE is not set
-
+# User Modules And Translation Layers
 #
-# RAM/ROM Device Drivers
-#
-# CONFIG_MTD_SLRAM is not set
-# CONFIG_MTD_PMC551 is not set
-# CONFIG_MTD_MTDRAM is not set
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLOCK=y
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
 
 #
-# Linearly Mapped Flash Device Drivers
+# RAM/ROM/Flash chip drivers
 #
 CONFIG_MTD_CFI=y
+# CONFIG_MTD_CFI_VIRTUAL_ER is not set
+CONFIG_MTD_CFI_ADV_OPTIONS=y
+CONFIG_MTD_CFI_NOSWAP=y
+# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
+# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
+# CONFIG_MTD_CFI_LART_BIT_SWAP is not set
+# CONFIG_MTD_CFI_GEOMETRY is not set
 CONFIG_MTD_CFI_INTELEXT=y
 # CONFIG_MTD_CFI_AMDSTD is not set
+# CONFIG_MTD_AMDSTD is not set
+# CONFIG_MTD_SHARP is not set
 # CONFIG_MTD_RAM is not set
 # CONFIG_MTD_ROM is not set
 # CONFIG_MTD_JEDEC is not set
-# CONFIG_MTD_PHYSMAP is not set
 
 #
-# Drivers for chip mappings
+# Mapping drivers for chip access
 #
-# CONFIG_MTD_MIXMEM is not set
+# CONFIG_MTD_PHYSMAP is not set
+# CONFIG_MTD_SUN_UFLASH is not set
 # CONFIG_MTD_NORA is not set
-# CONFIG_MTD_OCTAGON is not set
 # CONFIG_MTD_PNC2000 is not set
 # CONFIG_MTD_RPXLITE is not set
+# CONFIG_MTD_SC520CDP is not set
+# CONFIG_MTD_NETSC520 is not set
+# CONFIG_MTD_SBC_GXX is not set
+# CONFIG_MTD_ELAN_104NC is not set
+# CONFIG_MTD_SA1100 is not set
+# CONFIG_MTD_SA1100_REDBOOT_PARTITIONS is not set
+# CONFIG_MTD_SA1100_BOOTLDR_PARTITIONS is not set
+# CONFIG_MTD_DC21285 is not set
+# CONFIG_MTD_IQ80310 is not set
+# CONFIG_MTD_DBOX2 is not set
+# CONFIG_MTD_CSTM_MIPS_IXX is not set
+# CONFIG_MTD_CFI_FLAGADM is not set
+# CONFIG_MTD_MIXMEM is not set
+# CONFIG_MTD_OCTAGON is not set
 # CONFIG_MTD_VMAX is not set
+CONFIG_MTD_ARMFLASH=y
 
 #
-# User modules and translation layers for MTD devices
+# Self-contained MTD device drivers
 #
-CONFIG_MTD_CHAR=y
-CONFIG_MTD_BLOCK=y
-# CONFIG_FTL is not set
-# CONFIG_NFTL is not set
-CONFIG_MTD_ARM=y
+# CONFIG_MTD_PMC551 is not set
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_MTDRAM is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOC1000 is not set
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOCPROBE is not set
+
+#
+# NAND Flash Device Drivers
+#
+# CONFIG_MTD_NAND is not set
+# CONFIG_MTD_NAND_SPIA is not set
 
 #
 # Plug and Play configuration
@@ -183,22 +250,38 @@
 # CONFIG_BLK_DEV_INITRD is not set
 
 #
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+# CONFIG_BLK_DEV_MD is not set
+# CONFIG_MD_LINEAR is not set
+# CONFIG_MD_RAID0 is not set
+# CONFIG_MD_RAID1 is not set
+# CONFIG_MD_RAID5 is not set
+# CONFIG_BLK_DEV_LVM is not set
+
+#
 # Networking options
 #
-# CONFIG_PACKET is not set
-# CONFIG_NETLINK is not set
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
+CONFIG_NETLINK=y
+# CONFIG_RTNETLINK is not set
+# CONFIG_NETLINK_DEV is not set
 # CONFIG_NETFILTER is not set
 # CONFIG_FILTER is not set
 CONFIG_UNIX=y
 CONFIG_INET=y
-# CONFIG_IP_MULTICAST is not set
+CONFIG_IP_MULTICAST=y
 # CONFIG_IP_ADVANCED_ROUTER is not set
 CONFIG_IP_PNP=y
+# CONFIG_IP_PNP_DHCP is not set
 CONFIG_IP_PNP_BOOTP=y
 # CONFIG_IP_PNP_RARP is not set
 # CONFIG_NET_IPIP is not set
 # CONFIG_NET_IPGRE is not set
-# CONFIG_INET_ECN is not set
+# CONFIG_IP_MROUTE is not set
+CONFIG_INET_ECN=y
 # CONFIG_SYN_COOKIES is not set
 # CONFIG_IPV6 is not set
 # CONFIG_KHTTPD is not set
@@ -238,6 +321,7 @@
 # CONFIG_BONDING is not set
 # CONFIG_EQUALIZER is not set
 # CONFIG_TUN is not set
+# CONFIG_ETHERTAP is not set
 # CONFIG_NET_SB1000 is not set
 
 #
@@ -257,19 +341,22 @@
 # CONFIG_ADAPTEC_STARFIRE is not set
 # CONFIG_APRICOT is not set
 # CONFIG_CS89x0 is not set
-CONFIG_TULIP=y
+# CONFIG_TULIP is not set
 # CONFIG_DE4X5 is not set
 # CONFIG_DGRS is not set
 # CONFIG_DM9102 is not set
 CONFIG_EEPRO100=y
 CONFIG_EEPRO100_PM=y
 # CONFIG_LNE390 is not set
+# CONFIG_FEALNX is not set
 # CONFIG_NATSEMI is not set
 # CONFIG_NE2K_PCI is not set
 # CONFIG_NE3210 is not set
 # CONFIG_ES3210 is not set
 # CONFIG_8139TOO is not set
-# CONFIG_RTL8129 is not set
+# CONFIG_8139TOO_PIO is not set
+# CONFIG_8139TOO_TUNE_TWISTER is not set
+# CONFIG_8139TOO_8129 is not set
 # CONFIG_SIS900 is not set
 # CONFIG_EPIC100 is not set
 # CONFIG_SUNDANCE is not set
@@ -364,9 +451,16 @@
 # CONFIG_SERIAL is not set
 # CONFIG_SERIAL_EXTENDED is not set
 # CONFIG_SERIAL_NONSTANDARD is not set
+# CONFIG_SERIAL_21285 is not set
+# CONFIG_SERIAL_21285_OLD is not set
+# CONFIG_SERIAL_21285_CONSOLE is not set
+# CONFIG_SERIAL_SA1100 is not set
+# CONFIG_SERIAL_SA1100_CONSOLE is not set
 CONFIG_SERIAL_AMBA=y
-CONFIG_SERIAL_INTEGRATOR=y
 CONFIG_SERIAL_AMBA_CONSOLE=y
+CONFIG_SERIAL_INTEGRATOR=y
+# CONFIG_SERIAL_CLPS711X is not set
+# CONFIG_SERIAL_CLPS711X_CONSOLE is not set
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_UNIX98_PTYS=y
@@ -438,11 +532,15 @@
 # CONFIG_VFAT_FS is not set
 # CONFIG_EFS_FS is not set
 # CONFIG_JFFS_FS is not set
+CONFIG_JFFS2_FS=y
+CONFIG_JFFS2_FS_DEBUG=0
 # CONFIG_CRAMFS is not set
+# CONFIG_TMPFS is not set
 # CONFIG_RAMFS is not set
 # CONFIG_ISO9660_FS is not set
 # CONFIG_JOLIET is not set
-# CONFIG_MINIX_FS is not set
+CONFIG_MINIX_FS=y
+# CONFIG_VXFS_FS is not set
 # CONFIG_NTFS_FS is not set
 # CONFIG_NTFS_RW is not set
 # CONFIG_HPFS_FS is not set
@@ -467,12 +565,13 @@
 #
 # CONFIG_CODA_FS is not set
 CONFIG_NFS_FS=y
-# CONFIG_NFS_V3 is not set
+CONFIG_NFS_V3=y
 CONFIG_ROOT_NFS=y
-# CONFIG_NFSD is not set
-# CONFIG_NFSD_V3 is not set
+CONFIG_NFSD=y
+CONFIG_NFSD_V3=y
 CONFIG_SUNRPC=y
 CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
 # CONFIG_SMB_FS is not set
 # CONFIG_NCP_FS is not set
 # CONFIG_NCPFS_PACKET_SIGNING is not set
@@ -504,14 +603,41 @@
 # Console drivers
 #
 CONFIG_KMI_KEYB=y
+CONFIG_KMI_MOUSE=y
 CONFIG_PC_KEYMAP=y
 CONFIG_VGA_CONSOLE=y
-# CONFIG_FB is not set
+CONFIG_FB=y
 
 #
 # Frame-buffer support
 #
-# CONFIG_FB is not set
+CONFIG_FB=y
+CONFIG_DUMMY_CONSOLE=y
+# CONFIG_FB_RIVA is not set
+# CONFIG_FB_CLGEN is not set
+# CONFIG_FB_PM2 is not set
+# CONFIG_FB_ACORN is not set
+# CONFIG_FB_CLPS711X is not set
+# CONFIG_FB_CYBER2000 is not set
+# CONFIG_FB_SA1100 is not set
+# CONFIG_FB_ANAKIN is not set
+# CONFIG_FB_E1355 is not set
+# CONFIG_FB_MATROX is not set
+# CONFIG_FB_ATY is not set
+# CONFIG_FB_ATY128 is not set
+# CONFIG_FB_3DFX is not set
+# CONFIG_FB_SIS is not set
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FBCON_ADVANCED is not set
+# CONFIG_FBCON_FONTWIDTH8_ONLY is not set
+CONFIG_FBCON_FONTS=y
+CONFIG_FONT_8x8=y
+CONFIG_FONT_8x16=y
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_SUN12x22 is not set
+# CONFIG_FONT_6x11 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
 
 #
 # Sound
@@ -531,4 +657,7 @@
 CONFIG_DEBUG_USER=y
 # CONFIG_DEBUG_INFO is not set
 CONFIG_MAGIC_SYSRQ=y
+# CONFIG_NO_PGT_CACHE is not set
 CONFIG_DEBUG_LL=y
+# CONFIG_DEBUG_DC21285_PORT is not set
+# CONFIG_DEBUG_CLPS711X_UART2 is not set
diff -u --recursive --new-file v2.4.8/linux/arch/arm/def-configs/jornada720 linux/arch/arm/def-configs/jornada720
--- v2.4.8/linux/arch/arm/def-configs/jornada720	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/def-configs/jornada720	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,760 @@
+#
+# Automatically generated make config: don't edit
+#
+CONFIG_ARM=y
+# CONFIG_EISA is not set
+# CONFIG_SBUS is not set
+# CONFIG_MCA is not set
+CONFIG_UID16=y
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+# CONFIG_OBSOLETE is not set
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+# CONFIG_MODVERSIONS is not set
+CONFIG_KMOD=y
+
+#
+# System Type
+#
+# CONFIG_ARCH_ARCA5K is not set
+# CONFIG_ARCH_CLPS7500 is not set
+# CONFIG_ARCH_CO285 is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_L7200 is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_RPC is not set
+CONFIG_ARCH_SA1100=y
+# CONFIG_ARCH_CLPS711X is not set
+
+#
+# Archimedes/A5000 Implementations
+#
+
+#
+# Archimedes/A5000 Implementations (select only ONE)
+#
+# CONFIG_ARCH_ARC is not set
+# CONFIG_ARCH_A5K is not set
+
+#
+# Footbridge Implementations
+#
+# CONFIG_ARCH_CATS is not set
+# CONFIG_ARCH_PERSONAL_SERVER is not set
+# CONFIG_ARCH_EBSA285_ADDIN is not set
+# CONFIG_ARCH_EBSA285_HOST is not set
+# CONFIG_ARCH_NETWINDER is not set
+
+#
+# SA11x0 Implementations
+#
+# CONFIG_SA1100_ASSABET is not set
+# CONFIG_ASSABET_NEPONSET is not set
+# CONFIG_SA1100_BRUTUS is not set
+# CONFIG_SA1100_CERF is not set
+# CONFIG_SA1100_BITSY is not set
+# CONFIG_SA1100_EXTENEX1 is not set
+# CONFIG_SA1100_FREEBIRD is not set
+# CONFIG_SA1100_GRAPHICSCLIENT is not set
+CONFIG_SA1100_JORNADA720=y
+# CONFIG_SA1100_HUW_WEBPANEL is not set
+# CONFIG_SA1100_ITSY is not set
+# CONFIG_SA1100_LART is not set
+# CONFIG_SA1100_NANOENGINE is not set
+# CONFIG_SA1100_OMNIMETER is not set
+# CONFIG_SA1100_PANGOLIN is not set
+# CONFIG_SA1100_PLEB is not set
+# CONFIG_SA1100_SHERMAN is not set
+# CONFIG_SA1100_PFS168 is not set
+# CONFIG_SA1100_VICTOR is not set
+# CONFIG_SA1100_XP860 is not set
+# CONFIG_SA1100_YOPY is not set
+CONFIG_SA1111=y
+# CONFIG_SA1100_USB is not set
+# CONFIG_SA1100_USB_NETLINK is not set
+# CONFIG_SA1100_USB_CHAR is not set
+# CONFIG_SA1100_FREQUENCY_SCALE is not set
+# CONFIG_SA1100_VOLTAGE_SCALE is not set
+
+#
+# CLPS711X/EP721X Implementations
+#
+# CONFIG_ARCH_P720T is not set
+# CONFIG_ARCH_ACORN is not set
+# CONFIG_FOOTBRIDGE is not set
+# CONFIG_FOOTBRIDGE_HOST is not set
+# CONFIG_FOOTBRIDGE_ADDIN is not set
+CONFIG_CPU_32=y
+# CONFIG_CPU_26 is not set
+
+#
+# Processor Type
+#
+# CONFIG_CPU_32v3 is not set
+CONFIG_CPU_32v4=y
+# CONFIG_CPU_ARM610 is not set
+# CONFIG_CPU_ARM710 is not set
+# CONFIG_CPU_ARM720T is not set
+# CONFIG_CPU_ARM920T is not set
+# CONFIG_CPU_ARM1020 is not set
+# CONFIG_CPU_SA110 is not set
+CONFIG_CPU_SA1100=y
+CONFIG_DISCONTIGMEM=y
+
+#
+# General setup
+#
+
+#
+# Please ensure that you have read the help on the next option
+#
+# CONFIG_ANGELBOOT is not set
+# CONFIG_PCI is not set
+# CONFIG_ISA is not set
+# CONFIG_ISA_DMA is not set
+CONFIG_HOTPLUG=y
+
+#
+# PCMCIA/CardBus support
+#
+CONFIG_PCMCIA=y
+# CONFIG_I82365 is not set
+# CONFIG_TCIC is not set
+# CONFIG_PCMCIA_CLPS6700 is not set
+CONFIG_PCMCIA_SA1100=y
+CONFIG_NET=y
+CONFIG_SYSVIPC=y
+# CONFIG_BSD_PROCESS_ACCT is not set
+CONFIG_SYSCTL=y
+CONFIG_FPE_NWFPE=y
+# CONFIG_FPE_FASTFPE is not set
+CONFIG_KCORE_ELF=y
+# CONFIG_KCORE_AOUT is not set
+CONFIG_BINFMT_AOUT=m
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_MISC is not set
+CONFIG_PM=y
+# CONFIG_APM is not set
+# CONFIG_ARTHUR is not set
+CONFIG_CMDLINE="keepinitrd"
+# CONFIG_PFS168_CMDLINE is not set
+# CONFIG_LEDS is not set
+# CONFIG_ALIGNMENT_TRAP is not set
+# CONFIG_UCB1200 is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOC1000 is not set
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOCPROBE is not set
+
+#
+# RAM/ROM Device Drivers
+#
+# CONFIG_MTD_PMC551 is not set
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_MTDRAM is not set
+
+#
+# Linearly Mapped Flash Device Drivers
+#
+CONFIG_MTD_CFI=y
+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
+CONFIG_MTD_CFI_INTELEXT=y
+# CONFIG_MTD_CFI_AMDSTD is not set
+# CONFIG_MTD_AMDSTD is not set
+# CONFIG_MTD_SHARP is not set
+# CONFIG_MTD_PHYSMAP is not set
+# CONFIG_MTD_NORA is not set
+# CONFIG_MTD_PNC2000 is not set
+# CONFIG_MTD_RPXLITE is not set
+# CONFIG_MTD_SC520CDP is not set
+# CONFIG_MTD_SBC_MEDIAGX is not set
+# CONFIG_MTD_ELAN_104NC is not set
+CONFIG_MTD_SA1100=y
+# CONFIG_MTD_DC21285 is not set
+# CONFIG_MTD_IQ80310 is not set
+# CONFIG_MTD_CSTM_CFI_JEDEC is not set
+# CONFIG_MTD_JEDEC is not set
+# CONFIG_MTD_MIXMEM is not set
+# CONFIG_MTD_OCTAGON is not set
+# CONFIG_MTD_VMAX is not set
+
+#
+# NAND Flash Device Drivers
+#
+# CONFIG_MTD_NAND is not set
+# CONFIG_MTD_NAND_SPIA is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLOCK=y
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
+
+#
+# Plug and Play configuration
+#
+# CONFIG_PNP is not set
+# CONFIG_ISAPNP is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_DEV_XD is not set
+# CONFIG_PARIDE is not set
+# CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
+# CONFIG_BLK_DEV_DAC960 is not set
+CONFIG_BLK_DEV_LOOP=m
+CONFIG_BLK_DEV_NBD=m
+# CONFIG_BLK_DEV_RAM is not set
+# CONFIG_BLK_DEV_INITRD is not set
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+# CONFIG_BLK_DEV_MD is not set
+# CONFIG_MD_LINEAR is not set
+# CONFIG_MD_RAID0 is not set
+# CONFIG_MD_RAID1 is not set
+# CONFIG_MD_RAID5 is not set
+# CONFIG_BLK_DEV_LVM is not set
+
+#
+# Networking options
+#
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
+CONFIG_NETLINK=y
+CONFIG_RTNETLINK=y
+# CONFIG_NETLINK_DEV is not set
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+# CONFIG_FILTER is not set
+CONFIG_UNIX=y
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+# CONFIG_IP_ADVANCED_ROUTER is not set
+# CONFIG_IP_PNP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_IP_MROUTE is not set
+# CONFIG_ARPD is not set
+# CONFIG_INET_ECN is not set
+# CONFIG_SYN_COOKIES is not set
+
+#
+#   IP: Netfilter Configuration
+#
+# CONFIG_IP_NF_CONNTRACK is not set
+# CONFIG_IP_NF_QUEUE is not set
+# CONFIG_IP_NF_IPTABLES is not set
+# CONFIG_IP_NF_COMPAT_IPCHAINS is not set
+# CONFIG_IP_NF_COMPAT_IPFWADM is not set
+# CONFIG_IPV6 is not set
+# CONFIG_KHTTPD is not set
+# CONFIG_ATM is not set
+
+#
+#
+#
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_DECNET is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_LLC is not set
+# CONFIG_NET_DIVERT is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+# CONFIG_NET_FASTROUTE is not set
+# CONFIG_NET_HW_FLOWCONTROL is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED is not set
+
+#
+# Network device support
+#
+CONFIG_NETDEVICES=y
+
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+# CONFIG_ETHERTAP is not set
+# CONFIG_NET_SB1000 is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+# CONFIG_NET_ETHERNET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+# CONFIG_ACENIC is not set
+# CONFIG_HAMACHI is not set
+# CONFIG_YELLOWFIN is not set
+# CONFIG_SK98LIN is not set
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI is not set
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Token Ring devices
+#
+# CONFIG_TR is not set
+# CONFIG_NET_FC is not set
+# CONFIG_RCPCI is not set
+# CONFIG_SHAPER is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+
+#
+# PCMCIA network device support
+#
+CONFIG_NET_PCMCIA=y
+CONFIG_PCMCIA_3C589=m
+CONFIG_PCMCIA_3C574=m
+CONFIG_PCMCIA_FMVJ18X=m
+CONFIG_PCMCIA_PCNET=m
+CONFIG_PCMCIA_NMCLAN=m
+CONFIG_PCMCIA_SMC91C92=m
+CONFIG_PCMCIA_XIRC2PS=m
+# CONFIG_ARCNET_COM20020_CS is not set
+# CONFIG_PCMCIA_IBMTR is not set
+CONFIG_NET_PCMCIA_RADIO=y
+# CONFIG_PCMCIA_RAYCS is not set
+# CONFIG_PCMCIA_HERMES is not set
+# CONFIG_PCMCIA_NETWAVE is not set
+CONFIG_PCMCIA_WAVELAN=m
+CONFIG_AIRONET4500_CS=m
+
+#
+# Amateur Radio support
+#
+# CONFIG_HAMRADIO is not set
+
+#
+# IrDA (infrared) support
+#
+CONFIG_IRDA=m
+
+#
+# IrDA protocols
+#
+CONFIG_IRLAN=m
+# CONFIG_IRNET is not set
+CONFIG_IRCOMM=m
+# CONFIG_IRDA_ULTRA is not set
+# CONFIG_IRDA_OPTIONS is not set
+
+#
+# Infrared-port device drivers
+#
+
+#
+# SIR device drivers
+#
+# CONFIG_IRTTY_SIR is not set
+# CONFIG_IRPORT_SIR is not set
+
+#
+# FIR device drivers
+#
+# CONFIG_NSC_FIR is not set
+# CONFIG_WINBOND_FIR is not set
+# CONFIG_TOSHIBA_FIR is not set
+# CONFIG_SMC_IRCC_FIR is not set
+CONFIG_SA1100_FIR=m
+
+#
+# Dongle support
+#
+# CONFIG_DONGLE is not set
+
+#
+# ATA/IDE/MFM/RLL support
+#
+CONFIG_IDE=m
+
+#
+# IDE, ATA and ATAPI Block devices
+#
+CONFIG_BLK_DEV_IDE=m
+
+#
+# Please see Documentation/ide.txt for help/info on IDE drives
+#
+# CONFIG_BLK_DEV_HD_IDE is not set
+# CONFIG_BLK_DEV_HD is not set
+CONFIG_BLK_DEV_IDEDISK=m
+# CONFIG_IDEDISK_MULTI_MODE is not set
+# CONFIG_BLK_DEV_IDEDISK_VENDOR is not set
+# CONFIG_BLK_DEV_IDEDISK_FUJITSU is not set
+# CONFIG_BLK_DEV_IDEDISK_IBM is not set
+# CONFIG_BLK_DEV_IDEDISK_MAXTOR is not set
+# CONFIG_BLK_DEV_IDEDISK_QUANTUM is not set
+# CONFIG_BLK_DEV_IDEDISK_SEAGATE is not set
+# CONFIG_BLK_DEV_IDEDISK_WD is not set
+# CONFIG_BLK_DEV_COMMERIAL is not set
+# CONFIG_BLK_DEV_TIVO is not set
+CONFIG_BLK_DEV_IDECS=m
+# CONFIG_BLK_DEV_IDECD is not set
+# CONFIG_BLK_DEV_IDETAPE is not set
+# CONFIG_BLK_DEV_IDEFLOPPY is not set
+# CONFIG_BLK_DEV_IDESCSI is not set
+
+#
+# IDE chipset support/bugfixes
+#
+# CONFIG_BLK_DEV_CMD640 is not set
+# CONFIG_BLK_DEV_CMD640_ENHANCED is not set
+# CONFIG_BLK_DEV_ISAPNP is not set
+# CONFIG_IDE_CHIPSETS is not set
+# CONFIG_IDEDMA_AUTO is not set
+# CONFIG_DMA_NONPCI is not set
+# CONFIG_BLK_DEV_IDE_MODES is not set
+
+#
+# SCSI support
+#
+# CONFIG_SCSI is not set
+
+#
+# I2O device support
+#
+# CONFIG_I2O is not set
+# CONFIG_I2O_BLOCK is not set
+# CONFIG_I2O_LAN is not set
+# CONFIG_I2O_SCSI is not set
+# CONFIG_I2O_PROC is not set
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Input core support
+#
+# CONFIG_INPUT is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_VT_CONSOLE=y
+CONFIG_SERIAL=m
+# CONFIG_SERIAL_EXTENDED is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+CONFIG_SERIAL_SA1100=y
+CONFIG_SERIAL_SA1100_CONSOLE=y
+CONFIG_SA1100_DEFAULT_BAUDRATE=115200
+# CONFIG_TOUCHSCREEN_UCB1200 is not set
+# CONFIG_TOUCHSCREEN_BITSY is not set
+CONFIG_PROFILER=m
+# CONFIG_PFS168_SPI is not set
+# CONFIG_PFS168_DTMF is not set
+# CONFIG_PFS168_MISC is not set
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_UNIX98_PTY_COUNT=32
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# Mice
+#
+# CONFIG_BUSMOUSE is not set
+CONFIG_MOUSE=m
+# CONFIG_PSMOUSE is not set
+# CONFIG_82C710_MOUSE is not set
+# CONFIG_PC110_PAD is not set
+
+#
+# Joysticks
+#
+# CONFIG_JOYSTICK is not set
+
+#
+# Input core support is needed for joysticks
+#
+# CONFIG_QIC02_TAPE is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_INTEL_RNG is not set
+# CONFIG_NVRAM is not set
+# CONFIG_RTC is not set
+CONFIG_SA1100_RTC=m
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_FTAPE is not set
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+
+#
+# PCMCIA character devices
+#
+CONFIG_PCMCIA_SERIAL_CS=m
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# File systems
+#
+# CONFIG_QUOTA is not set
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_AUTOFS4_FS is not set
+# CONFIG_REISERFS_FS is not set
+# CONFIG_REISERFS_CHECK is not set
+# CONFIG_ADFS_FS is not set
+# CONFIG_ADFS_FS_RW is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_BFS_FS is not set
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
+# CONFIG_UMSDOS_FS is not set
+CONFIG_VFAT_FS=m
+# CONFIG_EFS_FS is not set
+# CONFIG_JFFS_FS is not set
+# CONFIG_JFFS2_FS is not set
+CONFIG_CRAMFS=y
+CONFIG_RAMFS=y
+# CONFIG_ISO9660_FS is not set
+# CONFIG_JOLIET is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_NTFS_FS is not set
+# CONFIG_NTFS_RW is not set
+# CONFIG_HPFS_FS is not set
+CONFIG_PROC_FS=y
+# CONFIG_DEVFS_FS is not set
+# CONFIG_DEVFS_MOUNT is not set
+# CONFIG_DEVFS_DEBUG is not set
+CONFIG_DEVPTS_FS=y
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_QNX4FS_RW is not set
+# CONFIG_ROMFS_FS is not set
+CONFIG_EXT2_FS=y
+# CONFIG_SYSV_FS is not set
+# CONFIG_SYSV_FS_WRITE is not set
+# CONFIG_UDF_FS is not set
+# CONFIG_UDF_RW is not set
+# CONFIG_UFS_FS is not set
+# CONFIG_UFS_FS_WRITE is not set
+
+#
+# Network File Systems
+#
+# CONFIG_CODA_FS is not set
+CONFIG_NFS_FS=m
+CONFIG_NFS_V3=y
+# CONFIG_ROOT_NFS is not set
+# CONFIG_NFSD is not set
+# CONFIG_NFSD_V3 is not set
+CONFIG_SUNRPC=m
+CONFIG_LOCKD=m
+CONFIG_LOCKD_V4=y
+CONFIG_SMB_FS=m
+# CONFIG_SMB_NLS_DEFAULT is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_NCPFS_PACKET_SIGNING is not set
+# CONFIG_NCPFS_IOCTL_LOCKING is not set
+# CONFIG_NCPFS_STRONG is not set
+# CONFIG_NCPFS_NFS_NS is not set
+# CONFIG_NCPFS_OS2_NS is not set
+# CONFIG_NCPFS_SMALLDOS is not set
+# CONFIG_NCPFS_NLS is not set
+# CONFIG_NCPFS_EXTRAS is not set
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+CONFIG_SMB_NLS=y
+CONFIG_NLS=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS_DEFAULT="iso8859-1"
+CONFIG_NLS_CODEPAGE_437=y
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+# CONFIG_NLS_CODEPAGE_850 is not set
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_ISO8859_1 is not set
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+# CONFIG_NLS_ISO8859_15 is not set
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_UTF8 is not set
+
+#
+# Console drivers
+#
+CONFIG_PC_KEYMAP=y
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_FB=y
+
+#
+# Frame-buffer support
+#
+CONFIG_FB=y
+CONFIG_DUMMY_CONSOLE=y
+# CONFIG_FB_ACORN is not set
+# CONFIG_FB_CLPS711X is not set
+CONFIG_FB_EPSON1356=y
+# CONFIG_FB_CYBER2000 is not set
+# CONFIG_FB_SA1100 is not set
+# CONFIG_FB_VIRTUAL is not set
+CONFIG_FBCON_ADVANCED=y
+# CONFIG_FBCON_MFB is not set
+# CONFIG_FBCON_CFB2 is not set
+# CONFIG_FBCON_CFB4 is not set
+CONFIG_FBCON_CFB8=y
+CONFIG_FBCON_CFB16=y
+# CONFIG_FBCON_CFB24 is not set
+# CONFIG_FBCON_CFB32 is not set
+# CONFIG_FBCON_AFB is not set
+# CONFIG_FBCON_ILBM is not set
+# CONFIG_FBCON_IPLAN2P2 is not set
+# CONFIG_FBCON_IPLAN2P4 is not set
+# CONFIG_FBCON_IPLAN2P8 is not set
+# CONFIG_FBCON_MAC is not set
+# CONFIG_FBCON_VGA_PLANES is not set
+# CONFIG_FBCON_VGA is not set
+# CONFIG_FBCON_HGA is not set
+CONFIG_FBCON_FONTWIDTH8_ONLY=y
+CONFIG_FBCON_FONTS=y
+CONFIG_FONT_8x8=y
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+
+#
+# Sound
+#
+CONFIG_SOUND=m
+CONFIG_SOUND_UDA1341=m
+# CONFIG_SOUND_SA1100_SSP is not set
+# CONFIG_SOUND_CMPCI is not set
+# CONFIG_SOUND_EMU10K1 is not set
+# CONFIG_SOUND_FUSION is not set
+# CONFIG_SOUND_CS4281 is not set
+# CONFIG_SOUND_ES1370 is not set
+# CONFIG_SOUND_ES1371 is not set
+# CONFIG_SOUND_ESSSOLO1 is not set
+# CONFIG_SOUND_MAESTRO is not set
+# CONFIG_SOUND_MAESTRO3 is not set
+# CONFIG_SOUND_ICH is not set
+# CONFIG_SOUND_SONICVIBES is not set
+# CONFIG_SOUND_TRIDENT is not set
+# CONFIG_SOUND_MSNDCLAS is not set
+# CONFIG_SOUND_MSNDPIN is not set
+# CONFIG_SOUND_VIA82CXXX is not set
+# CONFIG_SOUND_OSS is not set
+# CONFIG_SOUND_TVMIXER is not set
+
+#
+# USB support
+#
+# CONFIG_USB is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_NO_FRAME_POINTER is not set
+CONFIG_DEBUG_ERRORS=y
+# CONFIG_DEBUG_USER is not set
+# CONFIG_DEBUG_INFO is not set
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_NO_PGT_CACHE is not set
+CONFIG_DEBUG_LL=y
+# CONFIG_DEBUG_DC21285_PORT is not set
+# CONFIG_DEBUG_CLPS711X_UART2 is not set
diff -u --recursive --new-file v2.4.8/linux/arch/arm/def-configs/lart linux/arch/arm/def-configs/lart
--- v2.4.8/linux/arch/arm/def-configs/lart	Mon Sep 18 15:15:24 2000
+++ linux/arch/arm/def-configs/lart	Sun Aug 12 11:13:59 2001
@@ -1,9 +1,13 @@
 #
-# Automatically generated by make menuconfig: don't edit
+# Automatically generated make config: don't edit
 #
 CONFIG_ARM=y
+# CONFIG_EISA is not set
 # CONFIG_SBUS is not set
+# CONFIG_MCA is not set
 CONFIG_UID16=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
 
 #
 # Code maturity level options
@@ -15,62 +19,125 @@
 # Loadable module support
 #
 CONFIG_MODULES=y
-CONFIG_MODVERSIONS=y
-# CONFIG_KMOD is not set
+# CONFIG_MODVERSIONS is not set
+CONFIG_KMOD=y
 
 #
 # System Type
 #
+# CONFIG_ARCH_ANAKIN is not set
 # CONFIG_ARCH_ARCA5K is not set
 # CONFIG_ARCH_CLPS7500 is not set
+# CONFIG_ARCH_CLPS711X is not set
 # CONFIG_ARCH_CO285 is not set
 # CONFIG_ARCH_EBSA110 is not set
 # CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_L7200 is not set
 # CONFIG_ARCH_RPC is not set
 CONFIG_ARCH_SA1100=y
+# CONFIG_ARCH_SHARK is not set
+
+#
+# Archimedes/A5000 Implementations
+#
+
+#
+# Archimedes/A5000 Implementations (select only ONE)
+#
+# CONFIG_ARCH_ARC is not set
+# CONFIG_ARCH_A5K is not set
+
+#
+# Footbridge Implementations
+#
+# CONFIG_ARCH_CATS is not set
+# CONFIG_ARCH_PERSONAL_SERVER is not set
+# CONFIG_ARCH_EBSA285_ADDIN is not set
+# CONFIG_ARCH_EBSA285_HOST is not set
+# CONFIG_ARCH_NETWINDER is not set
+
+#
+# SA11x0 Implementations
+#
 # CONFIG_SA1100_ASSABET is not set
+# CONFIG_ASSABET_NEPONSET is not set
 # CONFIG_SA1100_BRUTUS is not set
 # CONFIG_SA1100_CERF is not set
 # CONFIG_SA1100_BITSY is not set
-CONFIG_SA1100_LART=y
-# CONFIG_SA1100_THINCLIENT is not set
+# CONFIG_SA1100_EXTENEX1 is not set
+# CONFIG_SA1100_FLEXANET is not set
+# CONFIG_SA1100_FREEBIRD is not set
 # CONFIG_SA1100_GRAPHICSCLIENT is not set
+# CONFIG_SA1100_JORNADA720 is not set
+# CONFIG_SA1100_HUW_WEBPANEL is not set
+# CONFIG_SA1100_ITSY is not set
+CONFIG_SA1100_LART=y
 # CONFIG_SA1100_NANOENGINE is not set
+# CONFIG_SA1100_OMNIMETER is not set
+# CONFIG_SA1100_PANGOLIN is not set
+# CONFIG_SA1100_PLEB is not set
+# CONFIG_SA1100_SHERMAN is not set
+# CONFIG_SA1100_SIMPAD is not set
+# CONFIG_SA1100_PFS168 is not set
 # CONFIG_SA1100_VICTOR is not set
-# CONFIG_ANGELBOOT is not set
-CONFIG_SA1100_FREQUENCY_SCALE=m
-CONFIG_SA1100_VOLTAGE_SCALE=y
+# CONFIG_SA1100_XP860 is not set
+# CONFIG_SA1100_YOPY is not set
+CONFIG_SA1100_USB=m
+CONFIG_SA1100_USB_NETLINK=m
+CONFIG_SA1100_USB_CHAR=m
+
+#
+# CLPS711X/EP721X Implementations
+#
+# CONFIG_ARCH_P720T is not set
 # CONFIG_ARCH_ACORN is not set
 # CONFIG_FOOTBRIDGE is not set
 # CONFIG_FOOTBRIDGE_HOST is not set
 # CONFIG_FOOTBRIDGE_ADDIN is not set
 CONFIG_CPU_32=y
 # CONFIG_CPU_26 is not set
+
+#
+# Processor Type
+#
+# CONFIG_CPU_32v3 is not set
 CONFIG_CPU_32v4=y
+# CONFIG_CPU_ARM610 is not set
+# CONFIG_CPU_ARM710 is not set
+# CONFIG_CPU_ARM720T is not set
+# CONFIG_CPU_ARM920T is not set
+# CONFIG_CPU_ARM1020 is not set
+# CONFIG_CPU_SA110 is not set
 CONFIG_CPU_SA1100=y
 CONFIG_DISCONTIGMEM=y
-# CONFIG_PCI is not set
-# CONFIG_ISA is not set
-# CONFIG_ISA_DMA is not set
+# CONFIG_CPU_BIG_ENDIAN is not set
 
 #
 # General setup
 #
+# CONFIG_PCI is not set
+# CONFIG_ISA is not set
+# CONFIG_ISA_DMA is not set
+CONFIG_CPU_FREQ=y
 # CONFIG_HOTPLUG is not set
 # CONFIG_PCMCIA is not set
 CONFIG_NET=y
 CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
-# CONFIG_SYSCTL is not set
-CONFIG_NWFPE=y
+CONFIG_SYSCTL=y
+CONFIG_FPE_NWFPE=y
+# CONFIG_FPE_FASTFPE is not set
 CONFIG_KCORE_ELF=y
 # CONFIG_KCORE_AOUT is not set
 CONFIG_BINFMT_AOUT=y
 CONFIG_BINFMT_ELF=y
 # CONFIG_BINFMT_MISC is not set
 CONFIG_PM=y
+CONFIG_APM=m
 # CONFIG_ARTHUR is not set
-CONFIG_CMDLINE="console=ttyS0,9600"
+CONFIG_CMDLINE="console=ttySA0,9600"
+# CONFIG_PFS168_CMDLINE is not set
 CONFIG_LEDS=y
 # CONFIG_LEDS_TIMER is not set
 CONFIG_LEDS_CPU=y
@@ -84,7 +151,96 @@
 #
 # Memory Technology Devices (MTD)
 #
-# CONFIG_MTD is not set
+CONFIG_MTD=m
+CONFIG_MTD_DEBUG=y
+CONFIG_MTD_DEBUG_VERBOSE=1
+# CONFIG_MTD_PARTITIONS is not set
+# CONFIG_MTD_REDBOOT_PARTS is not set
+# CONFIG_MTD_BOOTLDR_PARTS is not set
+# CONFIG_MTD_AFS_PARTS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=m
+CONFIG_MTD_BLOCK=m
+CONFIG_MTD_BLOCK_RO=m
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
+
+#
+# RAM/ROM/Flash chip drivers
+#
+CONFIG_MTD_CFI=m
+CONFIG_MTD_CFI_ADV_OPTIONS=y
+CONFIG_MTD_CFI_NOSWAP=y
+# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
+# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
+CONFIG_MTD_CFI_GEOMETRY=y
+# CONFIG_MTD_CFI_B1 is not set
+# CONFIG_MTD_CFI_B2 is not set
+CONFIG_MTD_CFI_B4=y
+# CONFIG_MTD_CFI_I1 is not set
+CONFIG_MTD_CFI_I2=y
+# CONFIG_MTD_CFI_I4 is not set
+CONFIG_MTD_CFI_INTELEXT=m
+# CONFIG_MTD_CFI_AMDSTD is not set
+# CONFIG_MTD_AMDSTD is not set
+# CONFIG_MTD_SHARP is not set
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_JEDEC is not set
+
+#
+# Mapping drivers for chip access
+#
+# CONFIG_MTD_PHYSMAP is not set
+# CONFIG_MTD_SUN_UFLASH is not set
+# CONFIG_MTD_NORA is not set
+# CONFIG_MTD_PNC2000 is not set
+# CONFIG_MTD_RPXLITE is not set
+# CONFIG_MTD_TQM8XXL is not set
+# CONFIG_MTD_SC520CDP is not set
+# CONFIG_MTD_NETSC520 is not set
+# CONFIG_MTD_SBC_GXX is not set
+# CONFIG_MTD_ELAN_104NC is not set
+# CONFIG_MTD_SA1100 is not set
+# CONFIG_MTD_SA1100_REDBOOT_PARTITIONS is not set
+# CONFIG_MTD_SA1100_BOOTLDR_PARTITIONS is not set
+# CONFIG_MTD_DC21285 is not set
+# CONFIG_MTD_IQ80310 is not set
+# CONFIG_MTD_DBOX2 is not set
+# CONFIG_MTD_CSTM_MIPS_IXX is not set
+# CONFIG_MTD_CFI_FLAGADM is not set
+# CONFIG_MTD_ARM_INTEGRATOR is not set
+# CONFIG_MTD_SOLUTIONENGINE is not set
+# CONFIG_MTD_MIXMEM is not set
+# CONFIG_MTD_OCTAGON is not set
+# CONFIG_MTD_VMAX is not set
+# CONFIG_MTD_OCELOT is not set
+# CONFIG_MTD_L440GX is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_PMC551 is not set
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_LART is not set
+# CONFIG_MTD_MTDRAM is not set
+# CONFIG_MTD_BLKMTD is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOC1000 is not set
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOCPROBE is not set
+
+#
+# NAND Flash Device Drivers
+#
+# CONFIG_MTD_NAND is not set
 
 #
 # Plug and Play configuration
@@ -99,19 +255,24 @@
 # CONFIG_BLK_DEV_XD is not set
 # CONFIG_PARIDE is not set
 # CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
 # CONFIG_BLK_DEV_DAC960 is not set
 # CONFIG_BLK_DEV_LOOP is not set
 # CONFIG_BLK_DEV_NBD is not set
-# CONFIG_BLK_DEV_LVM is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BLK_DEV_INITRD=y
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
 # CONFIG_BLK_DEV_MD is not set
 # CONFIG_MD_LINEAR is not set
 # CONFIG_MD_RAID0 is not set
 # CONFIG_MD_RAID1 is not set
 # CONFIG_MD_RAID5 is not set
-CONFIG_BLK_DEV_RAM=y
-CONFIG_BLK_DEV_RAM_SIZE=4096
-CONFIG_BLK_DEV_INITRD=y
-CONFIG_BLK_DEV_FLASH=m
+# CONFIG_BLK_DEV_LVM is not set
 
 #
 # Networking options
@@ -126,15 +287,17 @@
 # CONFIG_IP_MULTICAST is not set
 # CONFIG_IP_ADVANCED_ROUTER is not set
 # CONFIG_IP_PNP is not set
-# CONFIG_IP_ROUTER is not set
 # CONFIG_NET_IPIP is not set
 # CONFIG_NET_IPGRE is not set
-# CONFIG_IP_ALIAS is not set
-# CONFIG_INET_ECN is not set
-# CONFIG_SYN_COOKIES is not set
+CONFIG_INET_ECN=y
+CONFIG_SYN_COOKIES=y
 # CONFIG_IPV6 is not set
 # CONFIG_KHTTPD is not set
 # CONFIG_ATM is not set
+
+#
+#
+#
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
 # CONFIG_DECNET is not set
@@ -142,6 +305,7 @@
 # CONFIG_X25 is not set
 # CONFIG_LAPB is not set
 # CONFIG_LLC is not set
+# CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
 # CONFIG_NET_FASTROUTE is not set
@@ -161,62 +325,49 @@
 # ARCnet devices
 #
 # CONFIG_ARCNET is not set
-# CONFIG_DUMMY is not set
+CONFIG_DUMMY=m
 # CONFIG_BONDING is not set
 # CONFIG_EQUALIZER is not set
-# CONFIG_NET_SB1000 is not set
+# CONFIG_TUN is not set
 
 #
 # Ethernet (10 or 100Mbit)
 #
 CONFIG_NET_ETHERNET=y
-# CONFIG_ARM_AM79C961A is not set
+# CONFIG_SUNLANCE is not set
+# CONFIG_SUNBMAC is not set
+# CONFIG_SUNQE is not set
+# CONFIG_SUNLANCE is not set
+# CONFIG_SUNGEM is not set
 # CONFIG_NET_VENDOR_3COM is not set
 # CONFIG_LANCE is not set
 # CONFIG_NET_VENDOR_SMC is not set
 # CONFIG_NET_VENDOR_RACAL is not set
-# CONFIG_AT1700 is not set
-# CONFIG_DEPCA is not set
 # CONFIG_NET_ISA is not set
-CONFIG_NET_PCI=y
-# CONFIG_PCNET32 is not set
-# CONFIG_ADAPTEC_STARFIRE is not set
-# CONFIG_AC3200 is not set
-# CONFIG_APRICOT is not set
-CONFIG_CS89x0=m
-# CONFIG_DE4X5 is not set
-# CONFIG_TULIP is not set
-# CONFIG_DGRS is not set
-# CONFIG_DM9102 is not set
-# CONFIG_EEPRO100 is not set
-# CONFIG_LNE390 is not set
-# CONFIG_NE3210 is not set
-# CONFIG_NE2K_PCI is not set
-# CONFIG_RTL8129 is not set
-# CONFIG_8139TOO is not set
-# CONFIG_SIS900 is not set
-# CONFIG_TLAN is not set
-# CONFIG_VIA_RHINE is not set
-# CONFIG_ES3210 is not set
-# CONFIG_EPIC100 is not set
+# CONFIG_NET_PCI is not set
 # CONFIG_NET_POCKET is not set
 
 #
 # Ethernet (1000 Mbit)
 #
-# CONFIG_YELLOWFIN is not set
 # CONFIG_ACENIC is not set
+# CONFIG_ACENIC_OMIT_TIGON_I is not set
+# CONFIG_MYRI_SBUS is not set
+# CONFIG_HAMACHI is not set
+# CONFIG_YELLOWFIN is not set
 # CONFIG_SK98LIN is not set
 # CONFIG_FDDI is not set
 # CONFIG_HIPPI is not set
-CONFIG_PPP=y
+# CONFIG_PLIP is not set
+CONFIG_PPP=m
 # CONFIG_PPP_MULTILINK is not set
-CONFIG_PPP_ASYNC=y
+# CONFIG_PPP_FILTER is not set
+CONFIG_PPP_ASYNC=m
 # CONFIG_PPP_SYNC_TTY is not set
 CONFIG_PPP_DEFLATE=m
 CONFIG_PPP_BSDCOMP=m
 # CONFIG_PPPOE is not set
-CONFIG_SLIP=y
+CONFIG_SLIP=m
 CONFIG_SLIP_COMPRESSED=y
 # CONFIG_SLIP_SMART is not set
 # CONFIG_SLIP_MODE_SLIP6 is not set
@@ -247,7 +398,48 @@
 #
 # IrDA (infrared) support
 #
-# CONFIG_IRDA is not set
+CONFIG_IRDA=m
+
+#
+# IrDA protocols
+#
+CONFIG_IRLAN=m
+CONFIG_IRNET=m
+CONFIG_IRCOMM=m
+# CONFIG_IRDA_ULTRA is not set
+CONFIG_IRDA_OPTIONS=y
+
+#
+#   IrDA options
+#
+CONFIG_IRDA_CACHE_LAST_LSAP=y
+# CONFIG_IRDA_FAST_RR is not set
+CONFIG_IRDA_DEBUG=y
+
+#
+# Infrared-port device drivers
+#
+
+#
+# SIR device drivers
+#
+# CONFIG_IRTTY_SIR is not set
+# CONFIG_IRPORT_SIR is not set
+
+#
+# Dongle support
+#
+# CONFIG_DONGLE is not set
+
+#
+# FIR device drivers
+#
+# CONFIG_USB_IRDA is not set
+# CONFIG_NSC_FIR is not set
+# CONFIG_WINBOND_FIR is not set
+# CONFIG_TOSHIBA_FIR is not set
+# CONFIG_SMC_IRCC_FIR is not set
+CONFIG_SA1100_FIR=m
 
 #
 # ATA/IDE/MFM/RLL support
@@ -258,6 +450,10 @@
 # IDE, ATA and ATAPI Block devices
 #
 CONFIG_BLK_DEV_IDE=m
+
+#
+# Please see Documentation/ide.txt for help/info on IDE drives
+#
 # CONFIG_BLK_DEV_HD_IDE is not set
 # CONFIG_BLK_DEV_HD is not set
 CONFIG_BLK_DEV_IDEDISK=m
@@ -276,6 +472,10 @@
 # CONFIG_BLK_DEV_IDETAPE is not set
 # CONFIG_BLK_DEV_IDEFLOPPY is not set
 # CONFIG_BLK_DEV_IDESCSI is not set
+
+#
+# IDE chipset support/bugfixes
+#
 # CONFIG_BLK_DEV_CMD640 is not set
 # CONFIG_BLK_DEV_CMD640_ENHANCED is not set
 # CONFIG_BLK_DEV_ISAPNP is not set
@@ -304,17 +504,42 @@
 # CONFIG_ISDN is not set
 
 #
+# Input core support
+#
+# CONFIG_INPUT is not set
+
+#
 # Character devices
 #
 # CONFIG_VT is not set
+# CONFIG_SERIAL is not set
+# CONFIG_SERIAL_EXTENDED is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+# CONFIG_SERIAL_21285 is not set
+# CONFIG_SERIAL_21285_OLD is not set
+# CONFIG_SERIAL_21285_CONSOLE is not set
+# CONFIG_SERIAL_AMBA is not set
+# CONFIG_SERIAL_AMBA_CONSOLE is not set
+# CONFIG_SERIAL_CLPS711X is not set
+# CONFIG_SERIAL_CLPS711X_CONSOLE is not set
 CONFIG_SERIAL_SA1100=y
 CONFIG_SERIAL_SA1100_CONSOLE=y
+CONFIG_SA1100_DEFAULT_BAUDRATE=9600
+# CONFIG_SERIAL_8250 is not set
+# CONFIG_SERIAL_8250_CONSOLE is not set
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_UNIX98_PTY_COUNT=256
+CONFIG_UCB1200=m
 CONFIG_TOUCHSCREEN_UCB1200=m
+CONFIG_AUDIO_UCB1200=m
+CONFIG_ADC_UCB1200=m
 # CONFIG_TOUCHSCREEN_BITSY is not set
-# CONFIG_SERIAL is not set
-# CONFIG_SERIAL_EXTENDED is not set
-# CONFIG_SERIAL_NONSTANDARD is not set
-# CONFIG_UNIX98_PTYS is not set
+CONFIG_PROFILER=m
+# CONFIG_PFS168_SPI is not set
+# CONFIG_PFS168_DTMF is not set
+# CONFIG_PFS168_MISC is not set
 
 #
 # I2C support
@@ -331,6 +556,10 @@
 # Joysticks
 #
 # CONFIG_JOYSTICK is not set
+
+#
+# Input core support is needed for joysticks
+#
 # CONFIG_QIC02_TAPE is not set
 
 #
@@ -340,11 +569,7 @@
 # CONFIG_INTEL_RNG is not set
 # CONFIG_NVRAM is not set
 # CONFIG_RTC is not set
-
-#
-# Video For Linux
-#
-# CONFIG_VIDEO_DEV is not set
+CONFIG_SA1100_RTC=m
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
 # CONFIG_APPLICOM is not set
@@ -357,11 +582,18 @@
 # CONFIG_DRM is not set
 
 #
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
 # File systems
 #
 # CONFIG_QUOTA is not set
 # CONFIG_AUTOFS_FS is not set
 # CONFIG_AUTOFS4_FS is not set
+CONFIG_REISERFS_FS=m
+# CONFIG_REISERFS_CHECK is not set
 # CONFIG_ADFS_FS is not set
 # CONFIG_ADFS_FS_RW is not set
 # CONFIG_AFFS_FS is not set
@@ -372,12 +604,17 @@
 # CONFIG_UMSDOS_FS is not set
 # CONFIG_VFAT_FS is not set
 # CONFIG_EFS_FS is not set
-# CONFIG_JFFS_FS is not set
-# CONFIG_CRAMFS is not set
-# CONFIG_RAMFS is not set
-# CONFIG_ISO9660_FS is not set
-# CONFIG_JOLIET is not set
+CONFIG_JFFS_FS=m
+CONFIG_JFFS_FS_VERBOSE=1
+CONFIG_JFFS2_FS=m
+CONFIG_JFFS2_FS_DEBUG=1
+CONFIG_CRAMFS=m
+CONFIG_TMPFS=y
+CONFIG_RAMFS=m
+CONFIG_ISO9660_FS=m
+CONFIG_JOLIET=y
 # CONFIG_MINIX_FS is not set
+# CONFIG_VXFS_FS is not set
 # CONFIG_NTFS_FS is not set
 # CONFIG_NTFS_RW is not set
 # CONFIG_HPFS_FS is not set
@@ -385,14 +622,13 @@
 # CONFIG_DEVFS_FS is not set
 # CONFIG_DEVFS_MOUNT is not set
 # CONFIG_DEVFS_DEBUG is not set
-# CONFIG_DEVPTS_FS is not set
+CONFIG_DEVPTS_FS=y
 # CONFIG_QNX4FS_FS is not set
 # CONFIG_QNX4FS_RW is not set
 # CONFIG_ROMFS_FS is not set
 CONFIG_EXT2_FS=y
 # CONFIG_SYSV_FS is not set
-# CONFIG_SYSV_FS_WRITE is not set
-# CONFIG_UDF_FS is not set
+CONFIG_UDF_FS=m
 # CONFIG_UDF_RW is not set
 # CONFIG_UFS_FS is not set
 # CONFIG_UFS_FS_WRITE is not set
@@ -402,12 +638,13 @@
 #
 # CONFIG_CODA_FS is not set
 CONFIG_NFS_FS=m
-# CONFIG_NFS_V3 is not set
+CONFIG_NFS_V3=y
 # CONFIG_ROOT_NFS is not set
-# CONFIG_NFSD is not set
-# CONFIG_NFSD_V3 is not set
+CONFIG_NFSD=m
+CONFIG_NFSD_V3=y
 CONFIG_SUNRPC=m
 CONFIG_LOCKD=m
+CONFIG_LOCKD_V4=y
 # CONFIG_SMB_FS is not set
 # CONFIG_NCP_FS is not set
 # CONFIG_NCPFS_PACKET_SIGNING is not set
@@ -416,8 +653,6 @@
 # CONFIG_NCPFS_NFS_NS is not set
 # CONFIG_NCPFS_OS2_NS is not set
 # CONFIG_NCPFS_SMALLDOS is not set
-# CONFIG_NCPFS_MOUNT_SUBDIR is not set
-# CONFIG_NCPFS_NDS_DOMAINS is not set
 # CONFIG_NCPFS_NLS is not set
 # CONFIG_NCPFS_EXTRAS is not set
 
@@ -426,57 +661,75 @@
 #
 # CONFIG_PARTITION_ADVANCED is not set
 CONFIG_MSDOS_PARTITION=y
-# CONFIG_NLS is not set
+# CONFIG_SMB_NLS is not set
+CONFIG_NLS=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS_DEFAULT="iso8859-1"
+CONFIG_NLS_CODEPAGE_437=m
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+CONFIG_NLS_CODEPAGE_850=m
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
+CONFIG_NLS_ISO8859_1=m
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+CONFIG_NLS_ISO8859_15=m
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+CONFIG_NLS_UTF8=m
 
 #
 # Sound
 #
 CONFIG_SOUND=m
+# CONFIG_SOUND_ASSABET_UDA1341 is not set
+# CONFIG_SOUND_BITSY_UDA1341 is not set
+# CONFIG_SOUND_SA1111_UDA1341 is not set
+CONFIG_SOUND_SA1100SSP=m
 # CONFIG_SOUND_CMPCI is not set
 # CONFIG_SOUND_EMU10K1 is not set
+# CONFIG_SOUND_FUSION is not set
+# CONFIG_SOUND_CS4281 is not set
 # CONFIG_SOUND_ES1370 is not set
 # CONFIG_SOUND_ES1371 is not set
 # CONFIG_SOUND_ESSSOLO1 is not set
 # CONFIG_SOUND_MAESTRO is not set
+# CONFIG_SOUND_MAESTRO3 is not set
+# CONFIG_SOUND_ICH is not set
 # CONFIG_SOUND_SONICVIBES is not set
 # CONFIG_SOUND_TRIDENT is not set
 # CONFIG_SOUND_MSNDCLAS is not set
 # CONFIG_SOUND_MSNDPIN is not set
 # CONFIG_SOUND_VIA82CXXX is not set
-CONFIG_SOUND_OSS=m
-CONFIG_SOUND_TRACEINIT=y
-# CONFIG_SOUND_DMAP is not set
-# CONFIG_SOUND_AD1816 is not set
-# CONFIG_SOUND_SGALAXY is not set
-# CONFIG_SOUND_ADLIB is not set
-# CONFIG_SOUND_ACI_MIXER is not set
-# CONFIG_SOUND_CS4232 is not set
-# CONFIG_SOUND_SSCAPE is not set
-# CONFIG_SOUND_GUS is not set
-# CONFIG_SOUND_ICH is not set
-# CONFIG_SOUND_VMIDI is not set
-# CONFIG_SOUND_TRIX is not set
-# CONFIG_SOUND_MSS is not set
-# CONFIG_SOUND_MPU401 is not set
-# CONFIG_SOUND_NM256 is not set
-# CONFIG_SOUND_MAD16 is not set
-# CONFIG_SOUND_PAS is not set
-# CONFIG_PAS_JOYSTICK is not set
-# CONFIG_SOUND_PSS is not set
-# CONFIG_SOUND_SOFTOSS is not set
-# CONFIG_SOUND_SB is not set
-# CONFIG_SOUND_AWE32_SYNTH is not set
-# CONFIG_SOUND_WAVEFRONT is not set
-# CONFIG_SOUND_MAUI is not set
-# CONFIG_SOUND_YM3812 is not set
-# CONFIG_SOUND_OPL3SA1 is not set
-# CONFIG_SOUND_OPL3SA2 is not set
-# CONFIG_SOUND_YMPCI is not set
-# CONFIG_SOUND_UART6850 is not set
-# CONFIG_SOUND_AEDSP16 is not set
-# CONFIG_SOUND_VIDC is not set
-# CONFIG_SOUND_WAVEARTIST is not set
-CONFIG_SOUND_SA1100_SSP=m
+# CONFIG_MIDI_VIA82CXXX is not set
+# CONFIG_SOUND_OSS is not set
 # CONFIG_SOUND_TVMIXER is not set
 
 #
@@ -485,11 +738,19 @@
 # CONFIG_USB is not set
 
 #
+# Bluetooth support
+#
+# CONFIG_BLUEZ is not set
+
+#
 # Kernel hacking
 #
-CONFIG_FRAME_POINTER=y
+# CONFIG_NO_FRAME_POINTER is not set
 CONFIG_DEBUG_ERRORS=y
 CONFIG_DEBUG_USER=y
 # CONFIG_DEBUG_INFO is not set
 CONFIG_MAGIC_SYSRQ=y
+# CONFIG_NO_PGT_CACHE is not set
 CONFIG_DEBUG_LL=y
+# CONFIG_DEBUG_DC21285_PORT is not set
+# CONFIG_DEBUG_CLPS711X_UART2 is not set
diff -u --recursive --new-file v2.4.8/linux/arch/arm/def-configs/neponset linux/arch/arm/def-configs/neponset
--- v2.4.8/linux/arch/arm/def-configs/neponset	Mon Nov 27 17:07:59 2000
+++ linux/arch/arm/def-configs/neponset	Sun Aug 12 11:13:59 2001
@@ -2,8 +2,12 @@
 # Automatically generated make config: don't edit
 #
 CONFIG_ARM=y
+# CONFIG_EISA is not set
 # CONFIG_SBUS is not set
+# CONFIG_MCA is not set
 CONFIG_UID16=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
 
 #
 # Code maturity level options
@@ -21,22 +25,37 @@
 #
 # System Type
 #
+# CONFIG_ARCH_ANAKIN is not set
 # CONFIG_ARCH_ARCA5K is not set
 # CONFIG_ARCH_CLPS7500 is not set
+# CONFIG_ARCH_CLPS711X is not set
 # CONFIG_ARCH_CO285 is not set
 # CONFIG_ARCH_EBSA110 is not set
 # CONFIG_ARCH_FOOTBRIDGE is not set
 # CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_L7200 is not set
 # CONFIG_ARCH_RPC is not set
 CONFIG_ARCH_SA1100=y
+# CONFIG_ARCH_SHARK is not set
 
 #
 # Archimedes/A5000 Implementations
 #
 
 #
+# Archimedes/A5000 Implementations (select only ONE)
+#
+# CONFIG_ARCH_ARC is not set
+# CONFIG_ARCH_A5K is not set
+
+#
 # Footbridge Implementations
 #
+# CONFIG_ARCH_CATS is not set
+# CONFIG_ARCH_PERSONAL_SERVER is not set
+# CONFIG_ARCH_EBSA285_ADDIN is not set
+# CONFIG_ARCH_EBSA285_HOST is not set
+# CONFIG_ARCH_NETWINDER is not set
 
 #
 # SA11x0 Implementations
@@ -46,16 +65,33 @@
 # CONFIG_SA1100_BRUTUS is not set
 # CONFIG_SA1100_CERF is not set
 # CONFIG_SA1100_BITSY is not set
-# CONFIG_SA1100_LART is not set
+# CONFIG_SA1100_EXTENEX1 is not set
+# CONFIG_SA1100_FLEXANET is not set
+# CONFIG_SA1100_FREEBIRD is not set
 # CONFIG_SA1100_GRAPHICSCLIENT is not set
+# CONFIG_SA1100_JORNADA720 is not set
+# CONFIG_SA1100_HUW_WEBPANEL is not set
+# CONFIG_SA1100_ITSY is not set
+# CONFIG_SA1100_LART is not set
 # CONFIG_SA1100_NANOENGINE is not set
-# CONFIG_SA1100_VICTOR is not set
+# CONFIG_SA1100_OMNIMETER is not set
+# CONFIG_SA1100_PANGOLIN is not set
+# CONFIG_SA1100_PLEB is not set
 # CONFIG_SA1100_SHERMAN is not set
+# CONFIG_SA1100_SIMPAD is not set
+# CONFIG_SA1100_PFS168 is not set
+# CONFIG_SA1100_VICTOR is not set
 # CONFIG_SA1100_XP860 is not set
-CONFIG_ANGELBOOT=y
+# CONFIG_SA1100_YOPY is not set
 CONFIG_SA1111=y
-CONFIG_SA1100_FREQUENCY_SCALE=y
-# CONFIG_SA1100_VOLTAGE_SCALE is not set
+CONFIG_SA1100_USB=m
+CONFIG_SA1100_USB_NETLINK=m
+CONFIG_SA1100_USB_CHAR=m
+
+#
+# CLPS711X/EP721X Implementations
+#
+# CONFIG_ARCH_P720T is not set
 # CONFIG_ARCH_ACORN is not set
 # CONFIG_FOOTBRIDGE is not set
 # CONFIG_FOOTBRIDGE_HOST is not set
@@ -66,9 +102,17 @@
 #
 # Processor Type
 #
+# CONFIG_CPU_32v3 is not set
 CONFIG_CPU_32v4=y
+# CONFIG_CPU_ARM610 is not set
+# CONFIG_CPU_ARM710 is not set
+# CONFIG_CPU_ARM720T is not set
+# CONFIG_CPU_ARM920T is not set
+# CONFIG_CPU_ARM1020 is not set
+# CONFIG_CPU_SA110 is not set
 CONFIG_CPU_SA1100=y
 CONFIG_DISCONTIGMEM=y
+# CONFIG_CPU_BIG_ENDIAN is not set
 
 #
 # General setup
@@ -76,29 +120,33 @@
 # CONFIG_PCI is not set
 # CONFIG_ISA is not set
 # CONFIG_ISA_DMA is not set
-CONFIG_PC_KEYMAP=y
+# CONFIG_CPU_FREQ is not set
 CONFIG_HOTPLUG=y
 
 #
 # PCMCIA/CardBus support
 #
 CONFIG_PCMCIA=y
-# CONFIG_PCMCIA_DEBUG is not set
-CONFIG_SA1100_PCMCIA=y
-CONFIG_VIRTUAL_BUS=y
+# CONFIG_I82365 is not set
+# CONFIG_TCIC is not set
+# CONFIG_PCMCIA_CLPS6700 is not set
+CONFIG_PCMCIA_SA1100=y
 CONFIG_NET=y
 CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
-CONFIG_NWFPE=y
+CONFIG_FPE_NWFPE=y
+# CONFIG_FPE_FASTFPE is not set
 CONFIG_KCORE_ELF=y
 # CONFIG_KCORE_AOUT is not set
 # CONFIG_BINFMT_AOUT is not set
 CONFIG_BINFMT_ELF=y
 # CONFIG_BINFMT_MISC is not set
 # CONFIG_PM is not set
+# CONFIG_APM is not set
 # CONFIG_ARTHUR is not set
-CONFIG_CMDLINE="keepinitrd"
+CONFIG_CMDLINE=""
+# CONFIG_PFS168_CMDLINE is not set
 CONFIG_LEDS=y
 CONFIG_LEDS_TIMER=y
 CONFIG_LEDS_CPU=y
@@ -112,7 +160,85 @@
 #
 # Memory Technology Devices (MTD)
 #
-# CONFIG_MTD is not set
+CONFIG_MTD=m
+# CONFIG_MTD_DEBUG is not set
+CONFIG_MTD_PARTITIONS=m
+CONFIG_MTD_REDBOOT_PARTS=m
+CONFIG_MTD_BOOTLDR_PARTS=m
+# CONFIG_MTD_AFS_PARTS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=m
+CONFIG_MTD_BLOCK=m
+# CONFIG_MTD_BLOCK_RO is not set
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
+
+#
+# RAM/ROM/Flash chip drivers
+#
+CONFIG_MTD_CFI=m
+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
+CONFIG_MTD_CFI_INTELEXT=m
+# CONFIG_MTD_CFI_AMDSTD is not set
+# CONFIG_MTD_AMDSTD is not set
+# CONFIG_MTD_SHARP is not set
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_JEDEC is not set
+
+#
+# Mapping drivers for chip access
+#
+# CONFIG_MTD_PHYSMAP is not set
+# CONFIG_MTD_SUN_UFLASH is not set
+# CONFIG_MTD_NORA is not set
+# CONFIG_MTD_PNC2000 is not set
+# CONFIG_MTD_RPXLITE is not set
+# CONFIG_MTD_TQM8XXL is not set
+# CONFIG_MTD_SC520CDP is not set
+# CONFIG_MTD_NETSC520 is not set
+# CONFIG_MTD_SBC_GXX is not set
+# CONFIG_MTD_ELAN_104NC is not set
+CONFIG_MTD_SA1100=m
+# CONFIG_MTD_SA1100_REDBOOT_PARTITIONS is not set
+# CONFIG_MTD_SA1100_BOOTLDR_PARTITIONS is not set
+# CONFIG_MTD_DC21285 is not set
+# CONFIG_MTD_IQ80310 is not set
+# CONFIG_MTD_DBOX2 is not set
+# CONFIG_MTD_CSTM_MIPS_IXX is not set
+# CONFIG_MTD_CFI_FLAGADM is not set
+# CONFIG_MTD_ARM_INTEGRATOR is not set
+# CONFIG_MTD_SOLUTIONENGINE is not set
+# CONFIG_MTD_MIXMEM is not set
+# CONFIG_MTD_OCTAGON is not set
+# CONFIG_MTD_VMAX is not set
+# CONFIG_MTD_OCELOT is not set
+# CONFIG_MTD_L440GX is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_PMC551 is not set
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_LART is not set
+# CONFIG_MTD_MTDRAM is not set
+# CONFIG_MTD_BLKMTD is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOC1000 is not set
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOCPROBE is not set
+
+#
+# NAND Flash Device Drivers
+#
+# CONFIG_MTD_NAND is not set
 
 #
 # Plug and Play configuration
@@ -127,19 +253,24 @@
 # CONFIG_BLK_DEV_XD is not set
 # CONFIG_PARIDE is not set
 # CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
 # CONFIG_BLK_DEV_DAC960 is not set
-# CONFIG_BLK_DEV_LOOP is not set
+CONFIG_BLK_DEV_LOOP=m
 # CONFIG_BLK_DEV_NBD is not set
-# CONFIG_BLK_DEV_LVM is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BLK_DEV_INITRD=y
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
 # CONFIG_BLK_DEV_MD is not set
 # CONFIG_MD_LINEAR is not set
 # CONFIG_MD_RAID0 is not set
 # CONFIG_MD_RAID1 is not set
 # CONFIG_MD_RAID5 is not set
-CONFIG_BLK_DEV_RAM=y
-CONFIG_BLK_DEV_RAM_SIZE=4096
-CONFIG_BLK_DEV_INITRD=y
-# CONFIG_BLK_DEV_FLASH is not set
+# CONFIG_BLK_DEV_LVM is not set
 
 #
 # Networking options
@@ -171,6 +302,7 @@
 # CONFIG_X25 is not set
 # CONFIG_LAPB is not set
 # CONFIG_LLC is not set
+# CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
 # CONFIG_NET_FASTROUTE is not set
@@ -194,23 +326,25 @@
 # CONFIG_BONDING is not set
 # CONFIG_EQUALIZER is not set
 # CONFIG_TUN is not set
-# CONFIG_NET_SB1000 is not set
 
 #
 # Ethernet (10 or 100Mbit)
 #
 CONFIG_NET_ETHERNET=y
-# CONFIG_ARM_AM79C961A is not set
+# CONFIG_SUNLANCE is not set
+# CONFIG_SUNBMAC is not set
+# CONFIG_SUNQE is not set
+# CONFIG_SUNLANCE is not set
+# CONFIG_SUNGEM is not set
 # CONFIG_NET_VENDOR_3COM is not set
 # CONFIG_LANCE is not set
 CONFIG_NET_VENDOR_SMC=y
 # CONFIG_WD80x3 is not set
+# CONFIG_ULTRAMCA is not set
 # CONFIG_ULTRA is not set
 # CONFIG_ULTRA32 is not set
 CONFIG_SMC9194=y
 # CONFIG_NET_VENDOR_RACAL is not set
-# CONFIG_AT1700 is not set
-# CONFIG_DEPCA is not set
 # CONFIG_NET_ISA is not set
 # CONFIG_NET_PCI is not set
 # CONFIG_NET_POCKET is not set
@@ -218,11 +352,15 @@
 #
 # Ethernet (1000 Mbit)
 #
-# CONFIG_YELLOWFIN is not set
 # CONFIG_ACENIC is not set
+# CONFIG_ACENIC_OMIT_TIGON_I is not set
+# CONFIG_MYRI_SBUS is not set
+# CONFIG_HAMACHI is not set
+# CONFIG_YELLOWFIN is not set
 # CONFIG_SK98LIN is not set
 # CONFIG_FDDI is not set
 # CONFIG_HIPPI is not set
+# CONFIG_PLIP is not set
 # CONFIG_PPP is not set
 # CONFIG_SLIP is not set
 
@@ -258,7 +396,6 @@
 # CONFIG_ARCNET_COM20020_CS is not set
 # CONFIG_PCMCIA_IBMTR is not set
 # CONFIG_NET_PCMCIA_RADIO is not set
-CONFIG_PCMCIA_NETCARD=y
 
 #
 # Amateur Radio support
@@ -333,6 +470,17 @@
 # CONFIG_ISDN is not set
 
 #
+# Input core support
+#
+CONFIG_INPUT=y
+CONFIG_INPUT_KEYBDEV=y
+CONFIG_INPUT_MOUSEDEV=y
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_EVDEV is not set
+
+#
 # Character devices
 #
 CONFIG_VT=y
@@ -340,13 +488,31 @@
 # CONFIG_SERIAL is not set
 # CONFIG_SERIAL_EXTENDED is not set
 # CONFIG_SERIAL_NONSTANDARD is not set
+# CONFIG_SERIAL_21285 is not set
+# CONFIG_SERIAL_21285_OLD is not set
+# CONFIG_SERIAL_21285_CONSOLE is not set
+# CONFIG_SERIAL_AMBA is not set
+# CONFIG_SERIAL_AMBA_CONSOLE is not set
+# CONFIG_SERIAL_CLPS711X is not set
+# CONFIG_SERIAL_CLPS711X_CONSOLE is not set
 CONFIG_SERIAL_SA1100=y
 CONFIG_SERIAL_SA1100_CONSOLE=y
 CONFIG_SA1100_DEFAULT_BAUDRATE=9600
-CONFIG_TOUCHSCREEN_UCB1200=y
-# CONFIG_TOUCHSCREEN_BITSY is not set
+CONFIG_SERIAL_8250=m
+# CONFIG_SERIAL_8250_CONSOLE is not set
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_UNIX98_PTYS=y
 CONFIG_UNIX98_PTY_COUNT=32
+CONFIG_UCB1200=y
+CONFIG_TOUCHSCREEN_UCB1200=y
+# CONFIG_AUDIO_UCB1200 is not set
+# CONFIG_ADC_UCB1200 is not set
+# CONFIG_TOUCHSCREEN_BITSY is not set
+# CONFIG_PROFILER is not set
+# CONFIG_PFS168_SPI is not set
+# CONFIG_PFS168_DTMF is not set
+# CONFIG_PFS168_MISC is not set
 
 #
 # I2C support
@@ -357,10 +523,7 @@
 # Mice
 #
 # CONFIG_BUSMOUSE is not set
-CONFIG_MOUSE=y
-CONFIG_PSMOUSE=y
-# CONFIG_82C710_MOUSE is not set
-# CONFIG_PC110_PAD is not set
+# CONFIG_MOUSE is not set
 
 #
 # Joysticks
@@ -379,6 +542,7 @@
 # CONFIG_INTEL_RNG is not set
 # CONFIG_NVRAM is not set
 # CONFIG_RTC is not set
+# CONFIG_SA1100_RTC is not set
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
 # CONFIG_APPLICOM is not set
@@ -389,7 +553,15 @@
 # CONFIG_FTAPE is not set
 # CONFIG_AGP is not set
 # CONFIG_DRM is not set
-# CONFIG_PCMCIA_SERIAL is not set
+
+#
+# PCMCIA character devices
+#
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
 
 #
 # File systems
@@ -397,6 +569,8 @@
 # CONFIG_QUOTA is not set
 # CONFIG_AUTOFS_FS is not set
 # CONFIG_AUTOFS4_FS is not set
+# CONFIG_REISERFS_FS is not set
+# CONFIG_REISERFS_CHECK is not set
 # CONFIG_ADFS_FS is not set
 # CONFIG_ADFS_FS_RW is not set
 # CONFIG_AFFS_FS is not set
@@ -407,12 +581,17 @@
 # CONFIG_UMSDOS_FS is not set
 # CONFIG_VFAT_FS is not set
 # CONFIG_EFS_FS is not set
-# CONFIG_JFFS_FS is not set
+CONFIG_JFFS_FS=m
+CONFIG_JFFS_FS_VERBOSE=0
+CONFIG_JFFS2_FS=m
+CONFIG_JFFS2_FS_DEBUG=0
 # CONFIG_CRAMFS is not set
+# CONFIG_TMPFS is not set
 # CONFIG_RAMFS is not set
 # CONFIG_ISO9660_FS is not set
 # CONFIG_JOLIET is not set
 # CONFIG_MINIX_FS is not set
+# CONFIG_VXFS_FS is not set
 # CONFIG_NTFS_FS is not set
 # CONFIG_NTFS_RW is not set
 # CONFIG_HPFS_FS is not set
@@ -426,7 +605,6 @@
 # CONFIG_ROMFS_FS is not set
 CONFIG_EXT2_FS=y
 # CONFIG_SYSV_FS is not set
-# CONFIG_SYSV_FS_WRITE is not set
 # CONFIG_UDF_FS is not set
 # CONFIG_UDF_RW is not set
 # CONFIG_UFS_FS is not set
@@ -451,8 +629,6 @@
 # CONFIG_NCPFS_NFS_NS is not set
 # CONFIG_NCPFS_OS2_NS is not set
 # CONFIG_NCPFS_SMALLDOS is not set
-# CONFIG_NCPFS_MOUNT_SUBDIR is not set
-# CONFIG_NCPFS_NDS_DOMAINS is not set
 # CONFIG_NCPFS_NLS is not set
 # CONFIG_NCPFS_EXTRAS is not set
 
@@ -467,11 +643,13 @@
 # CONFIG_MAC_PARTITION is not set
 CONFIG_MSDOS_PARTITION=y
 # CONFIG_BSD_DISKLABEL is not set
+# CONFIG_MINIX_SUBPARTITION is not set
 # CONFIG_SOLARIS_X86_PARTITION is not set
 # CONFIG_UNIXWARE_DISKLABEL is not set
 # CONFIG_SGI_PARTITION is not set
 # CONFIG_ULTRIX_PARTITION is not set
 # CONFIG_SUN_PARTITION is not set
+# CONFIG_SMB_NLS is not set
 CONFIG_NLS=y
 
 #
@@ -493,11 +671,13 @@
 # CONFIG_NLS_CODEPAGE_865 is not set
 # CONFIG_NLS_CODEPAGE_866 is not set
 # CONFIG_NLS_CODEPAGE_869 is not set
-# CONFIG_NLS_CODEPAGE_874 is not set
-# CONFIG_NLS_CODEPAGE_932 is not set
 # CONFIG_NLS_CODEPAGE_936 is not set
-# CONFIG_NLS_CODEPAGE_949 is not set
 # CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
 # CONFIG_NLS_ISO8859_1 is not set
 # CONFIG_NLS_ISO8859_2 is not set
 # CONFIG_NLS_ISO8859_3 is not set
@@ -505,27 +685,31 @@
 # CONFIG_NLS_ISO8859_5 is not set
 # CONFIG_NLS_ISO8859_6 is not set
 # CONFIG_NLS_ISO8859_7 is not set
-# CONFIG_NLS_ISO8859_8 is not set
 # CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
 # CONFIG_NLS_ISO8859_14 is not set
 # CONFIG_NLS_ISO8859_15 is not set
 # CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
 # CONFIG_NLS_UTF8 is not set
 
 #
 # Console drivers
 #
+CONFIG_PC_KEYMAP=y
 # CONFIG_VGA_CONSOLE is not set
-CONFIG_FB=y
 
 #
 # Frame-buffer support
 #
 CONFIG_FB=y
 CONFIG_DUMMY_CONSOLE=y
+# CONFIG_FB_ACORN is not set
+# CONFIG_FB_CLPS711X is not set
 # CONFIG_FB_CYBER2000 is not set
 CONFIG_FB_SA1100=y
-# CONFIG_FB_MQ200 is not set
+# CONFIG_FB_ANAKIN is not set
+# CONFIG_FB_E1355 is not set
 # CONFIG_FB_VIRTUAL is not set
 # CONFIG_FBCON_ADVANCED is not set
 CONFIG_FBCON_CFB2=y
@@ -544,33 +728,120 @@
 # Sound
 #
 CONFIG_SOUND=y
-CONFIG_SOUND_UDA1341=y
+CONFIG_SOUND_ASSABET_UDA1341=m
+# CONFIG_SOUND_BITSY_UDA1341 is not set
+CONFIG_SOUND_SA1111_UDA1341=m
+# CONFIG_SOUND_SA1100SSP is not set
 # CONFIG_SOUND_CMPCI is not set
 # CONFIG_SOUND_EMU10K1 is not set
 # CONFIG_SOUND_FUSION is not set
+# CONFIG_SOUND_CS4281 is not set
 # CONFIG_SOUND_ES1370 is not set
 # CONFIG_SOUND_ES1371 is not set
 # CONFIG_SOUND_ESSSOLO1 is not set
 # CONFIG_SOUND_MAESTRO is not set
+# CONFIG_SOUND_MAESTRO3 is not set
+# CONFIG_SOUND_ICH is not set
 # CONFIG_SOUND_SONICVIBES is not set
 # CONFIG_SOUND_TRIDENT is not set
 # CONFIG_SOUND_MSNDCLAS is not set
 # CONFIG_SOUND_MSNDPIN is not set
 # CONFIG_SOUND_VIA82CXXX is not set
+# CONFIG_MIDI_VIA82CXXX is not set
 # CONFIG_SOUND_OSS is not set
 # CONFIG_SOUND_TVMIXER is not set
 
 #
 # USB support
 #
-# CONFIG_USB is not set
+CONFIG_USB=y
+CONFIG_USB_DEBUG=y
+
+#
+# Miscellaneous USB options
+#
+# CONFIG_USB_DEVICEFS is not set
+# CONFIG_USB_BANDWIDTH is not set
+
+#
+# USB Controllers
+#
+# CONFIG_USB_UHCI is not set
+# CONFIG_USB_UHCI_ALT is not set
+CONFIG_USB_OHCI=y
+CONFIG_USB_OHCI_NOPCI=y
+
+#
+# USB Device Class drivers
+#
+# CONFIG_USB_AUDIO is not set
+# CONFIG_USB_BLUETOOTH is not set
+# CONFIG_USB_STORAGE is not set
+# CONFIG_USB_ACM is not set
+# CONFIG_USB_PRINTER is not set
+
+#
+# USB Human Interface Devices (HID)
+#
+CONFIG_USB_HID=y
+# CONFIG_USB_WACOM is not set
+
+#
+# USB Imaging devices
+#
+# CONFIG_USB_DC2XX is not set
+# CONFIG_USB_MDC800 is not set
+# CONFIG_USB_SCANNER is not set
+# CONFIG_USB_MICROTEK is not set
+
+#
+# USB Multimedia devices
+#
+# CONFIG_USB_IBMCAM is not set
+# CONFIG_USB_OV511 is not set
+# CONFIG_USB_PWC is not set
+# CONFIG_USB_SE401 is not set
+# CONFIG_USB_DSBR is not set
+# CONFIG_USB_DABUSB is not set
+
+#
+# USB Network adaptors
+#
+# CONFIG_USB_PLUSB is not set
+# CONFIG_USB_PEGASUS is not set
+# CONFIG_USB_CATC is not set
+# CONFIG_USB_NET1080 is not set
+# CONFIG_USB_USBNET is not set
+
+#
+# USB port drivers
+#
+# CONFIG_USB_USS720 is not set
+
+#
+# USB Serial Converter support
+#
+# CONFIG_USB_SERIAL is not set
+
+#
+# USB misc drivers
+#
+# CONFIG_USB_RIO500 is not set
+
+#
+# Bluetooth support
+#
+# CONFIG_BLUEZ is not set
 
 #
 # Kernel hacking
 #
-CONFIG_FRAME_POINTER=y
+# CONFIG_NO_FRAME_POINTER is not set
 CONFIG_DEBUG_ERRORS=y
 CONFIG_DEBUG_USER=y
 # CONFIG_DEBUG_INFO is not set
-# CONFIG_MAGIC_SYSRQ is not set
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_NO_PGT_CACHE is not set
 # CONFIG_DEBUG_LL is not set
+# CONFIG_DEBUG_DC21285_PORT is not set
+# CONFIG_DEBUG_CLPS711X_UART2 is not set
diff -u --recursive --new-file v2.4.8/linux/arch/arm/def-configs/omnimeter linux/arch/arm/def-configs/omnimeter
--- v2.4.8/linux/arch/arm/def-configs/omnimeter	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/def-configs/omnimeter	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,581 @@
+#
+# Automatically generated by make menuconfig: don't edit
+#
+CONFIG_ARM=y
+# CONFIG_SBUS is not set
+CONFIG_UID16=y
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+# CONFIG_OBSOLETE is not set
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+# CONFIG_MODVERSIONS is not set
+CONFIG_KMOD=y
+
+#
+# System Type
+#
+# CONFIG_ARCH_ARCA5K is not set
+# CONFIG_ARCH_CLPS7500 is not set
+# CONFIG_ARCH_CO285 is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_RPC is not set
+CONFIG_ARCH_SA1100=y
+# CONFIG_ARCH_CLPS711X is not set
+
+#
+# Archimedes/A5000 Implementations
+#
+
+#
+# Footbridge Implementations
+#
+
+#
+# SA11x0 Implementations
+#
+# CONFIG_SA1100_ASSABET is not set
+# CONFIG_SA1100_BRUTUS is not set
+CONFIG_SA1100_OMNIMETER=y
+# CONFIG_SA1100_CERF is not set
+# CONFIG_SA1100_BITSY is not set
+# CONFIG_SA1100_LART is not set
+# CONFIG_SA1100_GRAPHICSCLIENT is not set
+# CONFIG_SA1100_NANOENGINE is not set
+# CONFIG_SA1100_VICTOR is not set
+# CONFIG_SA1100_SHERMAN is not set
+# CONFIG_SA1100_XP860 is not set
+# CONFIG_SA1100_PANGOLIN is not set
+# CONFIG_SA1100_USB is not set
+# CONFIG_SA1100_FREQUENCY_SCALE is not set
+# CONFIG_SA1100_VOLTAGE_SCALE is not set
+
+#
+# CLPS711X/EP721X Implementations
+#
+# CONFIG_ARCH_ACORN is not set
+# CONFIG_FOOTBRIDGE is not set
+# CONFIG_FOOTBRIDGE_HOST is not set
+# CONFIG_FOOTBRIDGE_ADDIN is not set
+CONFIG_CPU_32=y
+# CONFIG_CPU_26 is not set
+CONFIG_CPU_32v4=y
+CONFIG_CPU_SA1100=y
+CONFIG_DISCONTIGMEM=y
+
+#
+# General setup
+#
+# CONFIG_ANGELBOOT is not set
+# CONFIG_PCI is not set
+CONFIG_ISA=y
+# CONFIG_ISA_DMA is not set
+CONFIG_HOTPLUG=y
+
+#
+# PCMCIA/CardBus support
+#
+CONFIG_PCMCIA=y
+CONFIG_I82365=y
+# CONFIG_PCMCIA_CLPS6700 is not set
+CONFIG_SA1100_PCMCIA=y
+# CONFIG_H3600_SLEEVE is not set
+CONFIG_NET=y
+CONFIG_SYSVIPC=y
+# CONFIG_BSD_PROCESS_ACCT is not set
+CONFIG_SYSCTL=y
+CONFIG_NWFPE=y
+CONFIG_KCORE_ELF=y
+# CONFIG_KCORE_AOUT is not set
+CONFIG_BINFMT_AOUT=y
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_MISC is not set
+# CONFIG_PM is not set
+# CONFIG_ARTHUR is not set
+CONFIG_CMDLINE="keepinitrd"
+# CONFIG_LEDS is not set
+# CONFIG_ALIGNMENT_TRAP is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+# CONFIG_MTD is not set
+
+#
+# Plug and Play configuration
+#
+# CONFIG_PNP is not set
+# CONFIG_ISAPNP is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_DEV_XD is not set
+# CONFIG_PARIDE is not set
+# CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
+# CONFIG_BLK_DEV_DAC960 is not set
+CONFIG_BLK_DEV_LOOP=m
+CONFIG_BLK_DEV_NBD=m
+# CONFIG_BLK_DEV_RAM is not set
+# CONFIG_BLK_DEV_INITRD is not set
+# CONFIG_BLK_DEV_FLASH is not set
+
+#
+# Networking options
+#
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
+CONFIG_NETLINK=y
+CONFIG_RTNETLINK=y
+# CONFIG_NETLINK_DEV is not set
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+# CONFIG_FILTER is not set
+CONFIG_UNIX=y
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+# CONFIG_IP_ADVANCED_ROUTER is not set
+# CONFIG_IP_PNP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_IP_MROUTE is not set
+# CONFIG_ARPD is not set
+# CONFIG_INET_ECN is not set
+# CONFIG_SYN_COOKIES is not set
+
+#
+#   IP: Netfilter Configuration
+#
+# CONFIG_IP_NF_CONNTRACK is not set
+# CONFIG_IP_NF_QUEUE is not set
+# CONFIG_IP_NF_IPTABLES is not set
+# CONFIG_IP_NF_COMPAT_IPCHAINS is not set
+# CONFIG_IP_NF_COMPAT_IPFWADM is not set
+# CONFIG_IPV6 is not set
+# CONFIG_KHTTPD is not set
+# CONFIG_ATM is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_DECNET is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_LLC is not set
+# CONFIG_NET_DIVERT is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+# CONFIG_NET_FASTROUTE is not set
+# CONFIG_NET_HW_FLOWCONTROL is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED is not set
+
+#
+# Network device support
+#
+CONFIG_NETDEVICES=y
+
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+# CONFIG_ETHERTAP is not set
+# CONFIG_NET_SB1000 is not set
+# CONFIG_NET_SA1100_USB_HOST is not set
+# CONFIG_NET_SA1100_USB_CLIENT is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+# CONFIG_NET_VENDOR_3COM is not set
+# CONFIG_LANCE is not set
+# CONFIG_NET_VENDOR_SMC is not set
+# CONFIG_NET_VENDOR_RACAL is not set
+# CONFIG_AT1700 is not set
+# CONFIG_DEPCA is not set
+# CONFIG_HP100 is not set
+# CONFIG_NET_ISA is not set
+# CONFIG_NET_PCI is not set
+# CONFIG_NET_POCKET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+# CONFIG_ACENIC is not set
+# CONFIG_HAMACHI is not set
+# CONFIG_YELLOWFIN is not set
+# CONFIG_SK98LIN is not set
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI is not set
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Token Ring devices
+#
+# CONFIG_TR is not set
+# CONFIG_NET_FC is not set
+# CONFIG_RCPCI is not set
+# CONFIG_SHAPER is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+
+#
+# PCMCIA network device support
+#
+CONFIG_NET_PCMCIA=y
+CONFIG_PCMCIA_3C589=y
+# CONFIG_PCMCIA_3C574 is not set
+# CONFIG_PCMCIA_FMVJ18X is not set
+CONFIG_PCMCIA_PCNET=y
+# CONFIG_PCMCIA_NMCLAN is not set
+# CONFIG_PCMCIA_SMC91C92 is not set
+# CONFIG_PCMCIA_XIRC2PS is not set
+# CONFIG_ARCNET_COM20020_CS is not set
+# CONFIG_PCMCIA_IBMTR is not set
+CONFIG_NET_PCMCIA_RADIO=y
+# CONFIG_PCMCIA_RAYCS is not set
+# CONFIG_PCMCIA_NETWAVE is not set
+CONFIG_PCMCIA_WAVELAN=y
+CONFIG_AIRONET4500_CS=y
+CONFIG_PCMCIA_WVLAN=y
+CONFIG_PCMCIA_NETCARD=y
+
+#
+# Amateur Radio support
+#
+# CONFIG_HAMRADIO is not set
+
+#
+# IrDA (infrared) support
+#
+# CONFIG_IRDA is not set
+
+#
+# ATA/IDE/MFM/RLL support
+#
+CONFIG_IDE=y
+
+#
+# IDE, ATA and ATAPI Block devices
+#
+CONFIG_BLK_DEV_IDE=y
+# CONFIG_BLK_DEV_HD_IDE is not set
+# CONFIG_BLK_DEV_HD is not set
+CONFIG_BLK_DEV_IDEDISK=y
+# CONFIG_IDEDISK_MULTI_MODE is not set
+# CONFIG_BLK_DEV_IDEDISK_VENDOR is not set
+# CONFIG_BLK_DEV_IDEDISK_FUJITSU is not set
+# CONFIG_BLK_DEV_IDEDISK_IBM is not set
+# CONFIG_BLK_DEV_IDEDISK_MAXTOR is not set
+# CONFIG_BLK_DEV_IDEDISK_QUANTUM is not set
+# CONFIG_BLK_DEV_IDEDISK_SEAGATE is not set
+# CONFIG_BLK_DEV_IDEDISK_WD is not set
+# CONFIG_BLK_DEV_COMMERIAL is not set
+# CONFIG_BLK_DEV_TIVO is not set
+CONFIG_BLK_DEV_IDECS=y
+# CONFIG_BLK_DEV_IDECD is not set
+# CONFIG_BLK_DEV_IDETAPE is not set
+# CONFIG_BLK_DEV_IDEFLOPPY is not set
+# CONFIG_BLK_DEV_IDESCSI is not set
+# CONFIG_BLK_DEV_CMD640 is not set
+# CONFIG_BLK_DEV_CMD640_ENHANCED is not set
+# CONFIG_BLK_DEV_ISAPNP is not set
+# CONFIG_IDE_CHIPSETS is not set
+# CONFIG_IDEDMA_AUTO is not set
+# CONFIG_DMA_NONPCI is not set
+# CONFIG_BLK_DEV_IDE_MODES is not set
+
+#
+# SCSI support
+#
+# CONFIG_SCSI is not set
+
+#
+# I2O device support
+#
+# CONFIG_I2O is not set
+# CONFIG_I2O_BLOCK is not set
+# CONFIG_I2O_LAN is not set
+# CONFIG_I2O_SCSI is not set
+# CONFIG_I2O_PROC is not set
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Input core support
+#
+# CONFIG_INPUT is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_VT_CONSOLE=y
+CONFIG_SERIAL_SA1100=y
+CONFIG_SERIAL_SA1100_CONSOLE=y
+# CONFIG_TOUCHSCREEN_UCB1200 is not set
+# CONFIG_TOUCHSCREEN_BITSY is not set
+# CONFIG_TOUCHSCREEN_BITSY_KEYBOARD is not set
+# CONFIG_H3600_SLEEVE is not set
+CONFIG_SERIAL=y
+# CONFIG_SERIAL_CONSOLE is not set
+# CONFIG_SERIAL_EXTENDED is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+CONFIG_SERIAL_SA1100=y
+CONFIG_SERIAL_SA1100_CONSOLE=y
+CONFIG_SA1100_DEFAULT_BAUDRATE=9600
+# CONFIG_TOUCHSCREEN_UCB1200 is not set
+# CONFIG_TOUCHSCREEN_BITSY is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_UNIX98_PTY_COUNT=32
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# Mice
+#
+# CONFIG_BUSMOUSE is not set
+CONFIG_MOUSE=m
+# CONFIG_PSMOUSE is not set
+# CONFIG_82C710_MOUSE is not set
+# CONFIG_PC110_PAD is not set
+
+#
+# Joysticks
+#
+# CONFIG_JOYSTICK is not set
+# CONFIG_QIC02_TAPE is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_INTEL_RNG is not set
+# CONFIG_NVRAM is not set
+# CONFIG_RTC is not set
+# CONFIG_SA1100_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_FTAPE is not set
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+CONFIG_PCMCIA_SERIAL=y
+
+#
+# PCMCIA character device support
+#
+# CONFIG_PCMCIA_SERIAL_CS is not set
+
+#
+# File systems
+#
+# CONFIG_QUOTA is not set
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_AUTOFS4_FS is not set
+# CONFIG_ADFS_FS is not set
+# CONFIG_ADFS_FS_RW is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_BFS_FS is not set
+CONFIG_FAT_FS=y
+CONFIG_MSDOS_FS=y
+# CONFIG_UMSDOS_FS is not set
+# CONFIG_VFAT_FS is not set
+# CONFIG_EFS_FS is not set
+# CONFIG_JFFS_FS is not set
+# CONFIG_CRAMFS is not set
+# CONFIG_RAMFS is not set
+# CONFIG_ISO9660_FS is not set
+# CONFIG_JOLIET is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_NTFS_FS is not set
+# CONFIG_NTFS_RW is not set
+# CONFIG_HPFS_FS is not set
+CONFIG_PROC_FS=y
+# CONFIG_DEVFS_FS is not set
+# CONFIG_DEVFS_MOUNT is not set
+# CONFIG_DEVFS_DEBUG is not set
+# CONFIG_DEVPTS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_QNX4FS_RW is not set
+# CONFIG_ROMFS_FS is not set
+CONFIG_EXT2_FS=y
+# CONFIG_SYSV_FS is not set
+# CONFIG_SYSV_FS_WRITE is not set
+# CONFIG_UDF_FS is not set
+# CONFIG_UDF_RW is not set
+# CONFIG_UFS_FS is not set
+# CONFIG_UFS_FS_WRITE is not set
+
+#
+# Network File Systems
+#
+# CONFIG_CODA_FS is not set
+CONFIG_NFS_FS=y
+# CONFIG_NFS_V3 is not set
+# CONFIG_ROOT_NFS is not set
+# CONFIG_NFSD is not set
+# CONFIG_NFSD_V3 is not set
+CONFIG_SUNRPC=y
+CONFIG_LOCKD=y
+# CONFIG_SMB_FS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_NCPFS_PACKET_SIGNING is not set
+# CONFIG_NCPFS_IOCTL_LOCKING is not set
+# CONFIG_NCPFS_STRONG is not set
+# CONFIG_NCPFS_NFS_NS is not set
+# CONFIG_NCPFS_OS2_NS is not set
+# CONFIG_NCPFS_SMALLDOS is not set
+# CONFIG_NCPFS_MOUNT_SUBDIR is not set
+# CONFIG_NCPFS_NDS_DOMAINS is not set
+# CONFIG_NCPFS_NLS is not set
+# CONFIG_NCPFS_EXTRAS is not set
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+CONFIG_NLS=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS_DEFAULT="iso8859-1"
+# CONFIG_NLS_CODEPAGE_437 is not set
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+# CONFIG_NLS_CODEPAGE_850 is not set
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_ISO8859_1 is not set
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+# CONFIG_NLS_ISO8859_15 is not set
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_UTF8 is not set
+
+#
+# Console drivers
+#
+CONFIG_PC_KEYMAP=y
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_FB=y
+
+#
+# Frame-buffer support
+#
+CONFIG_FB=y
+CONFIG_DUMMY_CONSOLE=y
+# CONFIG_FB_ACORN is not set
+# CONFIG_FB_CLPS711X is not set
+# CONFIG_FB_CYBER2000 is not set
+CONFIG_FB_SA1100=y
+# CONFIG_FB_VIRTUAL is not set
+CONFIG_FBCON_ADVANCED=y
+# CONFIG_FBCON_MFB is not set
+# CONFIG_FBCON_CFB2 is not set
+CONFIG_FBCON_CFB4=y
+# CONFIG_FBCON_CFB8 is not set
+# CONFIG_FBCON_CFB16 is not set
+# CONFIG_FBCON_CFB24 is not set
+# CONFIG_FBCON_CFB32 is not set
+# CONFIG_FBCON_AFB is not set
+# CONFIG_FBCON_ILBM is not set
+# CONFIG_FBCON_IPLAN2P2 is not set
+# CONFIG_FBCON_IPLAN2P4 is not set
+# CONFIG_FBCON_IPLAN2P8 is not set
+# CONFIG_FBCON_MAC is not set
+# CONFIG_FBCON_VGA_PLANES is not set
+# CONFIG_FBCON_VGA is not set
+# CONFIG_FBCON_HGA is not set
+CONFIG_FBCON_FONTWIDTH8_ONLY=y
+CONFIG_FBCON_FONTS=y
+CONFIG_FONT_8x8=y
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+
+#
+# USB support
+#
+# CONFIG_USB is not set
+
+#
+# Kernel hacking
+#
+CONFIG_FRAME_POINTER=y
+CONFIG_DEBUG_ERRORS=y
+# CONFIG_DEBUG_USER is not set
+# CONFIG_DEBUG_INFO is not set
+# CONFIG_MAGIC_SYSRQ is not set
+CONFIG_DEBUG_LL=y
diff -u --recursive --new-file v2.4.8/linux/arch/arm/def-configs/pangolin linux/arch/arm/def-configs/pangolin
--- v2.4.8/linux/arch/arm/def-configs/pangolin	Mon Nov 27 17:07:59 2000
+++ linux/arch/arm/def-configs/pangolin	Sun Aug 12 11:13:59 2001
@@ -1,8 +1,10 @@
 #
-# Automatically generated by make menuconfig: don't edit
+# Automatically generated make config: don't edit
 #
 CONFIG_ARM=y
+# CONFIG_EISA is not set
 # CONFIG_SBUS is not set
+# CONFIG_MCA is not set
 CONFIG_UID16=y
 
 #
@@ -15,8 +17,8 @@
 # Loadable module support
 #
 CONFIG_MODULES=y
-CONFIG_MODVERSIONS=y
-CONFIG_KMOD=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_KMOD is not set
 
 #
 # System Type
@@ -25,67 +27,111 @@
 # CONFIG_ARCH_CLPS7500 is not set
 # CONFIG_ARCH_CO285 is not set
 # CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_L7200 is not set
 # CONFIG_ARCH_FOOTBRIDGE is not set
 # CONFIG_ARCH_INTEGRATOR is not set
 # CONFIG_ARCH_RPC is not set
 CONFIG_ARCH_SA1100=y
+# CONFIG_ARCH_CLPS711X is not set
 
 #
 # Archimedes/A5000 Implementations
 #
 
 #
+# Archimedes/A5000 Implementations (select only ONE)
+#
+# CONFIG_ARCH_ARC is not set
+# CONFIG_ARCH_A5K is not set
+
+#
 # Footbridge Implementations
 #
+# CONFIG_ARCH_CATS is not set
+# CONFIG_ARCH_PERSONAL_SERVER is not set
+# CONFIG_ARCH_EBSA285_ADDIN is not set
+# CONFIG_ARCH_EBSA285_HOST is not set
+# CONFIG_ARCH_NETWINDER is not set
 
 #
 # SA11x0 Implementations
 #
 # CONFIG_SA1100_ASSABET is not set
+# CONFIG_ASSABET_NEPONSET is not set
 # CONFIG_SA1100_BRUTUS is not set
 # CONFIG_SA1100_CERF is not set
 # CONFIG_SA1100_BITSY is not set
-# CONFIG_SA1100_LART is not set
+# CONFIG_SA1100_EXTENEX1 is not set
+# CONFIG_SA1100_FREEBIRD is not set
 # CONFIG_SA1100_GRAPHICSCLIENT is not set
+# CONFIG_SA1100_HUW_WEBPANEL is not set
+# CONFIG_SA1100_LART is not set
 # CONFIG_SA1100_NANOENGINE is not set
-# CONFIG_SA1100_VICTOR is not set
+CONFIG_SA1100_PANGOLIN=y
+# CONFIG_SA1100_PLEB is not set
 # CONFIG_SA1100_SHERMAN is not set
+# CONFIG_SA1100_PFS168 is not set
+# CONFIG_SA1100_VICTOR is not set
 # CONFIG_SA1100_XP860 is not set
-CONFIG_SA1100_PANGOLIN=y
-# CONFIG_ANGELBOOT is not set
+# CONFIG_SA1100_YOPY is not set
+# CONFIG_SA1100_USB is not set
+# CONFIG_SA1100_USB_NETLINK is not set
+# CONFIG_SA1100_USB_CHAR is not set
 # CONFIG_SA1100_FREQUENCY_SCALE is not set
 # CONFIG_SA1100_VOLTAGE_SCALE is not set
+
+#
+# CLPS711X/EP721X Implementations
+#
+# CONFIG_ARCH_P720T is not set
 # CONFIG_ARCH_ACORN is not set
 # CONFIG_FOOTBRIDGE is not set
 # CONFIG_FOOTBRIDGE_HOST is not set
 # CONFIG_FOOTBRIDGE_ADDIN is not set
 CONFIG_CPU_32=y
 # CONFIG_CPU_26 is not set
+
+#
+# Processor Type
+#
+# CONFIG_CPU_32v3 is not set
 CONFIG_CPU_32v4=y
+# CONFIG_CPU_ARM610 is not set
+# CONFIG_CPU_ARM710 is not set
+# CONFIG_CPU_ARM720T is not set
+# CONFIG_CPU_ARM920T is not set
+# CONFIG_CPU_ARM1020 is not set
+# CONFIG_CPU_SA110 is not set
 CONFIG_CPU_SA1100=y
 CONFIG_DISCONTIGMEM=y
 
 #
 # General setup
 #
+
+#
+# Please ensure that you have read the help on the next option
+#
+# CONFIG_ANGELBOOT is not set
 # CONFIG_PCI is not set
 # CONFIG_ISA is not set
 # CONFIG_ISA_DMA is not set
-CONFIG_PC_KEYMAP=y
 CONFIG_HOTPLUG=y
 
 #
 # PCMCIA/CardBus support
 #
 CONFIG_PCMCIA=y
-# CONFIG_PCMCIA_DEBUG is not set
-CONFIG_SA1100_PCMCIA=y
-CONFIG_VIRTUAL_BUS=y
+# CONFIG_I82365 is not set
+# CONFIG_TCIC is not set
+# CONFIG_PCMCIA_CLPS6700 is not set
+CONFIG_PCMCIA_SA1100=y
 CONFIG_NET=y
 CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
-CONFIG_NWFPE=y
+CONFIG_FPE_NWFPE=y
+# CONFIG_FPE_FASTFPE is not set
 CONFIG_KCORE_ELF=y
 # CONFIG_KCORE_AOUT is not set
 # CONFIG_BINFMT_AOUT is not set
@@ -94,8 +140,10 @@
 # CONFIG_PM is not set
 # CONFIG_ARTHUR is not set
 CONFIG_CMDLINE="keepinitrd"
+# CONFIG_PFS168_CMDLINE is not set
 # CONFIG_LEDS is not set
 CONFIG_ALIGNMENT_TRAP=y
+# CONFIG_UCB1200 is not set
 
 #
 # Parallel port support
@@ -106,26 +154,59 @@
 # Memory Technology Devices (MTD)
 #
 CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
 # CONFIG_MTD_DOC1000 is not set
 # CONFIG_MTD_DOC2000 is not set
 # CONFIG_MTD_DOC2001 is not set
 # CONFIG_MTD_DOCPROBE is not set
-# CONFIG_MTD_SLRAM is not set
+
+#
+# RAM/ROM Device Drivers
+#
 # CONFIG_MTD_PMC551 is not set
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
 # CONFIG_MTD_MTDRAM is not set
+
+#
+# Linearly Mapped Flash Device Drivers
+#
 CONFIG_MTD_CFI=y
+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
 CONFIG_MTD_CFI_INTELEXT=y
-CONFIG_MTD_CFI_AMDSTD=y
-# CONFIG_MTD_JEDEC is not set
-# CONFIG_MTD_RAM is not set
-# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_CFI_AMDSTD is not set
+# CONFIG_MTD_AMDSTD is not set
+# CONFIG_MTD_SHARP is not set
 # CONFIG_MTD_PHYSMAP is not set
-# CONFIG_MTD_MIXMEM is not set
 # CONFIG_MTD_NORA is not set
-# CONFIG_MTD_OCTAGON is not set
 # CONFIG_MTD_PNC2000 is not set
 # CONFIG_MTD_RPXLITE is not set
+# CONFIG_MTD_SC520CDP is not set
+# CONFIG_MTD_SBC_MEDIAGX is not set
+# CONFIG_MTD_ELAN_104NC is not set
+CONFIG_MTD_SA1100=y
+# CONFIG_MTD_DC21285 is not set
+# CONFIG_MTD_IQ80310 is not set
+# CONFIG_MTD_CSTM_CFI_JEDEC is not set
+# CONFIG_MTD_JEDEC is not set
+# CONFIG_MTD_MIXMEM is not set
+# CONFIG_MTD_OCTAGON is not set
 # CONFIG_MTD_VMAX is not set
+
+#
+# NAND Flash Device Drivers
+#
+# CONFIG_MTD_NAND is not set
+# CONFIG_MTD_NAND_SPIA is not set
+
+#
+# User Modules And Translation Layers
+#
 CONFIG_MTD_CHAR=y
 CONFIG_MTD_BLOCK=y
 # CONFIG_FTL is not set
@@ -144,19 +225,24 @@
 # CONFIG_BLK_DEV_XD is not set
 # CONFIG_PARIDE is not set
 # CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
 # CONFIG_BLK_DEV_DAC960 is not set
 CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_NBD is not set
-# CONFIG_BLK_DEV_LVM is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BLK_DEV_INITRD=y
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
 # CONFIG_BLK_DEV_MD is not set
 # CONFIG_MD_LINEAR is not set
 # CONFIG_MD_RAID0 is not set
 # CONFIG_MD_RAID1 is not set
 # CONFIG_MD_RAID5 is not set
-CONFIG_BLK_DEV_RAM=y
-CONFIG_BLK_DEV_RAM_SIZE=4096
-CONFIG_BLK_DEV_INITRD=y
-CONFIG_BLK_DEV_FLASH=y
+# CONFIG_BLK_DEV_LVM is not set
 
 #
 # Networking options
@@ -178,6 +264,10 @@
 # CONFIG_IPV6 is not set
 # CONFIG_KHTTPD is not set
 # CONFIG_ATM is not set
+
+#
+#
+#
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
 # CONFIG_DECNET is not set
@@ -185,6 +275,7 @@
 # CONFIG_X25 is not set
 # CONFIG_LAPB is not set
 # CONFIG_LLC is not set
+# CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
 # CONFIG_NET_FASTROUTE is not set
@@ -214,7 +305,6 @@
 # Ethernet (10 or 100Mbit)
 #
 CONFIG_NET_ETHERNET=y
-# CONFIG_ARM_AM79C961A is not set
 # CONFIG_NET_VENDOR_3COM is not set
 # CONFIG_LANCE is not set
 # CONFIG_NET_VENDOR_SMC is not set
@@ -228,8 +318,9 @@
 #
 # Ethernet (1000 Mbit)
 #
-# CONFIG_YELLOWFIN is not set
 # CONFIG_ACENIC is not set
+# CONFIG_HAMACHI is not set
+# CONFIG_YELLOWFIN is not set
 # CONFIG_SK98LIN is not set
 # CONFIG_FDDI is not set
 # CONFIG_HIPPI is not set
@@ -289,6 +380,10 @@
 # IDE, ATA and ATAPI Block devices
 #
 CONFIG_BLK_DEV_IDE=y
+
+#
+# Please see Documentation/ide.txt for help/info on IDE drives
+#
 # CONFIG_BLK_DEV_HD_IDE is not set
 # CONFIG_BLK_DEV_HD is not set
 CONFIG_BLK_DEV_IDEDISK=y
@@ -307,6 +402,10 @@
 # CONFIG_BLK_DEV_IDETAPE is not set
 # CONFIG_BLK_DEV_IDEFLOPPY is not set
 # CONFIG_BLK_DEV_IDESCSI is not set
+
+#
+# IDE chipset support/bugfixes
+#
 # CONFIG_BLK_DEV_CMD640 is not set
 # CONFIG_BLK_DEV_CMD640_ENHANCED is not set
 # CONFIG_BLK_DEV_ISAPNP is not set
@@ -335,6 +434,11 @@
 # CONFIG_ISDN is not set
 
 #
+# Input core support
+#
+# CONFIG_INPUT is not set
+
+#
 # Character devices
 #
 CONFIG_VT=y
@@ -347,6 +451,12 @@
 CONFIG_SA1100_DEFAULT_BAUDRATE=115200
 # CONFIG_TOUCHSCREEN_UCB1200 is not set
 # CONFIG_TOUCHSCREEN_BITSY is not set
+CONFIG_PROFILER=y
+# CONFIG_PFS168_SPI is not set
+# CONFIG_PFS168_DTMF is not set
+# CONFIG_PFS168_MISC is not set
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_UNIX98_PTYS=y
 CONFIG_UNIX98_PTY_COUNT=32
 
@@ -365,6 +475,10 @@
 # Joysticks
 #
 # CONFIG_JOYSTICK is not set
+
+#
+# Input core support is needed for joysticks
+#
 # CONFIG_QIC02_TAPE is not set
 
 #
@@ -374,6 +488,7 @@
 # CONFIG_INTEL_RNG is not set
 # CONFIG_NVRAM is not set
 # CONFIG_RTC is not set
+CONFIG_SA1100_RTC=y
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
 # CONFIG_APPLICOM is not set
@@ -384,7 +499,16 @@
 # CONFIG_FTAPE is not set
 # CONFIG_AGP is not set
 # CONFIG_DRM is not set
-# CONFIG_PCMCIA_SERIAL is not set
+
+#
+# PCMCIA character devices
+#
+# CONFIG_PCMCIA_SERIAL_CS is not set
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
 
 #
 # File systems
@@ -392,18 +516,21 @@
 # CONFIG_QUOTA is not set
 # CONFIG_AUTOFS_FS is not set
 # CONFIG_AUTOFS4_FS is not set
+# CONFIG_REISERFS_FS is not set
+# CONFIG_REISERFS_CHECK is not set
 # CONFIG_ADFS_FS is not set
 # CONFIG_ADFS_FS_RW is not set
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
 # CONFIG_BFS_FS is not set
-# CONFIG_FAT_FS is not set
-# CONFIG_MSDOS_FS is not set
+CONFIG_FAT_FS=y
+CONFIG_MSDOS_FS=y
 # CONFIG_UMSDOS_FS is not set
-# CONFIG_VFAT_FS is not set
+CONFIG_VFAT_FS=y
 # CONFIG_EFS_FS is not set
 CONFIG_JFFS_FS=y
-CONFIG_JFFS_FS_VERBOSE=1
+CONFIG_JFFS_FS_VERBOSE=0
+# CONFIG_JFFS2_FS is not set
 CONFIG_CRAMFS=y
 CONFIG_RAMFS=y
 # CONFIG_ISO9660_FS is not set
@@ -432,13 +559,13 @@
 # Network File Systems
 #
 # CONFIG_CODA_FS is not set
-CONFIG_NFS_FS=y
+# CONFIG_NFS_FS is not set
 # CONFIG_NFS_V3 is not set
 # CONFIG_ROOT_NFS is not set
 # CONFIG_NFSD is not set
 # CONFIG_NFSD_V3 is not set
-CONFIG_SUNRPC=y
-CONFIG_LOCKD=y
+# CONFIG_SUNRPC is not set
+# CONFIG_LOCKD is not set
 # CONFIG_SMB_FS is not set
 # CONFIG_NCP_FS is not set
 # CONFIG_NCPFS_PACKET_SIGNING is not set
@@ -447,8 +574,6 @@
 # CONFIG_NCPFS_NFS_NS is not set
 # CONFIG_NCPFS_OS2_NS is not set
 # CONFIG_NCPFS_SMALLDOS is not set
-# CONFIG_NCPFS_MOUNT_SUBDIR is not set
-# CONFIG_NCPFS_NDS_DOMAINS is not set
 # CONFIG_NCPFS_NLS is not set
 # CONFIG_NCPFS_EXTRAS is not set
 
@@ -457,23 +582,113 @@
 #
 # CONFIG_PARTITION_ADVANCED is not set
 CONFIG_MSDOS_PARTITION=y
-# CONFIG_NLS is not set
+# CONFIG_SMB_NLS is not set
+CONFIG_NLS=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS_DEFAULT="iso8859-1"
+# CONFIG_NLS_CODEPAGE_437 is not set
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+# CONFIG_NLS_CODEPAGE_850 is not set
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+CONFIG_NLS_CODEPAGE_950=y
+# CONFIG_NLS_ISO8859_1 is not set
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+# CONFIG_NLS_ISO8859_15 is not set
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_UTF8 is not set
 
 #
 # Console drivers
 #
+CONFIG_PC_KEYMAP=y
 # CONFIG_VGA_CONSOLE is not set
-# CONFIG_FB is not set
+CONFIG_FB=y
 
 #
 # Frame-buffer support
 #
-# CONFIG_FB is not set
+CONFIG_FB=y
+CONFIG_DUMMY_CONSOLE=y
+# CONFIG_FB_ACORN is not set
+# CONFIG_FB_CLPS711X is not set
+# CONFIG_FB_CYBER2000 is not set
+# CONFIG_FB_SA1100 is not set
+CONFIG_FB_MQ200=y
+# CONFIG_FB_VIRTUAL is not set
+CONFIG_FBCON_ADVANCED=y
+# CONFIG_FBCON_MFB is not set
+# CONFIG_FBCON_CFB2 is not set
+# CONFIG_FBCON_CFB4 is not set
+# CONFIG_FBCON_CFB8 is not set
+CONFIG_FBCON_CFB16=y
+# CONFIG_FBCON_CFB24 is not set
+# CONFIG_FBCON_CFB32 is not set
+# CONFIG_FBCON_AFB is not set
+# CONFIG_FBCON_ILBM is not set
+# CONFIG_FBCON_IPLAN2P2 is not set
+# CONFIG_FBCON_IPLAN2P4 is not set
+# CONFIG_FBCON_IPLAN2P8 is not set
+# CONFIG_FBCON_MAC is not set
+# CONFIG_FBCON_VGA_PLANES is not set
+# CONFIG_FBCON_VGA is not set
+# CONFIG_FBCON_HGA is not set
+CONFIG_FBCON_FONTWIDTH8_ONLY=y
+CONFIG_FBCON_FONTS=y
+CONFIG_FONT_8x8=y
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
 
 #
 # Sound
 #
-# CONFIG_SOUND is not set
+CONFIG_SOUND=y
+CONFIG_SOUND_UDA1341=y
+# CONFIG_SOUND_SA1100_SSP is not set
+# CONFIG_SOUND_CMPCI is not set
+# CONFIG_SOUND_EMU10K1 is not set
+# CONFIG_SOUND_FUSION is not set
+# CONFIG_SOUND_CS4281 is not set
+# CONFIG_SOUND_ES1370 is not set
+# CONFIG_SOUND_ES1371 is not set
+# CONFIG_SOUND_ESSSOLO1 is not set
+# CONFIG_SOUND_MAESTRO is not set
+# CONFIG_SOUND_MAESTRO3 is not set
+# CONFIG_SOUND_ICH is not set
+# CONFIG_SOUND_SONICVIBES is not set
+# CONFIG_SOUND_TRIDENT is not set
+# CONFIG_SOUND_MSNDCLAS is not set
+# CONFIG_SOUND_MSNDPIN is not set
+# CONFIG_SOUND_VIA82CXXX is not set
+# CONFIG_SOUND_OSS is not set
+# CONFIG_SOUND_TVMIXER is not set
 
 #
 # USB support
@@ -483,9 +698,12 @@
 #
 # Kernel hacking
 #
-CONFIG_FRAME_POINTER=y
+# CONFIG_NO_FRAME_POINTER is not set
 CONFIG_DEBUG_ERRORS=y
 CONFIG_DEBUG_USER=y
-# CONFIG_DEBUG_INFO is not set
+CONFIG_DEBUG_INFO=y
 # CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_NO_PGT_CACHE is not set
 # CONFIG_DEBUG_LL is not set
+# CONFIG_DEBUG_DC21285_PORT is not set
+# CONFIG_DEBUG_CLPS711X_UART2 is not set
diff -u --recursive --new-file v2.4.8/linux/arch/arm/def-configs/pfs168_mqtft linux/arch/arm/def-configs/pfs168_mqtft
--- v2.4.8/linux/arch/arm/def-configs/pfs168_mqtft	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/def-configs/pfs168_mqtft	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,793 @@
+#
+# Automatically generated make config: don't edit
+#
+CONFIG_ARM=y
+# CONFIG_EISA is not set
+# CONFIG_SBUS is not set
+# CONFIG_MCA is not set
+CONFIG_UID16=y
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+# CONFIG_OBSOLETE is not set
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_KMOD is not set
+
+#
+# System Type
+#
+# CONFIG_ARCH_ARCA5K is not set
+# CONFIG_ARCH_CLPS7500 is not set
+# CONFIG_ARCH_CO285 is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_L7200 is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_RPC is not set
+CONFIG_ARCH_SA1100=y
+# CONFIG_ARCH_CLPS711X is not set
+
+#
+# Archimedes/A5000 Implementations
+#
+
+#
+# Archimedes/A5000 Implementations (select only ONE)
+#
+# CONFIG_ARCH_ARC is not set
+# CONFIG_ARCH_A5K is not set
+
+#
+# Footbridge Implementations
+#
+# CONFIG_ARCH_CATS is not set
+# CONFIG_ARCH_PERSONAL_SERVER is not set
+# CONFIG_ARCH_EBSA285_ADDIN is not set
+# CONFIG_ARCH_EBSA285_HOST is not set
+# CONFIG_ARCH_NETWINDER is not set
+
+#
+# SA11x0 Implementations
+#
+# CONFIG_SA1100_ASSABET is not set
+# CONFIG_ASSABET_NEPONSET is not set
+# CONFIG_SA1100_BRUTUS is not set
+# CONFIG_SA1100_CERF is not set
+# CONFIG_SA1100_BITSY is not set
+# CONFIG_SA1100_EXTENEX1 is not set
+# CONFIG_SA1100_FREEBIRD is not set
+# CONFIG_SA1100_GRAPHICSCLIENT is not set
+# CONFIG_SA1100_HUW_WEBPANEL is not set
+# CONFIG_SA1100_LART is not set
+# CONFIG_SA1100_PLEB is not set
+# CONFIG_SA1100_NANOENGINE is not set
+# CONFIG_SA1100_PANGOLIN is not set
+# CONFIG_SA1100_SHERMAN is not set
+# CONFIG_SA1100_VICTOR is not set
+# CONFIG_SA1100_XP860 is not set
+# CONFIG_SA1100_YOPY is not set
+CONFIG_SA1100_PFS168=y
+CONFIG_SA1111=y
+CONFIG_SA1100_USB=m
+CONFIG_SA1100_USB_NETLINK=m
+CONFIG_SA1100_USB_CHAR=m
+CONFIG_SA1100_FREQUENCY_SCALE=m
+# CONFIG_SA1100_VOLTAGE_SCALE is not set
+
+#
+# CLPS711X/EP721X Implementations
+#
+# CONFIG_ARCH_P720T is not set
+# CONFIG_ARCH_ACORN is not set
+# CONFIG_FOOTBRIDGE is not set
+# CONFIG_FOOTBRIDGE_HOST is not set
+# CONFIG_FOOTBRIDGE_ADDIN is not set
+CONFIG_CPU_32=y
+# CONFIG_CPU_26 is not set
+
+#
+# Processor Type
+#
+# CONFIG_CPU_32v3 is not set
+CONFIG_CPU_32v4=y
+# CONFIG_CPU_ARM610 is not set
+# CONFIG_CPU_ARM710 is not set
+# CONFIG_CPU_ARM720T is not set
+# CONFIG_CPU_ARM920T is not set
+# CONFIG_CPU_ARM1020 is not set
+# CONFIG_CPU_SA110 is not set
+CONFIG_CPU_SA1100=y
+CONFIG_DISCONTIGMEM=y
+
+#
+# General setup
+#
+
+#
+# Please ensure that you have read the help on the next option
+#
+# CONFIG_ANGELBOOT is not set
+# CONFIG_PCI is not set
+# CONFIG_ISA is not set
+# CONFIG_ISA_DMA is not set
+CONFIG_HOTPLUG=y
+
+#
+# PCMCIA/CardBus support
+#
+CONFIG_PCMCIA=m
+# CONFIG_I82365 is not set
+# CONFIG_TCIC is not set
+# CONFIG_PCMCIA_CLPS6700 is not set
+CONFIG_PCMCIA_SA1100=m
+CONFIG_NET=y
+CONFIG_SYSVIPC=y
+# CONFIG_BSD_PROCESS_ACCT is not set
+CONFIG_SYSCTL=y
+CONFIG_FPE_NWFPE=y
+# CONFIG_FPE_FASTFPE is not set
+CONFIG_KCORE_ELF=y
+# CONFIG_KCORE_AOUT is not set
+# CONFIG_BINFMT_AOUT is not set
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_MISC is not set
+# CONFIG_PM is not set
+# CONFIG_ARTHUR is not set
+CONFIG_CMDLINE="root=/dev/nfs"
+# CONFIG_PFS168_CMDLINE is not set
+CONFIG_LEDS=y
+CONFIG_LEDS_TIMER=y
+CONFIG_LEDS_CPU=y
+CONFIG_ALIGNMENT_TRAP=y
+CONFIG_UCB1200=y
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOC1000 is not set
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOCPROBE is not set
+
+#
+# RAM/ROM Device Drivers
+#
+# CONFIG_MTD_PMC551 is not set
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_MTDRAM is not set
+
+#
+# Linearly Mapped Flash Device Drivers
+#
+CONFIG_MTD_CFI=y
+# CONFIG_MTD_CFI_GEOMETRY is not set
+CONFIG_MTD_CFI_INTELEXT=y
+# CONFIG_MTD_CFI_AMDSTD is not set
+# CONFIG_MTD_AMDSTD is not set
+# CONFIG_MTD_SHARP is not set
+# CONFIG_MTD_PHYSMAP is not set
+# CONFIG_MTD_NORA is not set
+# CONFIG_MTD_PNC2000 is not set
+# CONFIG_MTD_RPXLITE is not set
+# CONFIG_MTD_SC520CDP is not set
+# CONFIG_MTD_SBC_MEDIAGX is not set
+# CONFIG_MTD_ELAN_104NC is not set
+CONFIG_MTD_SA1100=y
+# CONFIG_MTD_DC21285 is not set
+# CONFIG_MTD_CSTM_CFI_JEDEC is not set
+# CONFIG_MTD_JEDEC is not set
+# CONFIG_MTD_MIXMEM is not set
+# CONFIG_MTD_OCTAGON is not set
+# CONFIG_MTD_VMAX is not set
+
+#
+# NAND Flash Device Drivers
+#
+# CONFIG_MTD_NAND is not set
+# CONFIG_MTD_NAND_SPIA is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLOCK=y
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
+
+#
+# Plug and Play configuration
+#
+# CONFIG_PNP is not set
+# CONFIG_ISAPNP is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_DEV_XD is not set
+# CONFIG_PARIDE is not set
+# CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
+# CONFIG_BLK_DEV_DAC960 is not set
+# CONFIG_BLK_DEV_LOOP is not set
+# CONFIG_BLK_DEV_NBD is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BLK_DEV_INITRD=y
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+# CONFIG_BLK_DEV_MD is not set
+# CONFIG_MD_LINEAR is not set
+# CONFIG_MD_RAID0 is not set
+# CONFIG_MD_RAID1 is not set
+# CONFIG_MD_RAID5 is not set
+# CONFIG_BLK_DEV_LVM is not set
+
+#
+# Networking options
+#
+CONFIG_PACKET=y
+# CONFIG_PACKET_MMAP is not set
+# CONFIG_NETLINK is not set
+# CONFIG_NETFILTER is not set
+# CONFIG_FILTER is not set
+CONFIG_UNIX=y
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_PNP=y
+CONFIG_IP_PNP_BOOTP=y
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_INET_ECN is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_IPV6 is not set
+# CONFIG_KHTTPD is not set
+# CONFIG_ATM is not set
+
+#
+#
+#
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_DECNET is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_LLC is not set
+# CONFIG_NET_DIVERT is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+# CONFIG_NET_FASTROUTE is not set
+# CONFIG_NET_HW_FLOWCONTROL is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED is not set
+
+#
+# Network device support
+#
+CONFIG_NETDEVICES=y
+
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+# CONFIG_NET_SB1000 is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+# CONFIG_NET_VENDOR_3COM is not set
+# CONFIG_LANCE is not set
+CONFIG_NET_VENDOR_SMC=y
+# CONFIG_WD80x3 is not set
+# CONFIG_ULTRA is not set
+# CONFIG_ULTRA32 is not set
+CONFIG_SMC9194=y
+# CONFIG_NET_VENDOR_RACAL is not set
+# CONFIG_AT1700 is not set
+# CONFIG_DEPCA is not set
+# CONFIG_NET_ISA is not set
+# CONFIG_NET_PCI is not set
+# CONFIG_NET_POCKET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+# CONFIG_ACENIC is not set
+# CONFIG_HAMACHI is not set
+# CONFIG_YELLOWFIN is not set
+# CONFIG_SK98LIN is not set
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI is not set
+CONFIG_PPP=m
+# CONFIG_PPP_MULTILINK is not set
+CONFIG_PPP_ASYNC=m
+CONFIG_PPP_SYNC_TTY=m
+CONFIG_PPP_DEFLATE=m
+# CONFIG_PPP_BSDCOMP is not set
+# CONFIG_PPPOE is not set
+# CONFIG_SLIP is not set
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Token Ring devices
+#
+# CONFIG_TR is not set
+# CONFIG_NET_FC is not set
+# CONFIG_RCPCI is not set
+# CONFIG_SHAPER is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+
+#
+# PCMCIA network device support
+#
+CONFIG_NET_PCMCIA=y
+# CONFIG_PCMCIA_3C589 is not set
+# CONFIG_PCMCIA_3C574 is not set
+# CONFIG_PCMCIA_FMVJ18X is not set
+CONFIG_PCMCIA_PCNET=m
+# CONFIG_PCMCIA_NMCLAN is not set
+CONFIG_PCMCIA_SMC91C92=m
+# CONFIG_PCMCIA_XIRC2PS is not set
+# CONFIG_ARCNET_COM20020_CS is not set
+# CONFIG_PCMCIA_IBMTR is not set
+# CONFIG_NET_PCMCIA_RADIO is not set
+
+#
+# Amateur Radio support
+#
+# CONFIG_HAMRADIO is not set
+
+#
+# IrDA (infrared) support
+#
+CONFIG_IRDA=m
+
+#
+# IrDA protocols
+#
+CONFIG_IRLAN=m
+CONFIG_IRNET=m
+CONFIG_IRCOMM=m
+CONFIG_IRDA_ULTRA=y
+# CONFIG_IRDA_OPTIONS is not set
+
+#
+# Infrared-port device drivers
+#
+
+#
+# SIR device drivers
+#
+CONFIG_IRTTY_SIR=m
+CONFIG_IRPORT_SIR=m
+
+#
+# FIR device drivers
+#
+# CONFIG_NSC_FIR is not set
+# CONFIG_WINBOND_FIR is not set
+# CONFIG_TOSHIBA_FIR is not set
+# CONFIG_SMC_IRCC_FIR is not set
+CONFIG_SA1100_FIR=m
+
+#
+# Dongle support
+#
+# CONFIG_DONGLE is not set
+
+#
+# ATA/IDE/MFM/RLL support
+#
+CONFIG_IDE=m
+
+#
+# IDE, ATA and ATAPI Block devices
+#
+CONFIG_BLK_DEV_IDE=m
+
+#
+# Please see Documentation/ide.txt for help/info on IDE drives
+#
+# CONFIG_BLK_DEV_HD_IDE is not set
+# CONFIG_BLK_DEV_HD is not set
+CONFIG_BLK_DEV_IDEDISK=m
+# CONFIG_IDEDISK_MULTI_MODE is not set
+# CONFIG_BLK_DEV_IDEDISK_VENDOR is not set
+# CONFIG_BLK_DEV_IDEDISK_FUJITSU is not set
+# CONFIG_BLK_DEV_IDEDISK_IBM is not set
+# CONFIG_BLK_DEV_IDEDISK_MAXTOR is not set
+# CONFIG_BLK_DEV_IDEDISK_QUANTUM is not set
+# CONFIG_BLK_DEV_IDEDISK_SEAGATE is not set
+# CONFIG_BLK_DEV_IDEDISK_WD is not set
+# CONFIG_BLK_DEV_COMMERIAL is not set
+# CONFIG_BLK_DEV_TIVO is not set
+CONFIG_BLK_DEV_IDECS=m
+# CONFIG_BLK_DEV_IDECD is not set
+# CONFIG_BLK_DEV_IDETAPE is not set
+# CONFIG_BLK_DEV_IDEFLOPPY is not set
+# CONFIG_BLK_DEV_IDESCSI is not set
+
+#
+# IDE chipset support/bugfixes
+#
+# CONFIG_BLK_DEV_CMD640 is not set
+# CONFIG_BLK_DEV_CMD640_ENHANCED is not set
+# CONFIG_BLK_DEV_ISAPNP is not set
+# CONFIG_IDE_CHIPSETS is not set
+# CONFIG_IDEDMA_AUTO is not set
+# CONFIG_DMA_NONPCI is not set
+# CONFIG_BLK_DEV_IDE_MODES is not set
+
+#
+# SCSI support
+#
+# CONFIG_SCSI is not set
+
+#
+# I2O device support
+#
+# CONFIG_I2O is not set
+# CONFIG_I2O_BLOCK is not set
+# CONFIG_I2O_LAN is not set
+# CONFIG_I2O_SCSI is not set
+# CONFIG_I2O_PROC is not set
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Input core support
+#
+CONFIG_INPUT=y
+CONFIG_INPUT_KEYBDEV=y
+CONFIG_INPUT_MOUSEDEV=y
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_EVDEV is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+# CONFIG_VT_CONSOLE is not set
+CONFIG_SERIAL=y
+# CONFIG_SERIAL_CONSOLE is not set
+# CONFIG_SERIAL_EXTENDED is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+CONFIG_SERIAL_SA1100=y
+CONFIG_SERIAL_SA1100_CONSOLE=y
+CONFIG_SA1100_DEFAULT_BAUDRATE=115200
+CONFIG_TOUCHSCREEN_UCB1200=y
+# CONFIG_TOUCHSCREEN_BITSY is not set
+# CONFIG_PROFILER is not set
+# CONFIG_PFS168_SPI is not set
+CONFIG_PFS168_DTMF=y
+CONFIG_PFS168_MISC=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_UNIX98_PTY_COUNT=32
+
+#
+# I2C support
+#
+CONFIG_I2C=y
+CONFIG_I2C_ALGOBIT=y
+# CONFIG_I2C_PHILIPSPAR is not set
+# CONFIG_I2C_ELV is not set
+# CONFIG_I2C_VELLEMAN is not set
+# CONFIG_I2C_ASSABET is not set
+CONFIG_I2C_PFS168=y
+# CONFIG_I2C_ALGOPCF is not set
+CONFIG_I2C_CHARDEV=y
+CONFIG_I2C_SENSORS=y
+CONFIG_I2C_EEPROM=y
+CONFIG_I2C_EEPROM=y
+CONFIG_I2C_M41T11=y
+CONFIG_I2C_X9221=y
+CONFIG_I2C_PCF8574=y
+
+#
+# Mice
+#
+# CONFIG_BUSMOUSE is not set
+CONFIG_MOUSE=y
+CONFIG_PSMOUSE=y
+# CONFIG_82C710_MOUSE is not set
+# CONFIG_PC110_PAD is not set
+
+#
+# Joysticks
+#
+# CONFIG_JOYSTICK is not set
+
+#
+# Input core support is needed for joysticks
+#
+# CONFIG_QIC02_TAPE is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_INTEL_RNG is not set
+# CONFIG_NVRAM is not set
+# CONFIG_RTC is not set
+# CONFIG_SA1100_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_FTAPE is not set
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+CONFIG_PCMCIA_SERIAL=m
+
+#
+# PCMCIA character device support
+#
+# CONFIG_PCMCIA_SERIAL_CS is not set
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# File systems
+#
+# CONFIG_QUOTA is not set
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_AUTOFS4_FS is not set
+# CONFIG_REISERFS_FS is not set
+# CONFIG_REISERFS_CHECK is not set
+# CONFIG_ADFS_FS is not set
+# CONFIG_ADFS_FS_RW is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_FAT_FS is not set
+# CONFIG_MSDOS_FS is not set
+# CONFIG_UMSDOS_FS is not set
+# CONFIG_VFAT_FS is not set
+# CONFIG_EFS_FS is not set
+CONFIG_JFFS_FS=y
+CONFIG_JFFS_FS_VERBOSE=0
+# CONFIG_JFFS2_FS is not set
+# CONFIG_CRAMFS is not set
+# CONFIG_RAMFS is not set
+# CONFIG_ISO9660_FS is not set
+# CONFIG_JOLIET is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_NTFS_FS is not set
+# CONFIG_NTFS_RW is not set
+# CONFIG_HPFS_FS is not set
+CONFIG_PROC_FS=y
+# CONFIG_DEVFS_FS is not set
+# CONFIG_DEVFS_MOUNT is not set
+# CONFIG_DEVFS_DEBUG is not set
+CONFIG_DEVPTS_FS=y
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_QNX4FS_RW is not set
+# CONFIG_ROMFS_FS is not set
+CONFIG_EXT2_FS=y
+# CONFIG_SYSV_FS is not set
+# CONFIG_SYSV_FS_WRITE is not set
+# CONFIG_UDF_FS is not set
+# CONFIG_UDF_RW is not set
+# CONFIG_UFS_FS is not set
+# CONFIG_UFS_FS_WRITE is not set
+
+#
+# Network File Systems
+#
+# CONFIG_CODA_FS is not set
+CONFIG_NFS_FS=y
+# CONFIG_NFS_V3 is not set
+CONFIG_ROOT_NFS=y
+# CONFIG_NFSD is not set
+# CONFIG_NFSD_V3 is not set
+CONFIG_SUNRPC=y
+CONFIG_LOCKD=y
+# CONFIG_SMB_FS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_NCPFS_PACKET_SIGNING is not set
+# CONFIG_NCPFS_IOCTL_LOCKING is not set
+# CONFIG_NCPFS_STRONG is not set
+# CONFIG_NCPFS_NFS_NS is not set
+# CONFIG_NCPFS_OS2_NS is not set
+# CONFIG_NCPFS_SMALLDOS is not set
+# CONFIG_NCPFS_NLS is not set
+# CONFIG_NCPFS_EXTRAS is not set
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+# CONFIG_SMB_NLS is not set
+# CONFIG_NLS is not set
+
+#
+# Console drivers
+#
+CONFIG_PC_KEYMAP=y
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_FB=y
+
+#
+# Frame-buffer support
+#
+CONFIG_FB=y
+CONFIG_DUMMY_CONSOLE=y
+# CONFIG_FB_ACORN is not set
+# CONFIG_FB_CLPS711X is not set
+# CONFIG_FB_CYBER2000 is not set
+# CONFIG_FB_SA1100 is not set
+CONFIG_FB_MQ200=y
+# CONFIG_PFS168_MQVGA is not set
+CONFIG_PFS168_MQTFT=y
+# CONFIG_FB_VIRTUAL is not set
+CONFIG_FBCON_ADVANCED=y
+# CONFIG_FBCON_MFB is not set
+# CONFIG_FBCON_CFB2 is not set
+# CONFIG_FBCON_CFB4 is not set
+CONFIG_FBCON_CFB8=y
+CONFIG_FBCON_CFB16=y
+CONFIG_FBCON_CFB24=y
+CONFIG_FBCON_CFB32=y
+# CONFIG_FBCON_AFB is not set
+# CONFIG_FBCON_ILBM is not set
+# CONFIG_FBCON_IPLAN2P2 is not set
+# CONFIG_FBCON_IPLAN2P4 is not set
+# CONFIG_FBCON_IPLAN2P8 is not set
+# CONFIG_FBCON_MAC is not set
+# CONFIG_FBCON_VGA_PLANES is not set
+# CONFIG_FBCON_VGA is not set
+# CONFIG_FBCON_HGA is not set
+CONFIG_FBCON_FONTWIDTH8_ONLY=y
+CONFIG_FBCON_FONTS=y
+CONFIG_FONT_8x8=y
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+
+#
+# USB support
+#
+CONFIG_USB=m
+# CONFIG_USB_DEBUG is not set
+
+#
+# Miscellaneous USB options
+#
+CONFIG_USB_DEVICEFS=y
+# CONFIG_USB_BANDWIDTH is not set
+
+#
+# USB Controllers
+#
+# CONFIG_USB_UHCI is not set
+# CONFIG_USB_UHCI_ALT is not set
+CONFIG_USB_OHCI=m
+
+#
+# USB Device Class drivers
+#
+# CONFIG_USB_AUDIO is not set
+# CONFIG_USB_BLUETOOTH is not set
+# CONFIG_USB_STORAGE is not set
+# CONFIG_USB_ACM is not set
+# CONFIG_USB_PRINTER is not set
+
+#
+# USB Human Interface Devices (HID)
+#
+CONFIG_USB_HID=m
+CONFIG_USB_KBD=m
+CONFIG_USB_MOUSE=m
+# CONFIG_USB_WACOM is not set
+
+#
+# USB Imaging devices
+#
+# CONFIG_USB_DC2XX is not set
+# CONFIG_USB_MDC800 is not set
+# CONFIG_USB_SCANNER is not set
+# CONFIG_USB_MICROTEK is not set
+
+#
+# USB Multimedia devices
+#
+# CONFIG_USB_IBMCAM is not set
+# CONFIG_USB_OV511 is not set
+# CONFIG_USB_DSBR is not set
+# CONFIG_USB_DABUSB is not set
+
+#
+# USB Network adaptors
+#
+# CONFIG_USB_PLUSB is not set
+# CONFIG_USB_PEGASUS is not set
+# CONFIG_USB_NET1080 is not set
+
+#
+# USB port drivers
+#
+# CONFIG_USB_USS720 is not set
+
+#
+# USB Serial Converter support
+#
+# CONFIG_USB_SERIAL is not set
+
+#
+# USB misc drivers
+#
+# CONFIG_USB_RIO500 is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_NO_FRAME_POINTER is not set
+CONFIG_DEBUG_ERRORS=y
+CONFIG_DEBUG_USER=y
+CONFIG_DEBUG_INFO=y
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_NO_PGT_CACHE is not set
+CONFIG_DEBUG_LL=y
+# CONFIG_DEBUG_DC21285_PORT is not set
diff -u --recursive --new-file v2.4.8/linux/arch/arm/def-configs/pfs168_mqvga linux/arch/arm/def-configs/pfs168_mqvga
--- v2.4.8/linux/arch/arm/def-configs/pfs168_mqvga	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/def-configs/pfs168_mqvga	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,793 @@
+#
+# Automatically generated make config: don't edit
+#
+CONFIG_ARM=y
+# CONFIG_EISA is not set
+# CONFIG_SBUS is not set
+# CONFIG_MCA is not set
+CONFIG_UID16=y
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+# CONFIG_OBSOLETE is not set
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_KMOD is not set
+
+#
+# System Type
+#
+# CONFIG_ARCH_ARCA5K is not set
+# CONFIG_ARCH_CLPS7500 is not set
+# CONFIG_ARCH_CO285 is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_L7200 is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_RPC is not set
+CONFIG_ARCH_SA1100=y
+# CONFIG_ARCH_CLPS711X is not set
+
+#
+# Archimedes/A5000 Implementations
+#
+
+#
+# Archimedes/A5000 Implementations (select only ONE)
+#
+# CONFIG_ARCH_ARC is not set
+# CONFIG_ARCH_A5K is not set
+
+#
+# Footbridge Implementations
+#
+# CONFIG_ARCH_CATS is not set
+# CONFIG_ARCH_PERSONAL_SERVER is not set
+# CONFIG_ARCH_EBSA285_ADDIN is not set
+# CONFIG_ARCH_EBSA285_HOST is not set
+# CONFIG_ARCH_NETWINDER is not set
+
+#
+# SA11x0 Implementations
+#
+# CONFIG_SA1100_ASSABET is not set
+# CONFIG_ASSABET_NEPONSET is not set
+# CONFIG_SA1100_BRUTUS is not set
+# CONFIG_SA1100_CERF is not set
+# CONFIG_SA1100_BITSY is not set
+# CONFIG_SA1100_EXTENEX1 is not set
+# CONFIG_SA1100_FREEBIRD is not set
+# CONFIG_SA1100_GRAPHICSCLIENT is not set
+# CONFIG_SA1100_HUW_WEBPANEL is not set
+# CONFIG_SA1100_LART is not set
+# CONFIG_SA1100_PLEB is not set
+# CONFIG_SA1100_NANOENGINE is not set
+# CONFIG_SA1100_PANGOLIN is not set
+# CONFIG_SA1100_SHERMAN is not set
+# CONFIG_SA1100_VICTOR is not set
+# CONFIG_SA1100_XP860 is not set
+# CONFIG_SA1100_YOPY is not set
+CONFIG_SA1100_PFS168=y
+CONFIG_SA1111=y
+CONFIG_SA1100_USB=m
+CONFIG_SA1100_USB_NETLINK=m
+CONFIG_SA1100_USB_CHAR=m
+CONFIG_SA1100_FREQUENCY_SCALE=m
+# CONFIG_SA1100_VOLTAGE_SCALE is not set
+
+#
+# CLPS711X/EP721X Implementations
+#
+# CONFIG_ARCH_P720T is not set
+# CONFIG_ARCH_ACORN is not set
+# CONFIG_FOOTBRIDGE is not set
+# CONFIG_FOOTBRIDGE_HOST is not set
+# CONFIG_FOOTBRIDGE_ADDIN is not set
+CONFIG_CPU_32=y
+# CONFIG_CPU_26 is not set
+
+#
+# Processor Type
+#
+# CONFIG_CPU_32v3 is not set
+CONFIG_CPU_32v4=y
+# CONFIG_CPU_ARM610 is not set
+# CONFIG_CPU_ARM710 is not set
+# CONFIG_CPU_ARM720T is not set
+# CONFIG_CPU_ARM920T is not set
+# CONFIG_CPU_ARM1020 is not set
+# CONFIG_CPU_SA110 is not set
+CONFIG_CPU_SA1100=y
+CONFIG_DISCONTIGMEM=y
+
+#
+# General setup
+#
+
+#
+# Please ensure that you have read the help on the next option
+#
+# CONFIG_ANGELBOOT is not set
+# CONFIG_PCI is not set
+# CONFIG_ISA is not set
+# CONFIG_ISA_DMA is not set
+CONFIG_HOTPLUG=y
+
+#
+# PCMCIA/CardBus support
+#
+CONFIG_PCMCIA=m
+# CONFIG_I82365 is not set
+# CONFIG_TCIC is not set
+# CONFIG_PCMCIA_CLPS6700 is not set
+CONFIG_PCMCIA_SA1100=m
+CONFIG_NET=y
+CONFIG_SYSVIPC=y
+# CONFIG_BSD_PROCESS_ACCT is not set
+CONFIG_SYSCTL=y
+CONFIG_FPE_NWFPE=y
+# CONFIG_FPE_FASTFPE is not set
+CONFIG_KCORE_ELF=y
+# CONFIG_KCORE_AOUT is not set
+# CONFIG_BINFMT_AOUT is not set
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_MISC is not set
+# CONFIG_PM is not set
+# CONFIG_ARTHUR is not set
+CONFIG_CMDLINE="root=/dev/nfs"
+# CONFIG_PFS168_CMDLINE is not set
+CONFIG_LEDS=y
+CONFIG_LEDS_TIMER=y
+CONFIG_LEDS_CPU=y
+CONFIG_ALIGNMENT_TRAP=y
+CONFIG_UCB1200=y
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOC1000 is not set
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOCPROBE is not set
+
+#
+# RAM/ROM Device Drivers
+#
+# CONFIG_MTD_PMC551 is not set
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_MTDRAM is not set
+
+#
+# Linearly Mapped Flash Device Drivers
+#
+CONFIG_MTD_CFI=y
+# CONFIG_MTD_CFI_GEOMETRY is not set
+CONFIG_MTD_CFI_INTELEXT=y
+# CONFIG_MTD_CFI_AMDSTD is not set
+# CONFIG_MTD_AMDSTD is not set
+# CONFIG_MTD_SHARP is not set
+# CONFIG_MTD_PHYSMAP is not set
+# CONFIG_MTD_NORA is not set
+# CONFIG_MTD_PNC2000 is not set
+# CONFIG_MTD_RPXLITE is not set
+# CONFIG_MTD_SC520CDP is not set
+# CONFIG_MTD_SBC_MEDIAGX is not set
+# CONFIG_MTD_ELAN_104NC is not set
+CONFIG_MTD_SA1100=y
+# CONFIG_MTD_DC21285 is not set
+# CONFIG_MTD_CSTM_CFI_JEDEC is not set
+# CONFIG_MTD_JEDEC is not set
+# CONFIG_MTD_MIXMEM is not set
+# CONFIG_MTD_OCTAGON is not set
+# CONFIG_MTD_VMAX is not set
+
+#
+# NAND Flash Device Drivers
+#
+# CONFIG_MTD_NAND is not set
+# CONFIG_MTD_NAND_SPIA is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLOCK=y
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
+
+#
+# Plug and Play configuration
+#
+# CONFIG_PNP is not set
+# CONFIG_ISAPNP is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_DEV_XD is not set
+# CONFIG_PARIDE is not set
+# CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
+# CONFIG_BLK_DEV_DAC960 is not set
+# CONFIG_BLK_DEV_LOOP is not set
+# CONFIG_BLK_DEV_NBD is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BLK_DEV_INITRD=y
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+# CONFIG_BLK_DEV_MD is not set
+# CONFIG_MD_LINEAR is not set
+# CONFIG_MD_RAID0 is not set
+# CONFIG_MD_RAID1 is not set
+# CONFIG_MD_RAID5 is not set
+# CONFIG_BLK_DEV_LVM is not set
+
+#
+# Networking options
+#
+CONFIG_PACKET=y
+# CONFIG_PACKET_MMAP is not set
+# CONFIG_NETLINK is not set
+# CONFIG_NETFILTER is not set
+# CONFIG_FILTER is not set
+CONFIG_UNIX=y
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_PNP=y
+CONFIG_IP_PNP_BOOTP=y
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_INET_ECN is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_IPV6 is not set
+# CONFIG_KHTTPD is not set
+# CONFIG_ATM is not set
+
+#
+#
+#
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_DECNET is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_LLC is not set
+# CONFIG_NET_DIVERT is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+# CONFIG_NET_FASTROUTE is not set
+# CONFIG_NET_HW_FLOWCONTROL is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED is not set
+
+#
+# Network device support
+#
+CONFIG_NETDEVICES=y
+
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+# CONFIG_NET_SB1000 is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+# CONFIG_NET_VENDOR_3COM is not set
+# CONFIG_LANCE is not set
+CONFIG_NET_VENDOR_SMC=y
+# CONFIG_WD80x3 is not set
+# CONFIG_ULTRA is not set
+# CONFIG_ULTRA32 is not set
+CONFIG_SMC9194=y
+# CONFIG_NET_VENDOR_RACAL is not set
+# CONFIG_AT1700 is not set
+# CONFIG_DEPCA is not set
+# CONFIG_NET_ISA is not set
+# CONFIG_NET_PCI is not set
+# CONFIG_NET_POCKET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+# CONFIG_ACENIC is not set
+# CONFIG_HAMACHI is not set
+# CONFIG_YELLOWFIN is not set
+# CONFIG_SK98LIN is not set
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI is not set
+CONFIG_PPP=m
+# CONFIG_PPP_MULTILINK is not set
+CONFIG_PPP_ASYNC=m
+CONFIG_PPP_SYNC_TTY=m
+CONFIG_PPP_DEFLATE=m
+# CONFIG_PPP_BSDCOMP is not set
+# CONFIG_PPPOE is not set
+# CONFIG_SLIP is not set
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Token Ring devices
+#
+# CONFIG_TR is not set
+# CONFIG_NET_FC is not set
+# CONFIG_RCPCI is not set
+# CONFIG_SHAPER is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+
+#
+# PCMCIA network device support
+#
+CONFIG_NET_PCMCIA=y
+# CONFIG_PCMCIA_3C589 is not set
+# CONFIG_PCMCIA_3C574 is not set
+# CONFIG_PCMCIA_FMVJ18X is not set
+CONFIG_PCMCIA_PCNET=m
+# CONFIG_PCMCIA_NMCLAN is not set
+CONFIG_PCMCIA_SMC91C92=m
+# CONFIG_PCMCIA_XIRC2PS is not set
+# CONFIG_ARCNET_COM20020_CS is not set
+# CONFIG_PCMCIA_IBMTR is not set
+# CONFIG_NET_PCMCIA_RADIO is not set
+
+#
+# Amateur Radio support
+#
+# CONFIG_HAMRADIO is not set
+
+#
+# IrDA (infrared) support
+#
+CONFIG_IRDA=m
+
+#
+# IrDA protocols
+#
+CONFIG_IRLAN=m
+CONFIG_IRNET=m
+CONFIG_IRCOMM=m
+CONFIG_IRDA_ULTRA=y
+# CONFIG_IRDA_OPTIONS is not set
+
+#
+# Infrared-port device drivers
+#
+
+#
+# SIR device drivers
+#
+CONFIG_IRTTY_SIR=m
+CONFIG_IRPORT_SIR=m
+
+#
+# FIR device drivers
+#
+# CONFIG_NSC_FIR is not set
+# CONFIG_WINBOND_FIR is not set
+# CONFIG_TOSHIBA_FIR is not set
+# CONFIG_SMC_IRCC_FIR is not set
+CONFIG_SA1100_FIR=m
+
+#
+# Dongle support
+#
+# CONFIG_DONGLE is not set
+
+#
+# ATA/IDE/MFM/RLL support
+#
+CONFIG_IDE=m
+
+#
+# IDE, ATA and ATAPI Block devices
+#
+CONFIG_BLK_DEV_IDE=m
+
+#
+# Please see Documentation/ide.txt for help/info on IDE drives
+#
+# CONFIG_BLK_DEV_HD_IDE is not set
+# CONFIG_BLK_DEV_HD is not set
+CONFIG_BLK_DEV_IDEDISK=m
+# CONFIG_IDEDISK_MULTI_MODE is not set
+# CONFIG_BLK_DEV_IDEDISK_VENDOR is not set
+# CONFIG_BLK_DEV_IDEDISK_FUJITSU is not set
+# CONFIG_BLK_DEV_IDEDISK_IBM is not set
+# CONFIG_BLK_DEV_IDEDISK_MAXTOR is not set
+# CONFIG_BLK_DEV_IDEDISK_QUANTUM is not set
+# CONFIG_BLK_DEV_IDEDISK_SEAGATE is not set
+# CONFIG_BLK_DEV_IDEDISK_WD is not set
+# CONFIG_BLK_DEV_COMMERIAL is not set
+# CONFIG_BLK_DEV_TIVO is not set
+CONFIG_BLK_DEV_IDECS=m
+# CONFIG_BLK_DEV_IDECD is not set
+# CONFIG_BLK_DEV_IDETAPE is not set
+# CONFIG_BLK_DEV_IDEFLOPPY is not set
+# CONFIG_BLK_DEV_IDESCSI is not set
+
+#
+# IDE chipset support/bugfixes
+#
+# CONFIG_BLK_DEV_CMD640 is not set
+# CONFIG_BLK_DEV_CMD640_ENHANCED is not set
+# CONFIG_BLK_DEV_ISAPNP is not set
+# CONFIG_IDE_CHIPSETS is not set
+# CONFIG_IDEDMA_AUTO is not set
+# CONFIG_DMA_NONPCI is not set
+# CONFIG_BLK_DEV_IDE_MODES is not set
+
+#
+# SCSI support
+#
+# CONFIG_SCSI is not set
+
+#
+# I2O device support
+#
+# CONFIG_I2O is not set
+# CONFIG_I2O_BLOCK is not set
+# CONFIG_I2O_LAN is not set
+# CONFIG_I2O_SCSI is not set
+# CONFIG_I2O_PROC is not set
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Input core support
+#
+CONFIG_INPUT=y
+CONFIG_INPUT_KEYBDEV=y
+CONFIG_INPUT_MOUSEDEV=y
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_EVDEV is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+# CONFIG_VT_CONSOLE is not set
+CONFIG_SERIAL=y
+# CONFIG_SERIAL_CONSOLE is not set
+# CONFIG_SERIAL_EXTENDED is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+CONFIG_SERIAL_SA1100=y
+CONFIG_SERIAL_SA1100_CONSOLE=y
+CONFIG_SA1100_DEFAULT_BAUDRATE=115200
+CONFIG_TOUCHSCREEN_UCB1200=y
+# CONFIG_TOUCHSCREEN_BITSY is not set
+# CONFIG_PROFILER is not set
+# CONFIG_PFS168_SPI is not set
+CONFIG_PFS168_DTMF=y
+CONFIG_PFS168_MISC=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_UNIX98_PTY_COUNT=32
+
+#
+# I2C support
+#
+CONFIG_I2C=y
+CONFIG_I2C_ALGOBIT=y
+# CONFIG_I2C_PHILIPSPAR is not set
+# CONFIG_I2C_ELV is not set
+# CONFIG_I2C_VELLEMAN is not set
+# CONFIG_I2C_ASSABET is not set
+CONFIG_I2C_PFS168=y
+# CONFIG_I2C_ALGOPCF is not set
+CONFIG_I2C_CHARDEV=y
+CONFIG_I2C_SENSORS=y
+CONFIG_I2C_EEPROM=y
+CONFIG_I2C_EEPROM=y
+CONFIG_I2C_M41T11=y
+CONFIG_I2C_X9221=y
+CONFIG_I2C_PCF8574=y
+
+#
+# Mice
+#
+# CONFIG_BUSMOUSE is not set
+CONFIG_MOUSE=y
+CONFIG_PSMOUSE=y
+# CONFIG_82C710_MOUSE is not set
+# CONFIG_PC110_PAD is not set
+
+#
+# Joysticks
+#
+# CONFIG_JOYSTICK is not set
+
+#
+# Input core support is needed for joysticks
+#
+# CONFIG_QIC02_TAPE is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_INTEL_RNG is not set
+# CONFIG_NVRAM is not set
+# CONFIG_RTC is not set
+# CONFIG_SA1100_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_FTAPE is not set
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+CONFIG_PCMCIA_SERIAL=m
+
+#
+# PCMCIA character device support
+#
+# CONFIG_PCMCIA_SERIAL_CS is not set
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# File systems
+#
+# CONFIG_QUOTA is not set
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_AUTOFS4_FS is not set
+# CONFIG_REISERFS_FS is not set
+# CONFIG_REISERFS_CHECK is not set
+# CONFIG_ADFS_FS is not set
+# CONFIG_ADFS_FS_RW is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_FAT_FS is not set
+# CONFIG_MSDOS_FS is not set
+# CONFIG_UMSDOS_FS is not set
+# CONFIG_VFAT_FS is not set
+# CONFIG_EFS_FS is not set
+CONFIG_JFFS_FS=y
+CONFIG_JFFS_FS_VERBOSE=0
+# CONFIG_JFFS2_FS is not set
+# CONFIG_CRAMFS is not set
+# CONFIG_RAMFS is not set
+# CONFIG_ISO9660_FS is not set
+# CONFIG_JOLIET is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_NTFS_FS is not set
+# CONFIG_NTFS_RW is not set
+# CONFIG_HPFS_FS is not set
+CONFIG_PROC_FS=y
+# CONFIG_DEVFS_FS is not set
+# CONFIG_DEVFS_MOUNT is not set
+# CONFIG_DEVFS_DEBUG is not set
+CONFIG_DEVPTS_FS=y
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_QNX4FS_RW is not set
+# CONFIG_ROMFS_FS is not set
+CONFIG_EXT2_FS=y
+# CONFIG_SYSV_FS is not set
+# CONFIG_SYSV_FS_WRITE is not set
+# CONFIG_UDF_FS is not set
+# CONFIG_UDF_RW is not set
+# CONFIG_UFS_FS is not set
+# CONFIG_UFS_FS_WRITE is not set
+
+#
+# Network File Systems
+#
+# CONFIG_CODA_FS is not set
+CONFIG_NFS_FS=y
+# CONFIG_NFS_V3 is not set
+CONFIG_ROOT_NFS=y
+# CONFIG_NFSD is not set
+# CONFIG_NFSD_V3 is not set
+CONFIG_SUNRPC=y
+CONFIG_LOCKD=y
+# CONFIG_SMB_FS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_NCPFS_PACKET_SIGNING is not set
+# CONFIG_NCPFS_IOCTL_LOCKING is not set
+# CONFIG_NCPFS_STRONG is not set
+# CONFIG_NCPFS_NFS_NS is not set
+# CONFIG_NCPFS_OS2_NS is not set
+# CONFIG_NCPFS_SMALLDOS is not set
+# CONFIG_NCPFS_NLS is not set
+# CONFIG_NCPFS_EXTRAS is not set
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+# CONFIG_SMB_NLS is not set
+# CONFIG_NLS is not set
+
+#
+# Console drivers
+#
+CONFIG_PC_KEYMAP=y
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_FB=y
+
+#
+# Frame-buffer support
+#
+CONFIG_FB=y
+CONFIG_DUMMY_CONSOLE=y
+# CONFIG_FB_ACORN is not set
+# CONFIG_FB_CLPS711X is not set
+# CONFIG_FB_CYBER2000 is not set
+# CONFIG_FB_SA1100 is not set
+CONFIG_FB_MQ200=y
+CONFIG_PFS168_MQVGA=y
+# CONFIG_PFS168_MQTFT is not set
+# CONFIG_FB_VIRTUAL is not set
+CONFIG_FBCON_ADVANCED=y
+# CONFIG_FBCON_MFB is not set
+# CONFIG_FBCON_CFB2 is not set
+# CONFIG_FBCON_CFB4 is not set
+CONFIG_FBCON_CFB8=y
+CONFIG_FBCON_CFB16=y
+CONFIG_FBCON_CFB24=y
+CONFIG_FBCON_CFB32=y
+# CONFIG_FBCON_AFB is not set
+# CONFIG_FBCON_ILBM is not set
+# CONFIG_FBCON_IPLAN2P2 is not set
+# CONFIG_FBCON_IPLAN2P4 is not set
+# CONFIG_FBCON_IPLAN2P8 is not set
+# CONFIG_FBCON_MAC is not set
+# CONFIG_FBCON_VGA_PLANES is not set
+# CONFIG_FBCON_VGA is not set
+# CONFIG_FBCON_HGA is not set
+CONFIG_FBCON_FONTWIDTH8_ONLY=y
+CONFIG_FBCON_FONTS=y
+CONFIG_FONT_8x8=y
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+
+#
+# USB support
+#
+CONFIG_USB=m
+# CONFIG_USB_DEBUG is not set
+
+#
+# Miscellaneous USB options
+#
+CONFIG_USB_DEVICEFS=y
+# CONFIG_USB_BANDWIDTH is not set
+
+#
+# USB Controllers
+#
+# CONFIG_USB_UHCI is not set
+# CONFIG_USB_UHCI_ALT is not set
+CONFIG_USB_OHCI=m
+
+#
+# USB Device Class drivers
+#
+# CONFIG_USB_AUDIO is not set
+# CONFIG_USB_BLUETOOTH is not set
+# CONFIG_USB_STORAGE is not set
+# CONFIG_USB_ACM is not set
+# CONFIG_USB_PRINTER is not set
+
+#
+# USB Human Interface Devices (HID)
+#
+CONFIG_USB_HID=m
+CONFIG_USB_KBD=m
+CONFIG_USB_MOUSE=m
+# CONFIG_USB_WACOM is not set
+
+#
+# USB Imaging devices
+#
+# CONFIG_USB_DC2XX is not set
+# CONFIG_USB_MDC800 is not set
+# CONFIG_USB_SCANNER is not set
+# CONFIG_USB_MICROTEK is not set
+
+#
+# USB Multimedia devices
+#
+# CONFIG_USB_IBMCAM is not set
+# CONFIG_USB_OV511 is not set
+# CONFIG_USB_DSBR is not set
+# CONFIG_USB_DABUSB is not set
+
+#
+# USB Network adaptors
+#
+# CONFIG_USB_PLUSB is not set
+# CONFIG_USB_PEGASUS is not set
+# CONFIG_USB_NET1080 is not set
+
+#
+# USB port drivers
+#
+# CONFIG_USB_USS720 is not set
+
+#
+# USB Serial Converter support
+#
+# CONFIG_USB_SERIAL is not set
+
+#
+# USB misc drivers
+#
+# CONFIG_USB_RIO500 is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_NO_FRAME_POINTER is not set
+CONFIG_DEBUG_ERRORS=y
+CONFIG_DEBUG_USER=y
+CONFIG_DEBUG_INFO=y
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_NO_PGT_CACHE is not set
+CONFIG_DEBUG_LL=y
+# CONFIG_DEBUG_DC21285_PORT is not set
diff -u --recursive --new-file v2.4.8/linux/arch/arm/def-configs/pfs168_sastn linux/arch/arm/def-configs/pfs168_sastn
--- v2.4.8/linux/arch/arm/def-configs/pfs168_sastn	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/def-configs/pfs168_sastn	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,785 @@
+#
+# Automatically generated make config: don't edit
+#
+CONFIG_ARM=y
+# CONFIG_EISA is not set
+# CONFIG_SBUS is not set
+# CONFIG_MCA is not set
+CONFIG_UID16=y
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+# CONFIG_OBSOLETE is not set
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_KMOD is not set
+
+#
+# System Type
+#
+# CONFIG_ARCH_ARCA5K is not set
+# CONFIG_ARCH_CLPS7500 is not set
+# CONFIG_ARCH_CO285 is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_L7200 is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_RPC is not set
+CONFIG_ARCH_SA1100=y
+# CONFIG_ARCH_CLPS711X is not set
+
+#
+# Archimedes/A5000 Implementations
+#
+
+#
+# Archimedes/A5000 Implementations (select only ONE)
+#
+# CONFIG_ARCH_ARC is not set
+# CONFIG_ARCH_A5K is not set
+
+#
+# Footbridge Implementations
+#
+# CONFIG_ARCH_CATS is not set
+# CONFIG_ARCH_PERSONAL_SERVER is not set
+# CONFIG_ARCH_EBSA285_ADDIN is not set
+# CONFIG_ARCH_EBSA285_HOST is not set
+# CONFIG_ARCH_NETWINDER is not set
+
+#
+# SA11x0 Implementations
+#
+# CONFIG_SA1100_ASSABET is not set
+# CONFIG_ASSABET_NEPONSET is not set
+# CONFIG_SA1100_BRUTUS is not set
+# CONFIG_SA1100_CERF is not set
+# CONFIG_SA1100_BITSY is not set
+# CONFIG_SA1100_EXTENEX1 is not set
+# CONFIG_SA1100_FREEBIRD is not set
+# CONFIG_SA1100_GRAPHICSCLIENT is not set
+# CONFIG_SA1100_HUW_WEBPANEL is not set
+# CONFIG_SA1100_LART is not set
+# CONFIG_SA1100_PLEB is not set
+# CONFIG_SA1100_NANOENGINE is not set
+# CONFIG_SA1100_PANGOLIN is not set
+# CONFIG_SA1100_SHERMAN is not set
+# CONFIG_SA1100_VICTOR is not set
+# CONFIG_SA1100_XP860 is not set
+# CONFIG_SA1100_YOPY is not set
+CONFIG_SA1100_PFS168=y
+CONFIG_SA1111=y
+CONFIG_SA1100_USB=m
+CONFIG_SA1100_USB_NETLINK=m
+CONFIG_SA1100_USB_CHAR=m
+CONFIG_SA1100_FREQUENCY_SCALE=m
+# CONFIG_SA1100_VOLTAGE_SCALE is not set
+
+#
+# CLPS711X/EP721X Implementations
+#
+# CONFIG_ARCH_P720T is not set
+# CONFIG_ARCH_ACORN is not set
+# CONFIG_FOOTBRIDGE is not set
+# CONFIG_FOOTBRIDGE_HOST is not set
+# CONFIG_FOOTBRIDGE_ADDIN is not set
+CONFIG_CPU_32=y
+# CONFIG_CPU_26 is not set
+
+#
+# Processor Type
+#
+# CONFIG_CPU_32v3 is not set
+CONFIG_CPU_32v4=y
+# CONFIG_CPU_ARM610 is not set
+# CONFIG_CPU_ARM710 is not set
+# CONFIG_CPU_ARM720T is not set
+# CONFIG_CPU_ARM920T is not set
+# CONFIG_CPU_ARM1020 is not set
+# CONFIG_CPU_SA110 is not set
+CONFIG_CPU_SA1100=y
+CONFIG_DISCONTIGMEM=y
+
+#
+# General setup
+#
+
+#
+# Please ensure that you have read the help on the next option
+#
+# CONFIG_ANGELBOOT is not set
+# CONFIG_PCI is not set
+# CONFIG_ISA is not set
+# CONFIG_ISA_DMA is not set
+CONFIG_HOTPLUG=y
+
+#
+# PCMCIA/CardBus support
+#
+CONFIG_PCMCIA=m
+# CONFIG_I82365 is not set
+# CONFIG_TCIC is not set
+# CONFIG_PCMCIA_CLPS6700 is not set
+CONFIG_PCMCIA_SA1100=m
+CONFIG_NET=y
+CONFIG_SYSVIPC=y
+# CONFIG_BSD_PROCESS_ACCT is not set
+CONFIG_SYSCTL=y
+CONFIG_FPE_NWFPE=y
+# CONFIG_FPE_FASTFPE is not set
+CONFIG_KCORE_ELF=y
+# CONFIG_KCORE_AOUT is not set
+# CONFIG_BINFMT_AOUT is not set
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_MISC is not set
+# CONFIG_PM is not set
+# CONFIG_ARTHUR is not set
+CONFIG_CMDLINE="root=/dev/nfs"
+# CONFIG_PFS168_CMDLINE is not set
+CONFIG_LEDS=y
+CONFIG_LEDS_TIMER=y
+CONFIG_LEDS_CPU=y
+CONFIG_ALIGNMENT_TRAP=y
+CONFIG_UCB1200=y
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOC1000 is not set
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOCPROBE is not set
+
+#
+# RAM/ROM Device Drivers
+#
+# CONFIG_MTD_PMC551 is not set
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_MTDRAM is not set
+
+#
+# Linearly Mapped Flash Device Drivers
+#
+CONFIG_MTD_CFI=y
+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
+CONFIG_MTD_CFI_INTELEXT=y
+# CONFIG_MTD_CFI_AMDSTD is not set
+# CONFIG_MTD_AMDSTD is not set
+# CONFIG_MTD_SHARP is not set
+# CONFIG_MTD_PHYSMAP is not set
+# CONFIG_MTD_NORA is not set
+# CONFIG_MTD_PNC2000 is not set
+# CONFIG_MTD_RPXLITE is not set
+# CONFIG_MTD_SC520CDP is not set
+# CONFIG_MTD_SBC_MEDIAGX is not set
+# CONFIG_MTD_ELAN_104NC is not set
+CONFIG_MTD_SA1100=y
+# CONFIG_MTD_DC21285 is not set
+# CONFIG_MTD_IQ80310 is not set
+# CONFIG_MTD_CSTM_CFI_JEDEC is not set
+# CONFIG_MTD_JEDEC is not set
+# CONFIG_MTD_MIXMEM is not set
+# CONFIG_MTD_OCTAGON is not set
+# CONFIG_MTD_VMAX is not set
+
+#
+# NAND Flash Device Drivers
+#
+# CONFIG_MTD_NAND is not set
+# CONFIG_MTD_NAND_SPIA is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLOCK=y
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
+
+#
+# Plug and Play configuration
+#
+# CONFIG_PNP is not set
+# CONFIG_ISAPNP is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_DEV_XD is not set
+# CONFIG_PARIDE is not set
+# CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
+# CONFIG_BLK_DEV_DAC960 is not set
+# CONFIG_BLK_DEV_LOOP is not set
+# CONFIG_BLK_DEV_NBD is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BLK_DEV_INITRD=y
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+# CONFIG_BLK_DEV_MD is not set
+# CONFIG_MD_LINEAR is not set
+# CONFIG_MD_RAID0 is not set
+# CONFIG_MD_RAID1 is not set
+# CONFIG_MD_RAID5 is not set
+# CONFIG_BLK_DEV_LVM is not set
+
+#
+# Networking options
+#
+CONFIG_PACKET=y
+# CONFIG_PACKET_MMAP is not set
+# CONFIG_NETLINK is not set
+# CONFIG_NETFILTER is not set
+# CONFIG_FILTER is not set
+CONFIG_UNIX=y
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_PNP=y
+CONFIG_IP_PNP_BOOTP=y
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_INET_ECN is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_IPV6 is not set
+# CONFIG_KHTTPD is not set
+# CONFIG_ATM is not set
+
+#
+#
+#
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_DECNET is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_LLC is not set
+# CONFIG_NET_DIVERT is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+# CONFIG_NET_FASTROUTE is not set
+# CONFIG_NET_HW_FLOWCONTROL is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED is not set
+
+#
+# Network device support
+#
+CONFIG_NETDEVICES=y
+
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+# CONFIG_NET_SB1000 is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+# CONFIG_NET_VENDOR_3COM is not set
+# CONFIG_LANCE is not set
+CONFIG_NET_VENDOR_SMC=y
+# CONFIG_WD80x3 is not set
+# CONFIG_ULTRA is not set
+# CONFIG_ULTRA32 is not set
+CONFIG_SMC9194=y
+# CONFIG_NET_VENDOR_RACAL is not set
+# CONFIG_AT1700 is not set
+# CONFIG_DEPCA is not set
+# CONFIG_NET_ISA is not set
+# CONFIG_NET_PCI is not set
+# CONFIG_NET_POCKET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+# CONFIG_ACENIC is not set
+# CONFIG_HAMACHI is not set
+# CONFIG_YELLOWFIN is not set
+# CONFIG_SK98LIN is not set
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI is not set
+CONFIG_PPP=m
+# CONFIG_PPP_MULTILINK is not set
+CONFIG_PPP_ASYNC=m
+CONFIG_PPP_SYNC_TTY=m
+CONFIG_PPP_DEFLATE=m
+# CONFIG_PPP_BSDCOMP is not set
+# CONFIG_PPPOE is not set
+# CONFIG_SLIP is not set
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Token Ring devices
+#
+# CONFIG_TR is not set
+# CONFIG_NET_FC is not set
+# CONFIG_RCPCI is not set
+# CONFIG_SHAPER is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+
+#
+# PCMCIA network device support
+#
+CONFIG_NET_PCMCIA=y
+# CONFIG_PCMCIA_3C589 is not set
+# CONFIG_PCMCIA_3C574 is not set
+# CONFIG_PCMCIA_FMVJ18X is not set
+CONFIG_PCMCIA_PCNET=m
+# CONFIG_PCMCIA_NMCLAN is not set
+CONFIG_PCMCIA_SMC91C92=m
+# CONFIG_PCMCIA_XIRC2PS is not set
+# CONFIG_ARCNET_COM20020_CS is not set
+# CONFIG_PCMCIA_IBMTR is not set
+# CONFIG_NET_PCMCIA_RADIO is not set
+
+#
+# Amateur Radio support
+#
+# CONFIG_HAMRADIO is not set
+
+#
+# IrDA (infrared) support
+#
+CONFIG_IRDA=m
+
+#
+# IrDA protocols
+#
+CONFIG_IRLAN=m
+CONFIG_IRNET=m
+CONFIG_IRCOMM=m
+CONFIG_IRDA_ULTRA=y
+# CONFIG_IRDA_OPTIONS is not set
+
+#
+# Infrared-port device drivers
+#
+
+#
+# SIR device drivers
+#
+CONFIG_IRTTY_SIR=m
+CONFIG_IRPORT_SIR=m
+
+#
+# FIR device drivers
+#
+# CONFIG_NSC_FIR is not set
+# CONFIG_WINBOND_FIR is not set
+# CONFIG_TOSHIBA_FIR is not set
+# CONFIG_SMC_IRCC_FIR is not set
+CONFIG_SA1100_FIR=m
+
+#
+# Dongle support
+#
+# CONFIG_DONGLE is not set
+
+#
+# ATA/IDE/MFM/RLL support
+#
+CONFIG_IDE=m
+
+#
+# IDE, ATA and ATAPI Block devices
+#
+CONFIG_BLK_DEV_IDE=m
+
+#
+# Please see Documentation/ide.txt for help/info on IDE drives
+#
+# CONFIG_BLK_DEV_HD_IDE is not set
+# CONFIG_BLK_DEV_HD is not set
+CONFIG_BLK_DEV_IDEDISK=m
+# CONFIG_IDEDISK_MULTI_MODE is not set
+# CONFIG_BLK_DEV_IDEDISK_VENDOR is not set
+# CONFIG_BLK_DEV_IDEDISK_FUJITSU is not set
+# CONFIG_BLK_DEV_IDEDISK_IBM is not set
+# CONFIG_BLK_DEV_IDEDISK_MAXTOR is not set
+# CONFIG_BLK_DEV_IDEDISK_QUANTUM is not set
+# CONFIG_BLK_DEV_IDEDISK_SEAGATE is not set
+# CONFIG_BLK_DEV_IDEDISK_WD is not set
+# CONFIG_BLK_DEV_COMMERIAL is not set
+# CONFIG_BLK_DEV_TIVO is not set
+CONFIG_BLK_DEV_IDECS=m
+# CONFIG_BLK_DEV_IDECD is not set
+# CONFIG_BLK_DEV_IDETAPE is not set
+# CONFIG_BLK_DEV_IDEFLOPPY is not set
+# CONFIG_BLK_DEV_IDESCSI is not set
+
+#
+# IDE chipset support/bugfixes
+#
+# CONFIG_BLK_DEV_CMD640 is not set
+# CONFIG_BLK_DEV_CMD640_ENHANCED is not set
+# CONFIG_BLK_DEV_ISAPNP is not set
+# CONFIG_IDE_CHIPSETS is not set
+# CONFIG_IDEDMA_AUTO is not set
+# CONFIG_DMA_NONPCI is not set
+# CONFIG_BLK_DEV_IDE_MODES is not set
+
+#
+# SCSI support
+#
+# CONFIG_SCSI is not set
+
+#
+# I2O device support
+#
+# CONFIG_I2O is not set
+# CONFIG_I2O_BLOCK is not set
+# CONFIG_I2O_LAN is not set
+# CONFIG_I2O_SCSI is not set
+# CONFIG_I2O_PROC is not set
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Input core support
+#
+CONFIG_INPUT=y
+CONFIG_INPUT_KEYBDEV=y
+CONFIG_INPUT_MOUSEDEV=y
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_EVDEV is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+# CONFIG_VT_CONSOLE is not set
+CONFIG_SERIAL=y
+# CONFIG_SERIAL_CONSOLE is not set
+# CONFIG_SERIAL_EXTENDED is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+CONFIG_SERIAL_SA1100=y
+CONFIG_SERIAL_SA1100_CONSOLE=y
+CONFIG_SA1100_DEFAULT_BAUDRATE=115200
+CONFIG_TOUCHSCREEN_UCB1200=y
+# CONFIG_TOUCHSCREEN_BITSY is not set
+# CONFIG_PROFILER is not set
+# CONFIG_PFS168_SPI is not set
+CONFIG_PFS168_DTMF=y
+CONFIG_PFS168_MISC=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_UNIX98_PTY_COUNT=32
+
+#
+# I2C support
+#
+CONFIG_I2C=y
+CONFIG_I2C_ALGOBIT=y
+# CONFIG_I2C_PHILIPSPAR is not set
+# CONFIG_I2C_ELV is not set
+# CONFIG_I2C_VELLEMAN is not set
+# CONFIG_I2C_ASSABET is not set
+# CONFIG_I2C_ALGOPCF is not set
+CONFIG_I2C_CHARDEV=y
+
+#
+# Mice
+#
+# CONFIG_BUSMOUSE is not set
+CONFIG_MOUSE=y
+CONFIG_PSMOUSE=y
+# CONFIG_82C710_MOUSE is not set
+# CONFIG_PC110_PAD is not set
+
+#
+# Joysticks
+#
+# CONFIG_JOYSTICK is not set
+
+#
+# Input core support is needed for joysticks
+#
+# CONFIG_QIC02_TAPE is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_INTEL_RNG is not set
+# CONFIG_NVRAM is not set
+# CONFIG_RTC is not set
+# CONFIG_SA1100_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_FTAPE is not set
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+
+#
+# PCMCIA character devices
+#
+# CONFIG_PCMCIA_SERIAL_CS is not set
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# File systems
+#
+# CONFIG_QUOTA is not set
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_AUTOFS4_FS is not set
+# CONFIG_REISERFS_FS is not set
+# CONFIG_REISERFS_CHECK is not set
+# CONFIG_ADFS_FS is not set
+# CONFIG_ADFS_FS_RW is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_FAT_FS is not set
+# CONFIG_MSDOS_FS is not set
+# CONFIG_UMSDOS_FS is not set
+# CONFIG_VFAT_FS is not set
+# CONFIG_EFS_FS is not set
+CONFIG_JFFS_FS=y
+CONFIG_JFFS_FS_VERBOSE=0
+# CONFIG_JFFS2_FS is not set
+# CONFIG_CRAMFS is not set
+# CONFIG_RAMFS is not set
+# CONFIG_ISO9660_FS is not set
+# CONFIG_JOLIET is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_NTFS_FS is not set
+# CONFIG_NTFS_RW is not set
+# CONFIG_HPFS_FS is not set
+CONFIG_PROC_FS=y
+# CONFIG_DEVFS_FS is not set
+# CONFIG_DEVFS_MOUNT is not set
+# CONFIG_DEVFS_DEBUG is not set
+CONFIG_DEVPTS_FS=y
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_QNX4FS_RW is not set
+# CONFIG_ROMFS_FS is not set
+CONFIG_EXT2_FS=y
+# CONFIG_SYSV_FS is not set
+# CONFIG_SYSV_FS_WRITE is not set
+# CONFIG_UDF_FS is not set
+# CONFIG_UDF_RW is not set
+# CONFIG_UFS_FS is not set
+# CONFIG_UFS_FS_WRITE is not set
+
+#
+# Network File Systems
+#
+# CONFIG_CODA_FS is not set
+CONFIG_NFS_FS=y
+# CONFIG_NFS_V3 is not set
+CONFIG_ROOT_NFS=y
+# CONFIG_NFSD is not set
+# CONFIG_NFSD_V3 is not set
+CONFIG_SUNRPC=y
+CONFIG_LOCKD=y
+# CONFIG_SMB_FS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_NCPFS_PACKET_SIGNING is not set
+# CONFIG_NCPFS_IOCTL_LOCKING is not set
+# CONFIG_NCPFS_STRONG is not set
+# CONFIG_NCPFS_NFS_NS is not set
+# CONFIG_NCPFS_OS2_NS is not set
+# CONFIG_NCPFS_SMALLDOS is not set
+# CONFIG_NCPFS_NLS is not set
+# CONFIG_NCPFS_EXTRAS is not set
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+# CONFIG_SMB_NLS is not set
+# CONFIG_NLS is not set
+
+#
+# Console drivers
+#
+CONFIG_PC_KEYMAP=y
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_FB=y
+
+#
+# Frame-buffer support
+#
+CONFIG_FB=y
+CONFIG_DUMMY_CONSOLE=y
+# CONFIG_FB_ACORN is not set
+# CONFIG_FB_CLPS711X is not set
+# CONFIG_FB_CYBER2000 is not set
+CONFIG_FB_SA1100=y
+# CONFIG_FB_VIRTUAL is not set
+CONFIG_FBCON_ADVANCED=y
+# CONFIG_FBCON_MFB is not set
+# CONFIG_FBCON_CFB2 is not set
+# CONFIG_FBCON_CFB4 is not set
+CONFIG_FBCON_CFB8=y
+CONFIG_FBCON_CFB16=y
+CONFIG_FBCON_CFB24=y
+CONFIG_FBCON_CFB32=y
+# CONFIG_FBCON_AFB is not set
+# CONFIG_FBCON_ILBM is not set
+# CONFIG_FBCON_IPLAN2P2 is not set
+# CONFIG_FBCON_IPLAN2P4 is not set
+# CONFIG_FBCON_IPLAN2P8 is not set
+# CONFIG_FBCON_MAC is not set
+# CONFIG_FBCON_VGA_PLANES is not set
+# CONFIG_FBCON_VGA is not set
+# CONFIG_FBCON_HGA is not set
+CONFIG_FBCON_FONTWIDTH8_ONLY=y
+CONFIG_FBCON_FONTS=y
+CONFIG_FONT_8x8=y
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+
+#
+# USB support
+#
+CONFIG_USB=m
+# CONFIG_USB_DEBUG is not set
+
+#
+# Miscellaneous USB options
+#
+CONFIG_USB_DEVICEFS=y
+# CONFIG_USB_BANDWIDTH is not set
+
+#
+# USB Controllers
+#
+# CONFIG_USB_UHCI is not set
+# CONFIG_USB_UHCI_ALT is not set
+CONFIG_USB_OHCI=m
+
+#
+# USB Device Class drivers
+#
+# CONFIG_USB_AUDIO is not set
+# CONFIG_USB_BLUETOOTH is not set
+# CONFIG_USB_STORAGE is not set
+# CONFIG_USB_ACM is not set
+# CONFIG_USB_PRINTER is not set
+
+#
+# USB Human Interface Devices (HID)
+#
+CONFIG_USB_HID=m
+CONFIG_USB_KBD=m
+CONFIG_USB_MOUSE=m
+# CONFIG_USB_WACOM is not set
+
+#
+# USB Imaging devices
+#
+# CONFIG_USB_DC2XX is not set
+# CONFIG_USB_MDC800 is not set
+# CONFIG_USB_SCANNER is not set
+# CONFIG_USB_MICROTEK is not set
+
+#
+# USB Multimedia devices
+#
+# CONFIG_USB_IBMCAM is not set
+# CONFIG_USB_OV511 is not set
+# CONFIG_USB_DSBR is not set
+# CONFIG_USB_DABUSB is not set
+
+#
+# USB Network adaptors
+#
+# CONFIG_USB_PLUSB is not set
+# CONFIG_USB_PEGASUS is not set
+# CONFIG_USB_NET1080 is not set
+# CONFIG_USB_USBNET is not set
+
+#
+# USB port drivers
+#
+# CONFIG_USB_USS720 is not set
+
+#
+# USB Serial Converter support
+#
+# CONFIG_USB_SERIAL is not set
+
+#
+# USB misc drivers
+#
+# CONFIG_USB_RIO500 is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_NO_FRAME_POINTER is not set
+CONFIG_DEBUG_ERRORS=y
+CONFIG_DEBUG_USER=y
+CONFIG_DEBUG_INFO=y
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_NO_PGT_CACHE is not set
+CONFIG_DEBUG_LL=y
+# CONFIG_DEBUG_DC21285_PORT is not set
+# CONFIG_DEBUG_CLPS711X_UART2 is not set
diff -u --recursive --new-file v2.4.8/linux/arch/arm/def-configs/pfs168_satft linux/arch/arm/def-configs/pfs168_satft
--- v2.4.8/linux/arch/arm/def-configs/pfs168_satft	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/def-configs/pfs168_satft	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,793 @@
+#
+# Automatically generated make config: don't edit
+#
+CONFIG_ARM=y
+# CONFIG_EISA is not set
+# CONFIG_SBUS is not set
+# CONFIG_MCA is not set
+CONFIG_UID16=y
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+# CONFIG_OBSOLETE is not set
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_KMOD is not set
+
+#
+# System Type
+#
+# CONFIG_ARCH_ARCA5K is not set
+# CONFIG_ARCH_CLPS7500 is not set
+# CONFIG_ARCH_CO285 is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_L7200 is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_RPC is not set
+CONFIG_ARCH_SA1100=y
+# CONFIG_ARCH_CLPS711X is not set
+
+#
+# Archimedes/A5000 Implementations
+#
+
+#
+# Archimedes/A5000 Implementations (select only ONE)
+#
+# CONFIG_ARCH_ARC is not set
+# CONFIG_ARCH_A5K is not set
+
+#
+# Footbridge Implementations
+#
+# CONFIG_ARCH_CATS is not set
+# CONFIG_ARCH_PERSONAL_SERVER is not set
+# CONFIG_ARCH_EBSA285_ADDIN is not set
+# CONFIG_ARCH_EBSA285_HOST is not set
+# CONFIG_ARCH_NETWINDER is not set
+
+#
+# SA11x0 Implementations
+#
+# CONFIG_SA1100_ASSABET is not set
+# CONFIG_ASSABET_NEPONSET is not set
+# CONFIG_SA1100_BRUTUS is not set
+# CONFIG_SA1100_CERF is not set
+# CONFIG_SA1100_BITSY is not set
+# CONFIG_SA1100_EXTENEX1 is not set
+# CONFIG_SA1100_FREEBIRD is not set
+# CONFIG_SA1100_GRAPHICSCLIENT is not set
+# CONFIG_SA1100_HUW_WEBPANEL is not set
+# CONFIG_SA1100_LART is not set
+# CONFIG_SA1100_PLEB is not set
+# CONFIG_SA1100_NANOENGINE is not set
+# CONFIG_SA1100_PANGOLIN is not set
+# CONFIG_SA1100_SHERMAN is not set
+# CONFIG_SA1100_VICTOR is not set
+# CONFIG_SA1100_XP860 is not set
+# CONFIG_SA1100_YOPY is not set
+CONFIG_SA1100_PFS168=y
+CONFIG_SA1111=y
+CONFIG_SA1100_USB=m
+CONFIG_SA1100_USB_NETLINK=m
+CONFIG_SA1100_USB_CHAR=m
+CONFIG_SA1100_FREQUENCY_SCALE=m
+# CONFIG_SA1100_VOLTAGE_SCALE is not set
+
+#
+# CLPS711X/EP721X Implementations
+#
+# CONFIG_ARCH_P720T is not set
+# CONFIG_ARCH_ACORN is not set
+# CONFIG_FOOTBRIDGE is not set
+# CONFIG_FOOTBRIDGE_HOST is not set
+# CONFIG_FOOTBRIDGE_ADDIN is not set
+CONFIG_CPU_32=y
+# CONFIG_CPU_26 is not set
+
+#
+# Processor Type
+#
+# CONFIG_CPU_32v3 is not set
+CONFIG_CPU_32v4=y
+# CONFIG_CPU_ARM610 is not set
+# CONFIG_CPU_ARM710 is not set
+# CONFIG_CPU_ARM720T is not set
+# CONFIG_CPU_ARM920T is not set
+# CONFIG_CPU_ARM1020 is not set
+# CONFIG_CPU_SA110 is not set
+CONFIG_CPU_SA1100=y
+CONFIG_DISCONTIGMEM=y
+
+#
+# General setup
+#
+
+#
+# Please ensure that you have read the help on the next option
+#
+# CONFIG_ANGELBOOT is not set
+# CONFIG_PCI is not set
+# CONFIG_ISA is not set
+# CONFIG_ISA_DMA is not set
+CONFIG_HOTPLUG=y
+
+#
+# PCMCIA/CardBus support
+#
+CONFIG_PCMCIA=m
+# CONFIG_I82365 is not set
+# CONFIG_TCIC is not set
+# CONFIG_PCMCIA_CLPS6700 is not set
+CONFIG_PCMCIA_SA1100=m
+CONFIG_NET=y
+CONFIG_SYSVIPC=y
+# CONFIG_BSD_PROCESS_ACCT is not set
+CONFIG_SYSCTL=y
+CONFIG_FPE_NWFPE=y
+# CONFIG_FPE_FASTFPE is not set
+CONFIG_KCORE_ELF=y
+# CONFIG_KCORE_AOUT is not set
+# CONFIG_BINFMT_AOUT is not set
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_MISC is not set
+# CONFIG_PM is not set
+# CONFIG_ARTHUR is not set
+CONFIG_CMDLINE="root=/dev/nfs"
+# CONFIG_PFS168_CMDLINE is not set
+CONFIG_LEDS=y
+CONFIG_LEDS_TIMER=y
+CONFIG_LEDS_CPU=y
+CONFIG_ALIGNMENT_TRAP=y
+CONFIG_UCB1200=y
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOC1000 is not set
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOCPROBE is not set
+
+#
+# RAM/ROM Device Drivers
+#
+# CONFIG_MTD_PMC551 is not set
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_MTDRAM is not set
+
+#
+# Linearly Mapped Flash Device Drivers
+#
+CONFIG_MTD_CFI=y
+# CONFIG_MTD_CFI_GEOMETRY is not set
+CONFIG_MTD_CFI_INTELEXT=y
+# CONFIG_MTD_CFI_AMDSTD is not set
+# CONFIG_MTD_AMDSTD is not set
+# CONFIG_MTD_SHARP is not set
+# CONFIG_MTD_PHYSMAP is not set
+# CONFIG_MTD_NORA is not set
+# CONFIG_MTD_PNC2000 is not set
+# CONFIG_MTD_RPXLITE is not set
+# CONFIG_MTD_SC520CDP is not set
+# CONFIG_MTD_SBC_MEDIAGX is not set
+# CONFIG_MTD_ELAN_104NC is not set
+CONFIG_MTD_SA1100=y
+# CONFIG_MTD_DC21285 is not set
+# CONFIG_MTD_CSTM_CFI_JEDEC is not set
+# CONFIG_MTD_JEDEC is not set
+# CONFIG_MTD_MIXMEM is not set
+# CONFIG_MTD_OCTAGON is not set
+# CONFIG_MTD_VMAX is not set
+
+#
+# NAND Flash Device Drivers
+#
+# CONFIG_MTD_NAND is not set
+# CONFIG_MTD_NAND_SPIA is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLOCK=y
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
+
+#
+# Plug and Play configuration
+#
+# CONFIG_PNP is not set
+# CONFIG_ISAPNP is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_DEV_XD is not set
+# CONFIG_PARIDE is not set
+# CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
+# CONFIG_BLK_DEV_DAC960 is not set
+# CONFIG_BLK_DEV_LOOP is not set
+# CONFIG_BLK_DEV_NBD is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BLK_DEV_INITRD=y
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+# CONFIG_BLK_DEV_MD is not set
+# CONFIG_MD_LINEAR is not set
+# CONFIG_MD_RAID0 is not set
+# CONFIG_MD_RAID1 is not set
+# CONFIG_MD_RAID5 is not set
+# CONFIG_BLK_DEV_LVM is not set
+
+#
+# Networking options
+#
+CONFIG_PACKET=y
+# CONFIG_PACKET_MMAP is not set
+# CONFIG_NETLINK is not set
+# CONFIG_NETFILTER is not set
+# CONFIG_FILTER is not set
+CONFIG_UNIX=y
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_PNP=y
+CONFIG_IP_PNP_BOOTP=y
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_INET_ECN is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_IPV6 is not set
+# CONFIG_KHTTPD is not set
+# CONFIG_ATM is not set
+
+#
+#
+#
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_DECNET is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_LLC is not set
+# CONFIG_NET_DIVERT is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+# CONFIG_NET_FASTROUTE is not set
+# CONFIG_NET_HW_FLOWCONTROL is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED is not set
+
+#
+# Network device support
+#
+CONFIG_NETDEVICES=y
+
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+# CONFIG_NET_SB1000 is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+# CONFIG_NET_VENDOR_3COM is not set
+# CONFIG_LANCE is not set
+CONFIG_NET_VENDOR_SMC=y
+# CONFIG_WD80x3 is not set
+# CONFIG_ULTRA is not set
+# CONFIG_ULTRA32 is not set
+CONFIG_SMC9194=y
+# CONFIG_NET_VENDOR_RACAL is not set
+# CONFIG_AT1700 is not set
+# CONFIG_DEPCA is not set
+# CONFIG_NET_ISA is not set
+# CONFIG_NET_PCI is not set
+# CONFIG_NET_POCKET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+# CONFIG_ACENIC is not set
+# CONFIG_HAMACHI is not set
+# CONFIG_YELLOWFIN is not set
+# CONFIG_SK98LIN is not set
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI is not set
+CONFIG_PPP=m
+# CONFIG_PPP_MULTILINK is not set
+CONFIG_PPP_ASYNC=m
+CONFIG_PPP_SYNC_TTY=m
+CONFIG_PPP_DEFLATE=m
+# CONFIG_PPP_BSDCOMP is not set
+# CONFIG_PPPOE is not set
+# CONFIG_SLIP is not set
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Token Ring devices
+#
+# CONFIG_TR is not set
+# CONFIG_NET_FC is not set
+# CONFIG_RCPCI is not set
+# CONFIG_SHAPER is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+
+#
+# PCMCIA network device support
+#
+CONFIG_NET_PCMCIA=y
+# CONFIG_PCMCIA_3C589 is not set
+# CONFIG_PCMCIA_3C574 is not set
+# CONFIG_PCMCIA_FMVJ18X is not set
+CONFIG_PCMCIA_PCNET=m
+# CONFIG_PCMCIA_NMCLAN is not set
+CONFIG_PCMCIA_SMC91C92=m
+# CONFIG_PCMCIA_XIRC2PS is not set
+# CONFIG_ARCNET_COM20020_CS is not set
+# CONFIG_PCMCIA_IBMTR is not set
+# CONFIG_NET_PCMCIA_RADIO is not set
+
+#
+# Amateur Radio support
+#
+# CONFIG_HAMRADIO is not set
+
+#
+# IrDA (infrared) support
+#
+CONFIG_IRDA=m
+
+#
+# IrDA protocols
+#
+CONFIG_IRLAN=m
+CONFIG_IRNET=m
+CONFIG_IRCOMM=m
+CONFIG_IRDA_ULTRA=y
+# CONFIG_IRDA_OPTIONS is not set
+
+#
+# Infrared-port device drivers
+#
+
+#
+# SIR device drivers
+#
+CONFIG_IRTTY_SIR=m
+CONFIG_IRPORT_SIR=m
+
+#
+# FIR device drivers
+#
+# CONFIG_NSC_FIR is not set
+# CONFIG_WINBOND_FIR is not set
+# CONFIG_TOSHIBA_FIR is not set
+# CONFIG_SMC_IRCC_FIR is not set
+CONFIG_SA1100_FIR=m
+
+#
+# Dongle support
+#
+# CONFIG_DONGLE is not set
+
+#
+# ATA/IDE/MFM/RLL support
+#
+CONFIG_IDE=m
+
+#
+# IDE, ATA and ATAPI Block devices
+#
+CONFIG_BLK_DEV_IDE=m
+
+#
+# Please see Documentation/ide.txt for help/info on IDE drives
+#
+# CONFIG_BLK_DEV_HD_IDE is not set
+# CONFIG_BLK_DEV_HD is not set
+CONFIG_BLK_DEV_IDEDISK=m
+# CONFIG_IDEDISK_MULTI_MODE is not set
+# CONFIG_BLK_DEV_IDEDISK_VENDOR is not set
+# CONFIG_BLK_DEV_IDEDISK_FUJITSU is not set
+# CONFIG_BLK_DEV_IDEDISK_IBM is not set
+# CONFIG_BLK_DEV_IDEDISK_MAXTOR is not set
+# CONFIG_BLK_DEV_IDEDISK_QUANTUM is not set
+# CONFIG_BLK_DEV_IDEDISK_SEAGATE is not set
+# CONFIG_BLK_DEV_IDEDISK_WD is not set
+# CONFIG_BLK_DEV_COMMERIAL is not set
+# CONFIG_BLK_DEV_TIVO is not set
+CONFIG_BLK_DEV_IDECS=m
+# CONFIG_BLK_DEV_IDECD is not set
+# CONFIG_BLK_DEV_IDETAPE is not set
+# CONFIG_BLK_DEV_IDEFLOPPY is not set
+# CONFIG_BLK_DEV_IDESCSI is not set
+
+#
+# IDE chipset support/bugfixes
+#
+# CONFIG_BLK_DEV_CMD640 is not set
+# CONFIG_BLK_DEV_CMD640_ENHANCED is not set
+# CONFIG_BLK_DEV_ISAPNP is not set
+# CONFIG_IDE_CHIPSETS is not set
+# CONFIG_IDEDMA_AUTO is not set
+# CONFIG_DMA_NONPCI is not set
+# CONFIG_BLK_DEV_IDE_MODES is not set
+
+#
+# SCSI support
+#
+# CONFIG_SCSI is not set
+
+#
+# I2O device support
+#
+# CONFIG_I2O is not set
+# CONFIG_I2O_BLOCK is not set
+# CONFIG_I2O_LAN is not set
+# CONFIG_I2O_SCSI is not set
+# CONFIG_I2O_PROC is not set
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Input core support
+#
+CONFIG_INPUT=y
+CONFIG_INPUT_KEYBDEV=y
+CONFIG_INPUT_MOUSEDEV=y
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_EVDEV is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+# CONFIG_VT_CONSOLE is not set
+CONFIG_SERIAL=y
+# CONFIG_SERIAL_CONSOLE is not set
+# CONFIG_SERIAL_EXTENDED is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+CONFIG_SERIAL_SA1100=y
+CONFIG_SERIAL_SA1100_CONSOLE=y
+CONFIG_SA1100_DEFAULT_BAUDRATE=115200
+CONFIG_TOUCHSCREEN_UCB1200=y
+# CONFIG_TOUCHSCREEN_BITSY is not set
+# CONFIG_PROFILER is not set
+# CONFIG_PFS168_SPI is not set
+CONFIG_PFS168_DTMF=y
+CONFIG_PFS168_MISC=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_UNIX98_PTY_COUNT=32
+
+#
+# I2C support
+#
+CONFIG_I2C=y
+CONFIG_I2C_ALGOBIT=y
+# CONFIG_I2C_PHILIPSPAR is not set
+# CONFIG_I2C_ELV is not set
+# CONFIG_I2C_VELLEMAN is not set
+# CONFIG_I2C_ASSABET is not set
+CONFIG_I2C_PFS168=y
+# CONFIG_I2C_ALGOPCF is not set
+CONFIG_I2C_CHARDEV=y
+CONFIG_I2C_SENSORS=y
+CONFIG_I2C_EEPROM=y
+CONFIG_I2C_EEPROM=y
+CONFIG_I2C_M41T11=y
+CONFIG_I2C_X9221=y
+CONFIG_I2C_PCF8574=y
+
+#
+# Mice
+#
+# CONFIG_BUSMOUSE is not set
+CONFIG_MOUSE=y
+CONFIG_PSMOUSE=y
+# CONFIG_82C710_MOUSE is not set
+# CONFIG_PC110_PAD is not set
+
+#
+# Joysticks
+#
+# CONFIG_JOYSTICK is not set
+
+#
+# Input core support is needed for joysticks
+#
+# CONFIG_QIC02_TAPE is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_INTEL_RNG is not set
+# CONFIG_NVRAM is not set
+# CONFIG_RTC is not set
+# CONFIG_SA1100_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_FTAPE is not set
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+CONFIG_PCMCIA_SERIAL=m
+
+#
+# PCMCIA character device support
+#
+# CONFIG_PCMCIA_SERIAL_CS is not set
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# File systems
+#
+# CONFIG_QUOTA is not set
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_AUTOFS4_FS is not set
+# CONFIG_REISERFS_FS is not set
+# CONFIG_REISERFS_CHECK is not set
+# CONFIG_ADFS_FS is not set
+# CONFIG_ADFS_FS_RW is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_FAT_FS is not set
+# CONFIG_MSDOS_FS is not set
+# CONFIG_UMSDOS_FS is not set
+# CONFIG_VFAT_FS is not set
+# CONFIG_EFS_FS is not set
+CONFIG_JFFS_FS=y
+CONFIG_JFFS_FS_VERBOSE=0
+# CONFIG_JFFS2_FS is not set
+# CONFIG_CRAMFS is not set
+# CONFIG_RAMFS is not set
+# CONFIG_ISO9660_FS is not set
+# CONFIG_JOLIET is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_NTFS_FS is not set
+# CONFIG_NTFS_RW is not set
+# CONFIG_HPFS_FS is not set
+CONFIG_PROC_FS=y
+# CONFIG_DEVFS_FS is not set
+# CONFIG_DEVFS_MOUNT is not set
+# CONFIG_DEVFS_DEBUG is not set
+CONFIG_DEVPTS_FS=y
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_QNX4FS_RW is not set
+# CONFIG_ROMFS_FS is not set
+CONFIG_EXT2_FS=y
+# CONFIG_SYSV_FS is not set
+# CONFIG_SYSV_FS_WRITE is not set
+# CONFIG_UDF_FS is not set
+# CONFIG_UDF_RW is not set
+# CONFIG_UFS_FS is not set
+# CONFIG_UFS_FS_WRITE is not set
+
+#
+# Network File Systems
+#
+# CONFIG_CODA_FS is not set
+CONFIG_NFS_FS=y
+# CONFIG_NFS_V3 is not set
+CONFIG_ROOT_NFS=y
+# CONFIG_NFSD is not set
+# CONFIG_NFSD_V3 is not set
+CONFIG_SUNRPC=y
+CONFIG_LOCKD=y
+# CONFIG_SMB_FS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_NCPFS_PACKET_SIGNING is not set
+# CONFIG_NCPFS_IOCTL_LOCKING is not set
+# CONFIG_NCPFS_STRONG is not set
+# CONFIG_NCPFS_NFS_NS is not set
+# CONFIG_NCPFS_OS2_NS is not set
+# CONFIG_NCPFS_SMALLDOS is not set
+# CONFIG_NCPFS_NLS is not set
+# CONFIG_NCPFS_EXTRAS is not set
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+# CONFIG_SMB_NLS is not set
+# CONFIG_NLS is not set
+
+#
+# Console drivers
+#
+CONFIG_PC_KEYMAP=y
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_FB=y
+
+#
+# Frame-buffer support
+#
+CONFIG_FB=y
+CONFIG_DUMMY_CONSOLE=y
+# CONFIG_FB_ACORN is not set
+# CONFIG_FB_CLPS711X is not set
+# CONFIG_FB_CYBER2000 is not set
+CONFIG_FB_SA1100=y
+# CONFIG_PFS168_SASTN is not set
+CONFIG_PFS168_SATFT=y
+# CONFIG_FB_MQ200 is not set
+# CONFIG_FB_VIRTUAL is not set
+CONFIG_FBCON_ADVANCED=y
+# CONFIG_FBCON_MFB is not set
+# CONFIG_FBCON_CFB2 is not set
+# CONFIG_FBCON_CFB4 is not set
+CONFIG_FBCON_CFB8=y
+CONFIG_FBCON_CFB16=y
+CONFIG_FBCON_CFB24=y
+CONFIG_FBCON_CFB32=y
+# CONFIG_FBCON_AFB is not set
+# CONFIG_FBCON_ILBM is not set
+# CONFIG_FBCON_IPLAN2P2 is not set
+# CONFIG_FBCON_IPLAN2P4 is not set
+# CONFIG_FBCON_IPLAN2P8 is not set
+# CONFIG_FBCON_MAC is not set
+# CONFIG_FBCON_VGA_PLANES is not set
+# CONFIG_FBCON_VGA is not set
+# CONFIG_FBCON_HGA is not set
+CONFIG_FBCON_FONTWIDTH8_ONLY=y
+CONFIG_FBCON_FONTS=y
+CONFIG_FONT_8x8=y
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+
+#
+# USB support
+#
+CONFIG_USB=m
+# CONFIG_USB_DEBUG is not set
+
+#
+# Miscellaneous USB options
+#
+CONFIG_USB_DEVICEFS=y
+# CONFIG_USB_BANDWIDTH is not set
+
+#
+# USB Controllers
+#
+# CONFIG_USB_UHCI is not set
+# CONFIG_USB_UHCI_ALT is not set
+CONFIG_USB_OHCI=m
+
+#
+# USB Device Class drivers
+#
+# CONFIG_USB_AUDIO is not set
+# CONFIG_USB_BLUETOOTH is not set
+# CONFIG_USB_STORAGE is not set
+# CONFIG_USB_ACM is not set
+# CONFIG_USB_PRINTER is not set
+
+#
+# USB Human Interface Devices (HID)
+#
+CONFIG_USB_HID=m
+CONFIG_USB_KBD=m
+CONFIG_USB_MOUSE=m
+# CONFIG_USB_WACOM is not set
+
+#
+# USB Imaging devices
+#
+# CONFIG_USB_DC2XX is not set
+# CONFIG_USB_MDC800 is not set
+# CONFIG_USB_SCANNER is not set
+# CONFIG_USB_MICROTEK is not set
+
+#
+# USB Multimedia devices
+#
+# CONFIG_USB_IBMCAM is not set
+# CONFIG_USB_OV511 is not set
+# CONFIG_USB_DSBR is not set
+# CONFIG_USB_DABUSB is not set
+
+#
+# USB Network adaptors
+#
+# CONFIG_USB_PLUSB is not set
+# CONFIG_USB_PEGASUS is not set
+# CONFIG_USB_NET1080 is not set
+
+#
+# USB port drivers
+#
+# CONFIG_USB_USS720 is not set
+
+#
+# USB Serial Converter support
+#
+# CONFIG_USB_SERIAL is not set
+
+#
+# USB misc drivers
+#
+# CONFIG_USB_RIO500 is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_NO_FRAME_POINTER is not set
+CONFIG_DEBUG_ERRORS=y
+CONFIG_DEBUG_USER=y
+CONFIG_DEBUG_INFO=y
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_NO_PGT_CACHE is not set
+CONFIG_DEBUG_LL=y
+# CONFIG_DEBUG_DC21285_PORT is not set
diff -u --recursive --new-file v2.4.8/linux/arch/arm/def-configs/pleb linux/arch/arm/def-configs/pleb
--- v2.4.8/linux/arch/arm/def-configs/pleb	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/def-configs/pleb	Sun Aug 12 17:36:24 2001
@@ -0,0 +1,535 @@
+#
+# Automatically generated by make menuconfig: don't edit
+#
+CONFIG_ARM=y
+# CONFIG_EISA is not set
+# CONFIG_SBUS is not set
+# CONFIG_MCA is not set
+CONFIG_UID16=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+# CONFIG_OBSOLETE is not set
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+# CONFIG_MODVERSIONS is not set
+CONFIG_KMOD=y
+
+#
+# System Type
+#
+# CONFIG_ARCH_ARCA5K is not set
+# CONFIG_ARCH_CLPS7500 is not set
+# CONFIG_ARCH_CO285 is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_L7200 is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_RPC is not set
+CONFIG_ARCH_SA1100=y
+# CONFIG_ARCH_CLPS711X is not set
+# CONFIG_ARCH_ANAKIN is not set
+
+#
+# Archimedes/A5000 Implementations
+#
+# CONFIG_ARCH_ARC is not set
+# CONFIG_ARCH_A5K is not set
+
+#
+# Footbridge Implementations
+#
+# CONFIG_ARCH_CATS is not set
+# CONFIG_ARCH_PERSONAL_SERVER is not set
+# CONFIG_ARCH_EBSA285_ADDIN is not set
+# CONFIG_ARCH_EBSA285_HOST is not set
+# CONFIG_ARCH_NETWINDER is not set
+
+#
+# SA11x0 Implementations
+#
+# CONFIG_SA1100_ASSABET is not set
+# CONFIG_ASSABET_NEPONSET is not set
+# CONFIG_SA1100_BRUTUS is not set
+# CONFIG_SA1100_CERF is not set
+# CONFIG_SA1100_BITSY is not set
+# CONFIG_SA1100_EXTENEX1 is not set
+# CONFIG_SA1100_FLEXANET is not set
+# CONFIG_SA1100_FREEBIRD is not set
+# CONFIG_SA1100_GRAPHICSCLIENT is not set
+# CONFIG_SA1100_JORNADA720 is not set
+# CONFIG_SA1100_HUW_WEBPANEL is not set
+# CONFIG_SA1100_ITSY is not set
+# CONFIG_SA1100_LART is not set
+# CONFIG_SA1100_NANOENGINE is not set
+# CONFIG_SA1100_OMNIMETER is not set
+# CONFIG_SA1100_PANGOLIN is not set
+CONFIG_SA1100_PLEB=y
+# CONFIG_SA1100_SHERMAN is not set
+# CONFIG_SA1100_PFS168 is not set
+# CONFIG_SA1100_VICTOR is not set
+# CONFIG_SA1100_XP860 is not set
+# CONFIG_SA1100_YOPY is not set
+# CONFIG_SA1100_USB is not set
+# CONFIG_SA1100_USB_NETLINK is not set
+# CONFIG_SA1100_USB_CHAR is not set
+
+#
+# CLPS711X/EP721X Implementations
+#
+# CONFIG_ARCH_P720T is not set
+# CONFIG_ARCH_ACORN is not set
+# CONFIG_FOOTBRIDGE is not set
+# CONFIG_FOOTBRIDGE_HOST is not set
+# CONFIG_FOOTBRIDGE_ADDIN is not set
+CONFIG_CPU_32=y
+# CONFIG_CPU_26 is not set
+# CONFIG_CPU_32v3 is not set
+CONFIG_CPU_32v4=y
+# CONFIG_CPU_ARM610 is not set
+# CONFIG_CPU_ARM710 is not set
+# CONFIG_CPU_ARM720T is not set
+# CONFIG_CPU_ARM920T is not set
+# CONFIG_CPU_ARM1020 is not set
+# CONFIG_CPU_SA110 is not set
+CONFIG_CPU_SA1100=y
+CONFIG_DISCONTIGMEM=y
+# CONFIG_CPU_BIG_ENDIAN is not set
+
+#
+# General setup
+#
+# CONFIG_PCI is not set
+# CONFIG_ISA is not set
+# CONFIG_ISA_DMA is not set
+CONFIG_CPU_FREQ=y
+# CONFIG_HOTPLUG is not set
+# CONFIG_PCMCIA is not set
+CONFIG_NET=y
+CONFIG_SYSVIPC=y
+# CONFIG_BSD_PROCESS_ACCT is not set
+CONFIG_SYSCTL=y
+CONFIG_FPE_NWFPE=y
+# CONFIG_FPE_FASTFPE is not set
+CONFIG_KCORE_ELF=y
+# CONFIG_KCORE_AOUT is not set
+CONFIG_BINFMT_AOUT=y
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_MISC is not set
+# CONFIG_PM is not set
+# CONFIG_APM is not set
+# CONFIG_ARTHUR is not set
+CONFIG_CMDLINE="console=ttySA0,9600"
+# CONFIG_PFS168_CMDLINE is not set
+# CONFIG_LEDS is not set
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+# CONFIG_MTD is not set
+
+#
+# RAM/ROM/Flash chip drivers
+#
+# CONFIG_MTD_CFI is not set
+# CONFIG_MTD_CFI_INTELEXT is not set
+# CONFIG_MTD_CFI_AMDSTD is not set
+# CONFIG_MTD_AMDSTD is not set
+# CONFIG_MTD_SHARP is not set
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_JEDEC is not set
+
+#
+# Mapping drivers for chip access
+#
+# CONFIG_MTD_PHYSMAP is not set
+# CONFIG_MTD_SUN_UFLASH is not set
+# CONFIG_MTD_NORA is not set
+# CONFIG_MTD_PNC2000 is not set
+# CONFIG_MTD_RPXLITE is not set
+# CONFIG_MTD_SC520CDP is not set
+# CONFIG_MTD_NETSC520 is not set
+# CONFIG_MTD_SBC_GXX is not set
+# CONFIG_MTD_ELAN_104NC is not set
+# CONFIG_MTD_SA1100 is not set
+# CONFIG_MTD_SA1100_REDBOOT_PARTITIONS is not set
+# CONFIG_MTD_SA1100_BOOTLDR_PARTITIONS is not set
+# CONFIG_MTD_DC21285 is not set
+# CONFIG_MTD_IQ80310 is not set
+# CONFIG_MTD_DBOX2 is not set
+# CONFIG_MTD_CSTM_MIPS_IXX is not set
+# CONFIG_MTD_CFI_FLAGADM is not set
+# CONFIG_MTD_ARM_INTEGRATOR is not set
+# CONFIG_MTD_MIXMEM is not set
+# CONFIG_MTD_OCTAGON is not set
+# CONFIG_MTD_VMAX is not set
+# CONFIG_MTD_OCELOT is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_PMC551 is not set
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_MTDRAM is not set
+# CONFIG_MTD_DOC1000 is not set
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOCPROBE is not set
+
+#
+# NAND Flash Device Drivers
+#
+# CONFIG_MTD_NAND is not set
+
+#
+# Plug and Play configuration
+#
+# CONFIG_PNP is not set
+# CONFIG_ISAPNP is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_DEV_XD is not set
+# CONFIG_PARIDE is not set
+# CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
+# CONFIG_BLK_DEV_DAC960 is not set
+# CONFIG_BLK_DEV_LOOP is not set
+# CONFIG_BLK_DEV_NBD is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BLK_DEV_INITRD=y
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+# CONFIG_BLK_DEV_MD is not set
+# CONFIG_MD_LINEAR is not set
+# CONFIG_MD_RAID0 is not set
+# CONFIG_MD_RAID1 is not set
+# CONFIG_MD_RAID5 is not set
+# CONFIG_BLK_DEV_LVM is not set
+
+#
+# Networking options
+#
+CONFIG_PACKET=m
+# CONFIG_PACKET_MMAP is not set
+# CONFIG_NETLINK is not set
+# CONFIG_NETFILTER is not set
+# CONFIG_FILTER is not set
+CONFIG_UNIX=y
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# CONFIG_IP_ADVANCED_ROUTER is not set
+# CONFIG_IP_PNP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+CONFIG_INET_ECN=y
+CONFIG_SYN_COOKIES=y
+# CONFIG_IPV6 is not set
+# CONFIG_KHTTPD is not set
+# CONFIG_ATM is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_DECNET is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_LLC is not set
+# CONFIG_NET_DIVERT is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+# CONFIG_NET_FASTROUTE is not set
+# CONFIG_NET_HW_FLOWCONTROL is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED is not set
+
+#
+# Network device support
+#
+CONFIG_NETDEVICES=y
+
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
+CONFIG_DUMMY=m
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+# CONFIG_NET_ETHERNET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+# CONFIG_ACENIC is not set
+# CONFIG_ACENIC_OMIT_TIGON_I is not set
+# CONFIG_MYRI_SBUS is not set
+# CONFIG_HAMACHI is not set
+# CONFIG_YELLOWFIN is not set
+# CONFIG_SK98LIN is not set
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI is not set
+# CONFIG_PLIP is not set
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Token Ring devices
+#
+# CONFIG_TR is not set
+# CONFIG_NET_FC is not set
+# CONFIG_RCPCI is not set
+# CONFIG_SHAPER is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+
+#
+# Amateur Radio support
+#
+# CONFIG_HAMRADIO is not set
+
+#
+# IrDA (infrared) support
+#
+# CONFIG_IRDA is not set
+
+#
+# ATA/IDE/MFM/RLL support
+#
+# CONFIG_IDE is not set
+# CONFIG_BLK_DEV_IDE_MODES is not set
+# CONFIG_BLK_DEV_HD is not set
+
+#
+# SCSI support
+#
+# CONFIG_SCSI is not set
+
+#
+# I2O device support
+#
+# CONFIG_I2O is not set
+# CONFIG_I2O_BLOCK is not set
+# CONFIG_I2O_LAN is not set
+# CONFIG_I2O_SCSI is not set
+# CONFIG_I2O_PROC is not set
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Input core support
+#
+# CONFIG_INPUT is not set
+
+#
+# Character devices
+#
+# CONFIG_VT is not set
+# CONFIG_SERIAL is not set
+# CONFIG_SERIAL_EXTENDED is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+# CONFIG_SERIAL_21285 is not set
+# CONFIG_SERIAL_21285_OLD is not set
+# CONFIG_SERIAL_21285_CONSOLE is not set
+CONFIG_SERIAL_SA1100=y
+# CONFIG_SERIAL_SA1100_OLD is not set
+CONFIG_SERIAL_SA1100_CONSOLE=y
+CONFIG_SA1100_DEFAULT_BAUDRATE=9600
+# CONFIG_SERIAL_AMBA is not set
+# CONFIG_SERIAL_AMBA_CONSOLE is not set
+# CONFIG_SERIAL_CLPS711X is not set
+# CONFIG_SERIAL_CLPS711X_CONSOLE is not set
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_UNIX98_PTY_COUNT=256
+# CONFIG_UCB1200 is not set
+# CONFIG_TOUCHSCREEN_UCB1200 is not set
+# CONFIG_AUDIO_UCB1200 is not set
+# CONFIG_ADC_UCB1200 is not set
+# CONFIG_TOUCHSCREEN_BITSY is not set
+CONFIG_PROFILER=y
+# CONFIG_PFS168_SPI is not set
+# CONFIG_PFS168_DTMF is not set
+# CONFIG_PFS168_MISC is not set
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# Mice
+#
+# CONFIG_BUSMOUSE is not set
+# CONFIG_MOUSE is not set
+
+#
+# Joysticks
+#
+# CONFIG_JOYSTICK is not set
+# CONFIG_QIC02_TAPE is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_INTEL_RNG is not set
+# CONFIG_NVRAM is not set
+# CONFIG_RTC is not set
+CONFIG_SA1100_RTC=y
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_FTAPE is not set
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# File systems
+#
+# CONFIG_QUOTA is not set
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_AUTOFS4_FS is not set
+# CONFIG_REISERFS_FS is not set
+# CONFIG_REISERFS_CHECK is not set
+# CONFIG_ADFS_FS is not set
+# CONFIG_ADFS_FS_RW is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_FAT_FS is not set
+# CONFIG_MSDOS_FS is not set
+# CONFIG_UMSDOS_FS is not set
+# CONFIG_VFAT_FS is not set
+# CONFIG_EFS_FS is not set
+# CONFIG_JFFS_FS is not set
+# CONFIG_JFFS2_FS is not set
+# CONFIG_CRAMFS is not set
+CONFIG_TMPFS=y
+# CONFIG_RAMFS is not set
+# CONFIG_ISO9660_FS is not set
+# CONFIG_JOLIET is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_VXFS_FS is not set
+# CONFIG_NTFS_FS is not set
+# CONFIG_NTFS_RW is not set
+# CONFIG_HPFS_FS is not set
+CONFIG_PROC_FS=y
+# CONFIG_DEVFS_FS is not set
+# CONFIG_DEVFS_MOUNT is not set
+# CONFIG_DEVFS_DEBUG is not set
+CONFIG_DEVPTS_FS=y
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_QNX4FS_RW is not set
+# CONFIG_ROMFS_FS is not set
+CONFIG_EXT2_FS=y
+# CONFIG_SYSV_FS is not set
+# CONFIG_UDF_FS is not set
+# CONFIG_UDF_RW is not set
+# CONFIG_UFS_FS is not set
+# CONFIG_UFS_FS_WRITE is not set
+
+#
+# Network File Systems
+#
+# CONFIG_CODA_FS is not set
+# CONFIG_NFS_FS is not set
+# CONFIG_NFS_V3 is not set
+# CONFIG_ROOT_NFS is not set
+# CONFIG_NFSD is not set
+# CONFIG_NFSD_V3 is not set
+# CONFIG_SUNRPC is not set
+# CONFIG_LOCKD is not set
+# CONFIG_SMB_FS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_NCPFS_PACKET_SIGNING is not set
+# CONFIG_NCPFS_IOCTL_LOCKING is not set
+# CONFIG_NCPFS_STRONG is not set
+# CONFIG_NCPFS_NFS_NS is not set
+# CONFIG_NCPFS_OS2_NS is not set
+# CONFIG_NCPFS_SMALLDOS is not set
+# CONFIG_NCPFS_NLS is not set
+# CONFIG_NCPFS_EXTRAS is not set
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+# CONFIG_SMB_NLS is not set
+# CONFIG_NLS is not set
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+
+#
+# USB support
+#
+# CONFIG_USB is not set
+
+#
+# Bluetooth support
+#
+# CONFIG_BLUEZ is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_NO_FRAME_POINTER is not set
+CONFIG_DEBUG_ERRORS=y
+CONFIG_DEBUG_USER=y
+# CONFIG_DEBUG_INFO is not set
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_NO_PGT_CACHE is not set
+CONFIG_DEBUG_LL=y
+# CONFIG_DEBUG_DC21285_PORT is not set
+# CONFIG_DEBUG_CLPS711X_UART2 is not set
diff -u --recursive --new-file v2.4.8/linux/arch/arm/def-configs/rpc linux/arch/arm/def-configs/rpc
--- v2.4.8/linux/arch/arm/def-configs/rpc	Mon Nov 27 17:07:59 2000
+++ linux/arch/arm/def-configs/rpc	Sun Aug 12 11:13:59 2001
@@ -6,6 +6,8 @@
 # CONFIG_SBUS is not set
 # CONFIG_MCA is not set
 CONFIG_UID16=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
 
 #
 # Code maturity level options
@@ -27,27 +29,62 @@
 # CONFIG_ARCH_CLPS7500 is not set
 # CONFIG_ARCH_CO285 is not set
 # CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_L7200 is not set
 # CONFIG_ARCH_FOOTBRIDGE is not set
 # CONFIG_ARCH_INTEGRATOR is not set
 CONFIG_ARCH_RPC=y
 # CONFIG_ARCH_SA1100 is not set
 # CONFIG_ARCH_CLPS711X is not set
+# CONFIG_ARCH_ANAKIN is not set
 
 #
 # Archimedes/A5000 Implementations
 #
 
 #
+# Archimedes/A5000 Implementations (select only ONE)
+#
+# CONFIG_ARCH_ARC is not set
+# CONFIG_ARCH_A5K is not set
+
+#
 # Footbridge Implementations
 #
+# CONFIG_ARCH_CATS is not set
+# CONFIG_ARCH_PERSONAL_SERVER is not set
+# CONFIG_ARCH_EBSA285_ADDIN is not set
+# CONFIG_ARCH_EBSA285_HOST is not set
+# CONFIG_ARCH_NETWINDER is not set
 
 #
 # SA11x0 Implementations
 #
+# CONFIG_SA1100_ASSABET is not set
+# CONFIG_ASSABET_NEPONSET is not set
+# CONFIG_SA1100_BRUTUS is not set
+# CONFIG_SA1100_CERF is not set
+# CONFIG_SA1100_BITSY is not set
+# CONFIG_SA1100_EXTENEX1 is not set
+# CONFIG_SA1100_FREEBIRD is not set
+# CONFIG_SA1100_GRAPHICSCLIENT is not set
+# CONFIG_SA1100_JORNADA720 is not set
+# CONFIG_SA1100_HUW_WEBPANEL is not set
+# CONFIG_SA1100_ITSY is not set
+# CONFIG_SA1100_LART is not set
+# CONFIG_SA1100_NANOENGINE is not set
+# CONFIG_SA1100_OMNIMETER is not set
+# CONFIG_SA1100_PANGOLIN is not set
+# CONFIG_SA1100_PLEB is not set
+# CONFIG_SA1100_SHERMAN is not set
+# CONFIG_SA1100_PFS168 is not set
+# CONFIG_SA1100_VICTOR is not set
+# CONFIG_SA1100_XP860 is not set
+# CONFIG_SA1100_YOPY is not set
 
 #
 # CLPS711X/EP721X Implementations
 #
+# CONFIG_ARCH_P720T is not set
 CONFIG_ARCH_ACORN=y
 # CONFIG_FOOTBRIDGE is not set
 # CONFIG_FOOTBRIDGE_HOST is not set
@@ -59,15 +96,19 @@
 # Processor Type
 #
 CONFIG_CPU_32v3=y
-CONFIG_CPU_ARM6=y
-CONFIG_CPU_ARM7=y
+# CONFIG_CPU_32v4 is not set
+CONFIG_CPU_ARM610=y
+CONFIG_CPU_ARM710=y
+# CONFIG_CPU_ARM720T is not set
+# CONFIG_CPU_ARM920T is not set
+# CONFIG_CPU_ARM1020 is not set
 CONFIG_CPU_SA110=y
+# CONFIG_CPU_SA1100 is not set
 # CONFIG_DISCONTIGMEM is not set
 
 #
 # General setup
 #
-# CONFIG_ANGELBOOT is not set
 # CONFIG_PCI is not set
 # CONFIG_ISA is not set
 # CONFIG_ISA_DMA is not set
@@ -77,7 +118,8 @@
 CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
-# CONFIG_NWFPE is not set
+CONFIG_FPE_NWFPE=y
+CONFIG_FPE_FASTFPE=y
 CONFIG_KCORE_ELF=y
 # CONFIG_KCORE_AOUT is not set
 CONFIG_BINFMT_AOUT=y
@@ -85,15 +127,15 @@
 # CONFIG_BINFMT_MISC is not set
 # CONFIG_PM is not set
 # CONFIG_ARTHUR is not set
-# CONFIG_ALIGNMENT_TRAP is not set
+CONFIG_ALIGNMENT_TRAP=y
 
 #
 # Parallel port support
 #
 CONFIG_PARPORT=y
 CONFIG_PARPORT_PC=y
-# CONFIG_PARPORT_PC_FIFO is not set
-CONFIG_PARPORT_PC_SUPERIO=y
+CONFIG_PARPORT_PC_FIFO=y
+# CONFIG_PARPORT_PC_SUPERIO is not set
 # CONFIG_PARPORT_ARC is not set
 # CONFIG_PARPORT_AMIGA is not set
 # CONFIG_PARPORT_MFC3 is not set
@@ -108,6 +150,64 @@
 # CONFIG_MTD is not set
 
 #
+# RAM/ROM/Flash chip drivers
+#
+# CONFIG_MTD_CFI is not set
+# CONFIG_MTD_CFI_INTELEXT is not set
+# CONFIG_MTD_CFI_AMDSTD is not set
+# CONFIG_MTD_AMDSTD is not set
+# CONFIG_MTD_SHARP is not set
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_JEDEC is not set
+
+#
+# Mapping drivers for chip access
+#
+# CONFIG_MTD_PHYSMAP is not set
+# CONFIG_MTD_SUN_UFLASH is not set
+# CONFIG_MTD_NORA is not set
+# CONFIG_MTD_PNC2000 is not set
+# CONFIG_MTD_RPXLITE is not set
+# CONFIG_MTD_SC520CDP is not set
+# CONFIG_MTD_NETSC520 is not set
+# CONFIG_MTD_SBC_GXX is not set
+# CONFIG_MTD_ELAN_104NC is not set
+# CONFIG_MTD_SA1100 is not set
+# CONFIG_MTD_SA1100_REDBOOT_PARTITIONS is not set
+# CONFIG_MTD_SA1100_BOOTLDR_PARTITIONS is not set
+# CONFIG_MTD_DC21285 is not set
+# CONFIG_MTD_IQ80310 is not set
+# CONFIG_MTD_DBOX2 is not set
+# CONFIG_MTD_CSTM_MIPS_IXX is not set
+# CONFIG_MTD_CFI_FLAGADM is not set
+# CONFIG_MTD_MIXMEM is not set
+# CONFIG_MTD_OCTAGON is not set
+# CONFIG_MTD_VMAX is not set
+# CONFIG_MTD_ARMFLASH is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_PMC551 is not set
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_MTDRAM is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOC1000 is not set
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOCPROBE is not set
+
+#
+# NAND Flash Device Drivers
+#
+# CONFIG_MTD_NAND is not set
+# CONFIG_MTD_NAND_SPIA is not set
+
+#
 # Plug and Play configuration
 #
 # CONFIG_PNP is not set
@@ -129,6 +229,17 @@
 CONFIG_BLK_DEV_INITRD=y
 
 #
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+# CONFIG_BLK_DEV_MD is not set
+# CONFIG_MD_LINEAR is not set
+# CONFIG_MD_RAID0 is not set
+# CONFIG_MD_RAID1 is not set
+# CONFIG_MD_RAID5 is not set
+# CONFIG_BLK_DEV_LVM is not set
+
+#
 # Acorn-specific block devices
 #
 
@@ -218,6 +329,7 @@
 # CONFIG_PLIP is not set
 CONFIG_PPP=m
 # CONFIG_PPP_MULTILINK is not set
+# CONFIG_PPP_FILTER is not set
 # CONFIG_PPP_ASYNC is not set
 # CONFIG_PPP_SYNC_TTY is not set
 # CONFIG_PPP_DEFLATE is not set
@@ -313,6 +425,7 @@
 CONFIG_BLK_DEV_SD=y
 CONFIG_SD_EXTRA_DEVS=8
 CONFIG_CHR_DEV_ST=m
+# CONFIG_CHR_DEV_OSST is not set
 CONFIG_BLK_DEV_SR=y
 CONFIG_BLK_DEV_SR_VENDOR=y
 CONFIG_SR_EXTRA_DEVS=2
@@ -335,6 +448,7 @@
 # CONFIG_SCSI_AHA1542 is not set
 # CONFIG_SCSI_AHA1740 is not set
 # CONFIG_SCSI_AIC7XXX is not set
+# CONFIG_SCSI_AIC7XXX_OLD is not set
 # CONFIG_SCSI_ADVANSYS is not set
 # CONFIG_SCSI_IN2000 is not set
 # CONFIG_SCSI_AM53C974 is not set
@@ -415,7 +529,17 @@
 # CONFIG_SERIAL_MULTIPORT is not set
 # CONFIG_HUB6 is not set
 # CONFIG_SERIAL_NONSTANDARD is not set
-# CONFIG_UNIX98_PTYS is not set
+# CONFIG_SERIAL_21285 is not set
+# CONFIG_SERIAL_21285_OLD is not set
+# CONFIG_SERIAL_21285_CONSOLE is not set
+# CONFIG_SERIAL_SA1100 is not set
+# CONFIG_SERIAL_SA1100_CONSOLE is not set
+# CONFIG_SERIAL_AMBA is not set
+# CONFIG_SERIAL_AMBA_CONSOLE is not set
+# CONFIG_SERIAL_CLPS711X is not set
+# CONFIG_SERIAL_CLPS711X_CONSOLE is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_UNIX98_PTY_COUNT=256
 CONFIG_PRINTER=m
 # CONFIG_LP_CONSOLE is not set
 # CONFIG_PPDEV is not set
@@ -483,6 +607,8 @@
 # CONFIG_QUOTA is not set
 # CONFIG_AUTOFS_FS is not set
 CONFIG_AUTOFS4_FS=m
+# CONFIG_REISERFS_FS is not set
+# CONFIG_REISERFS_CHECK is not set
 CONFIG_ADFS_FS=y
 # CONFIG_ADFS_FS_RW is not set
 # CONFIG_AFFS_FS is not set
@@ -494,11 +620,14 @@
 # CONFIG_VFAT_FS is not set
 # CONFIG_EFS_FS is not set
 # CONFIG_JFFS_FS is not set
+# CONFIG_JFFS2_FS is not set
 # CONFIG_CRAMFS is not set
+# CONFIG_TMPFS is not set
 # CONFIG_RAMFS is not set
 CONFIG_ISO9660_FS=y
 CONFIG_JOLIET=y
 # CONFIG_MINIX_FS is not set
+# CONFIG_VXFS_FS is not set
 # CONFIG_NTFS_FS is not set
 # CONFIG_NTFS_RW is not set
 # CONFIG_HPFS_FS is not set
@@ -506,7 +635,7 @@
 # CONFIG_DEVFS_FS is not set
 # CONFIG_DEVFS_MOUNT is not set
 # CONFIG_DEVFS_DEBUG is not set
-# CONFIG_DEVPTS_FS is not set
+CONFIG_DEVPTS_FS=y
 # CONFIG_QNX4FS_FS is not set
 # CONFIG_QNX4FS_RW is not set
 # CONFIG_ROMFS_FS is not set
@@ -537,8 +666,6 @@
 # CONFIG_NCPFS_NFS_NS is not set
 # CONFIG_NCPFS_OS2_NS is not set
 # CONFIG_NCPFS_SMALLDOS is not set
-# CONFIG_NCPFS_MOUNT_SUBDIR is not set
-# CONFIG_NCPFS_NDS_DOMAINS is not set
 # CONFIG_NCPFS_NLS is not set
 # CONFIG_NCPFS_EXTRAS is not set
 
@@ -557,11 +684,13 @@
 CONFIG_MAC_PARTITION=y
 CONFIG_MSDOS_PARTITION=y
 CONFIG_BSD_DISKLABEL=y
+# CONFIG_MINIX_SUBPARTITION is not set
 CONFIG_SOLARIS_X86_PARTITION=y
 # CONFIG_UNIXWARE_DISKLABEL is not set
 CONFIG_SGI_PARTITION=y
 # CONFIG_ULTRIX_PARTITION is not set
 CONFIG_SUN_PARTITION=y
+# CONFIG_SMB_NLS is not set
 CONFIG_NLS=y
 
 #
@@ -583,11 +712,13 @@
 CONFIG_NLS_CODEPAGE_865=m
 CONFIG_NLS_CODEPAGE_866=m
 CONFIG_NLS_CODEPAGE_869=m
-CONFIG_NLS_CODEPAGE_874=m
-# CONFIG_NLS_CODEPAGE_932 is not set
 # CONFIG_NLS_CODEPAGE_936 is not set
-# CONFIG_NLS_CODEPAGE_949 is not set
 # CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+CONFIG_NLS_CODEPAGE_874=m
+CONFIG_NLS_ISO8859_8=m
+# CONFIG_NLS_CODEPAGE_1251 is not set
 CONFIG_NLS_ISO8859_1=m
 CONFIG_NLS_ISO8859_2=m
 CONFIG_NLS_ISO8859_3=m
@@ -595,11 +726,12 @@
 CONFIG_NLS_ISO8859_5=m
 CONFIG_NLS_ISO8859_6=m
 CONFIG_NLS_ISO8859_7=m
-CONFIG_NLS_ISO8859_8=m
 CONFIG_NLS_ISO8859_9=m
+# CONFIG_NLS_ISO8859_13 is not set
 # CONFIG_NLS_ISO8859_14 is not set
 # CONFIG_NLS_ISO8859_15 is not set
 CONFIG_NLS_KOI8_R=m
+# CONFIG_NLS_KOI8_U is not set
 # CONFIG_NLS_UTF8 is not set
 
 #
@@ -616,6 +748,8 @@
 # CONFIG_FB_CLPS711X is not set
 # CONFIG_FB_CYBER2000 is not set
 # CONFIG_FB_SA1100 is not set
+# CONFIG_FB_ANAKIN is not set
+# CONFIG_FB_E1355 is not set
 # CONFIG_FB_VIRTUAL is not set
 CONFIG_FBCON_ADVANCED=y
 CONFIG_FBCON_MFB=y
@@ -656,6 +790,8 @@
 # CONFIG_SOUND_ES1371 is not set
 # CONFIG_SOUND_ESSSOLO1 is not set
 # CONFIG_SOUND_MAESTRO is not set
+# CONFIG_SOUND_MAESTRO3 is not set
+# CONFIG_SOUND_ICH is not set
 # CONFIG_SOUND_SONICVIBES is not set
 # CONFIG_SOUND_TRIDENT is not set
 # CONFIG_SOUND_MSNDCLAS is not set
@@ -671,7 +807,6 @@
 # CONFIG_SOUND_CS4232 is not set
 # CONFIG_SOUND_SSCAPE is not set
 # CONFIG_SOUND_GUS is not set
-# CONFIG_SOUND_ICH is not set
 # CONFIG_SOUND_VMIDI is not set
 # CONFIG_SOUND_TRIX is not set
 # CONFIG_SOUND_MSS is not set
@@ -688,10 +823,12 @@
 # CONFIG_SOUND_YM3812 is not set
 # CONFIG_SOUND_OPL3SA1 is not set
 # CONFIG_SOUND_OPL3SA2 is not set
-# CONFIG_SOUND_YMPCI is not set
+# CONFIG_SOUND_YMFPCI is not set
+# CONFIG_SOUND_YMFPCI_LEGACY is not set
 # CONFIG_SOUND_UART6850 is not set
 # CONFIG_SOUND_AEDSP16 is not set
 CONFIG_SOUND_VIDC=m
+# CONFIG_SOUND_WAVEARTIST is not set
 # CONFIG_SOUND_TVMIXER is not set
 
 #
@@ -702,9 +839,12 @@
 #
 # Kernel hacking
 #
-CONFIG_FRAME_POINTER=y
+# CONFIG_NO_FRAME_POINTER is not set
 CONFIG_DEBUG_ERRORS=y
 CONFIG_DEBUG_USER=y
 # CONFIG_DEBUG_INFO is not set
 CONFIG_MAGIC_SYSRQ=y
+# CONFIG_NO_PGT_CACHE is not set
 CONFIG_DEBUG_LL=y
+# CONFIG_DEBUG_DC21285_PORT is not set
+# CONFIG_DEBUG_CLPS711X_UART2 is not set
diff -u --recursive --new-file v2.4.8/linux/arch/arm/def-configs/shark linux/arch/arm/def-configs/shark
--- v2.4.8/linux/arch/arm/def-configs/shark	Mon Sep 18 15:15:24 2000
+++ linux/arch/arm/def-configs/shark	Sun Aug 12 11:13:59 2001
@@ -2,8 +2,12 @@
 # Automatically generated make config: don't edit
 #
 CONFIG_ARM=y
+# CONFIG_EISA is not set
 # CONFIG_SBUS is not set
+# CONFIG_MCA is not set
 CONFIG_UID16=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
 
 #
 # Code maturity level options
@@ -21,35 +25,95 @@
 #
 # System Type
 #
+# CONFIG_ARCH_ANAKIN is not set
 # CONFIG_ARCH_ARCA5K is not set
 # CONFIG_ARCH_CLPS7500 is not set
+# CONFIG_ARCH_CLPS711X is not set
 # CONFIG_ARCH_CO285 is not set
 # CONFIG_ARCH_EBSA110 is not set
-# CONFIG_ARCH_FTVPCI is not set
-# CONFIG_ARCH_TBOX is not set
-CONFIG_ARCH_SHARK=y
 # CONFIG_ARCH_FOOTBRIDGE is not set
 # CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_L7200 is not set
 # CONFIG_ARCH_RPC is not set
 # CONFIG_ARCH_SA1100 is not set
+CONFIG_ARCH_SHARK=y
+
+#
+# Archimedes/A5000 Implementations
+#
+
+#
+# Archimedes/A5000 Implementations (select only ONE)
+#
+# CONFIG_ARCH_ARC is not set
+# CONFIG_ARCH_A5K is not set
+
+#
+# Footbridge Implementations
+#
+# CONFIG_ARCH_CATS is not set
+# CONFIG_ARCH_PERSONAL_SERVER is not set
+# CONFIG_ARCH_EBSA285_ADDIN is not set
+# CONFIG_ARCH_EBSA285_HOST is not set
+# CONFIG_ARCH_NETWINDER is not set
+
+#
+# SA11x0 Implementations
+#
+# CONFIG_SA1100_ASSABET is not set
+# CONFIG_ASSABET_NEPONSET is not set
+# CONFIG_SA1100_BRUTUS is not set
+# CONFIG_SA1100_CERF is not set
+# CONFIG_SA1100_BITSY is not set
+# CONFIG_SA1100_EXTENEX1 is not set
+# CONFIG_SA1100_FLEXANET is not set
+# CONFIG_SA1100_FREEBIRD is not set
+# CONFIG_SA1100_GRAPHICSCLIENT is not set
+# CONFIG_SA1100_JORNADA720 is not set
+# CONFIG_SA1100_HUW_WEBPANEL is not set
+# CONFIG_SA1100_ITSY is not set
+# CONFIG_SA1100_LART is not set
+# CONFIG_SA1100_NANOENGINE is not set
+# CONFIG_SA1100_OMNIMETER is not set
+# CONFIG_SA1100_PANGOLIN is not set
+# CONFIG_SA1100_PLEB is not set
+# CONFIG_SA1100_SHERMAN is not set
+# CONFIG_SA1100_PFS168 is not set
+# CONFIG_SA1100_VICTOR is not set
+# CONFIG_SA1100_XP860 is not set
+# CONFIG_SA1100_YOPY is not set
+
+#
+# CLPS711X/EP721X Implementations
+#
+# CONFIG_ARCH_P720T is not set
 # CONFIG_ARCH_ACORN is not set
 # CONFIG_FOOTBRIDGE is not set
 # CONFIG_FOOTBRIDGE_HOST is not set
 # CONFIG_FOOTBRIDGE_ADDIN is not set
 CONFIG_CPU_32=y
 # CONFIG_CPU_26 is not set
+
+#
+# Processor Type
+#
+# CONFIG_CPU_32v3 is not set
 CONFIG_CPU_32v4=y
+# CONFIG_CPU_ARM610 is not set
+# CONFIG_CPU_ARM710 is not set
+# CONFIG_CPU_ARM720T is not set
+# CONFIG_CPU_ARM920T is not set
+# CONFIG_CPU_ARM1020 is not set
 CONFIG_CPU_SA110=y
+# CONFIG_CPU_SA1100 is not set
 # CONFIG_DISCONTIGMEM is not set
-CONFIG_PCI=y
-CONFIG_ISA=y
-CONFIG_ISA_DMA=y
-CONFIG_PC_KEYB=y
-CONFIG_PC_KEYMAP=y
 
 #
 # General setup
 #
+CONFIG_PCI=y
+CONFIG_ISA=y
+CONFIG_ISA_DMA=y
 # CONFIG_PCI_NAMES is not set
 # CONFIG_HOTPLUG is not set
 # CONFIG_PCMCIA is not set
@@ -57,7 +121,8 @@
 CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
-CONFIG_NWFPE=y
+# CONFIG_FPE_NWFPE is not set
+CONFIG_FPE_FASTFPE=y
 CONFIG_KCORE_ELF=y
 # CONFIG_KCORE_AOUT is not set
 # CONFIG_BINFMT_AOUT is not set
@@ -77,6 +142,7 @@
 CONFIG_PARPORT_PC=y
 # CONFIG_PARPORT_PC_FIFO is not set
 # CONFIG_PARPORT_PC_SUPERIO is not set
+# CONFIG_PARPORT_ARC is not set
 # CONFIG_PARPORT_AMIGA is not set
 # CONFIG_PARPORT_MFC3 is not set
 # CONFIG_PARPORT_ATARI is not set
@@ -85,14 +151,10 @@
 # CONFIG_PARPORT_1284 is not set
 
 #
-# Memory Technology Devices (MTD)
-#
-# CONFIG_MTD is not set
-
-#
 # Plug and Play configuration
 #
 # CONFIG_PNP is not set
+# CONFIG_ISAPNP is not set
 
 #
 # Block devices
@@ -101,16 +163,26 @@
 # CONFIG_BLK_DEV_XD is not set
 # CONFIG_PARIDE is not set
 # CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
 # CONFIG_BLK_DEV_DAC960 is not set
 CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_NBD is not set
-# CONFIG_BLK_DEV_LVM is not set
-# CONFIG_BLK_DEV_MD is not set
 CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_SIZE=4096
 # CONFIG_BLK_DEV_INITRD is not set
 
 #
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+# CONFIG_BLK_DEV_MD is not set
+# CONFIG_MD_LINEAR is not set
+# CONFIG_MD_RAID0 is not set
+# CONFIG_MD_RAID1 is not set
+# CONFIG_MD_RAID5 is not set
+# CONFIG_BLK_DEV_LVM is not set
+
+#
 # Networking options
 #
 # CONFIG_PACKET is not set
@@ -122,10 +194,8 @@
 # CONFIG_IP_MULTICAST is not set
 # CONFIG_IP_ADVANCED_ROUTER is not set
 # CONFIG_IP_PNP is not set
-# CONFIG_IP_ROUTER is not set
 # CONFIG_NET_IPIP is not set
 # CONFIG_NET_IPGRE is not set
-# CONFIG_IP_ALIAS is not set
 # CONFIG_INET_ECN is not set
 # CONFIG_SYN_COOKIES is not set
 # CONFIG_IPV6 is not set
@@ -142,6 +212,7 @@
 # CONFIG_X25 is not set
 # CONFIG_LAPB is not set
 # CONFIG_LLC is not set
+# CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
 # CONFIG_NET_FASTROUTE is not set
@@ -164,19 +235,25 @@
 # CONFIG_DUMMY is not set
 # CONFIG_BONDING is not set
 # CONFIG_EQUALIZER is not set
-# CONFIG_NET_SB1000 is not set
+# CONFIG_TUN is not set
 
 #
 # Ethernet (10 or 100Mbit)
 #
 CONFIG_NET_ETHERNET=y
-# CONFIG_ARM_AM79C961A is not set
+# CONFIG_SUNLANCE is not set
+# CONFIG_HAPPYMEAL is not set
+# CONFIG_SUNBMAC is not set
+# CONFIG_SUNQE is not set
+# CONFIG_SUNLANCE is not set
+# CONFIG_SUNGEM is not set
 # CONFIG_NET_VENDOR_3COM is not set
 # CONFIG_LANCE is not set
 # CONFIG_NET_VENDOR_SMC is not set
 # CONFIG_NET_VENDOR_RACAL is not set
 # CONFIG_AT1700 is not set
 # CONFIG_DEPCA is not set
+# CONFIG_HP100 is not set
 # CONFIG_NET_ISA is not set
 CONFIG_NET_PCI=y
 # CONFIG_PCNET32 is not set
@@ -184,28 +261,39 @@
 # CONFIG_AC3200 is not set
 # CONFIG_APRICOT is not set
 CONFIG_CS89x0=y
-# CONFIG_DE4X5 is not set
 # CONFIG_TULIP is not set
+# CONFIG_TULIP_MWI is not set
+# CONFIG_TULIP_MMIO is not set
+# CONFIG_DE4X5 is not set
 # CONFIG_DGRS is not set
 # CONFIG_DM9102 is not set
 # CONFIG_EEPRO100 is not set
 # CONFIG_LNE390 is not set
-# CONFIG_NE3210 is not set
+# CONFIG_FEALNX is not set
+# CONFIG_NATSEMI is not set
 # CONFIG_NE2K_PCI is not set
-# CONFIG_RTL8129 is not set
+# CONFIG_NE3210 is not set
+# CONFIG_ES3210 is not set
 # CONFIG_8139TOO is not set
+# CONFIG_8139TOO_PIO is not set
+# CONFIG_8139TOO_TUNE_TWISTER is not set
+# CONFIG_8139TOO_8129 is not set
 # CONFIG_SIS900 is not set
+# CONFIG_EPIC100 is not set
+# CONFIG_SUNDANCE is not set
 # CONFIG_TLAN is not set
 # CONFIG_VIA_RHINE is not set
-# CONFIG_ES3210 is not set
-# CONFIG_EPIC100 is not set
+# CONFIG_WINBOND_840 is not set
 # CONFIG_NET_POCKET is not set
 
 #
 # Ethernet (1000 Mbit)
 #
-# CONFIG_YELLOWFIN is not set
 # CONFIG_ACENIC is not set
+# CONFIG_ACENIC_OMIT_TIGON_I is not set
+# CONFIG_MYRI_SBUS is not set
+# CONFIG_HAMACHI is not set
+# CONFIG_YELLOWFIN is not set
 # CONFIG_SK98LIN is not set
 # CONFIG_FDDI is not set
 # CONFIG_HIPPI is not set
@@ -230,7 +318,6 @@
 # Wan interfaces
 #
 # CONFIG_WAN is not set
-# CONFIG_ASH is not set
 
 #
 # Amateur Radio support
@@ -260,7 +347,15 @@
 CONFIG_BLK_DEV_IDEDISK=y
 # CONFIG_IDEDISK_MULTI_MODE is not set
 # CONFIG_BLK_DEV_IDEDISK_VENDOR is not set
+# CONFIG_BLK_DEV_IDEDISK_FUJITSU is not set
+# CONFIG_BLK_DEV_IDEDISK_IBM is not set
+# CONFIG_BLK_DEV_IDEDISK_MAXTOR is not set
+# CONFIG_BLK_DEV_IDEDISK_QUANTUM is not set
+# CONFIG_BLK_DEV_IDEDISK_SEAGATE is not set
+# CONFIG_BLK_DEV_IDEDISK_WD is not set
 # CONFIG_BLK_DEV_COMMERIAL is not set
+# CONFIG_BLK_DEV_TIVO is not set
+# CONFIG_BLK_DEV_IDECS is not set
 CONFIG_BLK_DEV_IDECD=y
 # CONFIG_BLK_DEV_IDETAPE is not set
 CONFIG_BLK_DEV_IDEFLOPPY=y
@@ -270,6 +365,8 @@
 # IDE chipset support/bugfixes
 #
 # CONFIG_BLK_DEV_CMD640 is not set
+# CONFIG_BLK_DEV_CMD640_ENHANCED is not set
+# CONFIG_BLK_DEV_ISAPNP is not set
 # CONFIG_BLK_DEV_RZ1000 is not set
 # CONFIG_BLK_DEV_IDEPCI is not set
 # CONFIG_BLK_DEV_SL82C105 is not set
@@ -289,6 +386,7 @@
 CONFIG_BLK_DEV_SD=m
 CONFIG_SD_EXTRA_DEVS=40
 CONFIG_CHR_DEV_ST=m
+# CONFIG_CHR_DEV_OSST is not set
 CONFIG_BLK_DEV_SR=m
 # CONFIG_BLK_DEV_SR_VENDOR is not set
 CONFIG_SR_EXTRA_DEVS=2
@@ -312,11 +410,13 @@
 # CONFIG_SCSI_AHA1542 is not set
 # CONFIG_SCSI_AHA1740 is not set
 # CONFIG_SCSI_AIC7XXX is not set
+# CONFIG_SCSI_AIC7XXX_OLD is not set
 # CONFIG_SCSI_ADVANSYS is not set
 # CONFIG_SCSI_IN2000 is not set
 # CONFIG_SCSI_AM53C974 is not set
 # CONFIG_SCSI_MEGARAID is not set
 # CONFIG_SCSI_BUSLOGIC is not set
+# CONFIG_SCSI_CPQFCTS is not set
 # CONFIG_SCSI_DMX3191D is not set
 # CONFIG_SCSI_DTC3280 is not set
 # CONFIG_SCSI_EATA is not set
@@ -330,8 +430,6 @@
 # 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_SIM710 is not set
 # CONFIG_SCSI_NCR53C7xx is not set
 # CONFIG_SCSI_NCR53C8XX is not set
 # CONFIG_SCSI_SYM53C8XX is not set
@@ -343,6 +441,8 @@
 # CONFIG_SCSI_QLOGIC_ISP is not set
 # CONFIG_SCSI_QLOGIC_FC is not set
 # CONFIG_SCSI_QLOGIC_1280 is not set
+# CONFIG_SCSI_SIM710 is not set
+# CONFIG_SCSI_SYM53C416 is not set
 # CONFIG_SCSI_DC390T is not set
 # CONFIG_SCSI_T128 is not set
 # CONFIG_SCSI_U14_34F is not set
@@ -357,6 +457,11 @@
 # I2O device support
 #
 # CONFIG_I2O is not set
+# CONFIG_I2O_PCI is not set
+# CONFIG_I2O_BLOCK is not set
+# CONFIG_I2O_LAN is not set
+# CONFIG_I2O_SCSI is not set
+# CONFIG_I2O_PROC is not set
 
 #
 # ISDN subsystem
@@ -364,6 +469,11 @@
 # CONFIG_ISDN is not set
 
 #
+# Input core support
+#
+# CONFIG_INPUT is not set
+
+#
 # Character devices
 #
 CONFIG_VT=y
@@ -372,7 +482,19 @@
 CONFIG_SERIAL_CONSOLE=y
 # CONFIG_SERIAL_EXTENDED is not set
 # CONFIG_SERIAL_NONSTANDARD is not set
-# CONFIG_UNIX98_PTYS is not set
+# CONFIG_SERIAL_21285 is not set
+# CONFIG_SERIAL_21285_OLD is not set
+# CONFIG_SERIAL_21285_CONSOLE is not set
+# CONFIG_SERIAL_AMBA is not set
+# CONFIG_SERIAL_AMBA_CONSOLE is not set
+# CONFIG_SERIAL_CLPS711X is not set
+# CONFIG_SERIAL_CLPS711X_CONSOLE is not set
+# CONFIG_SERIAL_SA1100 is not set
+# CONFIG_SERIAL_SA1100_CONSOLE is not set
+# CONFIG_SERIAL_8250 is not set
+# CONFIG_SERIAL_8250_CONSOLE is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_UNIX98_PTY_COUNT=256
 CONFIG_PRINTER=m
 # CONFIG_LP_CONSOLE is not set
 # CONFIG_PPDEV is not set
@@ -394,62 +516,20 @@
 #
 # Joysticks
 #
-CONFIG_JOYSTICK=y
-CONFIG_INPUT_JOYDEV=y
-
-#
-# Game port support
-#
-# CONFIG_INPUT_NS558 is not set
-# CONFIG_INPUT_LIGHTNING is not set
-# CONFIG_INPUT_PCIGAME is not set
+# CONFIG_JOYSTICK is not set
 
 #
-# Gameport joysticks
+# Input core support is needed for joysticks
 #
-# CONFIG_INPUT_ANALOG is not set
-# CONFIG_INPUT_A3D is not set
-# CONFIG_INPUT_ADI is not set
-# CONFIG_INPUT_COBRA is not set
-# CONFIG_INPUT_GF2K is not set
-# CONFIG_INPUT_GRIP is not set
-# CONFIG_INPUT_INTERACT is not set
-# CONFIG_INPUT_TMDC is not set
-# CONFIG_INPUT_SIDEWINDER is not set
-
-#
-# Serial port support
-#
-# CONFIG_INPUT_SERPORT is not set
-
-#
-# Serial port joysticks
-#
-# CONFIG_INPUT_WARRIOR is not set
-# CONFIG_INPUT_MAGELLAN is not set
-# CONFIG_INPUT_SPACEORB is not set
-# CONFIG_INPUT_SPACEBALL is not set
-# CONFIG_INPUT_IFORCE_232 is not set
-
-#
-# Parallel port joysticks
-#
-# CONFIG_INPUT_DB9 is not set
-# CONFIG_INPUT_GAMECON is not set
-# CONFIG_INPUT_TURBOGRAFX is not set
 # CONFIG_QIC02_TAPE is not set
 
 #
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
+# CONFIG_INTEL_RNG is not set
 # CONFIG_NVRAM is not set
 CONFIG_RTC=y
-
-#
-# Video For Linux
-#
-# CONFIG_VIDEO_DEV is not set
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
 # CONFIG_APPLICOM is not set
@@ -462,12 +542,20 @@
 # CONFIG_DRM is not set
 
 #
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
 # File systems
 #
 # CONFIG_QUOTA is not set
 # CONFIG_AUTOFS_FS is not set
 # CONFIG_AUTOFS4_FS is not set
+# CONFIG_REISERFS_FS is not set
+# CONFIG_REISERFS_CHECK is not set
 # CONFIG_ADFS_FS is not set
+# CONFIG_ADFS_FS_RW is not set
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
 # CONFIG_BFS_FS is not set
@@ -476,22 +564,32 @@
 # CONFIG_UMSDOS_FS is not set
 CONFIG_VFAT_FS=y
 # CONFIG_EFS_FS is not set
-CONFIG_JFFS_FS_VERBOSE=0
+# CONFIG_JFFS_FS is not set
+# CONFIG_JFFS2_FS is not set
 # CONFIG_CRAMFS is not set
+# CONFIG_TMPFS is not set
 # CONFIG_RAMFS is not set
 CONFIG_ISO9660_FS=y
 CONFIG_JOLIET=y
 # CONFIG_MINIX_FS is not set
+# CONFIG_VXFS_FS is not set
 # CONFIG_NTFS_FS is not set
+# CONFIG_NTFS_RW is not set
 # CONFIG_HPFS_FS is not set
 CONFIG_PROC_FS=y
-# CONFIG_DEVFS_FS is not set
+CONFIG_DEVFS_FS=y
+CONFIG_DEVFS_MOUNT=y
+# CONFIG_DEVFS_DEBUG is not set
+# CONFIG_DEVPTS_FS is not set
 # CONFIG_QNX4FS_FS is not set
+# CONFIG_QNX4FS_RW is not set
 # CONFIG_ROMFS_FS is not set
 CONFIG_EXT2_FS=y
 # CONFIG_SYSV_FS is not set
 # CONFIG_UDF_FS is not set
+# CONFIG_UDF_RW is not set
 # CONFIG_UFS_FS is not set
+# CONFIG_UFS_FS_WRITE is not set
 
 #
 # Network File Systems
@@ -499,11 +597,21 @@
 # CONFIG_CODA_FS is not set
 CONFIG_NFS_FS=y
 # CONFIG_NFS_V3 is not set
+# CONFIG_ROOT_NFS is not set
 # CONFIG_NFSD is not set
+# CONFIG_NFSD_V3 is not set
 CONFIG_SUNRPC=y
 CONFIG_LOCKD=y
 # CONFIG_SMB_FS is not set
 # CONFIG_NCP_FS is not set
+# CONFIG_NCPFS_PACKET_SIGNING is not set
+# CONFIG_NCPFS_IOCTL_LOCKING is not set
+# CONFIG_NCPFS_STRONG is not set
+# CONFIG_NCPFS_NFS_NS is not set
+# CONFIG_NCPFS_OS2_NS is not set
+# CONFIG_NCPFS_SMALLDOS is not set
+# CONFIG_NCPFS_NLS is not set
+# CONFIG_NCPFS_EXTRAS is not set
 
 #
 # Partition Types
@@ -516,11 +624,13 @@
 # CONFIG_MAC_PARTITION is not set
 CONFIG_MSDOS_PARTITION=y
 # CONFIG_BSD_DISKLABEL is not set
+# CONFIG_MINIX_SUBPARTITION is not set
 # CONFIG_SOLARIS_X86_PARTITION is not set
 # CONFIG_UNIXWARE_DISKLABEL is not set
 # CONFIG_SGI_PARTITION is not set
 # CONFIG_ULTRIX_PARTITION is not set
 # CONFIG_SUN_PARTITION is not set
+# CONFIG_SMB_NLS is not set
 CONFIG_NLS=y
 
 #
@@ -542,11 +652,13 @@
 # CONFIG_NLS_CODEPAGE_865 is not set
 # CONFIG_NLS_CODEPAGE_866 is not set
 # CONFIG_NLS_CODEPAGE_869 is not set
-# CONFIG_NLS_CODEPAGE_874 is not set
-# CONFIG_NLS_CODEPAGE_932 is not set
 # CONFIG_NLS_CODEPAGE_936 is not set
-# CONFIG_NLS_CODEPAGE_949 is not set
 # CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
 CONFIG_NLS_ISO8859_1=y
 # CONFIG_NLS_ISO8859_2 is not set
 # CONFIG_NLS_ISO8859_3 is not set
@@ -554,18 +666,20 @@
 # CONFIG_NLS_ISO8859_5 is not set
 # CONFIG_NLS_ISO8859_6 is not set
 # CONFIG_NLS_ISO8859_7 is not set
-# CONFIG_NLS_ISO8859_8 is not set
 # CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
 # CONFIG_NLS_ISO8859_14 is not set
 # CONFIG_NLS_ISO8859_15 is not set
 # CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
 # CONFIG_NLS_UTF8 is not set
 
 #
 # Console drivers
 #
+CONFIG_PC_KEYB=y
+CONFIG_PC_KEYMAP=y
 # CONFIG_VGA_CONSOLE is not set
-CONFIG_FB=y
 
 #
 # Frame-buffer support
@@ -575,7 +689,12 @@
 # CONFIG_FB_RIVA is not set
 # CONFIG_FB_CLGEN is not set
 # CONFIG_FB_PM2 is not set
+# CONFIG_FB_ACORN is not set
+# CONFIG_FB_CLPS711X is not set
 CONFIG_FB_CYBER2000=y
+# CONFIG_FB_SA1100 is not set
+# CONFIG_FB_ANAKIN is not set
+# CONFIG_FB_E1355 is not set
 # CONFIG_FB_MATROX is not set
 # CONFIG_FB_ATY is not set
 # CONFIG_FB_ATY128 is not set
@@ -597,15 +716,20 @@
 CONFIG_SOUND=m
 # CONFIG_SOUND_CMPCI is not set
 # CONFIG_SOUND_EMU10K1 is not set
+# CONFIG_SOUND_FUSION is not set
+# CONFIG_SOUND_CS4281 is not set
 # CONFIG_SOUND_ES1370 is not set
 # CONFIG_SOUND_ES1371 is not set
 # CONFIG_SOUND_ESSSOLO1 is not set
 # CONFIG_SOUND_MAESTRO is not set
+# CONFIG_SOUND_MAESTRO3 is not set
+# CONFIG_SOUND_ICH is not set
 # CONFIG_SOUND_SONICVIBES is not set
 # CONFIG_SOUND_TRIDENT is not set
 # CONFIG_SOUND_MSNDCLAS is not set
 # CONFIG_SOUND_MSNDPIN is not set
 # CONFIG_SOUND_VIA82CXXX is not set
+# CONFIG_MIDI_VIA82CXXX is not set
 CONFIG_SOUND_OSS=m
 # CONFIG_SOUND_TRACEINIT is not set
 # CONFIG_SOUND_DMAP is not set
@@ -616,7 +740,6 @@
 # CONFIG_SOUND_CS4232 is not set
 # CONFIG_SOUND_SSCAPE is not set
 # CONFIG_SOUND_GUS is not set
-# CONFIG_SOUND_ICH is not set
 # CONFIG_SOUND_VMIDI is not set
 # CONFIG_SOUND_TRIX is not set
 # CONFIG_SOUND_MSS is not set
@@ -624,8 +747,8 @@
 # CONFIG_SOUND_NM256 is not set
 # CONFIG_SOUND_MAD16 is not set
 # CONFIG_SOUND_PAS is not set
+# CONFIG_PAS_JOYSTICK is not set
 # CONFIG_SOUND_PSS is not set
-# CONFIG_SOUND_SOFTOSS is not set
 CONFIG_SOUND_SB=m
 # CONFIG_SOUND_AWE32_SYNTH is not set
 # CONFIG_SOUND_WAVEFRONT is not set
@@ -633,11 +756,12 @@
 # CONFIG_SOUND_YM3812 is not set
 # CONFIG_SOUND_OPL3SA1 is not set
 # CONFIG_SOUND_OPL3SA2 is not set
-# CONFIG_SOUND_YMPCI is not set
+# CONFIG_SOUND_YMFPCI is not set
+# CONFIG_SOUND_YMFPCI_LEGACY is not set
 # CONFIG_SOUND_UART6850 is not set
 # CONFIG_SOUND_AEDSP16 is not set
-# CONFIG_SOUND_VIDC is not set
 # CONFIG_SOUND_WAVEARTIST is not set
+# CONFIG_SOUND_TVMIXER is not set
 
 #
 # USB support
@@ -645,11 +769,19 @@
 # CONFIG_USB is not set
 
 #
+# Bluetooth support
+#
+# CONFIG_BLUEZ is not set
+
+#
 # Kernel hacking
 #
-# CONFIG_FRAME_POINTER is not set
+CONFIG_NO_FRAME_POINTER=y
 CONFIG_DEBUG_ERRORS=y
 CONFIG_DEBUG_USER=y
 # CONFIG_DEBUG_INFO is not set
 # CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_NO_PGT_CACHE is not set
 CONFIG_DEBUG_LL=y
+# CONFIG_DEBUG_DC21285_PORT is not set
+# CONFIG_DEBUG_CLPS711X_UART2 is not set
diff -u --recursive --new-file v2.4.8/linux/arch/arm/def-configs/sherman linux/arch/arm/def-configs/sherman
--- v2.4.8/linux/arch/arm/def-configs/sherman	Mon Nov 27 17:07:59 2000
+++ linux/arch/arm/def-configs/sherman	Sun Aug 12 11:13:59 2001
@@ -34,7 +34,7 @@
 # Code maturity level options
 #
 CONFIG_EXPERIMENTAL=y
-# CONFIG_ALIGNMENT_TRAP is not set
+CONFIG_ALIGNMENT_TRAP=y
 # CONFIG_TEXT_SECTIONS is not set
 
 #
diff -u --recursive --new-file v2.4.8/linux/arch/arm/kernel/Makefile linux/arch/arm/kernel/Makefile
--- v2.4.8/linux/arch/arm/kernel/Makefile	Thu Apr 12 12:20:31 2001
+++ linux/arch/arm/kernel/Makefile	Sun Aug 12 11:13:59 2001
@@ -31,9 +31,9 @@
 
 # Object file lists.
 
-obj-y		:= arch.o dma.o $(ENTRY_OBJ) irq.o process.o ptrace.o    \
-		   semaphore.o setup.o signal.o sys_arm.o time.o traps.o \
-		   $(O_OBJS_$(MACHINE))
+obj-y		:= arch.o compat.o dma.o $(ENTRY_OBJ) entry-common.o irq.o   \
+		   process.o ptrace.o semaphore.o setup.o signal.o sys_arm.o \
+		   time.o traps.o $(O_OBJS_$(MACHINE))
 obj-m		:=
 obj-n		:=
 obj-		:=
@@ -41,7 +41,8 @@
 export-objs	:= armksyms.o dma.o ecard.o fiq.o io.o oldlatches.o time.o
 
 no-irq-arch	:= $(CONFIG_ARCH_INTEGRATOR) $(CONFIG_ARCH_CLPS711X) \
-		   $(CONFIG_ARCH_FOOTBRIDGE) $(CONFIG_ARCH_EBSA110)
+		   $(CONFIG_ARCH_FOOTBRIDGE) $(CONFIG_ARCH_EBSA110) \
+		   $(CONFIG_ARCH_SA1100)
 
 ifneq ($(findstring y,$(no-irq-arch)),y)
   obj-y		+= irq-arch.o
@@ -64,5 +65,6 @@
 include $(TOPDIR)/Rules.make
 
 # Spell out some dependencies that `make dep' doesn't spot
-entry-armv.o: calls.S $(TOPDIR)/include/asm-arm/constants.h
-entry-armo.o: calls.S $(TOPDIR)/include/asm-arm/constants.h
+entry-armv.o: entry-header.S $(TOPDIR)/include/asm-arm/constants.h
+entry-armo.o: entry-header.S $(TOPDIR)/include/asm-arm/constants.h
+entry-common.o: entry-header.S calls.S $(TOPDIR)/include/asm-arm/constants.h
diff -u --recursive --new-file v2.4.8/linux/arch/arm/kernel/arch.c linux/arch/arm/kernel/arch.c
--- v2.4.8/linux/arch/arm/kernel/arch.c	Thu Apr 12 12:20:31 2001
+++ linux/arch/arm/kernel/arch.c	Sun Aug 12 11:13:59 2001
@@ -1,10 +1,7 @@
 /*
  *  linux/arch/arm/kernel/arch.c
  *
- *  Architecture specific fixups.  This is where any
- *  parameters in the params struct are fixed up, or
- *  any additional architecture specific information
- *  is pulled from the params struct.
+ *  Architecture specific fixups.
  */
 #include <linux/config.h>
 #include <linux/tty.h>
@@ -28,46 +25,41 @@
 unsigned int memc_ctrl_reg;
 unsigned int number_mfm_drives;
 
-static void __init
-fixup_acorn(struct machine_desc *desc, struct param_struct *params,
-	    char **cmdline, struct meminfo *mi)
+static int __init parse_tag_acorn(const struct tag *tag)
 {
-	if (machine_is_riscpc()) {
-		int i;
+	memc_ctrl_reg = tag->u.acorn.memc_control_reg;
+	number_mfm_drives = tag->u.acorn.adfsdrives;
 
-		/*
-		 * RiscPC can't handle half-word loads and stores
-		 */
-		elf_hwcap &= ~HWCAP_HALF;
-
-		switch (params->u1.s.pages_in_vram) {
-		case 512:
-			vram_size += PAGE_SIZE * 256;
-		case 256:
-			vram_size += PAGE_SIZE * 256;
-		default:
-			break;
-		}
-
-		if (vram_size) {
-			desc->video_start = 0x02000000;
-			desc->video_end   = 0x02000000 + vram_size;
-		}
-
-		for (i = 0; i < 4; i++) {
-			mi->bank[i].start = PHYS_OFFSET + (i << 26);
-			mi->bank[i].node  = 0;
-			mi->bank[i].size  =
-				params->u1.s.pages_in_bank[i] *
-				params->u1.s.page_size;
-		}
-		mi->nr_banks = 4;
+	switch (tag->u.acorn.vram_pages) {
+	case 512:
+		vram_size += PAGE_SIZE * 256;
+	case 256:
+		vram_size += PAGE_SIZE * 256;
+	default:
+		break;
+	}
+#if 0
+	if (vram_size) {
+		desc->video_start = 0x02000000;
+		desc->video_end   = 0x02000000 + vram_size;
 	}
-	memc_ctrl_reg	  = params->u1.s.memc_control_reg;
-	number_mfm_drives = (params->u1.s.adfsdrives >> 3) & 3;
+#endif
+	return 0;
 }
 
+__tagtable(ATAG_ACORN, parse_tag_acorn);
+
 #ifdef CONFIG_ARCH_RPC
+static void __init
+fixup_riscpc(struct machine_desc *desc, struct param_struct *unusd,
+	    char **cmdline, struct meminfo *mi)
+{
+	/*
+	 * RiscPC can't handle half-word loads and stores
+	 */
+	elf_hwcap &= ~HWCAP_HALF;
+}
+
 extern void __init rpc_map_io(void);
 
 MACHINE_START(RISCPC, "Acorn-RiscPC")
@@ -76,7 +68,7 @@
 	BOOT_PARAMS(0x10000100)
 	DISABLE_PARPORT(0)
 	DISABLE_PARPORT(1)
-	FIXUP(fixup_acorn)
+	FIXUP(fixup_riscpc)
 	MAPIO(rpc_map_io)
 	INITIRQ(genarch_init_irq)
 MACHINE_END
@@ -85,7 +77,6 @@
 MACHINE_START(ARCHIMEDES, "Acorn-Archimedes")
 	MAINTAINER("Dave Gilbert")
 	BOOT_PARAMS(0x0207c000)
-	FIXUP(fixup_acorn)
 	INITIRQ(genarch_init_irq)
 MACHINE_END
 #endif
@@ -93,7 +84,6 @@
 MACHINE_START(A5K, "Acorn-A5000")
 	MAINTAINER("Russell King")
 	BOOT_PARAMS(0x0207c000)
-	FIXUP(fixup_acorn)
 	INITIRQ(genarch_init_irq)
 MACHINE_END
 #endif
@@ -103,7 +93,7 @@
 extern void __init l7200_map_io(void);
 
 static void __init
-fixup_l7200(struct machine_desc *desc, struct param_struct *params,
+fixup_l7200(struct machine_desc *desc, struct param_struct *unused,
              char **cmdline, struct meminfo *mi)
 {
         mi->nr_banks      = 1;
diff -u --recursive --new-file v2.4.8/linux/arch/arm/kernel/armksyms.c linux/arch/arm/kernel/armksyms.c
--- v2.4.8/linux/arch/arm/kernel/armksyms.c	Thu Apr 12 12:20:31 2001
+++ linux/arch/arm/kernel/armksyms.c	Sun Aug 12 11:13:59 2001
@@ -76,6 +76,12 @@
 extern void fpundefinstr(void);
 extern void fp_enter(void);
 
+/*
+ * This has a special calling convention; it doesn't
+ * modify any of the usual registers, except for LR.
+ */
+extern void __do_softirq(void);
+
 #define EXPORT_SYMBOL_ALIAS(sym,orig)		\
  const char __kstrtab_##sym##[]			\
   __attribute__((section(".kstrtab"))) =	\
@@ -101,6 +107,8 @@
 EXPORT_SYMBOL(kd_mksound);
 #endif
 
+EXPORT_SYMBOL_NOVERS(__do_softirq);
+
 	/* platform dependent support */
 EXPORT_SYMBOL(dump_thread);
 EXPORT_SYMBOL(dump_fpu);
@@ -113,7 +121,6 @@
 EXPORT_SYMBOL(system_rev);
 EXPORT_SYMBOL(system_serial_low);
 EXPORT_SYMBOL(system_serial_high);
-EXPORT_SYMBOL(mem_fclk_21285);
 EXPORT_SYMBOL(__bug);
 EXPORT_SYMBOL(__bad_xchg);
 EXPORT_SYMBOL(__readwrite_bug);
@@ -130,12 +137,24 @@
 EXPORT_SYMBOL(__csum_ipv6_magic);
 
 	/* io */
-EXPORT_SYMBOL(outsb);
-EXPORT_SYMBOL(outsw);
-EXPORT_SYMBOL(outsl);
-EXPORT_SYMBOL(insb);
-EXPORT_SYMBOL(insw);
-EXPORT_SYMBOL(insl);
+#ifndef __raw_readsb
+EXPORT_SYMBOL_NOVERS(__raw_readsb);
+#endif
+#ifndef __raw_readsw
+EXPORT_SYMBOL_NOVERS(__raw_readsw);
+#endif
+#ifndef __raw_readsl
+EXPORT_SYMBOL_NOVERS(__raw_readsl);
+#endif
+#ifndef __raw_writesb
+EXPORT_SYMBOL_NOVERS(__raw_writesb);
+#endif
+#ifndef __raw_writesw
+EXPORT_SYMBOL_NOVERS(__raw_writesw);
+#endif
+#ifndef __raw_writesl
+EXPORT_SYMBOL_NOVERS(__raw_writesl);
+#endif
 
 	/* address translation */
 #ifndef __virt_to_phys__is_a_macro
@@ -240,8 +259,5 @@
 EXPORT_SYMBOL_NOVERS(__down_interruptible_failed);
 EXPORT_SYMBOL_NOVERS(__down_trylock_failed);
 EXPORT_SYMBOL_NOVERS(__up_wakeup);
-EXPORT_SYMBOL_NOVERS(__down_read_failed);
-EXPORT_SYMBOL_NOVERS(__down_write_failed);
-EXPORT_SYMBOL_NOVERS(__rwsem_wake);
 
 EXPORT_SYMBOL(get_wchan);
diff -u --recursive --new-file v2.4.8/linux/arch/arm/kernel/bios32.c linux/arch/arm/kernel/bios32.c
--- v2.4.8/linux/arch/arm/kernel/bios32.c	Wed Jul 25 17:10:17 2001
+++ linux/arch/arm/kernel/bios32.c	Sun Aug 12 11:13:59 2001
@@ -527,14 +527,6 @@
 }
 
 /**
- * pcibios_set_master - Setup device for bus mastering.
- * @dev: PCI device to be setup
- */
-void pcibios_set_master(struct pci_dev *dev)
-{
-}
-
-/**
  * pcibios_enable_device - Enable I/O and memory.
  * @dev: PCI device to be enabled
  */
diff -u --recursive --new-file v2.4.8/linux/arch/arm/kernel/compat.c linux/arch/arm/kernel/compat.c
--- v2.4.8/linux/arch/arm/kernel/compat.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/kernel/compat.c	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,125 @@
+/*
+ *  linux/arch/arm/kernel/compat.c
+ *
+ *  Copyright (C) 2001 Russell King
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * We keep the old params compatibility cruft in one place (here)
+ * so we don't end up with lots of 
+ */
+#include <linux/config.h>
+#include <linux/types.h>
+#include <linux/kernel.h>
+#include <linux/string.h>
+#include <linux/init.h>
+
+#include <asm/setup.h>
+#include <asm/mach-types.h>
+#include <asm/page.h>
+
+#include <asm/mach/arch.h>
+
+static struct tag * __init memtag(struct tag *tag, unsigned long start, unsigned long size)
+{
+	tag = tag_next(tag);
+	tag->hdr.tag = ATAG_MEM;
+	tag->hdr.size = tag_size(tag_mem32);
+	tag->u.mem.size = size;
+	tag->u.mem.start = start;
+
+	return tag;
+}
+
+static void __init build_tag_list(struct param_struct *params, void *taglist, int mem_init)
+{
+	struct tag *tag = taglist;
+
+	printk(KERN_DEBUG "Converting old-style param struct to taglist\n");
+
+	if (params->u1.s.page_size != PAGE_SIZE) {
+		printk(KERN_WARNING "Warning: bad configuration page, "
+		       "trying to continue\n");
+		return;
+	}
+
+	tag->hdr.tag  = ATAG_CORE;
+	tag->hdr.size = tag_size(tag_core);
+	tag->u.core.flags = params->u1.s.flags & FLAG_READONLY;
+	tag->u.core.pagesize = params->u1.s.page_size;
+	tag->u.core.rootdev = params->u1.s.rootdev;
+
+	tag = tag_next(tag);
+	tag->hdr.tag = ATAG_RAMDISK;
+	tag->hdr.size = tag_size(tag_ramdisk);
+	tag->u.ramdisk.flags = (params->u1.s.flags & FLAG_RDLOAD ? 1 : 0) |
+			       (params->u1.s.flags & FLAG_RDPROMPT ? 2 : 0);
+	tag->u.ramdisk.size  = params->u1.s.ramdisk_size;
+	tag->u.ramdisk.start = params->u1.s.rd_start;
+
+	tag = tag_next(tag);
+	tag->hdr.tag = ATAG_INITRD;
+	tag->hdr.size = tag_size(tag_initrd);
+	tag->u.initrd.start = params->u1.s.initrd_start;
+	tag->u.initrd.size  = params->u1.s.initrd_size;
+
+	tag = tag_next(tag);
+	tag->hdr.tag = ATAG_SERIAL;
+	tag->hdr.size = tag_size(tag_serialnr);
+	tag->u.serialnr.low = params->u1.s.system_serial_low;
+	tag->u.serialnr.high = params->u1.s.system_serial_high;
+
+	tag = tag_next(tag);
+	tag->hdr.tag = ATAG_REVISION;
+	tag->hdr.size = tag_size(tag_revision);
+	tag->u.revision.rev = params->u1.s.system_rev;
+
+	if (mem_init) {
+#ifdef CONFIG_ARCH_ACORN
+		if (machine_is_riscpc()) {
+			int i;
+			for (i = 0; i < 4; i++)
+				tag = memtag(tag, PHYS_OFFSET + (i << 26),
+					 params->u1.s.pages_in_bank[i] * PAGE_SIZE);
+		} else
+#endif
+		tag = memtag(tag, PHYS_OFFSET, params->u1.s.nr_pages * PAGE_SIZE);
+	}
+
+#ifdef CONFIG_FOOTBRIDGE
+	tag = tag_next(tag);
+	tag->hdr.tag = ATAG_MEMCLK;
+	tag->hdr.size = tag_size(tag_memclk);
+	tag->u.memclk.fmemclk = params->u1.s.mem_fclk_21285;
+#endif
+
+#ifdef CONFIG_ARCH_ACORN
+	tag = tag_next(tag);
+	tag->hdr.tag = ATAG_ACORN;
+	tag->hdr.size = tag_size(tag_acorn);
+	tag->u.acorn.memc_control_reg = params->u1.s.memc_control_reg;
+	tag->u.acorn.vram_pages       = params->u1.s.pages_in_vram;
+	tag->u.acorn.sounddefault     = params->u1.s.sounddefault;
+	tag->u.acorn.adfsdrives       = params->u1.s.adfsdrives;
+#endif
+
+	tag = tag_next(tag);
+	tag->hdr.tag = ATAG_CMDLINE;
+	tag->hdr.size = (strlen(params->commandline) + 3 +
+			 sizeof(struct tag_header)) >> 2;
+	strcpy(tag->u.cmdline.cmdline, params->commandline);
+
+	tag = tag_next(tag);
+	tag->hdr.tag = 0;
+	tag->hdr.size = 0;
+
+	memmove(params, taglist, ((int)tag) - ((int)taglist) +
+				 sizeof(struct tag_header));
+}
+
+void __init convert_to_tag_list(struct param_struct *params, int mem_init)
+{
+	build_tag_list(params, &params->u2, mem_init);
+}
diff -u --recursive --new-file v2.4.8/linux/arch/arm/kernel/debug-armv.S linux/arch/arm/kernel/debug-armv.S
--- v2.4.8/linux/arch/arm/kernel/debug-armv.S	Thu Apr 12 12:20:31 2001
+++ linux/arch/arm/kernel/debug-armv.S	Sun Aug 12 11:13:59 2001
@@ -169,8 +169,8 @@
 		tst	\rx, #1			@ MMU enabled?
 		moveq	\rx, #0x80000000	@ physical base address
 		movne	\rx, #0xf8000000	@ virtual address
-		add	\rx, \rx, #0x00050000	@ Ser3
-		@add	\rx, \rx, #0x00010000	@ Ser1
+		@add	\rx, \rx, #0x00050000	@ Ser3
+		add	\rx, \rx, #0x00010000	@ Ser1
 		.endm
 
 		.macro	senduart,rd,rx
@@ -300,6 +300,37 @@
 		tst	\rd, #1 << 8		@ CTS
 		bne	1001b
 1002:
+		.endm
+
+#elif defined(CONFIG_ARCH_ANAKIN)
+
+//#//include <asm/arch/serial_reg.h>
+
+		.macro	addruart,rx
+		mrc	p15, 0, \rx, c1, c0
+		tst	\rx, #1			@ MMU enabled?
+		moveq	\rx, #IO_START
+		movne	\rx, #IO_BASE
+		add	\rx, \rx, #UART0
+		.endm
+
+		.macro	senduart,rd,rx
+		str	\rd, [\rx, #0x14]	@ tx
+		ldr	\rd, [\rx, #0x18]
+		orr	\rd, \rd, #SENDREQUEST
+		str	\rd, [\rx, #0x18]
+		.endm
+
+		.macro	waituart,rd,rx
+1001:		ldr	\rd, [\rx, #0x10]
+		tst	\rd, #TXEMPTY
+		beq	1001b
+		.endm
+
+		.macro	busyuart,rd,rx
+1001:		ldr	\rd, [\rx, #0x10]
+		tst	\rd, #CTS
+		bne	1001b
 		.endm
 
 #else
diff -u --recursive --new-file v2.4.8/linux/arch/arm/kernel/ecard.c linux/arch/arm/kernel/ecard.c
--- v2.4.8/linux/arch/arm/kernel/ecard.c	Tue Jul  3 17:08:18 2001
+++ linux/arch/arm/kernel/ecard.c	Sun Aug 12 11:13:59 2001
@@ -230,11 +230,13 @@
 }
 
 #ifdef CONFIG_CPU_32
+#include <linux/completion.h>
+
 static pid_t ecard_pid;
 static wait_queue_head_t ecard_wait;
 static struct ecard_request *ecard_req;
 
-static DECLARE_MUTEX_LOCKED(ecard_done_sem);
+static DECLARE_COMPLETION(ecard_completion);
 
 /*
  * Set up the expansion card daemon's page tables.
@@ -328,7 +330,7 @@
 		} while (req == NULL);
 
 		ecard_do_request(req);
-		up(&ecard_done_sem);
+		complete(&ecard_completion);
 	}
 }
 
@@ -357,7 +359,7 @@
 	/*
 	 * Now wait for kecardd to run.
 	 */
-	down(&ecard_done_sem);
+	wait_for_completion(&ecard_completion);
 }
 #else
 /*
diff -u --recursive --new-file v2.4.8/linux/arch/arm/kernel/entry-armo.S linux/arch/arm/kernel/entry-armo.S
--- v2.4.8/linux/arch/arm/kernel/entry-armo.S	Tue Mar  6 19:44:35 2001
+++ linux/arch/arm/kernel/entry-armo.S	Sun Aug 12 11:13:59 2001
@@ -25,53 +25,11 @@
  *  Ok, so this file may be a mess, but its as efficient as possible while
  *  adhering to the above criteria.
  */
-#include <linux/linkage.h>
 #include <linux/config.h>
-
-#include <asm/assembler.h>
-#include <asm/constants.h>
-#include <asm/errno.h>
-#include <asm/hardware.h>
-
-		.macro	zero_fp
-#ifndef CONFIG_NO_FRAME_POINTER
-		mov	fp, #0
-#endif
-		.endm
+#include "entry-header.S"
 
 		.text
 
-@ Bad Abort numbers
-@ -----------------
-@
-#define BAD_PREFETCH	0
-#define BAD_DATA	1
-#define BAD_ADDREXCPTN	2
-#define BAD_IRQ		3
-#define BAD_UNDEFINSTR	4
-
-@
-@ Stack format (ensured by USER_* and SVC_*)
-@
-#define S_OLD_R0	64
-#define S_PSR		60
-#define S_PC		60
-#define S_LR		56
-#define S_SP		52
-#define S_IP		48
-#define S_FP		44
-#define S_R10		40
-#define S_R9		36
-#define S_R8		32
-#define S_R7		28
-#define S_R6		24
-#define S_R5		20
-#define S_R4		16
-#define S_R3		12
-#define S_R2		8
-#define S_R1		4
-#define S_R0		0
-
 #ifdef IOC_BASE
 /* IOC / IOMD based hardware */
 		.equ	ioc_base_high, IOC_BASE & 0xff000000
@@ -141,49 +99,6 @@
  * For entry-common.S
  */
 
-		.macro	save_user_regs
-		str	r0, [sp, #-4]!
-		str	lr, [sp, #-4]!
-		sub	sp, sp, #15*4
-		stmia	sp, {r0 - lr}^
-		mov	r0, r0
-		.endm
-
-		.macro	restore_user_regs
-		ldmia	sp, {r0 - lr}^
-		mov	r0, r0
-		ldr	lr, [sp, #15*4]
-		add	sp, sp, #15*4+8
-		movs	pc, lr
-		.endm
-
-		.macro	mask_pc, rd, rm
-		bic	\rd, \rm, #PCMASK
-		.endm
-
-		.macro	arm700_bug_check, instr, temp
-		.endm
-
-		.macro	enable_irqs, temp
-		teqp	pc, #0x00000003
-		.endm
-
-		.macro	initialise_traps_extra
-		.endm
-
-		.macro	get_current_task, rd
-		mov	\rd, sp, lsr #13
-		mov	\rd, \rd, lsl #13
-		.endm
-
-		/*
-		 * Like adr, but force SVC mode (if required)
-		 */
-		.macro	adrsvc, cond, reg, label
-		adr\cond	\reg, \label
-		orr\cond	\reg, \reg, #0x08000003
-		.endm
-
 #if 0
 /*
  * Uncomment these if you wish to get more debugging into about data aborts.
@@ -275,7 +190,7 @@
 		bl	SYMBOL_NAME(do_undefinstr)
 		SVC_RESTORE_ALL
 
-#ifdef CONFIG_NWFPE
+#if defined CONFIG_FPE_NWFPE || defined CONFIG_FPE_FASTFPE
 		/* The FPE is always present */
 		.equ	fpe_not_present, 0
 #else
@@ -334,7 +249,7 @@
 		mov	r1, sp			@ Tasks registers
 		bl	SYMBOL_NAME(do_PrefetchAbort)
 		teq	r0, #0			@ If non-zero, we believe this abort..
-		bne	ret_from_sys_call
+		bne	ret_from_exception
 #ifdef DEBUG_UNDEF
 		adr	r0, t
 		bl	SYMBOL_NAME(printk)
@@ -440,9 +355,10 @@
 		adr	lr, 1b
 		orr	lr, lr, #0x08000003		@ Force SVC
 		bne	do_IRQ
-		mov	r4, #0
+
+		mov	why, #0
 		get_current_task r5
-		b	ret_with_reschedule
+		b	ret_to_user
 
 		irq_prio_table
 
@@ -645,6 +561,19 @@
 #endif
 		b	SYMBOL_NAME(do_DataAbort)
 
+
+/*
+ * This is the return code to user mode for abort handlers
+ */
+ENTRY(ret_from_exception)
+		get_current_task tsk
+		mov	why, #0
+		b	ret_to_user
+
+		.data
+ENTRY(fp_enter)
+		.word	fpe_not_present
+		.text
 /*
  * Register switch for older 26-bit only ARMs
  */
@@ -697,10 +626,6 @@
 		mov	r0, #0
 		stmia	r0, {r1 - r7, ip}
 		ldmfd	sp!, {r4 - r7, pc}^
-
-		.text
-
-#include "entry-common.S"
 
 		.bss
 __temp_irq:	.space	4				@ saved lr_irq
diff -u --recursive --new-file v2.4.8/linux/arch/arm/kernel/entry-armv.S linux/arch/arm/kernel/entry-armv.S
--- v2.4.8/linux/arch/arm/kernel/entry-armv.S	Tue Jul  3 17:08:18 2001
+++ linux/arch/arm/kernel/entry-armv.S	Sun Aug 12 11:13:59 2001
@@ -13,62 +13,8 @@
  *  Note:  there is a StrongARM bug in the STMIA rn, {regs}^ instruction that causes
  *  it to save wrong values...  Be aware!
  */
-#include <linux/config.h> /* for CONFIG_ARCH_xxxx */
-#include <linux/linkage.h>
-
-#include <asm/assembler.h>
-#include <asm/constants.h>
-#include <asm/errno.h>
-#include <asm/hardware.h>
-#include <asm/arch/irqs.h>
-#include <asm/proc-fns.h>
-
-
-#ifndef MODE_SVC
-#define MODE_SVC 0x13
-#endif
-
-		.macro	zero_fp
-#ifndef CONFIG_NO_FRAME_POINTER
-		mov	fp, #0
-#endif
-		.endm
-
-		.text
-
-@ Bad Abort numbers
-@ -----------------
-@
-#define BAD_PREFETCH	0
-#define BAD_DATA	1
-#define BAD_ADDREXCPTN	2
-#define BAD_IRQ		3
-#define BAD_UNDEFINSTR	4
-
-@
-@ Stack format (ensured by USER_* and SVC_*)
-@
-#define S_FRAME_SIZE	72
-#define S_OLD_R0	68
-#define S_PSR		64
-#define S_PC		60
-#define S_LR		56
-#define S_SP		52
-#define S_IP		48
-#define S_FP		44
-#define S_R10		40
-#define S_R9		36
-#define S_R8		32
-#define S_R7		28
-#define S_R6		24
-#define S_R5		20
-#define S_R4		16
-#define S_R3		12
-#define S_R2		8
-#define S_R1		4
-#define S_R0		0
-
-#define OFF_CR_ALIGNMENT(x)	cr_alignment - x
+#include <linux/config.h>
+#include "entry-header.S"
 
 #ifdef IOC_BASE
 /* IOC / IOMD based hardware */
@@ -552,75 +498,36 @@
 		.macro	irq_prio_table
 		.endm
 
-#else
-#error Unknown architecture
-#endif
-
-/*============================================================================
- * For entry-common.S
- */
-
-		.macro	save_user_regs
-		sub	sp, sp, #S_FRAME_SIZE
-		stmia	sp, {r0 - r12}			@ Calling r0 - r12
-		add	r8, sp, #S_PC
-		stmdb	r8, {sp, lr}^			@ Calling sp, lr
-		str	lr, [r8, #0]			@ Save calling PC
-		mrs	r6, spsr
-		str	r6, [r8, #4]			@ Save CPSR
-		str	r0, [r8, #8]			@ Save OLD_R0
-		.endm
-
-		.macro	restore_user_regs
-		ldr	r0, [sp, #S_PSR]		@ Get calling cpsr
-		mov	ip, #I_BIT | MODE_SVC
-		msr	cpsr_c, ip			@ disable IRQs
-		msr	spsr, r0			@ save in spsr_svc
-		ldmia	sp, {r0 - lr}^			@ Get calling r0 - lr
-		mov	r0, r0
-		ldr	lr, [sp, #S_PC]			@ Get PC
-		add	sp, sp, #S_FRAME_SIZE
-		movs	pc, lr				@ return & move spsr_svc into cpsr
-		.endm
-
-		.macro	mask_pc, rd, rm
-		.endm
-
-		/* If we're optimising for StrongARM the resulting code won't 
-		   run on an ARM7 and we can save a couple of instructions.  
-									--pb */
-		.macro	arm700_bug_check, instr, temp
-#ifndef __ARM_ARCH_4__
-		and	\temp, \instr, #0x0f000000	@ check for SWI
-		teq	\temp, #0x0f000000
-		bne	.Larm700bug
-#endif
-		.endm
+#elif defined(CONFIG_ARCH_ANAKIN)
 
-		.macro	enable_irqs, temp
-		mrs	\temp, cpsr
-		bic	\temp, \temp, #I_BIT
-		msr	cpsr, \temp
+		.macro	disable_fiq
 		.endm
 
-		.macro	get_current_task, rd
-		mov	\rd, sp, lsr #13
-		mov	\rd, \rd, lsl #13
+		.macro	get_irqnr_and_base, irqnr, irqstat, base, tmp
+		mov	\base, #IO_BASE
+		mov	\irqstat, #INTERRUPT_CONTROLLER
+		ldr	\tmp, =anakin_irq_mask
+		ldr	\irqstat, [\base, \irqstat]
+		ldr	\tmp, [\tmp]
+		ands	\irqstat, \irqstat, \tmp
+		ldrne	\tmp, =anakin_active_irqs
+		strne	\irqstat, [\tmp]
+		movne	\irqnr, #IRQ_ANAKIN
 		.endm
 
-		/*
-		 * Like adr, but force SVC mode (if required)
-		 */
-		.macro	adrsvc, cond, reg, label
-		adr\cond	\reg, \label
+		.macro	irq_prio_table
+		.ltorg
+		.bss
+ENTRY(anakin_irq_mask)
+		.word	0
+ENTRY(anakin_active_irqs)
+		.space	4
+		.text
 		.endm
 
-		.macro	alignment_trap, rbase, rtemp, sym
-#ifdef CONFIG_ALIGNMENT_TRAP
-		ldr	\rtemp, [\rbase, #OFF_CR_ALIGNMENT(\sym)]
-		mcr	p15, 0, \rtemp, c1, c0
+#else
+#error Unknown architecture
 #endif
-		.endm
 
 /*
  * Invalid mode handlers
@@ -656,7 +563,7 @@
 		and	r2, r6, #31			@ int mode
 		b	SYMBOL_NAME(bad_mode)
 
-#ifdef CONFIG_NWFPE
+#if defined CONFIG_FPE_NWFPE || defined CONFIG_FPE_FASTFPE
 		/* The FPE is always present */
 		.equ	fpe_not_present, 0
 #else
@@ -806,9 +713,6 @@
 .LCprocfns:	.word	SYMBOL_NAME(processor)
 #endif
 .LCfp:		.word	SYMBOL_NAME(fp_enter)
-#ifdef CONFIG_ALIGNMENT_TRAP
-.LCswi:		.word	SYMBOL_NAME(cr_alignment)
-#endif
 
 		irq_prio_table
 
@@ -835,7 +739,7 @@
 		mov	r2, #MODE_SVC
 		msr	cpsr_c, r2			@ Enable interrupts
 		mov	r2, sp
-		adrsvc	al, lr, ret_from_sys_call
+		adrsvc	al, lr, ret_from_exception
 		b	SYMBOL_NAME(do_DataAbort)
 
 		.align	5
@@ -855,9 +759,9 @@
 		@ routine called with r0 = irq number, r1 = struct pt_regs *
 		@
 		bne	do_IRQ
-		mov	r4, #0
-		get_current_task r5
-		b	ret_with_reschedule
+		mov	why, #0
+		get_current_task tsk
+		b	ret_to_user
 
 		.align	5
 __und_usr:	sub	sp, sp, #S_FRAME_SIZE		@ Allocate frame size in one go
@@ -869,7 +773,7 @@
 		stmdb	r8, {sp, lr}^			@ Save user sp, lr
 		alignment_trap r4, r7, __temp_und
 		zero_fp
-		adrsvc	al, r9, ret_from_sys_call	@ r9  = normal FP return
+		adrsvc	al, r9, ret_from_exception	@ r9  = normal FP return
 		adrsvc	al, lr, fpundefinstr		@ lr  = undefined instr return
 
 call_fpe:	get_current_task r10
@@ -883,7 +787,7 @@
 		msr	cpsr_c, r0			@ Enable interrupts
 		mov	r0, lr
 		mov	r1, sp
-		adrsvc	al, lr, ret_from_sys_call
+		adrsvc	al, lr, ret_from_exception
 		b	SYMBOL_NAME(do_undefinstr)
 
 		.align	5
@@ -901,40 +805,19 @@
 		mov	r0, r5				@ address (pc)
 		mov	r1, sp				@ regs
 		bl	SYMBOL_NAME(do_PrefetchAbort)	@ call abort handler
-		teq	r0, #0				@ Does this still apply???
-		bne	ret_from_sys_call		@ Return from exception
-#ifdef DEBUG_UNDEF
-		adr	r0, t
-		bl	SYMBOL_NAME(printk)
-#endif
-		mov	r0, r5
-		mov	r1, sp
-		and	r2, r6, #31
-		bl	SYMBOL_NAME(do_undefinstr)
-		ldr	lr, [sp, #S_PSR]		@ Get USR cpsr
-		msr	spsr, lr
-		ldmia	sp, {r0 - pc}^			@ Restore USR registers
-
-#ifdef DEBUG_UNDEF
-t:		.ascii "Prefetch -> undefined instruction\n\0"
-		.align
-#endif
-
-#include "entry-common.S"
-
+		/* fall through */
+/*
+ * This is the return code to user mode for abort handlers
+ */
+ENTRY(ret_from_exception)
+		get_current_task tsk
+		mov	why, #0
+		b	ret_to_user
+
+		.data
+ENTRY(fp_enter)
+		.word	fpe_not_present
 		.text
-
-#ifndef __ARM_ARCH_4__
-.Larm700bug:	ldr	r0, [sp, #S_PSR]		@ Get calling cpsr
-		str	lr, [r8]
-		msr	spsr, r0
-		ldmia	sp, {r0 - lr}^			@ Get calling r0 - lr
-		mov	r0, r0
-		ldr	lr, [sp, #S_PC]			@ Get PC
-		add	sp, sp, #S_FRAME_SIZE
-		movs	pc, lr
-#endif
-
 /*
  * Register switch for ARMv3 and ARMv4 processors
  * r0 = previous, r1 = next, return previous.
diff -u --recursive --new-file v2.4.8/linux/arch/arm/kernel/entry-common.S linux/arch/arm/kernel/entry-common.S
--- v2.4.8/linux/arch/arm/kernel/entry-common.S	Thu Apr 12 12:20:31 2001
+++ linux/arch/arm/kernel/entry-common.S	Sun Aug 12 11:13:59 2001
@@ -8,70 +8,85 @@
  * published by the Free Software Foundation.
  */
 #include <linux/config.h>
+#include "entry-header.S"
 
-#define PT_TRACESYS	0x00000002
-
-@ OS version number used in SWIs
-@  RISC OS is 0
-@  RISC iX is 8
-@
-#define OS_NUMBER	9
+/* 
+ * We rely on the fact that R0 is at the bottom of the stack (due to
+ * slow/fast restore user regs).
+ */
+#if S_R0 != 0
+#error "Please fix"
+#endif
 
-/*============================================================================
- * All exits to user mode from the kernel go through this code.
+/*
+ * Our do_softirq out of line code.  See include/asm-arm/softirq.h for
+ * the calling assembly.
  */
+	.section ".text.lock","ax"
+ENTRY(__do_softirq)
+	stmfd	sp!, {r0 - r3, ip, lr}
+	bl	do_softirq
+	ldmfd	sp!, {r0 - r3, ip, pc}
+	.previous
 
-#define S_OFF		8
+	.align	5
+/*
+ * This is the fast syscall return path.  We do as little as
+ * possible here, and this includes saving r0 back into the SVC
+ * stack.
+ */
+ret_fast_syscall:
+	ldr	r1, [tsk, #TSK_NEED_RESCHED]
+	ldr	r2, [tsk, #TSK_SIGPENDING]
+	teq	r1, #0				@ need_resched || sigpending
+	teqeq	r2, #0
+	bne	slow
+	fast_restore_user_regs
 
-		.macro	get_softirq, rd
-#ifdef CONFIG_SMP
-#error SMP not supported
-#else
-		ldr	\rd, __irq_stat
-#endif
-		.endm
+/*
+ * Ok, we need to do extra processing, enter the slow path.
+ */
+slow:	str	r0, [sp, #S_R0+S_OFF]!	@ returned r0
+	b	1f
 
-		.globl	ret_from_sys_call
+/*
+ * "slow" syscall return path.  "why" tells us if this was a real syscall.
+ */
+reschedule:
+	bl	SYMBOL_NAME(schedule)
+ENTRY(ret_to_user)
+ret_slow_syscall:
+	ldr	r1, [tsk, #TSK_NEED_RESCHED]
+	ldr	r2, [tsk, #TSK_SIGPENDING]
+1:	teq	r1, #0				@ need_resched => schedule()
+	bne	reschedule
+	teq	r2, #0				@ sigpending => do_signal()
+	blne	__do_signal
+	restore_user_regs
+
+__do_signal:
+	mov	r0, #0				@ NULL 'oldset'
+	mov	r1, sp				@ 'regs'
+	mov	r2, why				@ 'syscall'
+	b	SYMBOL_NAME(do_signal)		@ note the bl above sets lr
 
-		.align	5
-fast_syscall_return:
-		str	r0, [sp, #S_R0+S_OFF]!	@ returned r0
-ret_from_sys_call:				@ external entry
-		get_softirq r0
-		get_current_task r5
-		ldmia	r0, {r0, r1}		@ softirq_active, softirq_mask
-		mov	r4, #1			@ flag this as being syscall return
-		tst	r0, r1
-		blne	SYMBOL_NAME(do_softirq)
-ret_with_reschedule:				@ external entry (r5 must be set) (__irq_usr)
-		ldr	r0, [r5, #TSK_NEED_RESCHED]
-		ldr	r1, [r5, #TSK_SIGPENDING]
-		teq	r0, #0
-		bne	ret_reschedule
-		teq	r1, #0			@ check for signals
-		blne	ret_signal
-
-ret_from_all:	restore_user_regs		@ internal
-
-ret_signal:	mov	r1, sp			@ internal
-		mov	r2, r4
-		b	SYMBOL_NAME(do_signal)	@ note the bl above sets lr
-
-ret_reschedule:	adrsvc	al, lr, ret_with_reschedule	@ internal
-		b	SYMBOL_NAME(schedule)
-
-		.globl	ret_from_exception
-ret_from_exception:				@ external entry
-		get_softirq r0
-		get_current_task r5
-		ldmia	r0, {r0, r1}		@ softirq_active, softirq_mask
-		mov	r4, #0
-		tst	r0, r1
-		ldr	r6, [sp, #S_PSR]
-		blne	SYMBOL_NAME(do_softirq)
-		tst	r6, #3			@ returning to user mode?
-		beq	ret_with_reschedule
-		b	ret_from_all
+/*
+ * This is how we return from a fork.  __switch_to will be calling us
+ * with r0 pointing at the previous task that was running (ready for
+ * calling schedule_tail).
+ */
+ENTRY(ret_from_fork)
+	bl	SYMBOL_NAME(schedule_tail)
+	get_current_task tsk
+	ldr	ip, [tsk, #TSK_PTRACE]		@ check for syscall tracing
+	mov	why, #1
+	tst	ip, #PT_TRACESYS		@ are we tracing syscalls?
+	beq	ret_slow_syscall
+	mov	r1, sp
+	mov	r0, #1				@ trace exit [IP = 1]
+	bl	SYMBOL_NAME(syscall_trace)
+	b	ret_slow_syscall
+	
 
 #include "calls.S"
 
@@ -80,78 +95,98 @@
  *-----------------------------------------------------------------------------
  */
 
-/*
- * Create some aliases for some registers.  These should allow
- * us to have in theory up to 7 arguments to a function.
- */
-scno		.req	r9			@ syscall number
-tbl		.req	r8			@ syscall table pointer
-tip		.req	r7			@ temporary IP
-
-		.align	5
-vector_swi:	save_user_regs
-		mask_pc	lr, lr
-		zero_fp
-		ldr	scno, [lr, #-4]		@ get SWI instruction
-		arm700_bug_check scno, ip
+	/* If we're optimising for StrongARM the resulting code won't 
+	   run on an ARM7 and we can save a couple of instructions.  
+								--pb */
+#ifdef CONFIG_CPU_ARM710
+	.macro	arm710_bug_check, instr, temp
+	and	\temp, \instr, #0x0f000000	@ check for SWI
+	teq	\temp, #0x0f000000
+	bne	.Larm700bug
+	.endm
+
+.Larm700bug:
+	ldr	r0, [sp, #S_PSR]		@ Get calling cpsr
+	sub	lr, lr, #4
+	str	lr, [r8]
+	msr	spsr, r0
+	ldmia	sp, {r0 - lr}^			@ Get calling r0 - lr
+	mov	r0, r0
+	ldr	lr, [sp, #S_PC]			@ Get PC
+	add	sp, sp, #S_FRAME_SIZE
+	movs	pc, lr
+#else
+	.macro	arm710_bug_check, instr, temp
+	.endm
+#endif
+
+	.align	5
+ENTRY(vector_swi)
+	save_user_regs
+	mask_pc	lr, lr
+	zero_fp
+	ldr	scno, [lr, #-4]			@ get SWI instruction
+	arm710_bug_check scno, ip
+
 #ifdef CONFIG_ALIGNMENT_TRAP
-		ldr	ip, .LCswi
-		ldr	ip, [ip]
-		mcr	p15, 0, ip, c1, c0
+	ldr	ip, __cr_alignment
+	ldr	ip, [ip]
+	mcr	p15, 0, ip, c1, c0		@ update control register
 #endif
-		enable_irqs ip
+	enable_irqs ip
+
+	str	r4, [sp, #-S_OFF]!		@ push fifth arg
 
-		str	r4, [sp, #-S_OFF]!	@ push fifth arg
-		adrsvc	al, lr, fast_syscall_return
+	get_current_task tsk
+	ldr	ip, [tsk, #TSK_PTRACE]		@ check for syscall tracing
+	bic	scno, scno, #0xff000000		@ mask off SWI op-code
+	eor	scno, scno, #OS_NUMBER << 20	@ check OS number
+	adr	tbl, sys_call_table		@ load syscall table pointer
+	tst	ip, #PT_TRACESYS		@ are we tracing syscalls?
+	bne	__sys_trace
+
+	adrsvc	al, lr, ret_fast_syscall	@ return address
+	cmp	scno, #NR_syscalls		@ check upper syscall limit
+	ldrcc	pc, [tbl, scno, lsl #2]		@ call sys_* routine
+
+	add	r1, sp, #S_OFF
+2:	mov	why, #0				@ no longer a real syscall
+	cmp	scno, #ARMSWI_OFFSET
+	eor	r0, scno, #OS_NUMBER << 20	@ put OS number back
+	bcs	SYMBOL_NAME(arm_syscall)	
+	b	SYMBOL_NAME(sys_ni_syscall)	@ not private func
+
+	/*
+	 * This is the really slow path.  We're going to be doing
+	 * context switches, and waiting for our parent to respond.
+	 */
+__sys_trace:
+	add	r1, sp, #S_OFF
+	mov	r0, #0				@ trace entry [IP = 0]
+	bl	SYMBOL_NAME(syscall_trace)
+
+	adrsvc	al, lr, __sys_trace_return	@ return address
+	add	r1, sp, #S_R0 + S_OFF		@ pointer to regs
+	cmp	scno, #NR_syscalls		@ check upper syscall limit
+	ldmccia	r1, {r0 - r3}			@ have to reload r0 - r3
+	ldrcc	pc, [tbl, scno, lsl #2]		@ call sys_* routine
+	b	2b
+
+__sys_trace_return:
+	str	r0, [sp, #S_R0 + S_OFF]!	@ save returned r0
+	mov	r1, sp
+	mov	r0, #1				@ trace exit [IP = 1]
+	bl	SYMBOL_NAME(syscall_trace)
+	b	ret_slow_syscall
 
-		bic	scno, scno, #0xff000000	@ mask off SWI op-code
-		eor	scno, scno, #OS_NUMBER<<20	@ check OS number
-		cmp	scno, #NR_syscalls	@ check upper syscall limit
-		bcs	2f
-
-		get_current_task ip
-		ldr	ip, [ip, #TSK_PTRACE]	@ check for syscall tracing
-		adr	tbl, SYMBOL_NAME(sys_call_table)
-		tst	ip, #PT_TRACESYS
-		ldreq	pc, [tbl, scno, lsl #2]	@ call sys routine
-
-		ldr	tip, [sp, #S_IP + S_OFF]	@ save old IP
-		mov	ip, #0
-		str	ip, [sp, #S_IP + S_OFF]	@ trace entry [IP = 0]
-		bl	SYMBOL_NAME(syscall_trace)
-		str	tip, [sp, #S_IP + S_OFF]
-
-		add	ip, sp, #S_OFF
-		ldmia	ip, {r0 - r3}		@ have to reload r0 - r3
-		mov	lr, pc
-		ldr	pc, [tbl, scno, lsl #2]	@ call sys routine
-		str	r0, [sp, #S_R0 + S_OFF]	@ returned r0
-
-		mov	ip, #1
-		str	ip, [sp, #S_IP + S_OFF]	@ trace exit [IP = 1]
-		bl	SYMBOL_NAME(syscall_trace)
-		str	tip, [sp, #S_IP + S_OFF]
-		add	sp, sp, #S_OFF
-		b	ret_from_sys_call
-
-2:		add	r1, sp, #S_OFF
-		tst	scno, #0x00f00000	@ is it a Unix SWI?
-		bne	3f
-		subs	r0, scno, #(KSWI_SYS_BASE - KSWI_BASE)
-		bcs	SYMBOL_NAME(arm_syscall)
-		b	SYMBOL_NAME(sys_ni_syscall) @ not private func
-
-3:		eor	r0, scno, #OS_NUMBER <<20	@ Put OS number back
-		bl	SYMBOL_NAME(deferred)
-		add	sp, sp, #S_OFF
-		b	ret_from_sys_call
-
-		.align	5
-		.type	__irq_stat, #object
-__irq_stat:
-		.word	SYMBOL_NAME(irq_stat)
+	.align	5
+#ifdef CONFIG_ALIGNMENT_TRAP
+	.type	__cr_alignment, #object
+__cr_alignment:
+	.word	SYMBOL_NAME(cr_alignment)
+#endif
 
-		.type	sys_call_table, #object
+	.type	sys_call_table, #object
 ENTRY(sys_call_table)
 #include "calls.S"
 
@@ -164,7 +199,6 @@
 SYMBOL_NAME(sys_syscall):
 		eor	scno, r0, #OS_NUMBER << 20
 		cmp	scno, #NR_syscalls	@ check range
-		add	ip, sp, #S_OFF
 		stmleia	sp, {r5, r6}		@ shuffle args
 		movle	r0, r1
 		movle	r1, r2
@@ -225,8 +259,3 @@
 		str	r5, [sp, #4]
 		b	do_mmap2
 #endif
-
-		.data
-
-ENTRY(fp_enter)
-		.word	fpe_not_present
diff -u --recursive --new-file v2.4.8/linux/arch/arm/kernel/entry-header.S linux/arch/arm/kernel/entry-header.S
--- v2.4.8/linux/arch/arm/kernel/entry-header.S	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/kernel/entry-header.S	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,201 @@
+#include <linux/config.h> /* for CONFIG_ARCH_xxxx */
+#include <linux/linkage.h>
+
+#include <asm/assembler.h>
+#include <asm/constants.h>
+#include <asm/errno.h>
+#include <asm/hardware.h>
+#include <asm/arch/irqs.h>
+#include <asm/proc-fns.h>
+
+#ifndef MODE_SVC
+#define MODE_SVC 0x13
+#endif
+
+		.macro	zero_fp
+#ifndef CONFIG_NO_FRAME_POINTER
+		mov	fp, #0
+#endif
+		.endm
+
+		.text
+
+@ Bad Abort numbers
+@ -----------------
+@
+#define BAD_PREFETCH	0
+#define BAD_DATA	1
+#define BAD_ADDREXCPTN	2
+#define BAD_IRQ		3
+#define BAD_UNDEFINSTR	4
+
+#define PT_TRACESYS	0x00000002
+
+@ OS version number used in SWIs
+@  RISC OS is 0
+@  RISC iX is 8
+@
+#define OS_NUMBER	9
+#define ARMSWI_OFFSET	0x000f0000
+
+@
+@ Stack format (ensured by USER_* and SVC_*)
+@
+#define S_FRAME_SIZE	72
+#ifdef CONFIG_CPU_32
+#define S_OLD_R0	68
+#define S_PSR		64
+#else
+#define S_OLD_R0	64
+#define S_PSR		60
+#define S_PC		60
+#endif
+
+#define S_PC		60
+#define S_LR		56
+#define S_SP		52
+#define S_IP		48
+#define S_FP		44
+#define S_R10		40
+#define S_R9		36
+#define S_R8		32
+#define S_R7		28
+#define S_R6		24
+#define S_R5		20
+#define S_R4		16
+#define S_R3		12
+#define S_R2		8
+#define S_R1		4
+#define S_R0		0
+#define S_OFF		8
+
+#ifdef CONFIG_CPU_32
+		.macro	save_user_regs
+		sub	sp, sp, #S_FRAME_SIZE
+		stmia	sp, {r0 - r12}			@ Calling r0 - r12
+		add	r8, sp, #S_PC
+		stmdb	r8, {sp, lr}^			@ Calling sp, lr
+		mrs	r7, spsr
+		str	lr, [sp, #S_PC]			@ Save calling PC
+		str	r7, [sp, #S_PSR]		@ Save CPSR
+		str	r0, [sp, #S_OLD_R0]		@ Save OLD_R0
+		.endm
+
+		.macro	restore_user_regs
+		ldr	r0, [sp, #S_PSR]		@ Get calling cpsr
+		mov	ip, #I_BIT | MODE_SVC
+		msr	cpsr_c, ip			@ disable IRQs
+		msr	spsr, r0			@ save in spsr_svc
+		ldr	lr, [sp, #S_PC]			@ Get PC
+		ldmia	sp, {r0 - lr}^			@ Get calling r0 - lr
+		mov	r0, r0
+		add	sp, sp, #S_FRAME_SIZE
+		movs	pc, lr				@ return & move spsr_svc into cpsr
+		.endm
+
+		.macro	fast_restore_user_regs
+		mov	ip, #I_BIT | MODE_SVC
+		msr	cpsr_c, ip			@ disable IRQs
+		ldr	r1, [sp, #S_OFF + S_PSR]	@ get calling cpsr
+		ldr	lr, [sp, #S_OFF + S_PC]!	@ get pc
+ 		msr	spsr, r1			@ save in spsr_svc
+		ldmdb	sp, {r1 - lr}^			@ get calling r1 - lr
+		mov	r0, r0
+		add	sp, sp, #S_FRAME_SIZE - S_PC
+		movs	pc, lr				@ return & move spsr_svc into cpsr
+		.endm
+
+		.macro	mask_pc, rd, rm
+		.endm
+
+		.macro	enable_irqs, temp
+		mov	\temp, #MODE_SVC
+		msr	cpsr_c, \temp
+		.endm
+
+		.macro	get_current_task, rd
+		mov	\rd, sp, lsr #13
+		mov	\rd, \rd, lsl #13
+		.endm
+
+		/*
+		 * Like adr, but force SVC mode (if required)
+		 */
+		.macro	adrsvc, cond, reg, label
+		adr\cond	\reg, \label
+		.endm
+
+		.macro	alignment_trap, rbase, rtemp, sym
+#ifdef CONFIG_ALIGNMENT_TRAP
+#define OFF_CR_ALIGNMENT(x)	cr_alignment - x
+
+		ldr	\rtemp, [\rbase, #OFF_CR_ALIGNMENT(\sym)]
+		mcr	p15, 0, \rtemp, c1, c0
+#endif
+		.endm
+
+#else
+		.macro	save_user_regs
+		str	r0, [sp, #-4]!
+		str	lr, [sp, #-4]!
+		sub	sp, sp, #15*4
+		stmia	sp, {r0 - lr}^
+		mov	r0, r0
+		.endm
+
+		.macro	restore_user_regs
+		ldmia	sp, {r0 - lr}^
+		mov	r0, r0
+		ldr	lr, [sp, #15*4]
+		add	sp, sp, #15*4+8
+		movs	pc, lr
+		.endm
+
+		.macro	fast_restore_user_regs
+		add	sp, sp, #S_OFF
+		ldmib	sp, {r1 - lr}^
+		mov	r0, r0
+		ldr	lr, [sp, #15*4]
+		add	sp, sp, #15*4+8
+		movs	pc, lr
+		.endm
+
+		.macro	mask_pc, rd, rm
+		bic	\rd, \rm, #PCMASK
+		.endm
+
+		.macro	enable_irqs, temp
+		teqp	pc, #0x00000003
+		.endm
+
+		.macro	initialise_traps_extra
+		.endm
+
+		.macro	get_current_task, rd
+		mov	\rd, sp, lsr #13
+		mov	\rd, \rd, lsl #13
+		.endm
+
+		/*
+		 * Like adr, but force SVC mode (if required)
+		 */
+		.macro	adrsvc, cond, reg, label
+		adr\cond	\reg, \label
+		orr\cond	\reg, \reg, #0x08000003
+		.endm
+
+#endif
+
+/*
+ * These are the registers used in the syscall handler, and allow us to
+ * have in theory up to 7 arguments to a function.  Note that tbl == why
+ * is intentional.
+ *
+ * We must set at least "tsk" and "why" when calling ret_with_reschedule.
+ */
+scno	.req	r9				@ syscall number
+tbl	.req	r8				@ syscall table pointer
+why	.req	r8				@ Linux syscall (!= 0)
+tsk	.req	r7				@ current task
+
+
diff -u --recursive --new-file v2.4.8/linux/arch/arm/kernel/head-armv.S linux/arch/arm/kernel/head-armv.S
--- v2.4.8/linux/arch/arm/kernel/head-armv.S	Wed Jul 25 17:10:17 2001
+++ linux/arch/arm/kernel/head-armv.S	Sun Aug 12 17:36:24 2001
@@ -248,12 +248,12 @@
 		/*
 		 * Ensure that the first section of RAM is present.
 		 * we assume that:
-		 *  1. the RAM is aligned to a 256MB boundary
-		 *  2. the kernel is executing in the same 256MB chunk
+		 *  1. the RAM is aligned to a 32MB boundary
+		 *  2. the kernel is executing in the same 32MB chunk
 		 *     as the start of RAM.
 		 */
-		bic	r0, r0, #0x0ff00000 >> 18	@ round down
-		and	r2, r5, #0xf0000000		@ round down
+		bic	r0, r0, #0x01f00000 >> 18	@ round down
+		and	r2, r5, #0xfe000000		@ round down
 		add	r3, r8, r2			@ flags + rambase
 		str	r3, [r0]
 
diff -u --recursive --new-file v2.4.8/linux/arch/arm/kernel/irq-arch.c linux/arch/arm/kernel/irq-arch.c
--- v2.4.8/linux/arch/arm/kernel/irq-arch.c	Thu Apr 12 12:20:31 2001
+++ linux/arch/arm/kernel/irq-arch.c	Sun Aug 12 11:13:59 2001
@@ -17,7 +17,7 @@
 #include <linux/sched.h>
 #include <linux/ioport.h>
 #include <linux/interrupt.h>
-#include <linux/malloc.h>
+#include <linux/slab.h>
 #include <linux/random.h>
 #include <linux/smp.h>
 #include <linux/init.h>
diff -u --recursive --new-file v2.4.8/linux/arch/arm/kernel/oldlatches.c linux/arch/arm/kernel/oldlatches.c
--- v2.4.8/linux/arch/arm/kernel/oldlatches.c	Wed Jul 25 17:10:17 2001
+++ linux/arch/arm/kernel/oldlatches.c	Sun Aug 12 11:13:59 2001
@@ -27,11 +27,14 @@
 void oldlatch_aupdate(unsigned char mask,unsigned char newdata)
 {
 	if (machine_is_archimedes()) {
+		unsigned long flags;
+
+		local_save_flags(flags);
 		latch_a_copy = (latch_a_copy & ~mask) | newdata;
+		__raw_writeb(latch_a_copy, LATCHA_BASE);
+		local_restore_flags(flags);
 
 		printk("Latch: A = 0x%02x\n", latch_a_copy);
-
-		__raw_writeb(latch_a_copy, LATCHA_BASE);
 	} else
 		BUG();
 }
@@ -41,11 +44,14 @@
 void oldlatch_bupdate(unsigned char mask,unsigned char newdata)
 {
 	if (machine_is_archimedes()) {
+		unsigned long flags;
+
+		local_save_flags(flags);
 		latch_b_copy = (latch_b_copy & ~mask) | newdata;
+		__raw_writeb(latch_b_copy, LATCHB_BASE);
+		local_restore_flags(flags);
 
 		printk("Latch: B = 0x%02x\n", latch_b_copy);
-
-		__raw_writeb(latch_b_copy, LATCHB_BASE);
 	} else
 		BUG();
 }
diff -u --recursive --new-file v2.4.8/linux/arch/arm/kernel/process.c linux/arch/arm/kernel/process.c
--- v2.4.8/linux/arch/arm/kernel/process.c	Fri Feb  9 11:29:44 2001
+++ linux/arch/arm/kernel/process.c	Sun Aug 12 17:36:24 2001
@@ -21,6 +21,7 @@
 #include <linux/user.h>
 #include <linux/delay.h>
 #include <linux/reboot.h>
+#include <linux/interrupt.h>
 #include <linux/init.h>
 
 #include <asm/system.h>
@@ -39,8 +40,6 @@
 extern const char *processor_modes[];
 extern void setup_mm_for_reboot(char mode);
 
-asmlinkage void ret_from_sys_call(void) __asm__("ret_from_sys_call");
-
 static volatile int hlt_counter;
 
 #include <asm/arch/system.h>
@@ -125,7 +124,7 @@
 		pm_power_off();
 }
 
-void machine_restart(char * __unused)
+void machine_restart(void * __unused)
 {
 	/*
 	 * Clean and disable cache, and turn off interrupts
@@ -296,6 +295,8 @@
 {
 }
 
+asmlinkage void ret_from_fork(void) __asm__("ret_from_fork");
+
 int copy_thread(int nr, unsigned long clone_flags, unsigned long esp,
 	unsigned long unused,
 	struct task_struct * p, struct pt_regs * regs)
@@ -311,7 +312,9 @@
 	childregs->ARM_sp = esp;
 
 	save = ((struct context_save_struct *)(childregs)) - 1;
-	init_thread_css(save);
+	*save = INIT_CSS;
+	save->pc |= (unsigned long)ret_from_fork;
+
 	p->thread.save = save;
 
 	return 0;
diff -u --recursive --new-file v2.4.8/linux/arch/arm/kernel/ptrace.c linux/arch/arm/kernel/ptrace.c
--- v2.4.8/linux/arch/arm/kernel/ptrace.c	Wed Jul 25 17:10:17 2001
+++ linux/arch/arm/kernel/ptrace.c	Sun Aug 12 11:13:59 2001
@@ -112,7 +112,7 @@
 
 	val = get_stack_long(child, reg);
 	if (reg == 15)
-		val = pc_pointer(val);
+		val = pc_pointer(val + 8);
 
 	return val;
 }
@@ -319,17 +319,19 @@
 			dbg->nsaved += 1;
 		}
 	} else
-		printk(KERN_DEBUG "add_breakpoint: too many breakpoints\n");
+		printk(KERN_ERR "ptrace: too many breakpoints\n");
 
 	return res;
 }
 
 int ptrace_set_bpt(struct task_struct *child)
 {
-	unsigned long insn, pc;
+	struct pt_regs *regs;
+	unsigned long pc, insn;
 	int res;
 
-	pc = pc_pointer(get_stack_long(child, REG_PC));
+	regs = get_user_regs(child);
+	pc = instruction_pointer(regs);
 
 	res = read_tsk_long(child, pc, &insn);
 	if (!res) {
@@ -342,7 +344,16 @@
 		if (alt)
 			res = add_breakpoint(child, dbg, alt);
 
-		if (!res && (!alt || predicate(insn) != PREDICATE_ALWAYS))
+		/*
+		 * Note that we ignore the result of setting the above
+		 * breakpoint since it may fail.  When it does, this is
+		 * not so much an error, but a forewarning that we may
+		 * be receiving a prefetch abort shortly.
+		 *
+		 * If we don't set this breakpoint here, then we can
+		 * loose control of the thread during single stepping.
+		 */
+		if (!alt || predicate(insn) != PREDICATE_ALWAYS)
 			res = add_breakpoint(child, dbg, pc + 4);
 	}
 
@@ -369,9 +380,9 @@
 		unsigned long tmp;
 
 		read_tsk_long(child, dbg->bp[i].address, &tmp);
+		write_tsk_long(child, dbg->bp[i].address, dbg->bp[i].insn);
 		if (tmp != BREAKINST)
 			printk(KERN_ERR "ptrace_cancel_bpt: weirdness\n");
-		write_tsk_long(child, dbg->bp[i].address, dbg->bp[i].insn);
 	}
 }
 
@@ -614,12 +625,25 @@
 	return ret;
 }
 
-asmlinkage void syscall_trace(void)
+asmlinkage void syscall_trace(int why, struct pt_regs *regs)
 {
+	unsigned long ip;
+
 	if ((current->ptrace & (PT_PTRACED|PT_TRACESYS))
 			!= (PT_PTRACED|PT_TRACESYS))
 		return;
-	current->exit_code = SIGTRAP;
+
+	/*
+	 * Save IP.  IP is used to denote syscall entry/exit:
+	 *  IP = 0 -> entry, = 1 -> exit
+	 */
+	ip = regs->ARM_ip;
+	regs->ARM_ip = why;
+
+	/* the 0x80 provides a way for the tracing parent to distinguish
+	   between a syscall stop and SIGTRAP delivery */
+	current->exit_code = SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD)
+					? 0x80 : 0);
 	current->state = TASK_STOPPED;
 	notify_parent(current, SIGCHLD);
 	schedule();
@@ -632,4 +656,5 @@
 		send_sig(current->exit_code, current, 1);
 		current->exit_code = 0;
 	}
+	regs->ARM_ip = ip;
 }
diff -u --recursive --new-file v2.4.8/linux/arch/arm/kernel/setup.c linux/arch/arm/kernel/setup.c
--- v2.4.8/linux/arch/arm/kernel/setup.c	Wed May 16 15:25:16 2001
+++ linux/arch/arm/kernel/setup.c	Sun Aug 12 11:13:59 2001
@@ -48,7 +48,9 @@
 __setup("fpe=", fpe_setup);
 #endif
 
+extern unsigned int mem_fclk_21285;
 extern void paging_init(struct meminfo *, struct machine_desc *desc);
+extern void convert_to_tag_list(struct param_struct *params, int mem_init);
 extern void bootmem_init(struct meminfo *);
 extern void reboot_setup(char *str);
 extern int root_mountflags;
@@ -60,24 +62,12 @@
 unsigned int system_rev;
 unsigned int system_serial_low;
 unsigned int system_serial_high;
-unsigned int mem_fclk_21285 = 50000000;
 unsigned int elf_hwcap;
 
 #ifdef MULTI_CPU
 struct processor processor;
 #endif
 
-struct drive_info_struct { char dummy[32]; } drive_info;
-
-struct screen_info screen_info = {
- orig_video_lines:	30,
- orig_video_cols:	80,
- orig_video_mode:	0,
- orig_video_ega_bx:	0,
- orig_video_isVGA:	1,
- orig_video_points:	8
-};
-
 unsigned char aux_device_present;
 char elf_platform[ELF_PLATFORM_SIZE];
 char saved_command_line[COMMAND_LINE_SIZE];
@@ -222,7 +212,7 @@
 
 			mi->bank[mi->nr_banks].start = start;
 			mi->bank[mi->nr_banks].size  = size;
-			mi->bank[mi->nr_banks].node  = 0;
+			mi->bank[mi->nr_banks].node  = PHYS_TO_NID(start);
 			mi->nr_banks += 1;
 		}
 		c = *from++;
@@ -286,8 +276,8 @@
 
 		res = alloc_bootmem_low(sizeof(*res));
 		res->name  = "System RAM";
-		res->start = __virt_to_bus(virt_start);
-		res->end   = __virt_to_bus(virt_end);
+		res->start = __virt_to_phys(virt_start);
+		res->end   = __virt_to_phys(virt_end);
 		res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
 
 		request_resource(&iomem_resource, res);
@@ -330,12 +320,16 @@
  */
 static int __init parse_tag_core(const struct tag *tag)
 {
-	if ((tag->u.core.flags & 1) == 0)
-		root_mountflags &= ~MS_RDONLY;
-	ROOT_DEV = to_kdev_t(tag->u.core.rootdev);
+	if (tag->hdr.size > 2) {
+		if ((tag->u.core.flags & 1) == 0)
+			root_mountflags &= ~MS_RDONLY;
+		ROOT_DEV = to_kdev_t(tag->u.core.rootdev);
+	}
 	return 0;
 }
 
+__tagtable(ATAG_CORE, parse_tag_core);
+
 static int __init parse_tag_mem32(const struct tag *tag)
 {
 	if (meminfo.nr_banks >= NR_BANKS) {
@@ -346,12 +340,24 @@
 	}
 	meminfo.bank[meminfo.nr_banks].start = tag->u.mem.start;
 	meminfo.bank[meminfo.nr_banks].size  = tag->u.mem.size;
-	meminfo.bank[meminfo.nr_banks].node  = 0;
+	meminfo.bank[meminfo.nr_banks].node  = PHYS_TO_NID(tag->u.mem.start);
 	meminfo.nr_banks += 1;
 
 	return 0;
 }
 
+__tagtable(ATAG_MEM, parse_tag_mem32);
+
+#if defined(CONFIG_VGA_CONSOLE) || defined(CONFIG_DUMMY_CONSOLE)
+struct screen_info screen_info = {
+ orig_video_lines:	30,
+ orig_video_cols:	80,
+ orig_video_mode:	0,
+ orig_video_ega_bx:	0,
+ orig_video_isVGA:	1,
+ orig_video_points:	8
+};
+
 static int __init parse_tag_videotext(const struct tag *tag)
 {
 	screen_info.orig_x            = tag->u.videotext.x;
@@ -366,6 +372,9 @@
 	return 0;
 }
 
+__tagtable(ATAG_VIDEOTEXT, parse_tag_videotext);
+#endif
+
 static int __init parse_tag_ramdisk(const struct tag *tag)
 {
 	setup_ramdisk((tag->u.ramdisk.flags & 1) == 0,
@@ -374,12 +383,16 @@
 	return 0;
 }
 
+__tagtable(ATAG_RAMDISK, parse_tag_ramdisk);
+
 static int __init parse_tag_initrd(const struct tag *tag)
 {
 	setup_initrd(tag->u.initrd.start, tag->u.initrd.size);
 	return 0;
 }
 
+__tagtable(ATAG_INITRD, parse_tag_initrd);
+
 static int __init parse_tag_serialnr(const struct tag *tag)
 {
 	system_serial_low = tag->u.serialnr.low;
@@ -387,12 +400,16 @@
 	return 0;
 }
 
+__tagtable(ATAG_SERIAL, parse_tag_serialnr);
+
 static int __init parse_tag_revision(const struct tag *tag)
 {
 	system_rev = tag->u.revision.rev;
 	return 0;
 }
 
+__tagtable(ATAG_REVISION, parse_tag_revision);
+
 static int __init parse_tag_cmdline(const struct tag *tag)
 {
 	strncpy(default_command_line, tag->u.cmdline.cmdline, COMMAND_LINE_SIZE);
@@ -400,101 +417,43 @@
 	return 0;
 }
 
-/*
- * This is the core tag table; these are the tags
- * that we recognise for any machine type.
- */
-static const struct tagtable core_tagtable[] __init = {
-	{ ATAG_CORE,      parse_tag_core      },
-	{ ATAG_MEM,       parse_tag_mem32     },
-	{ ATAG_VIDEOTEXT, parse_tag_videotext },
-	{ ATAG_RAMDISK,   parse_tag_ramdisk   },
-	{ ATAG_INITRD,    parse_tag_initrd    },
-	{ ATAG_SERIAL,    parse_tag_serialnr  },
-	{ ATAG_REVISION,  parse_tag_revision  },
-	{ ATAG_CMDLINE,   parse_tag_cmdline   }
-};
+__tagtable(ATAG_CMDLINE, parse_tag_cmdline);
 
 /*
- * Scan one tag table for this tag, and call its parse function.
+ * Scan the tag table for this tag, and call its parse function.
+ * The tag table is built by the linker from all the __tagtable
+ * declarations.
  */
-static int __init
-parse_tag(const struct tagtable *tbl, int size, const struct tag *t)
+static int __init parse_tag(const struct tag *tag)
 {
-	int i;
+	extern struct tagtable __tagtable_begin, __tagtable_end;
+	struct tagtable *t;
 
-	for (i = 0; i < size; i++, tbl++)
-		if (t->hdr.tag == tbl->tag) {
-			tbl->parse(t);
+	for (t = &__tagtable_begin; t < &__tagtable_end; t++)
+		if (tag->hdr.tag == t->tag) {
+			t->parse(tag);
 			break;
 		}
 
-	return i < size;
+	return t < &__tagtable_end;
 }
 
 /*
  * Parse all tags in the list, checking both the global and architecture
  * specific tag tables.
  */
-static void __init
-parse_tags(const struct tagtable *tbl, int size, const struct tag *t)
+static void __init parse_tags(const struct tag *t)
 {
-	/*
-	 * The tag list is terminated with a zero-sized tag.  Size is
-	 * defined to be in units of 32-bit quantities.
-	 */
-	for (; t->hdr.size; t = (struct tag *)((u32 *)t + t->hdr.size)) {
-		if (parse_tag(core_tagtable, ARRAY_SIZE(core_tagtable), t))
-			continue;
-
-		if (tbl && parse_tag(tbl, size, t))
-			continue;
-
-		printk(KERN_WARNING
-		       "Ignoring unrecognised tag 0x%08x\n", t->hdr.tag);
-	}
-}
-
-static void __init parse_params(struct param_struct *params)
-{
-	if (params->u1.s.page_size != PAGE_SIZE) {
-		printk(KERN_WARNING "Warning: bad configuration page, "
-		       "trying to continue\n");
-		return;
-	}
-
-	ROOT_DEV	   = to_kdev_t(params->u1.s.rootdev);
-	system_rev	   = params->u1.s.system_rev;
-	system_serial_low  = params->u1.s.system_serial_low;
-	system_serial_high = params->u1.s.system_serial_high;
-
-	if (params->u1.s.mem_fclk_21285 > 0)
-		mem_fclk_21285 = params->u1.s.mem_fclk_21285;  
-
-	setup_ramdisk((params->u1.s.flags & FLAG_RDLOAD) == 0,
-		      (params->u1.s.flags & FLAG_RDPROMPT) == 0,
-		      params->u1.s.rd_start,
-		      params->u1.s.ramdisk_size);
-
-	setup_initrd(params->u1.s.initrd_start,
-		     params->u1.s.initrd_size);
-
-	if (!(params->u1.s.flags & FLAG_READONLY))
-		root_mountflags &= ~MS_RDONLY;
-
-	strncpy(default_command_line, params->commandline, COMMAND_LINE_SIZE);
-	default_command_line[COMMAND_LINE_SIZE - 1] = '\0';
-
-	if (meminfo.nr_banks == 0) {
-		meminfo.nr_banks      = 1;
-		meminfo.bank[0].start = PHYS_OFFSET;
-		meminfo.bank[0].size  = params->u1.s.nr_pages << PAGE_SHIFT;
-	}
+	for (; t->hdr.size; t = tag_next(t))
+		if (!parse_tag(t))
+			printk(KERN_WARNING
+				"Ignoring unrecognised tag 0x%08x\n",
+				t->hdr.tag);
 }
 
 void __init setup_arch(char **cmdline_p)
 {
-	struct param_struct *params = NULL;
+	struct tag *tags = NULL;
 	struct machine_desc *mdesc;
 	char *from = default_command_line;
 
@@ -508,27 +467,26 @@
 		reboot_setup("s");
 
 	if (mdesc->param_offset)
-		params = phys_to_virt(mdesc->param_offset);
+		tags = phys_to_virt(mdesc->param_offset);
 
 	/*
 	 * Do the machine-specific fixups before we parse the
 	 * parameters or tags.
 	 */
 	if (mdesc->fixup)
-		mdesc->fixup(mdesc, params, &from, &meminfo);
+		mdesc->fixup(mdesc, (struct param_struct *)tags,
+			     &from, &meminfo);
 
-	if (params) {
-		struct tag *tag = (struct tag *)params;
+	/*
+	 * If we have the old style parameters, convert them to
+	 * a tag list before.
+	 */
+	if (tags && tags->hdr.tag != ATAG_CORE)
+		convert_to_tag_list((struct param_struct *)tags,
+				    meminfo.nr_banks == 0);
 
-		/*
-		 * Is the first tag the CORE tag?  This differentiates
-		 * between the tag list and the parameter table.
-		 */
-		if (tag->hdr.tag == ATAG_CORE)
-			parse_tags(mdesc->tagtable, mdesc->tagsize, tag);
-		else
-			parse_params(params);
-	}
+	if (tags && tags->hdr.tag == ATAG_CORE)
+		parse_tags(tags);
 
 	if (meminfo.nr_banks == 0) {
 		meminfo.nr_banks      = 1;
diff -u --recursive --new-file v2.4.8/linux/arch/arm/kernel/signal.c linux/arch/arm/kernel/signal.c
--- v2.4.8/linux/arch/arm/kernel/signal.c	Wed Jan 24 15:21:50 2001
+++ linux/arch/arm/kernel/signal.c	Sun Aug 12 11:13:59 2001
@@ -327,16 +327,15 @@
 	/*
 	 * This is the X/Open sanctioned signal stack switching.
 	 */
-	if ((ka->sa.sa_flags & SA_ONSTACK) && ! on_sig_stack(sp))
+	if ((ka->sa.sa_flags & SA_ONSTACK) && sas_ss_flags(sp))
 		sp = current->sas_ss_sp + current->sas_ss_size;
 
 	/*
 	 * No matter what happens, 'sp' must be word
 	 * aligned otherwise nasty things could happen
 	 */
-	sp &= ~3;
-
-	return (void *)(sp - framesize);
+	/* ATPCS B01 mandates 8-byte alignment */
+	return (void *)((sp - framesize) & ~7);
 }
 
 static void setup_frame(int sig, struct k_sigaction *ka,
@@ -364,7 +363,7 @@
 		retcode = (unsigned long)ka->sa.sa_restorer;
 	} else {
 		retcode = (unsigned long)&frame->retcode;
-		err |= __put_user(SWI_SYS_SIGRETURN, &frame->retcode);
+		__put_user_error(SWI_SYS_SIGRETURN, &frame->retcode, err);
 		flush_icache_range(retcode, retcode + 4);
 	}
 
@@ -404,8 +403,8 @@
 	if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
 		goto segv_and_exit;
 
-	err |= __put_user(&frame->info, &frame->pinfo);
-	err |= __put_user(&frame->uc, &frame->puc);
+	__put_user_error(&frame->info, &frame->pinfo, err);
+	__put_user_error(&frame->uc, &frame->puc, err);
 	err |= copy_siginfo_to_user(&frame->info, info);
 
 	/* Clear all the bits of the ucontext we don't use.  */
@@ -421,7 +420,7 @@
 		retcode = (unsigned long)ka->sa.sa_restorer;
 	} else {
 		retcode = (unsigned long)&frame->retcode;
-		err |= __put_user(SWI_SYS_RT_SIGRETURN, &frame->retcode);
+		__put_user_error(SWI_SYS_RT_SIGRETURN, &frame->retcode, err);
 		flush_icache_range(retcode, retcode + 4);
 	}
 
@@ -432,6 +431,15 @@
 		regs->ARM_r0 = current->exec_domain->signal_invmap[sig];
 	else
 		regs->ARM_r0 = sig;
+
+	/*
+	 * For realtime signals we must also set the second and third
+	 * arguments for the signal handler.
+	 *   -- Peter Maydell <pmaydell@chiark.greenend.org.uk> 2000-12-06
+	 */
+	regs->ARM_r1 = (unsigned long)frame->pinfo;
+	regs->ARM_r2 = (unsigned long)frame->puc;
+
 	regs->ARM_sp = (unsigned long)frame;
 	regs->ARM_lr = retcode;
 	regs->ARM_pc = (unsigned long)ka->sa.sa_handler;
diff -u --recursive --new-file v2.4.8/linux/arch/arm/kernel/traps.c linux/arch/arm/kernel/traps.c
--- v2.4.8/linux/arch/arm/kernel/traps.c	Tue Jul  3 17:08:18 2001
+++ linux/arch/arm/kernel/traps.c	Sun Aug 12 11:13:59 2001
@@ -208,9 +208,16 @@
 
 asmlinkage void do_undefinstr(int address, struct pt_regs *regs, int mode)
 {
-	unsigned long addr = instruction_pointer(regs);
+	unsigned long addr;
 	siginfo_t info;
 
+	/*
+	 * According to the ARM ARM, PC is 2 or 4 bytes ahead, depending
+	 * whether we're in Thumb mode or not.
+	 */
+	regs->ARM_pc -= thumb_mode(regs) ? 2 : 4;
+	addr = instruction_pointer(regs);
+
 #ifdef CONFIG_DEBUG_USER
 	printk(KERN_INFO "%s (%d): undefined instruction: pc=%08lx\n",
 		current->comm, current->pid, addr);
@@ -230,6 +237,7 @@
 	die_if_kernel("Oops - undefined instruction", regs, mode);
 }
 
+#ifdef CONFIG_CPU_26
 asmlinkage void do_excpt(int address, struct pt_regs *regs, int mode)
 {
 	siginfo_t info;
@@ -252,6 +260,7 @@
 
 	die_if_kernel("Oops - address exception", regs, mode);
 }
+#endif
 
 asmlinkage void do_unexp_fiq (struct pt_regs *regs)
 {
@@ -269,33 +278,84 @@
  */
 asmlinkage void bad_mode(struct pt_regs *regs, int reason, int proc_mode)
 {
+	unsigned int vectors = vectors_base();
+	mm_segment_t fs;
+
 	console_verbose();
 
 	printk(KERN_CRIT "Bad mode in %s handler detected: mode %s\n",
 		handler[reason], processor_modes[proc_mode]);
 
 	/*
+	 * We need to switch to kernel mode so that we can
+	 * use __get_user to safely read from kernel space.
+	 * Note that we now dump the code first, just in case
+	 * the backtrace kills us.
+	 */
+	fs = get_fs();
+	set_fs(KERNEL_DS);
+
+	/*
 	 * Dump out the vectors and stub routines.  Maybe a better solution
 	 * would be to dump them out only if we detect that they are corrupted.
 	 */
 	printk(KERN_CRIT "Vectors:\n");
-	dump_mem(0, 0x40);
+	dump_mem(vectors, 0x40);
 	printk(KERN_CRIT "Stubs:\n");
-	dump_mem(0x200, 0x4b8);
+	dump_mem(vectors + 0x200, 0x4b8);
+
+	set_fs(fs);
 
 	die("Oops", regs, 0);
 	cli();
 	panic("bad mode");
 }
 
+static int bad_syscall(int n, struct pt_regs *regs)
+{
+	siginfo_t info;
+
+	/* You might think just testing `handler' would be enough, but PER_LINUX
+	 * points it to no_lcall7 to catch undercover SVr4 binaries.  Gutted.
+	 */
+	if (current->personality != PER_LINUX && current->exec_domain->handler) {
+		/* Hand it off to iBCS.  The extra parameter and consequent type 
+		 * forcing is necessary because of the weird ARM calling convention.
+		 */
+		current->exec_domain->handler(n, regs);
+		return regs->ARM_r0;
+	}
+
+#ifdef CONFIG_DEBUG_USER
+	printk(KERN_ERR "[%d] %s: obsolete system call %08x.\n",
+		current->pid, current->comm, n);
+	dump_instr(regs);
+#endif
+
+	info.si_signo = SIGILL;
+	info.si_errno = 0;
+	info.si_code  = ILL_ILLTRP;
+	info.si_addr  = (void *)instruction_pointer(regs) -
+			 (thumb_mode(regs) ? 2 : 4);
+
+	force_sig_info(SIGILL, &info, current);
+	die_if_kernel("Oops", regs, n);
+	return regs->ARM_r0;
+}
+
 /*
- * Handle some more esoteric system calls
+ * Handle all unrecognised system calls.
+ *  0x9f0000 - 0x9fffff are some more esoteric system calls
  */
+#define NR(x) ((__ARM_NR_##x) - __ARM_NR_BASE)
 asmlinkage int arm_syscall(int no, struct pt_regs *regs)
 {
 	siginfo_t info;
 
-	switch (no) {
+	if ((no >> 16) != 0x9f)
+		return bad_syscall(no, regs);
+
+	switch (no & 0xffff) {
 	case 0: /* branch through 0 */
 		info.si_signo = SIGSEGV;
 		info.si_errno = 0;
@@ -305,9 +365,9 @@
 		force_sig_info(SIGSEGV, &info, current);
 
 		die_if_kernel("branch through zero", regs, 0);
-		break;
+		return 0;
 
-	case 1: /* SWI BREAK_POINT */
+	case NR(breakpoint): /* SWI BREAK_POINT */
 		/*
 		 * The PC is always left pointing at the next
 		 * instruction.  Fix this.
@@ -318,17 +378,50 @@
 		info.si_signo = SIGTRAP;
 		info.si_errno = 0;
 		info.si_code  = TRAP_BRKPT;
-		info.si_addr  = (void *)instruction_pointer(regs);
+		info.si_addr  = (void *)instruction_pointer(regs) -
+				 (thumb_mode(regs) ? 2 : 4);
 
 		force_sig_info(SIGTRAP, &info, current);
 		return regs->ARM_r0;
 
-	case 2:	/* sys_cacheflush */
 #ifdef CONFIG_CPU_32
-		/* r0 = start, r1 = end, r2 = flags */
+	/*
+	 * Flush a region from virtual address 'r0' to virtual address 'r1'
+	 * _inclusive_.  There is no alignment requirement on either address;
+	 * user space does not need to know the hardware cache layout.
+	 *
+	 * r2 contains flags.  It should ALWAYS be passed as ZERO until it
+	 * is defined to be something else.  For now we ignore it, but may
+	 * the fires of hell burn in your belly if you break this rule. ;)
+	 *
+	 * (at a later date, we may want to allow this call to not flush
+	 * various aspects of the cache.  Passing '0' will guarantee that
+	 * everything necessary gets flushed to maintain consistency in
+	 * the specified region).
+	 */
+	case NR(cacheflush):
 		cpu_cache_clean_invalidate_range(regs->ARM_r0, regs->ARM_r1, 1);
-#endif
+		return 0;
+
+	case NR(usr26):
+		if (!(elf_hwcap & HWCAP_26BIT))
+			break;
+		regs->ARM_cpsr &= ~0x10;
+		return regs->ARM_r0;
+
+	case NR(usr32):
+		if (!(elf_hwcap & HWCAP_26BIT))
+			break;
+		regs->ARM_cpsr |= 0x10;
+		return regs->ARM_r0;
+#else
+	case NR(cacheflush):
+		return 0;
+
+	case NR(usr26):
+	case NR(usr32):
 		break;
+#endif
 
 	default:
 		/* Calls 9f00xx..9f07ff are defined to return -ENOSYS
@@ -337,45 +430,29 @@
 		   a feature is supported.  */
 		if (no <= 0x7ff)
 			return -ENOSYS;
-#ifdef CONFIG_DEBUG_USER
-		/* experience shows that these seem to indicate that
-		 * something catastrophic has happened
-		 */
-		printk("[%d] %s: arm syscall %d\n", current->pid, current->comm, no);
-		dump_instr(regs);
-		if (user_mode(regs)) {
-			show_regs(regs);
-			c_backtrace(regs->ARM_fp, processor_mode(regs));
-		}
-#endif
-		force_sig(SIGILL, current);
-		die_if_kernel("Oops", regs, no);
 		break;
 	}
-	return 0;
-}
-
-asmlinkage void deferred(int n, struct pt_regs *regs)
-{
-	/* You might think just testing `handler' would be enough, but PER_LINUX
-	 * points it to no_lcall7 to catch undercover SVr4 binaries.  Gutted.
-	 */
-	if (current->personality != PER_LINUX && current->exec_domain->handler) {
-		/* Hand it off to iBCS.  The extra parameter and consequent type 
-		 * forcing is necessary because of the weird ARM calling convention.
-		 */
-		void (*handler)(int nr, struct pt_regs *regs) = (void *)current->exec_domain->handler;
-		(*handler)(n, regs);
-		return;
-	}
-
 #ifdef CONFIG_DEBUG_USER
-	printk(KERN_ERR "[%d] %s: obsolete system call %08x.\n",
-		current->pid, current->comm, n);
+	/*
+	 * experience shows that these seem to indicate that
+	 * something catastrophic has happened
+	 */
+	printk("[%d] %s: arm syscall %d\n", current->pid, current->comm, no);
 	dump_instr(regs);
+	if (user_mode(regs)) {
+		show_regs(regs);
+		c_backtrace(regs->ARM_fp, processor_mode(regs));
+	}
 #endif
-	force_sig(SIGILL, current);
-	die_if_kernel("Oops", regs, n);
+	info.si_signo = SIGILL;
+	info.si_errno = 0;
+	info.si_code  = ILL_ILLTRP;
+	info.si_addr  = (void *)instruction_pointer(regs) -
+			 (thumb_mode(regs) ? 2 : 4);
+
+	force_sig_info(SIGILL, &info, current);
+	die_if_kernel("Oops", regs, no);
+	return 0;
 }
 
 void __bad_xchg(volatile void *ptr, int size)
@@ -466,7 +543,7 @@
 
 	__trap_init((void *)vectors_base());
 	if (vectors_base() != 0)
-		printk("Relocating machine vectors to 0x%08x\n",
+		printk(KERN_DEBUG "Relocating machine vectors to 0x%08x\n",
 			vectors_base());
 #ifdef CONFIG_CPU_32
 	modify_domain(DOMAIN_USER, DOMAIN_CLIENT);
diff -u --recursive --new-file v2.4.8/linux/arch/arm/kernel/via82c505.c linux/arch/arm/kernel/via82c505.c
--- v2.4.8/linux/arch/arm/kernel/via82c505.c	Thu Apr 12 12:20:31 2001
+++ linux/arch/arm/kernel/via82c505.c	Sun Aug 12 11:13:59 2001
@@ -152,11 +152,8 @@
 };
 #endif
 
-void __init via82c505_init(struct arm_pci_sysdata *sysdata)
+void __init via82c505_init(void *sysdata)
 {
-	unsigned int pci_cmd = PCI_COMMAND_IO | PCI_COMMAND_MEMORY |
-				PCI_COMMAND_MASTER | PCI_COMMAND_INVALIDATE;
-	struct pci_dev *dev;
 	struct pci_bus *bus;
 
 	printk(KERN_DEBUG "PCI: VIA 82c505\n");
@@ -170,11 +167,6 @@
 	outb(0xd0,0xA9);
 
 	pci_scan_bus(0, &via82c505_ops, sysdata);
-
-	pci_cmd |= sysdata->bus[0].features;
-
-	printk("PCI: Fast back to back transfers %sabled\n",
-	       (sysdata->bus[0].features & PCI_COMMAND_FAST_BACK) ? "en" : "dis");
 
 #ifdef CONFIG_ARCH_SHARK
 	/* 
diff -u --recursive --new-file v2.4.8/linux/arch/arm/lib/Makefile linux/arch/arm/lib/Makefile
--- v2.4.8/linux/arch/arm/lib/Makefile	Wed May 16 15:25:16 2001
+++ linux/arch/arm/lib/Makefile	Sun Aug 12 11:13:59 2001
@@ -20,13 +20,8 @@
 obj-arc		:= ecard.o io-acorn.o floppydma.o
 obj-rpc		:= ecard.o io-acorn.o floppydma.o
 obj-clps7500	:= io-acorn.o
-obj-footbridge	:= io-pcio.o
 obj-l7200     	:= io-acorn.o
-obj-nexuspci	:= io-pcio.o
-obj-sa1100	:= io-pcio.o
 obj-shark	:= io-shark.o
-obj-integrator	:= io-pcio.o
-obj-clps711x	:= io-shark.o
 
 obj-y		+= $(obj-$(MACHINE))
 
diff -u --recursive --new-file v2.4.8/linux/arch/arm/lib/io-acorn.S linux/arch/arm/lib/io-acorn.S
--- v2.4.8/linux/arch/arm/lib/io-acorn.S	Thu Feb  8 16:32:44 2001
+++ linux/arch/arm/lib/io-acorn.S	Sun Aug 12 11:13:59 2001
@@ -62,13 +62,13 @@
 ENTRY(insw)
 		addr	r0
 		teq	r2, #0
-		bne	__arch_readsw
+		bne	__raw_readsw
 		RETINSTR(mov, pc, lr)
 
 ENTRY(insb)
 		addr	r0
 		teq	r2, #0
-		bne	__arch_readsb
+		bne	__raw_readsb
 		RETINSTR(mov, pc, lr)
 
 @ Purpose: write a block of data from memory to a hardware register.
@@ -78,13 +78,13 @@
 ENTRY(outsw)
 		addr	r0
 		teq	r2, #0
-		bne	__arch_writesw
+		bne	__raw_writesw
 		RETINSTR(mov, pc, lr)
 
 ENTRY(outsb)
 		addr	r0
 		teq	r2, #0
-		bne	__arch_writesb
+		bne	__raw_writesb
 		RETINSTR(mov, pc, lr)
 
 @ Purpose: write a memc register
diff -u --recursive --new-file v2.4.8/linux/arch/arm/lib/io-pcio.S linux/arch/arm/lib/io-pcio.S
--- v2.4.8/linux/arch/arm/lib/io-pcio.S	Thu Feb  8 16:32:44 2001
+++ linux/arch/arm/lib/io-pcio.S	Wed Dec 31 16:00:00 1969
@@ -1,50 +0,0 @@
-#include <linux/linkage.h>
-#include <asm/assembler.h>
-#include <asm/hardware.h>
-
-		.equ	pcio_high, PCIO_BASE & 0xff000000
-		.equ	pcio_low,  PCIO_BASE & 0x00ffffff
-
-		.macro	ioaddr, rd,rn
-		add	\rd, \rn, #pcio_high
-		.if	pcio_low
-		add	\rd, \rd, #pcio_low
-		.endif
-		.endm
-
-ENTRY(insl)
-		ioaddr	r0, r0
-		teq	r2, #0
-		bne	__arch_readsl
-		RETINSTR(mov, pc, lr)
-
-ENTRY(outsl)
-		ioaddr	r0, r0
-		teq	r2, #0
-		bne	__arch_writesl
-		RETINSTR(mov, pc, lr)
-
-ENTRY(outsw)
-		ioaddr	r0, r0
-		teq	r2, #0
-		bne	__arch_writesw
-		RETINSTR(mov, pc, lr)
-
-ENTRY(insw)
-		ioaddr	r0, r0
-		teq	r2, #0
-		bne	__arch_readsw
-		RETINSTR(mov, pc, lr)
-
-ENTRY(insb)
-		ioaddr	r0, r0
-		teq	r2, #0
-		bne	__arch_readsb
-		RETINSTR(mov, pc, lr)
-
-ENTRY(outsb)
-		ioaddr	r0, r0
-		teq	r2, #0
-		bne	__arch_writesb
-		RETINSTR(mov, pc, lr)
-
diff -u --recursive --new-file v2.4.8/linux/arch/arm/lib/io-readsb.S linux/arch/arm/lib/io-readsb.S
--- v2.4.8/linux/arch/arm/lib/io-readsb.S	Thu Feb  8 16:32:44 2001
+++ linux/arch/arm/lib/io-readsb.S	Sun Aug 12 11:13:59 2001
@@ -24,7 +24,9 @@
 		subs	r2, r2, ip
 		bne	.insb_aligned
 
-ENTRY(__arch_readsb)
+ENTRY(__raw_readsb)
+		teq	r2, #0		@ do we have to check for the zero len?
+		moveq	pc, lr
 		ands	ip, r1, #3
 		bne	.insb_align
 
diff -u --recursive --new-file v2.4.8/linux/arch/arm/lib/io-readsl-armv3.S linux/arch/arm/lib/io-readsl-armv3.S
--- v2.4.8/linux/arch/arm/lib/io-readsl-armv3.S	Thu Feb  8 16:32:44 2001
+++ linux/arch/arm/lib/io-readsl-armv3.S	Sun Aug 12 11:13:59 2001
@@ -14,7 +14,9 @@
 /*
  * Note that some reads can be aligned on half-word boundaries.
  */
-ENTRY(__arch_readsl)
+ENTRY(__raw_readsl)
+		teq	r2, #0		@ do we have to check for the zero len?
+		moveq	pc, lr
 		ands	ip, r1, #3
 		bne	2f
 
diff -u --recursive --new-file v2.4.8/linux/arch/arm/lib/io-readsl-armv4.S linux/arch/arm/lib/io-readsl-armv4.S
--- v2.4.8/linux/arch/arm/lib/io-readsl-armv4.S	Thu Feb  8 16:32:44 2001
+++ linux/arch/arm/lib/io-readsl-armv4.S	Sun Aug 12 11:13:59 2001
@@ -14,7 +14,9 @@
 /*
  * Note that some reads can be aligned on half-word boundaries.
  */
-ENTRY(__arch_readsl)
+ENTRY(__raw_readsl)
+		teq	r2, #0		@ do we have to check for the zero len?
+		moveq	pc, lr
 		ands	ip, r1, #3
 		bne	2f
 
diff -u --recursive --new-file v2.4.8/linux/arch/arm/lib/io-readsw-armv3.S linux/arch/arm/lib/io-readsw-armv3.S
--- v2.4.8/linux/arch/arm/lib/io-readsw-armv3.S	Thu Feb  8 16:32:44 2001
+++ linux/arch/arm/lib/io-readsw-armv3.S	Sun Aug 12 11:13:59 2001
@@ -30,7 +30,9 @@
 		subs	r2, r2, #1
 		RETINSTR(moveq, pc, lr)
 
-ENTRY(__arch_readsw)
+ENTRY(__raw_readsw)
+		teq	r2, #0		@ do we have to check for the zero len?
+		moveq	pc, lr
 		tst	r1, #3
 		bne	.insw_align
 
diff -u --recursive --new-file v2.4.8/linux/arch/arm/lib/io-readsw-armv4.S linux/arch/arm/lib/io-readsw-armv4.S
--- v2.4.8/linux/arch/arm/lib/io-readsw-armv4.S	Thu Feb  8 16:32:44 2001
+++ linux/arch/arm/lib/io-readsw-armv4.S	Sun Aug 12 11:13:59 2001
@@ -28,7 +28,9 @@
 		subs	r2, r2, #1
 		RETINSTR(moveq, pc, lr)
 
-ENTRY(__arch_readsw)
+ENTRY(__raw_readsw)
+		teq	r2, #0		@ do we have to check for the zero len?
+		moveq	pc, lr
 		tst	r1, #3
 		bne	.insw_align
 
diff -u --recursive --new-file v2.4.8/linux/arch/arm/lib/io-writesb.S linux/arch/arm/lib/io-writesb.S
--- v2.4.8/linux/arch/arm/lib/io-writesb.S	Thu Feb  8 16:32:44 2001
+++ linux/arch/arm/lib/io-writesb.S	Sun Aug 12 11:13:59 2001
@@ -24,7 +24,9 @@
 		subs	r2, r2, ip
 		bne	.outsb_aligned
 
-ENTRY(__arch_writesb)
+ENTRY(__raw_writesb)
+		teq	r2, #0		@ do we have to check for the zero len?
+		moveq	pc, lr
 		ands	ip, r1, #3
 		bne	.outsb_align
 
diff -u --recursive --new-file v2.4.8/linux/arch/arm/lib/io-writesl.S linux/arch/arm/lib/io-writesl.S
--- v2.4.8/linux/arch/arm/lib/io-writesl.S	Thu Feb  8 16:32:44 2001
+++ linux/arch/arm/lib/io-writesl.S	Sun Aug 12 11:13:59 2001
@@ -11,7 +11,9 @@
 #include <asm/assembler.h>
 #include <asm/hardware.h>
 
-ENTRY(__arch_writesl)
+ENTRY(__raw_writesl)
+		teq	r2, #0		@ do we have to check for the zero len?
+		moveq	pc, lr
 		ands	ip, r1, #3
 		bne	2f
 
diff -u --recursive --new-file v2.4.8/linux/arch/arm/lib/io-writesw-armv3.S linux/arch/arm/lib/io-writesw-armv3.S
--- v2.4.8/linux/arch/arm/lib/io-writesw-armv3.S	Thu Feb  8 16:32:44 2001
+++ linux/arch/arm/lib/io-writesw-armv3.S	Sun Aug 12 11:13:59 2001
@@ -31,7 +31,9 @@
 		subs	r2, r2, #1
 		RETINSTR(moveq, pc, lr)
 
-ENTRY(__arch_writesw)
+ENTRY(__raw_writesw)
+		teq	r2, #0		@ do we have to check for the zero len?
+		moveq	pc, lr
 		tst	r1, #3
 		bne	.outsw_align
 
diff -u --recursive --new-file v2.4.8/linux/arch/arm/lib/io-writesw-armv4.S linux/arch/arm/lib/io-writesw-armv4.S
--- v2.4.8/linux/arch/arm/lib/io-writesw-armv4.S	Thu Feb  8 16:32:44 2001
+++ linux/arch/arm/lib/io-writesw-armv4.S	Sun Aug 12 11:13:59 2001
@@ -28,7 +28,9 @@
 		subs	r2, r2, #1
 		RETINSTR(moveq, pc, lr)
 
-ENTRY(__arch_writesw)
+ENTRY(__raw_writesw)
+		teq	r2, #0		@ do we have to check for the zero len?
+		moveq	pc, lr
 		tst	r1, #3
 		bne	.outsw_align
 
diff -u --recursive --new-file v2.4.8/linux/arch/arm/lib/uaccess-armo.S linux/arch/arm/lib/uaccess-armo.S
--- v2.4.8/linux/arch/arm/lib/uaccess-armo.S	Mon Sep 18 15:15:25 2000
+++ linux/arch/arm/lib/uaccess-armo.S	Sun Aug 12 11:13:59 2001
@@ -96,7 +96,7 @@
 		.word	uaccess_kernel_copy
 		.word	uaccess_kernel_clear
 		.word	uaccess_kernel_strncpy_from
-		.word	uaccess_kernel_strlen
+		.word	uaccess_kernel_strnlen
 
 @ In : r0 = x, r1 = addr, r2 = error
 @ Out: r2 = error
@@ -211,17 +211,21 @@
 2:		subs	r0, ip, r2
 		ldmfd	sp!, {pc}^
 
-/* Prototype: int uaccess_kernel_strlen(char *str)
+/* Prototype: int uaccess_kernel_strlen(char *str, long n)
  * Purpose  : get length of a string in kernel memory
  * Params   : str - address of string in kernel memory
- * Returns  : length of string *including terminator*, or zero on error
+ * Returns  : length of string *including terminator*,
+ *            or zero on exception, or n + 1 if too long
  */
-uaccess_kernel_strlen:
+uaccess_kernel_strnlen:
 		stmfd	sp!, {lr}
 		mov	r2, r0
 1:		ldrb	r1, [r0], #1
 		teq	r1, #0
+		beq	2f
+		subs	r1, r1, #1
 		bne	1b
-		sub	r0, r0, r2
+		add	r0, r0, #1
+2:		sub	r0, r0, r2
 		ldmfd	sp!, {pc}^
 
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-anakin/Makefile linux/arch/arm/mach-anakin/Makefile
--- v2.4.8/linux/arch/arm/mach-anakin/Makefile	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-anakin/Makefile	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,21 @@
+#
+# Makefile for the linux kernel.
+#
+# Note! Dependencies are done automagically by 'make dep', which also
+# removes any old dependencies. DON'T put your own dependencies here
+# unless it's something special (ie not a .c file).
+
+USE_STANDARD_AS_RULE := true
+
+O_TARGET		:= anakin.o
+
+# Object file lists.
+
+obj-y			:= arch.o irq.o mm.o
+obj-m			:=
+obj-n			:=
+obj-			:=
+
+export-objs		:= 
+
+include $(TOPDIR)/Rules.make
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-anakin/arch.c linux/arch/arm/mach-anakin/arch.c
--- v2.4.8/linux/arch/arm/mach-anakin/arch.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-anakin/arch.c	Sun Aug 12 17:36:24 2001
@@ -0,0 +1,46 @@
+/*
+ *  linux/arch/arm/mach-anakin/arch.c
+ *
+ *  Copyright (C) 2001 Aleph One Ltd. for Acunia N.V.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ *  Changelog:
+ *   09-Apr-2001 W/TTC	Created
+ */
+
+#include <linux/config.h>
+#include <linux/tty.h>
+#include <linux/init.h>
+
+#include <asm/setup.h>
+#include <asm/mach-types.h>
+#include <asm/mach/arch.h>
+
+#ifndef CONFIG_BLK_DEV_RAM_SIZE
+#define CONFIG_BLK_DEV_RAM_SIZE	4096
+#endif
+
+extern void anakin_map_io(void);
+extern void genarch_init_irq(void);
+
+static void __init
+fixup_anakin(struct machine_desc *desc, struct param_struct *unused,
+             char **cmdline, struct meminfo *mi)
+{
+	ROOT_DEV = MKDEV(RAMDISK_MAJOR, 0);
+	setup_ramdisk(1, 0, 0, CONFIG_BLK_DEV_RAM_SIZE);
+	setup_initrd(0xc0800000, 4 * 1024 * 1024);
+}
+
+
+MACHINE_START(ANAKIN, "Anakin")
+	MAINTAINER("Wookey/Tak-Shing Chan")
+	BOOT_MEM(0x20000000, 0x40000000, 0xe0000000)
+	VIDEO(0x80000000, 0x8002db40)
+	FIXUP(fixup_anakin)
+	MAPIO(anakin_map_io)
+	INITIRQ(genarch_init_irq)
+MACHINE_END
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-anakin/irq.c linux/arch/arm/mach-anakin/irq.c
--- v2.4.8/linux/arch/arm/mach-anakin/irq.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-anakin/irq.c	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,84 @@
+/*
+ *  linux/arch/arm/mach-anakin/irq.c
+ *
+ *  Copyright (C) 2001 Aleph One Ltd. for Acunia N.V.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ *  Changelog:
+ *   10-Apr-2001 TTC	Created
+ */
+
+#include <linux/ptrace.h>
+#include <linux/sched.h>
+#include <linux/interrupt.h>
+#include <linux/init.h>
+
+#include <asm/irq.h>
+#include <asm/mach/irq.h>
+
+extern unsigned int anakin_irq_mask, anakin_active_irqs;
+extern void do_IRQ(int, struct pt_regs *);
+
+static void
+anakin_mask_irq(unsigned int irq)
+{
+	anakin_irq_mask &= ~(1 << irq);
+}
+
+static void
+anakin_unmask_irq(unsigned int irq)
+{
+	anakin_irq_mask |= (1 << irq);
+}
+
+/*
+ * This is a faked interrupt to deal with parallel interrupt requests
+ * on the Anakin.  Make sure that its interrupt number is not in any
+ * way conflicting with the hardware interrupt numbers!  Check
+ * IRQ_ANAKIN in linux/include/asm-arm/arch-anakin/irqs.h.
+ */
+static void
+anakin_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+{
+	for (irq = 0; irq < NR_IRQS; irq++)
+		if (anakin_active_irqs & (1 << irq))
+			do_IRQ(irq, regs);
+}
+
+static struct irqaction anakin_irq = {
+	name:		"Anakin IRQ",
+	handler:	anakin_interrupt,
+	flags:		SA_INTERRUPT
+};
+ 
+void __init
+irq_init_irq(void)
+{
+	unsigned int irq;
+
+	for (irq = 0; irq < NR_IRQS; irq++) {
+		switch (irq) {
+		case IRQ_UART0:
+		case IRQ_UART1:
+		case IRQ_UART2:
+		case IRQ_TICK:
+		case IRQ_CODEC:
+		case IRQ_UART4:
+		case IRQ_TOUCHSCREEN:
+		case IRQ_UART3:
+		case IRQ_FIFO:
+		case IRQ_CAN:
+		case IRQ_COMPACTFLASH:
+		case IRQ_BOSH:
+		case IRQ_ANAKIN:
+			irq_desc[irq].valid = 1;
+			irq_desc[irq].mask_ack = anakin_mask_irq;
+			irq_desc[irq].mask = anakin_mask_irq;
+			irq_desc[irq].unmask = anakin_unmask_irq;
+		}
+	}
+	setup_arm_irq(IRQ_ANAKIN, &anakin_irq);
+}
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-anakin/mm.c linux/arch/arm/mach-anakin/mm.c
--- v2.4.8/linux/arch/arm/mach-anakin/mm.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-anakin/mm.c	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,32 @@
+/*
+ *  linux/arch/arm/mach-anakin/mm.c
+ *
+ *  Copyright (C) 2001 Aleph One Ltd. for Acunia N.V.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ *  Changelog:
+ *   09-Apr-2001 W/TTC	Created
+ */
+
+#include <linux/mm.h>
+#include <linux/init.h>
+
+#include <asm/io.h>
+#include <asm/pgtable.h>
+#include <asm/mach/map.h>
+
+static struct map_desc anakin_io_desc[] __initdata = {
+	{ IO_BASE,    IO_START,    IO_SIZE,    DOMAIN_IO, 0, 1, 0, 0 },
+	{ FLASH_BASE, FLASH_START, FLASH_SIZE, DOMAIN_IO, 1, 1, 0, 0 },
+	{ VGA_BASE,   VGA_START,   VGA_SIZE,   DOMAIN_IO, 0, 1, 0, 0 },
+	LAST_DESC
+};
+
+void __init
+anakin_map_io(void)
+{
+	iotable_init(anakin_io_desc);
+}
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-ebsa110/io.c linux/arch/arm/mach-ebsa110/io.c
--- v2.4.8/linux/arch/arm/mach-ebsa110/io.c	Tue Jul  3 17:08:18 2001
+++ linux/arch/arm/mach-ebsa110/io.c	Sun Aug 12 11:13:59 2001
@@ -261,7 +261,7 @@
 			BUG();
 	}
 
-	__arch_writesb(ISAIO_BASE + off, from, len);
+	__raw_writesb(ISAIO_BASE + off, from, len);
 }
 
 void insb(unsigned int port, void *from, int len)
@@ -276,7 +276,7 @@
 			BUG();
 	}
 
-	__arch_readsb(ISAIO_BASE + off, from, len);
+	__raw_readsb(ISAIO_BASE + off, from, len);
 }
 
 void outsw(unsigned int port, const void *from, int len)
@@ -291,7 +291,7 @@
 			BUG();
 	}
 
-	__arch_writesw(ISAIO_BASE + off, from, len);
+	__raw_writesw(ISAIO_BASE + off, from, len);
 }
 
 void insw(unsigned int port, void *from, int len)
@@ -306,7 +306,7 @@
 			BUG();
 	}
 
-	__arch_readsw(ISAIO_BASE + off, from, len);
+	__raw_readsw(ISAIO_BASE + off, from, len);
 }
 
 void outsl(unsigned int port, const void *from, int len)
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-footbridge/Makefile linux/arch/arm/mach-footbridge/Makefile
--- v2.4.8/linux/arch/arm/mach-footbridge/Makefile	Thu Apr 12 12:20:31 2001
+++ linux/arch/arm/mach-footbridge/Makefile	Sun Aug 12 11:13:59 2001
@@ -16,7 +16,7 @@
 obj-n			:=
 obj-			:=
 
-export-objs		:= netwinder-hw.o
+export-objs		:= arch.o netwinder-hw.o
 
 pci-$(CONFIG_ARCH_CATS) += cats-pci.o
 pci-$(CONFIG_ARCH_EBSA285) += ebsa285-pci.o
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-footbridge/arch.c linux/arch/arm/mach-footbridge/arch.c
--- v2.4.8/linux/arch/arm/mach-footbridge/arch.c	Thu Apr 12 12:20:31 2001
+++ linux/arch/arm/mach-footbridge/arch.c	Sun Aug 12 11:13:59 2001
@@ -7,6 +7,7 @@
  * is pulled from the params struct.
  */
 #include <linux/config.h>
+#include <linux/module.h>
 #include <linux/tty.h>
 #include <linux/delay.h>
 #include <linux/pm.h>
@@ -22,6 +23,18 @@
 extern void footbridge_map_io(void);
 extern void footbridge_init_irq(void);
 
+unsigned int mem_fclk_21285 = 50000000;
+
+EXPORT_SYMBOL(mem_fclk_21285);
+
+static int __init parse_tag_memclk(const struct tag *tag)
+{
+	mem_fclk_21285 = tag->u.memclk.fmemclk;
+	return 0;
+}
+
+__tagtable(ATAG_MEMCLK, parse_tag_memclk);
+
 #ifdef CONFIG_ARCH_EBSA285
 
 static void __init
@@ -73,7 +86,7 @@
 		printk(KERN_WARNING "Warning: bad NeTTrom parameters "
 		       "detected, using defaults\n");
 
-		params->u1.s.nr_pages = 0x2000;	/* 32MB */
+		params->u1.s.nr_pages = 0x1000;	/* 16MB */
 		params->u1.s.ramdisk_size = 0;
 		params->u1.s.flags = FLAG_READONLY;
 		params->u1.s.initrd_start = 0;
@@ -101,7 +114,7 @@
  * hard reboots fail on early boards.
  */
 static void __init
-fixup_cats(struct machine_desc *desc, struct param_struct *params,
+fixup_cats(struct machine_desc *desc, struct param_struct *unused,
 	   char **cmdline, struct meminfo *mi)
 {
 	ORIG_VIDEO_LINES  = 25;
@@ -123,7 +136,7 @@
 #ifdef CONFIG_ARCH_CO285
 
 static void __init
-fixup_coebsa285(struct machine_desc *desc, struct param_struct *params,
+fixup_coebsa285(struct machine_desc *desc, struct param_struct *unused,
 		char **cmdline, struct meminfo *mi)
 {
 	extern unsigned long boot_memory_end;
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-integrator/Makefile linux/arch/arm/mach-integrator/Makefile
--- v2.4.8/linux/arch/arm/mach-integrator/Makefile	Fri Mar  2 18:38:39 2001
+++ linux/arch/arm/mach-integrator/Makefile	Sun Aug 12 11:13:59 2001
@@ -11,7 +11,7 @@
 
 # Object file lists.
 
-obj-y			:= arch.o irq.o mm.o time.o
+obj-y			:= arch.o cpu.o irq.o mm.o time.o
 obj-m			:=
 obj-n			:=
 obj-			:=
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-integrator/arch.c linux/arch/arm/mach-integrator/arch.c
--- v2.4.8/linux/arch/arm/mach-integrator/arch.c	Fri Mar  2 18:38:39 2001
+++ linux/arch/arm/mach-integrator/arch.c	Sun Aug 12 11:13:59 2001
@@ -51,7 +51,7 @@
 #endif
 
 static void __init
-integrator_fixup(struct machine_desc *desc, struct param_struct *params,
+integrator_fixup(struct machine_desc *desc, struct param_struct *unused,
 		 char **cmdline, struct meminfo *mi)
 {
 #ifdef CONFIG_KMI_KEYB
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-integrator/cpu.c linux/arch/arm/mach-integrator/cpu.c
--- v2.4.8/linux/arch/arm/mach-integrator/cpu.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-integrator/cpu.c	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,133 @@
+/*
+ *  linux/arch/arm/mach-integrator/cpu.c
+ *
+ *  Copyright (C) 2001 Deep Blue Solutions Ltd.
+ *
+ *  $Id: cpu.c,v 1.1 2001/06/17 10:12:37 rmk Exp $
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * CPU support functions
+ */
+#include <linux/config.h>
+#include <linux/types.h>
+#include <linux/kernel.h>
+#include <linux/cpufreq.h>
+#include <linux/init.h>
+
+#include <asm/hardware.h>
+#include <asm/io.h>
+
+#define CM_ID  	(IO_ADDRESS(INTEGRATOR_HDR_BASE)+INTEGRATOR_HDR_ID_OFFSET)
+#define CM_OSC	(IO_ADDRESS(INTEGRATOR_HDR_BASE)+INTEGRATOR_HDR_OSC_OFFSET)
+#define CM_STAT (IO_ADDRESS(INTEGRATOR_HDR_BASE)+INTEGRATOR_HDR_STAT_OFFSET)
+#define CM_LOCK (IO_ADDRESS(INTEGRATOR_HDR_BASE)+INTEGRATOR_HDR_LOCK_OFFSET)
+
+struct vco {
+	unsigned char vdw;
+	unsigned char od;
+};
+
+/*
+ * Divisors for each OD setting.
+ */
+static unsigned char cc_divisor[8] = { 10, 2, 8, 4, 5, 7, 9, 6 };
+
+static unsigned int vco_to_freq(struct vco vco, int factor)
+{
+	return 2000 * (vco.vdw + 8) / cc_divisor[vco.od] / factor;
+}
+
+#ifdef CONFIG_CPU_FREQ
+/*
+ * Divisor indexes for in ascending divisor order
+ */
+static unsigned char s2od[] = { 1, 3, 4, 7, 5, 2, 6, 0 };
+
+static struct vco freq_to_vco(unsigned int freq_khz, int factor)
+{
+	struct vco vco = {0, 0};
+	unsigned int i, f;
+
+	freq_khz *= factor;
+
+	for (i = 0; i < 8; i++) {
+		f = freq_khz * cc_divisor[s2od[i]];
+		/* f must be between 10MHz and 320MHz */
+		if (f > 10000 && f <= 320000)
+			break;
+	}
+
+	vco.od  = s2od[i];
+	vco.vdw = f / 2000 - 8;
+
+	return vco;
+}
+
+/*
+ * Validate the speed in khz.  If it is outside our
+ * range, then return the lowest.
+ */
+unsigned int cpufreq_validatespeed(unsigned int freq_khz)
+{
+	struct vco vco;
+
+	if (freq_khz < 12000)
+		freq_khz = 12000;
+	if (freq_khz > 160000)
+		freq_khz = 160000;
+
+	vco = freq_to_vco(freq_khz, 1);
+
+	if (vco.vdw < 4 || vco.vdw > 152)
+		return -EINVAL;
+
+	return vco_to_freq(vco, 1);
+}
+
+void cpufreq_setspeed(unsigned int freq_khz)
+{
+	struct vco vco = freq_to_vco(freq_khz, 1);
+	u_int cm_osc;
+
+	cm_osc = __raw_readl(CM_OSC);
+	cm_osc &= 0xfffff800;
+	cm_osc |= vco.vdw | vco.od << 8;
+
+	__raw_writel(0xa05f, CM_LOCK);
+	__raw_writel(cm_osc, CM_OSC);
+	__raw_writel(0, CM_LOCK);
+}
+#endif
+
+static int __init cpu_init(void)
+{
+	u_int cm_osc, cm_stat, cpu_freq_khz, mem_freq_khz;
+	struct vco vco;
+
+	cm_osc = __raw_readl(CM_OSC);
+
+	vco.od  = (cm_osc >> 20) & 7;
+	vco.vdw = (cm_osc >> 12) & 255;
+	mem_freq_khz = vco_to_freq(vco, 2);
+
+	printk(KERN_INFO "Memory clock = %d.%03d MHz\n",
+		mem_freq_khz / 1000, mem_freq_khz % 1000);
+
+	vco.od = (cm_osc >> 8) & 7;
+	vco.vdw = cm_osc & 255;
+	cpu_freq_khz = vco_to_freq(vco, 1);
+
+#ifdef CONFIG_CPU_FREQ
+	cpufreq_init(cpu_freq_khz);
+#endif
+
+	cm_stat = __raw_readl(CM_STAT);
+	printk("Module id: %d\n", cm_stat & 255);
+
+	return 0;
+}
+
+__initcall(cpu_init);
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-integrator/pci.c linux/arch/arm/mach-integrator/pci.c
--- v2.4.8/linux/arch/arm/mach-integrator/pci.c	Fri Mar  2 18:38:39 2001
+++ linux/arch/arm/mach-integrator/pci.c	Sun Aug 12 11:13:59 2001
@@ -110,10 +110,13 @@
 	return irq_tab[intnr];
 }
 
-extern void pci_v3_init(struct arm_pci_sysdata *);
+extern void pci_v3_setup_resources(struct resource **res);
+extern void pci_v3_init(void *);
 
 struct hw_pci integrator_pci __initdata = {
-	init:		pci_v3_init,
-	swizzle:	integrator_swizzle,
-	map_irq:	integrator_map_irq,
+	setup_resources:	pci_v3_setup_resources,
+	init:			pci_v3_init,
+	mem_offset:		0x40000000,
+	swizzle:		integrator_swizzle,
+	map_irq:		integrator_map_irq,
 };
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-integrator/pci_v3.c linux/arch/arm/mach-integrator/pci_v3.c
--- v2.4.8/linux/arch/arm/mach-integrator/pci_v3.c	Fri Mar  2 18:38:39 2001
+++ linux/arch/arm/mach-integrator/pci_v3.c	Sun Aug 12 11:13:59 2001
@@ -4,7 +4,7 @@
  *  PCI functions for V3 host PCI bridge
  *
  *  Copyright (C) 1999 ARM Limited
- *  Copyright (C) 2000 Deep Blue Solutions Ltd
+ *  Copyright (C) 2000-2001 Deep Blue Solutions Ltd
  *
  * 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
@@ -109,11 +109,14 @@
  */
 
 // V3 access routines
-#define _V3Write16(o,v) __raw_writew(v, PCI_V3_VADDR + (unsigned int)(o))
-#define _V3Read16(o)    (__raw_readw(PCI_V3_VADDR + (unsigned int)(o)))
+#define v3_writeb(o,v) __raw_writeb(v, PCI_V3_VADDR + (unsigned int)(o))
+#define v3_readb(o)    (__raw_readb(PCI_V3_VADDR + (unsigned int)(o)))
 
-#define _V3Write32(o,v) __raw_writel(v, PCI_V3_VADDR + (unsigned int)(o))
-#define _V3Read32(o)    (__raw_readl(PCI_V3_VADDR + (unsigned int)(o)))
+#define v3_writew(o,v) __raw_writew(v, PCI_V3_VADDR + (unsigned int)(o))
+#define v3_readw(o)    (__raw_readw(PCI_V3_VADDR + (unsigned int)(o)))
+
+#define v3_writel(o,v) __raw_writel(v, PCI_V3_VADDR + (unsigned int)(o))
+#define v3_readl(o)    (__raw_readl(PCI_V3_VADDR + (unsigned int)(o)))
 
 /*============================================================================
  *
@@ -182,6 +185,9 @@
 #error PCI_BUS_PREMEM_START must be megabyte aligned
 #endif
 
+#undef V3_LB_BASE_PREFETCH
+#define V3_LB_BASE_PREFETCH 0
+
 static unsigned long v3_open_config_window(struct pci_dev *dev, int offset)
 {
 	unsigned int address, mapaddress, busnr;
@@ -212,13 +218,13 @@
 		 *  0   = PCI A1 & A0 are 0 (0)
 		 */
 		address = PCI_FUNC(dev->devfn) << 8;
-		mapaddress = 0x0a;
+		mapaddress = V3_LB_MAP_TYPE_CONFIG;
 
 		if (slot > 12)
 			/*
 			 * high order bits are handled by the MAP register
 			 */
-			mapaddress |= 1 << (slot - 4);
+			mapaddress |= 1 << (slot - 5);
 		else
 			/*
 			 * low order bits handled directly in the address
@@ -237,21 +243,24 @@
 		 *  3:1 = config cycle (101)
 		 *  0   = PCI A1 & A0 from host bus (1)
 		 */
-		mapaddress = 0x0b;
+		mapaddress = V3_LB_MAP_TYPE_CONFIG | V3_LB_MAP_AD_LOW_EN;
 		address = (busnr << 16) | (dev->devfn << 8);
 	}
 
 	/*
-	 * Set up base0 to see all 512Mbytes of memory space (not prefetchable), this
-	 * frees up base1 for re-use by configuration memory
+	 * Set up base0 to see all 512Mbytes of memory space (not
+	 * prefetchable), this frees up base1 for re-use by
+	 * configuration memory
 	 */
-	_V3Write32(V3_LB_BASE0, (PHYS_PCI_MEM_BASE & 0xFFF00000) | 0x90 | V3_LB_BASE_M_ENABLE);
+	v3_writel(V3_LB_BASE0, v3_addr_to_lb_base(PHYS_PCI_MEM_BASE) |
+			V3_LB_BASE_ADR_SIZE_512MB | V3_LB_BASE_ENABLE);
 
 	/*
 	 * Set up base1/map1 to point into configuration space.
 	 */
-	_V3Write32(V3_LB_BASE1, (PHYS_PCI_CONFIG_BASE & 0xFFF00000) | 0x40 | V3_LB_BASE_M_ENABLE);
-        _V3Write16(V3_LB_MAP1, mapaddress);
+	v3_writel(V3_LB_BASE1, v3_addr_to_lb_base(PHYS_PCI_CONFIG_BASE) |
+			V3_LB_BASE_ADR_SIZE_16MB | V3_LB_BASE_ENABLE);
+	v3_writew(V3_LB_MAP1, mapaddress);
 
 	return PCI_CONFIG_VADDR + address + offset;
 }
@@ -261,13 +270,17 @@
 	/*
 	 * Reassign base1 for use by prefetchable PCI memory
 	 */
-	_V3Write32(V3_LB_BASE1, ((PHYS_PCI_MEM_BASE + SZ_256M) & 0xFFF00000) | 0x84 | V3_LB_BASE_M_ENABLE);
-	_V3Write16(V3_LB_MAP1, ((PCI_BUS_PREMEM_START & 0xFFF00000) >> 16) | 0x0006);
+	v3_writel(V3_LB_BASE1, v3_addr_to_lb_base(PHYS_PCI_MEM_BASE + SZ_256M) |
+			V3_LB_BASE_ADR_SIZE_256MB | V3_LB_BASE_PREFETCH |
+			V3_LB_BASE_ENABLE);
+	v3_writew(V3_LB_MAP1, v3_addr_to_lb_map(PCI_BUS_PREMEM_START) |
+			V3_LB_MAP_TYPE_MEM_MULTIPLE);
 
 	/*
 	 * And shrink base0 back to a 256M window (NOTE: MAP0 already correct)
 	 */
-	_V3Write32(V3_LB_BASE0, (PHYS_PCI_MEM_BASE & 0xFFF00000) | 0x80 | V3_LB_BASE_M_ENABLE);
+	v3_writel(V3_LB_BASE0, v3_addr_to_lb_base(PHYS_PCI_MEM_BASE) |
+			V3_LB_BASE_ADR_SIZE_256MB | V3_LB_BASE_ENABLE);
 }
 
 static int v3_read_config_byte(struct pci_dev *dev, int where, u8 *val)
@@ -386,75 +399,176 @@
 
 static struct resource non_mem = {
 	name:	"PCI non-prefetchable",
-	start:	PCI_BUS_NONMEM_START,
-	end:	PCI_BUS_NONMEM_START + PCI_BUS_NONMEM_SIZE - 1,
+	start:	0x40000000 + PCI_BUS_NONMEM_START,
+	end:	0x40000000 + PCI_BUS_NONMEM_START + PCI_BUS_NONMEM_SIZE - 1,
 	flags:	IORESOURCE_MEM,
 };
 
 static struct resource pre_mem = {
 	name:	"PCI prefetchable",
-	start:	PCI_BUS_PREMEM_START,
-	end:	PCI_BUS_PREMEM_START + PCI_BUS_PREMEM_SIZE - 1,
+	start:	0x40000000 + PCI_BUS_PREMEM_START,
+	end:	0x40000000 + PCI_BUS_PREMEM_START + PCI_BUS_PREMEM_SIZE - 1,
 	flags:	IORESOURCE_MEM | IORESOURCE_PREFETCH,
 };
 
+void __init pci_v3_setup_resources(struct resource **resource)
+{
+	if (request_resource(&iomem_resource, &non_mem))
+		printk("PCI: unable to allocate non-prefetchable memory region\n");
+	if (request_resource(&iomem_resource, &pre_mem))
+		printk("PCI: unable to allocate prefetchable memory region\n");
+
+	/*
+	 * bus->resource[0] is the IO resource for this bus
+	 * bus->resource[1] is the mem resource for this bus
+	 * bus->resource[2] is the prefetch mem resource for this bus
+	 */
+	resource[0] = &ioport_resource;
+	resource[1] = &non_mem;
+	resource[2] = &pre_mem;
+}
+
+/*
+ * These don't seem to be implemented on the Integrator I have, which
+ * means I can't get additional information on the reason for the pm2fb
+ * problems.  I suppose I'll just have to mind-meld with the machine. ;)
+ */
+#define SC_PCI     (IO_ADDRESS(INTEGRATOR_SC_PCIENABLE))
+#define SC_LBFADDR (IO_ADDRESS(INTEGRATOR_SC_BASE+0x20))
+#define SC_LBFCODE (IO_ADDRESS(INTEGRATOR_SC_BASE+0x24))
+
+static int v3_fault(unsigned long addr, struct pt_regs *regs)
+{
+	unsigned long pc = instruction_pointer(regs);
+	unsigned long instr = *(unsigned long *)pc;
+
+	printk("V3 fault: address=0x%08lx, pc=0x%08lx [%08lx] LBFADDR=%08x LBFCODE=%02x ISTAT=%02x\n",
+		addr, pc, instr, __raw_readl(SC_LBFADDR), __raw_readl(SC_LBFCODE) & 255,
+		v3_readb(V3_LB_ISTAT));
+
+	v3_writeb(V3_LB_ISTAT, 0);
+	__raw_writel(3, SC_PCI);
+
+	/*
+	 * If the instruction being executed was a read,
+	 * make it look like it read all-ones.
+	 */
+	if ((instr & 0x0c100000) == 0x04100000) {
+		int reg = (instr >> 12) & 15;
+		unsigned long val;
+
+		if (instr & 0x00400000)
+			val = 255;
+		else
+			val = -1;
+
+		regs->uregs[reg] = val;
+		regs->ARM_pc += 4;
+		return 0;
+	}
+
+	return 1;
+}
+
+static void v3_irq(int irq, void *devid, struct pt_regs *regs)
+{
+	unsigned long pc = instruction_pointer(regs);
+	unsigned long instr = *(unsigned long *)pc;
+	char buf[128];
+
+	sprintf(buf, "V3 int %d: pc=0x%08lx [%08lx] LBFADDR=%08x LBFCODE=%02x ISTAT=%02x\n", irq,
+		pc, instr, __raw_readl(SC_LBFADDR), __raw_readl(SC_LBFCODE) & 255,
+		v3_readb(V3_LB_ISTAT));
+	printascii(buf);
+
+	v3_writeb(V3_LB_ISTAT, 0);
+	__raw_writel(3, SC_PCI);
+
+	/*
+	 * If the instruction being executed was a read,
+	 * make it look like it read all-ones.
+	 */
+	if ((instr & 0x0c100000) == 0x04100000) {
+		int reg = (instr >> 16) & 15;
+		sprintf(buf, "   reg%d = %08lx\n", reg, regs->uregs[reg]);
+		printascii(buf);
+	}
+}
+
+static struct irqaction v3_int = {
+	name: "V3",
+	handler: v3_irq,
+};
+static struct irqaction v3_int2 = {
+	name: "V3TM",
+	handler: v3_irq,
+};
+
+extern int (*external_fault)(unsigned long addr, struct pt_regs *regs);
+
 /*
  * V3_LB_BASE? - local bus address
  * V3_LB_MAP?  - pci bus address
  */
-void __init pci_v3_init(struct arm_pci_sysdata *sysdata)
+void __init pci_v3_init(void *sysdata)
 {
-	struct pci_bus *bus;
 	unsigned int pci_cmd;
 	unsigned long flags;
 
+	/*
+	 * Hook in our fault handler for PCI errors
+	 */
+	external_fault = v3_fault;
+
 	spin_lock_irqsave(&v3_lock, flags);
 
 	/*
 	 * Setup window 0 - PCI non-prefetchable memory
 	 *  Local: 0x40000000 Bus: 0x00000000 Size: 256MB
 	 */
-	_V3Write32(V3_LB_BASE0, (PHYS_PCI_MEM_BASE & 0xfff00000) | 0x80 | V3_LB_BASE_M_ENABLE);
-	_V3Write16(V3_LB_MAP0, (PCI_BUS_NONMEM_START >> 16) | 0x0006);
+	v3_writel(V3_LB_BASE0, v3_addr_to_lb_base(PHYS_PCI_MEM_BASE) |
+			V3_LB_BASE_ADR_SIZE_256MB | V3_LB_BASE_ENABLE);
+	v3_writew(V3_LB_MAP0, v3_addr_to_lb_map(PCI_BUS_NONMEM_START) |
+			V3_LB_MAP_TYPE_MEM);
 
 	/*
 	 * Setup window 1 - PCI prefetchable memory
 	 *  Local: 0x50000000 Bus: 0x10000000 Size: 256MB
 	 */
-	_V3Write32(V3_LB_BASE1, ((PHYS_PCI_MEM_BASE + SZ_256M) & 0xFFF00000) | 0x84 | V3_LB_BASE_M_ENABLE);
-	_V3Write16(V3_LB_MAP1, (PCI_BUS_PREMEM_START >> 16) | 0x0006);
+	v3_writel(V3_LB_BASE1, v3_addr_to_lb_base(PHYS_PCI_MEM_BASE + SZ_256M) |
+			V3_LB_BASE_ADR_SIZE_256MB | V3_LB_BASE_PREFETCH |
+			V3_LB_BASE_ENABLE);
+	v3_writew(V3_LB_MAP1, v3_addr_to_lb_map(PCI_BUS_PREMEM_START) |
+			V3_LB_MAP_TYPE_MEM_MULTIPLE);
 
 	/*
 	 * Setup window 2 - PCI IO
 	 */
-//	_V3Write32(V3_LB_BASE2, (PHYS_PCI_IO_BASE & 0xff000000) | V3_LB_BASE_M_ENABLE);
-//	_V3Write16(V3_LB_MAP2, 0);
+	v3_writel(V3_LB_BASE2, v3_addr_to_lb_base2(PHYS_PCI_IO_BASE) |
+			V3_LB_BASE_ENABLE);
+	v3_writew(V3_LB_MAP2, v3_addr_to_lb_map2(0));
 
 	spin_unlock_irqrestore(&v3_lock, flags);
 
-	bus = pci_scan_bus(0, &pci_v3_ops, sysdata);
-
-	if (request_resource(&iomem_resource, &non_mem))
-		printk("PCI: unable to allocate non-prefetchable memory region");
-	if (request_resource(&iomem_resource, &pre_mem))
-		printk("PCI: unable to allocate prefetchable memory region");
-
-	/*
-	 * bus->resource[0] is the IO resource for this bus
-	 * bus->resource[1] is the mem resource for this bus
-	 * bus->resource[2] is the prefetch mem resource for this bus
-	 */
-	bus->resource[1] = &non_mem;
-	bus->resource[2] = &pre_mem;
+	pci_scan_bus(0, &pci_v3_ops, sysdata);
 
-	pci_cmd = PCI_COMMAND_IO | PCI_COMMAND_MEMORY |
+	pci_cmd = PCI_COMMAND_MEMORY |
 		  PCI_COMMAND_MASTER | PCI_COMMAND_INVALIDATE;
 
-	pci_cmd |= sysdata->bus[0].features;
+	v3_writew(V3_PCI_CMD, pci_cmd);
 
-	_V3Write16(V3_PCI_CMD, pci_cmd);
-
-	printk("PCI: Fast back to back transfers %sabled\n",
-	       (sysdata->bus[0].features & PCI_COMMAND_FAST_BACK) ?
-		"en" : "dis");
+	/*
+	 * Clear any error conditions.
+	 */
+	__raw_writel(3, SC_PCI);
+	v3_writew(V3_LB_CFG, v3_readw(V3_LB_CFG) | (1 << 10));
+	v3_writeb(V3_LB_ISTAT, 0);
+	v3_writeb(V3_LB_IMASK, 0x68);
+
+	printk("LB_CFG: %04x LB_ISTAT: %02x LB_IMASK: %02x\n",
+		v3_readw(V3_LB_CFG),
+		v3_readb(V3_LB_ISTAT),
+		v3_readb(V3_LB_IMASK));
+	setup_arm_irq(IRQ_V3INT, &v3_int);
+//	setup_arm_irq(IRQ_LBUSTIMEOUT, &v3_int2);
 }
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-integrator/time.c linux/arch/arm/mach-integrator/time.c
--- v2.4.8/linux/arch/arm/mach-integrator/time.c	Fri Mar  2 18:38:39 2001
+++ linux/arch/arm/mach-integrator/time.c	Sun Aug 12 11:13:59 2001
@@ -1,7 +1,7 @@
 /*
  *  linux/arch/arm/mach-integrator/time.c
  *
- *  Copyright (C) 2000 Deep Blue Solutions
+ *  Copyright (C) 2000-2001 Deep Blue Solutions
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
@@ -12,13 +12,14 @@
 #include <linux/init.h>
 
 #include <asm/hardware.h>
+#include <asm/io.h>
 
-#define RTC_DR		(*(unsigned long *)(IO_ADDRESS(INTEGRATOR_RTC_BASE) + 0))
-#define RTC_MR		(*(unsigned long *)(IO_ADDRESS(INTEGRATOR_RTC_BASE) + 4))
-#define RTC_STAT	(*(unsigned long *)(IO_ADDRESS(INTEGRATOR_RTC_BASE) + 8))
-#define RTC_EOI		(*(unsigned long *)(IO_ADDRESS(INTEGRATOR_RTC_BASE) + 8))
-#define RTC_LR		(*(unsigned long *)(IO_ADDRESS(INTEGRATOR_RTC_BASE) + 12))
-#define RTC_CR		(*(unsigned long *)(IO_ADDRESS(INTEGRATOR_RTC_BASE) + 16))
+#define RTC_DR		(IO_ADDRESS(INTEGRATOR_RTC_BASE) + 0)
+#define RTC_MR		(IO_ADDRESS(INTEGRATOR_RTC_BASE) + 4)
+#define RTC_STAT	(IO_ADDRESS(INTEGRATOR_RTC_BASE) + 8)
+#define RTC_EOI		(IO_ADDRESS(INTEGRATOR_RTC_BASE) + 8)
+#define RTC_LR		(IO_ADDRESS(INTEGRATOR_RTC_BASE) + 12)
+#define RTC_CR		(IO_ADDRESS(INTEGRATOR_RTC_BASE) + 16)
 
 #define RTC_CR_MIE	0x00000001
 
@@ -26,16 +27,16 @@
 
 static int integrator_set_rtc(void)
 {
-	RTC_LR = xtime.tv_sec;
+	__raw_writel(xtime.tv_sec, RTC_LR);
 	return 1;
 }
 
 static int integrator_rtc_init(void)
 {
-	RTC_CR = 0;
-	RTC_EOI = 0;
+	__raw_writel(0, RTC_CR);
+	__raw_writel(0, RTC_EOI);
 
-	xtime.tv_sec = RTC_DR;
+	xtime.tv_sec = __raw_readl(RTC_DR);
 
 	set_rtc = integrator_set_rtc;
 
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/Makefile linux/arch/arm/mach-sa1100/Makefile
--- v2.4.8/linux/arch/arm/mach-sa1100/Makefile	Thu Apr 12 12:20:31 2001
+++ linux/arch/arm/mach-sa1100/Makefile	Sun Aug 12 11:13:59 2001
@@ -9,16 +9,60 @@
 
 O_TARGET		:= sa1100.o
 
-# Object file lists.
+obj-y :=
+obj-m :=
+obj-n :=
+obj-  :=
 
-obj-y			:= arch.o hw.o dma-sa1100.o # mm.o
-obj-m			:=
-obj-n			:=
-obj-			:=
+export-objs :=	assabet.o bitsy.o freebird.o huw_webpanel.o yopy.o \
+		generic.o hwtimer.o irq.o usb_ctl.o usb_recv.o usb_send.o \
+		dma-sa1100.o dma-sa1111.o pcipool.o
 
-export-objs		:= dma-sa1100.o dma-sa1111.o hw.o leds.o
+# Common support (must be linked before board specific support)
+obj-y += generic.o irq.o dma-sa1100.o
+obj-$(CONFIG_SA1111) += sa1111.o dma-sa1111.o sa1111-pcibuf.o pcipool.o
 
-obj-$(CONFIG_LEDS)	+= leds.o
-obj-$(CONFIG_SA1111)	+= dma-sa1111.o
+# This needs to be cleaned up.  We probably need to have SA1100
+# and SA1110 config symbols.
+ifeq ($(CONFIG_CPU_FREQ),y)
+obj-$(CONFIG_SA1100_ASSABET) += cpu-sa1110.o
+obj-$(CONFIG_SA1100_LART) += cpu-sa1100.o
+endif
+
+# Specific board support
+obj-$(CONFIG_SA1100_ASSABET) += assabet.o
+obj-$(CONFIG_ASSABET_NEPONSET) += neponset.o
+obj-$(CONFIG_SA1100_BITSY) += bitsy.o
+obj-$(CONFIG_SA1100_BRUTUS) += brutus.o
+obj-$(CONFIG_SA1100_CERF) += cerf.o
+obj-$(CONFIG_SA1100_EMPEG) += empeg.o
+obj-$(CONFIG_SA1100_FLEXANET) += flexanet.o
+obj-$(CONFIG_SA1100_FREEBIRD) += freebird.o
+obj-$(CONFIG_SA1100_GRAPHICSCLIENT) += graphicsclient.o
+obj-$(CONFIG_SA1100_HUW_WEBPANEL) += huw_webpanel.o
+obj-$(CONFIG_SA1100_ITSY) += itsy.o
+obj-$(CONFIG_SA1100_JORNADA720) += jornada720.o
+obj-$(CONFIG_SA1100_LART) += lart.o
+obj-$(CONFIG_SA1100_NANOENGINE) += nanoengine.o
+obj-$(CONFIG_SA1100_OMNIMETER) += omnimeter.o
+obj-$(CONFIG_SA1100_PANGOLIN) += pangolin.o
+obj-$(CONFIG_SA1100_PFS168) += pfs168.o
+obj-$(CONFIG_SA1100_PLEB) += pleb.o
+obj-$(CONFIG_SA1100_SHERMAN) += sherman.o
+obj-$(CONFIG_SA1100_SIMPAD) += simpad.o
+obj-$(CONFIG_SA1100_VICTOR) += victor.o
+obj-$(CONFIG_SA1100_XP860) += xp860.o
+obj-$(CONFIG_SA1100_YOPY) += yopy.o
+
+# LEDs support
+leds-y := leds.o
+leds-$(CONFIG_SA1100_ASSABET) += leds-assabet.o
+leds-$(CONFIG_SA1100_BRUTUS) += leds-brutus.o
+leds-$(CONFIG_SA1100_CERF) += leds-cerf.o
+leds-$(CONFIG_SA1100_FLEXANET) += leds-flexanet.o
+leds-$(CONFIG_SA1100_GRAPHICSCLIENT) += leds-graphicsclient.o
+leds-$(CONFIG_SA1100_LART) += leds-lart.o
+leds-$(CONFIG_SA1100_PFS168) += leds-pfs168.o
+obj-$(CONFIG_LEDS) += $(leds-y)
 
 include $(TOPDIR)/Rules.make
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/arch.c linux/arch/arm/mach-sa1100/arch.c
--- v2.4.8/linux/arch/arm/mach-sa1100/arch.c	Thu Apr 12 12:20:31 2001
+++ linux/arch/arm/mach-sa1100/arch.c	Wed Dec 31 16:00:00 1969
@@ -1,334 +0,0 @@
-/*
- * linux/arch/arm/mach-sa1100/arch.c
- *
- * Architecture specific fixups.  This is where any
- * parameters in the params struct are fixed up, or
- * any additional architecture specific information
- * is pulled from the params struct.
- */
-#include <linux/config.h>
-#include <linux/tty.h>
-#include <linux/delay.h>
-#include <linux/pm.h>
-#include <linux/init.h>
-
-#include <asm/elf.h>
-#include <asm/hardware.h>
-#include <asm/setup.h>
-#include <asm/mach-types.h>
-
-#include <asm/mach/arch.h>
-
-extern void genarch_init_irq(void);
-
-
-static void sa1100_power_off(void)
-{
-	mdelay(100);
-	cli();
-	/* disable internal oscillator, float CS lines */
-	PCFR = (PCFR_OPDE | PCFR_FP | PCFR_FS);
-	/* set lowest clock */
-	PPCR = 0;
-	/* set all GPIOs to input mode */
-	GPDR = 0;
-	/* enter sleep mode */
-	PMCR = PMCR_SF;
-}
-
-
-static void victor_power_off(void)
-{
-	/* switch off power supply */
-	mdelay(2000);
-	GPCR = GPIO_GPIO23;
-	while (1);
-}
-
-
-static void xp860_power_off(void)
-{
-	GPDR |= GPIO_GPIO20;
-	GPSR = GPIO_GPIO20;
-	mdelay(1000);
-	GPCR = GPIO_GPIO20;
-	while(1);
-}
-
-
-extern void __init sa1100_map_io(void);
-
-#define SET_BANK(__nr,__start,__size) \
-	mi->bank[__nr].start = (__start), \
-	mi->bank[__nr].size = (__size), \
-	mi->bank[__nr].node = (((unsigned)(__start) - PHYS_OFFSET) >> 27)
-
-static void __init
-fixup_sa1100(struct machine_desc *desc, struct param_struct *params,
-	     char **cmdline, struct meminfo *mi)
-{
-	pm_power_off = sa1100_power_off;
-
-	if (machine_is_assabet()) {
-		/* 
-		 * On Assabet, we must probe for the Neponset board *before*
-		 * paging_init() has occurred to actually determine the amount
-		 * of RAM available.
-		 */
-		extern void map_sa1100_gpio_regs(void);
-		extern void get_assabet_scr(void);
-		map_sa1100_gpio_regs();
-		get_assabet_scr();
-
-		SET_BANK( 0, 0xc0000000, 32*1024*1024 );
-		mi->nr_banks = 1;
-
-		if (machine_has_neponset()) {
-			printk("Neponset expansion board detected\n");
-			/* 
-			 * Note that Neponset RAM is slower...
-			 * and still untested. 
-			 * This would be a candidate for
-			 * _real_ NUMA support. 
-			 */
-			//SET_BANK( 1, 0xd0000000, 32*1024*1024 );
-			//mi->nr_banks = 2;
-		}
-
-		ROOT_DEV = MKDEV(RAMDISK_MAJOR,0);
-		setup_ramdisk( 1, 0, 0, 8192 );
-		setup_initrd( 0xc0800000, 3*1024*1024 );
-	}
-
-	else if (machine_is_pangolin()) {
-		SET_BANK( 0, 0xc0000000, 32*1024*1024 );
-		SET_BANK( 1, 0xc8000000, 32*1024*1024 );
-		mi->nr_banks = 2;
-		
-		ROOT_DEV = MKDEV(RAMDISK_MAJOR,0);
-		setup_ramdisk( 1, 0, 0, 16384 );
-		setup_initrd( 0xc0800000, 9*1024*1024 );
-	}
-
-	else if (machine_is_brutus()) {
-		SET_BANK( 0, 0xc0000000, 4*1024*1024 );
-		SET_BANK( 1, 0xc8000000, 4*1024*1024 );
-		SET_BANK( 2, 0xd0000000, 4*1024*1024 );
-		SET_BANK( 3, 0xd8000000, 4*1024*1024 );
-		mi->nr_banks = 4;
-
-		ROOT_DEV = MKDEV(RAMDISK_MAJOR,0);
-		setup_ramdisk( 1, 0, 0, 8192 );
-		setup_initrd( __phys_to_virt(0xd8000000), 3*1024*1024 );
-	}
-
-        else if (machine_is_cerf()) {
-                // 16Meg Ram.
-                SET_BANK( 0, 0xc0000000, 8*1024*1024 );
-                SET_BANK( 1, 0xc8000000, 8*1024*1024 );			// comment this out for 8MB Cerfs
-                mi->nr_banks = 2;
-
-                ROOT_DEV = MKDEV(RAMDISK_MAJOR,0);
-                setup_ramdisk(1,  0, 0, 8192);
-                // Save 2Meg for RAMDisk
-                setup_initrd(0xc0500000, 3*1024*1024);
-        }
-
-	else if (machine_is_empeg()) {
-		SET_BANK( 0, 0xc0000000, 4*1024*1024 );
-		SET_BANK( 1, 0xc8000000, 4*1024*1024 );
-		mi->nr_banks = 2;
-
-		ROOT_DEV = MKDEV( 3, 1 );  /* /dev/hda1 */
-		setup_ramdisk( 1, 0, 0, 4096 );
-		setup_initrd( 0xd0000000+((1024-320)*1024), (320*1024) );
-	}
-
-	else if (machine_is_lart()) {
-		/*
-		 * Note that LART is a special case - it doesn't use physical
-		 * address line A23 on the DRAM, so we effectively have 4 * 8MB
-		 * in two SA1100 banks.
-		 */
-		SET_BANK( 0, 0xc0000000, 8*1024*1024 );
-		SET_BANK( 1, 0xc1000000, 8*1024*1024 );
-		SET_BANK( 2, 0xc8000000, 8*1024*1024 );
-		SET_BANK( 3, 0xc9000000, 8*1024*1024 );
-		mi->nr_banks = 4;
-
-		ROOT_DEV = MKDEV(RAMDISK_MAJOR,0);
-		setup_ramdisk(1, 0, 0, 8192);
-		setup_initrd(0xc0400000, 4*1024*1024);
-	}
-
-	else if (machine_is_graphicsclient()) {
-		SET_BANK( 0, 0xc0000000, 16*1024*1024 );
-		mi->nr_banks = 1;
-
-		ROOT_DEV = MKDEV(RAMDISK_MAJOR,0);
-		setup_ramdisk( 1, 0, 0, 8192 );
-		setup_initrd( __phys_to_virt(0xc0800000), 4*1024*1024 );
-	}
-
-	else if (machine_is_nanoengine()) {
-		SET_BANK( 0, 0xc0000000, 32*1024*1024 );
-		mi->nr_banks = 1;
-
-		ROOT_DEV = MKDEV(RAMDISK_MAJOR,0);
-		setup_ramdisk( 1, 0, 0, 8192 );
-		setup_initrd( __phys_to_virt(0xc0800000), 4*1024*1024 );
-
-		/* Get command line parameters passed from the loader (if any) */
-		if( *((char*)0xc0000100) )
-			*cmdline = ((char *)0xc0000100);
-	}
-
-	else if (machine_is_victor()) {
-		SET_BANK( 0, 0xc0000000, 4*1024*1024 );
-		mi->nr_banks = 1;
-
-		ROOT_DEV = MKDEV( 60, 2 );
-
-		/* Get command line parameters passed from the loader (if any) */
-		if( *((char*)0xc0000000) )
-			strcpy( *cmdline, ((char *)0xc0000000) );
-
-		/* power off if any problem */
-		strcat( *cmdline, " panic=1" );
-
-		pm_power_off = victor_power_off;
-	}
-
-        else if (machine_is_sherman()) {
-                SET_BANK( 0, 0xc0000000, 64*1024*1024 );
-                SET_BANK( 1, 0xc8000000, 64*1024*1024 );
-                mi->nr_banks = 2;
-
-                ROOT_DEV = MKDEV( 60, 2 );
-                setup_ramdisk( 1, 0, 0, 8192 );
-//              setup_initrd( 0xc0400000, 8*1024*1024 );
-}
-
-	else if (machine_is_xp860()) {
-		SET_BANK( 0, 0xc0000000, 32*1024*1024 );
-		mi->nr_banks = 1;
-
-		pm_power_off = xp860_power_off;
-	}
-}
-
-#ifdef CONFIG_SA1100_ASSABET
-MACHINE_START(ASSABET, "Intel-Assabet")
-	BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
-	FIXUP(fixup_sa1100)
-	MAPIO(sa1100_map_io)
-	INITIRQ(genarch_init_irq)
-MACHINE_END
-#endif
-#ifdef CONFIG_SA1100_PANGOLIN
-MACHINE_START(PANGOLIN, "Dialogue-Pangolin")
-	BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
-	FIXUP(fixup_sa1100)
-	MAPIO(sa1100_map_io)
-	INITIRQ(genarch_init_irq)
-MACHINE_END
-#endif
-#ifdef CONFIG_SA1100_BITSY
-MACHINE_START(BITSY, "Compaq Bitsy")
-	BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
-	BOOT_PARAMS(0xc0000100)
-	FIXUP(fixup_sa1100)
-	MAPIO(sa1100_map_io)
-	INITIRQ(genarch_init_irq)
-MACHINE_END
-#endif
-#ifdef CONFIG_SA1100_BRUTUS
-MACHINE_START(BRUTUS, "Intel Brutus (SA1100 eval board)")
-	BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
-	FIXUP(fixup_sa1100)
-	MAPIO(sa1100_map_io)
-	INITIRQ(genarch_init_irq)
-MACHINE_END
-#endif
-#ifdef CONFIG_SA1100_CERF
-MACHINE_START(CERF, "Intrinsyc CerfBoard")
-	MAINTAINER("Pieter Truter")
-	BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
-	FIXUP(fixup_sa1100)
-	MAPIO(sa1100_map_io)
-	INITIRQ(genarch_init_irq)
-MACHINE_END
-#endif
-#ifdef CONFIG_SA1100_EMPEG
-MACHINE_START(EMPEG, "empeg MP3 Car Audio Player")
-	BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
-	FIXUP(fixup_sa1100)
-	MAPIO(sa1100_map_io)
-	INITIRQ(genarch_init_irq)
-MACHINE_END
-#endif
-#ifdef CONFIG_SA1100_GRAPHICSCLIENT
-MACHINE_START(GRAPHICSCLIENT, "ADS GraphicsClient")
-	BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
-	FIXUP(fixup_sa1100)
-	MAPIO(sa1100_map_io)
-	INITIRQ(genarch_init_irq)
-MACHINE_END
-#endif
-#ifdef CONFIG_SA1100_ITSY
-MACHINE_START(ITSY, "Compaq Itsy")
-	BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
-	BOOT_PARAMS(0xc0000100)
-	FIXUP(fixup_sa1100)
-	MAPIO(sa1100_map_io)
-	INITIRQ(genarch_init_irq)
-MACHINE_END
-#endif
-#ifdef CONFIG_SA1100_LART
-MACHINE_START(LART, "LART")
-	BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
-	FIXUP(fixup_sa1100)
-	MAPIO(sa1100_map_io)
-	INITIRQ(genarch_init_irq)
-MACHINE_END
-#endif
-#ifdef CONFIG_SA1100_NANOENGINE
-MACHINE_START(NANOENGINE, "BSE nanoEngine")
-	BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
-	FIXUP(fixup_sa1100)
-	MAPIO(sa1100_map_io)
-	INITIRQ(genarch_init_irq)
-MACHINE_END
-#endif
-#ifdef CONFIG_SA1100_PLEB
-MACHINE_START(PLEB, "PLEB")
-	BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
-	FIXUP(fixup_sa1100)
-	MAPIO(sa1100_map_io)
-	INITIRQ(genarch_init_irq)
-MACHINE_END
-#endif
-#ifdef CONFIG_SA1100_VICTOR
-MACHINE_START(VICTOR, "VisuAide Victor")
-	BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
-	FIXUP(fixup_sa1100)
-	MAPIO(sa1100_map_io)
-	INITIRQ(genarch_init_irq)
-MACHINE_END
-#endif
-#ifdef CONFIG_SA1100_SHERMAN
-MACHINE_START(SHERMAN, "Blazie Engineering Sherman")
-        BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
-        FIXUP(fixup_sa1100)
-        MAPIO(sa1100_map_io)
-	INITIRQ(genarch_init_irq)
-MACHINE_END
-#endif
-#ifdef CONFIG_SA1100_XP860
-MACHINE_START(XP860, "XP860")
-	BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
-	FIXUP(fixup_sa1100)
-	MAPIO(sa1100_map_io)
-	INITIRQ(genarch_init_irq)
-MACHINE_END
-#endif
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/assabet.c linux/arch/arm/mach-sa1100/assabet.c
--- v2.4.8/linux/arch/arm/mach-sa1100/assabet.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-sa1100/assabet.c	Sun Aug 12 17:36:24 2001
@@ -0,0 +1,308 @@
+/*
+ * linux/arch/arm/mach-sa1100/assabet.c
+ *
+ * Author: Nicolas Pitre
+ *
+ * This file contains all Assabet-specific tweaks.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/config.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/tty.h>
+#include <linux/module.h>
+#include <linux/errno.h>
+
+#include <asm/hardware.h>
+#include <asm/setup.h>
+#include <asm/page.h>
+#include <asm/pgtable.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach/serial_sa1100.h>
+#include <linux/serial_core.h>
+
+#include "generic.h"
+
+
+unsigned long BCR_value = BCR_DB1110;
+unsigned long SCR_value = SCR_INIT;
+EXPORT_SYMBOL(BCR_value);
+EXPORT_SYMBOL(SCR_value);
+
+
+static int __init assabet_init(void)
+{
+	if (machine_is_assabet() && machine_has_neponset()) {
+		/*
+		 * Angel sets this, but other bootloaders may not.
+		 *
+		 * This must precede any driver calls to BCR_set()
+		 * or BCR_clear().
+		 */
+		BCR = BCR_value = BCR_DB1111;
+
+#ifndef CONFIG_ASSABET_NEPONSET
+		printk( "Warning: Neponset detected but full support "
+			"hasn't been configured in the kernel\n" );
+#endif
+	}
+	return 0;
+}
+
+__initcall(assabet_init);
+
+
+/*
+ * On Assabet, we must probe for the Neponset board _before_
+ * paging_init() has occurred to actually determine the amount
+ * of RAM available.  To do so, we map the appropriate IO section
+ * in the page table here in order to access GPIO registers.
+ */
+static void __init map_sa1100_gpio_regs( void )
+{
+	unsigned long phys = _GPLR & PMD_MASK;
+	unsigned long virt = io_p2v(phys);
+	int prot = PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_DOMAIN(DOMAIN_IO);
+	pmd_t pmd;
+	pmd_val(pmd) = phys | prot;
+	set_pmd(pmd_offset(pgd_offset_k(virt), virt), pmd);
+}
+
+/*
+ * Read System Configuration "Register"
+ * (taken from "Intel StrongARM SA-1110 Microprocessor Development Board
+ * User's Guide", section 4.4.1)
+ *
+ * This same scan is performed in arch/arm/boot/compressed/head-sa1100.S
+ * to set up the serial port for decompression status messages. We
+ * repeat it here because the kernel may not be loaded as a zImage, and
+ * also because it's a hassle to communicate the SCR value to the kernel
+ * from the decompressor.
+ */
+static void __init get_assabet_scr(void)
+{
+	unsigned long flags, scr, i;
+
+	local_irq_save(flags);
+	GPDR |= 0x3fc;			/* Configure GPIO 9:2 as outputs */
+	GPSR = 0x3fc;			/* Write 0xFF to GPIO 9:2 */
+	GPDR &= ~(0x3fc);		/* Configure GPIO 9:2 as inputs */
+	for(i = 100; i--; scr = GPLR);	/* Read GPIO 9:2 */
+	GPDR |= 0x3fc;			/*  restore correct pin direction */
+	local_irq_restore(flags);
+	scr &= 0x3fc;			/* save as system configuration byte. */
+	SCR_value = scr;
+}
+
+static void __init
+fixup_assabet(struct machine_desc *desc, struct param_struct *params,
+	      char **cmdline, struct meminfo *mi)
+{
+	struct tag *t = (struct tag *)params;
+
+	/* This must be done before any call to machine_has_neponset() */
+	map_sa1100_gpio_regs();
+	get_assabet_scr();
+
+	if (machine_has_neponset())
+		printk("Neponset expansion board detected\n");
+
+	if (t->hdr.tag != ATAG_CORE) {
+		t->hdr.tag = ATAG_CORE;
+		t->hdr.size = tag_size(tag_core);
+		t->u.core.flags = 0;
+		t->u.core.pagesize = PAGE_SIZE;
+		t->u.core.rootdev = RAMDISK_MAJOR << 8 | 0;
+		t = tag_next(t);
+
+		t->hdr.tag = ATAG_MEM;
+		t->hdr.size = tag_size(tag_mem32);
+		t->u.mem.start = 0xc0000000;
+		t->u.mem.size  = 32 * 1024 * 1024;
+		t = tag_next(t);
+
+
+		/*
+		 * Note that Neponset RAM is slower...
+		 * and still untested.
+		 * This would be a candidate for
+		 * _real_ NUMA support.
+		 */
+		if (machine_has_neponset() && 0) {
+			t->hdr.tag = ATAG_MEM;
+			t->hdr.size = tag_size(tag_mem32);
+			t->u.mem.start = 0xd0000000;
+			t->u.mem.size  = 32 * 1024 * 1024;
+			t = tag_next(t);
+		}
+
+		t->hdr.tag = ATAG_RAMDISK;
+		t->hdr.size = tag_size(tag_ramdisk);
+		t->u.ramdisk.flags = 1;
+		t->u.ramdisk.size = 8192;
+		t->u.ramdisk.start = 0;
+		t = tag_next(t);
+
+		t->hdr.tag = ATAG_INITRD;
+		t->hdr.size = tag_size(tag_initrd);
+		t->u.initrd.start = 0xc0800000;
+		t->u.initrd.size = 3 * 1024 * 1024;
+		t = tag_next(t);
+
+		t->hdr.tag = ATAG_NONE;
+		t->hdr.size = 0;
+	}
+}
+
+
+static struct map_desc assabet_io_desc[] __initdata = {
+ /* virtual     physical    length      domain     r  w  c  b */
+  { 0xe8000000, 0x00000000, 0x02000000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 0 */
+  { 0xf1000000, 0x12000000, 0x00100000, DOMAIN_IO, 1, 1, 0, 0 }, /* Board Control Register */
+  { 0xf2800000, 0x4b800000, 0x00800000, DOMAIN_IO, 1, 1, 0, 0 }, /* MQ200 */
+  /*  f3000000 - neponset system registers */
+  /*  f4000000 - neponset SA1111 registers */
+  LAST_DESC
+};
+
+static void assabet_uart_pm(struct uart_port *port, u_int state, u_int oldstate)
+{
+	if (port->mapbase == _Ser1UTCR0) {
+		if (state)
+			BCR_clear(BCR_RS232EN);
+		else
+			BCR_set(BCR_RS232EN);
+	}
+}
+
+/*
+ * Note! this can be called from IRQ context.
+ * FIXME: You _need_ to handle BCR carefully, which doesn't
+ * happen at the moment.  Suggest putting interrupt save/restore
+ * in BCR_set/clear.
+ *
+ * NB: Assabet uses COM_RTS and COM_DTR for both UART1 (com port)
+ * and UART3 (radio module).  We only handle them for UART1 here.
+ */
+static void assabet_set_mctrl(struct uart_port *port, u_int mctrl)
+{
+	if (port->mapbase == _Ser1UTCR0) {
+		u_int set = 0, clear = 0;
+
+		if (mctrl & TIOCM_RTS)
+			set |= BCR_COM_RTS;
+		else
+			clear |= BCR_COM_RTS;
+
+		if (mctrl & TIOCM_DTR)
+			set |= BCR_COM_DTR;
+		else
+			clear |= BCR_COM_DTR;
+
+		BCR_clear(clear);
+		BCR_set(set);
+	}
+}
+
+static int assabet_get_mctrl(struct uart_port *port)
+{
+	u_int ret = 0;
+	u_int bsr = BSR;
+
+	/* need 2 reads to read current value */
+	bsr = BSR;
+
+	if (port->mapbase == _Ser1UTCR0) {
+		if (bsr & BSR_COM_DCD)
+			ret |= TIOCM_CD;
+		if (bsr & BSR_COM_CTS)
+			ret |= TIOCM_CTS;
+		if (bsr & BSR_COM_DSR)
+			ret |= TIOCM_DSR;
+	} else if (port->mapbase == _Ser3UTCR0) {
+		if (bsr & BSR_RAD_DCD)
+			ret |= TIOCM_CD;
+		if (bsr & BSR_RAD_CTS)
+			ret |= TIOCM_CTS;
+		if (bsr & BSR_RAD_DSR)
+			ret |= TIOCM_DSR;
+		if (bsr & BSR_RAD_RI)
+			ret |= TIOCM_RI;
+	} else {
+		ret = TIOCM_CD | TIOCM_CTS | TIOCM_DSR;
+	}
+
+	return ret;
+}
+
+static struct sa1100_port_fns assabet_port_fns __initdata = {
+	set_mctrl:	assabet_set_mctrl,
+	get_mctrl:	assabet_get_mctrl,
+	pm:		assabet_uart_pm,
+};
+
+static void __init assabet_map_io(void)
+{
+	extern void neponset_map_io(void);
+
+	sa1100_map_io();
+	iotable_init(assabet_io_desc);
+
+#ifdef CONFIG_ASSABET_NEPONSET
+	/*
+	 * We map Neponset registers even if it isn't present since
+	 * many drivers will try to probe their stuff (and fail).
+	 * This is still more friendly than a kernel paging request
+	 * crash.
+	 */
+	neponset_map_io();
+#endif
+
+	sa1100_register_uart(1, 2);
+	if (machine_has_neponset()) {
+		/*
+		 * When Neponset is attached, the first UART should be
+		 * UART3.  That's what Angel is doing and many documents
+		 * are stating this.
+		 * We do the Neponset mapping even if Neponset support
+		 * isn't compiled in so the user will still get something on
+		 * the expected physical serial port.
+		 */
+		sa1100_register_uart(0, 3);
+		sa1100_register_uart(2, 1);
+		/*
+		 * Set SUS bit in SDCR0 so serial port 1 functions.
+		 * Its called GPCLKR0 in my SA1110 manual.
+		 */
+		Ser1SDCR0 |= SDCR0_SUS;
+	} else {
+		sa1100_register_uart_fns(&assabet_port_fns);
+		sa1100_register_uart(0, 1);	/* com port */
+		sa1100_register_uart(2, 3);	/* radio module */
+	}
+
+	/*
+	 * Ensure that these pins are set as outputs and are driving
+	 * logic 0.  This ensures that we won't inadvertently toggle
+	 * the WS latch in the CPLD, and we don't float causing
+	 * excessive power drain.  --rmk
+	 */
+	GPDR |= GPIO_SSP_TXD | GPIO_SSP_SCLK | GPIO_SSP_SFRM;
+	GPCR |= GPIO_SSP_TXD | GPIO_SSP_SCLK | GPIO_SSP_SFRM;
+}
+
+
+MACHINE_START(ASSABET, "Intel-Assabet")
+	BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
+	BOOT_PARAMS(0xc0000100)
+	FIXUP(fixup_assabet)
+	MAPIO(assabet_map_io)
+	INITIRQ(sa1100_init_irq)
+MACHINE_END
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/bitsy.c linux/arch/arm/mach-sa1100/bitsy.c
--- v2.4.8/linux/arch/arm/mach-sa1100/bitsy.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-sa1100/bitsy.c	Sun Aug 12 17:36:24 2001
@@ -0,0 +1,175 @@
+/*
+ * linux/arch/arm/mach-sa1100/bitsy.c
+ */
+
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/tty.h>
+#include <linux/sched.h>
+
+#include <asm/irq.h>
+#include <asm/hardware.h>
+#include <asm/setup.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach/serial_sa1100.h>
+#include <linux/serial_core.h>
+
+#include "generic.h"
+
+
+/*
+ * Bitsy has extended, write-only memory-mapped GPIO's
+ */
+
+static int bitsy_egpio = EGPIO_BITSY_RS232_ON;
+
+void clr_bitsy_egpio(unsigned long x)
+{
+	bitsy_egpio &= ~x;
+	BITSY_EGPIO = bitsy_egpio;
+}
+
+void set_bitsy_egpio(unsigned long x)
+{
+	bitsy_egpio |= x;
+	BITSY_EGPIO = bitsy_egpio;
+}
+
+EXPORT_SYMBOL(clr_bitsy_egpio);
+EXPORT_SYMBOL(set_bitsy_egpio);
+
+
+/*
+ * low-level UART features
+ */
+
+static void bitsy_uart_set_mctrl(struct uart_port *port, u_int mctrl)
+{
+	if (port->mapbase == _Ser3UTCR0) {
+		if (mctrl & TIOCM_RTS)
+			GPCR = GPIO_BITSY_COM_RTS;
+		else
+			GPSR = GPIO_BITSY_COM_RTS;
+	}
+}
+
+static int bitsy_uart_get_mctrl(struct uart_port *port)
+{
+	int ret = TIOCM_CD | TIOCM_CTS | TIOCM_DSR;
+
+	if (port->mapbase == _Ser3UTCR0) {
+		int gplr = GPLR;
+		if (gplr & GPIO_BITSY_COM_DCD)
+			ret &= ~TIOCM_CD;
+		if (gplr & GPIO_BITSY_COM_CTS)
+			ret &= ~TIOCM_CTS;
+	}
+
+	return ret;
+}
+
+static void bitsy_dcd_intr(int irq, void *dev_id, struct pt_regs *regs)
+{
+	struct uart_info *info = dev_id;
+	/* Note: should only call this if something has changed */
+	uart_handle_dcd_change(info, GPLR & GPIO_BITSY_COM_DCD);
+}
+
+static void bitsy_cts_intr(int irq, void *dev_id, struct pt_regs *regs)
+{
+	struct uart_info *info = dev_id;
+	/* Note: should only call this if something has changed */
+	uart_handle_cts_change(info, GPLR & GPIO_BITSY_COM_CTS);
+}
+
+static void bitsy_uart_pm(struct uart_port *port, u_int state, u_int oldstate)
+{
+	if (port->mapbase == _Ser2UTCR0) {
+		if (state == 0) {
+			set_bitsy_egpio(EGPIO_BITSY_IR_ON);
+		} else {
+			clr_bitsy_egpio(EGPIO_BITSY_IR_ON);
+		}
+	} else if (port->mapbase == _Ser3UTCR0) {
+		if (state == 0) {
+			set_bitsy_egpio(EGPIO_BITSY_RS232_ON);
+		} else {
+			clr_bitsy_egpio(EGPIO_BITSY_RS232_ON);
+		}
+	}
+}
+
+static int bitsy_uart_open(struct uart_port *port, struct uart_info *info)
+{
+	int ret = 0;
+
+	if (port->mapbase == _Ser2UTCR0) {
+		Ser2UTCR4 = UTCR4_HSE;
+		Ser2HSCR0 = 0;
+		Ser2HSSR0 = HSSR0_EIF | HSSR0_TUR |
+			    HSSR0_RAB | HSSR0_FRE;
+	} else if (port->mapbase == _Ser3UTCR0) {
+		GPDR &= ~(GPIO_BITSY_COM_DCD|GPIO_BITSY_COM_CTS);
+		GPDR |= GPIO_BITSY_COM_RTS;
+		set_GPIO_IRQ_edge(GPIO_BITSY_COM_DCD|GPIO_BITSY_COM_CTS,
+				  GPIO_BOTH_EDGES);
+
+		ret = request_irq(IRQ_GPIO_BITSY_COM_DCD, bitsy_dcd_intr,
+				  0, "RS232 DCD", info);
+		if (ret)
+			return ret;
+
+		ret = request_irq(IRQ_GPIO_BITSY_COM_CTS, bitsy_cts_intr,
+				  0, "RS232 CTS", info);
+		if (ret)
+			free_irq(IRQ_GPIO_BITSY_COM_DCD, info);
+	}
+	return ret;
+}
+
+static void bitsy_uart_close(struct uart_port *port, struct uart_info *info)
+{
+	if (port->mapbase == _Ser3UTCR0) {
+		free_irq(IRQ_GPIO_BITSY_COM_DCD, info);
+		free_irq(IRQ_GPIO_BITSY_COM_CTS, info);
+	}
+}
+
+static struct sa1100_port_fns bitsy_port_fns __initdata = {
+	set_mctrl:	bitsy_uart_set_mctrl,
+	get_mctrl:	bitsy_uart_get_mctrl,
+	pm:		bitsy_uart_pm,
+	open:		bitsy_uart_open,
+	close:		bitsy_uart_close,
+};
+
+static struct map_desc bitsy_io_desc[] __initdata = {
+ /* virtual     physical    length      domain     r  w  c  b */
+  { 0xe8000000, 0x00000000, 0x02000000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 0 */
+  { 0xf0000000, 0x49000000, 0x00100000, DOMAIN_IO, 0, 1, 0, 0 }, /* EGPIO 0 */
+  { 0xf1000000, 0x10000000, 0x02000000, DOMAIN_IO, 1, 1, 0, 0 }, /* static memory bank 2 */
+  { 0xf3000000, 0x40000000, 0x02000000, DOMAIN_IO, 1, 1, 0, 0 }, /* static memory bank 4 */
+  LAST_DESC
+};
+
+static void __init bitsy_map_io(void)
+{
+	sa1100_map_io();
+	iotable_init(bitsy_io_desc);
+
+	sa1100_register_uart_fns(&bitsy_port_fns);
+	sa1100_register_uart(0, 3);
+	sa1100_register_uart(1, 1); /* isn't this one driven elsewhere? */
+	sa1100_register_uart(2, 2);
+}
+
+MACHINE_START(BITSY, "Compaq iPAQ")
+	BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
+	BOOT_PARAMS(0xc0000100)
+	MAPIO(bitsy_map_io)
+	INITIRQ(sa1100_init_irq)
+MACHINE_END
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/brutus.c linux/arch/arm/mach-sa1100/brutus.c
--- v2.4.8/linux/arch/arm/mach-sa1100/brutus.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-sa1100/brutus.c	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,57 @@
+/*
+ * linux/arch/arm/mach-sa1100/brutus.c
+ *
+ * Author: Nicolas Pitre
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/tty.h>
+
+#include <asm/hardware.h>
+#include <asm/setup.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach/serial_sa1100.h>
+
+#include "generic.h"
+
+
+static void __init
+fixup_brutus(struct machine_desc *desc, struct param_struct *params,
+	     char **cmdline, struct meminfo *mi)
+{
+	SET_BANK( 0, 0xc0000000, 4*1024*1024 );
+	SET_BANK( 1, 0xc8000000, 4*1024*1024 );
+	SET_BANK( 2, 0xd0000000, 4*1024*1024 );
+	SET_BANK( 3, 0xd8000000, 4*1024*1024 );
+	mi->nr_banks = 4;
+
+	ROOT_DEV = MKDEV(RAMDISK_MAJOR,0);
+	setup_ramdisk( 1, 0, 0, 8192 );
+	setup_initrd( __phys_to_virt(0xd8000000), 3*1024*1024 );
+}
+
+static void __init brutus_map_io(void)
+{
+	sa1100_map_io();
+
+	sa1100_register_uart(0, 1);
+	sa1100_register_uart(1, 3);
+	GAFR |= (GPIO_UART_TXD | GPIO_UART_RXD);
+	GPDR |= GPIO_UART_TXD;
+	GPDR &= ~GPIO_UART_RXD;
+	PPAR |= PPAR_UPR;
+}
+
+MACHINE_START(BRUTUS, "Intel Brutus (SA1100 eval board)")
+	BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
+	FIXUP(fixup_brutus)
+	MAPIO(brutus_map_io)
+	INITIRQ(sa1100_init_irq)
+MACHINE_END
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/cerf.c linux/arch/arm/mach-sa1100/cerf.c
--- v2.4.8/linux/arch/arm/mach-sa1100/cerf.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-sa1100/cerf.c	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,62 @@
+/*
+ * linux/arch/arm/mach-sa1100/cerf.c
+ */
+
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/tty.h>
+
+#include <asm/hardware.h>
+#include <asm/setup.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach/serial_sa1100.h>
+
+#include "generic.h"
+
+
+static void __init
+fixup_cerf(struct machine_desc *desc, struct param_struct *params,
+	   char **cmdline, struct meminfo *mi)
+{
+#ifdef CONFIG_SA1100_CERF_32MB
+	// 32MB RAM
+	SET_BANK( 0, 0xc0000000, 32*1024*1024 );
+	mi->nr_banks = 1;
+#else
+	// 16Meg Ram.
+	SET_BANK( 0, 0xc0000000, 8*1024*1024 );
+	SET_BANK( 1, 0xc8000000, 8*1024*1024 );			// comment this out for 8MB Cerfs
+	mi->nr_banks = 2;
+#endif
+
+	ROOT_DEV = MKDEV(RAMDISK_MAJOR,0);
+	setup_ramdisk(1,  0, 0, 8192);
+	// Save 2Meg for RAMDisk
+	setup_initrd(0xc0500000, 3*1024*1024);
+}
+
+static struct map_desc cerf_io_desc[] __initdata = {
+ /* virtual     physical    length      domain     r  w  c  b */
+  { 0xe8000000, 0x00000000, 0x01000000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 0 */
+  { 0xf0000000, 0x08000000, 0x00100000, DOMAIN_IO, 1, 1, 0, 0 }, /* Crystal Chip */
+  LAST_DESC
+};
+
+static void __init cerf_map_io(void)
+{
+	sa1100_map_io();
+	iotable_init(cerf_io_desc);
+
+	sa1100_register_uart(0, 3);
+	sa1100_register_uart(1, 1);
+}
+
+MACHINE_START(CERF, "Intrinsyc CerfBoard")
+	MAINTAINER("Pieter Truter")
+	BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
+	FIXUP(fixup_cerf)
+	MAPIO(cerf_map_io)
+	INITIRQ(sa1100_init_irq)
+MACHINE_END
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/cpu-sa1100.c linux/arch/arm/mach-sa1100/cpu-sa1100.c
--- v2.4.8/linux/arch/arm/mach-sa1100/cpu-sa1100.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-sa1100/cpu-sa1100.c	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,232 @@
+/*
+ * cpu-sa1100.c: clock scaling for the SA1100
+ *
+ * Copyright (C) 2000 2001, The Delft University of Technology
+ *
+ * Authors: 
+ * - Johan Pouwelse (J.A.Pouwelse@its.tudelft.nl): initial version
+ * - Erik Mouw (J.A.K.Mouw@its.tudelft.nl):
+ *   - major rewrite for linux-2.3.99
+ *   - rewritten for the more generic power management scheme in 
+ *     linux-2.4.5-rmk1
+ *
+ * This software has been developed while working on the LART
+ * computing board (http://www.lart.tudelft.nl/), which is
+ * sponsored by the Mobile Multi-media Communications
+ * (http://www.mmc.tudelft.nl/) and Ubiquitous Communications 
+ * (http://www.ubicom.tudelft.nl/) projects.
+ *
+ * The authors can be reached at:
+ *
+ *  Erik Mouw
+ *  Information and Communication Theory Group
+ *  Faculty of Information Technology and Systems
+ *  Delft University of Technology
+ *  P.O. Box 5031
+ *  2600 GA Delft
+ *  The Netherlands
+ *
+ *
+ * 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ *
+ * Theory of operations
+ * ====================
+ * 
+ * Clock scaling can be used to lower the power consumption of the CPU
+ * core. This will give you a somewhat longer running time.
+ *
+ * The SA-1100 has a single register to change the core clock speed:
+ *
+ *   PPCR      0x90020014    PLL config
+ *
+ * However, the DRAM timings are closely related to the core clock
+ * speed, so we need to change these, too. The used registers are:
+ *
+ *   MDCNFG    0xA0000000    DRAM config
+ *   MDCAS0    0xA0000004    Access waveform
+ *   MDCAS1    0xA0000008    Access waveform
+ *   MDCAS2    0xA000000C    Access waveform 
+ *
+ * Care must be taken to change the DRAM parameters the correct way,
+ * because otherwise the DRAM becomes unusable and the kernel will
+ * crash. 
+ *
+ * The simple solution to avoid a kernel crash is to put the actual
+ * clock change in ROM and jump to that code from the kernel. The main
+ * disadvantage is that the ROM has to be modified, which is not
+ * possible on all SA-1100 platforms. Another disadvantage is that
+ * jumping to ROM makes clock switching unecessary complicated.
+ *
+ * The idea behind this driver is that the memory configuration can be
+ * changed while running from DRAM (even with interrupts turned on!)
+ * as long as all re-configuration steps yield a valid DRAM
+ * configuration. The advantages are clear: it will run on all SA-1100
+ * platforms, and the code is very simple.
+ * 
+ * If you really want to understand what is going on in
+ * sa1100_update_dram_timings(), you'll have to read sections 8.2,
+ * 9.5.7.3, and 10.2 from the "Intel StrongARM SA-1100 Microprocessor
+ * Developers Manual" (available for free from Intel).
+ *
+ */
+
+#include <linux/kernel.h>
+#include <linux/types.h>
+#include <linux/init.h>
+#include <linux/cpufreq.h>
+
+#include <asm/hardware.h>
+
+
+
+
+typedef struct {
+	int speed;
+	u32 mdcnfg;
+	u32 mdcas0; 
+	u32 mdcas1;
+	u32 mdcas2;
+} sa1100_dram_regs_t;
+
+
+
+
+static sa1100_dram_regs_t sa1100_dram_settings[] =
+{
+	/* { mdcnfg, mdcas0, mdcas1, mdcas2 } */ /* clock frequency */
+	{  59000, 0x00dc88a3, 0xcccccccf, 0xfffffffc, 0xffffffff }, /*  59.0 MHz */
+	{  73700, 0x011490a3, 0xcccccccf, 0xfffffffc, 0xffffffff }, /*  73.7 MHz */
+	{  88500, 0x014e90a3, 0xcccccccf, 0xfffffffc, 0xffffffff }, /*  88.5 MHz */
+	{ 103200, 0x01889923, 0xcccccccf, 0xfffffffc, 0xffffffff }, /* 103.2 MHz */
+	{ 118000, 0x01c29923, 0x9999998f, 0xfffffff9, 0xffffffff }, /* 118.0 MHz */
+	{ 132700, 0x01fb2123, 0x9999998f, 0xfffffff9, 0xffffffff }, /* 132.7 MHz */
+	{ 147500, 0x02352123, 0x3333330f, 0xfffffff3, 0xffffffff }, /* 147.5 MHz */
+	{ 162200, 0x026b29a3, 0x38e38e1f, 0xfff8e38e, 0xffffffff }, /* 162.2 MHz */
+	{ 176900, 0x02a329a3, 0x71c71c1f, 0xfff1c71c, 0xffffffff }, /* 176.9 MHz */
+	{ 191700, 0x02dd31a3, 0xe38e383f, 0xffe38e38, 0xffffffff }, /* 191.7 MHz */
+	{ 206400, 0x03153223, 0xc71c703f, 0xffc71c71, 0xffffffff }, /* 206.4 MHz */
+	{ 221200, 0x034fba23, 0xc71c703f, 0xffc71c71, 0xffffffff }, /* 221.2 MHz */
+	{ 235900, 0x03853a23, 0xe1e1e07f, 0xe1e1e1e1, 0xffffffe1 }, /* 235.9 MHz */
+	{ 250700, 0x03bf3aa3, 0xc3c3c07f, 0xc3c3c3c3, 0xffffffc3 }, /* 250.7 MHz */
+	{ 265400, 0x03f7c2a3, 0xc3c3c07f, 0xc3c3c3c3, 0xffffffc3 }, /* 265.4 MHz */
+	{ 280200, 0x0431c2a3, 0x878780ff, 0x87878787, 0xffffff87 }, /* 280.2 MHz */
+	{ 0, 0, 0, 0, 0 } /* last entry */
+};
+
+
+
+
+static void sa1100_update_dram_timings(int current_speed, int new_speed)
+{
+	sa1100_dram_regs_t *settings = sa1100_dram_settings;
+
+	/* find speed */
+	while(settings->speed != 0) {
+		if(new_speed == settings->speed)
+			break;
+		
+		settings++;
+	}
+
+	if(settings->speed == 0) {
+		panic("%s: couldn't find dram setting for speed %d\n",
+		      __FUNCTION__, new_speed);
+	}
+
+	/* No risk, no fun: run with interrupts on! */
+	if(new_speed > current_speed) {
+		/* We're going FASTER, so first relax the memory
+		 * timings before changing the core frequency 
+		 */
+		
+		/* Half the memory access clock */
+		MDCNFG |= MDCNFG_CDB2;
+
+		/* The order of these statements IS important, keep 8
+		 * pulses!!
+		 */
+		MDCAS2 = settings->mdcas2;
+		MDCAS1 = settings->mdcas1;
+		MDCAS0 = settings->mdcas0;
+		MDCNFG = settings->mdcnfg;
+	} else {
+		/* We're going SLOWER: first decrease the core
+		 * frequency and then tighten the memory settings.
+		 */
+
+		/* Half the memory access clock */
+		MDCNFG |= MDCNFG_CDB2;
+
+		/* The order of these statements IS important, keep 8
+		 * pulses!!
+		 */
+		MDCAS0 = settings->mdcas0;
+		MDCAS1 = settings->mdcas1;
+		MDCAS2 = settings->mdcas2;
+		MDCNFG = settings->mdcnfg;
+	}
+}
+
+
+
+
+static int sa1100_dram_notifier(struct notifier_block *nb, 
+				unsigned long val, void *data)
+{
+	struct cpufreq_info *ci = data;
+	
+	switch(val) {
+	case CPUFREQ_MINMAX:
+		cpufreq_updateminmax(data, sa1100_dram_settings->speed, -1);
+		break;
+
+	case CPUFREQ_PRECHANGE:
+		if(ci->new_freq > ci->old_freq)
+			sa1100_update_dram_timings(ci->old_freq, ci->new_freq);
+		break;
+
+	case CPUFREQ_POSTCHANGE:
+		if(ci->new_freq < ci->old_freq)
+			sa1100_update_dram_timings(ci->old_freq, ci->new_freq);
+		break;
+		
+	default:
+		printk(KERN_INFO "%s: ignoring unknown notifier type (%ld)\n",
+		       __FUNCTION__, val);
+	}
+
+	return 0;
+}
+
+
+
+
+static struct notifier_block sa1100_dram_block = {
+	notifier_call: sa1100_dram_notifier,
+};
+
+
+
+
+static int __init sa1100_dram_init(void)
+{
+	return cpufreq_register_notifier(&sa1100_dram_block);
+}
+
+
+
+
+__initcall(sa1100_dram_init);
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/cpu-sa1110.c linux/arch/arm/mach-sa1100/cpu-sa1110.c
--- v2.4.8/linux/arch/arm/mach-sa1100/cpu-sa1110.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-sa1100/cpu-sa1110.c	Sun Aug 12 17:36:24 2001
@@ -0,0 +1,281 @@
+/*
+ *  linux/arch/arm/mach-sa1100/cpu-sa1110.c
+ *
+ *  Copyright (C) 2001 Russell King
+ *
+ *  $Id: cpu-sa1110.c,v 1.3 2001/08/12 15:41:53 rmk Exp $
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Note: there are two erratas that apply to the SA1110 here:
+ *  7 - SDRAM auto-power-up failure (rev A0)
+ * 13 - Corruption of internal register reads/writes following
+ *      SDRAM reads (rev A0, B0, B1)
+ *
+ * We ignore rev. A0 and B0 devices; I don't think they're worth supporting.
+ */
+#include <linux/types.h>
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/cpufreq.h>
+#include <linux/delay.h>
+#include <linux/init.h>
+
+#include <asm/hardware.h>
+#include <asm/io.h>
+#include <asm/system.h>
+
+#undef DEBUG
+
+extern u_int processor_id;
+
+#define CPU_REVISION	(processor_id & 15)
+#define CPU_SA1110_A0	(0)
+#define CPU_SA1110_B0	(4)
+#define CPU_SA1110_B1	(5)
+#define CPU_SA1110_B2	(6)
+#define CPU_SA1110_B4	(8)
+
+struct sdram_params {
+	u_char  rows;		/* bits				 */
+	u_char  cas_latency;	/* cycles			 */
+	u_char  tck;		/* clock cycle time (ns)	 */
+	u_char  trcd;		/* activate to r/w (ns)		 */
+	u_char  trp;		/* precharge to activate (ns)	 */
+	u_char  twr;		/* write recovery time (ns)	 */
+	u_short refresh;	/* refresh time for array (us)	 */
+};
+
+static struct sdram_params tc59sm716_cl2_params __initdata = {
+	rows:		    12,
+	tck:		    10,
+	trcd:		    20,
+	trp:		    20,
+	twr:		    10,
+	refresh:	 64000,
+	cas_latency:	     2,
+};
+
+static struct sdram_params tc59sm716_cl3_params __initdata = {
+	rows:		    12,
+	tck:		     8,
+	trcd:		    20,
+	trp:		    20,
+	twr:		     8,
+	refresh:	 64000,
+	cas_latency:	     3,
+};
+
+static struct sdram_params sdram_params;
+
+/*
+ * Given a period in ns and frequency in khz, calculate the number of
+ * cycles of frequency in period.  Note that we round up to the next
+ * cycle, even if we are only slightly over.
+ */
+static inline u_int ns_to_cycles(u_int ns, u_int khz)
+{
+	return (ns * khz + 999999) / 1000000;
+}
+
+/*
+ * Create the MDCAS register bit pattern.
+ */
+static inline void set_mdcas(u_int *mdcas, int delayed, u_int rcd)
+{
+	u_int shift;
+
+	rcd = 2 * rcd - 1;
+	shift = delayed + 1 + rcd;
+
+	mdcas[0]  = (1 << rcd) - 1;
+	mdcas[0] |= 0x55555555 << shift;
+	mdcas[1]  = mdcas[2] = 0x55555555 << (shift & 1);
+}
+
+static void sdram_update_timing(u_int cpu_khz, struct sdram_params *sdram)
+{
+	u_int mdcnfg, mdrefr, mdcas[3], mem_khz, sd_khz, trp, twr;
+	unsigned long flags;
+
+	mem_khz = cpu_khz / 2;
+	sd_khz = mem_khz;
+
+	/*
+	 * If SDCLK would invalidate the SDRAM timings,
+	 * run SDCLK at half speed.
+	 *
+	 * CPU steppings prior to B2 must either run the memory at
+	 * half speed or use delayed read latching (errata 13).
+	 */
+	if ((ns_to_cycles(sdram->tck, sd_khz) > 1) ||
+	    (CPU_REVISION < CPU_SA1110_B2 && sd_khz < 62000))
+		sd_khz /= 2;
+
+	mdcnfg = MDCNFG & 0x007f007f;
+
+	twr = ns_to_cycles(sdram->twr, mem_khz);
+
+	/* trp should always be >1 */
+	trp = ns_to_cycles(sdram->trp, mem_khz) - 1;
+	if (trp < 1)
+		trp = 1;
+
+	mdcnfg |= trp << 8;
+	mdcnfg |= trp << 24;
+	mdcnfg |= sdram->cas_latency << 12;
+	mdcnfg |= sdram->cas_latency << 28;
+	mdcnfg |= twr << 14;
+	mdcnfg |= twr << 30;
+
+	mdrefr = MDREFR & 0xffbffff0;
+	mdrefr |= 7;
+
+	if (sd_khz != mem_khz)
+		mdrefr |= MDREFR_K1DB2;
+
+	/* initial number of '1's in MDCAS + 1 */
+	set_mdcas(mdcas, sd_khz >= 62000, ns_to_cycles(sdram->trcd, mem_khz));
+
+#ifdef DEBUG
+	mdelay(250);
+	printk("MDCNFG: %08x MDREFR: %08x MDCAS0: %08x MDCAS1: %08x MDCAS2: %08x\n",
+		mdcnfg, mdrefr, mdcas[0], mdcas[1], mdcas[2]);
+#endif
+
+	/*
+	 * Reprogram the DRAM timings with interrupts disabled, and
+	 * ensure that we are doing this within a complete cache line.
+	 * This means that we won't access SDRAM for the duration of
+	 * the programming.
+	 */
+	local_irq_save(flags);
+	asm("mcr p15, 0, %0, c10, c4" : : "r" (0));
+	udelay(10);
+	__asm__("
+		b	1f
+		.align	5
+1:		str	%3, [%1, #28]		@ MDREFR
+		str	%4, [%1, #4]		@ MDCAS0
+		str	%5, [%1, #8]		@ MDCAS1
+		str	%6, [%1, #12]		@ MDCAS2
+		str	%2, [%1, #0]		@ MDCNFG
+		ldr	%0, [%1, #0]
+		nop
+		nop"
+		: "=&r" (mdcnfg)
+		: "r" (io_p2v(_MDCNFG)),
+		  "0" (mdcnfg), "r" (mdrefr),
+		  "r" (mdcas[0]), "r" (mdcas[1]), "r" (mdcas[2]));
+	local_irq_restore(flags);
+}
+
+/*
+ * Set the SDRAM refresh rate.
+ */
+static inline void sdram_set_refresh(u_int dri)
+{
+	MDREFR = (MDREFR & 0xffff000f) | (dri << 4);
+	(void) MDREFR;
+}
+
+/*
+ * Update the refresh period.  We do this such that we always refresh
+ * the SDRAMs within their permissible period.  The refresh period is
+ * always a multiple of the memory clock (fixed at cpu_clock / 2).
+ *
+ * FIXME: we don't currently take account of burst accesses here,
+ * but neither do Intels DM nor Angel.
+ */
+static void
+sdram_update_refresh(u_int cpu_khz, struct sdram_params *sdram)
+{
+	u_int ns_row = (sdram->refresh * 1000) >> sdram->rows;
+	u_int dri = ns_to_cycles(ns_row, cpu_khz / 2) / 32;
+
+#ifdef DEBUG
+	mdelay(250);
+	printk("new dri value = %d\n", dri);
+#endif
+
+	sdram_set_refresh(dri);
+}
+
+static int
+sdram_notifier(struct notifier_block *nb, unsigned long val, void *data)
+{
+	struct cpufreq_info *ci = data;
+	struct sdram_params *sdram = &sdram_params;
+
+	/* were we initialised? */
+	if (sdram->cas_latency == 0) {
+		struct cpufreq_minmax *m = data;
+		m->min_freq = m->max_freq = m->cur_freq;
+		return 0;
+	}
+
+	switch (val) {
+	case CPUFREQ_MINMAX:
+		/*
+		 * until we work out why the assabet
+		 * crashes below 147.5MHz...
+		 */
+		cpufreq_updateminmax(data, 147500, -1);
+		break;
+
+	case CPUFREQ_PRECHANGE:
+		/*
+		 * The clock could be going away for some time.
+		 * Set the SDRAMs to refresh rapidly (every 64
+		 * memory clock cycles).  To get through the
+		 * whole array, we need to wait 262144 mclk cycles.
+		 * We wait 20ms to be safe.
+		 */
+		sdram_set_refresh(2);
+		set_current_state(TASK_UNINTERRUPTIBLE);
+		schedule_timeout(20 * HZ / 1000);
+
+		if (ci->old_freq < ci->new_freq)
+			sdram_update_timing(ci->new_freq, sdram);
+		break;
+
+	case CPUFREQ_POSTCHANGE:
+		if (ci->old_freq > ci->new_freq)
+			sdram_update_timing(ci->new_freq, sdram);
+		sdram_update_refresh(ci->new_freq, sdram);
+		break;
+	}
+	return 0;
+}
+
+static struct notifier_block sa1110_clkchg_block = {
+	notifier_call:	sdram_notifier,
+};
+
+static int __init sa1110_sdram_init(void)
+{
+	struct sdram_params *sdram = NULL;
+	unsigned int cur_freq = cpufreq_get(smp_processor_id());
+	int ret = -ENODEV;
+
+	if (machine_is_assabet())
+		sdram = &tc59sm716_cl3_params;
+
+	if (sdram) {
+		printk(KERN_DEBUG "SDRAM: tck: %d trcd: %d trp: %d"
+			" twr: %d refresh: %d cas_latency: %d",
+			sdram->tck, sdram->trcd, sdram->trp,
+			sdram->twr, sdram->refresh, sdram->cas_latency);
+
+		memcpy(&sdram_params, sdram, sizeof(sdram_params));
+
+		sdram_update_timing(cur_freq, &sdram_params);
+		sdram_update_refresh(cur_freq, &sdram_params);
+	}
+
+	return cpufreq_register_notifier(&sa1110_clkchg_block);
+}
+
+__initcall(sa1110_sdram_init);
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/dma-sa1100.c linux/arch/arm/mach-sa1100/dma-sa1100.c
--- v2.4.8/linux/arch/arm/mach-sa1100/dma-sa1100.c	Thu Apr 12 12:20:31 2001
+++ linux/arch/arm/mach-sa1100/dma-sa1100.c	Sun Aug 12 17:36:24 2001
@@ -16,7 +16,7 @@
 #include <linux/init.h>
 #include <linux/sched.h>
 #include <linux/spinlock.h>
-#include <linux/malloc.h>
+#include <linux/slab.h>
 #include <linux/errno.h>
 
 #include <asm/system.h>
@@ -36,13 +36,6 @@
 
 
 /*
- * Maximum physical DMA buffer size
- */
-#define MAX_DMA_SIZE		0x1fff
-#define MAX_DMA_ORDER		12
-
-
-/*
  * DMA control register structure
  */
 typedef struct {
@@ -56,24 +49,16 @@
 	volatile u_long DBTB;
 } dma_regs_t;
 
-
-/*
- * DMA buffer structure
- */
-struct dma_buf_s {
-	int size;		/* buffer size */
-	dma_addr_t dma_start;	/* starting DMA address */
-	dma_addr_t dma_ptr;	/* current DMA pointer position */
-	int ref;		/* number of DMA references */
-	void *id;		/* to identify buffer from outside */
-	struct dma_buf_s *next;	/* next buffer to process */
-};
-
-
 #include "dma.h"
 
 sa1100_dma_t dma_chan[MAX_SA1100_DMA_CHANNELS];
 
+/*
+ * Maximum physical DMA buffer size
+ */
+#define MAX_DMA_SIZE		0x1fff
+#define MAX_DMA_ORDER		12
+
 
 /*
  * DMA processing...
@@ -130,7 +115,7 @@
 	for (;;) {
 		buf = dma->tail;
 
-		if (!buf) {
+		if (!buf || dma->stopped) {
 			/* no more data available */
 			DPRINTK("process: no more buf (dma %s)\n",
 				dma->curr ? "active" : "inactive");
@@ -164,7 +149,6 @@
 		DPRINTK("process: b=%#x s=%d\n", (int) buf->id, buf->size);
 		if (start_dma(dma, buf->dma_ptr, chunksize) != 0)
 			break;
-		dma->active = 1;
 		if (!dma->curr)
 			dma->curr = buf;
 		buf->ref++;
@@ -201,9 +185,10 @@
 				dma->spin_ref = -dma->spin_ref;
 			if (dma->head == buf)
 				dma->head = NULL;
-			buf->size = buf->dma_ptr - buf->dma_start;
-			if (dma->callback)
-				dma->callback(buf->id, buf->size);
+			if (dma->callback) {
+				int size = buf->dma_ptr - buf->dma_start;
+				dma->callback(buf->id, size);
+			}
 			kfree(buf);
 		}
 	}
@@ -231,62 +216,59 @@
  * DMA interface functions
  */
 
-/*
- * Get dma list
- * for /proc/dma
- */
-int sa1100_get_dma_list(char *buf)
-{
-	int i, len = 0;
-
-	for (i = 0; i < MAX_SA1100_DMA_CHANNELS; i++) {
-		if (dma_chan[i].lock)
-			len += sprintf(buf + len, "%2d: %s\n",
-				       i, dma_chan[i].device_id);
-	}
-	return len;
-}
+static spinlock_t dma_list_lock;
 
-int sa1100_request_dma(dmach_t * channel, const char *device_id)
+int sa1100_request_dma (dmach_t * channel, const char *device_id,
+			dma_device_t device)
 {
 	sa1100_dma_t *dma = NULL;
 	dma_regs_t *regs;
-	int ch, err;
+	int i, err;
 
 	*channel = -1;		/* to be sure we catch the freeing of a misregistered channel */
 
-	for (ch = 0; ch < SA1100_DMA_CHANNELS; ch++) {
-		dma = &dma_chan[ch];
-		if (xchg(&dma->lock, 1) == 0)
-			break;
+	err = 0;
+	spin_lock(&dma_list_lock);
+	for (i = 0; i < SA1100_DMA_CHANNELS; i++) {
+		if (dma_chan[i].in_use) {
+			if (dma_chan[i].device == device) {
+				err = -EBUSY;
+				break;
+			}
+		} else if (!dma) {
+			dma = &dma_chan[i];
+		}
 	}
-	if (ch >= SA1100_DMA_CHANNELS) {
-		printk(KERN_ERR "%s: no free DMA channel available\n",
-		       device_id);
-		return -EBUSY;
+	if (!err) {
+	       if (dma)
+		       dma->in_use = 1;
+	       else
+		       err = -ENOSR;
 	}
+	spin_unlock(&dma_list_lock);
+	if (err)
+		return err;
 
 	err = request_irq(dma->irq, dma_irq_handler, SA_INTERRUPT,
 			  device_id, (void *) dma);
 	if (err) {
 		printk(KERN_ERR
-		       "%s: unable to request IRQ %d for DMA channel %d\n",
-		       device_id, dma->irq, ch);
-		dma->lock = 0;
+		       "%s: unable to request IRQ %d for DMA channel\n",
+		       device_id, dma->irq);
 		return err;
 	}
 
-	*channel = ch;
+	*channel = dma - dma_chan;
 	dma->device_id = device_id;
+	dma->device = device;
 	dma->callback = NULL;
 	dma->spin_size = 0;
 
 	regs = dma->regs;
 	regs->ClrDCSR =
-	    (DCSR_DONEA | DCSR_DONEB | DCSR_STRTA | DCSR_STRTB |
-	     DCSR_IE | DCSR_ERROR | DCSR_RUN);
-	regs->DDAR = 0;
-
+		(DCSR_DONEA | DCSR_DONEB | DCSR_STRTA | DCSR_STRTB |
+		 DCSR_IE | DCSR_ERROR | DCSR_RUN);
+	regs->DDAR = device;
 	DPRINTK("requested\n");
 	return 0;
 }
@@ -296,24 +278,11 @@
 {
 	sa1100_dma_t *dma = &dma_chan[channel];
 
-	dma->callback = cb;
-	DPRINTK("cb = %p\n", cb);
-	return 0;
-}
-
-
-int sa1100_dma_set_device(dmach_t channel, dma_device_t device)
-{
-	sa1100_dma_t *dma = &dma_chan[channel];
-	dma_regs_t *regs = dma->regs;
-
-	if (dma->ready)
+	if ((unsigned)channel >= MAX_SA1100_DMA_CHANNELS || !dma->in_use)
 		return -EINVAL;
 
-	regs->ClrDCSR = DCSR_STRTA | DCSR_STRTB | DCSR_IE | DCSR_RUN;
-	regs->DDAR = device;
-	DPRINTK("DDAR = %#x\n", device);
-	dma->ready = 1;
+	dma->callback = cb;
+	DPRINTK("cb = %p\n", cb);
 	return 0;
 }
 
@@ -323,7 +292,7 @@
 	sa1100_dma_t *dma = &dma_chan[channel];
 	int flags;
 
-	if (channel >= SA1100_DMA_CHANNELS)
+	if ((unsigned)channel >= MAX_SA1100_DMA_CHANNELS || !dma->in_use)
 		return -EINVAL;
 
 	DPRINTK("set spin %d at %#x\n", size, addr);
@@ -345,7 +314,7 @@
 	int flags;
 
 	dma = &dma_chan[channel];
-	if (!dma->ready)
+	if ((unsigned)channel >= MAX_SA1100_DMA_CHANNELS || !dma->in_use)
 		return -EINVAL;
 
 	buf = kmalloc(sizeof(*buf), GFP_ATOMIC);
@@ -375,12 +344,16 @@
 int sa1100_dma_get_current(dmach_t channel, void **buf_id, dma_addr_t *addr)
 {
 	sa1100_dma_t *dma = &dma_chan[channel];
-	dma_regs_t *regs = dma->regs;
+	dma_regs_t *regs;
 	int flags, ret;
 
+	if ((unsigned)channel >= MAX_SA1100_DMA_CHANNELS || !dma->in_use)
+		return -EINVAL;
+
 	if (channel_is_sa1111_sac(channel))
 		return sa1111_dma_get_current(channel, buf_id, addr);
 
+	regs = dma->regs;
 	local_irq_save(flags);
 	if (dma->curr && dma->spin_ref <= 0) {
 		dma_buf_t *buf = dma->curr;
@@ -415,11 +388,16 @@
 			*addr = buf->dma_ptr;
 		DPRINTK("curr_pos: b=%#x a=%#x\n", (int)dma->curr->id, *addr);
 		ret = 0;
+	} else if (dma->tail && dma->stopped) {
+		dma_buf_t *buf = dma->tail;
+		if (buf_id)
+			*buf_id = buf->id;
+		*addr = buf->dma_ptr;
+		ret = 0;
 	} else {
 		if (buf_id)
 			*buf_id = NULL;
 		*addr = 0;
-		DPRINTK("curr_pos: spinning\n");
 		ret = -ENXIO;
 	}
 	local_irq_restore(flags);
@@ -430,12 +408,36 @@
 int sa1100_dma_stop(dmach_t channel)
 {
 	sa1100_dma_t *dma = &dma_chan[channel];
-	dma_regs_t *regs = dma->regs;
+	int flags;
 
 	if (channel_is_sa1111_sac(channel))
 		return sa1111_dma_stop(channel);
 
-	regs->ClrDCSR = DCSR_RUN | DCSR_IE;
+	if (dma->stopped)
+		return 0;
+	local_irq_save(flags);
+	dma->stopped = 1;
+	/*
+	 * Stop DMA and tweak state variables so everything could restart
+	 * from there when resume/wakeup occurs.
+	 */
+	dma->regs->ClrDCSR = DCSR_RUN | DCSR_IE;
+	if (dma->curr) {
+		dma_buf_t *buf = dma->curr;
+		if (dma->spin_ref <= 0) {
+			dma_addr_t curpos;
+			sa1100_dma_get_current(channel, NULL, &curpos);
+			buf->size += buf->dma_ptr - curpos;
+			buf->dma_ptr = curpos;
+		}
+		buf->ref = 0;
+		dma->tail = buf;
+		dma->curr = NULL;
+	}
+	dma->spin_ref = 0;
+	dma->regs->ClrDCSR = DCSR_STRTA|DCSR_STRTB;
+	process_dma(dma);
+	local_irq_restore(flags);
 	return 0;
 }
 
@@ -443,23 +445,35 @@
 int sa1100_dma_resume(dmach_t channel)
 {
 	sa1100_dma_t *dma = &dma_chan[channel];
-	dma_regs_t *regs = dma->regs;
+
+	if ((unsigned)channel >= MAX_SA1100_DMA_CHANNELS || !dma->in_use)
+		return -EINVAL;
 
 	if (channel_is_sa1111_sac(channel))
 		return sa1111_dma_resume(channel);
 
-	regs->SetDCSR = DCSR_RUN | DCSR_IE;
+	if (dma->stopped) {
+		int flags;
+		save_flags_cli(flags);
+		dma->regs->ClrDCSR = DCSR_STRTA|DCSR_STRTB|DCSR_RUN|DCSR_IE;
+		dma->stopped = 0;
+		dma->spin_ref = 0;
+		process_dma(dma);
+		restore_flags(flags);
+	}
 	return 0;
 }
 
 
 int sa1100_dma_flush_all(dmach_t channel)
 {
-	sa1100_dma_t *dma;
+	sa1100_dma_t *dma = &dma_chan[channel];
 	dma_buf_t *buf, *next_buf;
 	int flags;
 
-	dma = &dma_chan[channel];
+	if ((unsigned)channel >= MAX_SA1100_DMA_CHANNELS || !dma->in_use)
+		return -EINVAL;
+
 	local_irq_save(flags);
 	if (channel_is_sa1111_sac(channel))
 		sa1111_reset_sac_dma(channel);
@@ -469,10 +483,9 @@
 	if (!buf)
 		buf = dma->tail;
 	dma->head = dma->tail = dma->curr = NULL;
-	dma->active = 0;
+	dma->stopped = 0;
 	dma->spin_ref = 0;
-	if (dma->spin_size)
-		process_dma(dma);
+	process_dma(dma);
 	local_irq_restore(flags);
 	while (buf) {
 		next_buf = buf->next;
@@ -488,25 +501,24 @@
 {
 	sa1100_dma_t *dma;
 
-	if ((unsigned) channel >= MAX_SA1100_DMA_CHANNELS)
+	if ((unsigned)channel >= MAX_SA1100_DMA_CHANNELS)
 		return;
 
 	dma = &dma_chan[channel];
-	if (!dma->lock) {
+	if (!dma->in_use) {
 		printk(KERN_ERR "Trying to free free DMA%d\n", channel);
 		return;
 	}
 
 	sa1100_dma_set_spin(channel, 0, 0);
 	sa1100_dma_flush_all(channel);
-	dma->ready = 0;
 
 	if (channel_is_sa1111_sac(channel)) {
 		sa1111_cleanup_sac_dma(channel);
 	} else {
 		free_irq(IRQ_DMA0 + channel, (void *) dma);
 	}
-	dma->lock = 0;
+	dma->in_use = 0;
 
 	DPRINTK("freed\n");
 }
@@ -514,7 +526,6 @@
 
 EXPORT_SYMBOL(sa1100_request_dma);
 EXPORT_SYMBOL(sa1100_dma_set_callback);
-EXPORT_SYMBOL(sa1100_dma_set_device);
 EXPORT_SYMBOL(sa1100_dma_set_spin);
 EXPORT_SYMBOL(sa1100_dma_queue_buffer);
 EXPORT_SYMBOL(sa1100_dma_get_current);
@@ -522,6 +533,66 @@
 EXPORT_SYMBOL(sa1100_dma_resume);
 EXPORT_SYMBOL(sa1100_dma_flush_all);
 EXPORT_SYMBOL(sa1100_free_dma);
+
+
+#ifdef CONFIG_PM
+/* Drivers should call this from their PM callback function */
+
+int sa1100_dma_sleep(dmach_t channel)
+{
+        sa1100_dma_t *dma = &dma_chan[channel];
+	int orig_state;
+
+	if ((unsigned)channel >= MAX_SA1100_DMA_CHANNELS || !dma->in_use)
+		return -EINVAL;
+
+	if (channel_is_sa1111_sac(channel)) {
+		/* We'll cheat a little until someone actually
+		 * write the real thing.
+		 */
+		sa1111_reset_sac_dma(channel);
+		return 0;
+	}
+
+	orig_state = dma->stopped;
+	sa1100_dma_stop(channel);
+	dma->regs->ClrDCSR = DCSR_RUN | DCSR_IE | DCSR_STRTA | DCSR_STRTB;
+	dma->stopped = orig_state;
+	dma->spin_ref = 0;
+	return 0;
+}
+
+int sa1100_dma_wakeup(dmach_t channel)
+{
+        sa1100_dma_t *dma = &dma_chan[channel];
+	dma_regs_t *regs;
+	int flags;
+
+	if ((unsigned)channel >= MAX_SA1100_DMA_CHANNELS || !dma->in_use)
+		return -EINVAL;
+
+	if (channel_is_sa1111_sac(channel)) {
+		/* We'll cheat a little until someone actually
+		 * write the real thing.
+		 */
+		return 0;
+	}
+
+	regs = dma->regs;
+	regs->ClrDCSR =
+		(DCSR_DONEA | DCSR_DONEB | DCSR_STRTA | DCSR_STRTB |
+		 DCSR_IE | DCSR_ERROR | DCSR_RUN);
+	regs->DDAR = dma->device;
+	local_irq_save(flags);
+	process_dma(dma);
+	local_irq_restore(flags);
+	return 0;
+}
+
+EXPORT_SYMBOL(sa1100_dma_sleep);
+EXPORT_SYMBOL(sa1100_dma_wakeup);
+
+#endif
 
 
 static int __init sa1100_init_dma(void)
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/dma-sa1111.c linux/arch/arm/mach-sa1100/dma-sa1111.c
--- v2.4.8/linux/arch/arm/mach-sa1100/dma-sa1111.c	Thu Apr 12 12:20:31 2001
+++ linux/arch/arm/mach-sa1100/dma-sa1111.c	Sun Aug 12 17:36:24 2001
@@ -204,7 +204,7 @@
 
 	dma = &dma_chan[ch];
 
-	if (xchg(&dma->lock, 1) == 1) {
+	if (xchg(&dma->in_use, 1) == 1) {
 	  	printk(KERN_ERR "%s: SA-1111 SAC DMA channel %d in use\n",
 		       device_id, ch);
 		return -EBUSY;
@@ -217,7 +217,7 @@
 		printk(KERN_ERR
 		       "%s: unable to request IRQ %d for DMA channel %d (A)\n",
 		       device_id, irq, ch);
-		dma->lock = 0;
+		dma->in_use = 0;
 		return err;
 	}
 
@@ -228,7 +228,7 @@
 		printk(KERN_ERR
 		       "%s: unable to request IRQ %d for DMA channel %d (B)\n",
 		       device_id, irq, ch);
-		dma->lock = 0;
+		dma->in_use = 0;
 		return err;
 	}
 
@@ -236,7 +236,6 @@
 	dma->device_id = device_id;
 	dma->callback = NULL;
 	dma->spin_size = 0;
-	dma->ready = 1;
 
 	return 0;
 }
@@ -246,7 +245,25 @@
 
 int sa1111_dma_get_current(dmach_t channel, void **buf_id, dma_addr_t *addr)
 {
-	return -ENOSYS;
+	sa1100_dma_t *dma = &dma_chan[channel];
+	int flags, ret;
+
+	local_irq_save(flags);
+	if (dma->curr && dma->spin_ref <= 0) {
+		dma_buf_t *buf = dma->curr;
+		if (buf_id)
+			*buf_id = buf->id;
+		/* not fully accurate but still... */
+		*addr = buf->dma_ptr;
+		ret = 0;
+	} else {
+		if (buf_id)
+			*buf_id = NULL;
+		*addr = 0;
+		ret = -ENXIO;
+	}
+	local_irq_restore(flags);
+	return ret;
 }
 
 int sa1111_dma_stop(dmach_t channel)
@@ -269,7 +286,7 @@
 
 
 /* According to the "Intel StrongARM SA-1111 Microprocessor Companion
- * Chip Specification Update" (June 2000), errata #7, there is a
+ * Chip Specification Update" (June 2000), erratum #7, there is a
  * significant bug in Serial Audio Controller DMA. If the SAC is
  * accessing a region of memory above 1MB relative to the bank base,
  * it is important that address bit 10 _NOT_ be asserted. Depending
@@ -288,7 +305,7 @@
 	 * SDRAM bank 1 on Neponset). The default configuration selects
 	 * Assabet, so any address in bank 1 is necessarily invalid.
 	 */
-	if(machine_is_assabet() && addr >= _DRAMBnk1)
+	if((machine_is_assabet() || machine_is_pfs168()) && addr >= _DRAMBnk1)
 	  	return -1;
 
 	/* The bug only applies to buffers located more than one megabyte
@@ -336,11 +353,12 @@
 EXPORT_SYMBOL(sa1111_check_dma_bug);
 
 
-static void __init sa1111_init_sac_dma(void)
+static int __init sa1111_init_sac_dma(void)
 {
 	int channel = SA1111_SAC_DMA_BASE;
 	dma_chan[channel++].regs = (dma_regs_t *) &SADTCS;
 	dma_chan[channel++].regs = (dma_regs_t *) &SADRCS;
+	return 0;
 }
 
 __initcall(sa1111_init_sac_dma);
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/dma.h linux/arch/arm/mach-sa1100/dma.h
--- v2.4.8/linux/arch/arm/mach-sa1100/dma.h	Sun May 20 12:11:38 2001
+++ linux/arch/arm/mach-sa1100/dma.h	Sun Aug 12 17:36:24 2001
@@ -10,27 +10,39 @@
 #include <linux/config.h>
 
 /*
- * DMA channel structure.
+ * DMA buffer structure
  */
 
-typedef struct dma_buf_s dma_buf_t;
+typedef struct dma_buf_s {
+	int size;		/* buffer size */
+	dma_addr_t dma_start;	/* starting DMA address */
+	dma_addr_t dma_ptr;	/* next DMA pointer to use */
+	int ref;		/* number of DMA references */
+	void *id;		/* to identify buffer from outside */
+	struct dma_buf_s *next;	/* next buffer to process */
+} dma_buf_t;
+
+
+/*
+ * DMA channel structure.
+ */
 
 typedef struct {
-	unsigned int lock;      /* Device is allocated */
-	const char *device_id;  /* Device name */
-	dma_buf_t *head;        /* where to insert buffers */
-	dma_buf_t *tail;        /* where to remove buffers */
-	dma_buf_t *curr;        /* buffer currently DMA'ed */
-	int ready;              /* 1 if DMA can occur */
-	int active;             /* 1 if DMA is actually processing data */
-	dma_regs_t *regs;       /* points to appropriate DMA registers */
-	int irq;                /* IRQ used by the channel */
-	dma_callback_t callback;        /* ... to call when buffers are done */
-	int spin_size;          /* > 0 when DMA should spin when no more buffer */
-	dma_addr_t spin_addr;   /* DMA address to spin onto */
-	int spin_ref;           /* number of spinning references */
+	unsigned int in_use;	/* Device is allocated */
+	const char *device_id;	/* Device name */
+	dma_device_t device;	/* ... to which this channel is attached */
+	dma_buf_t *head;	/* where to insert buffers */
+	dma_buf_t *tail;	/* where to remove buffers */
+	dma_buf_t *curr;	/* buffer currently DMA'ed */
+	int stopped;		/* 1 if DMA is stalled */
+	dma_regs_t *regs;	/* points to appropriate DMA registers */
+	int irq;		/* IRQ used by the channel */
+	dma_callback_t callback; /* ... to call when buffers are done */
+	int spin_size;		/* > 0 when DMA should spin when no more buffer */
+	dma_addr_t spin_addr;	/* DMA address to spin onto */
+	int spin_ref;		/* number of spinning references */
 #ifdef CONFIG_SA1111
-	int dma_a, dma_b, last_dma;	/* SA-1111 specific */
+	int dma_a, dma_b, last_dma; /* SA-1111 specific */
 #endif
 } sa1100_dma_t;
 
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/empeg.c linux/arch/arm/mach-sa1100/empeg.c
--- v2.4.8/linux/arch/arm/mach-sa1100/empeg.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-sa1100/empeg.c	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,54 @@
+/*
+ * linux/arch/arm/mach-sa1100/empeg.c
+ */
+
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/tty.h>
+
+#include <asm/hardware.h>
+#include <asm/setup.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach/serial_sa1100.h>
+
+#include "generic.h"
+
+
+static void __init
+fixup_empeg(struct machine_desc *desc, struct param_struct *params,
+	    char **cmdline, struct meminfo *mi)
+{
+	SET_BANK( 0, 0xc0000000, 4*1024*1024 );
+	SET_BANK( 1, 0xc8000000, 4*1024*1024 );
+	mi->nr_banks = 2;
+
+	ROOT_DEV = MKDEV( 3, 1 );  /* /dev/hda1 */
+	setup_ramdisk( 1, 0, 0, 4096 );
+	setup_initrd( 0xd0000000+((1024-320)*1024), (320*1024) );
+}
+
+static struct map_desc empeg_io_desc[] __initdata = {
+ /* virtual     physical    length      domain     r  w  c  b */
+  { EMPEG_FLASHBASE, 0x00000000, 0x00200000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash */
+  LAST_DESC
+};
+
+static void __init empeg_map_io(void)
+{
+	sa1100_map_io();
+	iotable_init(empeg_io_desc);
+
+	sa1100_register_uart(0, 1);
+	sa1100_register_uart(1, 3);
+	sa1100_register_uart(2, 2);
+	Ser1SDCR0 |= SDCR0_UART;
+}
+
+MACHINE_START(EMPEG, "empeg MP3 Car Audio Player")
+	BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
+	FIXUP(fixup_empeg)
+	MAPIO(empeg_map_io)
+	INITIRQ(sa1100_init_irq)
+MACHINE_END
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/flexanet.c linux/arch/arm/mach-sa1100/flexanet.c
--- v2.4.8/linux/arch/arm/mach-sa1100/flexanet.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-sa1100/flexanet.c	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,80 @@
+/*
+ * linux/arch/arm/mach-sa1100/flexanet.c
+ *
+ * Author: Jordi Colomer <jco@ict.es>
+ *
+ * This file contains all FlexaNet-specific tweaks.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/config.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/tty.h>
+#include <linux/module.h>
+#include <linux/errno.h>
+#include <linux/delay.h>
+
+#include <asm/hardware.h>
+#include <asm/setup.h>
+#include <asm/page.h>
+#include <asm/pgtable.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach/serial_sa1100.h>
+
+#include "generic.h"
+
+
+unsigned long BCR_value         = BCR_POWERUP;
+unsigned long flexanet_GUI_type = 0x0000000F;
+
+EXPORT_SYMBOL(BCR_value);
+EXPORT_SYMBOL(flexanet_GUI_type);
+
+static unsigned long probe_gui_board (void);
+
+static void __init
+fixup_flexanet(struct machine_desc *desc, struct param_struct *params,
+	      char **cmdline, struct meminfo *mi)
+{
+	/* fixed RAM size, by now (64MB) */
+	SET_BANK( 0, 0xc0000000, 64*1024*1024 );
+	mi->nr_banks = 1;
+
+	/* setup ramdisk */
+	ROOT_DEV = MKDEV(RAMDISK_MAJOR,0);
+	setup_ramdisk( 1, 0, 0, 8192 );
+	setup_initrd( 0xc0800000, 3*1024*1024 );
+}
+
+
+static struct map_desc flexanet_io_desc[] __initdata = {
+ /* virtual     physical    length      domain     r  w  c  b */
+  { 0xe8000000, 0x00000000, 0x02000000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 0 */
+  { 0xf0000000, 0x10000000, 0x00001000, DOMAIN_IO, 1, 1, 0, 0 }, /* Board Control Register */
+  LAST_DESC
+};
+
+static void __init flexanet_map_io(void)
+{
+	sa1100_map_io();
+	iotable_init(flexanet_io_desc);
+
+	sa1100_register_uart(0, 1);
+	Ser1SDCR0 |= SDCR0_UART;
+}
+
+
+MACHINE_START(FLEXANET, "FlexaNet")
+	BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
+	BOOT_PARAMS(0xc0000100)
+	FIXUP(fixup_flexanet)
+	MAPIO(flexanet_map_io)
+	INITIRQ(sa1100_init_irq)
+MACHINE_END
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/freebird.c linux/arch/arm/mach-sa1100/freebird.c
--- v2.4.8/linux/arch/arm/mach-sa1100/freebird.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-sa1100/freebird.c	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,63 @@
+/*
+ * linux/arch/arm/mach-sa1100/freebird.c
+ */
+
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/tty.h>
+
+#include <asm/hardware.h>
+#include <asm/setup.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach/serial_sa1100.h>
+
+#include "generic.h"
+
+
+unsigned long BCR_value = BCR_DB1110;
+EXPORT_SYMBOL(BCR_value);
+
+
+static void __init
+fixup_freebird(struct machine_desc *desc, struct param_struct *params,
+	       char **cmdline, struct meminfo *mi)
+{
+#ifdef CONFIG_SA1100_FREEBIRD_OLD
+	SET_BANK( 0, 0xc0000000, 32*1024*1024 );
+	mi->nr_banks = 1;
+	ROOT_DEV = MKDEV(RAMDISK_MAJOR,0);
+	setup_ramdisk( 1, 0 ,0 , 8192 );
+	setup_initrd( 0xc0800000, 3*1024*1024 );
+#endif
+}
+
+static struct map_desc freebird_io_desc[] __initdata = {
+ /* virtual     physical    length      domain     r  w  c  b */
+  { 0xe8000000, 0x00000000, 0x02000000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 0 */
+  { 0xf0000000, 0x12000000, 0x00100000, DOMAIN_IO, 1, 1, 0, 0 }, /* Board Control Register */
+  { 0xf2000000, 0x19000000, 0x00100000, DOMAIN_IO, 1, 1, 0, 0},
+   LAST_DESC
+};
+
+static void __init freebird_map_io(void)
+{
+	sa1100_map_io();
+	iotable_init(freebird_io_desc);
+
+	sa1100_register_uart(0, 3);
+	sa1100_register_uart(1, 1);
+}
+
+MACHINE_START(FREEBIRD, "Freebird-HPC-1.1")
+	BOOT_MEM(0xc0000000,0x80000000, 0xf8000000)
+#ifdef CONFIG_SA1100_FREEBIRD_NEW
+	BOOT_PARAMS(0xc0000100)
+#endif
+	FIXUP(fixup_freebird)
+	MAPIO(freebird_map_io)
+	INITIRQ(sa1100_init_irq)
+MACHINE_END
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/generic.c linux/arch/arm/mach-sa1100/generic.c
--- v2.4.8/linux/arch/arm/mach-sa1100/generic.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-sa1100/generic.c	Sun Aug 12 17:36:24 2001
@@ -0,0 +1,173 @@
+/*
+ * linux/arch/arm/mach-sa1100/generic.c
+ *
+ * Author: Nicolas Pitre
+ *
+ * Code common to all SA11x0 machines.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Since this file should be linked before any other machine specific file,
+ * the __initcall() here will be executed first.  This serves as default
+ * initialization stuff for SA1100 machines which can be overriden later if
+ * need be.
+ */
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/delay.h>
+#include <linux/pm.h>
+#include <linux/cpufreq.h>
+
+#include <asm/hardware.h>
+#include <asm/system.h>
+#include <asm/pgtable.h>
+#include <asm/mach/map.h>
+
+#include "generic.h"
+
+#define NR_FREQS	16
+
+/*
+ * This table is setup for a 3.6864MHz Crystal.
+ */
+static const unsigned short cclk_frequency_100khz[NR_FREQS] = {
+	 590,	/*  59.0 MHz */
+	 737,	/*  73.7 MHz */
+	 885, 	/*  88.5 MHz */
+	1032,	/* 103.2 MHz */
+	1180,	/* 118.0 MHz */
+	1327,	/* 132.7 MHz */
+	1475,	/* 147.5 MHz */
+	1622,	/* 162.2 MHz */
+	1769,	/* 176.9 MHz */
+	1917,	/* 191.7 MHz */
+	2064,	/* 206.4 MHz */
+	2212,	/* 221.2 MHz */
+	2359,   /* 235.9 MHz */
+	2507,   /* 250.7 MHz */
+	2654,   /* 265.4 MHz */
+	2802    /* 280.2 MHz */
+};
+
+/*
+ * Return the current CPU clock frequency in units of 100kHz
+ */
+unsigned short get_cclk_frequency(void)
+{
+	return cclk_frequency_100khz[PPCR & 0xf];
+}
+
+EXPORT_SYMBOL(get_cclk_frequency);
+
+#ifdef CONFIG_CPU_FREQ
+
+/*
+ * Validate the speed in khz.  If we can't generate the precise
+ * frequency requested, round it down (to be on the safe side).
+ */
+unsigned int cpufreq_validatespeed(unsigned int khz)
+{
+	int i;
+
+	khz /= 100;
+
+	for (i = NR_FREQS - 1; i > 0; i--)
+		if (cclk_frequency_100khz[i] <= khz)
+			break;
+
+	return cclk_frequency_100khz[i] * 100;
+}
+
+/*
+ * Ok, set the CPU frequency.  Since we've done the validation
+ * above, we can match for an exact frequency.  If we don't find
+ * an exact match, we will to set the lowest frequency to be safe.
+ */
+void cpufreq_setspeed(unsigned int khz)
+{
+	int i;
+
+	khz /= 100;
+
+	for (i = NR_FREQS - 1; i > 0; i--)
+		if (cclk_frequency_100khz[i] == khz)
+			break;
+//printk("setting ppcr to %d\n", i);
+	PPCR = i;
+}
+
+static int __init sa1100_init_clock(void)
+{
+	cpufreq_init(get_cclk_frequency() * 100);
+	return 0;
+}
+
+__initcall(sa1100_init_clock);
+#endif
+
+/*
+ * Default power-off for SA1100
+ */
+static void sa1100_power_off(void)
+{
+	mdelay(100);
+	cli();
+	/* disable internal oscillator, float CS lines */
+	PCFR = (PCFR_OPDE | PCFR_FP | PCFR_FS);
+	/* enable wake-up on GPIO0 (Assabet...) */
+	PWER = GFER = GRER = 1;
+	/*
+	 * set scratchpad to zero, just in case it is used as a
+	 * restart address by the bootloader.
+	 */
+	PSPR = 0;
+	/* enter sleep mode */
+	PMCR = PMCR_SF;
+}
+
+static int __init sa1100_set_poweroff(void)
+{
+	pm_power_off = sa1100_power_off;
+	return 0;
+}
+
+__initcall(sa1100_set_poweroff);
+
+
+/*
+ * Common I/O mapping:
+ *
+ * Typically, static virtual address mappings are as follow:
+ *
+ * 0xe8000000-0xefffffff:	flash memory (especially when multiple flash
+ * 				banks need to be mapped contigously)
+ * 0xf0000000-0xf3ffffff:	miscellaneous stuff (CPLDs, etc.)
+ * 0xf4000000-0xf4ffffff:	SA-1111
+ * 0xf5000000-0xf5ffffff:	reserved (used by cache flushing area)
+ * 0xf6000000-0xffffffff:	reserved (internal SA1100 IO defined above)
+ *
+ * Below 0xe8000000 is reserved for vm allocation.
+ *
+ * The machine specific code must provide the extra mapping beside the
+ * default mapping provided here.
+ */
+
+static struct map_desc standard_io_desc[] __initdata = {
+ /* virtual     physical    length      domain     r  w  c  b */
+  { 0xf6000000, 0x20000000, 0x01000000, DOMAIN_IO, 1, 1, 0, 0 }, /* PCMCIA0 IO */
+  { 0xf7000000, 0x30000000, 0x01000000, DOMAIN_IO, 1, 1, 0, 0 }, /* PCMCIA1 IO */
+  { 0xf8000000, 0x80000000, 0x00100000, DOMAIN_IO, 0, 1, 0, 0 }, /* PCM */
+  { 0xfa000000, 0x90000000, 0x00100000, DOMAIN_IO, 0, 1, 0, 0 }, /* SCM */
+  { 0xfc000000, 0xa0000000, 0x00100000, DOMAIN_IO, 0, 1, 0, 0 }, /* MER */
+  { 0xfe000000, 0xb0000000, 0x00200000, DOMAIN_IO, 0, 1, 0, 0 }, /* LCD + DMA */
+  LAST_DESC
+};
+
+void __init sa1100_map_io(void)
+{
+	iotable_init(standard_io_desc);
+}
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/generic.h linux/arch/arm/mach-sa1100/generic.h
--- v2.4.8/linux/arch/arm/mach-sa1100/generic.h	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-sa1100/generic.h	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,14 @@
+/*
+ * linux/arch/arm/mach-sa1100/generic.h
+ *
+ * Author: Nicolas Pitre
+ */
+
+extern void __init sa1100_map_io(void);
+extern void __init sa1100_init_irq(void);
+
+#define SET_BANK(__nr,__start,__size) \
+	mi->bank[__nr].start = (__start), \
+	mi->bank[__nr].size = (__size), \
+	mi->bank[__nr].node = (((unsigned)(__start) - PHYS_OFFSET) >> 27)
+
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/graphicsclient.c linux/arch/arm/mach-sa1100/graphicsclient.c
--- v2.4.8/linux/arch/arm/mach-sa1100/graphicsclient.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-sa1100/graphicsclient.c	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,160 @@
+/*
+ * linux/arch/arm/mach-sa1100/graphicsclient.c
+ *
+ * Author: Nicolas Pitre
+ *
+ * Pieces specific to the GraphicsClient board
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/init.h>
+#include <linux/sched.h>
+#include <linux/interrupt.h>
+#include <linux/ptrace.h>
+
+#include <asm/hardware.h>
+#include <asm/setup.h>
+#include <asm/irq.h>
+
+#include <asm/mach/irq.h>
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach/serial_sa1100.h>
+
+#include <asm/arch/irq.h>
+
+#include "generic.h"
+
+
+/*
+ * Handlers for GraphicsClient's external IRQ logic
+ */
+
+static void ADS_IRQ_demux( int irq, void *dev_id, struct pt_regs *regs )
+{
+	int i;
+
+	while( (irq = ADS_INT_ST1 | (ADS_INT_ST2 << 8)) ){
+		for( i = 0; i < 16; i++ )
+			if( irq & (1<<i) )
+				do_IRQ( ADS_EXT_IRQ(i), regs );
+	}
+}
+
+static struct irqaction ADS_ext_irq = {
+	name:		"ADS_ext_IRQ",
+	handler:	ADS_IRQ_demux,
+	flags:		SA_INTERRUPT
+};
+
+static void ADS_mask_and_ack_irq0(unsigned int irq)
+{
+	int mask = (1 << (irq - ADS_EXT_IRQ(0)));
+	ADS_INT_EN1 &= ~mask;
+	ADS_INT_ST1 = mask;
+}
+
+static void ADS_mask_irq0(unsigned int irq)
+{
+	ADS_INT_ST1 = (1 << (irq - ADS_EXT_IRQ(0)));
+}
+
+static void ADS_unmask_irq0(unsigned int irq)
+{
+	ADS_INT_EN1 |= (1 << (irq - ADS_EXT_IRQ(0)));
+}
+
+static void ADS_mask_and_ack_irq1(unsigned int irq)
+{
+	int mask = (1 << (irq - ADS_EXT_IRQ(8)));
+	ADS_INT_EN2 &= ~mask;
+	ADS_INT_ST2 = mask;
+}
+
+static void ADS_mask_irq1(unsigned int irq)
+{
+	ADS_INT_ST2 = (1 << (irq - ADS_EXT_IRQ(8)));
+}
+
+static void ADS_unmask_irq1(unsigned int irq)
+{
+	ADS_INT_EN2 |= (1 << (irq - ADS_EXT_IRQ(8)));
+}
+
+static void __init graphicsclient_init_irq(void)
+{
+	int irq;
+
+	/* First the standard SA1100 IRQs */
+	sa1100_init_irq();
+
+	/* disable all IRQs */
+	ADS_INT_EN1 = 0;
+	ADS_INT_EN2 = 0;
+	/* clear all IRQs */
+	ADS_INT_ST1 = 0xff;
+	ADS_INT_ST2 = 0xff;
+
+	for (irq = ADS_EXT_IRQ(0); irq <= ADS_EXT_IRQ(7); irq++) {
+		irq_desc[irq].valid	= 1;
+		irq_desc[irq].probe_ok	= 1;
+		irq_desc[irq].mask_ack	= ADS_mask_and_ack_irq0;
+		irq_desc[irq].mask	= ADS_mask_irq0;
+		irq_desc[irq].unmask	= ADS_unmask_irq0;
+	}
+	for (irq = ADS_EXT_IRQ(8); irq <= ADS_EXT_IRQ(15); irq++) {
+		irq_desc[irq].valid	= 1;
+		irq_desc[irq].probe_ok	= 1;
+		irq_desc[irq].mask_ack	= ADS_mask_and_ack_irq1;
+		irq_desc[irq].mask	= ADS_mask_irq1;
+		irq_desc[irq].unmask	= ADS_unmask_irq1;
+	}
+	GPDR &= ~GPIO_GPIO0;
+	set_GPIO_IRQ_edge(GPIO_GPIO0, GPIO_FALLING_EDGE);
+	setup_arm_irq( IRQ_GPIO0, &ADS_ext_irq );
+}
+
+
+/*
+ * Initialization fixup
+ */
+
+static void __init
+fixup_graphicsclient(struct machine_desc *desc, struct param_struct *params,
+		     char **cmdline, struct meminfo *mi)
+{
+	SET_BANK( 0, 0xc0000000, 16*1024*1024 );
+	SET_BANK( 1, 0xc8000000, 16*1024*1024 );
+	mi->nr_banks = 2;
+
+	ROOT_DEV = MKDEV(RAMDISK_MAJOR,0);
+	setup_ramdisk( 1, 0, 0, 4096 );
+	setup_initrd( __phys_to_virt(0xc0800000), 4*1024*1024 );
+}
+
+static struct map_desc graphicsclient_io_desc[] __initdata = {
+ /* virtual     physical    length      domain     r  w  c  b */
+  { 0xe8000000, 0x08000000, 0x01000000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 1 */
+  { 0xf0000000, 0x10000000, 0x00400000, DOMAIN_IO, 0, 1, 0, 0 }, /* CPLD */
+  LAST_DESC
+};
+
+static void __init graphicsclient_map_io(void)
+{
+	sa1100_map_io();
+	iotable_init(graphicsclient_io_desc);
+
+	sa1100_register_uart(0, 3);
+	sa1100_register_uart(1, 1);
+	sa1100_register_uart(2, 2);
+}
+
+MACHINE_START(GRAPHICSCLIENT, "ADS GraphicsClient")
+	BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
+	FIXUP(fixup_graphicsclient)
+	MAPIO(graphicsclient_map_io)
+	INITIRQ(graphicsclient_init_irq)
+MACHINE_END
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/huw_webpanel.c linux/arch/arm/mach-sa1100/huw_webpanel.c
--- v2.4.8/linux/arch/arm/mach-sa1100/huw_webpanel.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-sa1100/huw_webpanel.c	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,80 @@
+/*
+ * linux/arch/arm/mach-sa1100/huw_webpanel.c
+ *
+ */
+
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/tty.h>
+
+#include <asm/hardware.h>
+#include <asm/setup.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach/serial_sa1100.h>
+
+#include "generic.h"
+
+
+unsigned long BCR_value;
+EXPORT_SYMBOL(BCR_value);
+
+
+static void __init init_huw_cs3(void)
+{
+	// here we can place some initcode
+	// BCR_value = 0x1045bf70; //*((volatile unsigned long*)0xf1fffff0);
+}
+
+__initcall(init_huw_cs3);
+
+
+static void __init
+fixup_huw_webpanel(struct machine_desc *desc, struct param_struct *params,
+		   char **cmdline, struct meminfo *mi)
+{
+	/**
+	  memory information (JOR):
+	  32 MByte - 256KByte bootloader (init at boot time) - 32 kByte save area
+	 **/
+	SET_BANK( 0, 0xc0000000, ((32*1024 - (256 + 32)) * 1024));
+	mi->nr_banks = 1;
+	ROOT_DEV = MKDEV(RAMDISK_MAJOR,0);
+	setup_ramdisk( 1, 0, 0, 8192 );
+	setup_initrd( __phys_to_virt(0xc0800000), 8*1024*1024 );
+}
+
+
+/**
+   memory information (JOR):
+   32 MByte - 256KByte bootloader (init at boot time) - 32 kByte save area
+   area size = 288 kByte (0x48000 Bytes)
+**/
+static struct map_desc huw_webpanel_io_desc[] __initdata = {
+ /* virtual     physical    length      domain     r  w  c  b */
+  { 0xe8000000, 0x00000000, 0x02000000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 0, neccessary for mtd */
+  { 0xf0000000, 0xc1fb8000, 0x00048000, DOMAIN_IO, 1, 1, 0, 0 }, /* Parameter */
+  { 0xf1000000, 0x18000000, 0x00100000, DOMAIN_IO, 0, 1, 0, 0 }, /* Paules CS3, write only */
+  LAST_DESC
+};
+
+static void __init huw_webpanel_map_io(void)
+{
+	sa1100_map_io();
+	iotable_init(huw_webpanel_io_desc);
+
+	sa1100_register_uart(0, 3);
+	sa1100_register_uart(1, 1);
+}
+
+
+MACHINE_START(HUW_WEBPANEL, "HuW-Webpanel")
+	MAINTAINER("Roman Jordan")
+	BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
+	FIXUP(fixup_huw_webpanel)
+	MAPIO(huw_webpanel_map_io)
+	INITIRQ(sa1100_init_irq)
+MACHINE_END
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/hw.c linux/arch/arm/mach-sa1100/hw.c
--- v2.4.8/linux/arch/arm/mach-sa1100/hw.c	Thu Feb  8 16:32:44 2001
+++ linux/arch/arm/mach-sa1100/hw.c	Wed Dec 31 16:00:00 1969
@@ -1,188 +0,0 @@
-/*
- * arch/arm/kernel/hw-sa1100.c
- *
- * SA1100-dependent machine specifics
- *
- * Copyright (C) 2000 Nicolas Pitre <nico@cam.org>
- *
- * This will certainly contain more stuff with time... like power management,
- * special hardware autodetection, etc.
- *
- */
-#include <linux/config.h>
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/kernel.h>
-#include <linux/sched.h>
-
-#include <asm/delay.h>
-#include <asm/hardware.h>
-#include <asm/mach-types.h>
-
-/*
- * SA1100 GPIO edge detection for IRQs:
- * IRQs are generated on Falling-Edge, Rising-Edge, or both.
- * This must be called *before* the appropriate IRQ is registered.
- * Use this instead of directly setting GRER/GFER.
- */
-
-int GPIO_IRQ_rising_edge;
-int GPIO_IRQ_falling_edge;
-
-void set_GPIO_IRQ_edge( int gpio_mask, int edge )
-{
-	if( edge & GPIO_FALLING_EDGE )
-		GPIO_IRQ_falling_edge |= gpio_mask;
-	else
-		GPIO_IRQ_falling_edge &= ~gpio_mask;
-	if( edge & GPIO_RISING_EDGE )
-		GPIO_IRQ_rising_edge |= gpio_mask;
-	else
-		GPIO_IRQ_rising_edge &= ~gpio_mask;
-}
-
-EXPORT_SYMBOL(set_GPIO_IRQ_edge);
-
-
-#ifdef CONFIG_SA1100_ASSABET
-
-unsigned long BCR_value = BCR_DB1110;
-unsigned long SCR_value = SCR_INIT;
-EXPORT_SYMBOL(BCR_value);
-EXPORT_SYMBOL(SCR_value);
-
-/*
- * Read System Configuration "Register"
- * (taken from "Intel StrongARM SA-1110 Microprocessor Development Board
- * User's Guide", section 4.4.1)
- *
- * This same scan is performed in arch/arm/boot/compressed/head-sa1100.S
- * to set up the serial port for decompression status messages. We 
- * repeat it here because the kernel may not be loaded as a zImage, and
- * also because it's a hassle to communicate the SCR value to the kernel
- * from the decompressor.
- */
-
-void __init get_assabet_scr(void)
-{
-	unsigned long flags, scr, i;
-
-	local_irq_save(flags);
-	GPDR |= 0x3fc;			/* Configure GPIO 9:2 as outputs */
-	GPSR = 0x3fc;			/* Write 0xFF to GPIO 9:2 */
-	GPDR &= ~(0x3fc);		/* Configure GPIO 9:2 as inputs */
-	for(i = 100; i--; scr = GPLR);	/* Read GPIO 9:2 */
-	GPDR |= 0x3fc;			/*  restore correct pin direction */
-	local_irq_restore(flags);
-	scr &= 0x3fc;			/* save as system configuration byte. */
-
-	SCR_value = scr;
-}
-
-#endif  /* CONFIG_SA1100_ASSABET */
-
-
-#if defined(CONFIG_SA1100_BITSY)
-/*
- * Bitsy has extended, write-only memory-mapped GPIO's
- */
-static int bitsy_egpio = EGPIO_BITSY_RS232_ON;
-void clr_bitsy_egpio(unsigned long x) 
-{
-  bitsy_egpio &= ~x;
-  BITSY_EGPIO = bitsy_egpio;
-}
-void set_bitsy_egpio(unsigned long x) 
-{
-  bitsy_egpio |= x;
-  BITSY_EGPIO = bitsy_egpio;
-}
-EXPORT_SYMBOL(clr_bitsy_egpio);
-EXPORT_SYMBOL(set_bitsy_egpio);
-#endif
-
-
-#ifdef CONFIG_SA1111
-
-static void __init sa1111_init(void){
-  unsigned long id=SKID;
-
-  if((id & SKID_ID_MASK) == SKID_SA1111_ID)
-    printk(KERN_INFO "SA-1111 Microprocessor Companion Chip: "
-	   "silicon revision %x, metal revision %x\n",
-	   (id & SKID_SIREV_MASK)>>4, (id & SKID_MTREV_MASK));
-  else {
-    printk(KERN_ERR "Could not detect SA-1111!\n");
-    return;
-  }
-
-  /* First, set up the 3.6864MHz clock on GPIO 27 for the SA-1111:
-   * (SA-1110 Developer's Manual, section 9.1.2.1)
-   */
-  GAFR |= GPIO_32_768kHz;
-  GPDR |= GPIO_32_768kHz;
-  TUCR = TUCR_3_6864MHz;
-
-  /* Now, set up the PLL and RCLK in the SA-1111: */
-  SKCR = SKCR_PLL_BYPASS | SKCR_RDYEN | SKCR_OE_EN;
-  udelay(100);
-  SKCR = SKCR_PLL_BYPASS | SKCR_RCLKEN | SKCR_RDYEN | SKCR_OE_EN;
-
-  /* SA-1111 Register Access Bus should now be available. Clocks for
-   * any other SA-1111 functional blocks must be enabled separately
-   * using the SKPCR.
-   */
-
-  /* If the system is going to use the SA-1111 DMA engines, set up
-   * the memory bus request/grant pins. Also configure the shared
-   * memory controller on the SA-1111 (SA-1111 Developer's Manual,
-   * section 3.2.3) and power up the DMA bus clock:
-   */
-  if(machine_is_assabet()){
-
-    GAFR |= (GPIO_MBGNT | GPIO_MBREQ);
-    GPDR |= GPIO_MBGNT;
-    GPDR &= ~GPIO_MBREQ;
-    TUCR |= TUCR_MR;
-
-    /* Assabet is populated by default with two Samsung KM416S8030T-G8
-     * 128Mb SDRAMs, which are organized as 12-bit (row addr) x 9-bit
-     * (column addr), according to the data sheet. Apparently, the 
-     * bank selects factor into the row address, as Angel sets up the
-     * SA-1110 to use 14x9 addresses. The SDRAM datasheet specifies
-     * that when running at 100-125MHz, the CAS latency for -8 parts
-     * is 3 cycles, which is consistent with Angel.
-     */
-
-    SMCR = (SMCR_DTIM | SMCR_MBGE | 
-	    FInsrt(FExtr(MDCNFG, MDCNFG_SA1110_DRAC0), SMCR_DRAC) |
-	    ((FExtr(MDCNFG, MDCNFG_SA1110_TDL0)==3) ? SMCR_CLAT : 0));
-
-    SKPCR |= SKPCR_DCLKEN;
-  }
-}
-
-#else
-#define sa1111_init()  printk( "Warning: missing SA1111 support\n" )
-#endif
-
-
-static int __init hw_sa1100_init(void)
-{
-	if( machine_is_assabet() ){
-		if(machine_has_neponset()){
-#ifdef CONFIG_ASSABET_NEPONSET
-			LEDS = WHOAMI;
-			sa1111_init();
-#else
-			printk( "Warning: Neponset detected but full support "
-				"hasn't been configured in the kernel\n" );
-#endif
-		}
-	} else if (machine_is_xp860()) {
-		sa1111_init();
-	}
-	return 0;
-}
-
-module_init(hw_sa1100_init);
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/irq.c linux/arch/arm/mach-sa1100/irq.c
--- v2.4.8/linux/arch/arm/mach-sa1100/irq.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-sa1100/irq.c	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,230 @@
+/*
+ * linux/arch/arm/mach-sa1100/irq.c
+ *
+ * Copyright (C) 1999-2001 Nicolas Pitre
+ *
+ * Generic IRQ handling for the SA11x0, GPIO 11-27 IRQ demultiplexing.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/config.h>
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/sched.h>
+#include <linux/interrupt.h>
+#include <linux/ptrace.h>
+
+#include <asm/hardware.h>
+#include <asm/irq.h>
+#include <asm/mach/irq.h>
+#include <asm/arch/irq.h>
+
+#include "generic.h"
+
+
+/*
+ * SA1100 GPIO edge detection for IRQs:
+ * IRQs are generated on Falling-Edge, Rising-Edge, or both.
+ * This must be called *before* the appropriate IRQ is registered.
+ * Use this instead of directly setting GRER/GFER.
+ */
+
+static int GPIO_IRQ_rising_edge;
+static int GPIO_IRQ_falling_edge;
+
+void set_GPIO_IRQ_edge( int gpio_mask, int edge )
+{
+	if (edge & GPIO_FALLING_EDGE)
+		GPIO_IRQ_falling_edge |= gpio_mask;
+	else
+		GPIO_IRQ_falling_edge &= ~gpio_mask;
+	if (edge & GPIO_RISING_EDGE)
+		GPIO_IRQ_rising_edge |= gpio_mask;
+	else
+		GPIO_IRQ_rising_edge &= ~gpio_mask;
+}
+
+EXPORT_SYMBOL(set_GPIO_IRQ_edge);
+
+
+/*
+ * We don't need to ACK IRQs on the SA1100 unless they're GPIOs
+ * this is for internal IRQs i.e. from 11 to 31.
+ */
+
+static void sa1100_mask_irq(unsigned int irq)
+{
+	ICMR &= ~(1 << irq);
+}
+
+static void sa1100_unmask_irq(unsigned int irq)
+{
+	ICMR |= (1 << irq);
+}
+
+/*
+ * GPIO IRQs must be acknoledged.  This is for IRQs from 0 to 10.
+ */
+
+static void sa1100_mask_and_ack_GPIO0_10_irq(unsigned int irq)
+{
+	ICMR &= ~(1 << irq);
+	GEDR = (1 << irq);
+}
+
+static void sa1100_mask_GPIO0_10_irq(unsigned int irq)
+{
+	ICMR &= ~(1 << irq);
+}
+
+static void sa1100_unmask_GPIO0_10_irq(unsigned int irq)
+{
+	GRER = (GRER & ~(1 << irq)) | (GPIO_IRQ_rising_edge & (1 << irq));
+	GFER = (GFER & ~(1 << irq)) | (GPIO_IRQ_falling_edge & (1 << irq));
+	ICMR |= (1 << irq);
+}
+
+/*
+ * Install handler for GPIO 11-27 edge detect interrupts
+ */
+
+static int GPIO_11_27_enabled;		/* enabled i.e. unmasked GPIO IRQs */
+static int GPIO_11_27_spurious;		/* GPIOs that triggered when masked */
+
+static void sa1100_GPIO11_27_demux(int irq, void *dev_id,
+				   struct pt_regs *regs)
+{
+	int i, spurious;
+
+	while ((irq = (GEDR & 0xfffff800))) {
+		/*
+		 * We don't want to clear GRER/GFER when the corresponding
+		 * IRQ is masked because we could miss a level transition
+		 * i.e. an IRQ which need servicing as soon as it is
+		 * unmasked.  However, such situation should happen only
+		 * during the loop below.  Thus all IRQs which aren't
+		 * enabled at this point are considered spurious.  Those
+		 * are cleared but only de-activated if they happen twice.
+		 */
+		spurious = irq & ~GPIO_11_27_enabled;
+		if (spurious) {
+			GEDR = spurious;
+			GRER &= ~(spurious & GPIO_11_27_spurious);
+			GFER &= ~(spurious & GPIO_11_27_spurious);
+			GPIO_11_27_spurious |= spurious;
+			irq ^= spurious;
+			if (!irq) continue;
+		}
+
+		for (i = 11; i <= 27; ++i) {
+			if (irq & (1<<i)) {
+				do_IRQ (IRQ_GPIO_11_27(i), regs);
+			}
+		}
+	}
+}
+
+static struct irqaction GPIO11_27_irq = {
+	name:		"GPIO 11-27",
+	handler:	sa1100_GPIO11_27_demux,
+	flags:		SA_INTERRUPT
+};
+
+static void sa1100_mask_and_ack_GPIO11_27_irq(unsigned int irq)
+{
+	int mask = (1 << GPIO_11_27_IRQ(irq));
+	GPIO_11_27_spurious &= ~mask;
+	GPIO_11_27_enabled &= ~mask;
+	GEDR = mask;
+}
+
+static void sa1100_mask_GPIO11_27_irq(unsigned int irq)
+{
+	int mask = (1 << GPIO_11_27_IRQ(irq));
+	GPIO_11_27_spurious &= ~mask;
+	GPIO_11_27_enabled &= ~mask;
+}
+
+static void sa1100_unmask_GPIO11_27_irq(unsigned int irq)
+{
+	int mask = (1 << GPIO_11_27_IRQ(irq));
+	if (GPIO_11_27_spurious & mask) {
+		/*
+		 * We don't want to miss an interrupt that would have occurred
+		 * while it was masked.  Simulate it if it is the case.
+		 */
+		int state = GPLR;
+		if (((state & GPIO_IRQ_rising_edge) |
+		     (~state & GPIO_IRQ_falling_edge)) & mask)
+		{
+			/* just in case it gets referenced: */
+			struct pt_regs dummy;
+
+			memzero(&dummy, sizeof(dummy));
+			do_IRQ(irq, &dummy);
+
+			/* we are being called recursively from do_IRQ() */
+			return;
+		}
+	}
+	GPIO_11_27_enabled |= mask;
+	GRER = (GRER & ~mask) | (GPIO_IRQ_rising_edge & mask);
+	GFER = (GFER & ~mask) | (GPIO_IRQ_falling_edge & mask);
+}
+
+
+void __init sa1100_init_irq(void)
+{
+	int irq;
+
+	/* disable all IRQs */
+	ICMR = 0;
+
+	/* all IRQs are IRQ, not FIQ */
+	ICLR = 0;
+
+	/* clear all GPIO edge detects */
+	GFER = 0;
+	GRER = 0;
+	GEDR = -1;
+
+	/*
+	 * Whatever the doc says, this has to be set for the wait-on-irq
+	 * instruction to work... on a SA1100 rev 9 at least.
+	 */
+	ICCR = 1;
+
+	for (irq = 0; irq <= 10; irq++) {
+		irq_desc[irq].valid	= 1;
+		irq_desc[irq].probe_ok	= 1;
+		irq_desc[irq].mask_ack	= sa1100_mask_and_ack_GPIO0_10_irq;
+		irq_desc[irq].mask	= sa1100_mask_GPIO0_10_irq;
+		irq_desc[irq].unmask	= sa1100_unmask_GPIO0_10_irq;
+	}
+
+	for (irq = 11; irq <= 31; irq++) {
+		irq_desc[irq].valid	= 1;
+		irq_desc[irq].probe_ok	= 0;
+		irq_desc[irq].mask_ack	= sa1100_mask_irq;
+		irq_desc[irq].mask	= sa1100_mask_irq;
+		irq_desc[irq].unmask	= sa1100_unmask_irq;
+	}
+
+	for (irq = 32; irq <= 48; irq++) {
+		irq_desc[irq].valid	= 1;
+		irq_desc[irq].probe_ok	= 1;
+		irq_desc[irq].mask_ack	= sa1100_mask_and_ack_GPIO11_27_irq;
+		irq_desc[irq].mask	= sa1100_mask_GPIO11_27_irq;
+		irq_desc[irq].unmask	= sa1100_unmask_GPIO11_27_irq;
+	}
+	setup_arm_irq( IRQ_GPIO11_27, &GPIO11_27_irq );
+
+	/*
+	 * We generally don't want the LCD IRQ being
+	 * enabled as soon as we request it.
+	 */
+	irq_desc[IRQ_LCD].noautoenable = 1;
+}
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/itsy.c linux/arch/arm/mach-sa1100/itsy.c
--- v2.4.8/linux/arch/arm/mach-sa1100/itsy.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-sa1100/itsy.c	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,55 @@
+/*
+ * linux/arch/arm/mach-sa1100/itsy.c
+ */
+
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/tty.h>
+
+#include <asm/hardware.h>
+#include <asm/setup.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach/serial_sa1100.h>
+
+#include "generic.h"
+
+
+static void __init
+fixup_itsy(struct machine_desc *desc, struct param_struct *params,
+	   char **cmdline, struct meminfo *mi)
+{
+	SET_BANK( 0, 0xc0000000, 16*1024*1024 );
+	SET_BANK( 1, 0xc8000000, 16*1024*1024 );
+	SET_BANK( 2, 0xd0000000, 16*1024*1024 );
+	SET_BANK( 3, 0xd8000000, 16*1024*1024 );
+	mi->nr_banks = 4;
+}
+
+/* BRADFIXME The egpio addresses aren't verifiably correct. (i.e. they're most
+   likely wrong. */
+static struct map_desc itsy_io_desc[] __initdata = {
+ /* virtual     physical    length      domain     r  w  c  b */
+  { 0xe8000000, 0x00000000, 0x02000000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 0 */
+  { 0xf0000000, 0x49000000, 0x01000000, DOMAIN_IO, 1, 1, 0, 0 }, /* EGPIO 0 */
+  LAST_DESC
+};
+
+static void __init itsy_map_io(void)
+{
+	sa1100_map_io();
+	iotable_init(itsy_io_desc);
+
+	sa1100_register_uart(0, 3);
+	sa1100_register_uart(1, 1);
+	sa1100_register_uart(2, 2);
+}
+
+MACHINE_START(ITSY, "Compaq Itsy")
+	BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
+	BOOT_PARAMS(0xc0000100)
+	FIXUP(fixup_itsy)
+	MAPIO(itsy_map_io)
+	INITIRQ(sa1100_init_irq)
+MACHINE_END
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/jornada720.c linux/arch/arm/mach-sa1100/jornada720.c
--- v2.4.8/linux/arch/arm/mach-sa1100/jornada720.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-sa1100/jornada720.c	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,89 @@
+/*
+ * linux/arch/arm/mach-sa1100/jornada720.c
+ */
+
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/tty.h>
+#include <linux/delay.h>
+
+#include <asm/hardware.h>
+#include <asm/setup.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach/serial_sa1100.h>
+
+#include "generic.h"
+#include "sa1111.h"
+
+
+#define JORTUCR_VAL	0x20000400
+#define JORSKCR_INIT	0x00002081	/* Turn off VCO to enable PLL, set Ready En and enable nOE assertion from DC */
+#define JORSKCR_RCLK	0x00002083	/* Add turning on RCLK to above */
+#define JORSKCR_VAL	0x0000001B	/* sets the 1101 control register to on */
+
+static int __init jornada720_init(void)
+{
+	GPDR |= GPIO_GPIO20;
+	TUCR = JORTUCR_VAL;	/* set the oscillator out to the SA-1101 */
+
+	GPSR = GPIO_GPIO20;
+	udelay(1);
+	GPCR = GPIO_GPIO20;
+	udelay(1);
+	GPSR = GPIO_GPIO20;
+	udelay(20);
+	SKCR = JORSKCR_INIT;	/* Turn on the PLL, enable Ready and enable nOE assertion from DC */
+	mdelay(100);
+
+	SKCR = JORSKCR_RCLK;	/* turn on the RCLOCK */
+	SMCR = 0x35;	/* initialize the SMC (debug SA-1111 reset */
+	PCCR = 0;	/* initialize the S2MC (debug SA-1111 reset) */
+
+	/* LDD4 is speaker, LDD3 is microphone */
+	PPSR &= ~(PPC_LDD3 | PPC_LDD4);
+	PPDR |= PPC_LDD3 | PPC_LDD4;
+
+	/* initialize extra IRQs */
+	sa1111_init_irq(1);	/* chained on GPIO 1 */
+
+	sa1100_register_uart(0, 3);
+	sa1100_register_uart(1, 1);
+
+	return 0;
+}
+
+__initcall(jornada720_init);
+
+
+static void __init
+fixup_jornada720(struct machine_desc *desc, struct param_struct *params,
+		 char **cmdline, struct meminfo *mi)
+{
+	SET_BANK( 0, 0xc0000000, 32*1024*1024 );
+	mi->nr_banks = 1;
+}
+
+static struct map_desc jornada720_io_desc[] __initdata = {
+ /* virtual     physical    length      domain     r  w  c  b */
+  { 0xe8000000, 0x00000000, 0x02000000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 0 */
+  { 0xf0000000, 0x48000000, 0x00100000, DOMAIN_IO, 1, 1, 0, 0 }, /* Epson registers */
+  { 0xf1000000, 0x48200000, 0x00100000, DOMAIN_IO, 1, 1, 0, 0 }, /* Epson frame buffer */
+  { 0xf4000000, 0x40000000, 0x00100000, DOMAIN_IO, 1, 1, 0, 0 }, /* SA-1111 */
+  LAST_DESC
+};
+
+static void __init jornada720_map_io(void)
+{
+	sa1100_map_io();
+	iotable_init(jornada720_io_desc);
+}
+
+MACHINE_START(JORNADA720, "HP Jornada 720")
+	BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
+	BOOT_PARAMS(0xc0000100)
+	FIXUP(fixup_jornada720)
+	MAPIO(jornada720_map_io)
+	INITIRQ(sa1100_init_irq)
+MACHINE_END
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/lart.c linux/arch/arm/mach-sa1100/lart.c
--- v2.4.8/linux/arch/arm/mach-sa1100/lart.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-sa1100/lart.c	Sun Aug 12 17:36:24 2001
@@ -0,0 +1,45 @@
+/*
+ * linux/arch/arm/mach-sa1100/lart.c
+ */
+
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/tty.h>
+
+#include <asm/hardware.h>
+#include <asm/setup.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach/serial_sa1100.h>
+
+#include "generic.h"
+
+
+static struct map_desc lart_io_desc[] __initdata = {
+ /* virtual     physical    length      domain     r  w  c  b */
+  { 0xe8000000, 0x00000000, 0x00400000, DOMAIN_IO, 1, 1, 0, 0 }, /* main flash memory */
+  { 0xec000000, 0x08000000, 0x00400000, DOMAIN_IO, 1, 1, 0, 0 }, /* main flash, alternative location */
+  LAST_DESC
+};
+
+static void __init lart_map_io(void)
+{
+	sa1100_map_io();
+	iotable_init(lart_io_desc);
+
+	sa1100_register_uart(0, 3);
+	sa1100_register_uart(1, 1);
+	sa1100_register_uart(2, 2);
+	GAFR |= (GPIO_UART_TXD | GPIO_UART_RXD);
+	GPDR |= GPIO_UART_TXD;
+	GPDR &= ~GPIO_UART_RXD;
+	PPAR |= PPAR_UPR;
+}
+
+MACHINE_START(LART, "LART")
+	BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
+	BOOT_PARAMS(0xc0000100)
+	MAPIO(lart_map_io)
+	INITIRQ(sa1100_init_irq)
+MACHINE_END
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/leds-assabet.c linux/arch/arm/mach-sa1100/leds-assabet.c
--- v2.4.8/linux/arch/arm/mach-sa1100/leds-assabet.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-sa1100/leds-assabet.c	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,112 @@
+/*
+ * linux/arch/arm/mach-sa1100/leds-assabet.c
+ *
+ * Copyright (C) 2000 John Dorsey <john+@cs.cmu.edu>
+ *
+ * Original (leds-footbridge.c) by Russell King
+ *
+ * Assabet uses the LEDs as follows:
+ *   - Green - toggles state every 50 timer interrupts
+ *   - Red   - on if system is not idle
+ */
+#include <linux/config.h>
+#include <linux/init.h>
+
+#include <asm/hardware.h>
+#include <asm/leds.h>
+#include <asm/system.h>
+
+#include "leds.h"
+
+
+#define LED_STATE_ENABLED	1
+#define LED_STATE_CLAIMED	2
+
+static unsigned int led_state;
+static unsigned int hw_led_state;
+
+#define BCR_LED_MASK	(BCR_LED_GREEN | BCR_LED_RED)
+
+void assabet_leds_event(led_event_t evt)
+{
+	unsigned long flags;
+
+	local_irq_save(flags);
+
+	switch (evt) {
+	case led_start:
+		hw_led_state = BCR_LED_RED | BCR_LED_GREEN;
+		led_state = LED_STATE_ENABLED;
+		break;
+
+	case led_stop:
+		led_state &= ~LED_STATE_ENABLED;
+		break;
+
+	case led_claim:
+		led_state |= LED_STATE_CLAIMED;
+		hw_led_state = BCR_LED_RED | BCR_LED_GREEN;
+		break;
+
+	case led_release:
+		led_state &= ~LED_STATE_CLAIMED;
+		hw_led_state = BCR_LED_RED | BCR_LED_GREEN;
+		break;
+
+#ifdef CONFIG_LEDS_TIMER
+	case led_timer:
+		if (!(led_state & LED_STATE_CLAIMED))
+			hw_led_state ^= BCR_LED_GREEN;
+		break;
+#endif
+
+#ifdef CONFIG_LEDS_CPU
+	case led_idle_start:
+		if (!(led_state & LED_STATE_CLAIMED))
+			hw_led_state |= BCR_LED_RED;
+		break;
+
+	case led_idle_end:
+		if (!(led_state & LED_STATE_CLAIMED))
+			hw_led_state &= ~BCR_LED_RED;
+		break;
+#endif
+
+	case led_halted:
+		break;
+
+	case led_green_on:
+		if (led_state & LED_STATE_CLAIMED)
+			hw_led_state &= ~BCR_LED_GREEN;
+		break;
+
+	case led_green_off:
+		if (led_state & LED_STATE_CLAIMED)
+			hw_led_state |= BCR_LED_GREEN;
+		break;
+
+	case led_amber_on:
+		break;
+
+	case led_amber_off:
+		break;
+
+	case led_red_on:
+		if (led_state & LED_STATE_CLAIMED)
+			hw_led_state &= ~BCR_LED_RED;
+		break;
+
+	case led_red_off:
+		if (led_state & LED_STATE_CLAIMED)
+			hw_led_state |= BCR_LED_RED;
+		break;
+
+	default:
+		break;
+	}
+
+	if  (led_state & LED_STATE_ENABLED)
+		BCR = BCR_value = (BCR_value & ~BCR_LED_MASK) | hw_led_state;
+
+	local_irq_restore(flags);
+}
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/leds-brutus.c linux/arch/arm/mach-sa1100/leds-brutus.c
--- v2.4.8/linux/arch/arm/mach-sa1100/leds-brutus.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-sa1100/leds-brutus.c	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,111 @@
+/*
+ * linux/arch/arm/mach-sa1100/leds-brutus.c
+ *
+ * Copyright (C) 2000 Nicolas Pitre
+ *
+ * Brutus uses the LEDs as follows:
+ *   - D3 (Green, GPIO9) - toggles state every 50 timer interrupts
+ *   - D17 (Red, GPIO20) - on if system is not idle
+ *   - D4 (Green, GPIO8) - misc function
+ */
+#include <linux/config.h>
+#include <linux/init.h>
+
+#include <asm/hardware.h>
+#include <asm/leds.h>
+#include <asm/system.h>
+
+#include "leds.h"
+
+
+#define LED_STATE_ENABLED	1
+#define LED_STATE_CLAIMED	2
+
+static unsigned int led_state;
+static unsigned int hw_led_state;
+
+#define LED_D3		GPIO_GPIO(9)
+#define LED_D4		GPIO_GPIO(8)
+#define LED_D17		GPIO_GPIO(20)
+#define LED_MASK	(LED_D3|LED_D4|LED_D17)
+
+void brutus_leds_event(led_event_t evt)
+{
+	unsigned long flags;
+
+	local_irq_save(flags);
+
+	switch (evt) {
+	case led_start:
+		hw_led_state = LED_MASK;
+		led_state = LED_STATE_ENABLED;
+		break;
+
+	case led_stop:
+		led_state &= ~LED_STATE_ENABLED;
+		break;
+
+	case led_claim:
+		led_state |= LED_STATE_CLAIMED;
+		hw_led_state = LED_MASK;
+		break;
+
+	case led_release:
+		led_state &= ~LED_STATE_CLAIMED;
+		hw_led_state = LED_MASK;
+		break;
+
+#ifdef CONFIG_LEDS_TIMER
+	case led_timer:
+		if (!(led_state & LED_STATE_CLAIMED))
+			hw_led_state ^= LED_D3;
+		break;
+#endif
+
+#ifdef CONFIG_LEDS_CPU
+	case led_idle_start:
+		if (!(led_state & LED_STATE_CLAIMED))
+			hw_led_state |= LED_D17;
+		break;
+
+	case led_idle_end:
+		if (!(led_state & LED_STATE_CLAIMED))
+			hw_led_state &= ~LED_D17;
+		break;
+#endif
+
+	case led_green_on:
+		hw_led_state &= ~LED_D4;
+		break;
+
+	case led_green_off:
+		hw_led_state |= LED_D4;
+		break;
+
+	case led_amber_on:
+		break;
+
+	case led_amber_off:
+		break;
+
+	case led_red_on:
+		if (led_state & LED_STATE_CLAIMED)
+			hw_led_state &= ~LED_D17;
+		break;
+
+	case led_red_off:
+		if (led_state & LED_STATE_CLAIMED)
+			hw_led_state |= LED_D17;
+		break;
+
+	default:
+		break;
+	}
+
+	if  (led_state & LED_STATE_ENABLED) {
+		GPSR = hw_led_state;
+		GPCR = hw_led_state ^ LED_MASK;
+	}
+
+	local_irq_restore(flags);
+}
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/leds-cerf.c linux/arch/arm/mach-sa1100/leds-cerf.c
--- v2.4.8/linux/arch/arm/mach-sa1100/leds-cerf.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-sa1100/leds-cerf.c	Sun Aug 12 17:36:24 2001
@@ -0,0 +1,111 @@
+/*
+ * linux/arch/arm/mach-sa1100/leds-cerf.c
+ *
+ * Author: ???
+ */
+#include <linux/config.h>
+#include <linux/init.h>
+
+#include <asm/hardware.h>
+#include <asm/leds.h>
+#include <asm/system.h>
+
+#include "leds.h"
+
+
+#define LED_STATE_ENABLED	1
+#define LED_STATE_CLAIMED	2
+
+static unsigned int led_state;
+static unsigned int hw_led_state;
+
+#define LED_D0          GPIO_GPIO(0)
+#define LED_D1          GPIO_GPIO(1)
+#define LED_D2          GPIO_GPIO(2)
+#define LED_D3          GPIO_GPIO(3)
+#define LED_MASK        (LED_D0|LED_D1|LED_D2|LED_D3)
+
+void cerf_leds_event(led_event_t evt)
+{
+        unsigned long flags;
+
+	local_irq_save(flags);
+
+        switch (evt) {
+        case led_start:
+                hw_led_state = LED_MASK;
+                led_state = LED_STATE_ENABLED;
+                break;
+
+        case led_stop:
+                led_state &= ~LED_STATE_ENABLED;
+                break;
+
+        case led_claim:
+                led_state |= LED_STATE_CLAIMED;
+                hw_led_state = LED_MASK;
+                break;
+        case led_release:
+                led_state &= ~LED_STATE_CLAIMED;
+                hw_led_state = LED_MASK;
+                break;
+
+#ifdef CONFIG_LEDS_TIMER
+        case led_timer:
+                if (!(led_state & LED_STATE_CLAIMED))
+                        hw_led_state ^= LED_D0;
+                break;
+#endif
+
+#ifdef CONFIG_LEDS_CPU
+        case led_idle_start:
+                if (!(led_state & LED_STATE_CLAIMED))
+                        hw_led_state &= ~LED_D1;
+                break;
+
+        case led_idle_end:
+                if (!(led_state & LED_STATE_CLAIMED))
+                        hw_led_state |= LED_D1;
+                break;
+#endif
+        case led_green_on:
+                if (!(led_state & LED_STATE_CLAIMED))
+                        hw_led_state &= ~LED_D2;
+                break;
+
+        case led_green_off:
+                if (!(led_state & LED_STATE_CLAIMED))
+                        hw_led_state |= LED_D2;
+                break;
+
+        case led_amber_on:
+                if (!(led_state & LED_STATE_CLAIMED))
+                        hw_led_state &= ~LED_D3;
+                break;
+
+        case led_amber_off:
+                if (!(led_state & LED_STATE_CLAIMED))
+                        hw_led_state |= LED_D3;
+                break;
+
+        case led_red_on:
+                if (!(led_state & LED_STATE_CLAIMED))
+                        hw_led_state &= ~LED_D1;
+                break;
+
+        case led_red_off:
+                if (!(led_state & LED_STATE_CLAIMED))
+                        hw_led_state |= LED_D1;
+                break;
+
+        default:
+                break;
+        }
+
+        if  (led_state & LED_STATE_ENABLED) {
+                GPSR = hw_led_state;
+                GPCR = hw_led_state ^ LED_MASK;
+        }
+
+	local_irq_restore(flags);
+}
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/leds-flexanet.c linux/arch/arm/mach-sa1100/leds-flexanet.c
--- v2.4.8/linux/arch/arm/mach-sa1100/leds-flexanet.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-sa1100/leds-flexanet.c	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,129 @@
+/*
+ * linux/arch/arm/mach-sa1100/leds-flexanet.c
+ *
+ * by Jordi Colomer <jco@ict.es>
+ *
+ * Flexanet LEDs
+ *
+ *   - Red   - toggles state every 50 timer interrupts (Heartbeat)
+ *   - Green - on if system is not idle (CPU load)
+ */
+#include <linux/config.h>
+#include <linux/init.h>
+
+#include <asm/hardware.h>
+#include <asm/leds.h>
+#include <asm/system.h>
+
+#include "leds.h"
+
+
+#define LED_STATE_ENABLED	1
+#define LED_STATE_CLAIMED	2
+
+static unsigned int led_state;
+static unsigned int hw_led_bcr;
+static unsigned int hw_led_gpio;
+
+
+void flexanet_leds_event(led_event_t evt)
+{
+	unsigned long flags;
+
+	local_irq_save(flags);
+
+	switch (evt) {
+	case led_start:
+		/* start using LEDs and enable its hardware */
+		hw_led_bcr = BCR_LED_GREEN;
+		hw_led_gpio = GPIO_LED_RED;
+		led_state = LED_STATE_ENABLED;
+		break;
+
+	case led_stop:
+		/* disable LED h/w */
+		led_state &= ~LED_STATE_ENABLED;
+		break;
+
+	case led_claim:
+		/* select LEDs for direct access */
+		led_state |= LED_STATE_CLAIMED;
+		hw_led_bcr = 0;
+		hw_led_gpio = 0;
+		break;
+
+	case led_release:
+		/* release LEDs from direct access */
+		led_state &= ~LED_STATE_CLAIMED;
+		hw_led_bcr = 0;
+		hw_led_gpio = 0;
+		break;
+
+#ifdef CONFIG_LEDS_TIMER
+	case led_timer:
+		/* toggle heartbeat LED */
+		if (!(led_state & LED_STATE_CLAIMED))
+			hw_led_gpio ^= GPIO_LED_RED;
+		break;
+#endif
+
+#ifdef CONFIG_LEDS_CPU
+	case led_idle_start:
+		/* turn off CPU load LED */
+		if (!(led_state & LED_STATE_CLAIMED))
+			hw_led_bcr &= ~BCR_LED_GREEN;
+		break;
+
+	case led_idle_end:
+		/* turn on CPU load LED */
+		if (!(led_state & LED_STATE_CLAIMED))
+			hw_led_bcr |= BCR_LED_GREEN;
+		break;
+#endif
+
+	case led_halted:
+		break;
+
+
+	/* direct LED access (must be previously claimed) */
+	case led_green_on:
+		if (led_state & LED_STATE_CLAIMED)
+			hw_led_bcr |= BCR_LED_GREEN;
+		break;
+
+	case led_green_off:
+		if (led_state & LED_STATE_CLAIMED)
+			hw_led_bcr &= ~BCR_LED_GREEN;
+		break;
+
+	case led_amber_on:
+		break;
+
+	case led_amber_off:
+		break;
+
+	case led_red_on:
+		if (led_state & LED_STATE_CLAIMED)
+			hw_led_gpio |= GPIO_LED_RED;
+		break;
+
+	case led_red_off:
+		if (led_state & LED_STATE_CLAIMED)
+			hw_led_gpio &= ~GPIO_LED_RED;
+		break;
+
+	default:
+		break;
+	}
+
+	if  (led_state & LED_STATE_ENABLED)
+	{
+		/* update LEDs */
+		BCR = BCR_value = (BCR_value & ~BCR_LED_GREEN) | hw_led_bcr;
+		GPSR = hw_led_gpio;
+		GPCR = hw_led_gpio ^ GPIO_LED_RED;
+	}
+
+	local_irq_restore(flags);
+}
+
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/leds-graphicsclient.c linux/arch/arm/mach-sa1100/leds-graphicsclient.c
--- v2.4.8/linux/arch/arm/mach-sa1100/leds-graphicsclient.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-sa1100/leds-graphicsclient.c	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,104 @@
+/*
+ *  linux/arch/arm/mach-sa1100/leds-graphicsclient.c
+ *
+ * GraphicsClient Plus LEDs support
+ * Woojung Huh, Feb 13, 2001
+ */
+#include <linux/config.h>
+#include <linux/init.h>
+
+#include <asm/hardware.h>
+#include <asm/leds.h>
+#include <asm/system.h>
+
+#include "leds.h"
+
+
+#define LED_STATE_ENABLED	1
+#define LED_STATE_CLAIMED	2
+
+static unsigned int led_state;
+static unsigned int hw_led_state;
+
+#define LED_TIMER       ADS_LED0  /* green heartbeat */
+#define LED_USER        ADS_LED1  /* amber, boots to on */
+#define LED_IDLE        ADS_LED2  /* red has the idle led, if any */
+
+#define LED_MASK	(ADS_LED0|ADS_LED1|ADS_LED2)
+
+void graphicsclient_leds_event(led_event_t evt)
+{
+	unsigned long flags;
+
+	save_flags_cli(flags);
+
+	switch (evt) {
+	case led_start:
+		hw_led_state = 0;        /* gc leds are positive logic */
+		led_state = LED_STATE_ENABLED;
+		break;
+
+	case led_stop:
+		led_state &= ~LED_STATE_ENABLED;
+		break;
+
+	case led_claim:
+		led_state |= LED_STATE_CLAIMED;
+		hw_led_state = LED_MASK;
+		break;
+
+	case led_release:
+		led_state &= ~LED_STATE_CLAIMED;
+		hw_led_state = LED_MASK;
+		break;
+
+#ifdef CONFIG_LEDS_TIMER
+	case led_timer:
+		if (!(led_state & LED_STATE_CLAIMED))
+			hw_led_state ^= LED_TIMER;
+		break;
+#endif
+
+#ifdef CONFIG_LEDS_CPU
+	case led_idle_start:
+		if (!(led_state & LED_STATE_CLAIMED))
+			hw_led_state &= ~LED_IDLE;
+		break;
+
+	case led_idle_end:
+		if (!(led_state & LED_STATE_CLAIMED))
+			hw_led_state |= LED_IDLE;
+		break;
+#endif
+
+	case led_green_on:
+		break;
+
+	case led_green_off:
+		break;
+
+	case led_amber_on:
+		hw_led_state |= LED_USER;
+		break;
+
+	case led_amber_off:
+		hw_led_state &= ~LED_USER;
+		break;
+
+	case led_red_on:
+		break;
+
+	case led_red_off:
+		break;
+
+	default:
+		break;
+	}
+
+	if  (led_state & LED_STATE_ENABLED) {
+		GPSR = hw_led_state;
+		GPCR = hw_led_state ^ LED_MASK;
+	}
+
+	restore_flags(flags);
+}
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/leds-lart.c linux/arch/arm/mach-sa1100/leds-lart.c
--- v2.4.8/linux/arch/arm/mach-sa1100/leds-lart.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-sa1100/leds-lart.c	Sun Aug 12 17:36:24 2001
@@ -0,0 +1,102 @@
+/*
+ * linux/arch/arm/mach-sa1100/leds-lart.c
+ *
+ * (C) Erik Mouw (J.A.K.Mouw@its.tudelft.nl), April 21, 2000
+ *
+ * LART uses the LED as follows:
+ *   - GPIO23 is the LED, on if system is not idle
+ *  You can use both CONFIG_LEDS_CPU and CONFIG_LEDS_TIMER at the same
+ *  time, but in that case the timer events will still dictate the
+ *  pace of the LED.
+ */
+#include <linux/config.h>
+#include <linux/init.h>
+
+#include <asm/hardware.h>
+#include <asm/leds.h>
+#include <asm/system.h>
+
+#include "leds.h"
+
+
+#define LED_STATE_ENABLED	1
+#define LED_STATE_CLAIMED	2
+
+static unsigned int led_state;
+static unsigned int hw_led_state;
+
+#define LED_23    GPIO_GPIO23
+#define LED_MASK  (LED_23)
+
+void lart_leds_event(led_event_t evt)
+{
+	unsigned long flags;
+
+	local_irq_save(flags);
+
+	switch(evt) {
+	case led_start:
+		/* pin 23 is output pin */
+		GPDR |= LED_23;
+		hw_led_state = LED_MASK;
+		led_state = LED_STATE_ENABLED;
+		break;
+
+	case led_stop:
+		led_state &= ~LED_STATE_ENABLED;
+		break;
+
+	case led_claim:
+		led_state |= LED_STATE_CLAIMED;
+		hw_led_state = LED_MASK;
+		break;
+
+	case led_release:
+		led_state &= ~LED_STATE_CLAIMED;
+		hw_led_state = LED_MASK;
+		break;
+
+#ifdef CONFIG_LEDS_TIMER
+	case led_timer:
+		if (!(led_state & LED_STATE_CLAIMED))
+			hw_led_state ^= LED_23;
+		break;
+#endif
+
+#ifdef CONFIG_LEDS_CPU
+	case led_idle_start:
+		/* The LART people like the LED to be off when the
+                   system is idle... */
+		if (!(led_state & LED_STATE_CLAIMED))
+			hw_led_state &= ~LED_23;
+		break;
+
+	case led_idle_end:
+		/* ... and on if the system is not idle */
+		if (!(led_state & LED_STATE_CLAIMED))
+			hw_led_state |= LED_23;
+		break;
+#endif
+
+	case led_red_on:
+		if (led_state & LED_STATE_CLAIMED)
+			hw_led_state &= ~LED_23;
+		break;
+
+	case led_red_off:
+		if (led_state & LED_STATE_CLAIMED)
+			hw_led_state |= LED_23;
+		break;
+
+	default:
+		break;
+	}
+
+	/* Now set the GPIO state, or nothing will happen at all */
+	if (led_state & LED_STATE_ENABLED) {
+		GPSR = hw_led_state;
+		GPCR = hw_led_state ^ LED_MASK;
+	}
+
+	local_irq_restore(flags);
+}
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/leds-pfs168.c linux/arch/arm/mach-sa1100/leds-pfs168.c
--- v2.4.8/linux/arch/arm/mach-sa1100/leds-pfs168.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-sa1100/leds-pfs168.c	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,99 @@
+/*
+ * linux/arch/arm/mach-sa1100/leds-pfs168.c
+ *
+ * Author: George Davis <davis_g@mvista.com>
+ */
+#include <linux/config.h>
+#include <linux/init.h>
+
+#include <asm/hardware.h>
+#include <asm/leds.h>
+#include <asm/system.h>
+
+#include "leds.h"
+
+
+#define LED_STATE_ENABLED	1
+#define LED_STATE_CLAIMED	2
+
+static unsigned int led_state;
+static unsigned int hw_led_state;
+
+#define	LED_GREEN	(1)
+#define	LED_MASK	(1)
+
+void pfs168_leds_event(led_event_t evt)
+{
+	unsigned long flags;
+
+	local_irq_save(flags);
+
+	switch (evt) {
+	case led_start:
+		hw_led_state = LED_GREEN;
+		led_state = LED_STATE_ENABLED;
+		break;
+
+	case led_stop:
+		led_state &= ~LED_STATE_ENABLED;
+		break;
+
+	case led_claim:
+		led_state |= LED_STATE_CLAIMED;
+		hw_led_state = LED_GREEN;
+		break;
+
+	case led_release:
+		led_state &= ~LED_STATE_CLAIMED;
+		hw_led_state = LED_GREEN;
+		break;
+
+#ifdef CONFIG_LEDS_TIMER
+	case led_timer:
+		if (!(led_state & LED_STATE_CLAIMED))
+			hw_led_state ^= LED_GREEN;
+		break;
+#endif
+
+#ifdef CONFIG_LEDS_CPU
+	case led_idle_start:
+		break;
+
+	case led_idle_end:
+		break;
+#endif
+
+	case led_halted:
+		break;
+
+	case led_green_on:
+		if (led_state & LED_STATE_CLAIMED)
+			hw_led_state |= LED_GREEN;
+		break;
+
+	case led_green_off:
+		if (led_state & LED_STATE_CLAIMED)
+			hw_led_state &= ~LED_GREEN;
+		break;
+
+	case led_amber_on:
+		break;
+
+	case led_amber_off:
+		break;
+
+	case led_red_on:
+		break;
+
+	case led_red_off:
+		break;
+
+	default:
+		break;
+	}
+
+	if  (led_state & LED_STATE_ENABLED)
+		PFS168_SYSLED = (PFS168_SYSLED & ~LED_MASK) | hw_led_state;
+
+	local_irq_restore(flags);
+}
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/leds-simpad.c linux/arch/arm/mach-sa1100/leds-simpad.c
--- v2.4.8/linux/arch/arm/mach-sa1100/leds-simpad.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-sa1100/leds-simpad.c	Sun Aug 12 17:36:24 2001
@@ -0,0 +1,101 @@
+/*
+ * linux/arch/arm/mach-sa1100/leds-simpad.c
+ *
+ * Author: Juergen Messerer <juergen.messerer@siemens.ch>
+ */
+#include <linux/config.h>
+#include <linux/init.h>
+
+#include <asm/hardware.h>
+#include <asm/leds.h>
+#include <asm/system.h>
+
+#include "leds.h"
+
+
+#define LED_STATE_ENABLED	1
+#define LED_STATE_CLAIMED	2
+
+static unsigned int led_state;
+static unsigned int hw_led_state;
+
+#define	LED_GREEN	(1)
+#define	LED_MASK	(1)
+
+void simpad_leds_event(led_event_t evt)
+{
+	unsigned long flags;
+
+	//local_irq_save(flags);
+
+	switch (evt)
+	{
+	case led_start:
+	        hw_led_state = LED_GREEN;
+		led_state = LED_STATE_ENABLED;
+		break;
+
+	case led_stop:
+		led_state &= ~LED_STATE_ENABLED;
+		break;
+
+	case led_claim:
+		led_state |= LED_STATE_CLAIMED;
+		hw_led_state = LED_GREEN;
+		break;
+
+	case led_release:
+		led_state &= ~LED_STATE_CLAIMED;
+		hw_led_state = LED_GREEN;
+		break;
+
+#ifdef CONFIG_LEDS_TIMER
+	case led_timer:
+		if (!(led_state & LED_STATE_CLAIMED))
+			hw_led_state ^= LED_GREEN;
+		break;
+#endif
+
+#ifdef CONFIG_LEDS_CPU
+	case led_idle_start:
+		break;
+
+	case led_idle_end:
+		break;
+#endif
+
+	case led_halted:
+		break;
+
+	case led_green_on:
+		if (led_state & LED_STATE_CLAIMED)
+			hw_led_state |= LED_GREEN;
+		break;
+
+	case led_green_off:
+		if (led_state & LED_STATE_CLAIMED)
+			hw_led_state &= ~LED_GREEN;
+		break;
+
+	case led_amber_on:
+		break;
+
+	case led_amber_off:
+		break;
+
+	case led_red_on:
+		break;
+
+	case led_red_off:
+		break;
+
+	default:
+		break;
+	}
+
+	if  (led_state & LED_STATE_ENABLED)
+		cs3_shadow |= LED2_ON;
+
+	//local_irq_restore(flags);
+}
+
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/leds.c linux/arch/arm/mach-sa1100/leds.c
--- v2.4.8/linux/arch/arm/mach-sa1100/leds.c	Mon Sep 18 15:15:25 2000
+++ linux/arch/arm/mach-sa1100/leds.c	Sun Aug 12 11:13:59 2001
@@ -1,427 +1,36 @@
 /*
- *  linux/arch/arm/kernel/leds-sa1100.c
+ * linux/arch/arm/mach-sa1100/leds.c
  *
- *  Copyright (C) 2000 John Dorsey <john+@cs.cmu.edu>
- *
- *  Original (leds-footbridge.c) by Russell King
- *
- *  Added Brutus LEDs support
- *	Nicolas Pitre, Mar 19, 2000
- *
- *  Added LART LED support
- *      Erik Mouw (J.A.K.Mouw@its.tudelft.nl), April 21, 2000
- *
- *
- *  Assabet uses the LEDs as follows:
- *   - Green - toggles state every 50 timer interrupts
- *   - Red   - on if system is not idle
- *
- *  Brutus uses the LEDs as follows:
- *   - D3 (Green, GPIO9) - toggles state every 50 timer interrupts
- *   - D17 (Red, GPIO20) - on if system is not idle
- *   - D4 (Green, GPIO8) - misc function
- *
- *  LART uses the LED as follows:
- *   - GPIO23 is the LED, on if system is not idle
- *  You can use both CONFIG_LEDS_CPU and CONFIG_LEDS_TIMER at the same
- *  time, but in that case the timer events will still dictate the
- *  pace of the LED.
+ * SA1100 LEDs dispatcher
  * 
+ * Copyright (C) 2001 Nicolas Pitre
  */
 #include <linux/config.h>
-#include <linux/module.h>
-#include <linux/kernel.h>
 #include <linux/init.h>
-#include <linux/spinlock.h>
 
-#include <asm/hardware.h>
 #include <asm/leds.h>
 #include <asm/mach-types.h>
-#include <asm/system.h>
-
-
-#define LED_STATE_ENABLED	1
-#define LED_STATE_CLAIMED	2
-
-static unsigned int led_state;
-static unsigned int hw_led_state;
-
-
-#ifdef CONFIG_SA1100_ASSABET
-
-#define BCR_LED_MASK	(BCR_LED_GREEN | BCR_LED_RED)
-
-static void assabet_leds_event(led_event_t evt)
-{
-	unsigned long flags;
-
-	local_irq_save(flags);
-
-	switch (evt) {
-	case led_start:
-		hw_led_state = BCR_LED_RED | BCR_LED_GREEN;
-		led_state = LED_STATE_ENABLED;
-		break;
-
-	case led_stop:
-		led_state &= ~LED_STATE_ENABLED;
-		break;
-
-	case led_claim:
-		led_state |= LED_STATE_CLAIMED;
-		hw_led_state = BCR_LED_RED | BCR_LED_GREEN;
-		break;
-
-	case led_release:
-		led_state &= ~LED_STATE_CLAIMED;
-		hw_led_state = BCR_LED_RED | BCR_LED_GREEN;
-		break;
-
-#ifdef CONFIG_LEDS_TIMER
-	case led_timer:
-		if (!(led_state & LED_STATE_CLAIMED))
-			hw_led_state ^= BCR_LED_GREEN;
-		break;
-#endif
-
-#ifdef CONFIG_LEDS_CPU
-	case led_idle_start:
-		if (!(led_state & LED_STATE_CLAIMED))
-			hw_led_state |= BCR_LED_RED;
-		break;
-
-	case led_idle_end:
-		if (!(led_state & LED_STATE_CLAIMED))
-			hw_led_state &= ~BCR_LED_RED;
-		break;
-#endif
-
-	case led_halted:
-		break;
-
-	case led_green_on:
-		if (led_state & LED_STATE_CLAIMED)
-			hw_led_state &= ~BCR_LED_GREEN;
-		break;
-
-	case led_green_off:
-		if (led_state & LED_STATE_CLAIMED)
-			hw_led_state |= BCR_LED_GREEN;
-		break;
-
-	case led_amber_on:
-		break;
-
-	case led_amber_off:
-		break;
-
-	case led_red_on:
-		if (led_state & LED_STATE_CLAIMED)
-			hw_led_state &= ~BCR_LED_RED;
-		break;
-
-	case led_red_off:
-		if (led_state & LED_STATE_CLAIMED)
-			hw_led_state |= BCR_LED_RED;
-		break;
-
-	default:
-		break;
-	}
-
-	if  (led_state & LED_STATE_ENABLED)
-		BCR = BCR_value = (BCR_value & ~BCR_LED_MASK) | hw_led_state;
-
-	local_irq_restore(flags);
-}
-
-#endif /* CONFIG_SA1100_ASSABET */
-
-#ifdef CONFIG_SA1100_BRUTUS
-
-#define LED_D3		GPIO_GPIO(9)
-#define LED_D4		GPIO_GPIO(8)
-#define LED_D17		GPIO_GPIO(20)
-#define LED_MASK	(LED_D3|LED_D4|LED_D17)
-
-static void brutus_leds_event(led_event_t evt)
-{
-	unsigned long flags;
-
-	local_irq_save(flags);
-
-	switch (evt) {
-	case led_start:
-		hw_led_state = LED_MASK;
-		led_state = LED_STATE_ENABLED;
-		break;
-
-	case led_stop:
-		led_state &= ~LED_STATE_ENABLED;
-		break;
-
-	case led_claim:
-		led_state |= LED_STATE_CLAIMED;
-		hw_led_state = LED_MASK;
-		break;
-
-	case led_release:
-		led_state &= ~LED_STATE_CLAIMED;
-		hw_led_state = LED_MASK;
-		break;
-
-#ifdef CONFIG_LEDS_TIMER
-	case led_timer:
-		if (!(led_state & LED_STATE_CLAIMED))
-			hw_led_state ^= LED_D3;
-		break;
-#endif
-
-#ifdef CONFIG_LEDS_CPU
-	case led_idle_start:
-		if (!(led_state & LED_STATE_CLAIMED))
-			hw_led_state |= LED_D17;
-		break;
-
-	case led_idle_end:
-		if (!(led_state & LED_STATE_CLAIMED))
-			hw_led_state &= ~LED_D17;
-		break;
-#endif
-
-	case led_green_on:
-		hw_led_state &= ~LED_D4;
-		break;
 
-	case led_green_off:
-		hw_led_state |= LED_D4;
-		break;
-
-	case led_amber_on:
-		break;
-
-	case led_amber_off:
-		break;
-
-	case led_red_on:
-		if (led_state & LED_STATE_CLAIMED)
-			hw_led_state &= ~LED_D17;
-		break;
-
-	case led_red_off:
-		if (led_state & LED_STATE_CLAIMED)
-			hw_led_state |= LED_D17;
-		break;
-
-	default:
-		break;
-	}
-
-	if  (led_state & LED_STATE_ENABLED) {
-		GPSR = hw_led_state;
-		GPCR = hw_led_state ^ LED_MASK;
-	}
-
-	local_irq_restore(flags);
-}
-
-#endif /* CONFIG_SA1100_BRUTUS */
-
-#ifdef CONFIG_SA1100_LART
-
-#define LED_23    GPIO_GPIO23
-#define LED_MASK  (LED_23)
-
-
-static void lart_leds_event(led_event_t evt)
-{
-	unsigned long flags;
-
-	local_irq_save(flags);
-
-	switch(evt) {
-	case led_start:
-		hw_led_state = LED_MASK;
-		led_state = LED_STATE_ENABLED;
-		break;
-		
-	case led_stop:
-		led_state &= ~LED_STATE_ENABLED;
-		break;
-
-	case led_claim:
-		led_state |= LED_STATE_CLAIMED;
-		hw_led_state = LED_MASK;
-		break;
-
-	case led_release:
-		led_state &= ~LED_STATE_CLAIMED;
-		hw_led_state = LED_MASK;
-		break;
-
-#ifdef CONFIG_LEDS_TIMER
-	case led_timer:
-		if (!(led_state & LED_STATE_CLAIMED))
-			hw_led_state ^= LED_23;
-		break;
-#endif
-
-#ifdef CONFIG_LEDS_CPU
-	case led_idle_start:
-		/* The LART people like the LED to be off when the
-                   system is idle... */
-		if (!(led_state & LED_STATE_CLAIMED))
-			hw_led_state &= ~LED_23;
-		break;
-
-	case led_idle_end:
-		/* ... and on if the system is not idle */
-		if (!(led_state & LED_STATE_CLAIMED))
-			hw_led_state |= LED_23;
-		break;
-#endif
-
-	case led_red_on:
-		if (led_state & LED_STATE_CLAIMED)
-			hw_led_state &= ~LED_23;
-		break;
-
-	case led_red_off:
-		if (led_state & LED_STATE_CLAIMED)
-			hw_led_state |= LED_23;
-		break;
-
-	default:
-		break;
-	}
-
-	/* Now set the GPIO state, or nothing will happen at all */
-	if (led_state & LED_STATE_ENABLED) {
-		GPSR = hw_led_state;
-		GPCR = hw_led_state ^ LED_MASK;
-	}
-
-	local_irq_restore(flags);
-}
-
-#endif /* CONFIG_SA1100_LART */
-
-#ifdef CONFIG_SA1100_CERF
-#define LED_D0          GPIO_GPIO(0)
-#define LED_D1          GPIO_GPIO(1)
-#define LED_D2          GPIO_GPIO(2)
-#define LED_D3          GPIO_GPIO(3)
-#define LED_MASK        (LED_D0|LED_D1|LED_D2|LED_D3)
-
-static void cerf_leds_event(led_event_t evt)
-{
-        unsigned long flags;
-
-	local_irq_save(flags);
-
-        switch (evt) {
-        case led_start:
-                hw_led_state = LED_MASK;
-                led_state = LED_STATE_ENABLED;
-                break;
-
-        case led_stop:
-                led_state &= ~LED_STATE_ENABLED;
-                break;
-
-        case led_claim:
-                led_state |= LED_STATE_CLAIMED;
-                hw_led_state = LED_MASK;
-                break;
-        case led_release:
-                led_state &= ~LED_STATE_CLAIMED;
-                hw_led_state = LED_MASK;
-                break;
-
-#ifdef CONFIG_LEDS_TIMER
-        case led_timer:
-                if (!(led_state & LED_STATE_CLAIMED))
-                        hw_led_state ^= LED_D0;
-                break;
-#endif
-
-#ifdef CONFIG_LEDS_CPU
-        case led_idle_start:
-                if (!(led_state & LED_STATE_CLAIMED))
-                        hw_led_state &= ~LED_D1;
-                break;
-
-        case led_idle_end:
-                if (!(led_state & LED_STATE_CLAIMED))
-                        hw_led_state |= LED_D1;
-                break;
-#endif
-        case led_green_on:
-                if (!(led_state & LED_STATE_CLAIMED))
-                        hw_led_state &= ~LED_D2;
-                break;
-
-        case led_green_off:
-                if (!(led_state & LED_STATE_CLAIMED))
-                        hw_led_state |= LED_D2;
-                break;
-
-        case led_amber_on:
-                if (!(led_state & LED_STATE_CLAIMED))
-                        hw_led_state &= ~LED_D3;
-                break;
-
-        case led_amber_off:
-                if (!(led_state & LED_STATE_CLAIMED))
-                        hw_led_state |= LED_D3;
-                break;
-
-        case led_red_on:
-                if (!(led_state & LED_STATE_CLAIMED))
-                        hw_led_state &= ~LED_D1;
-                break;
-
-        case led_red_off:
-                if (!(led_state & LED_STATE_CLAIMED))
-                        hw_led_state |= LED_D1;
-                break;
-
-        default:
-                break;
-        }
-
-        if  (led_state & LED_STATE_ENABLED) {
-                GPSR = hw_led_state;
-                GPCR = hw_led_state ^ LED_MASK;
-        }
-
-	local_irq_restore(flags);
-}
-
-#endif /* CONFIG_SA1100_CERF */
+#include "leds.h"
 
 static int __init
 sa1100_leds_init(void)
 {
-#ifdef CONFIG_SA1100_ASSABET
 	if (machine_is_assabet())
 		leds_event = assabet_leds_event;
-#endif
-#ifdef CONFIG_SA1100_BRUTUS
 	if (machine_is_brutus())
 		leds_event = brutus_leds_event;
-#endif
-#ifdef CONFIG_SA1100_LART
+	if (machine_is_cerf())
+		leds_event = cerf_leds_event;
+	if (machine_is_flexanet())
+		leds_event = flexanet_leds_event;
+	if (machine_is_graphicsclient())
+		leds_event = graphicsclient_leds_event;
 	if (machine_is_lart())
 		leds_event = lart_leds_event;
-#endif
-#ifdef CONFIG_SA1100_CERF
-       if (machine_is_cerf())
-       {
-                //GPDR |= 0x0000000F;
-               leds_event = cerf_leds_event;
-       }
-#endif
+	if (machine_is_pfs168())
+		leds_event = pfs168_leds_event;
+
 	leds_event(led_start);
 	return 0;
 }
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/leds.h linux/arch/arm/mach-sa1100/leds.h
--- v2.4.8/linux/arch/arm/mach-sa1100/leds.h	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-sa1100/leds.h	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,8 @@
+extern void assabet_leds_event(led_event_t evt);
+extern void brutus_leds_event(led_event_t evt);
+extern void cerf_leds_event(led_event_t evt);
+extern void flexanet_leds_event(led_event_t evt);
+extern void graphicsclient_leds_event(led_event_t evt);
+extern void lart_leds_event(led_event_t evt);
+extern void pfs168_leds_event(led_event_t evt);
+
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/nanoengine.c linux/arch/arm/mach-sa1100/nanoengine.c
--- v2.4.8/linux/arch/arm/mach-sa1100/nanoengine.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-sa1100/nanoengine.c	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,62 @@
+/*
+ * linux/arch/arm/mach-sa1100/nanoengine.c
+ */
+
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/tty.h>
+
+#include <asm/hardware.h>
+#include <asm/setup.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach/serial_sa1100.h>
+
+#include "generic.h"
+
+
+static void __init
+fixup_nanoengine(struct machine_desc *desc, struct param_struct *params,
+		 char **cmdline, struct meminfo *mi)
+{
+	SET_BANK( 0, 0xc0000000, 32*1024*1024 );
+	mi->nr_banks = 1;
+
+	ROOT_DEV = MKDEV(RAMDISK_MAJOR,0);
+	setup_ramdisk( 1, 0, 0, 8192 );
+	setup_initrd( __phys_to_virt(0xc0800000), 4*1024*1024 );
+
+	/* Get command line parameters passed from the loader (if any) */
+	if( *((char*)0xc0000100) )
+		*cmdline = ((char *)0xc0000100);
+}
+
+static struct map_desc nanoengine_io_desc[] __initdata = {
+ /* virtual     physical    length      domain     r  w  c  b */
+  { 0xe8000000, 0x00000000, 0x02000000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 0 */
+  { 0xf0000000, 0x10000000, 0x00100000, DOMAIN_IO, 1, 1, 0, 0 }, /* System Registers */
+  { 0xf1000000, 0x18A00000, 0x00100000, DOMAIN_IO, 1, 1, 0, 0 }, /* Internal PCI Config Space */
+  LAST_DESC
+};
+
+static void __init nanoengine_map_io(void)
+{
+	sa1100_map_io();
+	iotable_init(nanoengine_io_desc);
+
+	sa1100_register_uart(0, 1);
+	sa1100_register_uart(1, 2);
+	sa1100_register_uart(2, 3);
+	Ser1SDCR0 |= SDCR0_UART;
+	/* disable IRDA -- UART2 is used as a normal serial port */
+	Ser2UTCR4=0;
+	Ser2HSCR0 = 0;
+}
+
+MACHINE_START(NANOENGINE, "BSE nanoEngine")
+	BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
+	FIXUP(fixup_nanoengine)
+	MAPIO(nanoengine_map_io)
+	INITIRQ(sa1100_init_irq)
+MACHINE_END
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/neponset.c linux/arch/arm/mach-sa1100/neponset.c
--- v2.4.8/linux/arch/arm/mach-sa1100/neponset.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-sa1100/neponset.c	Sun Aug 12 17:36:24 2001
@@ -0,0 +1,183 @@
+/*
+ * linux/arch/arm/mach-sa1100/neponset.c
+ *
+ */
+
+#include <linux/init.h>
+#include <linux/sched.h>
+#include <linux/interrupt.h>
+#include <linux/ptrace.h>
+
+#include <asm/hardware.h>
+#include <asm/irq.h>
+#include <asm/mach/map.h>
+#include <asm/mach/irq.h>
+#include <asm/arch/irq.h>
+#include <asm/mach/serial_sa1100.h>
+#include <linux/serial_core.h>
+
+#include "sa1111.h"
+
+
+/*
+ * Install handler for Neponset IRQ.  Yes, yes... we are way down the IRQ
+ * cascade which is not good for IRQ latency, but the hardware has been
+ * designed that way...
+ */
+
+static void neponset_IRQ_demux( int irq, void *dev_id, struct pt_regs *regs )
+{
+	int irr;
+
+	for(;;){
+		irr = IRR & (IRR_ETHERNET | IRR_USAR | IRR_SA1111);
+		/* Let's have all active IRQ bits high.
+		 * Note: there is a typo in the Neponset user's guide
+		 * for the SA1111 IRR level.
+		 */
+		irr ^= (IRR_ETHERNET | IRR_USAR);
+		if (!irr) break;
+
+		if( irr & IRR_ETHERNET )
+			do_IRQ(NEPONSET_ETHERNET_IRQ, regs);
+
+		if( irr & IRR_USAR )
+			do_IRQ(NEPONSET_USAR_IRQ, regs);
+
+		if( irr & IRR_SA1111 )
+			sa1111_IRQ_demux(irq, dev_id, regs);
+	}
+}
+
+static struct irqaction neponset_irq = {
+	name:		"Neponset",
+	handler:	neponset_IRQ_demux,
+	flags:		SA_INTERRUPT
+};
+
+static void __init neponset_init_irq(void)
+{
+	int irq;
+
+	sa1111_init_irq(-1);	/* SA1111 IRQ not routed to a GPIO */
+
+	/* setup extra Neponset IRQs */
+	irq = NEPONSET_ETHERNET_IRQ;
+	irq_desc[irq].valid	= 1;
+	irq_desc[irq].probe_ok	= 1;
+	irq = NEPONSET_USAR_IRQ;
+	irq_desc[irq].valid	= 1;
+	irq_desc[irq].probe_ok	= 1;
+	set_GPIO_IRQ_edge( GPIO_NEP_IRQ, GPIO_RISING_EDGE );
+	setup_arm_irq( IRQ_GPIO_NEP_IRQ, &neponset_irq );
+}
+
+static int __init neponset_init(void)
+{
+	/* only on assabet */
+	if (!machine_is_assabet())
+		return 0;
+
+	if (machine_has_neponset()) {
+		LEDS = WHOAMI;
+
+		if (sa1111_init() < 0)
+			return -EINVAL;
+		/*
+		 * Assabet is populated by default with two Samsung
+		 * KM416S8030T-G8
+		 * 128Mb SDRAMs, which are organized as 12-bit (row addr) x
+		 * 9-bit
+		 * (column addr), according to the data sheet. Apparently, the
+		 * bank selects factor into the row address, as Angel sets up
+		 * the
+		 * SA-1110 to use 14x9 addresses. The SDRAM datasheet specifies
+		 * that when running at 100-125MHz, the CAS latency for -8
+		 * parts
+		 * is 3 cycles, which is consistent with Angel.
+		 */
+		SMCR = (SMCR_DTIM | SMCR_MBGE |
+			FInsrt(FExtr(MDCNFG, MDCNFG_SA1110_DRAC0), SMCR_DRAC) |
+			((FExtr(MDCNFG, MDCNFG_SA1110_TDL0)==3) ? SMCR_CLAT : 0));
+		SKPCR |= SKPCR_DCLKEN;
+
+		neponset_init_irq();
+	} else
+		printk("Neponset expansion board not present\n");
+
+	return 0;
+}
+
+__initcall(neponset_init);
+
+static struct map_desc neponset_io_desc[] __initdata = {
+ /* virtual     physical    length      domain     r  w  c  b */
+  { 0xf3000000, 0x10000000, 0x00100000, DOMAIN_IO, 1, 1, 0, 0 }, /* System Registers */
+  { 0xf4000000, 0x40000000, 0x00100000, DOMAIN_IO, 1, 1, 0, 0 }, /* SA-1111 */
+  LAST_DESC
+};
+
+static void neponset_set_mctrl(struct uart_port *port, u_int mctrl)
+{
+	u_int mdm_ctl0 = MDM_CTL_0;
+
+	if (port->mapbase == _Ser1UTCR0) {
+		if (mctrl & TIOCM_RTS)
+			mdm_ctl0 &= ~MDM_CTL0_RTS2;
+		else
+			mdm_ctl0 |= MDM_CTL0_RTS2;
+
+		if (mctrl & TIOCM_DTR)
+			mdm_ctl0 &= ~MDM_CTL0_DTR2;
+		else
+			mdm_ctl0 |= MDM_CTL0_DTR2;
+	} else if (port->mapbase == _Ser3UTCR0) {
+		if (mctrl & TIOCM_RTS)
+			mdm_ctl0 &= ~MDM_CTL0_RTS1;
+		else
+			mdm_ctl0 |= MDM_CTL0_RTS1;
+
+		if (mctrl & TIOCM_DTR)
+			mdm_ctl0 &= ~MDM_CTL0_DTR1;
+		else
+			mdm_ctl0 |= MDM_CTL0_DTR1;
+	}
+
+	MDM_CTL_0 = mdm_ctl0;
+}
+
+static int neponset_get_mctrl(struct uart_port *port)
+{
+	u_int ret = TIOCM_CD | TIOCM_CTS | TIOCM_DSR;
+	u_int mdm_ctl1 = MDM_CTL_1;
+
+	if (port->mapbase == _Ser1UTCR0) {
+		if (mdm_ctl1 & MDM_CTL1_DCD2)
+			ret &= ~TIOCM_CD;
+		if (mdm_ctl1 & MDM_CTL1_CTS2)
+			ret &= ~TIOCM_CTS;
+		if (mdm_ctl1 & MDM_CTL1_DSR2)
+			ret &= ~TIOCM_DSR;
+	} else if (port->mapbase == _Ser3UTCR0) {
+		if (mdm_ctl1 & MDM_CTL1_DCD1)
+			ret &= ~TIOCM_CD;
+		if (mdm_ctl1 & MDM_CTL1_CTS1)
+			ret &= ~TIOCM_CTS;
+		if (mdm_ctl1 & MDM_CTL1_DSR1)
+			ret &= ~TIOCM_DSR;
+	}
+
+	return ret;
+}
+
+static struct sa1100_port_fns neponset_port_fns __initdata = {
+	set_mctrl:	neponset_set_mctrl,
+	get_mctrl:	neponset_get_mctrl,
+};
+
+void __init neponset_map_io(void)
+{
+	iotable_init(neponset_io_desc);
+	if (machine_has_neponset())
+		sa1100_register_uart_fns(&neponset_port_fns);
+}
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/omnimeter.c linux/arch/arm/mach-sa1100/omnimeter.c
--- v2.4.8/linux/arch/arm/mach-sa1100/omnimeter.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-sa1100/omnimeter.c	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,51 @@
+/*
+ * linux/arch/arm/mach-sa1100/omnimeter.c
+ */
+
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/tty.h>
+
+#include <asm/hardware.h>
+#include <asm/setup.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach/serial_sa1100.h>
+
+#include "generic.h"
+
+
+static void __init
+fixup_omnimeter(struct machine_desc *desc, struct param_struct *params,
+		char **cmdline, struct meminfo *mi)
+{
+	SET_BANK( 0, 0xc0000000, 16*1024*1024 );
+	mi->nr_banks = 1;
+
+	ROOT_DEV = MKDEV(RAMDISK_MAJOR,0);
+	setup_ramdisk( 1, 0, 0, 8192 );
+	setup_initrd( __phys_to_virt(0xd0000000), 0x00400000 );
+}
+
+static struct map_desc omnimeter_io_desc[] __initdata = {
+ /* virtual     physical    length      domain     r  w  c  b */
+  { 0xd2000000, 0x10000000, 0x02000000, DOMAIN_IO, 1, 1, 0, 0 }, /* TS */
+  LAST_DESC
+};
+
+static void __init omnimeter_map_io(void)
+{
+	sa1100_map_io();
+	iotable_init(omnimeter_io_desc);
+
+	sa1100_register_uart(0, 3);
+	sa1100_register_uart(1, 1);
+}
+
+MACHINE_START(OMNIMETER, "OmniMeter")
+	BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
+	FIXUP(fixup_omnimeter)
+	MAPIO(omnimeter_map_io)
+	INITIRQ(sa1100_init_irq)
+MACHINE_END
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/pangolin.c linux/arch/arm/mach-sa1100/pangolin.c
--- v2.4.8/linux/arch/arm/mach-sa1100/pangolin.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-sa1100/pangolin.c	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,53 @@
+/*
+ * linux/arch/arm/mach-sa1100/pangolin.c
+ */
+
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/tty.h>
+
+#include <asm/hardware.h>
+#include <asm/setup.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach/serial_sa1100.h>
+
+#include "generic.h"
+
+
+static void __init
+fixup_pangolin(struct machine_desc *desc, struct param_struct *params,
+	       char **cmdline, struct meminfo *mi)
+{
+	SET_BANK( 0, 0xc0000000, 64*1024*1024 );
+	mi->nr_banks = 1;
+
+	ROOT_DEV = MKDEV(RAMDISK_MAJOR,0);
+	setup_ramdisk( 1, 0, 0, 16384 );
+	setup_initrd( 0xc0800000, 3*1024*1024 );
+}
+
+static struct map_desc pangolin_io_desc[] __initdata = {
+ /* virtual     physical    length      domain     r  w  c  b */
+  { 0xe8000000, 0x00000000, 0x04000000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 0 */
+  { 0xf2800000, 0x4b800000, 0x00800000, DOMAIN_IO, 1, 1, 0, 0 }, /* MQ200 */
+  LAST_DESC
+};
+
+static void __init pangolin_map_io(void)
+{
+	sa1100_map_io();
+	iotable_init(pangolin_io_desc);
+
+	sa1100_register_uart(0, 1);
+	sa1100_register_uart(1, 3);
+	Ser1SDCR0 |= SDCR0_UART;
+}
+
+MACHINE_START(PANGOLIN, "Dialogue-Pangolin")
+	BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
+	FIXUP(fixup_pangolin)
+	MAPIO(pangolin_map_io)
+	INITIRQ(sa1100_init_irq)
+MACHINE_END
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/pcipool.c linux/arch/arm/mach-sa1100/pcipool.c
--- v2.4.8/linux/arch/arm/mach-sa1100/pcipool.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-sa1100/pcipool.c	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,377 @@
+/*
+  NOTE:
+
+  this code was lifted straight out of drivers/pci/pci.c;
+  when compiling for the Intel StrongARM SA-1110/SA-1111 the
+  usb-ohci.c driver needs these routines even when the architecture
+  has no pci bus...
+*/
+
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/types.h>
+#include <linux/kernel.h>
+#include <linux/pci.h>
+#include <linux/string.h>
+#include <linux/init.h>
+#include <linux/slab.h>
+#include <linux/spinlock.h>
+#include <linux/bitops.h>
+
+#include <asm/page.h>
+
+#include "pcipool.h"
+
+/*
+ * Pool allocator ... wraps the pci_alloc_consistent page allocator, so
+ * small blocks are easily used by drivers for bus mastering controllers.
+ * This should probably be sharing the guts of the slab allocator.
+ */
+
+struct pci_pool {	/* the pool */
+	struct list_head	page_list;
+	spinlock_t		lock;
+	size_t			blocks_per_page;
+	size_t			size;
+	int			flags;
+	struct pci_dev		*dev;
+	size_t			allocation;
+	char			name [32];
+	wait_queue_head_t	waitq;
+};
+
+struct pci_page {	/* cacheable header for 'allocation' bytes */
+	struct list_head	page_list;
+	void			*vaddr;
+	dma_addr_t		dma;
+	unsigned long		bitmap [0];
+};
+
+#define	POOL_TIMEOUT_JIFFIES	((100 /* msec */ * HZ) / 1000)
+#define	POOL_POISON_BYTE	0xa7
+
+// #define CONFIG_PCIPOOL_DEBUG
+
+
+/**
+ * pci_pool_create - Creates a pool of pci consistent memory blocks, for dma.
+ * @name: name of pool, for diagnostics
+ * @pdev: pci device that will be doing the DMA
+ * @size: size of the blocks in this pool.
+ * @align: alignment requirement for blocks; must be a power of two
+ * @allocation: returned blocks won't cross this boundary (or zero)
+ * @flags: SLAB_* flags (not all are supported).
+ *
+ * Returns a pci allocation pool with the requested characteristics, or
+ * null if one can't be created.  Given one of these pools, pci_pool_alloc()
+ * may be used to allocate memory.  Such memory will all have "consistent"
+ * DMA mappings, accessible by the device and its driver without using
+ * cache flushing primitives.  The actual size of blocks allocated may be
+ * larger than requested because of alignment.
+ *
+ * If allocation is nonzero, objects returned from pci_pool_alloc() won't
+ * cross that size boundary.  This is useful for devices which have
+ * addressing restrictions on individual DMA transfers, such as not crossing
+ * boundaries of 4KBytes.
+ */
+struct pci_pool *
+pci_pool_create (const char *name, struct pci_dev *pdev,
+	size_t size, size_t align, size_t allocation, int flags)
+{
+	struct pci_pool		*retval;
+
+	if (align == 0)
+		align = 1;
+	if (size == 0)
+		return 0;
+	else if (size < align)
+		size = align;
+	else if ((size % align) != 0) {
+		size += align + 1;
+		size &= ~(align - 1);
+	}
+
+	if (allocation == 0) {
+		if (PAGE_SIZE < size)
+			allocation = size;
+		else
+			allocation = PAGE_SIZE;
+		// FIXME: round up for less fragmentation
+	} else if (allocation < size)
+		return 0;
+
+	if (!(retval = kmalloc (sizeof *retval, flags)))
+		return retval;
+
+#ifdef	CONFIG_PCIPOOL_DEBUG
+	flags |= SLAB_POISON;
+#endif
+
+	strncpy (retval->name, name, sizeof retval->name);
+	retval->name [sizeof retval->name - 1] = 0;
+
+	retval->dev = pdev;
+	INIT_LIST_HEAD (&retval->page_list);
+	spin_lock_init (&retval->lock);
+	retval->size = size;
+	retval->flags = flags;
+	retval->allocation = allocation;
+	retval->blocks_per_page = allocation / size;
+	init_waitqueue_head (&retval->waitq);
+
+#ifdef CONFIG_PCIPOOL_DEBUG
+	printk (KERN_DEBUG "pcipool create %s/%s size %d, %d/page (%d alloc)\n",
+		pdev ? pdev->slot_name : NULL, retval->name, size,
+		retval->blocks_per_page, allocation);
+#endif
+
+	return retval;
+}
+
+
+static struct pci_page *
+pool_alloc_page (struct pci_pool *pool, int mem_flags)
+{
+	struct pci_page	*page;
+	int		mapsize;
+
+	mapsize = pool->blocks_per_page;
+	mapsize = (mapsize + BITS_PER_LONG - 1) / BITS_PER_LONG;
+	mapsize *= sizeof (long);
+
+	page = (struct pci_page *) kmalloc (mapsize + sizeof *page, mem_flags);
+	if (!page)
+		return 0;
+	page->vaddr = pci_alloc_consistent (pool->dev,
+				pool->allocation, &page->dma);
+	if (page->vaddr) {
+		memset (page->bitmap, 0xff, mapsize);	// bit set == free
+		if (pool->flags & SLAB_POISON)
+			memset (page->vaddr, POOL_POISON_BYTE, pool->allocation);
+		list_add (&page->page_list, &pool->page_list);
+	} else {
+		kfree (page);
+		page = 0;
+	}
+	return page;
+}
+
+
+static inline int
+is_page_busy (int blocks, unsigned long *bitmap)
+{
+	while (blocks > 0) {
+		if (*bitmap++ != ~0UL)
+			return 1;
+		blocks -= BITS_PER_LONG;
+	}
+	return 0;
+}
+
+static void
+pool_free_page (struct pci_pool *pool, struct pci_page *page)
+{
+	dma_addr_t	dma = page->dma;
+
+	if (pool->flags & SLAB_POISON)
+		memset (page->vaddr, POOL_POISON_BYTE, pool->allocation);
+	pci_free_consistent (pool->dev, pool->allocation, page->vaddr, dma);
+	list_del (&page->page_list);
+	kfree (page);
+}
+
+
+/**
+ * pci_pool_destroy - destroys a pool of pci memory blocks.
+ * @pool: pci pool that will be destroyed
+ *
+ * Caller guarantees that no more memory from the pool is in use,
+ * and that nothing will try to use the pool after this call.
+ */
+void
+pci_pool_destroy (struct pci_pool *pool)
+{
+	unsigned long		flags;
+
+#ifdef CONFIG_PCIPOOL_DEBUG
+	printk (KERN_DEBUG "pcipool destroy %s/%s\n",
+		pool->dev ? pool->dev->slot_name : NULL,
+		pool->name);
+#endif
+
+	spin_lock_irqsave (&pool->lock, flags);
+	while (!list_empty (&pool->page_list)) {
+		struct pci_page		*page;
+		page = list_entry (pool->page_list.next,
+				struct pci_page, page_list);
+		if (is_page_busy (pool->blocks_per_page, page->bitmap)) {
+			printk (KERN_ERR "pci_pool_destroy %s/%s, %p busy\n",
+				pool->dev ? pool->dev->slot_name : NULL,
+				pool->name, page->vaddr);
+			/* leak the still-in-use consistent memory */
+			list_del (&page->page_list);
+			kfree (page);
+		} else
+			pool_free_page (pool, page);
+	}
+	spin_unlock_irqrestore (&pool->lock, flags);
+	kfree (pool);
+}
+
+
+/**
+ * pci_pool_alloc - get a block of consistent memory
+ * @pool: pci pool that will produce the block
+ * @mem_flags: SLAB_KERNEL or SLAB_ATOMIC
+ * @handle: pointer to dma address of block
+ *
+ * This returns the kernel virtual address of a currently unused block,
+ * and reports its dma address through the handle.
+ * If such a memory block can't be allocated, null is returned.
+ */
+void *
+pci_pool_alloc (struct pci_pool *pool, int mem_flags, dma_addr_t *handle)
+{
+	unsigned long		flags;
+	struct list_head	*entry;
+	struct pci_page		*page;
+	int			map, block;
+	size_t			offset;
+	void			*retval;
+
+restart:
+	spin_lock_irqsave (&pool->lock, flags);
+	list_for_each (entry, &pool->page_list) {
+		int		i;
+		page = list_entry (entry, struct pci_page, page_list);
+		/* only cachable accesses here ... */
+		for (map = 0, i = 0;
+				i < pool->blocks_per_page;
+				i += BITS_PER_LONG, map++) {
+			if (page->bitmap [map] == 0)
+				continue;
+			block = ffz (~ page->bitmap [map]);
+			if ((i + block) < pool->blocks_per_page) {
+				clear_bit (block, &page->bitmap [map]);
+				offset = (BITS_PER_LONG * map) + block;
+				offset *= pool->size;
+				goto ready;
+			}
+		}
+	}
+	if (!(page = pool_alloc_page (pool, mem_flags))) {
+		if (mem_flags == SLAB_KERNEL) {
+			DECLARE_WAITQUEUE (wait, current);
+
+			current->state = TASK_INTERRUPTIBLE;
+			add_wait_queue (&pool->waitq, &wait);
+			spin_unlock_irqrestore (&pool->lock, flags);
+
+			schedule_timeout (POOL_TIMEOUT_JIFFIES);
+
+			current->state = TASK_RUNNING;
+			remove_wait_queue (&pool->waitq, &wait);
+			goto restart;
+		}
+		retval = 0;
+		goto done;
+	}
+
+	clear_bit (0, &page->bitmap [0]);
+	offset = 0;
+ready:
+	retval = offset + page->vaddr;
+	*handle = offset + page->dma;
+done:
+	spin_unlock_irqrestore (&pool->lock, flags);
+	return retval;
+}
+
+
+static struct pci_page *
+pool_find_page (struct pci_pool *pool, dma_addr_t dma)
+{
+	unsigned long		flags;
+	struct list_head	*entry;
+	struct pci_page		*page;
+
+	spin_lock_irqsave (&pool->lock, flags);
+	list_for_each (entry, &pool->page_list) {
+		page = list_entry (entry, struct pci_page, page_list);
+		if (dma < page->dma)
+			continue;
+		if (dma < (page->dma + pool->allocation))
+			goto done;
+	}
+	page = 0;
+done:
+	spin_unlock_irqrestore (&pool->lock, flags);
+	return page;
+}
+
+
+/**
+ * pci_pool_free - put block back into pci pool
+ * @pool: the pci pool holding the block
+ * @vaddr: virtual address of block
+ * @dma: dma address of block
+ *
+ * Caller promises neither device nor driver will again touch this block
+ * unless it is first re-allocated.
+ */
+void
+pci_pool_free (struct pci_pool *pool, void *vaddr, dma_addr_t dma)
+{
+	struct pci_page		*page;
+	unsigned long		flags;
+	int			map, block;
+
+	if ((page = pool_find_page (pool, dma)) == 0) {
+		printk (KERN_ERR "pci_pool_free %s/%s, %p/%x (bad dma)\n",
+			pool->dev ? pool->dev->slot_name : NULL,
+			pool->name, vaddr, dma);
+		return;
+	}
+#ifdef	CONFIG_PCIPOOL_DEBUG
+	if (((dma - page->dma) + (void *)page->vaddr) != vaddr) {
+		printk (KERN_ERR "pci_pool_free %s/%s, %p (bad vaddr)/%x\n",
+			pool->dev ? pool->dev->slot_name : NULL,
+			pool->name, vaddr, dma);
+		return;
+	}
+#endif
+
+	block = dma - page->dma;
+	block /= pool->size;
+	map = block / BITS_PER_LONG;
+	block %= BITS_PER_LONG;
+
+#ifdef	CONFIG_PCIPOOL_DEBUG
+	if (page->bitmap [map] & (1UL << block)) {
+		printk (KERN_ERR "pci_pool_free %s/%s, dma %x already free\n",
+			pool->dev ? pool->dev->slot_name : NULL,
+			pool->name, dma);
+		return;
+	}
+#endif
+	if (pool->flags & SLAB_POISON)
+		memset (vaddr, POOL_POISON_BYTE, pool->size);
+
+	spin_lock_irqsave (&pool->lock, flags);
+	set_bit (block, &page->bitmap [map]);
+	if (waitqueue_active (&pool->waitq))
+		wake_up (&pool->waitq);
+	/*
+	 * Resist a temptation to do
+	 *    if (!is_page_busy(bpp, page->bitmap)) pool_free_page(pool, page);
+	 * it is not interrupt safe. Better have empty pages hang around.
+	 */
+	spin_unlock_irqrestore (&pool->lock, flags);
+}
+
+
+EXPORT_SYMBOL (pci_pool_create);
+EXPORT_SYMBOL (pci_pool_destroy);
+EXPORT_SYMBOL (pci_pool_alloc);
+EXPORT_SYMBOL (pci_pool_free);
+
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/pcipool.h linux/arch/arm/mach-sa1100/pcipool.h
--- v2.4.8/linux/arch/arm/mach-sa1100/pcipool.h	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-sa1100/pcipool.h	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,8 @@
+
+struct pci_pool *pci_pool_create (const char *name, struct pci_dev *dev,
+		size_t size, size_t align, size_t allocation, int flags);
+void pci_pool_destroy (struct pci_pool *pool);
+
+void *pci_pool_alloc (struct pci_pool *pool, int flags, dma_addr_t *handle);
+void pci_pool_free (struct pci_pool *pool, void *vaddr, dma_addr_t addr);
+
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/pfs168.c linux/arch/arm/mach-sa1100/pfs168.c
--- v2.4.8/linux/arch/arm/mach-sa1100/pfs168.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-sa1100/pfs168.c	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,99 @@
+/*
+ * linux/arch/arm/mach-sa1100/pfs168.c
+ */
+
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/tty.h>
+#include <linux/errno.h>
+
+#include <asm/hardware.h>
+#include <asm/setup.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach/serial_sa1100.h>
+
+#include "generic.h"
+#include "sa1111.h"
+
+
+static int __init pfs168_init(void)
+{
+	if (sa1111_init() < 0)
+		return -EINVAL;
+	SMCR = (SMCR_DTIM | SMCR_MBGE |
+		FInsrt(FExtr(MDCNFG, MDCNFG_SA1110_DRAC0), SMCR_DRAC) |
+		((FExtr(MDCNFG, MDCNFG_SA1110_TDL0)==3) ? SMCR_CLAT : 0));
+	SKPCR |= SKPCR_DCLKEN;
+
+	sa1111_init_irq(25);	/* SA1111 IRQ on GPIO 25 */
+
+	return 0;
+}
+
+__initcall(pfs168_init);
+
+
+static void __init pfs168_init_irq(void)
+{
+	sa1100_init_irq();
+
+	/*
+	 * Need to register these as rising edge interrupts
+	 * for standard 16550 serial driver support.
+	 */
+	set_GPIO_IRQ_edge(GPIO_GPIO(19), GPIO_RISING_EDGE);
+	set_GPIO_IRQ_edge(GPIO_GPIO(20), GPIO_RISING_EDGE);
+}
+
+
+static void __init
+fixup_pfs168(struct machine_desc *desc, struct param_struct *params,
+	     char **cmdline, struct meminfo *mi)
+{
+	SET_BANK( 0, 0xc0000000, 16*1024*1024 );
+	mi->nr_banks = 1;
+
+	ROOT_DEV = MKDEV(RAMDISK_MAJOR,0);
+	setup_ramdisk( 1, 0, 0, 8192 );
+	setup_initrd( 0xc0800000, 3*1024*1024 );
+}
+
+static struct map_desc pfs168_io_desc[] __initdata = {
+ /* virtual     physical    length      domain     r  w  c  b */
+  { 0xe8000000, 0x00000000, 0x02000000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 0 */
+  { 0xf0000000, 0x10000000, 0x00001000, DOMAIN_IO, 1, 1, 0, 0 }, /* 16C752 DUART port A (COM5) */
+  { 0xf0001000, 0x10800000, 0x00001000, DOMAIN_IO, 1, 1, 0, 0 }, /* 16C752 DUART port B (COM6) */
+  { 0xf0002000, 0x11000000, 0x00001000, DOMAIN_IO, 1, 1, 0, 0 }, /* COM1 RTS control (SYSC1RTS) */
+  { 0xf0003000, 0x11400000, 0x00001000, DOMAIN_IO, 1, 1, 0, 0 }, /* Status LED control (SYSLED) */
+  { 0xf0004000, 0x11800000, 0x00001000, DOMAIN_IO, 1, 1, 0, 0 }, /* DTMF code read (SYSDTMF) */
+  { 0xf0005000, 0x11c00000, 0x00001000, DOMAIN_IO, 1, 1, 0, 0 }, /* LCD configure, enable (SYSLCDDE) */
+  { 0xf0006000, 0x12000000, 0x00001000, DOMAIN_IO, 1, 1, 0, 0 }, /* COM1 DSR and motion sense (SYSC1DSR) */
+  { 0xf0007000, 0x12800000, 0x00001000, DOMAIN_IO, 1, 1, 0, 0 }, /* COM3 xmit enable (SYSC3TEN) */
+  { 0xf0008000, 0x13000000, 0x00001000, DOMAIN_IO, 1, 1, 0, 0 }, /* Control register A (SYSCTLA) */
+  { 0xf0009000, 0x13800000, 0x00001000, DOMAIN_IO, 1, 1, 0, 0 }, /* Control register B (SYSCTLB) */
+  { 0xf000a000, 0x18000000, 0x00001000, DOMAIN_IO, 1, 1, 0, 0 }, /* SMC91C96 */
+  { 0xf2800000, 0x4b800000, 0x00800000, DOMAIN_IO, 1, 1, 0, 0 }, /* MQ200 */
+  { 0xf4000000, 0x40000000, 0x00100000, DOMAIN_IO, 1, 1, 0, 0 }, /* SA-1111 */
+  LAST_DESC
+};
+
+static void __init pfs168_map_io(void)
+{
+	sa1100_map_io();
+	iotable_init(pfs168_io_desc);
+
+	sa1100_register_uart(0, 3);
+	sa1100_register_uart(1, 1);
+}
+
+MACHINE_START(PFS168, "Tulsa")
+	BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
+#if defined(CONFIG_PFS168_CMDLINE)
+	BOOT_PARAMS(0xc0000100)
+#endif
+	FIXUP(fixup_pfs168)
+	MAPIO(pfs168_map_io)
+	INITIRQ(pfs168_init_irq)
+MACHINE_END
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/pleb.c linux/arch/arm/mach-sa1100/pleb.c
--- v2.4.8/linux/arch/arm/mach-sa1100/pleb.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-sa1100/pleb.c	Sun Aug 12 17:36:24 2001
@@ -0,0 +1,61 @@
+/*
+ * linux/arch/arm/mach-sa1100/pleb.c
+ */
+
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/tty.h>
+
+#include <asm/hardware.h>
+#include <asm/setup.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach/serial_sa1100.h>
+
+#include "generic.h"
+
+static void __init
+fixup_pleb(struct machine_desc *desc, struct param_struct *params,
+           char **cmdline, struct meminfo *mi)
+{
+	SET_BANK(0, 0xc0000000, 16*1024*1024);
+	SET_BANK(1, 0xc8000000, 16*1024*1024);
+	SET_BANK(2, 0xd0000000, 16*1024*1024);
+	SET_BANK(3, 0xd8000000, 16*1024*1024);
+
+	/* make this 4 a second memory card is used to make 64MB */
+	/* make it 1 if a 16MB memory card is used */
+	mi->nr_banks = 2; /* Default 32MB */
+
+	ROOT_DEV = MKDEV(RAMDISK_MAJOR, 0);
+	setup_ramdisk(1, 0, 0, 8192);
+	setup_initrd(0xc0400000, 4*1024*1024);
+}
+
+static struct map_desc pleb_io_desc[] __initdata = {
+ /* virtual     physical    length      domain     r  w  c  b */
+  { 0xe8000000, 0x00000000, 0x00400000, DOMAIN_IO, 1, 1, 0, 0 }, /* main flash memory */
+  { 0xe8400000, 0x08000000, 0x00400000, DOMAIN_IO, 1, 1, 0, 0 }, /* main flash, alternative location */
+  LAST_DESC
+};
+
+static void __init pleb_map_io(void)
+{
+	sa1100_map_io();
+	iotable_init(pleb_io_desc);
+
+	sa1100_register_uart(0, 3);
+        sa1100_register_uart(1, 1);
+        GAFR |= (GPIO_UART_TXD | GPIO_UART_RXD);
+        GPDR |= GPIO_UART_TXD;
+        GPDR &= ~GPIO_UART_RXD;
+        PPAR |= PPAR_UPR;
+}
+
+MACHINE_START(PLEB, "PLEB")
+	BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
+	FIXUP(fixup_pleb)
+	MAPIO(pleb_map_io)
+	INITIRQ(sa1100_init_irq)
+MACHINE_END
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/sa1111-pcibuf.c linux/arch/arm/mach-sa1100/sa1111-pcibuf.c
--- v2.4.8/linux/arch/arm/mach-sa1100/sa1111-pcibuf.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-sa1100/sa1111-pcibuf.c	Sun Aug 12 17:36:24 2001
@@ -0,0 +1,279 @@
+/*
+ *  linux/arch/arm/mach-sa1100/pci-sa1111.c
+ *
+ *  Special pci_map/unmap_single routines for SA-1111.   These functions
+ *  compensate for a bug in the SA-1111 hardware which don't allow DMA
+ *  to/from addresses above 1MB.
+ *
+ *  Brad Parker (brad@heeltoe.com)
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
+ *
+ *  06/13/2001 - created.
+ */
+
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/slab.h>
+#include <linux/pci.h>
+
+#include "pcipool.h"
+
+/*
+ * simple buffer allocator for copying of unsafe to safe buffers
+ * uses __alloc/__free for actual buffers
+ * keeps track of safe buffers we've allocated so we can recover the
+ * unsafe buffers.
+ */
+
+#define MAX_SAFE	32
+#define SIZE_SMALL	1024
+#define SIZE_LARGE	(16*1024)
+
+static long mapped_alloc_size;
+static char *safe_buffers[MAX_SAFE][2];
+
+
+static struct pci_pool *small_buffer_cache, *large_buffer_cache;
+
+static int
+init_safe_buffers(struct pci_dev *dev)
+{
+	small_buffer_cache = pci_pool_create("pci_small_buffer",
+					    dev,
+					    SIZE_SMALL,
+					    0 /* byte alignment */,
+					    0 /* no page-crossing issues */,
+					    GFP_KERNEL | GFP_DMA);
+
+	if (small_buffer_cache == 0)
+		return -1;
+
+	large_buffer_cache = pci_pool_create("pci_large_buffer",
+					    dev,
+					    SIZE_LARGE,
+					    0 /* byte alignment */,
+					    0 /* no page-crossing issues */,
+					    GFP_KERNEL | GFP_DMA);
+	if (large_buffer_cache == 0)
+		return -1;
+
+	return 0;
+}
+
+static void
+free_safe_buffers(void)
+{
+	pci_pool_destroy(small_buffer_cache);
+	pci_pool_destroy(large_buffer_cache);
+}
+
+/* allocate a 'safe' buffer and keep track of it */
+static char *
+alloc_safe_buffer(char *unsafe, int size, dma_addr_t *pbus)
+{
+	char *safe;
+	dma_addr_t busptr;
+	struct pci_pool *pool;
+	int i;
+
+	if (0) printk("alloc_safe_buffer(size=%d)\n", size);
+
+	if (size <= SIZE_SMALL)
+		pool = small_buffer_cache;
+	else
+		if (size < SIZE_LARGE)
+			pool = large_buffer_cache;
+				else
+					return 0;
+
+	safe = pci_pool_alloc(pool, SLAB_ATOMIC, &busptr);
+	if (safe == 0)
+		return 0;
+
+	for (i = 0; i < MAX_SAFE; i++)
+		if (safe_buffers[i][0] == 0) {
+			break;
+		}
+
+	if (i == MAX_SAFE) {
+		panic(__FILE__ ": exceeded MAX_SAFE buffers");
+	}
+
+	/* place the size index and the old buffer ptr in the first 8 bytes
+	 * and return a ptr + 12 to caller
+	 */
+	((int *)safe)[0] = i;
+	((char **)safe)[1] = (char *)pool;
+	((char **)safe)[2] = unsafe;
+
+	busptr += sizeof(int) + sizeof(char *) + sizeof(char *);
+
+	safe_buffers[i][0] = (void *)busptr;
+	safe_buffers[i][1] = (void *)safe;
+
+	safe += sizeof(int) + sizeof(char *) + sizeof(char *);
+
+	*pbus = busptr;
+	return safe;
+}
+
+/* determine if a buffer is from our "safe" pool */
+static char *
+find_safe_buffer(char *busptr, char **unsafe)
+{
+	int i;
+	char *buf;
+
+	for (i = 0; i < MAX_SAFE; i++) {
+		if (safe_buffers[i][0] == busptr) {
+			if (0) printk("find_safe_buffer(%p) found @ %d\n", busptr, i);
+			buf = safe_buffers[i][1];
+			*unsafe = ((char **)buf)[2];
+			return buf + sizeof(int) + sizeof(char *) + sizeof(char *);
+		}
+	}
+
+	return (char *)0;
+}
+
+static void
+free_safe_buffer(char *buf)
+{
+	int index;
+	struct pci_pool *pool;
+	char *dma;
+
+	if (0) printk("free_safe_buffer(buf=%p)\n", buf);
+
+	/* retrieve the buffer size index */
+	buf -= sizeof(int) + sizeof(char*) + sizeof(char*);
+	index = ((int *)buf)[0];
+	pool = (struct pci_pool *)((char **)buf)[1];
+
+	if (0) printk("free_safe_buffer(%p) index %d\n",
+		      buf, index);
+
+	if (index < 0 || index >= MAX_SAFE) {
+		printk(__FILE__ ": free_safe_buffer() corrupt buffer\n");
+		return;
+	}
+
+	dma = safe_buffers[index][0];
+	safe_buffers[index][0] = 0;
+
+	pci_pool_free(pool, buf, (u32)dma);
+}
+
+/*
+  NOTE:
+  replace pci_map/unmap_single with local routines which will
+  do buffer copies if buffer is above 1mb...
+*/
+
+/*
+ * see if a buffer address is in an 'unsafe' range.  if it is
+ * allocate a 'safe' buffer and copy the unsafe buffer into it.
+ * substitute the safe buffer for the unsafe one.
+ * (basically move the buffer from an unsafe area to a safe one)
+ *
+ * we assume calls to map_single are symmetric with calls to unmap_single...
+ */
+dma_addr_t
+pci_map_single(struct pci_dev *hwdev, void *virtptr,
+	       size_t size, int direction)
+{
+	dma_addr_t busptr;
+
+	/* hack; usb-ohci.c never sends hwdev==NULL, all others do */
+	if (hwdev == NULL) {
+		consistent_sync(virtptr, size, direction);
+		return virt_to_bus(virtptr);
+	}
+
+	mapped_alloc_size += size;
+
+	if (0) printk("pci_map_single(hwdev=%p,ptr=%p,size=%d,dir=%x) "
+		      "alloced=%ld\n",
+		      hwdev, virtptr, size, direction, mapped_alloc_size);
+
+	busptr = virt_to_bus(virtptr);
+
+	/* we assume here that a buffer will never be >=64k */
+	if ( (((unsigned long)busptr) & 0x100000) ||
+	     ((((unsigned long)busptr)+size) & 0x100000) )
+	{
+		char *safe;
+
+		safe = alloc_safe_buffer(virtptr, size, &busptr);
+		if (safe == 0) {
+			printk("unable to map unsafe buffer %p!\n", virtptr);
+			return 0;
+		}
+
+		if (0) printk("unsafe buffer %p (phy=%p) mapped to %p (phy=%p)\n",
+			      virtptr, (void *)virt_to_bus(virtptr),
+			      safe, (void *)busptr);
+
+		memcpy(safe, virtptr, size);
+		consistent_sync(safe, size, direction);
+
+		return busptr;
+	}
+
+	consistent_sync(virtptr, size, direction);
+	return busptr;
+}
+
+/*
+ * see if a mapped address was really a "safe" buffer and if so,
+ * copy the data from the safe buffer back to the unsafe buffer
+ * and free up the safe buffer.
+ * (basically return things back to the way they should be)
+ */
+void
+pci_unmap_single(struct pci_dev *hwdev, dma_addr_t dma_addr,
+		 size_t size, int direction)
+{
+	char *safe, *unsafe;
+	void *buf;
+
+	/* hack; usb-ohci.c never sends hwdev==NULL, all others do */
+	if (hwdev == NULL) {
+		return;
+	}
+
+	mapped_alloc_size -= size;
+
+	if (0) printk("pci_unmap_single(hwdev=%p,ptr=%p,size=%d,dir=%x) "
+		      "alloced=%ld\n",
+		      hwdev, (void *)dma_addr, size, direction,
+		      mapped_alloc_size);
+
+	if ((safe = find_safe_buffer((void *)dma_addr, &unsafe))) {
+		if (0) printk("copyback unsafe %p, safe %p, size %d\n",
+			      unsafe, safe, size);
+
+		consistent_sync(safe, size, PCI_DMA_FROMDEVICE);
+		memcpy(unsafe, safe, size);
+		free_safe_buffer(safe);
+	} else {
+		/* assume this is normal memory */
+		buf = bus_to_virt(dma_addr);
+		consistent_sync(buf, size, PCI_DMA_FROMDEVICE);
+	}
+}
+
+EXPORT_SYMBOL(pci_map_single);
+EXPORT_SYMBOL(pci_unmap_single);
+
+static void __init sa1111_init_safe_buffers(void)
+{
+	printk("Initializing SA1111 buffer pool for DMA workaround\n");
+	init_safe_buffers(NULL);
+}
+
+__initcall(sa1111_init_safe_buffers);
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/sa1111.c linux/arch/arm/mach-sa1100/sa1111.c
--- v2.4.8/linux/arch/arm/mach-sa1100/sa1111.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-sa1100/sa1111.c	Sun Aug 12 17:36:24 2001
@@ -0,0 +1,324 @@
+/*
+ * linux/arch/arm/mach-sa1100/sa1111.c
+ *
+ * SA1111 support
+ *
+ * Original code by John Dorsey
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This file contains all generic SA1111 support, except for DMA which is
+ * provided separately in dma-sa1111.c.
+ *
+ * All initialization functions provided here are intended to be called
+ * from machine specific code with proper arguments when required.
+ */
+
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/delay.h>
+#include <linux/sched.h>
+#include <linux/interrupt.h>
+#include <linux/ptrace.h>
+#include <linux/errno.h>
+#include <linux/pci.h>
+#include <linux/mm.h>
+
+#include <asm/hardware.h>
+#include <asm/irq.h>
+#include <asm/mach/irq.h>
+#include <asm/arch/irq.h>
+
+#include "sa1111.h"
+
+static int sa1111_ohci_hcd_init(void);
+
+/*
+ * SA1111 initialization
+ */
+
+int __init sa1111_init(void)
+{
+	unsigned long id = SKID;
+
+	if((id & SKID_ID_MASK) == SKID_SA1111_ID)
+		printk( KERN_INFO "SA-1111 Microprocessor Companion Chip: "
+			"silicon revision %lx, metal revision %lx\n",
+			(id & SKID_SIREV_MASK)>>4, (id & SKID_MTREV_MASK));
+	else {
+		printk(KERN_ERR "Could not detect SA-1111!\n");
+		return -EINVAL;
+	}
+
+	/*
+	 * First, set up the 3.6864MHz clock on GPIO 27 for the SA-1111:
+	 * (SA-1110 Developer's Manual, section 9.1.2.1)
+	 */
+	GAFR |= GPIO_32_768kHz;
+	GPDR |= GPIO_32_768kHz;
+	TUCR = TUCR_3_6864MHz;
+
+	/* Now, set up the PLL and RCLK in the SA-1111: */
+	SKCR = SKCR_PLL_BYPASS | SKCR_RDYEN | SKCR_OE_EN;
+	udelay(100);
+	SKCR = SKCR_PLL_BYPASS | SKCR_RCLKEN | SKCR_RDYEN | SKCR_OE_EN;
+
+	/*
+	 * SA-1111 Register Access Bus should now be available. Clocks for
+	 * any other SA-1111 functional blocks must be enabled separately
+	 * using the SKPCR.
+	 */
+
+	/*
+	 * If the system is going to use the SA-1111 DMA engines, set up
+	 * the memory bus request/grant pins. Also configure the shared
+	 * memory controller on the SA-1111 (SA-1111 Developer's Manual,
+	 * section 3.2.3) and power up the DMA bus clock:
+	 */
+	GAFR |= (GPIO_MBGNT | GPIO_MBREQ);
+	GPDR |= GPIO_MBGNT;
+	GPDR &= ~GPIO_MBREQ;
+	TUCR |= TUCR_MR;
+
+#ifdef CONFIG_USB_OHCI
+	/* setup up sa1111 usb host controller h/w */
+	sa1111_ohci_hcd_init();
+#endif
+
+	return 0;
+}
+
+
+/*
+ * SA1111  Interrupt support
+ */
+
+void sa1111_IRQ_demux( int irq, void *dev_id, struct pt_regs *regs )
+{
+	int i;
+	unsigned long stat0, stat1;
+
+	for(;;) {
+		stat0 = INTSTATCLR0, stat1 = INTSTATCLR1;
+		if( !stat0 && !stat1 ) break;
+		if( stat0 )
+			for( i = 0; i < 32; i++ )
+				if( stat0 & (1<<i) )
+					do_IRQ( SA1111_IRQ(i), regs );
+
+		if( stat1 )
+			for( i = 32; i < 55; i++ )
+				if( stat1 & (1<<(i-32)) )
+					do_IRQ( SA1111_IRQ(i), regs );
+	}
+}
+
+static struct irqaction sa1111_irq = {
+	name:		"SA1111",
+	handler:	sa1111_IRQ_demux,
+	flags:		SA_INTERRUPT
+};
+
+static void sa1111_mask_and_ack_lowirq(unsigned int irq)
+{
+	unsigned int mask = 1 << (irq - SA1111_IRQ(0));
+
+	// broken hardware: interrupt events are lost if they occur
+	// while the interrupts are disabled.
+	//INTEN0 &= ~mask;
+	INTSTATCLR0 = mask;
+}
+
+static void sa1111_mask_and_ack_highirq(unsigned int irq)
+{
+	unsigned int mask = 1 << (irq - SA1111_IRQ(32));
+
+	//INTEN1 &= ~mask;
+	INTSTATCLR1 = mask;
+}
+
+static void sa1111_mask_lowirq(unsigned int irq)
+{
+	//INTEN0 &= ~(1 << (irq - SA1111_IRQ(0)));
+}
+
+static void sa1111_mask_highirq(unsigned int irq)
+{
+	//INTEN1 &= ~(1 << (irq - SA1111_IRQ(32)));
+}
+
+static void sa1111_unmask_lowirq(unsigned int irq)
+{
+	INTEN0 |= 1 << (irq - SA1111_IRQ(0));
+}
+
+static void sa1111_unmask_highirq(unsigned int irq)
+{
+	INTEN1 |= 1 << ((irq - SA1111_IRQ(32)));
+}
+
+void __init sa1111_init_irq(int gpio_nr)
+{
+	int irq;
+
+	/* disable all IRQs */
+	INTEN0 = 0;
+	INTEN1 = 0;
+
+	/*
+	 * detect on rising edge.  Note: Feb 2001 Errata for SA1111
+	 * specifies that S0ReadyInt and S1ReadyInt should be '1'.
+	 */
+	INTPOL0 = 0;
+	INTPOL1 = 1 << (S0_READY_NINT - SA1111_IRQ(32)) |
+		  1 << (S1_READY_NINT - SA1111_IRQ(32));
+
+	/* clear all IRQs */
+	INTSTATCLR0 = -1;
+	INTSTATCLR1 = -1;
+
+	for (irq = SA1111_IRQ(0); irq <= SA1111_IRQ(26); irq++) {
+		irq_desc[irq].valid	= 1;
+		irq_desc[irq].probe_ok	= 1;
+		irq_desc[irq].mask_ack	= sa1111_mask_and_ack_lowirq;
+		irq_desc[irq].mask	= sa1111_mask_lowirq;
+		irq_desc[irq].unmask	= sa1111_unmask_lowirq;
+	}
+	for (irq = SA1111_IRQ(32); irq <= SA1111_IRQ(54); irq++) {
+		irq_desc[irq].valid	= 1;
+		irq_desc[irq].probe_ok	= 1;
+		irq_desc[irq].mask_ack	= sa1111_mask_and_ack_highirq;
+		irq_desc[irq].mask	= sa1111_mask_highirq;
+		irq_desc[irq].unmask	= sa1111_unmask_highirq;
+	}
+
+	/* Not every machines has the SA1111 interrupt routed to a GPIO */
+	if (gpio_nr >= 0) {
+		set_GPIO_IRQ_edge (GPIO_GPIO(gpio_nr), GPIO_RISING_EDGE);
+		setup_arm_irq (SA1100_GPIO_TO_IRQ(gpio_nr), &sa1111_irq);
+	}
+}
+
+/* ----------------- */
+
+#ifdef CONFIG_USB_OHCI
+
+#if defined(CONFIG_SA1100_XP860) || defined(CONFIG_ASSABET_NEPONSET) || defined(CONFIG_SA1100_PFS168)
+#define PwrSensePolLow  1
+#define PwrCtrlPolLow   1
+#else
+#define PwrSensePolLow  0
+#define PwrCtrlPolLow   0
+#endif
+
+/*
+ * The SA-1111 errata says that the DMA hardware needs to be exercised
+ * before the clocks are turned on to work properly.  This code does
+ * a tiny dma transfer to prime to hardware.
+ */
+static void __init sa1111_dma_setup(void)
+{
+	dma_addr_t vbuf;
+	void * pbuf;
+
+	/* DMA init & setup */
+
+	/* WARNING: The SA-1111 L3 function is used as part of this
+	 * SA-1111 DMA errata workaround.
+	 *
+	 * N.B., When the L3 function is enabled, it uses GPIO_B<4:5>
+	 * and takes precedence over the PS/2 mouse and GPIO_B
+	 * functions. Refer to "Intel StrongARM SA-1111 Microprocessor
+	 * Companion Chip, Sect 10.2" for details.  So this "fix" may
+	 * "break" support of either PS/2 mouse or GPIO_B if
+	 * precautions are not taken to avoid collisions in
+	 * configuration and use of these pins. AFAIK, no precautions
+	 * are taken at this time. So it is likely that the action
+	 * taken here may cause problems in PS/2 mouse and/or GPIO_B
+	 * pin use elsewhere.
+	 *
+	 * But wait, there's more... What we're doing here is
+	 * obviously altogether a bad idea. We're indiscrimanately bit
+	 * flipping config for a few different functions here which
+	 * are "owned" by other drivers. This needs to be handled
+	 * better than it is being done here at this time.  */
+
+	/* prime the dma engine with a tiny dma */
+	SKPCR |= SKPCR_I2SCLKEN;
+	SKAUD |= SKPCR_L3CLKEN | SKPCR_SCLKEN;
+
+	SACR0 |= 0x00003305;
+	SACR1 = 0x00000000;
+
+	/* we need memory below 1mb */
+	pbuf = consistent_alloc(GFP_KERNEL | GFP_DMA, 4, &vbuf);
+
+	SADTSA = (unsigned long)pbuf;
+	SADTCA = 4;
+
+	SADTCS |= 0x00000011;
+	SKPCR |= SKPCR_DCLKEN;
+
+	/* wait */
+	udelay(100);
+
+	SACR0 &= ~(0x00000002);
+	SACR0 &= ~(0x00000001);
+
+	/* */
+	SACR0 |= 0x00000004;
+	SACR0 &= ~(0x00000004);
+
+	SKAUD &= ~(SKPCR_L3CLKEN | SKPCR_SCLKEN);
+
+	SKPCR &= ~SKPCR_I2SCLKEN;
+
+	consistent_free(pbuf, 4, vbuf);
+}
+
+#ifdef CONFIG_USB_OHCI
+/*
+ * reset the SA-1111 usb controller and turn on it's clocks
+ */
+static int __init sa1111_ohci_hcd_init(void)
+{
+	volatile unsigned long *Reset = (void *)SA1111_p2v(_SA1111(0x051c));
+	volatile unsigned long *Status = (void *)SA1111_p2v(_SA1111(0x0518));
+
+	/* turn on clocks */
+	SKPCR |= SKPCR_UCLKEN;
+	udelay(100);
+
+	/* force a reset */
+	*Reset = 0x01;
+	*Reset |= 0x02;
+	udelay(100);
+
+	*Reset = 0;
+
+	/* take out of reset */
+	/* set power sense and control lines (this from the diags code) */
+        *Reset = ( PwrSensePolLow << 6 )
+               | ( PwrCtrlPolLow << 7 );
+
+	*Status = 0;
+
+	udelay(10);
+
+	/* compensate for dma bug */
+	sa1111_dma_setup();
+
+	return 0;
+}
+
+void sa1111_ohci_hcd_cleanup(void)
+{
+	/* turn the USB clock off */
+	SKPCR &= ~SKPCR_UCLKEN;
+}
+#endif
+
+
+#endif /* CONFIG_USB_OHCI */
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/sa1111.h linux/arch/arm/mach-sa1100/sa1111.h
--- v2.4.8/linux/arch/arm/mach-sa1100/sa1111.h	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-sa1100/sa1111.h	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,8 @@
+/*
+ * linux/arch/arm/mach-sa1100/sa1111.h
+ */
+
+extern int __init sa1111_init(void);
+extern void __init sa1111_init_irq(int gpio_nr);
+extern void sa1111_IRQ_demux( int irq, void *dev_id, struct pt_regs *regs );
+
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/sherman.c linux/arch/arm/mach-sa1100/sherman.c
--- v2.4.8/linux/arch/arm/mach-sa1100/sherman.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-sa1100/sherman.c	Sun Aug 12 17:36:24 2001
@@ -0,0 +1,52 @@
+/*
+ * linux/arch/arm/mach-sa1100/sherman.c
+ */
+
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/tty.h>
+
+#include <asm/hardware.h>
+#include <asm/setup.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach/serial_sa1100.h>
+
+#include "generic.h"
+
+
+static void __init
+fixup_sherman(struct machine_desc *desc, struct param_struct *params,
+	      char **cmdline, struct meminfo *mi)
+{
+	SET_BANK( 0, 0xc0000000, 64*1024*1024 );
+	SET_BANK( 1, 0xc8000000, 64*1024*1024 );
+	mi->nr_banks = 2;
+
+	ROOT_DEV = MKDEV( 60, 2 );
+	setup_ramdisk( 1, 0, 0, 8192 );
+//	setup_initrd( 0xc0400000, 8*1024*1024 );
+}
+
+static struct map_desc sherman_io_desc[] __initdata = {
+ /* virtual     physical    length      domain     r  w  c  b */
+  { 0xe8000000, 0x00000000, 0x02000000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash*/
+  LAST_DESC
+};
+
+static void __init sherman_map_io(void)
+{
+	sa1100_map_io();
+	iotable_init(sherman_io_desc);
+
+	sa1100_register_uart(0, 3);
+	sa1100_register_uart(1, 1);
+}
+
+MACHINE_START(SHERMAN, "Blazie Engineering Sherman")
+        BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
+        FIXUP(fixup_sherman)
+        MAPIO(sherman_map_io)
+	INITIRQ(sa1100_init_irq)
+MACHINE_END
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/simpad.c linux/arch/arm/mach-sa1100/simpad.c
--- v2.4.8/linux/arch/arm/mach-sa1100/simpad.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-sa1100/simpad.c	Sun Aug 12 17:36:24 2001
@@ -0,0 +1,79 @@
+/*
+ * linux/arch/arm/mach-sa1100/simpad.c
+ *
+ */
+
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/tty.h>
+
+#include <asm/hardware.h>
+#include <asm/setup.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach/serial_sa1100.h>
+
+#include "generic.h"
+
+void init_simpad_cs3()
+{
+   cs3_shadow =(DISPLAY_ON | RS232_ON | PCMCIA_BUFF_DIS | RESET_SIMCARD);
+   printk("\nCall CS3 init:%x\n",cs3_shadow);
+   *(CS3BUSTYPE *)(CS3_BASE) = cs3_shadow;
+   cs3_shadow =(DISPLAY_ON| RS232_ON |RESET_SIMCARD);
+}
+
+void PCMCIA_setbit(int value)
+{
+  cs3_shadow |= value;
+}
+
+void PCMCIA_clearbit(int value)
+{
+  cs3_shadow &= ~value;
+}
+
+static void __init
+fixup_simpad(struct machine_desc *desc, struct param_struct *params,
+		   char **cmdline, struct meminfo *mi)
+{
+#ifdef CONFIG_SA1100_SIMPAD_64MB
+	SET_BANK( 0, 0xc0000000, 64*1024*1024 );
+#else
+	SET_BANK( 0, 0xc0000000, 32*1024*1024 );
+#endif
+	mi->nr_banks = 1;
+	ROOT_DEV = MKDEV(RAMDISK_MAJOR,0);
+	setup_ramdisk( 1, 0, 0, 8192 );
+	setup_initrd( __phys_to_virt(0xc0800000), 8*1024*1024 );
+}
+
+
+static struct map_desc simpad_io_desc[] __initdata = {
+ /* virtual     physical    length      domain     r  w  c  b */
+  { 0xe8000000, 0x00000000, 0x02000000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 0, neccessary for mtd */
+  { 0xf2800000, 0x4b800000, 0x00800000, DOMAIN_IO, 1, 1, 0, 0 }, /* MQ200 */
+  { 0xf1000000, 0x18000000, 0x00100000, DOMAIN_IO, 0, 1, 0, 0 }, /* Paules CS3, write only */
+  LAST_DESC
+};
+
+static void __init simpad_map_io(void)
+{
+	sa1100_map_io();
+	iotable_init(simpad_io_desc);
+
+	sa1100_register_uart(0, 3);
+        sa1100_register_uart(1, 1);
+}
+
+
+MACHINE_START(SIMPAD, "Simpad")
+	MAINTAINER("Juergen Messerer")
+	BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
+	FIXUP(fixup_simpad)
+	MAPIO(simpad_map_io)
+	INITIRQ(sa1100_init_irq)
+MACHINE_END
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/victor.c linux/arch/arm/mach-sa1100/victor.c
--- v2.4.8/linux/arch/arm/mach-sa1100/victor.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-sa1100/victor.c	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,80 @@
+/*
+ * linux/arch/arm/mach-sa1100/victor.c
+ *
+ * Author: Nicolas Pitre
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/delay.h>
+#include <linux/pm.h>
+#include <linux/tty.h>
+
+#include <asm/hardware.h>
+#include <asm/setup.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach/serial_sa1100.h>
+
+#include "generic.h"
+
+
+static void victor_power_off(void)
+{
+	/* switch off power supply */
+	mdelay(2000);
+	GPCR = GPIO_GPIO23;
+	while (1);
+}
+
+static int __init victor_init(void)
+{
+	pm_power_off = victor_power_off;
+	return 0;
+}
+
+__initcall(victor_init);
+
+
+static void __init
+fixup_victor(struct machine_desc *desc, struct param_struct *params,
+	     char **cmdline, struct meminfo *mi)
+{
+	SET_BANK( 0, 0xc0000000, 4*1024*1024 );
+	mi->nr_banks = 1;
+
+	ROOT_DEV = MKDEV( 60, 2 );
+
+	/* Get command line parameters passed from the loader (if any) */
+	if( *((char*)0xc0000000) )
+		strcpy( *cmdline, ((char *)0xc0000000) );
+
+	/* power off if any problem */
+	strcat( *cmdline, " panic=1" );
+}
+
+static struct map_desc victor_io_desc[] __initdata = {
+ /* virtual     physical    length      domain     r  w  c  b */
+  { 0xe8000000, 0x00000000, 0x00200000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash */
+  LAST_DESC
+};
+
+static void __init victor_map_io(void)
+{
+	sa1100_map_io();
+	iotable_init(victor_io_desc);
+
+	sa1100_register_uart(0, 3);
+}
+
+MACHINE_START(VICTOR, "VisuAide Victor")
+	BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
+	FIXUP(fixup_victor)
+	MAPIO(victor_map_io)
+	INITIRQ(sa1100_init_irq)
+MACHINE_END
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/xp860.c linux/arch/arm/mach-sa1100/xp860.c
--- v2.4.8/linux/arch/arm/mach-sa1100/xp860.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-sa1100/xp860.c	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,71 @@
+/*
+ * linux/arch/arm/mach-sa1100/xp860.c
+ */
+
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/delay.h>
+#include <linux/pm.h>
+#include <linux/tty.h>
+
+#include <asm/hardware.h>
+#include <asm/setup.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach/serial_sa1100.h>
+
+#include "generic.h"
+#include "sa1111.h"
+
+
+static void xp860_power_off(void)
+{
+	GPDR |= GPIO_GPIO20;
+	GPSR = GPIO_GPIO20;
+	mdelay(1000);
+	GPCR = GPIO_GPIO20;
+	while(1);
+}
+
+static int __init xp860_init(void)
+{
+	pm_power_off = xp860_power_off;
+	sa1111_init();
+	return 0;
+}
+
+__initcall(xp860_init);
+
+
+static void __init
+fixup_xp860(struct machine_desc *desc, struct param_struct *params,
+	    char **cmdline, struct meminfo *mi)
+{
+	SET_BANK( 0, 0xc0000000, 32*1024*1024 );
+	mi->nr_banks = 1;
+}
+
+static struct map_desc xp860_io_desc[] __initdata = {
+ /* virtual     physical    length      domain     r  w  c  b */
+  { 0xf0000000, 0x10000000, 0x00100000, DOMAIN_IO, 1, 1, 0, 0 }, /* SCSI */
+  { 0xf1000000, 0x18000000, 0x00100000, DOMAIN_IO, 1, 1, 0, 0 }, /* LAN */
+  { 0xf4000000, 0x40000000, 0x00800000, DOMAIN_IO, 1, 1, 0, 0 }, /* SA-1111 */
+  LAST_DESC
+};
+
+static void __init xp860_map_io(void)
+{
+	sa1100_map_io();
+	iotable_init(xp860_io_desc);
+
+	sa1100_register_uart(0, 3);
+	sa1100_register_uart(1, 1);
+}
+
+MACHINE_START(XP860, "XP860")
+	BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
+	FIXUP(fixup_xp860)
+	MAPIO(xp860_map_io)
+	INITIRQ(sa1100_init_irq)
+MACHINE_END
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-sa1100/yopy.c linux/arch/arm/mach-sa1100/yopy.c
--- v2.4.8/linux/arch/arm/mach-sa1100/yopy.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mach-sa1100/yopy.c	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,94 @@
+/*
+ * linux/arch/arm/mach-sa1100/yopy.c
+ */
+
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/tty.h>
+
+#include <asm/hardware.h>
+#include <asm/setup.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach/serial_sa1100.h>
+
+#include "generic.h"
+
+
+static spinlock_t egpio_lock = SPIN_LOCK_UNLOCKED;
+
+static unsigned long yopy_egpio =
+	GPIO_MASK(GPIO_CF_RESET) |
+	GPIO_MASK(GPIO_CLKDIV_CLR1) | GPIO_MASK(GPIO_CLKDIV_CLR2) |
+	GPIO_MASK(GPIO_SPEAKER_MUTE) | GPIO_MASK(GPIO_AUDIO_OPAMP_POWER);
+
+int yopy_gpio_test(unsigned int gpio)
+{
+	return ((yopy_egpio & (1 << gpio)) != 0);
+}
+
+void yopy_gpio_set(unsigned int gpio, int level)
+{
+	unsigned long flags, mask;
+
+	mask = 1 << gpio;
+
+	spin_lock_irqsave(&egpio_lock, flags);
+
+	if (level)
+		yopy_egpio |= mask;
+	else
+		yopy_egpio &= ~mask;
+	YOPY_EGPIO = yopy_egpio;
+
+	spin_unlock_irqrestore(&egpio_lock, flags);
+}
+
+EXPORT_SYMBOL(yopy_gpio_test);
+EXPORT_SYMBOL(yopy_gpio_set);
+
+static int __init yopy_hw_init(void)
+{
+	YOPY_EGPIO = yopy_egpio;
+
+	/* Enable Output */
+	PPDR |= PPC_L_BIAS;
+	PSDR &= ~PPC_L_BIAS;
+	PPSR |= PPC_L_BIAS;
+
+	YOPY_EGPIO = yopy_egpio;
+
+	return 0;
+}
+
+__initcall(yopy_hw_init);
+
+
+static struct map_desc yopy_io_desc[] __initdata = {
+ /* virtual     physical    length      domain     r  w  c  b */
+  { 0xe8000000, 0x00000000, 0x04000000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash 0 */
+  { 0xec000000, 0x08000000, 0x04000000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash 1 */
+  { 0xf0000000, 0x48000000, 0x00300000, DOMAIN_IO, 1, 1, 0, 0 }, /* LCD */
+  { 0xf1000000, 0x10000000, 0x00100000, DOMAIN_IO, 0, 1, 0, 0 }, /* EGPIO */
+  LAST_DESC
+};
+
+static void __init yopy_map_io(void)
+{
+	sa1100_map_io();
+	iotable_init(yopy_io_desc);
+
+	sa1100_register_uart(0, 3);
+}
+
+
+MACHINE_START(YOPY, "Yopy")
+	MAINTAINER("G.Mate, Inc.")
+	BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
+	BOOT_PARAMS(0xc0000100)
+	MAPIO(yopy_map_io)
+	INITIRQ(sa1100_init_irq)
+MACHINE_END
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mach-shark/arch.c linux/arch/arm/mach-shark/arch.c
--- v2.4.8/linux/arch/arm/mach-shark/arch.c	Thu Apr 12 12:20:31 2001
+++ linux/arch/arm/mach-shark/arch.c	Sun Aug 12 11:13:59 2001
@@ -1,10 +1,7 @@
 /*
  *  linux/arch/arm/mach-shark/arch.c
  *
- *  Architecture specific fixups.  This is where any
- *  parameters in the params struct are fixed up, or
- *  any additional architecture specific information
- *  is pulled from the params struct.
+ *  Architecture specific stuff.
  */
 #include <linux/tty.h>
 #include <linux/delay.h>
@@ -18,23 +15,6 @@
 
 #include <asm/mach/arch.h>
 
-static void __init
-fixup_shark(struct machine_desc *desc, struct param_struct *params,
-	char **cmdline, struct meminfo *mi) {
-	int i;
-
-	mi->nr_banks=0;
-	for (i=0;i<NR_BANKS;i++) {
-		if (params->u1.s.pages_in_bank[i] != 0) {
-			mi->nr_banks++;
-			mi->bank[i].node  = 0;
-			mi->bank[i].start = params->u1.s.pages_in_bank[i] & 0xffff0000;
-			mi->bank[i].size  = (params->u1.s.pages_in_bank[i] & 0xffff)*PAGE_SIZE;
-			params->u1.s.pages_in_bank[i] &= 0xffff;
-		}
-	}
-}
-
 extern void shark_map_io(void);
 extern void genarch_init_irq(void);
 
@@ -42,7 +22,6 @@
 	MAINTAINER("Alexander Schulz")
 	BOOT_MEM(0x08000000, 0x40000000, 0xe0000000)
 	BOOT_PARAMS(0x08003000)
-	FIXUP(fixup_shark)
 	MAPIO(shark_map_io)
 	INITIRQ(genarch_init_irq)
 MACHINE_END
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mm/Makefile linux/arch/arm/mm/Makefile
--- v2.4.8/linux/arch/arm/mm/Makefile	Thu Apr 12 12:20:31 2001
+++ linux/arch/arm/mm/Makefile	Sun Aug 12 11:13:59 2001
@@ -17,7 +17,7 @@
 obj-m		:=
 obj-n		:=
 obj-		:=
-export-objs	:= proc-syms.o
+export-objs	:= proc-syms.o discontig.o
 
 cpu32-y		:= consistent.o fault-armv.o ioremap.o mm-armv.o
 cpu32-$(CONFIG_MODULES) += proc-syms.o
@@ -34,7 +34,7 @@
 p-$(CONFIG_CPU_ARM710)	+= proc-arm6,7.o
 p-$(CONFIG_CPU_ARM720T)	+= proc-arm720.o
 p-$(CONFIG_CPU_ARM920T)	+= proc-arm920.o
-p-$(CONFIG_CPU_ARM10)	+= proc-arm10.o
+p-$(CONFIG_CPU_ARM1020)	+= proc-arm1020.o
 p-$(CONFIG_CPU_SA110)	+= proc-sa110.o
 p-$(CONFIG_CPU_SA1100)	+= proc-sa110.o
 
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mm/discontig.c linux/arch/arm/mm/discontig.c
--- v2.4.8/linux/arch/arm/mm/discontig.c	Wed Dec 31 16:00:00 1969
+++ linux/arch/arm/mm/discontig.c	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,36 @@
+/*
+ * linux/arch/arm/mm/discontig.c
+ *
+ * Discontiguous memory support.
+ *
+ * Initial code: Copyright (C) 1999-2000 Nicolas Pitre
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/module.h>
+#include <linux/mm.h>
+#include <linux/init.h>
+#include <linux/bootmem.h>
+
+#if NR_NODES != 4
+#error Fix Me Please
+#endif
+
+/*
+ * Our node_data structure for discontigous memory.
+ */
+
+static bootmem_data_t node_bootmem_data[NR_NODES];
+
+pg_data_t discontig_node_data[NR_NODES] = {
+  { bdata: &node_bootmem_data[0] },
+  { bdata: &node_bootmem_data[1] },
+  { bdata: &node_bootmem_data[2] },
+  { bdata: &node_bootmem_data[3] }
+};
+
+EXPORT_SYMBOL(discontig_node_data);
+
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mm/fault-armv.c linux/arch/arm/mm/fault-armv.c
--- v2.4.8/linux/arch/arm/mm/fault-armv.c	Tue Jul  3 17:08:18 2001
+++ linux/arch/arm/mm/fault-armv.c	Sun Aug 12 17:36:24 2001
@@ -540,6 +540,21 @@
 	return 0;
 }
 
+/*
+ * Hook for things that need to trap external faults.  Note that
+ * we don't guarantee that this will be the final version of the
+ * interface.
+ */
+int (*external_fault)(unsigned long addr, struct pt_regs *regs);
+
+static int
+do_external_fault(unsigned long addr, int error_code, struct pt_regs *regs)
+{
+	if (external_fault)
+		return external_fault(addr, regs);
+	return 1;
+}
+
 static const struct fsr_info {
 	int	(*fn)(unsigned long addr, int error_code, struct pt_regs *regs);
 	int	sig;
@@ -549,13 +564,13 @@
 	{ do_alignment,		SIGILL,	 "alignment exception"		   },
 	{ NULL,			SIGKILL, "terminal exception"		   },
 	{ do_alignment,		SIGILL,	 "alignment exception"		   },
-	{ NULL,			SIGBUS,	 "external abort on linefetch"	   },
+	{ do_external_fault,	SIGBUS,	 "external abort on linefetch"	   },
 	{ do_translation_fault,	SIGSEGV, "section translation fault"	   },
-	{ NULL,			SIGBUS,	 "external abort on linefetch"	   },
+	{ do_external_fault,	SIGBUS,	 "external abort on linefetch"	   },
 	{ do_page_fault,	SIGSEGV, "page translation fault"	   },
-	{ NULL,			SIGBUS,	 "external abort on non-linefetch" },
+	{ do_external_fault,	SIGBUS,	 "external abort on non-linefetch" },
 	{ NULL,			SIGSEGV, "section domain fault"		   },
-	{ NULL,			SIGBUS,	 "external abort on non-linefetch" },
+	{ do_external_fault,	SIGBUS,	 "external abort on non-linefetch" },
 	{ NULL,			SIGSEGV, "page domain fault"		   },
 	{ NULL,			SIGBUS,	 "external abort on translation"   },
 	{ do_sect_fault,	SIGSEGV, "section permission fault"	   },
@@ -571,14 +586,10 @@
 {
 	const struct fsr_info *inf = fsr_info + (fsr & 15);
 
-#if defined(CONFIG_CPU_SA110) || defined(CONFIG_CPU_SA1100)
+#if defined(CONFIG_CPU_SA110) || defined(CONFIG_CPU_SA1100) || defined(CONFIG_DEBUG_ERRORS)
 	if (addr == regs->ARM_pc)
 		goto sa1_weirdness;
 #endif
-#if defined(CONFIG_CPU_ARM720) && defined(CONFIG_ALIGNMENT_TRAP)
-	if (addr & 3 && (fsr & 13) != 1)
-		goto arm720_weirdness;
-#endif
 
 	if (!inf->fn)
 		goto bad;
@@ -593,12 +604,16 @@
 	die_if_kernel("Oops", regs, 0);
 	return;
 
-#if defined(CONFIG_CPU_SA110) || defined(CONFIG_CPU_SA1100)
+#if defined(CONFIG_CPU_SA110) || defined(CONFIG_CPU_SA1100) || defined(CONFIG_DEBUG_ERRORS)
 sa1_weirdness:
 	if (user_mode(regs)) {
 		static int first = 1;
-		if (first)
-			printk(KERN_DEBUG "Weird data abort detected\n");
+		if (first) {
+			printk(KERN_DEBUG "Fixing up bad data abort at %08lx\n", addr);
+#ifdef CONFIG_DEBUG_ERRORS
+			show_pte(current->mm, addr);
+#endif
+		}
 		first = 0;
 		return;
 	}
@@ -607,37 +622,128 @@
 		goto bad;
 	return;
 #endif
-#if defined(CONFIG_CPU_ARM720) && defined(CONFIG_ALIGNMENT_TRAP)
-arm720_weirdness:
-	if (!user_mode(regs)) {
-		unsigned long instr;
-
-		instr = *(unsigned long *)instruction_pointer(regs);
-
-		if ((instr & 0x04400000) != 0x04400000) {
-			static int first = 1;
-			if (first)
-				printk("Mis-reported alignment fault at "
-					"0x%08lx, fsr 0x%02x, code 0x%02x, "
-					"PC = 0x%08lx, instr = 0x%08lx\n",
-					addr, fsr, error_code, regs->ARM_pc,
-					instr);
-			first = 0;
-			cpu_tlb_invalidate_all();
-			cpu_cache_clean_invalidate_all();
-			return;
-		}
+}
+
+asmlinkage void
+do_PrefetchAbort(unsigned long addr, struct pt_regs *regs)
+{
+	do_translation_fault(addr, 0, regs);
+}
+
+/*
+ * We take the easy way out of this problem - we make the
+ * PTE uncacheable.  However, we leave the write buffer on.
+ */
+static void adjust_pte(struct vm_area_struct *vma, unsigned long address)
+{
+	pgd_t *pgd;
+	pmd_t *pmd;
+	pte_t *pte, entry;
+
+	pgd = pgd_offset(vma->vm_mm, address);
+	if (pgd_none(*pgd))
+		return;
+	if (pgd_bad(*pgd))
+		goto bad_pgd;
+
+	pmd = pmd_offset(pgd, address);
+	if (pmd_none(*pmd))
+		return;
+	if (pmd_bad(*pmd))
+		goto bad_pmd;
+
+	pte = pte_offset(pmd, address);
+	entry = *pte;
+
+	/*
+	 * If this page isn't present, or is already setup to
+	 * fault (ie, is old), we can safely ignore any issues.
+	 */
+	if (pte_present(entry) && pte_val(entry) & L_PTE_CACHEABLE) {
+		flush_cache_page(vma, address);
+		pte_val(entry) &= ~L_PTE_CACHEABLE;
+		set_pte(pte, entry);
+		flush_tlb_page(vma, address);
 	}
+	return;
 
-	if (!inf->fn || inf->fn(addr, error_code, regs))
-		goto bad;
+bad_pgd:
+	pgd_ERROR(*pgd);
+	pgd_clear(pgd);
+	return;
+
+bad_pmd:
+	pmd_ERROR(*pmd);
+	pmd_clear(pmd);
 	return;
-#endif
 }
 
-asmlinkage int
-do_PrefetchAbort(unsigned long addr, struct pt_regs *regs)
+/*
+ * Take care of architecture specific things when placing a new PTE into
+ * a page table, or changing an existing PTE.  Basically, there are two
+ * things that we need to take care of:
+ *
+ *  1. If PG_dcache_dirty is set for the page, we need to ensure
+ *     that any cache entries for the kernels virtual memory
+ *     range are written back to the page.
+ *  2. If we have multiple shared mappings of the same space in
+ *     an object, we need to deal with the cache aliasing issues.
+ *
+ * Note that the page_table_lock will be held.
+ */
+void update_mmu_cache(struct vm_area_struct *vma, unsigned long addr, pte_t pte)
 {
-	do_translation_fault(addr, 0, regs);
-	return 1;
+	struct page *page = pte_page(pte);
+	struct vm_area_struct *mpnt;
+	struct mm_struct *mm;
+	unsigned long pgoff;
+	int aliases;
+
+	if (!VALID_PAGE(page) || !page->mapping)
+		return;
+
+	if (test_and_clear_bit(PG_dcache_dirty, &page->flags)) {
+		unsigned long kvirt = (unsigned long)page_address(page);
+		cpu_cache_clean_invalidate_range(kvirt, kvirt + PAGE_SIZE, 0);
+	}
+
+	mm = vma->vm_mm;
+	pgoff = (addr - vma->vm_start) >> PAGE_SHIFT;
+	aliases = 0;
+
+	/*
+	 * If we have any shared mappings that are in the same mm
+	 * space, then we need to handle them specially to maintain
+	 * cache coherency.
+	 */
+	for (mpnt = page->mapping->i_mmap_shared; mpnt;
+	     mpnt = mpnt->vm_next_share) {
+		unsigned long off;
+
+		/*
+		 * If this VMA is not in our MM, we can ignore it.
+		 * Note that we intentionally don't mask out the VMA
+		 * that we are fixing up.
+		 */
+		if (mpnt->vm_mm != mm && mpnt != vma)
+			continue;
+
+		/*
+		 * If the page isn't in this VMA, we can also ignore it.
+		 */
+		if (pgoff < mpnt->vm_pgoff)
+			continue;
+
+		off = pgoff - mpnt->vm_pgoff;
+		if (off >= (mpnt->vm_end - mpnt->vm_start) >> PAGE_SHIFT)
+			continue;
+
+		/*
+		 * Ok, it is within mpnt.  Fix it up.
+		 */
+		adjust_pte(mpnt, mpnt->vm_start + (off << PAGE_SHIFT));
+		aliases ++;
+	}
+	if (aliases)
+		adjust_pte(vma, addr);
 }
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mm/fault-common.c linux/arch/arm/mm/fault-common.c
--- v2.4.8/linux/arch/arm/mm/fault-common.c	Thu Apr 12 12:20:31 2001
+++ linux/arch/arm/mm/fault-common.c	Sun Aug 12 11:13:59 2001
@@ -108,7 +108,7 @@
 	if ((fixup = search_exception_table(instruction_pointer(regs))) != 0) {
 #ifdef DEBUG
 		printk(KERN_DEBUG "%s: Exception at [<%lx>] addr=%lx (fixup: %lx)\n",
-			tsk->comm, regs->ARM_pc, addr, fixup);
+			current->comm, regs->ARM_pc, addr, fixup);
 #endif
 		regs->ARM_pc = fixup;
 		return;
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mm/init.c linux/arch/arm/mm/init.c
--- v2.4.8/linux/arch/arm/mm/init.c	Thu Apr 12 12:20:31 2001
+++ linux/arch/arm/mm/init.c	Sun Aug 12 11:13:59 2001
@@ -376,7 +376,14 @@
 	if (machine_is_archimedes() || machine_is_a5k())
 		reserve_bootmem_node(pgdat, 0x02000000, 0x00080000);
 	if (machine_is_p720t())
-		reserve_bootmem_node(pgdat, PAGE_OFFSET, 0x00014000);
+		reserve_bootmem_node(pgdat, PHYS_OFFSET, 0x00014000);
+#ifdef CONFIG_SA1111
+	/*
+	 * Because of the SA1111 DMA bug, we want to preserve
+	 * our precious DMA-able memory...
+	 */
+	reserve_bootmem_node(pgdat, PHYS_OFFSET, __pa(swapper_pg_dir)-PHYS_OFFSET);
+#endif
 }
 
 /*
@@ -532,6 +539,12 @@
 			zhole_size[0] -= mi->bank[i].size >> PAGE_SHIFT;
 		}
 
+		/*
+		 * Adjust the sizes according to any special
+		 * requirements for this machine type.
+		 */
+		arch_adjust_zones(node, zone_size, zhole_size);
+
 		free_area_init_node(node, pgdat, 0, zone_size,
 				bdata->node_boot_start, zhole_size);
 	}
@@ -542,6 +555,23 @@
 	 */
 	memzero(zero_page, PAGE_SIZE);
 	empty_zero_page = virt_to_page(zero_page);
+	flush_dcache_page(empty_zero_page);
+}
+
+static inline void free_area(unsigned long addr, unsigned long end, char *s)
+{
+	unsigned int size = (end - addr) >> 10;
+
+	for (; addr < end; addr += PAGE_SIZE) {
+		struct page *page = virt_to_page(addr);
+		ClearPageReserved(page);
+		set_page_count(page, 1);
+		free_page(addr);
+		totalram_pages++;
+	}
+
+	if (size && s)
+		printk("Freeing %s memory: %dK\n", s, size);
 }
 
 /*
@@ -571,6 +601,11 @@
 	for (node = 0; node < numnodes; node++)
 		totalram_pages += free_all_bootmem_node(NODE_DATA(node));
 
+#ifdef CONFIG_SA1111
+	/* now that our DMA memory is actually so designated, we can free it */
+	free_area(PAGE_OFFSET, (unsigned long)swapper_pg_dir, NULL);
+#endif
+
 	/*
 	 * Since our memory may not be contiguous, calculate the
 	 * real number of pages we have in this system
@@ -598,22 +633,6 @@
 		 */
 		sysctl_overcommit_memory = 1;
 	}
-}
-
-static inline void free_area(unsigned long addr, unsigned long end, char *s)
-{
-	unsigned int size = (end - addr) >> 10;
-
-	for (; addr < end; addr += PAGE_SIZE) {
-		struct page *page = virt_to_page(addr);
-		ClearPageReserved(page);
-		set_page_count(page, 1);
-		free_page(addr);
-		totalram_pages++;
-	}
-
-	if (size)
-		printk("Freeing %s memory: %dK\n", s, size);
 }
 
 void free_initmem(void)
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mm/mm-sa1100.c linux/arch/arm/mm/mm-sa1100.c
--- v2.4.8/linux/arch/arm/mm/mm-sa1100.c	Thu Apr 12 12:20:31 2001
+++ linux/arch/arm/mm/mm-sa1100.c	Wed Dec 31 16:00:00 1969
@@ -1,189 +0,0 @@
-/*
- *  linux/arch/arm/mm/mm-sa1100.c
- *
- *  Copyright (C) 1998-1999 Russell King
- *  Copyright (C) 1999 Hugo Fiennes
- *
- *  Extra MM routines for the SA1100 architecture
- *
- *  1999/12/04 Nicolas Pitre <nico@cam.org>
- *	Converted memory definition for struct meminfo initialisations.
- *	Memory is listed physically now.
- *
- *  2000/04/07 Nicolas Pitre <nico@cam.org>
- *	Reworked for run-time selection of memory definitions
- *
- */
-#include <linux/config.h>
-#include <linux/sched.h>
-#include <linux/init.h>
-
-#include <asm/hardware.h>
-#include <asm/pgtable.h>
-#include <asm/page.h>
-#include <asm/mach-types.h>
-
-#include <asm/mach/map.h>
- 
-static struct map_desc standard_io_desc[] __initdata = {
- /* virtual     physical    length      domain     r  w  c  b */ \
-  { 0xf6000000, 0x20000000, 0x01000000, DOMAIN_IO, 1, 1, 0, 0 }, /* PCMCIA0 IO */
-  { 0xf7000000, 0x30000000, 0x01000000, DOMAIN_IO, 1, 1, 0, 0 }, /* PCMCIA1 IO */
-  { 0xf8000000, 0x80000000, 0x02000000, DOMAIN_IO, 0, 1, 0, 0 }, /* PCM */
-  { 0xfa000000, 0x90000000, 0x02000000, DOMAIN_IO, 0, 1, 0, 0 }, /* SCM */
-  { 0xfc000000, 0xa0000000, 0x02000000, DOMAIN_IO, 0, 1, 0, 0 }, /* MER */
-  { 0xfe000000, 0xb0000000, 0x02000000, DOMAIN_IO, 0, 1, 0, 0 }, /* LCD + DMA */
-  LAST_DESC
-};
-
-/*
- * Typically, static virtual address mappings are as follow:
- * 
- * 0xe8000000-0xefffffff:	flash memory (especially when multiple flash
- * 				banks need to be mapped contigously)
- * 0xf0000000-0xf3ffffff:	miscellaneous stuff (CPLDs, etc.)
- * 0xf4000000-0xf4ffffff:	SA-1111
- * 0xf5000000-0xf5ffffff:	reserved (used by cache flushing area)
- * 0xf6000000-0xffffffff:	reserved (internal SA1100 IO defined above)
- * 
- * Below 0xe8000000 is reserved for vm allocation.
- */
-
-static struct map_desc assabet_io_desc[] __initdata = {
-#ifdef CONFIG_SA1100_ASSABET
-  { 0xe8000000, 0x00000000, 0x02000000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 0 */
-  { 0xf0000000, 0x10000000, 0x00100000, DOMAIN_IO, 1, 1, 0, 0 }, /* System Registers */
-  { 0xf1000000, 0x12000000, 0x00100000, DOMAIN_IO, 1, 1, 0, 0 }, /* Board Control Register */
-  { 0xf2800000, 0x4b800000, 0x00800000, DOMAIN_IO, 1, 1, 0, 0 }, /* MQ200 */
-  { 0xf4000000, 0x40000000, 0x00100000, DOMAIN_IO, 1, 1, 0, 0 }, /* SA-1111 */
-#endif
-  LAST_DESC
-};
-
-static struct map_desc bitsy_io_desc[] __initdata = {
-#ifdef CONFIG_SA1100_BITSY
-  { 0xe8000000, 0x00000000, 0x02000000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 0 */
-  { 0xf0000000, 0x49000000, 0x02000000, DOMAIN_IO, 1, 1, 0, 0 }, /* EGPIO 0 */
-#endif
-  LAST_DESC
-};
-
-static struct map_desc cerf_io_desc[] __initdata = {
-#ifdef CONFIG_SA1100_CERF
-  { 0xe8000000, 0x00000000, 0x01000000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 0 */
-  { 0xf0000000, 0x08000000, 0x00100000, DOMAIN_IO, 1, 1, 0, 0 }, /* Crystal Chip */
-#endif
-  LAST_DESC
-};
-
-static struct map_desc empeg_io_desc[] __initdata = {
-#ifdef CONFIG_SA1100_EMPEG
-  { EMPEG_FLASHBASE, 0x00000000, 0x00200000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash */
-#endif
-  LAST_DESC
-};
-
-static struct map_desc graphicsclient_io_desc[] __initdata = {
-#ifdef CONFIG_SA1100_GRAPHICSCLIENT
-  { 0xe8000000, 0x08000000, 0x01000000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 1 */
-  { 0xf0000000, 0x10000000, 0x00400000, DOMAIN_IO, 0, 1, 0, 0 }, /* CPLD */
-#endif
-  LAST_DESC
-};
-
-static struct map_desc lart_io_desc[] __initdata = {
-#ifdef CONFIG_SA1100_LART
-  { 0xe8000000, 0x00000000, 0x00400000, DOMAIN_IO, 1, 1, 0, 0 }, /* main flash memory */
-  { 0xec000000, 0x08000000, 0x00400000, DOMAIN_IO, 1, 1, 0, 0 }, /* main flash, alternative location */
-#endif
-  LAST_DESC
-};
-
-static struct map_desc nanoengine_io_desc[] __initdata = {
-#ifdef CONFIG_SA1100_NANOENGINE
-  { 0xe8000000, 0x00000000, 0x02000000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 0 */
-  { 0xf0000000, 0x10000000, 0x00100000, DOMAIN_IO, 1, 1, 0, 0 }, /* System Registers */
-  { 0xf1000000, 0x18A00000, 0x00100000, DOMAIN_IO, 1, 1, 0, 0 }, /* Internal PCI Config Space */
-#endif
-  LAST_DESC
-};
-
-static struct map_desc sherman_io_desc[] __initdata = {
-#ifdef CONFIG_SA1100_SHERMAN
-  { 0xe8000000, 0x00000000, 0x02000000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash*/
-#endif
-  LAST_DESC
-};
-
-static struct map_desc victor_io_desc[] __initdata = {
-#ifdef CONFIG_SA1100_VICTOR
-  { 0xe8000000, 0x00000000, 0x00200000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash */
-#endif
-  LAST_DESC
-};
-
-static struct map_desc xp860_io_desc[] __initdata = {
-#ifdef CONFIG_SA1100_XP860
-  { 0xf0000000, 0x10000000, 0x00100000, DOMAIN_IO, 1, 1, 0, 0 }, /* SCSI */
-  { 0xf1000000, 0x18000000, 0x00100000, DOMAIN_IO, 1, 1, 0, 0 }, /* LAN */
-  { 0xf4000000, 0x40000000, 0x00800000, DOMAIN_IO, 1, 1, 0, 0 }, /* SA-1111 */
-#endif
-  LAST_DESC
-};
-
-static struct map_desc pangolin_io_desc[] __initdata = {
-#ifdef CONFIG_SA1100_PANGOLIN
-  { 0xe8000000, 0x00000000, 0x02000000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 0 */
-#endif
-  LAST_DESC
-};
-
-void __init sa1100_map_io(void)
-{
-	struct map_desc *desc = NULL;
-
-	iotable_init(standard_io_desc);
-
-	if (machine_is_assabet())
-		desc = assabet_io_desc;
-	else if (machine_is_bitsy())
-		desc = bitsy_io_desc;
-	else if (machine_is_cerf())
-		desc = cerf_io_desc;
-	else if (machine_is_empeg())
-		desc = empeg_io_desc;
-	else if (machine_is_graphicsclient())
-		desc = graphicsclient_io_desc;
-	else if (machine_is_lart())
-	        desc = lart_io_desc;
-	else if (machine_is_nanoengine())
-		desc = nanoengine_io_desc;
-	else if (machine_is_sherman())
-		desc = sherman_io_desc;
-	else if (machine_is_victor())
-		desc = victor_io_desc;
-	else if (machine_is_xp860())
-		desc = xp860_io_desc;
-	else if (machine_is_pangolin())
-		desc = pangolin_io_desc;
-
-	if (desc)
-		iotable_init(desc);
-}
-
-/*
- * On Assabet, we must probe for the Neponset board *before* paging_init() 
- * has occurred to actually determine the amount of RAM available.  To do so, 
- * we map the appropriate IO section in the page table here in order to 
- * access GPIO registers.
- */
-void __init map_sa1100_gpio_regs( void )
-{
-	unsigned long phys = _GPLR & PMD_MASK;
-	unsigned long virt = io_p2v(phys);
-	int prot = PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_DOMAIN(DOMAIN_IO);
-	pmd_t pmd;
-	pmd_val(pmd) = phys | prot;
-	set_pmd(pmd_offset(pgd_offset_k(virt), virt), pmd);
-}
-
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mm/proc-arm6,7.S linux/arch/arm/mm/proc-arm6,7.S
--- v2.4.8/linux/arch/arm/mm/proc-arm6,7.S	Tue Mar  6 19:44:35 2001
+++ linux/arch/arm/mm/proc-arm6,7.S	Sun Aug 12 11:13:59 2001
@@ -162,7 +162,7 @@
 		mov	r1, r4
 		mov	r2, r3
 		bl	baddataabort
-		b	ret_from_sys_call
+		b	ret_from_exception
 
 Ldata_lateldrpreconst:
 		tst	r4, #1 << 21			@ check writeback bit
@@ -361,28 +361,24 @@
 
 		.section ".text.init", #alloc, #execinstr
 
-__arm6_setup:	mov	r0, #F_BIT | I_BIT | SVC_MODE
-		msr	cpsr_c, r0
-		mov	r0, #0
+__arm6_setup:	mov	r0, #0
 		mcr	p15, 0, r0, c7, c0		@ flush caches on v3
 		mcr	p15, 0, r0, c5, c0		@ flush TLBs on v3
 		mcr	p15, 0, r4, c2, c0		@ load page table pointer
 		mov	r0, #0x1f			@ Domains 0, 1 = client
 		mcr	p15, 0, r0, c3, c0		@ load domain access register
-		mov	r0, #0x3d			@ ....S..DPWC.M
-		orr	r0, r0, #0x100
+		mov	r0, #0x3d			@ . ..RS BLDP WCAM
+		orr	r0, r0, #0x100			@ . ..01 0011 1101
 		mov	pc, lr
 
-__arm7_setup:	mov	r0, #F_BIT | I_BIT | SVC_MODE
-		msr	cpsr_c, r0
-		mov	r0, #0
+__arm7_setup:	mov	r0, #0
 		mcr	p15, 0, r0, c7, c0		@ flush caches on v3
 		mcr	p15, 0, r0, c5, c0		@ flush TLBs on v3
 		mcr	p15, 0, r4, c2, c0		@ load page table pointer
 		mov	r0, #0x1f			@ Domains 0, 1 = client
 		mcr	p15, 0, r0, c3, c0		@ load domain access register
-		mov	r0, #0x7d			@ ....S.LDPWC.M
-		orr	r0, r0, #0x100
+		mov	r0, #0x7d			@ . ..RS BLDP WCAM
+		orr	r0, r0, #0x100			@ . ..01 0111 1101
 		mov	pc, lr
 
 /*
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mm/proc-arm720.S linux/arch/arm/mm/proc-arm720.S
--- v2.4.8/linux/arch/arm/mm/proc-arm720.S	Tue Mar  6 19:44:35 2001
+++ linux/arch/arm/mm/proc-arm720.S	Sun Aug 12 11:13:59 2001
@@ -171,7 +171,7 @@
 		mov	r1, r4
 		mov	r2, r3
 		bl	baddataabort
-		b	ret_from_sys_call
+		b	ret_from_exception
 
 Ldata_lateldrhpre:
 		tst	r4, #1 << 21			@ check writeback bit
@@ -377,11 +377,9 @@
 		mcr	p15, 0, r0, c3, c0		@ load domain access register
 
 		mrc	p15, 0, r0, c1, c0		@ get control register
-		bic	r0, r0, #0x2e00
-		bic	r0, r0, #0x000e
-		orr	r0, r0, #0x0031			@ ..V...RSBLDPWCAM
-		orr	r0, r0, #0x0100			@ .........111.... (old)
-		orr	r0, r0, #0x000c			@ ..0...01..111101 (new)
+		bic	r0, r0, #0x0e00			@ ..V. ..RS BLDP WCAM
+		orr	r0, r0, #0x2100			@ .... .... .111 .... (old)
+		orr	r0, r0, #0x003d			@ ..1. ..01 ..11 1101 (new)
 		mov	pc, lr				@ __ret (head-armv.S)
 
 /*
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mm/proc-arm920.S linux/arch/arm/mm/proc-arm920.S
--- v2.4.8/linux/arch/arm/mm/proc-arm920.S	Tue Mar  6 19:44:35 2001
+++ linux/arch/arm/mm/proc-arm920.S	Sun Aug 12 11:13:59 2001
@@ -510,21 +510,22 @@
 /*
  * Clear out 'unwanted' bits (then put them in if we need them)
  */
-	bic	r0, r0, #0x0e00			@ ....??r.........
-	bic	r0, r0, #0x0002			@ ..............a.
-	bic	r0, r0, #0x000c			@ W,D
-	bic	r0, r0, #0x1000			@ I
+						@   VI ZFRS BLDP WCAM
+	bic	r0, r0, #0x0e00
+	bic	r0, r0, #0x0002
+	bic	r0, r0, #0x000c
+	bic	r0, r0, #0x1000			@ ...0 000. .... 000.
 /*
  * Turn on what we want
  */
-	orr	r0, r0, #0x0031			@ ..........DP...M
-	orr	r0, r0, #0x0100			@ .......S........
+	orr	r0, r0, #0x0031
+	orr	r0, r0, #0x2100			@ ..1. ...1 ..11 ...1
 
 #ifdef CONFIG_CPU_ARM920_D_CACHE_ON
-	orr	r0, r0, #0x0004			@ Enable D cache
+	orr	r0, r0, #0x0004			@ .... .... .... .1..
 #endif
 #ifdef CONFIG_CPU_ARM920_I_CACHE_ON
-	orr	r0, r0, #0x1000                 @ I Cache on
+	orr	r0, r0, #0x1000			@ ...1 .... .... ....
 #endif
 	mov	pc, lr
 
diff -u --recursive --new-file v2.4.8/linux/arch/arm/mm/proc-sa110.S linux/arch/arm/mm/proc-sa110.S
--- v2.4.8/linux/arch/arm/mm/proc-sa110.S	Thu Apr 12 12:20:31 2001
+++ linux/arch/arm/mm/proc-sa110.S	Sun Aug 12 11:13:59 2001
@@ -601,22 +601,27 @@
 
 __sa1100_setup:	@ Allow read-buffer operations from userland
 	mcr	p15, 0, r0, c9, c0, 5
+	mrc	p15, 0, r0, c1, c0		@ get control register v4
+	bic	r0, r0, #0x0e00			@ ..VI ZFRS BLDP WCAM
+	bic	r0, r0, #0x0002			@ .... 000. .... ..0.
+	orr	r0, r0, #0x003d
+	orr	r0, r0, #0x3100			@ ..11 ...1 ..11 11.1
+	b	__setup_common
 
 __sa110_setup:
-	mov	r0, #F_BIT | I_BIT | SVC_MODE
-	msr	cpsr_c, r0
-	mov	r0, #0
-	mcr	p15, 0, r0, c7, c7		@ invalidate I,D caches on v4
-	mcr	p15, 0, r0, c7, c10, 4		@ drain write buffer on v4
-	mcr	p15, 0, r0, c8, c7		@ invalidate I,D TLBs on v4
-	mcr	p15, 0, r4, c2, c0		@ load page table pointer
-	mov	r0, #0x1f			@ Domains 0, 1 = client
-	mcr	p15, 0, r0, c3, c0		@ load domain access register
 	mrc	p15, 0, r0, c1, c0		@ get control register v4
-	bic	r0, r0, #0x0e00			@ ....??r.........
-	bic	r0, r0, #0x0002			@ ..............a.
-	orr	r0, r0, #0x003d			@ ..........DPWC.M
-	orr	r0, r0, #0x1100			@ ...I...S........
+	bic	r0, r0, #0x2e00			@ ..VI ZFRS BLDP WCAM
+	bic	r0, r0, #0x0002			@ ..0. 000. .... ..0.
+	orr	r0, r0, #0x003d
+	orr	r0, r0, #0x1100			@ ...1 ...1 ..11 11.1
+__setup_common:
+	mov	r10, #0
+	mcr	p15, 0, r10, c7, c7		@ invalidate I,D caches on v4
+	mcr	p15, 0, r10, c7, c10, 4		@ drain write buffer on v4
+	mcr	p15, 0, r10, c8, c7		@ invalidate I,D TLBs on v4
+	mcr	p15, 0, r4, c2, c0		@ load page table pointer
+	mov	r10, #0x1f			@ Domains 0, 1 = client
+	mcr	p15, 0, r10, c3, c0		@ load domain access register
 	mov	pc, lr
 
 	.text
diff -u --recursive --new-file v2.4.8/linux/arch/arm/nwfpe/double_cpdo.c linux/arch/arm/nwfpe/double_cpdo.c
--- v2.4.8/linux/arch/arm/nwfpe/double_cpdo.c	Wed Apr 11 19:02:27 2001
+++ linux/arch/arm/nwfpe/double_cpdo.c	Sun Aug 12 11:13:59 2001
@@ -37,6 +37,7 @@
 
 unsigned int DoubleCPDO(const unsigned int opcode)
 {
+   FPA11 *fpa11 = GET_FPA11();
    float64 rFm, rFn;
    unsigned int Fd, Fm, Fn, nRc = 1;
 
diff -u --recursive --new-file v2.4.8/linux/arch/arm/nwfpe/entry.S linux/arch/arm/nwfpe/entry.S
--- v2.4.8/linux/arch/arm/nwfpe/entry.S	Wed Apr 11 19:02:27 2001
+++ linux/arch/arm/nwfpe/entry.S	Sun Aug 12 11:13:59 2001
@@ -77,10 +77,7 @@
 	   emulation.  This would reduce load/store overhead at the expense
 	   of stealing two regs from the register allocator.  Not sure if
 	   it's worth it.  */
-	ldr r4, =userRegisters
-        str sp, [r4]			@ save pointer to user regs
-	ldr r4, =fpa11
-	str r10, [r4]			@ store pointer to our state
+	str sp, [r10]                   @ Store the user registers pointer in the fpa11 structure.
         mov r4, sp			@ use r4 for local pointer
         mov r10, lr			@ save the failure-return addresses
 
diff -u --recursive --new-file v2.4.8/linux/arch/arm/nwfpe/extended_cpdo.c linux/arch/arm/nwfpe/extended_cpdo.c
--- v2.4.8/linux/arch/arm/nwfpe/extended_cpdo.c	Wed Apr 11 19:02:27 2001
+++ linux/arch/arm/nwfpe/extended_cpdo.c	Sun Aug 12 11:13:59 2001
@@ -37,6 +37,7 @@
 
 unsigned int ExtendedCPDO(const unsigned int opcode)
 {
+   FPA11 *fpa11 = GET_FPA11();
    floatx80 rFm, rFn;
    unsigned int Fd, Fm, Fn, nRc = 1;
 
diff -u --recursive --new-file v2.4.8/linux/arch/arm/nwfpe/fpa11.c linux/arch/arm/nwfpe/fpa11.c
--- v2.4.8/linux/arch/arm/nwfpe/fpa11.c	Wed Apr 11 19:02:27 2001
+++ linux/arch/arm/nwfpe/fpa11.c	Sun Aug 12 11:13:59 2001
@@ -32,14 +32,12 @@
 unsigned int EmulateCPDT(const unsigned int);
 unsigned int EmulateCPRT(const unsigned int);
 
-/* Emulator registers */
-FPA11 *fpa11;
-
 /* Reset the FPA11 chip.  Called to initialize and reset the emulator. */
 void resetFPA11(void)
 {
   int i;
-
+  FPA11 *fpa11 = GET_FPA11();
+  
   /* initialize the register type array */
   for (i=0;i<=7;i++)
   {
@@ -130,8 +128,10 @@
 {
   unsigned int nRc = 0;
   unsigned long flags;
-
+  FPA11 *fpa11; 
   save_flags(flags); sti();
+
+  fpa11 = GET_FPA11();
 
   if (fpa11->initflag == 0)		/* good place for __builtin_expect */
   {
diff -u --recursive --new-file v2.4.8/linux/arch/arm/nwfpe/fpa11.h linux/arch/arm/nwfpe/fpa11.h
--- v2.4.8/linux/arch/arm/nwfpe/fpa11.h	Wed Oct 20 16:29:08 1999
+++ linux/arch/arm/nwfpe/fpa11.h	Sun Aug 12 11:13:59 2001
@@ -26,6 +26,9 @@
 #include "fpsr.h"		/* FP control and status register definitions */
 #include "softfloat.h"
 
+/* Need task_struct */
+#include <linux/sched.h>
+
 #define		typeNone		0x00
 #define		typeSingle		0x01
 #define		typeDouble		0x02
@@ -39,6 +42,7 @@
 
 /* FPA11 device model */
 typedef struct tagFPA11 {
+  unsigned int *userRegisters;
   FPREG fpreg[8];		/* 8 floating point registers */
   FPSR fpsr;			/* floating point status register */
   FPCR fpcr;			/* floating point control register */
@@ -56,6 +60,7 @@
 extern void SetRoundingMode(const unsigned int);
 extern void SetRoundingPrecision(const unsigned int);
 
-extern FPA11 *fpa11;
+#define GET_FPA11() ((FPA11 *)(&current->thread.fpstate))
+#define GET_USERREG() (GET_FPA11()->userRegisters)
 
 #endif
diff -u --recursive --new-file v2.4.8/linux/arch/arm/nwfpe/fpa11.inl linux/arch/arm/nwfpe/fpa11.inl
--- v2.4.8/linux/arch/arm/nwfpe/fpa11.inl	Wed Apr 11 19:02:27 2001
+++ linux/arch/arm/nwfpe/fpa11.inl	Sun Aug 12 11:13:59 2001
@@ -24,11 +24,13 @@
 /* Read and write floating point status register */
 extern __inline__ unsigned int readFPSR(void)
 {
+  FPA11 *fpa11 = GET_FPA11();
   return(fpa11->fpsr);
 }
 
 extern __inline__ void writeFPSR(FPSR reg)
 {
+  FPA11 *fpa11 = GET_FPA11();
   /* the sysid byte in the status register is readonly */
   fpa11->fpsr = (fpa11->fpsr & MASK_SYSID) | (reg & ~MASK_SYSID);
 }
@@ -36,12 +38,14 @@
 /* Read and write floating point control register */
 extern __inline__ FPCR readFPCR(void)
 {
+  FPA11 *fpa11 = GET_FPA11();
   /* clear SB, AB and DA bits before returning FPCR */
   return(fpa11->fpcr & ~MASK_RFC);
 }
 
 extern __inline__ void writeFPCR(FPCR reg)
 {
+  FPA11 *fpa11 = GET_FPA11();
   fpa11->fpcr &= ~MASK_WFC;		/* clear SB, AB and DA bits */
   fpa11->fpcr |= (reg & MASK_WFC);	/* write SB, AB and DA bits */
 }
diff -u --recursive --new-file v2.4.8/linux/arch/arm/nwfpe/fpa11_cpdo.c linux/arch/arm/nwfpe/fpa11_cpdo.c
--- v2.4.8/linux/arch/arm/nwfpe/fpa11_cpdo.c	Wed Apr 11 19:02:27 2001
+++ linux/arch/arm/nwfpe/fpa11_cpdo.c	Sun Aug 12 11:13:59 2001
@@ -28,6 +28,7 @@
 
 unsigned int EmulateCPDO(const unsigned int opcode)
 {
+   FPA11 *fpa11 = GET_FPA11();
    unsigned int Fd, nType, nDest, nRc = 1;
    
    //printk("EmulateCPDO(0x%08x)\n",opcode);
diff -u --recursive --new-file v2.4.8/linux/arch/arm/nwfpe/fpa11_cpdt.c linux/arch/arm/nwfpe/fpa11_cpdt.c
--- v2.4.8/linux/arch/arm/nwfpe/fpa11_cpdt.c	Mon Nov 27 17:07:59 2000
+++ linux/arch/arm/nwfpe/fpa11_cpdt.c	Sun Aug 12 11:13:59 2001
@@ -28,16 +28,18 @@
 
 #include <asm/uaccess.h>
 
-extern __inline__
+static inline
 void loadSingle(const unsigned int Fn,const unsigned int *pMem)
 {
+   FPA11 *fpa11 = GET_FPA11();
    fpa11->fType[Fn] = typeSingle;
    get_user(fpa11->fpreg[Fn].fSingle, pMem);
 }
 
-extern __inline__
+static inline
 void loadDouble(const unsigned int Fn,const unsigned int *pMem)
 {
+   FPA11 *fpa11 = GET_FPA11();
    unsigned int *p;
    p = (unsigned int*)&fpa11->fpreg[Fn].fDouble;
    fpa11->fType[Fn] = typeDouble;
@@ -45,9 +47,10 @@
    get_user(p[1], &pMem[0]); /* sign & exponent */
 }   
 
-extern __inline__
+static inline
 void loadExtended(const unsigned int Fn,const unsigned int *pMem)
 {
+   FPA11 *fpa11 = GET_FPA11();
    unsigned int *p;
    p = (unsigned int*)&fpa11->fpreg[Fn].fExtended;
    fpa11->fType[Fn] = typeExtended;
@@ -56,9 +59,10 @@
    get_user(p[2], &pMem[1]);  /* ms bits */
 }   
 
-extern __inline__
+static inline
 void loadMultiple(const unsigned int Fn,const unsigned int *pMem)
 {
+   FPA11 *fpa11 = GET_FPA11();
    register unsigned int *p;
    unsigned long x;
 
@@ -87,9 +91,10 @@
    }
 }
 
-extern __inline__
+static inline
 void storeSingle(const unsigned int Fn,unsigned int *pMem)
 {
+   FPA11 *fpa11 = GET_FPA11();
    float32 val;
    register unsigned int *p = (unsigned int*)&val;
    
@@ -109,9 +114,10 @@
    put_user(p[0], pMem);
 }   
 
-extern __inline__
+static inline
 void storeDouble(const unsigned int Fn,unsigned int *pMem)
 {
+   FPA11 *fpa11 = GET_FPA11();
    float64 val;
    register unsigned int *p = (unsigned int*)&val;
 
@@ -131,9 +137,10 @@
    put_user(p[0], &pMem[1]);	/* lsw */
 }   
 
-extern __inline__
+static inline
 void storeExtended(const unsigned int Fn,unsigned int *pMem)
 {
+   FPA11 *fpa11 = GET_FPA11();
    floatx80 val;
    register unsigned int *p = (unsigned int*)&val;
    
@@ -155,9 +162,10 @@
    put_user(p[2], &pMem[1]); /* msw */
 }   
 
-extern __inline__
+static inline
 void storeMultiple(const unsigned int Fn,unsigned int *pMem)
 {
+   FPA11 *fpa11 = GET_FPA11();
    register unsigned int nType, *p;
    
    p = (unsigned int*)&(fpa11->fpreg[Fn]);
diff -u --recursive --new-file v2.4.8/linux/arch/arm/nwfpe/fpa11_cprt.c linux/arch/arm/nwfpe/fpa11_cprt.c
--- v2.4.8/linux/arch/arm/nwfpe/fpa11_cprt.c	Wed Apr 11 19:02:27 2001
+++ linux/arch/arm/nwfpe/fpa11_cprt.c	Sun Aug 12 11:13:59 2001
@@ -78,6 +78,8 @@
 
 unsigned int PerformFLT(const unsigned int opcode)
 {
+   FPA11 *fpa11 = GET_FPA11();
+   
    unsigned int nRc = 1;
    SetRoundingMode(opcode);
    SetRoundingPrecision(opcode);
@@ -116,6 +118,7 @@
 
 unsigned int PerformFIX(const unsigned int opcode)
 {
+   FPA11 *fpa11 = GET_FPA11();
    unsigned int nRc = 1;
    unsigned int Fn = getFm(opcode);
    
@@ -182,6 +185,7 @@
    
 static unsigned int PerformComparison(const unsigned int opcode)
 {
+   FPA11 *fpa11 = GET_FPA11();
    unsigned int Fn, Fm;
    floatx80 rFn, rFm;
    int e_flag = opcode & 0x400000;	/* 1 if CxFE */
diff -u --recursive --new-file v2.4.8/linux/arch/arm/nwfpe/fpmodule.c linux/arch/arm/nwfpe/fpmodule.c
--- v2.4.8/linux/arch/arm/nwfpe/fpmodule.c	Wed Apr 11 19:02:27 2001
+++ linux/arch/arm/nwfpe/fpmodule.c	Sun Aug 12 11:13:59 2001
@@ -39,9 +39,6 @@
 #include "fpa11.h"
 #include "fpa11.inl"
 
-/* external data */
-extern FPA11 *fpa11;
-
 /* kernel symbols required for signal handling */
 typedef struct task_struct*	PTASK;
 
@@ -71,9 +68,6 @@
 /* forward declarations */
 extern void nwfpe_enter(void);
 
-/* Address of user registers on the kernel stack. */
-unsigned int *userRegisters;
-
 #ifdef MODULE
 /*
  * Return 0 if we can be unloaded.  This can only happen if
@@ -145,7 +139,7 @@
 #ifdef CONFIG_DEBUG_USER
   printk(KERN_DEBUG "NWFPE: %s[%d] takes exception %08x at %p from %08x\n",
 	 current->comm, current->pid, flags,
-	 __builtin_return_address(0), userRegisters[15]);
+	 __builtin_return_address(0), GET_USERREG()[15]);
 #endif
 
   /* Keep SoftFloat exception flags up to date.  */
diff -u --recursive --new-file v2.4.8/linux/arch/arm/nwfpe/fpmodule.inl linux/arch/arm/nwfpe/fpmodule.inl
--- v2.4.8/linux/arch/arm/nwfpe/fpmodule.inl	Wed Apr 11 19:02:27 2001
+++ linux/arch/arm/nwfpe/fpmodule.inl	Sun Aug 12 11:13:59 2001
@@ -19,9 +19,6 @@
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
 
-/* Address of user registers on the kernel stack. */
-extern unsigned int *userRegisters;
-
 extern __inline__
 unsigned int readRegister(const unsigned int nReg)
 {
@@ -32,6 +29,7 @@
            for this in this routine.  LDF/STF instructions with Rn = PC
            depend on the PC being correct, as they use PC+8 in their 
            address calculations. */
+  unsigned int *userRegisters = GET_USERREG();
   unsigned int val = userRegisters[nReg];
   if (REG_PC == nReg) val -= 4;
   return val;
@@ -40,6 +38,7 @@
 extern __inline__
 void writeRegister(const unsigned int nReg, const unsigned int val)
 {
+  unsigned int *userRegisters = GET_USERREG();
   userRegisters[nReg] = val;
 }
 
@@ -68,6 +67,7 @@
 extern __inline__
 void writeConditionCodes(const unsigned int val)
 {
+  unsigned int *userRegisters = GET_USERREG();
   unsigned int rval;
   /*
    * Operate directly on userRegisters since
diff -u --recursive --new-file v2.4.8/linux/arch/arm/nwfpe/single_cpdo.c linux/arch/arm/nwfpe/single_cpdo.c
--- v2.4.8/linux/arch/arm/nwfpe/single_cpdo.c	Wed Apr 11 19:02:27 2001
+++ linux/arch/arm/nwfpe/single_cpdo.c	Sun Aug 12 11:13:59 2001
@@ -37,6 +37,7 @@
 
 unsigned int SingleCPDO(const unsigned int opcode)
 {
+   FPA11 *fpa11 = GET_FPA11();
    float32 rFm, rFn;
    unsigned int Fd, Fm, Fn, nRc = 1;
 
diff -u --recursive --new-file v2.4.8/linux/arch/arm/tools/mach-types linux/arch/arm/tools/mach-types
--- v2.4.8/linux/arch/arm/tools/mach-types	Wed Jul 25 17:10:17 2001
+++ linux/arch/arm/tools/mach-types	Sun Aug 12 17:36:24 2001
@@ -6,7 +6,7 @@
 # To add an entry into this database, please see Documentation/arm/README,
 # or contact rmk@arm.linux.org.uk
 #
-# Last update: Wed Jul 4 20:04:11 2001
+# Last update: Thu Aug 9 22:46:02 2001
 #
 # machine_is_xxx	CONFIG_xxxx		MACH_TYPE_xxx		number
 #
@@ -103,5 +103,15 @@
 cs89712			ARCH_CS89712		CS89712			92
 weararm			SA1100_WEARARM		WEARARM			93
 possio_px		SA1100_POSSIO_PX	POSSIO_PX		94
-
-# The following are unallocated
+sidearm			SA1100_SIDEARM		SIDEARM			95
+stork			SA1100_STORK		STORK			96
+shannon			SA1100_SHANNON		SHANNON			97
+ace			ARCH_ACE		ACE			98
+ballyarm		SA1100_BALLYARM		BALLYARM		99
+simputer		SA1100_SIMPUTER		SIMPUTER		100
+nexterm			SA1100_NEXTERM		NEXTERM			101
+sa1100_elf		SA1100_SA1100_ELF	SA1100_ELF		102
+gator			SA1100_GATOR		GATOR			103
+granite			ARCH_GRANITE		GRANITE			104
+consus			SA1100_CONSUS		CONSUS			105
+aaec2000_aaed20		ARCH_AAEC2000_AAED2000	AAEC2000_AAED2000	106
diff -u --recursive --new-file v2.4.8/linux/arch/arm/vmlinux-armo.lds.in linux/arch/arm/vmlinux-armo.lds.in
--- v2.4.8/linux/arch/arm/vmlinux-armo.lds.in	Tue Jul  3 17:08:18 2001
+++ linux/arch/arm/vmlinux-armo.lds.in	Sun Aug 12 11:13:59 2001
@@ -18,6 +18,9 @@
 		__arch_info_begin = .;
 			*(.arch.info)
 		__arch_info_end = .;
+		__tagtable_begin = .;
+			*(.taglist)
+		__tagtable_end = .;
 			*(.data.init)
 		. = ALIGN(16);
 		__setup_start = .;
diff -u --recursive --new-file v2.4.8/linux/arch/arm/vmlinux-armv.lds.in linux/arch/arm/vmlinux-armv.lds.in
--- v2.4.8/linux/arch/arm/vmlinux-armv.lds.in	Tue Jul  3 17:08:18 2001
+++ linux/arch/arm/vmlinux-armv.lds.in	Sun Aug 12 11:13:59 2001
@@ -17,6 +17,9 @@
 		__arch_info_begin = .;
 			*(.arch.info)
 		__arch_info_end = .;
+		__tagtable_begin = .;
+			*(.taglist)
+		__tagtable_end = .;
 			*(.data.init)
 		. = ALIGN(16);
 		__setup_start = .;
diff -u --recursive --new-file v2.4.8/linux/arch/i386/defconfig linux/arch/i386/defconfig
--- v2.4.8/linux/arch/i386/defconfig	Wed Jul 25 17:10:17 2001
+++ linux/arch/i386/defconfig	Sun Aug 12 12:24:48 2001
@@ -655,8 +655,10 @@
 # Sound
 #
 CONFIG_SOUND=y
+# CONFIG_SOUND_BT878 is not set
 # CONFIG_SOUND_CMPCI is not set
 # CONFIG_SOUND_EMU10K1 is not set
+# CONFIG_MIDI_EMU10K1 is not set
 # CONFIG_SOUND_FUSION is not set
 # CONFIG_SOUND_CS4281 is not set
 # CONFIG_SOUND_ES1370 is not set
@@ -665,6 +667,7 @@
 # CONFIG_SOUND_MAESTRO is not set
 # CONFIG_SOUND_MAESTRO3 is not set
 # CONFIG_SOUND_ICH is not set
+# CONFIG_SOUND_RME96XX is not set
 # CONFIG_SOUND_SONICVIBES is not set
 # CONFIG_SOUND_TRIDENT is not set
 # CONFIG_SOUND_MSNDCLAS is not set
diff -u --recursive --new-file v2.4.8/linux/arch/i386/kernel/dmi_scan.c linux/arch/i386/kernel/dmi_scan.c
--- v2.4.8/linux/arch/i386/kernel/dmi_scan.c	Sun Aug 12 13:27:58 2001
+++ linux/arch/i386/kernel/dmi_scan.c	Sun Aug 12 11:16:18 2001
@@ -33,28 +33,46 @@
 	return bp;
 }
 
+/*
+ *	We have to be cautious here. We have seen BIOSes with DMI pointers
+ *	pointing to completely the wrong place for example
+ */
+ 
 static int __init dmi_table(u32 base, int len, int num, void (*decode)(struct dmi_header *))
 {
 	u8 *buf;
 	struct dmi_header *dm;
 	u8 *data;
 	int i=1;
-	int last = 0;	
 		
 	buf = ioremap(base, len);
 	if(buf==NULL)
 		return -1;
 
 	data = buf;
+
+	/*
+ 	 *	Stop when we see al the items the table claimed to have
+ 	 *	OR we run off the end of the table (also happens)
+ 	 */
+ 
 	while(i<num && (data - buf) < len)
 	{
 		dm=(struct dmi_header *)data;
-		if(dm->type < last)
+	
+		/*
+		 *	Avoid misparsing crud if the length of the last
+	 	 *	record is crap 
+		 */
+		if((data-buf+dm->length) >= len)
 			break;
-		last = dm->type;
 		decode(dm);		
 		data+=dm->length;
-		while(*data || data[1])
+		/*
+		 *	Don't go off the end of the data if there is
+	 	 *	stuff looking like string fill past the end
+	 	 */
+		while((data-buf) < len && (*data || data[1]))
 			data++;
 		data+=2;
 		i++;
diff -u --recursive --new-file v2.4.8/linux/arch/i386/kernel/pci-pc.c linux/arch/i386/kernel/pci-pc.c
--- v2.4.8/linux/arch/i386/kernel/pci-pc.c	Tue Jul  3 17:08:18 2001
+++ linux/arch/i386/kernel/pci-pc.c	Sun Aug 12 10:54:07 2001
@@ -948,34 +948,6 @@
 	d->irq = 9;
 }
 
-static void __init pci_fixup_via691(struct pci_dev *d)
-{
-	/*
-	 * The VIA bridge corrupts with Posting enabled
-	 */
-	u8 tmp;
-	
-	pci_read_config_byte(d, 0x70, &tmp);
-	if(tmp & (1<<7)) {
-		printk("PCI: Disabled enhanced CPU to PCI posting\n");
-		pci_write_config_byte(d, 0x70, tmp & ~(1<<7));
-	}
-}
-static void __init pci_fixup_via691_2(struct pci_dev *d)
-{
-	/*
-	 * The VIA bridge corrupts with Posting enabled
-	 */
-	u8 tmp;
-	
-	pci_read_config_byte(d, 0x40, &tmp);
-	if(tmp & (1<<7)) {
-		printk("PCI: Disabled enhanced CPU to PCI posting #2\n");
-		pci_write_config_byte(d, 0x40, tmp & ~(1<<7));
-	}
-}
-
-
 struct pci_fixup pcibios_fixups[] = {
 	{ PCI_FIXUP_HEADER,	PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82451NX,	pci_fixup_i450nx },
 	{ PCI_FIXUP_HEADER,	PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82454GX,	pci_fixup_i450gx },
@@ -994,8 +966,6 @@
 	{ PCI_FIXUP_HEADER,	PCI_ANY_ID,		PCI_ANY_ID,			pci_fixup_ide_bases },
 	{ PCI_FIXUP_HEADER,	PCI_VENDOR_ID_SI,	PCI_DEVICE_ID_SI_5597,		pci_fixup_latency },
 	{ PCI_FIXUP_HEADER,	PCI_VENDOR_ID_SI,	PCI_DEVICE_ID_SI_5598,		pci_fixup_latency },
- 	{ PCI_FIXUP_HEADER,	PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_82C691,	pci_fixup_via691 },
- 	{ PCI_FIXUP_HEADER,	PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_82C598_1,	pci_fixup_via691_2 },
  	{ PCI_FIXUP_HEADER,	PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82371AB_3,	pci_fixup_piix4_acpi },
 	{ 0 }
 };
diff -u --recursive --new-file v2.4.8/linux/arch/i386/kernel/smp.c linux/arch/i386/kernel/smp.c
--- v2.4.8/linux/arch/i386/kernel/smp.c	Tue Feb 13 14:13:43 2001
+++ linux/arch/i386/kernel/smp.c	Sun Aug 12 10:38:47 2001
@@ -28,21 +28,21 @@
  *	The Linux implications for SMP are handled as follows:
  *
  *	Pentium III / [Xeon]
- *		None of the E1AP-E3AP erratas are visible to the user.
+ *		None of the E1AP-E3AP errata are visible to the user.
  *
  *	E1AP.	see PII A1AP
  *	E2AP.	see PII A2AP
  *	E3AP.	see PII A3AP
  *
  *	Pentium II / [Xeon]
- *		None of the A1AP-A3AP erratas are visible to the user.
+ *		None of the A1AP-A3AP errata are visible to the user.
  *
  *	A1AP.	see PPro 1AP
  *	A2AP.	see PPro 2AP
  *	A3AP.	see PPro 7AP
  *
  *	Pentium Pro
- *		None of 1AP-9AP erratas are visible to the normal user,
+ *		None of 1AP-9AP errata are visible to the normal user,
  *	except occasional delivery of 'spurious interrupt' as trap #15.
  *	This is very rare and a non-problem.
  *
diff -u --recursive --new-file v2.4.8/linux/arch/i386/kernel/traps.c linux/arch/i386/kernel/traps.c
--- v2.4.8/linux/arch/i386/kernel/traps.c	Tue Jul  3 17:08:18 2001
+++ linux/arch/i386/kernel/traps.c	Sun Aug 12 11:13:59 2001
@@ -48,6 +48,7 @@
 #endif
 
 #include <linux/irq.h>
+#include <linux/module.h>
 
 asmlinkage int system_call(void);
 asmlinkage void lcall7(void);
@@ -88,39 +89,65 @@
 
 int kstack_depth_to_print = 24;
 
+
 /*
- * These constants are for searching for possible module text
- * segments.
+ * If the address is either in the .text section of the
+ * kernel, or in the vmalloc'ed module regions, it *may* 
+ * be the address of a calling routine
  */
 
+#ifdef CONFIG_MODULES
+
+extern struct module *module_list;
+extern struct module kernel_module;
+
+static inline int kernel_text_address(unsigned long addr)
+{
+	int retval = 0;
+	struct module *mod;
+
+	if (addr >= (unsigned long) &_stext &&
+	    addr <= (unsigned long) &_etext)
+		return 1;
+
+	for (mod = module_list; mod != &kernel_module; mod = mod->next) {
+		/* mod_bound tests for addr being inside the vmalloc'ed
+		 * module area. Of course it'd be better to test only
+		 * for the .text subset... */
+		if (mod_bound(addr, 0, mod)) {
+			retval = 1;
+			break;
+		}
+	}
+
+	return retval;
+}
+
+#else
+
+static inline int kernel_text_address(unsigned long addr)
+{
+	return (addr >= (unsigned long) &_stext &&
+		addr <= (unsigned long) &_etext);
+}
+
+#endif
+
 void show_trace(unsigned long * stack)
 {
 	int i;
-	unsigned long addr, module_start, module_end;
+	unsigned long addr;
 
 	if (!stack)
 		stack = (unsigned long*)&stack;
 
 	printk("Call Trace: ");
 	i = 1;
-	module_start = VMALLOC_START;
-	module_end = VMALLOC_END;
-	module_end = 0;
 	while (((long) stack & (THREAD_SIZE-1)) != 0) {
 		addr = *stack++;
-		/*
-		 * If the address is either in the text segment of the
-		 * kernel, or in the region which contains vmalloc'ed
-		 * memory, it *may* be the address of a calling
-		 * routine; if so, print it so that someone tracing
-		 * down the cause of the crash will be able to figure
-		 * out the call path that was taken.
-		 */
-		if (((addr >= (unsigned long) &_stext) &&
-		     (addr <= (unsigned long) &_etext)) ||
-		    ((addr >= module_start) && (addr <= module_end))) {
-			if (i && ((i % 8) == 0))
-				printk("\n       ");
+		if (kernel_text_address(addr)) {
+			if (i && ((i % 6) == 0))
+				printk("\n   ");
 			printk("[<%08lx>] ", addr);
 			i++;
 		}
diff -u --recursive --new-file v2.4.8/linux/arch/i386/lib/delay.c linux/arch/i386/lib/delay.c
--- v2.4.8/linux/arch/i386/lib/delay.c	Sun Dec 31 10:26:18 2000
+++ linux/arch/i386/lib/delay.c	Sun Aug 12 10:29:44 2001
@@ -13,6 +13,7 @@
 #include <linux/config.h>
 #include <linux/sched.h>
 #include <linux/delay.h>
+#include <asm/processor.h>
 #include <asm/delay.h>
 
 #ifdef CONFIG_SMP
@@ -34,9 +35,9 @@
 	rdtscl(bclock);
 	do
 	{
+		rep_nop();
 		rdtscl(now);
-	}
-	while((now-bclock) < loops);
+	} while ((now-bclock) < loops);
 }
 
 /*
@@ -58,7 +59,7 @@
 
 void __delay(unsigned long loops)
 {
-	if(x86_udelay_tsc)
+	if (x86_udelay_tsc)
 		__rdtsc_delay(loops);
 	else
 		__loop_delay(loops);
diff -u --recursive --new-file v2.4.8/linux/arch/ia64/ia32/sys_ia32.c linux/arch/ia64/ia32/sys_ia32.c
--- v2.4.8/linux/arch/ia64/ia32/sys_ia32.c	Sun Aug 12 13:27:58 2001
+++ linux/arch/ia64/ia32/sys_ia32.c	Sun Aug 12 15:07:42 2001
@@ -746,7 +746,7 @@
 };
 
 static int
-filldir32 (void *__buf, const char *name, int namlen, off_t offset, ino_t ino,
+filldir32 (void *__buf, const char *name, int namlen, loff_t offset, ino_t ino,
 	   unsigned int d_type)
 {
 	struct linux32_dirent * dirent;
@@ -811,7 +811,7 @@
 }
 
 static int
-fillonedir32 (void * __buf, const char * name, int namlen, off_t offset, ino_t ino,
+fillonedir32 (void * __buf, const char * name, int namlen, loff_t offset, ino_t ino,
 	      unsigned int d_type)
 {
 	struct readdir32_callback * buf = (struct readdir32_callback *) __buf;
diff -u --recursive --new-file v2.4.8/linux/arch/mips/ite-boards/generic/irq.c linux/arch/mips/ite-boards/generic/irq.c
--- v2.4.8/linux/arch/mips/ite-boards/generic/irq.c	Fri Apr 13 20:26:07 2001
+++ linux/arch/mips/ite-boards/generic/irq.c	Sun Aug 12 10:38:47 2001
@@ -44,7 +44,7 @@
 #include <linux/interrupt.h>
 #include <linux/ioport.h>
 #include <linux/timex.h>
-#include <linux/malloc.h>
+#include <linux/slab.h>
 #include <linux/random.h>
 #include <linux/serial_reg.h>
 
diff -u --recursive --new-file v2.4.8/linux/arch/mips/kernel/sysirix.c linux/arch/mips/kernel/sysirix.c
--- v2.4.8/linux/arch/mips/kernel/sysirix.c	Tue Jul  3 17:08:18 2001
+++ linux/arch/mips/kernel/sysirix.c	Sun Aug 12 15:05:26 2001
@@ -1846,7 +1846,7 @@
 #define ROUND_UP32(x) (((x)+sizeof(u32)-1) & ~(sizeof(u32)-1))
 
 static int irix_filldir32(void *__buf, const char *name, int namlen,
-                          off_t offset, ino_t ino, unsigned int d_type)
+                          loff_t offset, ino_t ino, unsigned int d_type)
 {
 	struct irix_dirent32 *dirent;
 	struct irix_dirent32_callback *buf =
@@ -1942,7 +1942,7 @@
 #define ROUND_UP64(x) (((x)+sizeof(u64)-1) & ~(sizeof(u64)-1))
 
 static int irix_filldir64(void * __buf, const char * name, int namlen,
-			  off_t offset, ino_t ino, unsigned int d_type)
+			  loff_t offset, ino_t ino, unsigned int d_type)
 {
 	struct irix_dirent64 *dirent;
 	struct irix_dirent64_callback * buf =
diff -u --recursive --new-file v2.4.8/linux/arch/parisc/hpux/fs.c linux/arch/parisc/hpux/fs.c
--- v2.4.8/linux/arch/parisc/hpux/fs.c	Tue Dec  5 12:29:39 2000
+++ linux/arch/parisc/hpux/fs.c	Sun Aug 12 15:07:55 2001
@@ -52,7 +52,7 @@
 #define NAME_OFFSET(de) ((int) ((de)->d_name - (char *) (de)))
 #define ROUND_UP(x) (((x)+sizeof(long)-1) & ~(sizeof(long)-1))
 
-static int filldir(void * __buf, const char * name, int namlen, off_t offset, ino_t ino)
+static int filldir(void * __buf, const char * name, int namlen, loff_t offset, ino_t ino)
 {
 	struct hpux_dirent * dirent;
 	struct getdents_callback * buf = (struct getdents_callback *) __buf;
diff -u --recursive --new-file v2.4.8/linux/arch/ppc/configs/IVMS8_defconfig linux/arch/ppc/configs/IVMS8_defconfig
--- v2.4.8/linux/arch/ppc/configs/IVMS8_defconfig	Wed Jul 25 17:10:18 2001
+++ linux/arch/ppc/configs/IVMS8_defconfig	Sun Aug 12 12:43:26 2001
@@ -71,6 +71,8 @@
 # Parallel port support
 #
 # CONFIG_PARPORT is not set
+CONFIG_PPC_RTC=y
+# CONFIG_CMDLINE_BOOL is not set
 
 #
 # Memory Technology Devices (MTD)
@@ -82,6 +84,7 @@
 #
 # CONFIG_PNP is not set
 # CONFIG_ISAPNP is not set
+# CONFIG_PNPBIOS is not set
 
 #
 # Block devices
@@ -246,6 +249,7 @@
 #
 # CONFIG_ACENIC is not set
 # CONFIG_ACENIC_OMIT_TIGON_I is not set
+# CONFIG_DL2K is not set
 # CONFIG_MYRI_SBUS is not set
 # CONFIG_HAMACHI is not set
 # CONFIG_YELLOWFIN is not set
@@ -443,6 +447,7 @@
 # CONFIG_ATARI_PARTITION is not set
 CONFIG_MAC_PARTITION=y
 # CONFIG_MSDOS_PARTITION is not set
+# CONFIG_LDM_PARTITION is not set
 # CONFIG_SGI_PARTITION is not set
 # CONFIG_ULTRIX_PARTITION is not set
 # CONFIG_SUN_PARTITION is not set
diff -u --recursive --new-file v2.4.8/linux/arch/ppc/configs/SM850_defconfig linux/arch/ppc/configs/SM850_defconfig
--- v2.4.8/linux/arch/ppc/configs/SM850_defconfig	Wed Jul 25 17:10:18 2001
+++ linux/arch/ppc/configs/SM850_defconfig	Sun Aug 12 12:43:26 2001
@@ -72,6 +72,8 @@
 # Parallel port support
 #
 # CONFIG_PARPORT is not set
+CONFIG_PPC_RTC=y
+# CONFIG_CMDLINE_BOOL is not set
 
 #
 # Memory Technology Devices (MTD)
@@ -83,6 +85,7 @@
 #
 # CONFIG_PNP is not set
 # CONFIG_ISAPNP is not set
+# CONFIG_PNPBIOS is not set
 
 #
 # Block devices
@@ -211,6 +214,7 @@
 #
 # CONFIG_ACENIC is not set
 # CONFIG_ACENIC_OMIT_TIGON_I is not set
+# CONFIG_DL2K is not set
 # CONFIG_MYRI_SBUS is not set
 # CONFIG_HAMACHI is not set
 # CONFIG_YELLOWFIN is not set
@@ -408,6 +412,7 @@
 # CONFIG_ATARI_PARTITION is not set
 # CONFIG_MAC_PARTITION is not set
 # CONFIG_MSDOS_PARTITION is not set
+# CONFIG_LDM_PARTITION is not set
 # CONFIG_SGI_PARTITION is not set
 # CONFIG_ULTRIX_PARTITION is not set
 # CONFIG_SUN_PARTITION is not set
diff -u --recursive --new-file v2.4.8/linux/arch/ppc/configs/SPD823TS_defconfig linux/arch/ppc/configs/SPD823TS_defconfig
--- v2.4.8/linux/arch/ppc/configs/SPD823TS_defconfig	Wed Jul 25 17:10:18 2001
+++ linux/arch/ppc/configs/SPD823TS_defconfig	Sun Aug 12 12:43:26 2001
@@ -71,6 +71,8 @@
 # Parallel port support
 #
 # CONFIG_PARPORT is not set
+CONFIG_PPC_RTC=y
+# CONFIG_CMDLINE_BOOL is not set
 
 #
 # Memory Technology Devices (MTD)
@@ -82,6 +84,7 @@
 #
 # CONFIG_PNP is not set
 # CONFIG_ISAPNP is not set
+# CONFIG_PNPBIOS is not set
 
 #
 # Block devices
@@ -210,6 +213,7 @@
 #
 # CONFIG_ACENIC is not set
 # CONFIG_ACENIC_OMIT_TIGON_I is not set
+# CONFIG_DL2K is not set
 # CONFIG_MYRI_SBUS is not set
 # CONFIG_HAMACHI is not set
 # CONFIG_YELLOWFIN is not set
@@ -407,6 +411,7 @@
 # CONFIG_ATARI_PARTITION is not set
 # CONFIG_MAC_PARTITION is not set
 # CONFIG_MSDOS_PARTITION is not set
+# CONFIG_LDM_PARTITION is not set
 # CONFIG_SGI_PARTITION is not set
 # CONFIG_ULTRIX_PARTITION is not set
 # CONFIG_SUN_PARTITION is not set
diff -u --recursive --new-file v2.4.8/linux/arch/ppc/configs/TQM823L_defconfig linux/arch/ppc/configs/TQM823L_defconfig
--- v2.4.8/linux/arch/ppc/configs/TQM823L_defconfig	Wed Jul 25 17:10:18 2001
+++ linux/arch/ppc/configs/TQM823L_defconfig	Sun Aug 12 12:43:26 2001
@@ -72,6 +72,8 @@
 # Parallel port support
 #
 # CONFIG_PARPORT is not set
+CONFIG_PPC_RTC=y
+# CONFIG_CMDLINE_BOOL is not set
 
 #
 # Memory Technology Devices (MTD)
@@ -83,6 +85,7 @@
 #
 # CONFIG_PNP is not set
 # CONFIG_ISAPNP is not set
+# CONFIG_PNPBIOS is not set
 
 #
 # Block devices
@@ -211,6 +214,7 @@
 #
 # CONFIG_ACENIC is not set
 # CONFIG_ACENIC_OMIT_TIGON_I is not set
+# CONFIG_DL2K is not set
 # CONFIG_MYRI_SBUS is not set
 # CONFIG_HAMACHI is not set
 # CONFIG_YELLOWFIN is not set
@@ -408,6 +412,7 @@
 # CONFIG_ATARI_PARTITION is not set
 # CONFIG_MAC_PARTITION is not set
 # CONFIG_MSDOS_PARTITION is not set
+# CONFIG_LDM_PARTITION is not set
 # CONFIG_SGI_PARTITION is not set
 # CONFIG_ULTRIX_PARTITION is not set
 # CONFIG_SUN_PARTITION is not set
diff -u --recursive --new-file v2.4.8/linux/arch/ppc/configs/TQM850L_defconfig linux/arch/ppc/configs/TQM850L_defconfig
--- v2.4.8/linux/arch/ppc/configs/TQM850L_defconfig	Wed Jul 25 17:10:18 2001
+++ linux/arch/ppc/configs/TQM850L_defconfig	Sun Aug 12 12:43:26 2001
@@ -72,6 +72,8 @@
 # Parallel port support
 #
 # CONFIG_PARPORT is not set
+CONFIG_PPC_RTC=y
+# CONFIG_CMDLINE_BOOL is not set
 
 #
 # Memory Technology Devices (MTD)
@@ -83,6 +85,7 @@
 #
 # CONFIG_PNP is not set
 # CONFIG_ISAPNP is not set
+# CONFIG_PNPBIOS is not set
 
 #
 # Block devices
@@ -211,6 +214,7 @@
 #
 # CONFIG_ACENIC is not set
 # CONFIG_ACENIC_OMIT_TIGON_I is not set
+# CONFIG_DL2K is not set
 # CONFIG_MYRI_SBUS is not set
 # CONFIG_HAMACHI is not set
 # CONFIG_YELLOWFIN is not set
@@ -408,6 +412,7 @@
 # CONFIG_ATARI_PARTITION is not set
 # CONFIG_MAC_PARTITION is not set
 # CONFIG_MSDOS_PARTITION is not set
+# CONFIG_LDM_PARTITION is not set
 # CONFIG_SGI_PARTITION is not set
 # CONFIG_ULTRIX_PARTITION is not set
 # CONFIG_SUN_PARTITION is not set
diff -u --recursive --new-file v2.4.8/linux/arch/ppc/configs/TQM860L_defconfig linux/arch/ppc/configs/TQM860L_defconfig
--- v2.4.8/linux/arch/ppc/configs/TQM860L_defconfig	Wed Jul 25 17:10:18 2001
+++ linux/arch/ppc/configs/TQM860L_defconfig	Sun Aug 12 12:43:26 2001
@@ -72,6 +72,8 @@
 # Parallel port support
 #
 # CONFIG_PARPORT is not set
+CONFIG_PPC_RTC=y
+# CONFIG_CMDLINE_BOOL is not set
 
 #
 # Memory Technology Devices (MTD)
@@ -83,6 +85,7 @@
 #
 # CONFIG_PNP is not set
 # CONFIG_ISAPNP is not set
+# CONFIG_PNPBIOS is not set
 
 #
 # Block devices
@@ -211,6 +214,7 @@
 #
 # CONFIG_ACENIC is not set
 # CONFIG_ACENIC_OMIT_TIGON_I is not set
+# CONFIG_DL2K is not set
 # CONFIG_MYRI_SBUS is not set
 # CONFIG_HAMACHI is not set
 # CONFIG_YELLOWFIN is not set
@@ -408,6 +412,7 @@
 # CONFIG_ATARI_PARTITION is not set
 # CONFIG_MAC_PARTITION is not set
 # CONFIG_MSDOS_PARTITION is not set
+# CONFIG_LDM_PARTITION is not set
 # CONFIG_SGI_PARTITION is not set
 # CONFIG_ULTRIX_PARTITION is not set
 # CONFIG_SUN_PARTITION is not set
diff -u --recursive --new-file v2.4.8/linux/arch/ppc/configs/apus_defconfig linux/arch/ppc/configs/apus_defconfig
--- v2.4.8/linux/arch/ppc/configs/apus_defconfig	Wed Jul 25 17:10:18 2001
+++ linux/arch/ppc/configs/apus_defconfig	Sun Aug 12 12:43:26 2001
@@ -68,6 +68,7 @@
 # CONFIG_PARPORT_OTHER is not set
 # CONFIG_PARPORT_1284 is not set
 CONFIG_GEN_RTC=y
+# CONFIG_CMDLINE_BOOL is not set
 CONFIG_FB_CONSOLE=y
 CONFIG_AMIGA=y
 CONFIG_ZORRO=y
@@ -101,6 +102,7 @@
 #
 # CONFIG_PNP is not set
 # CONFIG_ISAPNP is not set
+# CONFIG_PNPBIOS is not set
 
 #
 # Block devices
@@ -346,7 +348,7 @@
 CONFIG_OKTAGON_SCSI=y
 
 #
-# IEEE 1394 (FireWire) support
+# IEEE 1394 (FireWire) support (EXPERIMENTAL)
 #
 # CONFIG_IEEE1394 is not set
 
@@ -399,6 +401,7 @@
 #
 # CONFIG_ACENIC is not set
 # CONFIG_ACENIC_OMIT_TIGON_I is not set
+# CONFIG_DL2K is not set
 # CONFIG_MYRI_SBUS is not set
 # CONFIG_HAMACHI is not set
 # CONFIG_YELLOWFIN is not set
@@ -490,6 +493,8 @@
 # CONFIG_FB_IMSTT is not set
 # CONFIG_FB_S3TRIO is not set
 # CONFIG_FB_VGA16 is not set
+# CONFIG_FB_PVR2 is not set
+# CONFIG_FB_PVR2_DEBUG is not set
 # CONFIG_FB_E1355 is not set
 # CONFIG_FB_MATROX is not set
 # CONFIG_FB_ATY is not set
@@ -687,6 +692,7 @@
 # CONFIG_MINIX_SUBPARTITION is not set
 CONFIG_SOLARIS_X86_PARTITION=y
 CONFIG_UNIXWARE_DISKLABEL=y
+# CONFIG_LDM_PARTITION is not set
 # CONFIG_SGI_PARTITION is not set
 # CONFIG_ULTRIX_PARTITION is not set
 # CONFIG_SUN_PARTITION is not set
diff -u --recursive --new-file v2.4.8/linux/arch/ppc/configs/bseip_defconfig linux/arch/ppc/configs/bseip_defconfig
--- v2.4.8/linux/arch/ppc/configs/bseip_defconfig	Wed Jul 25 17:10:18 2001
+++ linux/arch/ppc/configs/bseip_defconfig	Sun Aug 12 12:43:26 2001
@@ -69,6 +69,8 @@
 # Parallel port support
 #
 # CONFIG_PARPORT is not set
+CONFIG_PPC_RTC=y
+# CONFIG_CMDLINE_BOOL is not set
 
 #
 # Memory Technology Devices (MTD)
@@ -80,6 +82,7 @@
 #
 # CONFIG_PNP is not set
 # CONFIG_ISAPNP is not set
+# CONFIG_PNPBIOS is not set
 
 #
 # Block devices
@@ -210,6 +213,7 @@
 #
 # CONFIG_ACENIC is not set
 # CONFIG_ACENIC_OMIT_TIGON_I is not set
+# CONFIG_DL2K is not set
 # CONFIG_MYRI_SBUS is not set
 # CONFIG_HAMACHI is not set
 # CONFIG_YELLOWFIN is not set
@@ -407,6 +411,7 @@
 # CONFIG_ATARI_PARTITION is not set
 # CONFIG_MAC_PARTITION is not set
 # CONFIG_MSDOS_PARTITION is not set
+# CONFIG_LDM_PARTITION is not set
 # CONFIG_SGI_PARTITION is not set
 # CONFIG_ULTRIX_PARTITION is not set
 # CONFIG_SUN_PARTITION is not set
diff -u --recursive --new-file v2.4.8/linux/arch/ppc/configs/common_defconfig linux/arch/ppc/configs/common_defconfig
--- v2.4.8/linux/arch/ppc/configs/common_defconfig	Wed Jul 25 17:10:18 2001
+++ linux/arch/ppc/configs/common_defconfig	Sun Aug 12 12:43:26 2001
@@ -81,6 +81,7 @@
 #
 # CONFIG_PNP is not set
 # CONFIG_ISAPNP is not set
+# CONFIG_PNPBIOS is not set
 
 #
 # Block devices
@@ -307,7 +308,7 @@
 # CONFIG_AIC7XXX_OLD_TCQ_ON_BY_DEFAULT is not set
 CONFIG_AIC7XXX_OLD_CMDS_PER_DEVICE=8
 CONFIG_AIC7XXX_OLD_PROC_STATS=y
-# CONFIG_SCSI_ADVANSYS is not set
+CONFIG_SCSI_ADVANSYS=y
 # CONFIG_SCSI_IN2000 is not set
 # CONFIG_SCSI_AM53C974 is not set
 # CONFIG_SCSI_MEGARAID is not set
@@ -325,7 +326,7 @@
 # CONFIG_SCSI_INIA100 is not set
 # CONFIG_SCSI_NCR53C406A 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
@@ -353,7 +354,7 @@
 CONFIG_SCSI_MAC53C94=y
 
 #
-# IEEE 1394 (FireWire) support
+# IEEE 1394 (FireWire) support (EXPERIMENTAL)
 #
 # CONFIG_IEEE1394 is not set
 
@@ -435,6 +436,7 @@
 #
 # CONFIG_ACENIC is not set
 # CONFIG_ACENIC_OMIT_TIGON_I is not set
+# CONFIG_DL2K is not set
 # CONFIG_MYRI_SBUS is not set
 # CONFIG_HAMACHI is not set
 # CONFIG_YELLOWFIN is not set
@@ -512,6 +514,8 @@
 CONFIG_FB_IMSTT=y
 # CONFIG_FB_S3TRIO is not set
 # CONFIG_FB_VGA16 is not set
+# CONFIG_FB_PVR2 is not set
+# CONFIG_FB_PVR2_DEBUG is not set
 # CONFIG_FB_E1355 is not set
 CONFIG_FB_MATROX=y
 CONFIG_FB_MATROX_MILLENIUM=y
@@ -520,6 +524,8 @@
 # CONFIG_FB_MATROX_G450 is not set
 # CONFIG_FB_MATROX_MULTIHEAD is not set
 CONFIG_FB_ATY=y
+CONFIG_FB_ATY_GX=y
+CONFIG_FB_ATY_CT=y
 CONFIG_FB_ATY128=y
 CONFIG_FB_3DFX=y
 # CONFIG_FB_SIS is not set
@@ -709,6 +715,7 @@
 # CONFIG_MINIX_SUBPARTITION is not set
 # CONFIG_SOLARIS_X86_PARTITION is not set
 # CONFIG_UNIXWARE_DISKLABEL is not set
+# CONFIG_LDM_PARTITION is not set
 # CONFIG_SGI_PARTITION is not set
 # CONFIG_ULTRIX_PARTITION is not set
 # CONFIG_SUN_PARTITION is not set
diff -u --recursive --new-file v2.4.8/linux/arch/ppc/configs/est8260_defconfig linux/arch/ppc/configs/est8260_defconfig
--- v2.4.8/linux/arch/ppc/configs/est8260_defconfig	Wed Jul 25 17:10:18 2001
+++ linux/arch/ppc/configs/est8260_defconfig	Sun Aug 12 12:43:26 2001
@@ -55,7 +55,8 @@
 # Parallel port support
 #
 # CONFIG_PARPORT is not set
-# CONFIG_PPC_RTC is not set
+CONFIG_PPC_RTC=y
+# CONFIG_CMDLINE_BOOL is not set
 
 #
 # Memory Technology Devices (MTD)
@@ -67,6 +68,7 @@
 #
 # CONFIG_PNP is not set
 # CONFIG_ISAPNP is not set
+# CONFIG_PNPBIOS is not set
 
 #
 # Block devices
@@ -197,6 +199,7 @@
 #
 # CONFIG_ACENIC is not set
 # CONFIG_ACENIC_OMIT_TIGON_I is not set
+# CONFIG_DL2K is not set
 # CONFIG_MYRI_SBUS is not set
 # CONFIG_HAMACHI is not set
 # CONFIG_YELLOWFIN is not set
@@ -395,6 +398,7 @@
 # CONFIG_ATARI_PARTITION is not set
 # CONFIG_MAC_PARTITION is not set
 # CONFIG_MSDOS_PARTITION is not set
+# CONFIG_LDM_PARTITION is not set
 # CONFIG_SGI_PARTITION is not set
 # CONFIG_ULTRIX_PARTITION is not set
 # CONFIG_SUN_PARTITION is not set
diff -u --recursive --new-file v2.4.8/linux/arch/ppc/configs/gemini_defconfig linux/arch/ppc/configs/gemini_defconfig
--- v2.4.8/linux/arch/ppc/configs/gemini_defconfig	Wed Jul 25 17:10:18 2001
+++ linux/arch/ppc/configs/gemini_defconfig	Sun Aug 12 12:43:26 2001
@@ -60,6 +60,7 @@
 #
 # CONFIG_PARPORT is not set
 # CONFIG_PPC_RTC is not set
+# CONFIG_CMDLINE_BOOL is not set
 
 #
 # Memory Technology Devices (MTD)
@@ -71,6 +72,7 @@
 #
 # CONFIG_PNP is not set
 # CONFIG_ISAPNP is not set
+# CONFIG_PNPBIOS is not set
 
 #
 # Block devices
@@ -240,7 +242,7 @@
 # CONFIG_SCSI_MAC53C94 is not set
 
 #
-# IEEE 1394 (FireWire) support
+# IEEE 1394 (FireWire) support (EXPERIMENTAL)
 #
 # CONFIG_IEEE1394 is not set
 
@@ -289,6 +291,7 @@
 #
 # CONFIG_ACENIC is not set
 # CONFIG_ACENIC_OMIT_TIGON_I is not set
+# CONFIG_DL2K is not set
 # CONFIG_MYRI_SBUS is not set
 # CONFIG_HAMACHI is not set
 # CONFIG_YELLOWFIN is not set
@@ -493,6 +496,7 @@
 # CONFIG_MINIX_SUBPARTITION is not set
 CONFIG_SOLARIS_X86_PARTITION=y
 # CONFIG_UNIXWARE_DISKLABEL is not set
+# CONFIG_LDM_PARTITION is not set
 # CONFIG_SGI_PARTITION is not set
 # CONFIG_ULTRIX_PARTITION is not set
 # CONFIG_SUN_PARTITION is not set
diff -u --recursive --new-file v2.4.8/linux/arch/ppc/configs/ibmchrp_defconfig linux/arch/ppc/configs/ibmchrp_defconfig
--- v2.4.8/linux/arch/ppc/configs/ibmchrp_defconfig	Wed Jul 25 17:10:18 2001
+++ linux/arch/ppc/configs/ibmchrp_defconfig	Sun Aug 12 12:43:26 2001
@@ -76,6 +76,7 @@
 #
 # CONFIG_PNP is not set
 # CONFIG_ISAPNP is not set
+# CONFIG_PNPBIOS is not set
 
 #
 # Block devices
@@ -268,7 +269,7 @@
 # CONFIG_SCSI_MAC53C94 is not set
 
 #
-# IEEE 1394 (FireWire) support
+# IEEE 1394 (FireWire) support (EXPERIMENTAL)
 #
 # CONFIG_IEEE1394 is not set
 
@@ -344,6 +345,7 @@
 #
 # CONFIG_ACENIC is not set
 # CONFIG_ACENIC_OMIT_TIGON_I is not set
+# CONFIG_DL2K is not set
 # CONFIG_MYRI_SBUS is not set
 # CONFIG_HAMACHI is not set
 # CONFIG_YELLOWFIN is not set
@@ -417,6 +419,8 @@
 # CONFIG_FB_IMSTT is not set
 # CONFIG_FB_S3TRIO is not set
 # CONFIG_FB_VGA16 is not set
+# CONFIG_FB_PVR2 is not set
+# CONFIG_FB_PVR2_DEBUG is not set
 # CONFIG_FB_E1355 is not set
 CONFIG_FB_MATROX=y
 CONFIG_FB_MATROX_MILLENIUM=y
@@ -609,6 +613,7 @@
 # CONFIG_MINIX_SUBPARTITION is not set
 # CONFIG_SOLARIS_X86_PARTITION is not set
 # CONFIG_UNIXWARE_DISKLABEL is not set
+# CONFIG_LDM_PARTITION is not set
 # CONFIG_SGI_PARTITION is not set
 # CONFIG_ULTRIX_PARTITION is not set
 # CONFIG_SUN_PARTITION is not set
diff -u --recursive --new-file v2.4.8/linux/arch/ppc/configs/mbx_defconfig linux/arch/ppc/configs/mbx_defconfig
--- v2.4.8/linux/arch/ppc/configs/mbx_defconfig	Wed Jul 25 17:10:18 2001
+++ linux/arch/ppc/configs/mbx_defconfig	Sun Aug 12 12:43:26 2001
@@ -69,6 +69,8 @@
 # Parallel port support
 #
 # CONFIG_PARPORT is not set
+CONFIG_PPC_RTC=y
+# CONFIG_CMDLINE_BOOL is not set
 
 #
 # Memory Technology Devices (MTD)
@@ -80,6 +82,7 @@
 #
 # CONFIG_PNP is not set
 # CONFIG_ISAPNP is not set
+# CONFIG_PNPBIOS is not set
 
 #
 # Block devices
@@ -204,6 +207,7 @@
 #
 # CONFIG_ACENIC is not set
 # CONFIG_ACENIC_OMIT_TIGON_I is not set
+# CONFIG_DL2K is not set
 # CONFIG_MYRI_SBUS is not set
 # CONFIG_HAMACHI is not set
 # CONFIG_YELLOWFIN is not set
@@ -400,6 +404,7 @@
 # CONFIG_ATARI_PARTITION is not set
 # CONFIG_MAC_PARTITION is not set
 # CONFIG_MSDOS_PARTITION is not set
+# CONFIG_LDM_PARTITION is not set
 # CONFIG_SGI_PARTITION is not set
 # CONFIG_ULTRIX_PARTITION is not set
 # CONFIG_SUN_PARTITION is not set
diff -u --recursive --new-file v2.4.8/linux/arch/ppc/configs/oak_defconfig linux/arch/ppc/configs/oak_defconfig
--- v2.4.8/linux/arch/ppc/configs/oak_defconfig	Wed Jul 25 17:10:18 2001
+++ linux/arch/ppc/configs/oak_defconfig	Sun Aug 12 12:43:26 2001
@@ -56,6 +56,7 @@
 # Parallel port support
 #
 # CONFIG_PARPORT is not set
+# CONFIG_CMDLINE_BOOL is not set
 
 #
 # Memory Technology Devices (MTD)
@@ -67,6 +68,7 @@
 #
 # CONFIG_PNP is not set
 # CONFIG_ISAPNP is not set
+# CONFIG_PNPBIOS is not set
 
 #
 # Block devices
@@ -193,6 +195,7 @@
 #
 # CONFIG_ACENIC is not set
 # CONFIG_ACENIC_OMIT_TIGON_I is not set
+# CONFIG_DL2K is not set
 # CONFIG_MYRI_SBUS is not set
 # CONFIG_HAMACHI is not set
 # CONFIG_YELLOWFIN is not set
diff -u --recursive --new-file v2.4.8/linux/arch/ppc/configs/power3_defconfig linux/arch/ppc/configs/power3_defconfig
--- v2.4.8/linux/arch/ppc/configs/power3_defconfig	Wed Jul 25 17:10:18 2001
+++ linux/arch/ppc/configs/power3_defconfig	Sun Aug 12 12:43:26 2001
@@ -57,6 +57,8 @@
 #
 CONFIG_PARPORT=m
 CONFIG_PARPORT_PC=m
+CONFIG_PARPORT_PC_CML1=m
+# CONFIG_PARPORT_SERIAL is not set
 CONFIG_PARPORT_PC_FIFO=y
 # CONFIG_PARPORT_PC_SUPERIO is not set
 # CONFIG_PARPORT_AMIGA is not set
@@ -82,6 +84,7 @@
 #
 # CONFIG_PNP is not set
 # CONFIG_ISAPNP is not set
+# CONFIG_PNPBIOS is not set
 
 #
 # Block devices
@@ -244,7 +247,7 @@
 # CONFIG_SCSI_MAC53C94 is not set
 
 #
-# IEEE 1394 (FireWire) support
+# IEEE 1394 (FireWire) support (EXPERIMENTAL)
 #
 # CONFIG_IEEE1394 is not set
 
@@ -320,6 +323,7 @@
 #
 # CONFIG_ACENIC is not set
 # CONFIG_ACENIC_OMIT_TIGON_I is not set
+# CONFIG_DL2K is not set
 # CONFIG_MYRI_SBUS is not set
 # CONFIG_HAMACHI is not set
 # CONFIG_YELLOWFIN is not set
@@ -393,6 +397,8 @@
 # CONFIG_FB_IMSTT is not set
 # CONFIG_FB_S3TRIO is not set
 # CONFIG_FB_VGA16 is not set
+# CONFIG_FB_PVR2 is not set
+# CONFIG_FB_PVR2_DEBUG is not set
 # CONFIG_FB_E1355 is not set
 CONFIG_FB_MATROX=y
 CONFIG_FB_MATROX_MILLENIUM=y
diff -u --recursive --new-file v2.4.8/linux/arch/ppc/configs/rpxcllf_defconfig linux/arch/ppc/configs/rpxcllf_defconfig
--- v2.4.8/linux/arch/ppc/configs/rpxcllf_defconfig	Wed Jul 25 17:10:18 2001
+++ linux/arch/ppc/configs/rpxcllf_defconfig	Sun Aug 12 12:43:26 2001
@@ -69,6 +69,8 @@
 # Parallel port support
 #
 # CONFIG_PARPORT is not set
+CONFIG_PPC_RTC=y
+# CONFIG_CMDLINE_BOOL is not set
 
 #
 # Memory Technology Devices (MTD)
@@ -80,6 +82,7 @@
 #
 # CONFIG_PNP is not set
 # CONFIG_ISAPNP is not set
+# CONFIG_PNPBIOS is not set
 
 #
 # Block devices
@@ -210,6 +213,7 @@
 #
 # CONFIG_ACENIC is not set
 # CONFIG_ACENIC_OMIT_TIGON_I is not set
+# CONFIG_DL2K is not set
 # CONFIG_MYRI_SBUS is not set
 # CONFIG_HAMACHI is not set
 # CONFIG_YELLOWFIN is not set
@@ -407,6 +411,7 @@
 # CONFIG_ATARI_PARTITION is not set
 # CONFIG_MAC_PARTITION is not set
 # CONFIG_MSDOS_PARTITION is not set
+# CONFIG_LDM_PARTITION is not set
 # CONFIG_SGI_PARTITION is not set
 # CONFIG_ULTRIX_PARTITION is not set
 # CONFIG_SUN_PARTITION is not set
diff -u --recursive --new-file v2.4.8/linux/arch/ppc/configs/rpxlite_defconfig linux/arch/ppc/configs/rpxlite_defconfig
--- v2.4.8/linux/arch/ppc/configs/rpxlite_defconfig	Wed Jul 25 17:10:18 2001
+++ linux/arch/ppc/configs/rpxlite_defconfig	Sun Aug 12 12:43:26 2001
@@ -69,6 +69,8 @@
 # Parallel port support
 #
 # CONFIG_PARPORT is not set
+CONFIG_PPC_RTC=y
+# CONFIG_CMDLINE_BOOL is not set
 
 #
 # Memory Technology Devices (MTD)
@@ -80,6 +82,7 @@
 #
 # CONFIG_PNP is not set
 # CONFIG_ISAPNP is not set
+# CONFIG_PNPBIOS is not set
 
 #
 # Block devices
@@ -210,6 +213,7 @@
 #
 # CONFIG_ACENIC is not set
 # CONFIG_ACENIC_OMIT_TIGON_I is not set
+# CONFIG_DL2K is not set
 # CONFIG_MYRI_SBUS is not set
 # CONFIG_HAMACHI is not set
 # CONFIG_YELLOWFIN is not set
@@ -407,6 +411,7 @@
 # CONFIG_ATARI_PARTITION is not set
 # CONFIG_MAC_PARTITION is not set
 # CONFIG_MSDOS_PARTITION is not set
+# CONFIG_LDM_PARTITION is not set
 # CONFIG_SGI_PARTITION is not set
 # CONFIG_ULTRIX_PARTITION is not set
 # CONFIG_SUN_PARTITION is not set
diff -u --recursive --new-file v2.4.8/linux/arch/ppc/configs/walnut_defconfig linux/arch/ppc/configs/walnut_defconfig
--- v2.4.8/linux/arch/ppc/configs/walnut_defconfig	Wed Jul 25 17:10:18 2001
+++ linux/arch/ppc/configs/walnut_defconfig	Sun Aug 12 12:43:26 2001
@@ -56,6 +56,7 @@
 # Parallel port support
 #
 # CONFIG_PARPORT is not set
+# CONFIG_CMDLINE_BOOL is not set
 
 #
 # Memory Technology Devices (MTD)
@@ -67,6 +68,7 @@
 #
 # CONFIG_PNP is not set
 # CONFIG_ISAPNP is not set
+# CONFIG_PNPBIOS is not set
 
 #
 # Block devices
@@ -193,6 +195,7 @@
 #
 # CONFIG_ACENIC is not set
 # CONFIG_ACENIC_OMIT_TIGON_I is not set
+# CONFIG_DL2K is not set
 # CONFIG_MYRI_SBUS is not set
 # CONFIG_HAMACHI is not set
 # CONFIG_YELLOWFIN is not set
diff -u --recursive --new-file v2.4.8/linux/arch/ppc/defconfig linux/arch/ppc/defconfig
--- v2.4.8/linux/arch/ppc/defconfig	Wed Jul 25 17:10:18 2001
+++ linux/arch/ppc/defconfig	Sun Aug 12 12:43:26 2001
@@ -81,6 +81,7 @@
 #
 # CONFIG_PNP is not set
 # CONFIG_ISAPNP is not set
+# CONFIG_PNPBIOS is not set
 
 #
 # Block devices
@@ -353,7 +354,7 @@
 CONFIG_SCSI_MAC53C94=y
 
 #
-# IEEE 1394 (FireWire) support
+# IEEE 1394 (FireWire) support (EXPERIMENTAL)
 #
 # CONFIG_IEEE1394 is not set
 
@@ -435,6 +436,7 @@
 #
 # CONFIG_ACENIC is not set
 # CONFIG_ACENIC_OMIT_TIGON_I is not set
+# CONFIG_DL2K is not set
 # CONFIG_MYRI_SBUS is not set
 # CONFIG_HAMACHI is not set
 # CONFIG_YELLOWFIN is not set
@@ -512,6 +514,8 @@
 CONFIG_FB_IMSTT=y
 # CONFIG_FB_S3TRIO is not set
 # CONFIG_FB_VGA16 is not set
+# CONFIG_FB_PVR2 is not set
+# CONFIG_FB_PVR2_DEBUG is not set
 # CONFIG_FB_E1355 is not set
 CONFIG_FB_MATROX=y
 CONFIG_FB_MATROX_MILLENIUM=y
@@ -520,6 +524,8 @@
 # CONFIG_FB_MATROX_G450 is not set
 # CONFIG_FB_MATROX_MULTIHEAD is not set
 CONFIG_FB_ATY=y
+CONFIG_FB_ATY_GX=y
+CONFIG_FB_ATY_CT=y
 CONFIG_FB_ATY128=y
 CONFIG_FB_3DFX=y
 # CONFIG_FB_SIS is not set
@@ -709,6 +715,7 @@
 # CONFIG_MINIX_SUBPARTITION is not set
 # CONFIG_SOLARIS_X86_PARTITION is not set
 # CONFIG_UNIXWARE_DISKLABEL is not set
+# CONFIG_LDM_PARTITION is not set
 # CONFIG_SGI_PARTITION is not set
 # CONFIG_ULTRIX_PARTITION is not set
 # CONFIG_SUN_PARTITION is not set
diff -u --recursive --new-file v2.4.8/linux/arch/ppc/kernel/apus_pci.c linux/arch/ppc/kernel/apus_pci.c
--- v2.4.8/linux/arch/ppc/kernel/apus_pci.c	Mon May 21 17:04:46 2001
+++ linux/arch/ppc/kernel/apus_pci.c	Sun Aug 12 12:43:26 2001
@@ -1,5 +1,5 @@
 /*
- * BK Id: SCCS/s.apus_pci.c 1.3 05/17/01 18:14:21 cort
+ * BK Id: SCCS/s.apus_pci.c 1.4 07/06/01 09:19:28 trini
  */
 /*
  * Copyright (C) Michel Dänzer <michdaen@iiic.ethz.ch>
@@ -55,7 +55,6 @@
 static struct pci_controller *apus_hose;
 
 
-__apus
 void *pci_io_base(unsigned int bus)
 {
 	return 0;
@@ -70,7 +69,7 @@
 #define cfg_write_val(val)	val
 
 #define APUS_PCI_OP(rw, size, type, op, mask)					\
-__apus int									\
+int									\
 apus_pcibios_##rw##_config_##size(struct pci_dev *dev, int offset, type val)	\
 {										\
 	int fnno = FNNO(dev->devfn);						\
diff -u --recursive --new-file v2.4.8/linux/arch/ppc/kernel/apus_setup.c linux/arch/ppc/kernel/apus_setup.c
--- v2.4.8/linux/arch/ppc/kernel/apus_setup.c	Mon May 21 17:04:46 2001
+++ linux/arch/ppc/kernel/apus_setup.c	Sun Aug 12 12:43:26 2001
@@ -1,5 +1,5 @@
 /*
- * BK Id: SCCS/s.apus_setup.c 1.11 05/17/01 18:14:21 cort
+ * BK Id: SCCS/s.apus_setup.c 1.14 07/06/01 09:19:28 trini
  */
 /*
  *  linux/arch/ppc/kernel/apus_setup.c
@@ -80,36 +80,36 @@
 
 #include "local_irq.h"
 
-unsigned long m68k_machtype __apusdata;
-char debug_device[6] __apusdata = "";
+unsigned long m68k_machtype;
+char debug_device[6] = "";
 
 extern void amiga_init_IRQ(void);
 
 void (*mach_sched_init) (void (*handler)(int, void *, struct pt_regs *)) __initdata = NULL;
 /* machine dependent keyboard functions */
 int (*mach_keyb_init) (void) __initdata = NULL;
-int (*mach_kbdrate) (struct kbd_repeat *) __apusdata = NULL;
-void (*mach_kbd_leds) (unsigned int) __apusdata = NULL;
+int (*mach_kbdrate) (struct kbd_repeat *) = NULL;
+void (*mach_kbd_leds) (unsigned int) = NULL;
 /* machine dependent irq functions */
 void (*mach_init_IRQ) (void) __initdata = NULL;
-void (*(*mach_default_handler)[]) (int, void *, struct pt_regs *) __apusdata = NULL;
-void (*mach_get_model) (char *model) __apusdata = NULL;
-int (*mach_get_hardware_list) (char *buffer) __apusdata = NULL;
-int (*mach_get_irq_list) (char *) __apusdata = NULL;
-void (*mach_process_int) (int, struct pt_regs *) __apusdata = NULL;
+void (*(*mach_default_handler)[]) (int, void *, struct pt_regs *) = NULL;
+void (*mach_get_model) (char *model) = NULL;
+int (*mach_get_hardware_list) (char *buffer) = NULL;
+int (*mach_get_irq_list) (char *) = NULL;
+void (*mach_process_int) (int, struct pt_regs *) = NULL;
 /* machine dependent timer functions */
-unsigned long (*mach_gettimeoffset) (void) __apusdata;
-void (*mach_gettod) (int*, int*, int*, int*, int*, int*) __apusdata;
-int (*mach_hwclk) (int, struct hwclk_time*) __apusdata = NULL;
-int (*mach_set_clock_mmss) (unsigned long) __apusdata = NULL;
-void (*mach_reset)( void ) __apusdata;
-long mach_max_dma_address __apusdata = 0x00ffffff; /* default set to the lower 16MB */
+unsigned long (*mach_gettimeoffset) (void);
+void (*mach_gettod) (int*, int*, int*, int*, int*, int*);
+int (*mach_hwclk) (int, struct hwclk_time*) = NULL;
+int (*mach_set_clock_mmss) (unsigned long) = NULL;
+void (*mach_reset)( void );
+long mach_max_dma_address = 0x00ffffff; /* default set to the lower 16MB */
 #if defined(CONFIG_AMIGA_FLOPPY)
 void (*mach_floppy_setup) (char *, int *) __initdata = NULL;
-void (*mach_floppy_eject) (void) __apusdata = NULL;
+void (*mach_floppy_eject) (void) = NULL;
 #endif
 #ifdef CONFIG_HEARTBEAT
-void (*mach_heartbeat) (int) __apusdata = NULL;
+void (*mach_heartbeat) (int) = NULL;
 extern void apus_heartbeat (void);
 #endif
 
@@ -118,29 +118,28 @@
 extern unsigned count_period_num; /* 1 decrementer count equals */
 extern unsigned count_period_den; /* count_period_num / count_period_den us */
 
-int num_memory __apusdata = 0;
-struct mem_info memory[NUM_MEMINFO] __apusdata;/* memory description */
+int num_memory = 0;
+struct mem_info memory[NUM_MEMINFO];/* memory description */
 /* FIXME: Duplicate memory data to avoid conflicts with m68k shared code. */
-int m68k_realnum_memory __apusdata = 0;
-struct mem_info m68k_memory[NUM_MEMINFO] __apusdata;/* memory description */
+int m68k_realnum_memory = 0;
+struct mem_info m68k_memory[NUM_MEMINFO];/* memory description */
 
-struct mem_info ramdisk __apusdata;
+struct mem_info ramdisk;
 
 extern void amiga_floppy_setup(char *, int *);
 extern void config_amiga(void);
 
-static int __60nsram __apusdata = 0;
+static int __60nsram = 0;
 
 /* for cpuinfo */
-static int __bus_speed __apusdata = 0;
-static int __speed_test_failed __apusdata = 0;
+static int __bus_speed = 0;
+static int __speed_test_failed = 0;
 
 /********************************************** COMPILE PROTECTION */
 /* Provide some stubs that links to Amiga specific functions. 
  * This allows CONFIG_APUS to be removed from generic PPC files while
  * preventing link errors for other PPC targets.
  */
-__apus
 unsigned long apus_get_rtc_time(void)
 {
 #ifdef CONFIG_APUS
@@ -152,7 +151,6 @@
 #endif
 }
 
-__apus
 int apus_set_rtc_time(unsigned long nowtime)
 {
 #ifdef CONFIG_APUS
@@ -265,7 +263,6 @@
 #endif
 }
 
-__apus
 int
 apus_get_cpuinfo(char *buffer)
 {
@@ -287,7 +284,6 @@
 #endif
 }
 
-__apus
 static void get_current_tb(unsigned long long *time)
 {
 	__asm __volatile ("1:mftbu 4      \n\t"
@@ -303,7 +299,6 @@
 }
 
 
-__apus
 void apus_calibrate_decr(void)
 {
 #ifdef CONFIG_APUS
@@ -388,7 +383,6 @@
 #endif
 }
 
-__apus
 void arch_gettod(int *year, int *mon, int *day, int *hour,
 		 int *min, int *sec)
 {
@@ -415,7 +409,6 @@
 		mach_floppy_setup (str, ints);
 }
 
-__apus
 void floppy_eject(void)
 {
 	if (mach_floppy_eject)
@@ -425,11 +418,10 @@
 
 /*********************************************************** MEMORY */
 #define KMAP_MAX 32
-unsigned long kmap_chunks[KMAP_MAX*3] __apusdata;
-int kmap_chunk_count __apusdata = 0;
+unsigned long kmap_chunks[KMAP_MAX*3];
+int kmap_chunk_count = 0;
 
 /* From pgtable.h */
-__apus
 static __inline__ pte_t *my_find_pte(struct mm_struct *mm,unsigned long va)
 {
 	pgd_t *dir = 0;
@@ -452,7 +444,6 @@
 
 
 /* Again simulating an m68k/mm/kmap.c function. */
-__apus
 void kernel_set_cachemode( unsigned long address, unsigned long size,
 			   unsigned int cmode )
 {
@@ -495,7 +486,6 @@
 	}
 }
 
-__apus
 unsigned long mm_ptov (unsigned long paddr)
 {
 	unsigned long ret;
@@ -524,7 +514,6 @@
 	return ret;
 }
 
-__apus
 int mm_end_of_chunk (unsigned long addr, int len)
 {
 	if (memory[0].addr + memory[0].size == addr + len)
@@ -536,7 +525,6 @@
 
 #define L1_CACHE_BYTES 32
 #define MAX_CACHE_SIZE 8192
-__apus
 void cache_push(__u32 addr, int length)
 {
 	addr = mm_ptov(addr);
@@ -556,7 +544,6 @@
 	       : : "r" (addr));
 }
 
-__apus
 void cache_clear(__u32 addr, int length)
 {
 	if (MAX_CACHE_SIZE < length)
@@ -706,13 +693,11 @@
 #endif
 /****************************************************** IRQ stuff */
 
-__apus
 static unsigned int apus_irq_cannonicalize(unsigned int irq)
 {
 	return irq;
 }
 
-__apus
 int apus_get_irq_list(char *buf)
 {
 #ifdef CONFIG_APUS
@@ -725,7 +710,6 @@
 }
 
 /* IPL must be between 0 and 7 */
-__apus
 static inline void apus_set_IPL(unsigned long ipl)
 {
 	APUS_WRITE(APUS_IPL_EMU, IPLEMU_SETRESET | IPLEMU_DISABLEINT);
@@ -734,7 +718,6 @@
 	APUS_WRITE(APUS_IPL_EMU, IPLEMU_DISABLEINT);
 }
 
-__apus
 static inline unsigned long apus_get_IPL(void)
 {
 	/* This returns the present IPL emulation level. */
@@ -743,7 +726,6 @@
 	return ((~__f) & IPLEMU_IPLMASK);
 }
 
-__apus
 static inline unsigned long apus_get_prev_IPL(struct pt_regs* regs)
 {
 	/* The value saved in mq is the IPL_EMU value at the time of
@@ -794,7 +776,6 @@
 }
 #endif
 
-__apus
 int apus_get_irq(struct pt_regs* regs)
 {
 #ifdef CONFIG_APUS
@@ -815,8 +796,6 @@
 #endif
 }
 
-
-__apus
 void apus_post_irq(struct pt_regs* regs, int level)
 {
 #ifdef __INTERRUPT_DEBUG
@@ -826,22 +805,17 @@
 	apus_set_IPL(apus_get_prev_IPL(regs));
 }
 
-
-
 /****************************************************** keyboard */
-__apus
 static int apus_kbd_setkeycode(unsigned int scancode, unsigned int keycode)
 {
 	return -EOPNOTSUPP;
 }
 
-__apus
 static int apus_kbd_getkeycode(unsigned int scancode)
 {
 	return scancode > 127 ? -EINVAL : scancode;
 }
 
-__apus
 static int apus_kbd_translate(unsigned char keycode, unsigned char *keycodep,
 			      char raw_mode)
 {
@@ -849,18 +823,15 @@
 	return 1;
 }
 
-__apus
 static char apus_kbd_unexpected_up(unsigned char keycode)
 {
 	return 0200;
 }
 
-__apus  
 static void apus_kbd_leds(unsigned char leds)
 {
 }
 
-__apus  
 static void apus_kbd_init_hw(void)
 {
 #ifdef CONFIG_APUS
@@ -893,7 +864,6 @@
     ciab.pra &= ~SER_RTS; /* active low */
 }
 
-__apus
 int __debug_ser_out( unsigned char c )
 {
 	custom.serdat = c | 0x100;
@@ -903,7 +873,6 @@
 	return 1;
 }
 
-__apus
 unsigned char __debug_ser_in( void )
 {
 	unsigned char c;
@@ -917,7 +886,6 @@
 	return c;
 }
 
-__apus
 int __debug_serinit( void )
 {	
 	unsigned long flags;
@@ -949,7 +917,6 @@
 	return 0;
 }
 
-__apus
 void __debug_print_hex(unsigned long x)
 {
 	int i;
@@ -963,7 +930,6 @@
 	__debug_ser_out('\r');
 }
 
-__apus
 void __debug_print_string(char* s)
 {
 	unsigned char c;
@@ -973,7 +939,6 @@
 	__debug_ser_out('\r');
 }
 
-__apus
 static void apus_progress(char *s, unsigned short value)
 {
 	__debug_print_string(s);
diff -u --recursive --new-file v2.4.8/linux/arch/ppc/kernel/chrp_pci.c linux/arch/ppc/kernel/chrp_pci.c
--- v2.4.8/linux/arch/ppc/kernel/chrp_pci.c	Tue Jul  3 17:08:18 2001
+++ linux/arch/ppc/kernel/chrp_pci.c	Sun Aug 12 12:43:26 2001
@@ -1,5 +1,5 @@
 /*
- * BK Id: SCCS/s.chrp_pci.c 1.17 06/28/01 16:11:56 paulus
+ * BK Id: SCCS/s.chrp_pci.c 1.20 08/08/01 16:35:43 paulus
  */
 /*
  * CHRP pci routines.
@@ -28,8 +28,10 @@
 #include "pci.h"
 
 /* LongTrail */
+unsigned long gg2_pci_config_base;
+
 #define pci_config_addr(dev, offset) \
-(GG2_PCI_CONFIG_BASE | ((dev->bus->number)<<16) | ((dev->devfn)<<8) | (offset))
+(gg2_pci_config_base | ((dev->bus->number)<<16) | ((dev->devfn)<<8) | (offset))
 
 volatile struct Hydra *Hydra = NULL;
 
@@ -111,7 +113,6 @@
 	python_write_config_dword
 };
 
-#ifdef CONFIG_POWER4
 /*
  * Access functions for PCI config space using RTAS calls.
  */
@@ -158,7 +159,6 @@
 	rtas_write_config_word,
 	rtas_write_config_dword
 };
-#endif /* CONFIG_POWER4 */
 
     /*
      *  Temporary fixes for PCI devices. These should be replaced by OF query
@@ -219,29 +219,20 @@
 		if ((np != 0) && (np->n_intrs > 0) && (np->intrs[0].line != 0))
 			dev->irq = np->intrs[0].line;
 		pci_write_config_byte(dev, PCI_INTERRUPT_LINE, dev->irq);
-
-		/* the F50 identifies the amd as a trident */
-		if ( (dev->vendor == PCI_VENDOR_ID_TRIDENT) &&
-		      (dev->class>>8 == PCI_CLASS_NETWORK_ETHERNET) )
-		{
-			dev->vendor = PCI_VENDOR_ID_AMD;
-			pci_write_config_word(dev, PCI_VENDOR_ID,
-					      PCI_VENDOR_ID_AMD);
-		}
 	}
 }
 
-/* this is largely modeled and stolen after the pmac_pci code -- tgall
- */
-
-static void __init
-ibm_add_bridges(struct device_node *dev)
+void __init
+chrp_find_bridges(void)
 {
+	struct device_node *dev;
 	int *bus_range;
-	int len, index = 0;
+	int len, index = -1;
 	struct pci_controller *hose;
 	volatile unsigned char *cfg;
 	unsigned int *dma;
+	char *model, *machine;
+	int is_longtrail = 0, is_mot = 0;
 	struct device_node *root = find_path_device("/");
 #ifdef CONFIG_POWER3
 	unsigned int *opprop = (unsigned int *)
@@ -249,10 +240,22 @@
 	int i;
 #endif
 
-	for(; dev != NULL; dev = dev->next, ++index) {
-		if (dev->parent != root)
+	/*
+	 * The PCI host bridge nodes on some machines don't have
+	 * properties to adequately identify them, so we have to
+	 * look at what sort of machine this is as well.
+	 */
+	machine = get_property(root, "model", NULL);
+	if (machine != NULL) {
+		is_longtrail = strncmp(machine, "IBM,LongTrail", 13) == 0;
+		is_mot = strncmp(machine, "MOT", 3) == 0;
+	}
+	for (dev = root->child; dev != NULL; dev = dev->sibling) {
+		if (dev->type == NULL || strcmp(dev->type, "pci") != 0)
 			continue;
-		if (dev->n_addrs < 1) {
+		++index;
+		/* The GG2 bridge on the LongTrail doesn't have an address */
+		if (dev->n_addrs < 1 && !is_longtrail) {
 			printk(KERN_WARNING "Can't use %s: no address\n",
 			       dev->full_name);
 			continue;
@@ -268,8 +271,10 @@
 		else
 			printk(KERN_INFO "PCI buses %d..%d",
 			       bus_range[0], bus_range[1]);
-		printk(" controlled by %s at %x\n", dev->type,
-		       dev->addrs[0].address);
+		printk(" controlled by %s", dev->type);
+		if (dev->n_addrs > 0)
+			printk(" at %x", dev->addrs[0].address);
+		printk("\n");
 
 		hose = pcibios_alloc_controller();
 		if (!hose) {
@@ -280,17 +285,35 @@
 		hose->arch_data = dev;
 		hose->first_busno = bus_range[0];
 		hose->last_busno = bus_range[1];
-		hose->ops = &python_pci_ops;
 
-		cfg = ioremap(dev->addrs[0].address + 0xf8000, 0x20);
-       		hose->cfg_addr = (volatile unsigned int *) cfg;
-       		hose->cfg_data = cfg + 0x10;
+		model = get_property(dev, "model", NULL);
+		if (model == NULL)
+			model = "<none>";
+		if (device_is_compatible(dev, "IBM,python")) {
+			hose->ops = &python_pci_ops;
+			cfg = ioremap(dev->addrs[0].address + 0xf8000, 0x20);
+			hose->cfg_addr = (volatile unsigned int *) cfg;
+			hose->cfg_data = cfg + 0x10;
+		} else if (is_mot
+			   || strncmp(model, "Motorola, Grackle", 17) == 0) {
+			setup_grackle(hose);
+		} else if (is_longtrail) {
+			hose->ops = &gg2_pci_ops;
+			gg2_pci_config_base = (unsigned long)
+				ioremap(GG2_PCI_CONFIG_BASE, 0x80000);
+		} else {
+			printk("No methods for %s (model %s), using RTAS\n",
+			       dev->full_name, model);
+			hose->ops = &rtas_pci_ops;
+		}
 
 		pci_process_bridge_OF_ranges(hose, dev, index == 0);
 
 #ifdef CONFIG_POWER3
-		i = prom_n_addr_cells(root) * (index + 2) - 1;
-                openpic_setup_ISU(index, opprop[i]);
+		if (opprop != NULL) {
+			i = prom_n_addr_cells(root) * (index + 2) - 1;
+			openpic_setup_ISU(index, opprop[i]);
+		}
 #endif /* CONFIG_POWER3 */
 
 		/* check the first bridge for a property that we can
@@ -302,64 +325,6 @@
 			printk("pci_dram_offset = %lx\n", pci_dram_offset);
 		}
 	}
-}
-
-void __init
-chrp_find_bridges(void)
-{
-	struct device_node *py, *dev;
-	char *model, *name;
-	struct pci_controller* hose;
 
 	ppc_md.pcibios_fixup = chrp_pcibios_fixup;
-
-	model = get_property(find_path_device("/"), "model", NULL);
-        if (!strncmp("MOT", model, 3)) {
-		struct pci_controller *hose;
-
-		hose = pcibios_alloc_controller();
-		if (!hose)
-			return;
-		hose->first_busno = 0;
-		hose->last_busno = 0xff;
-        	/* Check that please. This must be the root of the OF
-        	 * PCI tree (the root host bridge
-        	 */
-               	hose->arch_data = dev = find_devices("pci");
-                setup_grackle(hose, 0x20000);
-		pci_process_bridge_OF_ranges(hose, dev, 1);
-		return;
-        }
-
-	if ((py = find_compatible_devices("pci", "IBM,python")))
-	{
-		/* XXX xmon_init_scc needs this set and the BAT
-		   set up in MMU_init */
-		ibm_add_bridges(find_devices("pci"));
-		return;
-	}
-
-
-	hose = pcibios_alloc_controller();
-	if (!hose)
-		return;
-	hose->first_busno = 0;
-	hose->last_busno = 0xff;
-	/* Check that please. This must be the root of the OF
-	 * PCI tree (the root host bridge
-	 */
-	hose->arch_data = dev = find_devices("pci");
-	name = get_property(find_path_device("/"), "name", NULL);
-	if (!strncmp("IBM,7043-150", name, 12) ||
-	    !strncmp("IBM,7046-155", name, 12) ||
-	    !strncmp("IBM,7046-B50", name, 12) ) {
-		setup_grackle(hose, 0x01000000);
-		pci_process_bridge_OF_ranges(hose, dev, 1);
-		return;
-	}
-
-	/* LongTrail */
-	hose->ops = &gg2_pci_ops;
-	pci_dram_offset = 0;
-	pci_process_bridge_OF_ranges(hose, find_devices("pci"), 1);
 }
diff -u --recursive --new-file v2.4.8/linux/arch/ppc/kernel/feature.c linux/arch/ppc/kernel/feature.c
--- v2.4.8/linux/arch/ppc/kernel/feature.c	Tue Jul  3 17:08:18 2001
+++ linux/arch/ppc/kernel/feature.c	Sun Aug 12 12:43:26 2001
@@ -1,5 +1,5 @@
 /*
- * BK Id: SCCS/s.feature.c 1.14 06/17/01 09:33:37 trini
+ * BK Id: SCCS/s.feature.c 1.16 07/06/01 14:42:47 trini
  */
 /*
  *  arch/ppc/kernel/feature.c
@@ -20,6 +20,7 @@
 #include <linux/kernel.h>
 #include <linux/sched.h>
 #include <linux/spinlock.h>
+#include <asm/init.h>
 #include <asm/errno.h>
 #include <asm/ohare.h>
 #include <asm/heathrow.h>
@@ -58,7 +59,7 @@
 
 /* Those features concern for OHare-based PowerBooks (2400, 3400, 3500)
  */
-static fbit feature_bits_ohare_pbook[] = {
+static fbit feature_bits_ohare_pbook[] __pmacdata = {
 	{0x38,0,0},			/* FEATURE_null */
 	{0x38,0,OH_SCC_RESET},		/* FEATURE_Serial_reset */
 	{0x38,0,OH_SCC_ENABLE},		/* FEATURE_Serial_enable */
@@ -92,7 +93,7 @@
  * the SCC related bits and init them once. They have proven to occasionally cause
  * problems with the desktop units.
  */
-static fbit feature_bits_heathrow[] = {
+static fbit feature_bits_heathrow[] __pmacdata = {
 	{0x38,0,0},			/* FEATURE_null */
 	{0x38,0,0},			/* FEATURE_Serial_reset */
 	{0x38,0,0},			/* FEATURE_Serial_enable */
@@ -125,7 +126,7 @@
 /* Those bits concern heathrow-based PowerBooks (wallstreet/mainstreet).
  * Heathrow-based desktop macs (Beige G3s) are _not_ handled here
  */
-static fbit feature_bits_wallstreet[] = {
+static fbit feature_bits_wallstreet[] __pmacdata = {
 	{0x38,0,0},			/* FEATURE_null */
 	{0x38,0,HRW_RESET_SCC},		/* FEATURE_Serial_reset */
 	{0x38,0,HRW_SCC_ENABLE},	/* FEATURE_Serial_enable */
@@ -160,7 +161,7 @@
  * Mostly the same as the heathrow. They are used on both PowerBooks
  * and desktop machines using the paddington chip
  */
-static fbit feature_bits_paddington[] = {
+static fbit feature_bits_paddington[] __pmacdata = {
 	{0x38,0,0},			/* FEATURE_null */
 	{0x38,0,PADD_RESET_SCC},	/* FEATURE_Serial_reset */
 	{0x38,0,HRW_SCC_ENABLE},	/* FEATURE_Serial_enable */
@@ -193,7 +194,7 @@
 /* Those bits are for Core99 machines (iBook,G4,iMacSL/DV,Pismo,...).
  * Note: Different sets may be needed for iBook, especially for sound
  */
-static fbit feature_bits_keylargo[] = {
+static fbit feature_bits_keylargo[] __pmacdata = {
 	{0x38,0,0},			/* FEATURE_null */
 	{0x38,0,KL0_SCC_RESET},		/* FEATURE_Serial_reset */
 	{0x38,0,KL0_SERIAL_ENABLE},	/* FEATURE_Serial_enable */
@@ -298,7 +299,7 @@
 
 extern unsigned long powersave_nap;
 
-void
+void __init
 feature_init(void)
 {
 	struct device_node *np;
@@ -403,7 +404,7 @@
 #endif
 }
 
-static struct feature_controller*
+static struct feature_controller __init *
 feature_add_controller(struct device_node *controller_device, fbit* bits)
 {
 	struct feature_controller*	controller;
@@ -443,7 +444,7 @@
 	return controller;
 }
 
-static struct feature_controller*
+static struct feature_controller __pmac *
 feature_lookup_controller(struct device_node *device)
 {
 	int	i;
@@ -467,7 +468,7 @@
 	return NULL;
 }
 
-int
+int __pmac
 feature_set(struct device_node* device, enum system_feature f)
 {
 	struct feature_controller*	controller;
@@ -500,7 +501,7 @@
 	return 0;
 }
 
-int
+int __pmac
 feature_clear(struct device_node* device, enum system_feature f)
 {
 	struct feature_controller*	controller;
@@ -533,7 +534,7 @@
 	return 0;
 }
 
-int
+int __pmac
 feature_test(struct device_node* device, enum system_feature f)
 {
 	struct feature_controller*	controller;
@@ -562,7 +563,7 @@
 	return bit->polarity ? (value == 0) : (value == bit->mask);
 }
 
-int
+int __pmac
 feature_can_sleep(void)
 {
 	return ((board_features & FTR_CAN_SLEEP) != 0);	
@@ -576,7 +577,7 @@
  */
 
 /* Only one GMAC is assumed */
-void
+void __pmac
 feature_set_gmac_power(struct device_node* device, int power)
 {
 	unsigned long flags;
@@ -596,7 +597,7 @@
 	udelay(20);
 }
 
-void
+void __pmac
 feature_gmac_phy_reset(struct device_node* device)
 {
 	unsigned long flags;
@@ -619,7 +620,7 @@
 }
 
 /* Pass the node of the correct controller, please */
-void
+void __pmac
 feature_set_usb_power(struct device_node* device, int power)
 {
 	char* prop;
@@ -691,7 +692,7 @@
 	spin_unlock_irqrestore(&keylargo->lock, flags);
 }
 
-void 
+void  __pmac
 feature_set_firewire_power(struct device_node* device, int power)
 {
 	unsigned long flags;
@@ -711,7 +712,7 @@
 }
 
 /* Warning: will kill the PHY.. */
-void 
+void  __pmac
 feature_set_firewire_cable_power(struct device_node* device, int power)
 {
 	unsigned long flags;
@@ -726,7 +727,7 @@
 }
 
 #ifdef CONFIG_SMP
-void
+void __pmac
 feature_core99_kick_cpu(int cpu_nr)
 {
 #if 1 /* New way */
@@ -750,7 +751,7 @@
 }
 #endif /* CONFIG_SMP */
 
-void
+void __pmac
 feature_set_airport_power(struct device_node* device, int power)
 {
 	if (!keylargo_base || !airport_dev || airport_dev != device)
@@ -795,7 +796,7 @@
 
 /* Initialize the Core99 UniNorth host bridge and memory controller
  */
-static void
+static void __init
 uninorth_init(void)
 {
 	struct device_node* gmac, *fw;
@@ -831,7 +832,7 @@
 
 /* Initialize the Core99 KeyLargo ASIC. 
  */
-static void
+static void __init
 keylargo_init(void)
 {
 	struct device_node* np;
@@ -853,7 +854,7 @@
 }
 
 #ifdef CONFIG_PMAC_PBOOK
-void
+void __pmac
 feature_prepare_for_sleep(void)
 {
 	/* We assume gatwick is second */
@@ -874,8 +875,7 @@
 	}
 }
 
-
-void
+void __pmac
 feature_wake_up(void)
 {
 	struct feature_controller* ctrler = &controllers[0];
@@ -903,8 +903,7 @@
 static u32 save_unin_clock_ctl;
 static struct dbdma_regs save_dbdma[13];
 
-
-static void
+static void __pmac
 heathrow_prepare_for_sleep(struct feature_controller* ctrler)
 {
 	save_mbcr = in_le32(FREG(ctrler, 0x34));
@@ -914,7 +913,7 @@
 	out_le32(FREG(ctrler, 0x38), save_fcr[0] & ~HRW_IOBUS_ENABLE);
 }
 
-static void
+static void __pmac
 heathrow_wakeup(struct feature_controller* ctrler)
 {
 	out_le32(FREG(ctrler, 0x38), save_fcr[0]);
@@ -925,7 +924,7 @@
 	mdelay(1);
 }
 
-static void
+static void __pmac
 turn_off_keylargo(void)
 {
 	u32 temp;
@@ -977,7 +976,7 @@
 	(void)KL_IN(KEYLARGO_FCR3); udelay(10);
 }
 
-static void
+static void __pmac
 turn_off_pangea(void)
 {
 	u32 temp;
@@ -1011,7 +1010,7 @@
 	(void)KL_IN(KEYLARGO_FCR3); udelay(10);
 }
 
-static void
+static void __pmac
 core99_prepare_for_sleep(struct feature_controller* ctrler)
 {
 	int i;
@@ -1086,7 +1085,7 @@
 	}
 }
 
-static void
+static void __pmac
 core99_wake_up(struct feature_controller* ctrler)
 {
 	int i;
diff -u --recursive --new-file v2.4.8/linux/arch/ppc/kernel/pci.c linux/arch/ppc/kernel/pci.c
--- v2.4.8/linux/arch/ppc/kernel/pci.c	Tue Jul  3 17:08:18 2001
+++ linux/arch/ppc/kernel/pci.c	Sun Aug 12 12:43:26 2001
@@ -1,5 +1,5 @@
 /*
- * BK Id: SCCS/s.pci.c 1.26 06/28/01 08:02:41 trini
+ * BK Id: SCCS/s.pci.c 1.28 08/08/01 16:35:43 paulus
  */
 /*
  * Common pmac/prep/chrp pci routines. -- Cort
@@ -41,6 +41,7 @@
 unsigned long pci_dram_offset = 0;
 
 static void pcibios_fixup_resources(struct pci_dev* dev);
+static void fixup_broken_pcnet32(struct pci_dev* dev);
 #ifdef CONFIG_ALL_PPC
 static void pcibios_fixup_cardbus(struct pci_dev* dev);
 static u8* pci_to_OF_bus_map;
@@ -57,6 +58,7 @@
 static int pci_bus_count;
 
 struct pci_fixup pcibios_fixups[] = {
+	{ PCI_FIXUP_HEADER,	PCI_VENDOR_ID_TRIDENT,	PCI_ANY_ID,		fixup_broken_pcnet32 },
 	{ PCI_FIXUP_HEADER,	PCI_ANY_ID,		PCI_ANY_ID,		pcibios_fixup_resources },
 #ifdef CONFIG_ALL_PPC
 	/* We should add per-machine fixup support in xxx_setup.c or xxx_pci.c */
@@ -64,6 +66,16 @@
 #endif /* CONFIG_ALL_PPC */
  	{ 0 }
 };
+
+static void
+fixup_broken_pcnet32(struct pci_dev* dev)
+{
+	if ((dev->class>>8 == PCI_CLASS_NETWORK_ETHERNET)) {
+		dev->vendor = PCI_VENDOR_ID_AMD;
+		pci_write_config_word(dev, PCI_VENDOR_ID, PCI_VENDOR_ID_AMD);
+		pci_name_device(dev);
+	}
+}
 
 void
 pcibios_update_resource(struct pci_dev *dev, struct resource *root,
diff -u --recursive --new-file v2.4.8/linux/arch/ppc/kernel/pci.h linux/arch/ppc/kernel/pci.h
--- v2.4.8/linux/arch/ppc/kernel/pci.h	Mon May 21 17:04:47 2001
+++ linux/arch/ppc/kernel/pci.h	Sun Aug 12 12:43:26 2001
@@ -1,5 +1,5 @@
 /*
- * BK Id: SCCS/s.pci.h 1.7 05/17/01 18:14:21 cort
+ * BK Id: SCCS/s.pci.h 1.10 08/08/01 16:35:43 paulus
  */
 
 #ifndef __PPC_KERNEL_PCI_H__
@@ -22,6 +22,6 @@
 
 extern void setup_indirect_pci(struct pci_controller* hose,
 			u32 cfg_addr, u32 cfg_data);
-extern void setup_grackle(struct pci_controller *hose, unsigned io_space_size);
+extern void setup_grackle(struct pci_controller *hose);
 
 #endif /* __PPC_KERNEL_PCI_H__ */
diff -u --recursive --new-file v2.4.8/linux/arch/ppc/kernel/pmac_nvram.c linux/arch/ppc/kernel/pmac_nvram.c
--- v2.4.8/linux/arch/ppc/kernel/pmac_nvram.c	Mon May 21 17:04:47 2001
+++ linux/arch/ppc/kernel/pmac_nvram.c	Sun Aug 12 12:43:26 2001
@@ -1,5 +1,5 @@
 /*
- * BK Id: SCCS/s.pmac_nvram.c 1.5 05/17/01 18:14:21 cort
+ * BK Id: SCCS/s.pmac_nvram.c 1.10 08/08/01 16:23:35 paulus
  */
 /*
  * Miscellaneous procedures for dealing with the PowerMac hardware.
@@ -68,13 +68,12 @@
 #if 0
 static char* nvram_image;
 #else
-__pmac static char nvram_image[NVRAM_SIZE];
+static char nvram_image[NVRAM_SIZE] __pmacdata;
 #endif
 
 extern int pmac_newworld;
 
-
-static u8
+static u8 __openfirmware
 chrp_checksum(struct chrp_header* hdr)
 {
 	u8 *ptr;
@@ -86,7 +85,7 @@
 	return sum;
 }
 
-static u32
+static u32 __pmac
 core99_calc_adler(u8 *buffer)
 {
 	int cnt;
@@ -109,7 +108,7 @@
 	return (high << 16) | low;
 }
 
-static u32
+static u32 __pmac
 core99_check(u8* datas)
 {
 	struct core99_header* hdr99 = (struct core99_header*)datas;
@@ -135,7 +134,7 @@
 	return hdr99->generation;
 }
 
-static int
+static int __pmac
 core99_erase_bank(int bank)
 {
 	int stat, i;
@@ -159,7 +158,7 @@
 	return 0;
 }
 
-static int
+static int __pmac
 core99_write_bank(int bank, u8* datas)
 {
 	int i, stat = 0;
@@ -187,7 +186,7 @@
 	return 0;	
 }
 
-static void
+static void __init
 lookup_partitions(void)
 {
 	u8 buffer[17];
@@ -225,8 +224,8 @@
 #endif	
 }
 
-__init
-void pmac_nvram_init(void)
+void __init
+pmac_nvram_init(void)
 {
 	struct device_node *dp;
 
@@ -268,7 +267,8 @@
 		for (i=0; i<NVRAM_SIZE; i++)
 			nvram_image[i] = nvram_data[i + core99_bank*NVRAM_SIZE];
 	} else if (_machine == _MACH_chrp && nvram_naddrs == 1) {
-		nvram_data = ioremap(dp->addrs[0].address, dp->addrs[0].size);
+		nvram_data = ioremap(dp->addrs[0].address + isa_mem_base,
+				     dp->addrs[0].size);
 		nvram_mult = 1;
 	} else if (nvram_naddrs == 1) {
 		nvram_data = ioremap(dp->addrs[0].address, dp->addrs[0].size);
@@ -285,7 +285,7 @@
 	lookup_partitions();
 }
 
-void
+void __pmac
 pmac_nvram_update(void)
 {
 	struct core99_header* hdr99;
@@ -312,8 +312,8 @@
 		printk("nvram: Error writing bank %d\n", core99_bank);
 }
 
-__openfirmware
-unsigned char nvram_read_byte(int addr)
+unsigned char __openfirmware
+nvram_read_byte(int addr)
 {
 	switch (nvram_naddrs) {
 #ifdef CONFIG_ADB_PMU
@@ -340,8 +340,8 @@
 	return 0;
 }
 
-__openfirmware
-void nvram_write_byte(unsigned char val, int addr)
+void __openfirmware
+nvram_write_byte(unsigned char val, int addr)
 {
 	switch (nvram_naddrs) {
 #ifdef CONFIG_ADB_PMU
@@ -372,13 +372,13 @@
 	eieio();
 }
 
-int
+int __pmac
 pmac_get_partition(int partition)
 {
 	return nvram_partitions[partition];
 }
 
-u8
+u8 __pmac
 pmac_xpram_read(int xpaddr)
 {
 	int offset = nvram_partitions[pmac_nvram_XPRAM];
@@ -389,7 +389,7 @@
 	return nvram_read_byte(xpaddr + offset);
 }
 
-void
+void __pmac
 pmac_xpram_write(int xpaddr, u8 data)
 {
 	int offset = nvram_partitions[pmac_nvram_XPRAM];
@@ -399,5 +399,3 @@
 		
 	nvram_write_byte(xpaddr + offset, data);
 }
-
-
diff -u --recursive --new-file v2.4.8/linux/arch/ppc/kernel/pmac_pci.c linux/arch/ppc/kernel/pmac_pci.c
--- v2.4.8/linux/arch/ppc/kernel/pmac_pci.c	Wed Jul 25 17:10:18 2001
+++ linux/arch/ppc/kernel/pmac_pci.c	Sun Aug 12 12:43:26 2001
@@ -1,5 +1,5 @@
 /*
- * BK Id: SCCS/s.pmac_pci.c 1.18 07/01/01 12:23:31 trini
+ * BK Id: SCCS/s.pmac_pci.c 1.22 08/08/01 16:35:43 paulus
  */
 /*
  * Support for PCI bridges found on Power Macintoshes.
@@ -407,7 +407,7 @@
 }
 
 void __init
-setup_grackle(struct pci_controller *hose, unsigned io_space_size)
+setup_grackle(struct pci_controller *hose)
 {
 	setup_indirect_pci(hose, 0xfec00000, 0xfee00000);
 	if (machine_is_compatible("AAPL,PowerBook1998"))
@@ -459,7 +459,7 @@
 			disp_name = "UniNorth";
 		} else if (strcmp(dev->name, "pci") == 0) {
 			/* XXX assume this is a mpc106 (grackle) */
-			setup_grackle(hose, 0x20000);
+			setup_grackle(hose);
 			disp_name = "Grackle (MPC106)";
 		} else if (strcmp(dev->name, "bandit") == 0) {
 			setup_bandit(hose, addr);
diff -u --recursive --new-file v2.4.8/linux/arch/ppc/kernel/pmac_setup.c linux/arch/ppc/kernel/pmac_setup.c
--- v2.4.8/linux/arch/ppc/kernel/pmac_setup.c	Mon May 21 17:04:47 2001
+++ linux/arch/ppc/kernel/pmac_setup.c	Sun Aug 12 12:43:26 2001
@@ -1,5 +1,5 @@
 /*
- * BK Id: SCCS/s.pmac_setup.c 1.21 05/17/01 18:14:21 cort
+ * BK Id: SCCS/s.pmac_setup.c 1.24 07/06/01 14:49:51 trini
  */
 /*
  *  linux/arch/ppc/kernel/setup.c
@@ -134,7 +134,8 @@
 
 #ifdef CONFIG_SMP
 volatile static long int core99_l2_cache;
-void core99_init_l2(void)
+void __pmac
+core99_init_l2(void)
 {
 	int cpu = smp_processor_id();
 
@@ -153,9 +154,7 @@
 }
 #endif /* CONFIG_SMP */
 
-
-__pmac
-int
+int __pmac
 pmac_get_cpuinfo(char *buffer)
 {
 	int len;
@@ -265,8 +264,7 @@
  * Dummy mksound function that does nothing.
  * The real one is in the dmasound driver.
  */
-__pmac
-static void
+static void __pmac
 pmac_mksound(unsigned int hz, unsigned int ticks)
 {
 }
@@ -437,8 +435,8 @@
 #endif
 
 #if defined(CONFIG_BLK_DEV_IDE) && defined(CONFIG_BLK_DEV_IDE_PMAC)
-
-kdev_t __init find_ide_boot(void)
+kdev_t __init
+find_ide_boot(void)
 {
 	char *p;
 	int n;
@@ -455,7 +453,8 @@
 }
 #endif /* CONFIG_BLK_DEV_IDE && CONFIG_BLK_DEV_IDE_PMAC */
 
-void __init find_boot_device(void)
+void __init
+find_boot_device(void)
 {
 #if defined(CONFIG_SCSI) && defined(CONFIG_BLK_DEV_SD)
 	if (boot_host != NULL) {
@@ -470,8 +469,8 @@
 }
 
 /* can't be __init - can be called whenever a disk is first accessed */
-__pmac
-void note_bootable_part(kdev_t dev, int part, int goodness)
+void __pmac
+note_bootable_part(kdev_t dev, int part, int goodness)
 {
 	static int found_boot = 0;
 	char *p;
@@ -495,7 +494,7 @@
 	}
 }
 
-void
+void __pmac
 pmac_restart(char *cmd)
 {
 #ifdef CONFIG_ADB_CUDA
@@ -524,7 +523,7 @@
 	}
 }
 
-void
+void __pmac
 pmac_power_off(void)
 {
 #ifdef CONFIG_ADB_CUDA
@@ -553,7 +552,7 @@
 	}
 }
 
-void
+void __pmac
 pmac_halt(void)
 {
    pmac_power_off();
@@ -564,19 +563,19 @@
 /*
  * IDE stuff.
  */
-void
+void __pmac
 pmac_ide_insw(ide_ioreg_t port, void *buf, int ns)
 {
 	_insw_ns((unsigned short *)(port+_IO_BASE), buf, ns);
 }
 
-void
+void __pmac
 pmac_ide_outsw(ide_ioreg_t port, void *buf, int ns)
 {
 	_outsw_ns((unsigned short *)(port+_IO_BASE), buf, ns);
 }
 
-int
+int __pmac
 pmac_ide_default_irq(ide_ioreg_t base)
 {
 #if defined(CONFIG_BLK_DEV_IDE) && defined(CONFIG_BLK_DEV_IDE_PMAC)
@@ -587,7 +586,7 @@
 #endif
 }
 
-ide_ioreg_t
+ide_ioreg_t __pmac
 pmac_ide_default_io_base(int index)
 {
 #if defined(CONFIG_BLK_DEV_IDE) && defined(CONFIG_BLK_DEV_IDE_PMAC)
@@ -598,7 +597,7 @@
 #endif
 }
 
-int
+int __pmac
 pmac_ide_check_region(ide_ioreg_t from, unsigned int extent)
 {
 	/*
@@ -611,7 +610,7 @@
 	return check_region(from, extent);
 }
 
-void
+void __pmac
 pmac_ide_request_region(ide_ioreg_t from,
 			unsigned int extent,
 			const char *name)
@@ -620,7 +619,7 @@
 		request_region(from, extent, name);
 }
 
-void
+void __pmac
 pmac_ide_release_region(ide_ioreg_t from,
 			unsigned int extent)
 {
@@ -630,13 +629,15 @@
 
 #if defined(CONFIG_BLK_DEV_IDE) && defined(CONFIG_BLK_DEV_IDE_PMAC)
 /* This is declared in drivers/block/ide-pmac.c */
-void pmac_ide_init_hwif_ports (hw_regs_t *hw, ide_ioreg_t data_port, ide_ioreg_t ctrl_port, int *irq);
+void __pmac
+pmac_ide_init_hwif_ports (hw_regs_t *hw, ide_ioreg_t data_port, ide_ioreg_t ctrl_port, int *irq);
 #else
 /*
  * This registers the standard ports for this architecture with the IDE
  * driver.
  */
-void pmac_ide_init_hwif_ports(hw_regs_t *hw, ide_ioreg_t data_port, ide_ioreg_t ctrl_port, int *irq)
+void __pmac
+pmac_ide_init_hwif_ports(hw_regs_t *hw, ide_ioreg_t data_port, ide_ioreg_t ctrl_port, int *irq)
 {
 }
 #endif
@@ -646,7 +647,8 @@
  * Read in a property describing some pieces of memory.
  */
 
-static void __init get_mem_prop(char *name, struct mem_pieces *mp)
+static void __init
+get_mem_prop(char *name, struct mem_pieces *mp)
 {
 	struct reg_property *rp;
 	int i, s;
@@ -686,7 +688,8 @@
  * Our text, data, bss use something over 1MB, starting at 0.
  * Open Firmware may be using 1MB at the 4MB point.
  */
-unsigned long __init pmac_find_end_of_memory(void)
+unsigned long __init
+pmac_find_end_of_memory(void)
 {
 	unsigned long a, total;
 	struct mem_pieces phys_mem;
@@ -813,7 +816,7 @@
 extern void drawchar(char c);
 extern void drawstring(const char *c);
 extern boot_infos_t *disp_bi;
-void
+void __init
 pmac_progress(char *s, unsigned short hex)
 {
 	if (disp_bi == 0)
@@ -822,4 +825,3 @@
 	prom_drawchar('\n');
 }
 #endif /* CONFIG_BOOTX_TEXT */
-
diff -u --recursive --new-file v2.4.8/linux/arch/ppc/kernel/pmac_time.c linux/arch/ppc/kernel/pmac_time.c
--- v2.4.8/linux/arch/ppc/kernel/pmac_time.c	Mon May 21 17:04:47 2001
+++ linux/arch/ppc/kernel/pmac_time.c	Sun Aug 12 12:43:26 2001
@@ -1,5 +1,5 @@
 /*
- * BK Id: SCCS/s.pmac_time.c 1.8 05/17/01 18:14:21 cort
+ * BK Id: SCCS/s.pmac_time.c 1.11 07/06/01 15:46:39 trini
  */
 /*
  * Support for periodic interrupts (100 per second) and for getting
@@ -60,8 +60,8 @@
 
 extern struct timezone sys_tz;
 
-__init
-long pmac_time_init(void)
+long __init
+pmac_time_init(void)
 {
 #ifdef CONFIG_NVRAM
 	s32 delta = 0;
@@ -81,8 +81,8 @@
 #endif
 }
 
-__pmac
-unsigned long pmac_get_rtc_time(void)
+unsigned long __pmac
+pmac_get_rtc_time(void)
 {
 #if defined(CONFIG_ADB_CUDA) || defined(CONFIG_ADB_PMU)
 	struct adb_request req;
@@ -122,7 +122,8 @@
 	return 0;
 }
 
-int pmac_set_rtc_time(unsigned long nowtime)
+int __pmac
+pmac_set_rtc_time(unsigned long nowtime)
 {
 #if defined(CONFIG_ADB_CUDA) || defined(CONFIG_ADB_PMU)
 	struct adb_request req;
@@ -164,7 +165,8 @@
  * Calibrate the decrementer register using VIA timer 1.
  * This is used both on powermacs and CHRP machines.
  */
-int __init via_calibrate_decr(void)
+int __init
+via_calibrate_decr(void)
 {
 	struct device_node *vias;
 	volatile unsigned char *via;
@@ -211,7 +213,8 @@
 /*
  * Reset the time after a sleep.
  */
-static int time_sleep_notify(struct pmu_sleep_notifier *self, int when)
+static int __pmac
+time_sleep_notify(struct pmu_sleep_notifier *self, int when)
 {
 	static unsigned long time_diff;
 	unsigned long flags;
@@ -237,7 +240,7 @@
 	return PBOOK_SLEEP_OK;
 }
 
-static struct pmu_sleep_notifier time_sleep_notifier = {
+static struct pmu_sleep_notifier time_sleep_notifier __pmacdata = {
 	time_sleep_notify, SLEEP_LEVEL_MISC,
 };
 #endif /* CONFIG_PMAC_PBOOK */
@@ -247,7 +250,8 @@
  * This was taken from the pmac time_init() when merging the prep/pmac
  * time functions.
  */
-void __init pmac_calibrate_decr(void)
+void __init
+pmac_calibrate_decr(void)
 {
 	struct device_node *cpu;
 	unsigned int freq, *fp;
@@ -275,4 +279,3 @@
 	tb_ticks_per_jiffy = freq / HZ;
 	tb_to_us = mulhwu_scale_factor(freq, 1000000);
 }
-
diff -u --recursive --new-file v2.4.8/linux/arch/ppc/kernel/ppc_ksyms.c linux/arch/ppc/kernel/ppc_ksyms.c
--- v2.4.8/linux/arch/ppc/kernel/ppc_ksyms.c	Tue Jul  3 17:08:18 2001
+++ linux/arch/ppc/kernel/ppc_ksyms.c	Sun Aug 12 12:43:26 2001
@@ -1,5 +1,5 @@
 /*
- * BK Id: SCCS/s.ppc_ksyms.c 1.36 06/28/01 15:50:16 paulus
+ * BK Id: SCCS/s.ppc_ksyms.c 1.38 07/23/01 15:35:53 trini
  */
 #include <linux/config.h>
 #include <linux/module.h>
@@ -251,7 +251,6 @@
 EXPORT_SYMBOL(find_type_devices);
 EXPORT_SYMBOL(find_compatible_devices);
 EXPORT_SYMBOL(find_path_device);
-EXPORT_SYMBOL(find_phandle);
 EXPORT_SYMBOL(device_is_compatible);
 EXPORT_SYMBOL(machine_is_compatible);
 EXPORT_SYMBOL(find_all_nodes);
diff -u --recursive --new-file v2.4.8/linux/arch/ppc/kernel/prep_pci.c linux/arch/ppc/kernel/prep_pci.c
--- v2.4.8/linux/arch/ppc/kernel/prep_pci.c	Tue Jul  3 17:08:18 2001
+++ linux/arch/ppc/kernel/prep_pci.c	Sun Aug 12 12:43:26 2001
@@ -1,5 +1,5 @@
 /*
- * BK Id: SCCS/s.prep_pci.c 1.18 05/17/01 18:14:22 cort
+ * BK Id: SCCS/s.prep_pci.c 1.22 08/05/01 16:18:54 trini
  */
 /*
  * PReP pci functions.
@@ -848,7 +848,7 @@
 		switch(inb(0x0852))
 		{
 		case 0xff:
-			Motherboard_map_name = "IBM 850/860 Portable\n";
+			Motherboard_map_name = "IBM 850/860 Portable";
 			Motherboard_map = Nobis_pci_IRQ_map;
 			Motherboard_routes = Nobis_pci_IRQ_routes;
 			break;
diff -u --recursive --new-file v2.4.8/linux/arch/ppc/kernel/prep_setup.c linux/arch/ppc/kernel/prep_setup.c
--- v2.4.8/linux/arch/ppc/kernel/prep_setup.c	Wed Jul 25 17:10:18 2001
+++ linux/arch/ppc/kernel/prep_setup.c	Sun Aug 12 12:43:26 2001
@@ -1,5 +1,5 @@
 /*
- * BK Id: SCCS/s.prep_setup.c 1.23 07/18/01 22:56:39 paulus
+ * BK Id: SCCS/s.prep_setup.c 1.26 08/05/01 16:18:54 trini
  */
 /*
  *  linux/arch/ppc/kernel/setup.c
@@ -14,6 +14,7 @@
  */
 
 #include <linux/config.h>
+#include <linux/delay.h>
 #include <linux/module.h>
 #include <linux/errno.h>
 #include <linux/sched.h>
@@ -147,7 +148,7 @@
 		}
 		len += sprintf(buffer+len,"%sKb,",
 			       (((*(unsigned char *)0x8000080d)>>2)&1)?"512":"256");
-		len += sprintf(buffer+len,"%sync\n",
+		len += sprintf(buffer+len,"%ssync\n",
 			       ((*(unsigned char *)0x8000080d)>>7) ? "":"a");
 		break;
 	case _PREP_Motorola:
@@ -495,21 +496,20 @@
 void __prep
 prep_restart(char *cmd)
 {
-        unsigned long i = 10000;
-
+	unsigned long i = 10000;
 
 	__cli();
 
-        /* set exception prefix high - to the prom */
-        _nmask_and_or_msr(0, MSR_IP);
+	/* set exception prefix high - to the prom */
+	_nmask_and_or_msr(0, MSR_IP);
 
-        /* make sure bit 0 (reset) is a 0 */
-        outb( inb(0x92) & ~1L , 0x92 );
-        /* signal a reset to system control port A - soft reset */
-        outb( inb(0x92) | 1 , 0x92 );
+	/* make sure bit 0 (reset) is a 0 */
+	outb( inb(0x92) & ~1L , 0x92 );
+	/* signal a reset to system control port A - soft reset */
+	outb( inb(0x92) | 1 , 0x92 );
 
-        while ( i != 0 ) i++;
-        panic("restart failed\n");
+	while ( i != 0 ) i++;
+	panic("restart failed\n");
 }
 
 /*
@@ -541,27 +541,92 @@
 void __prep
 prep_halt(void)
 {
-        unsigned long flags;
+	unsigned long flags;
 	__cli();
 	/* set exception prefix high - to the prom */
 	save_flags( flags );
 	restore_flags( flags|MSR_IP );
-	
+
 	/* make sure bit 0 (reset) is a 0 */
 	outb( inb(0x92) & ~1L , 0x92 );
 	/* signal a reset to system control port A - soft reset */
 	outb( inb(0x92) | 1 , 0x92 );
-                
+
 	while ( 1 ) ;
 	/*
 	 * Not reached
 	 */
 }
 
+/*
+ * On IBM PReP's, power management is handled by a Signetics 87c750 behind the
+ * Utah component on the ISA bus. To access the 750 you must write a series of
+ * nibbles to port 0x82a (decoded by the Utah). This is described somewhat in
+ * the IBM Carolina Technical Specification.
+ * -Hollis
+ */
+static void __prep
+utah_sig87c750_setbit(unsigned int bytenum, unsigned int bitnum, int value)
+{
+	/*
+	 * byte1: 0 0 0 1 0  d  a5 a4
+	 * byte2: 0 0 0 1 a3 a2 a1 a0
+	 *
+	 * d = the bit's value, enabled or disabled
+	 * (a5 a4 a3) = the byte number, minus 20
+	 * (a2 a1 a0) = the bit number
+	 *
+	 * example: set the 5th bit of byte 21 (21.5)
+	 *     a5 a4 a3 = 001 (byte 1)
+	 *     a2 a1 a0 = 101 (bit 5)
+	 *
+	 *     byte1 = 0001 0100 (0x14)
+	 *     byte2 = 0001 1101 (0x1d)
+	 */
+	unsigned char byte1=0x10, byte2=0x10;
+	const unsigned int pm_reg_1=0x82a; /* ISA address */
+
+	/* the 750's '20.0' is accessed as '0.0' through Utah (which adds 20) */
+	bytenum -= 20;
+
+	byte1 |= (!!value) << 2;		/* set d */
+	byte1 |= (bytenum >> 1) & 0x3;	/* set a5, a4 */
+
+	byte2 |= (bytenum & 0x1) << 3;	/* set a3 */
+	byte2 |= bitnum & 0x7;			/* set a2, a1, a0 */
+
+	outb(byte1, pm_reg_1);		/* first nibble */
+	mb();
+	udelay(100);				/* important: let controller recover */
+
+	outb(byte2, pm_reg_1);		/* second nibble */
+	mb();
+	udelay(100);				/* important: let controller recover */
+}
+
 void __prep
 prep_power_off(void)
 {
-	prep_halt();
+	if ( _prep_type == _PREP_IBM) {
+		/* tested on:
+		 * 		Carolina's: 7248-43P, 6070 (PowerSeries 850)
+		 * should work on:
+		 * 		Carolina: 6050 (PowerSeries 830)
+		 * 		7043-140 (Tiger 1)
+		 */
+		unsigned long flags;
+		__cli();
+		/* set exception prefix high - to the prom */
+		save_flags( flags );
+		restore_flags( flags|MSR_IP );
+
+		utah_sig87c750_setbit(21, 5, 1); /* set bit 21.5, "PMEXEC_OFF" */
+
+		while ( 1 ) ;
+		/* not reached */
+	} else {
+		prep_halt();
+	}
 }
 
 int __prep
diff -u --recursive --new-file v2.4.8/linux/arch/ppc/kernel/prom.c linux/arch/ppc/kernel/prom.c
--- v2.4.8/linux/arch/ppc/kernel/prom.c	Wed Jul 25 17:10:18 2001
+++ linux/arch/ppc/kernel/prom.c	Sun Aug 12 12:43:26 2001
@@ -1,5 +1,5 @@
 /*
- * BK Id: SCCS/s.prom.c 1.26 06/28/01 15:50:16 paulus
+ * BK Id: SCCS/s.prom.c 1.35 07/25/01 14:11:37 trini
  */
 /*
  * Procedures for interfacing to the Open Firmware PROM on
@@ -170,6 +170,7 @@
 static unsigned long check_display(unsigned long);
 static int prom_next_node(phandle *);
 static void *early_get_property(unsigned long, unsigned long, char *);
+static struct device_node *find_phandle(phandle);
 
 #ifdef CONFIG_BOOTX_TEXT
 static void setup_disp_fake_bi(ihandle dp);
@@ -202,8 +203,7 @@
  * (Note that strings count as static variables.)
  */
 
-__init
-static void
+static void __init
 prom_exit()
 {
 	struct prom_args args;
@@ -217,8 +217,7 @@
 		;
 }
 
-__init
-void
+void __init
 prom_enter(void)
 {
 	struct prom_args args;
@@ -230,8 +229,7 @@
 	RELOC(prom)(&args);
 }
 
-__init
-static void *
+static void * __init
 call_prom(const char *service, int nargs, int nret, ...)
 {
 	va_list list;
@@ -252,8 +250,7 @@
 	return prom_args.args[nargs];
 }
 
-__init
-void
+void __init
 prom_print(const char *msg)
 {
 	const char *p, *q;
@@ -282,7 +279,7 @@
 	}
 }
 
-void
+static void __init
 prom_print_hex(unsigned int v)
 {
 	char buf[16];
@@ -298,13 +295,6 @@
 	prom_print(buf);
 }
 
-void
-prom_print_nl(void)
-{
-	unsigned long offset = reloc_offset();
-	prom_print(RELOC("\n"));
-}
-
 unsigned long smp_chrp_cpu_nr __initdata = 0;
 
 #ifdef CONFIG_SMP
@@ -328,7 +318,7 @@
  *
  * -- Cort
  */
-static void
+static void __init
 prom_hold_cpus(unsigned long mem)
 {
 	extern void __secondary_hold(void);
@@ -389,13 +379,13 @@
 		else {
 			prom_print(RELOC("failed: "));
 			prom_print_hex(*(ulong *)0x4);
-			prom_print_nl();
+			prom_print(RELOC("\n"));
 		}
 	}
 }
 #endif /* CONFIG_SMP */
 
-void
+void __init
 bootx_init(unsigned long r4, unsigned long phys)
 {
 	boot_infos_t *bi = (boot_infos_t *) r4;
@@ -508,7 +498,7 @@
 extern PTE *Hash;
 extern unsigned long Hash_size;
 
-void
+static void __init
 prom_alloc_htab(void)
 {
 	unsigned int hsize;
@@ -546,7 +536,7 @@
 }
 #endif /* CONFIG_PPC64BRIDGE */
 
-static __init void
+static void __init
 prom_instantiate_rtas(void)
 {
 	ihandle prom_rtas;
@@ -598,8 +588,7 @@
  * We enter here early on, when the Open Firmware prom is still
  * handling exceptions and the MMU hash table for us.
  */
-__init
-unsigned long
+unsigned long __init
 prom_init(int r3, int r4, prom_entry pp)
 {
 	int chrp = 0;
@@ -779,7 +768,7 @@
 }
 
 #ifdef CONFIG_BOOTX_TEXT
-__init static void
+static void __init
 prom_welcome(boot_infos_t* bi, unsigned long phys)
 {
 	unsigned long offset = reloc_offset();
@@ -831,8 +820,7 @@
  * is really badly aligned, but I didn't encounter this case
  * yet.
  */
-__init
-static void
+static void __init
 prepare_disp_BAT(void)
 {
 	unsigned long offset = reloc_offset();
@@ -855,7 +843,8 @@
 
 #endif
 
-static int prom_set_color(ihandle ih, int i, int r, int g, int b)
+static int __init
+prom_set_color(ihandle ih, int i, int r, int g, int b)
 {
 	struct prom_args prom_args;
 	unsigned long offset = reloc_offset();
@@ -881,8 +870,7 @@
  * So we check whether we will need to open the display,
  * and if so, open it now.
  */
-__init
-static unsigned long
+static unsigned long __init
 check_display(unsigned long mem)
 {
 	phandle node;
@@ -984,8 +972,7 @@
  * way, xmon output should work too
  */
 #ifdef CONFIG_BOOTX_TEXT
-__init
-static void
+static void __init
 setup_disp_fake_bi(ihandle dp)
 {
 	int width = 640, height = 480, depth = 8, pitch;
@@ -1055,8 +1042,7 @@
 }
 #endif
 
-__init
-static int
+static int __init
 prom_next_node(phandle *nodep)
 {
 	phandle node;
@@ -1078,8 +1064,7 @@
 /*
  * Make a copy of the device tree from the PROM.
  */
-__init
-static unsigned long
+static unsigned long __init
 copy_device_tree(unsigned long mem_start, unsigned long mem_end)
 {
 	phandle root;
@@ -1099,8 +1084,7 @@
 	return new_start;
 }
 
-__init
-static unsigned long
+static unsigned long __init
 inspect_node(phandle node, struct device_node *dad,
 	     unsigned long mem_start, unsigned long mem_end,
 	     struct device_node ***allnextpp)
@@ -1163,7 +1147,8 @@
 		prev_propp = &pp->next;
 		namep = (char *) (pp + 1);
 		pp->name = PTRUNRELOC(namep);
-		strcpy(namep, RELOC("linux,phandle"));
+		/* Work around a GCC3 bug */
+		memcpy(namep, RELOC("linux,phandle"), sizeof("linux,phandle"));
 		mem_start = ALIGN((unsigned long)namep + strlen(namep) + 1);
 		pp->value = (unsigned char *) PTRUNRELOC(&np->node);
 		pp->length = sizeof(np->node);
@@ -1196,8 +1181,7 @@
  * It traverses the device tree and fills in the name, type,
  * {n_}addrs and {n_}intrs fields of each node.
  */
-__init
-void
+void __init
 finish_device_tree(void)
 {
 	unsigned long mem = (unsigned long) klimit;
@@ -1251,7 +1235,7 @@
  * early_get_property is used to access the device tree image prepared
  * by BootX very early on, before the pointers in it have been relocated.
  */
-__init void *
+static void * __init
 early_get_property(unsigned long base, unsigned long node, char *prop)
 {
 	struct device_node *np = (struct device_node *)(base + node);
@@ -1267,8 +1251,7 @@
 	return 0;
 }
 
-__init
-static unsigned long
+static unsigned long __init
 finish_node(struct device_node *np, unsigned long mem_start,
 	    interpret_func *ifunc, int naddrc, int nsizec)
 {
@@ -1342,7 +1325,8 @@
 /*
  * Find the interrupt parent of a node.
  */
-static struct device_node *intr_parent(struct device_node *p)
+static struct device_node * __init
+intr_parent(struct device_node *p)
 {
 	phandle *parp;
 
@@ -1367,7 +1351,7 @@
  * Find out the size of each entry of the interrupts property
  * for a node.
  */
-static int
+static int __init
 prom_n_intr_cells(struct device_node *np)
 {
 	struct device_node *p;
@@ -1393,7 +1377,7 @@
  * Map an interrupt from a device up to the platform interrupt
  * descriptor.
  */
-static int
+static int __init
 map_interrupt(unsigned int **irq, struct device_node **ictrler,
 	      struct device_node *np, unsigned int *ints, int nintrc)
 {
@@ -1489,7 +1473,7 @@
 /*
  * New version of finish_node_interrupts.
  */
-static unsigned long
+static unsigned long __init
 finish_node_interrupts(struct device_node *np, unsigned long mem_start)
 {
 	unsigned int *ints;
@@ -1549,8 +1533,8 @@
  * are offsets from the start of the tree.
  * This procedure updates the pointers.
  */
-__init
-void relocate_nodes(void)
+void __init
+relocate_nodes(void)
 {
 	unsigned long base;
 	struct device_node *np;
@@ -1575,7 +1559,7 @@
 	}
 }
 
-int
+int __init
 prom_n_addr_cells(struct device_node* np)
 {
 	int* ip;
@@ -1590,7 +1574,7 @@
 	return 1;
 }
 
-int
+int __init
 prom_n_size_cells(struct device_node* np)
 {
 	int* ip;
@@ -1605,8 +1589,7 @@
 	return 1;
 }
 
-__init
-static unsigned long
+static unsigned long __init
 interpret_pci_props(struct device_node *np, unsigned long mem_start,
 		    int naddrc, int nsizec)
 {
@@ -1652,8 +1635,7 @@
 	return mem_start;
 }
 
-__init
-static unsigned long
+static unsigned long __init
 interpret_dbdma_props(struct device_node *np, unsigned long mem_start,
 		      int naddrc, int nsizec)
 {
@@ -1705,8 +1687,7 @@
 	return mem_start;
 }
 
-__init
-static unsigned long
+static unsigned long __init
 interpret_macio_props(struct device_node *np, unsigned long mem_start,
 		      int naddrc, int nsizec)
 {
@@ -1759,8 +1740,7 @@
 	return mem_start;
 }
 
-__init
-static unsigned long
+static unsigned long __init
 interpret_isa_props(struct device_node *np, unsigned long mem_start,
 		    int naddrc, int nsizec)
 {
@@ -1801,8 +1781,7 @@
 	return mem_start;
 }
 
-__init
-static unsigned long
+static unsigned long __init
 interpret_root_props(struct device_node *np, unsigned long mem_start,
 		     int naddrc, int nsizec)
 {
@@ -1873,7 +1852,6 @@
 /*
  * Construct and return a list of the device_nodes with a given name.
  */
-__openfirmware
 struct device_node *
 find_devices(const char *name)
 {
@@ -1893,7 +1871,6 @@
 /*
  * Construct and return a list of the device_nodes with a given type.
  */
-__openfirmware
 struct device_node *
 find_type_devices(const char *type)
 {
@@ -1913,8 +1890,7 @@
 /*
  * Returns all nodes linked together
  */
-__openfirmware
-struct device_node *
+struct device_node __openfirmware *
 find_all_nodes(void)
 {
 	struct device_node *head, **prevp, *np;
@@ -1931,7 +1907,6 @@
 /* Checks if the given "compat" string matches one of the strings in
  * the device's "compatible" property
  */
-__openfirmware
 int
 device_is_compatible(struct device_node *device, const char *compat)
 {
@@ -1957,7 +1932,6 @@
  * Indicates whether the root node has a given value in its
  * compatible property.
  */
-__openfirmware
 int
 machine_is_compatible(const char *compat)
 {
@@ -1973,7 +1947,6 @@
  * Construct and return a list of the device_nodes with a given type
  * and compatible property.
  */
-__openfirmware
 struct device_node *
 find_compatible_devices(const char *type, const char *compat)
 {
@@ -1996,7 +1969,6 @@
 /*
  * Find the device_node with a given full_name.
  */
-__openfirmware
 struct device_node *
 find_path_device(const char *path)
 {
@@ -2011,8 +1983,7 @@
 /*
  * Find the device_node with a given phandle.
  */
-__openfirmware
-struct device_node *
+static struct device_node __init *
 find_phandle(phandle ph)
 {
 	struct device_node *np;
@@ -2027,7 +1998,6 @@
  * Find a property with a given name for a given node
  * and return the value.
  */
-__openfirmware
 unsigned char *
 get_property(struct device_node *np, const char *name, int *lenp)
 {
@@ -2045,8 +2015,7 @@
 /*
  * Add a property to a node
  */
-__openfirmware
-void
+void __openfirmware
 prom_add_property(struct device_node* np, struct property* prop)
 {
 	struct property **next = &np->properties;
@@ -2058,8 +2027,7 @@
 }
 
 #if 0
-__openfirmware
-void
+void __openfirmware
 print_properties(struct device_node *np)
 {
 	struct property *pp;
@@ -2113,8 +2081,7 @@
 spinlock_t rtas_lock = SPIN_LOCK_UNLOCKED;
 
 /* this can be called after setup -- Cort */
-__openfirmware
-int
+int __openfirmware
 call_rtas(const char *service, int nargs, int nret,
 	  unsigned long *outputs, ...)
 {
@@ -2154,8 +2121,7 @@
 	return u.words[nargs+3];
 }
 
-__init
-void
+void __init
 abort()
 {
 #ifdef CONFIG_XMON
@@ -2195,8 +2161,7 @@
 }
 
 /* Calc the base address of a given point (x,y) */
-__pmac
-static unsigned char *
+static unsigned char * __pmac
 calc_base(boot_infos_t *bi, int x, int y)
 {
 	unsigned char *base;
@@ -2210,7 +2175,7 @@
 }
 
 /* Adjust the display to a new resolution */
-void
+void __openfirmware
 bootx_update_display(unsigned long phys, int width, int height,
 		     int depth, int pitch)
 {
@@ -2239,8 +2204,7 @@
 	g_max_loc_Y = height / 16;
 }
 
-__pmac
-static void
+static void __pmac
 clearscreen(void)
 {
 	unsigned long offset	= reloc_offset();
@@ -2264,8 +2228,7 @@
 	__asm__ __volatile__ ("dcbst 0,%0" :: "r" (addr));
 }
 
-__pmac
-static void
+static void __pmac
 flushscreen(void)
 {
 	unsigned long offset	= reloc_offset();
@@ -2287,8 +2250,7 @@
 }
 
 #ifndef NO_SCROLL
-__pmac
-static void
+static void __pmac
 scrollscreen(void)
 {
 	unsigned long offset		= reloc_offset();
@@ -2324,8 +2286,7 @@
 }
 #endif /* ndef NO_SCROLL */
 
-__pmac
-void
+void __pmac
 prom_drawchar(char c)
 {
 	unsigned long offset = reloc_offset();
@@ -2375,8 +2336,7 @@
 #endif
 }
 
-__pmac
-void
+void __pmac
 prom_drawstring(const char *c)
 {
 	unsigned long offset	= reloc_offset();
@@ -2387,8 +2347,7 @@
 		prom_drawchar(*c++);
 }
 
-__pmac
-void
+void __pmac
 prom_drawhex(unsigned long v)
 {
 	static char hex_table[] = "0123456789abcdef";
@@ -2406,9 +2365,7 @@
 	prom_drawchar(RELOC(hex_table)[(v >>  0) & 0x0000000FUL]);
 }
 
-
-__pmac
-static void
+static void __pmac
 draw_byte(unsigned char c, long locX, long locY)
 {
 	unsigned long offset	= reloc_offset();
@@ -2432,8 +2389,7 @@
 	}
 }
 
-__pmac
-static unsigned long expand_bits_8[16] = {
+static unsigned long expand_bits_8[16] __pmacdata  = {
 	0x00000000,
 	0x000000ff,
 	0x0000ff00,
@@ -2452,17 +2408,14 @@
 	0xffffffff
 };
 
-__pmac
-static unsigned long expand_bits_16[4] = {
+static unsigned long expand_bits_16[4] __pmacdata = {
 	0x00000000,
 	0x0000ffff,
 	0xffff0000,
 	0xffffffff
 };
 
-
-__pmac
-static void
+static void __pmac
 draw_byte_32(unsigned char *font, unsigned long *base, int rb)
 {
 	int l, bits;	
@@ -2484,8 +2437,7 @@
 	}
 }
 
-__pmac
-static void
+static void __pmac
 draw_byte_16(unsigned char *font, unsigned long *base, int rb)
 {
 	int l, bits;	
@@ -2505,8 +2457,7 @@
 	}
 }
 
-__pmac
-static void
+static void __pmac
 draw_byte_8(unsigned char *font, unsigned long *base, int rb)
 {
 	int l, bits;	
@@ -2524,8 +2475,7 @@
 	}
 }
 
-__pmac
-static unsigned char vga_font[cmapsz] = {
+static unsigned char vga_font[cmapsz] __pmacdata = {
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x81, 0xa5, 0x81, 0x81, 0xbd, 
 0x99, 0x81, 0x81, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xff, 
@@ -2871,4 +2821,3 @@
 };
 
 #endif /* CONFIG_BOOTX_TEXT */
-
diff -u --recursive --new-file v2.4.8/linux/arch/ppc/kernel/setup.c linux/arch/ppc/kernel/setup.c
--- v2.4.8/linux/arch/ppc/kernel/setup.c	Tue Jul  3 17:08:18 2001
+++ linux/arch/ppc/kernel/setup.c	Sun Aug 12 12:43:26 2001
@@ -1,5 +1,5 @@
 /*
- * BK Id: SCCS/s.setup.c 1.44 06/28/01 08:01:06 trini
+ * BK Id: SCCS/s.setup.c 1.46 07/26/01 14:18:18 trini
  */
 /*
  * Common prep/pmac/chrp boot and setup code.
@@ -574,7 +574,6 @@
 				initrd_below_start_ok = 1;
 			}
 #endif
-			cmd_line[0] = 0;
 			chosen = find_devices("chosen");
 			if (chosen != NULL) {
 				p = get_property(chosen, "bootargs", NULL);
diff -u --recursive --new-file v2.4.8/linux/arch/ppc/kernel/traps.c linux/arch/ppc/kernel/traps.c
--- v2.4.8/linux/arch/ppc/kernel/traps.c	Tue Jul  3 17:08:18 2001
+++ linux/arch/ppc/kernel/traps.c	Sun Aug 12 12:43:26 2001
@@ -1,5 +1,5 @@
 /*
- * BK Id: SCCS/s.traps.c 1.14 06/15/01 13:00:20 paulus
+ * BK Id: SCCS/s.traps.c 1.16 07/31/01 10:53:34 trini
  */
 /*
  *  linux/arch/ppc/kernel/traps.c
@@ -40,7 +40,7 @@
 #include <asm/processor.h>
 
 extern int fix_alignment(struct pt_regs *);
-extern void bad_page_fault(struct pt_regs *, unsigned long);
+extern void bad_page_fault(struct pt_regs *, unsigned long, int sig);
 
 #ifdef CONFIG_XMON
 extern void xmon(struct pt_regs *regs);
@@ -317,7 +317,7 @@
 		if (user_mode(regs))
 			force_sig(SIGSEGV, current);
 		else
-			bad_page_fault(regs, regs->dar);
+			bad_page_fault(regs, regs->dar, SIGSEGV);
 		return;
 	}
 	_exception(SIGBUS, regs);	
diff -u --recursive --new-file v2.4.8/linux/arch/ppc/mm/init.c linux/arch/ppc/mm/init.c
--- v2.4.8/linux/arch/ppc/mm/init.c	Tue Jul  3 17:08:18 2001
+++ linux/arch/ppc/mm/init.c	Sun Aug 12 12:43:26 2001
@@ -1,5 +1,5 @@
 /*
- * BK Id: SCCS/s.init.c 1.27 06/28/01 15:50:17 paulus
+ * BK Id: SCCS/s.init.c 1.30 07/06/01 09:19:29 trini
  */
 /*
  *  PowerPC version 
@@ -98,7 +98,6 @@
 extern char __prep_begin, __prep_end;
 extern char __chrp_begin, __chrp_end;
 extern char __pmac_begin, __pmac_end;
-extern char __apus_begin, __apus_end;
 extern char __openfirmware_begin, __openfirmware_end;
 unsigned long ioremap_base;
 unsigned long ioremap_bot;
@@ -719,14 +718,16 @@
 	unsigned long cnt = 0;
 
 	while (start < end) {
-	  	clear_bit(PG_reserved, &virt_to_page(start)->flags);
+		ClearPageReserved(virt_to_page(start));
 		set_page_count(virt_to_page(start), 1);
 		free_page(start);
 		cnt++;
 		start += PAGE_SIZE;
  	}
-	if (cnt)
+	if (cnt) {
 		printk(" %ldk %s", PGTOKB(cnt), name);
+		totalram_pages += cnt;
+	}
 }
 
 void free_initmem(void)
@@ -744,8 +745,6 @@
 		FREESEC(chrp);
 	if (_machine != _MACH_prep)
 		FREESEC(prep);
-	if (_machine != _MACH_apus)
-		FREESEC(apus);
 	if (!have_of)
 		FREESEC(openfirmware);
  	printk("\n");
diff -u --recursive --new-file v2.4.8/linux/arch/ppc/vmlinux.lds linux/arch/ppc/vmlinux.lds
--- v2.4.8/linux/arch/ppc/vmlinux.lds	Tue Jul  3 17:08:18 2001
+++ linux/arch/ppc/vmlinux.lds	Sun Aug 12 12:43:26 2001
@@ -117,20 +117,6 @@
   __chrp_end = .;
 
   . = ALIGN(4096);
-  __apus_begin = .;
-  .text.apus : { *(.text.apus) }
-  .data.apus : { *(.data.apus) }
-  . = ALIGN(4096);
-  __apus_end = .;
-
-  . = ALIGN(4096);
-  __apus_begin = .;
-  .text.apus : { *(.text.apus) }
-  .data.apus : { *(.data.apus) }
-  . = ALIGN(4096);
-  __apus_end = .;
-
-  . = ALIGN(4096);
   __openfirmware_begin = .;
   .text.openfirmware : { *(.text.openfirmware) }
   .data.openfirmware : { *(.data.openfirmware) }
diff -u --recursive --new-file v2.4.8/linux/arch/s390/kernel/entry.S linux/arch/s390/kernel/entry.S
--- v2.4.8/linux/arch/s390/kernel/entry.S	Sun Aug 12 13:27:58 2001
+++ linux/arch/s390/kernel/entry.S	Sun Aug 12 10:38:47 2001
@@ -81,7 +81,7 @@
 sigpending   =  8
 need_resched = 24
 tsk_ptrace   = 28
-processor    = 60
+processor    = 56
 
 /*
  * Base Address of this Module --- saved in __LC_ENTRY_BASE
@@ -197,19 +197,10 @@
 
 sysc_return:
         tm      SP_PSW+1(%r15),0x01 # returning to user ?
-        bno     BASED(sysc_leave) # no-> skip bottom half, resched & signal
-#
-# check, if bottom-half has to be done
-#
-	l       %r1,processor(%r9)    # get cpu number from task struture
-	sll     %r1,L1_CACHE_SHIFT
-	al      %r1,BASED(.Lirq_stat) # get address of irq_stat
-	icm     %r0,15,0(%r1)         # test irq_stat[#cpu].__softirq_pending
-        bnz     BASED(sysc_handle_bottom_half)
+        bno     BASED(sysc_leave) # no-> skip resched & signal
 #
 # check, if reschedule is needed
 #
-sysc_return_bh:	
         icm     %r0,15,need_resched(%r9) # get need_resched from task_struct
         bnz     BASED(sysc_reschedule)
         icm     %r0,15,sigpending(%r9)   # get sigpending from task_struct
@@ -248,15 +239,6 @@
 
 
 #
-# call do_softirq and return from syscall, if interrupt-level
-# is zero
-#
-sysc_handle_bottom_half:        
-        l       %r1,BASED(.Ldo_softirq)
-	la      %r14,BASED(sysc_return_bh)
-        br      %r1               # call do_softirq
-
-#
 # call schedule with sysc_return as return-address
 #
 sysc_reschedule:        
@@ -708,18 +690,19 @@
         basr    %r14,%r1          # branch to standard irq handler
 
 io_return:
-        tm      SP_PSW+1(%r15),0x01 # returning to user ?
-        bno     BASED(io_leave)   # no-> skip resched & signal
-        stosm   24(%r15),0x03     # reenable interrupts
 #
 # check, if bottom-half has to be done
 #
-	l       %r1,processor(%r9)    # get cpu number from task struture
-	sll     %r1,L1_CACHE_SHIFT
-	al      %r1,BASED(.Lirq_stat) # get address of irq_stat
-	icm     %r0,15,0(%r1)         # test irq_stat[#cpu].__softirq_pending
+        l       %r1,processor(%r9)    # get cpu number from task struture
+        sll     %r1,L1_CACHE_SHIFT
+        al      %r1,BASED(.Lirq_stat) # get address of irq_stat
+        icm     %r0,15,0(%r1)         # test irq_stat[#cpu].__softirq_pending
         bnz     BASED(io_handle_bottom_half)
-io_return_bh:	
+io_return_bh:
+
+        tm      SP_PSW+1(%r15),0x01 # returning to user ?
+        bno     BASED(io_leave)   # no-> skip resched & signal
+        stosm   24(%r15),0x03     # reenable interrupts
 #
 # check, if reschedule is needed
 #
@@ -732,12 +715,11 @@
         RESTORE_ALL
 
 #
-# call do_softirq and return from syscall, if interrupt-level
-# is zero
+# call do_softirq
 #
-io_handle_bottom_half:        
+io_handle_bottom_half:
         l       %r1,BASED(.Ldo_softirq)
-	la      %r14,BASED(io_return_bh)
+        la      %r14,BASED(io_return_bh)
         br      %r1               # call do_softirq
 
 #
diff -u --recursive --new-file v2.4.8/linux/arch/s390/kernel/process.c linux/arch/s390/kernel/process.c
--- v2.4.8/linux/arch/s390/kernel/process.c	Sun Aug 12 13:27:58 2001
+++ linux/arch/s390/kernel/process.c	Sun Aug 12 10:38:47 2001
@@ -63,12 +63,6 @@
 	wait_psw.mask = _WAIT_PSW_MASK;
 	wait_psw.addr = (unsigned long) &&idle_wakeup | 0x80000000L;
 	while(1) {
-                if (softirq_pending(smp_processor_id())) {
-                        do_softirq();
-                        __sti();
-                        if (!current->need_resched)
-                                continue;
-                }
                 if (current->need_resched) {
                         schedule();
                         check_pgt_cache();
diff -u --recursive --new-file v2.4.8/linux/arch/s390/vmlinux-shared.lds linux/arch/s390/vmlinux-shared.lds
--- v2.4.8/linux/arch/s390/vmlinux-shared.lds	Wed Dec 31 16:00:00 1969
+++ linux/arch/s390/vmlinux-shared.lds	Sun Aug 12 10:38:48 2001
@@ -0,0 +1,84 @@
+/* ld script to make s390 Linux kernel
+ * Written by Martin Schwidefsky (schwidefsky@de.ibm.com)
+ */
+OUTPUT_FORMAT("elf32-s390", "elf32-s390", "elf32-s390")
+OUTPUT_ARCH(s390)
+ENTRY(_start)
+SECTIONS
+{
+  . = 0x00000000;
+  _text = .;			/* Text and read-only data */
+  .text : {
+	*(.text)
+	*(.fixup)
+	*(.gnu.warning)
+	} = 0x0700
+  .text.lock : { *(.text.lock) }	/* out-of-line lock text */
+  .rodata : { *(.rodata) }
+  .kstrtab : { *(.kstrtab) }
+
+  . = ALIGN(16);		/* Exception table */
+  __start___ex_table = .;
+  __ex_table : { *(__ex_table) }
+  __stop___ex_table = .;
+
+  __start___ksymtab = .;	/* Kernel symbol table */
+  __ksymtab : { *(__ksymtab) }
+  __stop___ksymtab = .;
+
+  __start___kallsyms = .;       /* All kernel symbols */
+  __kallsyms : { *(__kallsyms) }
+  __stop___kallsyms = .;
+
+  . = ALIGN(1048576);		/* VM shared segments are 1MB aligned */
+
+  _etext = .;			/* End of text section */
+
+  .data : {			/* Data */
+	*(.data)
+	CONSTRUCTORS
+	}
+
+  _edata = .;			/* End of data section */
+
+  . = ALIGN(8192);		/* init_task */
+  .data.init_task : { *(.data.init_task) }
+
+  . = ALIGN(4096);		/* Init code and data */
+  __init_begin = .;
+  .text.init : { *(.text.init) }
+  .data.init : { *(.data.init) }
+  . = ALIGN(4096);
+  __init_end = .;
+
+  __setup_start = .;
+  .setup.init : { *(.setup.init) }
+  __setup_end = .;
+  __initcall_start = .;
+  .initcall.init : { *(.initcall.init) }
+  __initcall_end = .;
+  . = ALIGN(4096);
+  __init_end = .;
+
+  . = ALIGN(32);
+  .data.cacheline_aligned : { *(.data.cacheline_aligned) }
+
+  . = ALIGN(4096);
+  .data.page_aligned : { *(.data.idt) }
+
+
+  __bss_start = .;		/* BSS */
+  .bss : {
+	*(.bss)
+	}
+  _end = . ;
+
+  /* Stabs debugging sections.  */
+  .stab 0 : { *(.stab) }
+  .stabstr 0 : { *(.stabstr) }
+  .stab.excl 0 : { *(.stab.excl) }
+  .stab.exclstr 0 : { *(.stab.exclstr) }
+  .stab.index 0 : { *(.stab.index) }
+  .stab.indexstr 0 : { *(.stab.indexstr) }
+  .comment 0 : { *(.comment) }
+}
diff -u --recursive --new-file v2.4.8/linux/arch/s390x/kernel/entry.S linux/arch/s390x/kernel/entry.S
--- v2.4.8/linux/arch/s390x/kernel/entry.S	Sun Aug 12 13:27:58 2001
+++ linux/arch/s390x/kernel/entry.S	Sun Aug 12 10:38:48 2001
@@ -193,18 +193,8 @@
         tm      SP_PSW+1(%r15),0x01 # returning to user ?
         jno     sysc_leave        # no-> skip bottom half, resched & signal
 #
-# check, if bottom-half has to be done
-#
-	lgf     %r1,processor(%r9)    # get cpu number from task struture
-	larl    %r2,irq_stat
-	sll     %r1,L1_CACHE_SHIFT
-	la      %r1,0(%r1,%r2)
-	icm     %r0,15,0(%r1)         # test irq_stat[#cpu].__softirq_pending
-        jnz     sysc_handle_bottom_half
-#
 # check, if reschedule is needed
 #
-sysc_return_bh:
 	lg      %r0,need_resched(%r9) # get need_resched from task_struct
 	ltgr    %r0,%r0
         jnz     sysc_reschedule
@@ -239,15 +229,6 @@
 	larl    %r14,sysc_return
         jg      syscall_trace       # return point is sysc_return
 
-
-#
-# call do_softirq and return from syscall, if interrupt-level
-# is zero
-#
-sysc_handle_bottom_half:        
-	larl    %r14,sysc_return_bh
-        jg      do_softirq          # return point is sysc_return_bh
-
 #
 # call schedule with sysc_return as return-address
 #
@@ -698,9 +679,6 @@
 	brasl   %r14,do_IRQ            # call standard irq handler
 
 io_return:
-        tm      SP_PSW+1(%r15),0x01    # returning to user ?
-        jno     io_leave               # no-> skip resched & signal
-        stosm   48(%r15),0x03          # reenable interrupts
 #
 # check, if bottom-half has to be done
 #
@@ -711,6 +689,10 @@
 	icm     %r0,15,0(%r1)         # test irq_stat[#cpu].__softirq_pending
         jnz     io_handle_bottom_half
 io_return_bh:	
+
+        tm      SP_PSW+1(%r15),0x01    # returning to user ?
+        jno     io_leave               # no-> skip resched & signal
+        stosm   48(%r15),0x03          # reenable interrupts
 #
 # check, if reschedule is needed
 #
diff -u --recursive --new-file v2.4.8/linux/arch/s390x/kernel/ioctl32.c linux/arch/s390x/kernel/ioctl32.c
--- v2.4.8/linux/arch/s390x/kernel/ioctl32.c	Tue Feb 13 14:13:44 2001
+++ linux/arch/s390x/kernel/ioctl32.c	Sun Aug 12 10:38:48 2001
@@ -23,6 +23,7 @@
 #include <linux/netdevice.h>
 #include <linux/route.h>
 #include <linux/ext2_fs.h>
+#include <linux/hdreg.h>
 #include <asm/types.h>
 #include <asm/uaccess.h>
 #include <asm/dasd.h>
@@ -349,14 +350,14 @@
 	IOCTL32_DEFAULT(FIBMAP),
 	IOCTL32_DEFAULT(FIGETBSZ),
 
+	IOCTL32_DEFAULT(DASDAPIVER),
 	IOCTL32_DEFAULT(BIODASDDISABLE),
 	IOCTL32_DEFAULT(BIODASDENABLE),
 	IOCTL32_DEFAULT(BIODASDRSRV),
 	IOCTL32_DEFAULT(BIODASDRLSE),
 	IOCTL32_DEFAULT(BIODASDSLCK),
-	IOCTL32_DEFAULT(BIODASDRSID),
-	IOCTL32_DEFAULT(BIODASDFORMAT),
-	IOCTL32_DEFAULT(BIODASDRWTB),
+	IOCTL32_DEFAULT(BIODASDINFO),
+	IOCTL32_DEFAULT(BIODASDFMT),
 
 	IOCTL32_DEFAULT(BLKRRPART),
 
diff -u --recursive --new-file v2.4.8/linux/arch/s390x/kernel/linux32.c linux/arch/s390x/kernel/linux32.c
--- v2.4.8/linux/arch/s390x/kernel/linux32.c	Sun Aug 12 13:27:58 2001
+++ linux/arch/s390x/kernel/linux32.c	Sun Aug 12 15:06:07 2001
@@ -1204,7 +1204,7 @@
 };
 
 static int fillonedir(void * __buf, const char * name, int namlen,
-		      off_t offset, ino_t ino, unsigned int d_type)
+		      loff_t offset, ino_t ino, unsigned int d_type)
 {
 	struct readdir_callback32 * buf = (struct readdir_callback32 *) __buf;
 	struct old_linux_dirent32 * dirent;
@@ -1259,7 +1259,7 @@
 	int error;
 };
 
-static int filldir(void * __buf, const char * name, int namlen, off_t offset, ino_t ino,
+static int filldir(void * __buf, const char * name, int namlen, loff_t offset, ino_t ino,
 		   unsigned int d_type)
 {
 	struct linux_dirent32 * dirent;
diff -u --recursive --new-file v2.4.8/linux/arch/s390x/kernel/process.c linux/arch/s390x/kernel/process.c
--- v2.4.8/linux/arch/s390x/kernel/process.c	Sun Aug 12 13:27:58 2001
+++ linux/arch/s390x/kernel/process.c	Sun Aug 12 10:38:48 2001
@@ -63,12 +63,6 @@
 	wait_psw.mask = _WAIT_PSW_MASK;
 	wait_psw.addr = (unsigned long) &&idle_wakeup;
 	while(1) {
-                if (softirq_pending(smp_processor_id())) {
-                        do_softirq();
-                        __sti();
-                        if (!current->need_resched)
-                                continue;
-                }
                 if (current->need_resched) {
                         schedule();
                         check_pgt_cache();
diff -u --recursive --new-file v2.4.8/linux/arch/s390x/vmlinux-shared.lds linux/arch/s390x/vmlinux-shared.lds
--- v2.4.8/linux/arch/s390x/vmlinux-shared.lds	Wed Dec 31 16:00:00 1969
+++ linux/arch/s390x/vmlinux-shared.lds	Sun Aug 12 10:38:48 2001
@@ -0,0 +1,84 @@
+/* ld script to make s390 Linux kernel
+ * Written by Martin Schwidefsky (schwidefsky@de.ibm.com)
+ */
+OUTPUT_FORMAT("elf64-s390", "elf64-s390", "elf64-s390")
+OUTPUT_ARCH(s390)
+ENTRY(_start)
+SECTIONS
+{
+  . = 0x00000000;
+  _text = .;			/* Text and read-only data */
+  .text : {
+	*(.text)
+	*(.fixup)
+	*(.gnu.warning)
+	} = 0x0700
+  .text.lock : { *(.text.lock) }	/* out-of-line lock text */
+  .rodata : { *(.rodata) }
+  .kstrtab : { *(.kstrtab) }
+
+  . = ALIGN(16);		/* Exception table */
+  __start___ex_table = .;
+  __ex_table : { *(__ex_table) }
+  __stop___ex_table = .;
+
+  __start___ksymtab = .;	/* Kernel symbol table */
+  __ksymtab : { *(__ksymtab) }
+  __stop___ksymtab = .;
+
+  __start___kallsyms = .;       /* All kernel symbols */
+  __kallsyms : { *(__kallsyms) }
+  __stop___kallsyms = .;
+
+  . = ALIGN(1048576);		/* VM shared segments are 1MB aligned */
+
+  _etext = .;			/* End of text section */
+
+  .data : {			/* Data */
+	*(.data)
+	CONSTRUCTORS
+	}
+
+  _edata = .;			/* End of data section */
+
+  . = ALIGN(16384);		/* init_task */
+  .data.init_task : { *(.data.init_task) }
+
+  . = ALIGN(4096);		/* Init code and data */
+  __init_begin = .;
+  .text.init : { *(.text.init) }
+  .data.init : { *(.data.init) }
+  . = ALIGN(4096);
+  __init_end = .;
+
+  __setup_start = .;
+  .setup.init : { *(.setup.init) }
+  __setup_end = .;
+  __initcall_start = .;
+  .initcall.init : { *(.initcall.init) }
+  __initcall_end = .;
+  . = ALIGN(4096);
+  __init_end = .;
+
+  . = ALIGN(32);
+  .data.cacheline_aligned : { *(.data.cacheline_aligned) }
+
+  . = ALIGN(4096);
+  .data.page_aligned : { *(.data.idt) }
+
+
+  __bss_start = .;		/* BSS */
+  .bss : {
+	*(.bss)
+	}
+  _end = . ;
+
+  /* Stabs debugging sections.  */
+  .stab 0 : { *(.stab) }
+  .stabstr 0 : { *(.stabstr) }
+  .stab.excl 0 : { *(.stab.excl) }
+  .stab.exclstr 0 : { *(.stab.exclstr) }
+  .stab.index 0 : { *(.stab.index) }
+  .stab.indexstr 0 : { *(.stab.indexstr) }
+  .comment 0 : { *(.comment) }
+}
diff -u --recursive --new-file v2.4.8/linux/arch/sparc/kernel/sys_sunos.c linux/arch/sparc/kernel/sys_sunos.c
--- v2.4.8/linux/arch/sparc/kernel/sys_sunos.c	Tue May  1 20:59:24 2001
+++ linux/arch/sparc/kernel/sys_sunos.c	Sun Aug 12 15:06:49 2001
@@ -322,7 +322,7 @@
 #define ROUND_UP(x) (((x)+sizeof(long)-1) & ~(sizeof(long)-1))
 
 static int sunos_filldir(void * __buf, const char * name, int namlen,
-			 off_t offset, ino_t ino, unsigned int d_type)
+			 loff_t offset, ino_t ino, unsigned int d_type)
 {
 	struct sunos_dirent * dirent;
 	struct sunos_dirent_callback * buf = (struct sunos_dirent_callback *) __buf;
@@ -403,7 +403,7 @@
 };
 
 static int sunos_filldirentry(void * __buf, const char * name, int namlen,
-			      off_t offset, ino_t ino, unsigned int d_type)
+			      loff_t offset, ino_t ino, unsigned int d_type)
 {
 	struct sunos_direntry * dirent;
 	struct sunos_direntry_callback * buf = (struct sunos_direntry_callback *) __buf;
diff -u --recursive --new-file v2.4.8/linux/arch/sparc/mm/extable.c linux/arch/sparc/mm/extable.c
--- v2.4.8/linux/arch/sparc/mm/extable.c	Sun Aug 12 13:27:59 2001
+++ linux/arch/sparc/mm/extable.c	Sun Aug 12 11:23:32 2001
@@ -43,6 +43,8 @@
         return 0;
 }
 
+extern spinlock_t modlist_lock;
+
 unsigned long
 search_exception_table(unsigned long addr, unsigned long *g2)
 {
diff -u --recursive --new-file v2.4.8/linux/arch/sparc64/config.in linux/arch/sparc64/config.in
--- v2.4.8/linux/arch/sparc64/config.in	Wed Jul 25 17:10:19 2001
+++ linux/arch/sparc64/config.in	Sun Aug 12 11:23:32 2001
@@ -1,4 +1,4 @@
-# $Id: config.in,v 1.148 2001/07/20 07:10:35 davem Exp $
+# $Id: config.in,v 1.149 2001/08/09 17:47:51 davem Exp $
 # For a description of the syntax of this configuration file,
 # see the Configure script.
 #
@@ -251,9 +251,6 @@
 dep_tristate '  Creator/Creator3D' CONFIG_DRM_FFB $CONFIG_DRM
 dep_tristate '  3dfx Banshee/Voodoo3+' CONFIG_DRM_TDFX $CONFIG_DRM
 dep_tristate '  ATI Rage 128' CONFIG_DRM_R128 $CONFIG_DRM
-if [ "$CONFIG_DRM_R128" != "n" ]; then
-   define_bool CONFIG_AGP y
-fi
 endmenu
 
 source drivers/input/Config.in
diff -u --recursive --new-file v2.4.8/linux/arch/sparc64/defconfig linux/arch/sparc64/defconfig
--- v2.4.8/linux/arch/sparc64/defconfig	Sun Aug 12 13:27:59 2001
+++ linux/arch/sparc64/defconfig	Sun Aug 12 11:23:32 2001
@@ -527,8 +527,7 @@
 CONFIG_DRM=y
 CONFIG_DRM_FFB=m
 CONFIG_DRM_TDFX=m
-CONFIG_DRM_R128=m
-CONFIG_AGP=y
+# CONFIG_DRM_R128 is not set
 
 #
 # Input core support
diff -u --recursive --new-file v2.4.8/linux/arch/sparc64/kernel/dtlb_backend.S linux/arch/sparc64/kernel/dtlb_backend.S
--- v2.4.8/linux/arch/sparc64/kernel/dtlb_backend.S	Mon Jan 31 23:37:19 2000
+++ linux/arch/sparc64/kernel/dtlb_backend.S	Sun Aug 12 11:23:32 2001
@@ -1,4 +1,4 @@
-/* $Id: dtlb_backend.S,v 1.9 2000/01/31 04:59:12 davem Exp $
+/* $Id: dtlb_backend.S,v 1.11 2001/08/08 08:01:28 davem Exp $
  * dtlb_backend.S: Back end to DTLB miss replacement strategy.
  *                 This is included directly into the trap table.
  *
@@ -10,15 +10,13 @@
 #define VPTE_SHIFT		(PAGE_SHIFT - 3)
 #define PMD_SHIFT		(23 - PAGE_SHIFT + 3)
 #define PGD_SHIFT		(34 - PAGE_SHIFT + 3)
-#define VPTE_BITS		(_PAGE_CP | _PAGE_CV | _PAGE_P | _PAGE_W)
+#define VPTE_BITS		(_PAGE_CP | _PAGE_CV | _PAGE_P)
 
 /* Ways we can get here:
  *
  * 1) Nucleus loads and stores to/from PA-->VA direct mappings at tl>1.
  * 2) Nucleus loads and stores to/from user/kernel window save areas.
- * 3) VPTE misses from dtlb_base, dtlb_prot, and itlb_base.  But this only
- *    happens for non-nucleus contexts.  Nucleus VPTE's cannot work because
- *    of how OBP uses the same part of the address space in ctx 0.
+ * 3) VPTE misses from dtlb_base and itlb_base.
  */
 
 /* TLB1 ** ICACHE line 1: tl1 DTLB and quick VPTE miss	*/
diff -u --recursive --new-file v2.4.8/linux/arch/sparc64/kernel/smp.c linux/arch/sparc64/kernel/smp.c
--- v2.4.8/linux/arch/sparc64/kernel/smp.c	Sun Aug 12 13:27:59 2001
+++ linux/arch/sparc64/kernel/smp.c	Sun Aug 12 11:23:32 2001
@@ -59,6 +59,15 @@
 	/* XXX implement me XXX */
 }
 
+static int max_cpus = NR_CPUS;
+static int __init maxcpus(char *str)
+{
+	get_option(&str, &max_cpus);
+	return 1;
+}
+
+__setup("maxcpus=", maxcpus);
+
 int smp_info(char *buf)
 {
 	int len = 7, i;
@@ -251,6 +260,8 @@
 		if (i == boot_cpu_id)
 			continue;
 
+		if ((cpucount + 1) == max_cpus)
+			break;
 		if (cpu_present_map & (1UL << i)) {
 			unsigned long entry = (unsigned long)(&sparc64_cpu_startup);
 			unsigned long cookie = (unsigned long)(&cpu_new_task);
@@ -502,12 +513,16 @@
 	}
 }
 
-void smp_cross_call(unsigned long *func, u32 ctx, u64 data1, u64 data2)
+/* Send cross call to all processors mentioned in MASK
+ * except self.
+ */
+static void smp_cross_call_masked(unsigned long *func, u32 ctx, u64 data1, u64 data2, unsigned long mask)
 {
 	if (smp_processors_ready) {
-		unsigned long mask = (cpu_present_map & ~(1UL<<smp_processor_id()));
 		u64 data0 = (((u64)ctx)<<32 | (((u64)func) & 0xffffffff));
 
+		mask &= ~(1UL<<smp_processor_id());
+
 		if (tlb_type == spitfire)
 			spitfire_xcall_deliver(data0, data1, data2, mask);
 		else
@@ -517,6 +532,10 @@
 	}
 }
 
+/* Send cross call to all processors except self. */
+#define smp_cross_call(func, ctx, data1, data2) \
+	smp_cross_call_masked(func, ctx, data1, data2, cpu_present_map)
+
 struct call_data_struct {
 	void (*func) (void *info);
 	void *info;
@@ -610,6 +629,9 @@
  *    space has (potentially) executed on, this is the heuristic
  *    we use to avoid doing cross calls.
  *
+ *    Also, for flushing from kswapd and also for clones, we
+ *    use cpu_vm_mask as the list of cpus to make run the TLB.
+ *
  * 2) TLB context numbers are shared globally across all processors
  *    in the system, this allows us to play several games to avoid
  *    cross calls.
@@ -627,42 +649,45 @@
  *    migrates to another cpu (again).
  *
  * 3) For shared address spaces (threads) and swapping we bite the
- *    bullet for most cases and perform the cross call.
+ *    bullet for most cases and perform the cross call (but only to
+ *    the cpus listed in cpu_vm_mask).
  *
  *    The performance gain from "optimizing" away the cross call for threads is
  *    questionable (in theory the big win for threads is the massive sharing of
  *    address space state across processors).
- *
- *    For the swapping case the locking is difficult to get right, we'd have to
- *    enforce strict ordered access to mm->cpu_vm_mask via a spinlock for example.
- *    Then again one could argue that when you are swapping, the cost of a cross
- *    call won't even show up on the performance radar.  But in any case we do get
- *    rid of the cross-call when the task has a dead context or the task has only
- *    ever run on the local cpu.
- *
- * 4) If the mm never had a valid context yet, there is nothing to
- *    flush.  CTX_NEVER_WAS_VALID checks this.
- *
- *    This check used to be done with CTX_VALID(), but Kanoj Sarcar has
- *    pointed out that this is an invalid optimization.  It can cause
- *    stale translations to be left in the TLB.
  */
 void smp_flush_tlb_mm(struct mm_struct *mm)
 {
-	if (CTX_NEVER_WAS_VALID(mm->context))
-		return;
+        /*
+         * This code is called from two places, dup_mmap and exit_mmap. In the
+         * former case, we really need a flush. In the later case, the callers
+         * are single threaded exec_mmap (really need a flush), multithreaded
+         * exec_mmap case (do not need to flush, since the caller gets a new
+         * context via activate_mm), and all other callers of mmput() whence
+         * the flush can be optimized since the associated threads are dead and
+         * the mm is being torn down (__exit_mm and other mmput callers) or the
+         * owning thread is dissociating itself from the mm. The
+         * (atomic_read(&mm->mm_users) == 0) check ensures real work is done
+         * for single thread exec and dup_mmap cases. An alternate check might
+         * have been (current->mm != mm).
+         *                                              Kanoj Sarcar
+         */
+        if (atomic_read(&mm->mm_users) == 0)
+                return;
 
 	{
 		u32 ctx = CTX_HWBITS(mm->context);
 		int cpu = smp_processor_id();
 
-		if (mm == current->active_mm && atomic_read(&mm->mm_users) == 1) {
+		if (atomic_read(&mm->mm_users) == 1) {
 			/* See smp_flush_tlb_page for info about this. */
 			mm->cpu_vm_mask = (1UL << cpu);
 			goto local_flush_and_out;
 		}
 
-		smp_cross_call(&xcall_flush_tlb_mm, ctx, 0, 0);
+		smp_cross_call_masked(&xcall_flush_tlb_mm,
+				      ctx, 0, 0,
+				      mm->cpu_vm_mask);
 
 	local_flush_and_out:
 		__flush_tlb_mm(ctx, SECONDARY_CONTEXT);
@@ -672,9 +697,6 @@
 void smp_flush_tlb_range(struct mm_struct *mm, unsigned long start,
 			 unsigned long end)
 {
-	if (CTX_NEVER_WAS_VALID(mm->context))
-		return;
-
 	{
 		u32 ctx = CTX_HWBITS(mm->context);
 		int cpu = smp_processor_id();
@@ -687,7 +709,9 @@
 			goto local_flush_and_out;
 		}
 
-		smp_cross_call(&xcall_flush_tlb_range, ctx, start, end);
+		smp_cross_call_masked(&xcall_flush_tlb_range,
+				      ctx, start, end,
+				      mm->cpu_vm_mask);
 
 	local_flush_and_out:
 		__flush_tlb_range(ctx, start, SECONDARY_CONTEXT, end, PAGE_SIZE, (end-start));
@@ -696,9 +720,6 @@
 
 void smp_flush_tlb_page(struct mm_struct *mm, unsigned long page)
 {
-	if (CTX_NEVER_WAS_VALID(mm->context))
-		return;
-
 	{
 		u32 ctx = CTX_HWBITS(mm->context);
 		int cpu = smp_processor_id();
@@ -730,7 +751,11 @@
 		 * this is a cloned mm or kswapd is kicking out pages for a task
 		 * which has run recently on another cpu.
 		 */
-		smp_cross_call(&xcall_flush_tlb_page, ctx, page, 0);
+		smp_cross_call_masked(&xcall_flush_tlb_page,
+				      ctx, page, 0,
+				      mm->cpu_vm_mask);
+		if (!(mm->cpu_vm_mask & (1UL << cpu)))
+			return;
 
 	local_flush_and_out:
 		__flush_tlb_page(ctx, page, SECONDARY_CONTEXT);
diff -u --recursive --new-file v2.4.8/linux/arch/sparc64/kernel/sys_sparc32.c linux/arch/sparc64/kernel/sys_sparc32.c
--- v2.4.8/linux/arch/sparc64/kernel/sys_sparc32.c	Tue Jul  3 17:08:19 2001
+++ linux/arch/sparc64/kernel/sys_sparc32.c	Sun Aug 12 15:04:35 2001
@@ -1192,7 +1192,7 @@
 };
 
 static int fillonedir(void * __buf, const char * name, int namlen,
-		      off_t offset, ino_t ino, unsigned int d_type)
+		      loff_t offset, ino_t ino, unsigned int d_type)
 {
 	struct readdir_callback32 * buf = (struct readdir_callback32 *) __buf;
 	struct old_linux_dirent32 * dirent;
@@ -1247,7 +1247,7 @@
 	int error;
 };
 
-static int filldir(void * __buf, const char * name, int namlen, off_t offset, ino_t ino,
+static int filldir(void * __buf, const char * name, int namlen, loff_t offset, ino_t ino,
 		   unsigned int d_type)
 {
 	struct linux_dirent32 * dirent;
diff -u --recursive --new-file v2.4.8/linux/arch/sparc64/kernel/sys_sunos32.c linux/arch/sparc64/kernel/sys_sunos32.c
--- v2.4.8/linux/arch/sparc64/kernel/sys_sunos32.c	Tue May  1 20:59:24 2001
+++ linux/arch/sparc64/kernel/sys_sunos32.c	Sun Aug 12 15:04:50 2001
@@ -277,7 +277,7 @@
 #define ROUND_UP(x) (((x)+sizeof(s32)-1) & ~(sizeof(s32)-1))
 
 static int sunos_filldir(void * __buf, const char * name, int namlen,
-			 off_t offset, ino_t ino, unsigned int d_type)
+			 loff_t offset, ino_t ino, unsigned int d_type)
 {
 	struct sunos_dirent * dirent;
 	struct sunos_dirent_callback * buf = (struct sunos_dirent_callback *) __buf;
@@ -359,7 +359,7 @@
 };
 
 static int sunos_filldirentry(void * __buf, const char * name, int namlen,
-			      off_t offset, ino_t ino, unsigned int d_type)
+			      loff_t offset, ino_t ino, unsigned int d_type)
 {
 	struct sunos_direntry * dirent;
 	struct sunos_direntry_callback * buf = (struct sunos_direntry_callback *) __buf;
diff -u --recursive --new-file v2.4.8/linux/arch/sparc64/mm/fault.c linux/arch/sparc64/mm/fault.c
--- v2.4.8/linux/arch/sparc64/mm/fault.c	Sun Mar 25 18:14:21 2001
+++ linux/arch/sparc64/mm/fault.c	Sun Aug 12 11:23:32 2001
@@ -1,4 +1,4 @@
-/* $Id: fault.c,v 1.54 2001/03/24 09:36:11 davem Exp $
+/* $Id: fault.c,v 1.55 2001/08/09 20:18:43 davem Exp $
  * arch/sparc64/mm/fault.c: Page fault handlers for the 64-bit Sparc.
  *
  * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
@@ -92,6 +92,13 @@
 	die_if_kernel("Oops", regs);
 }
 
+/*
+ * We now make sure that mmap_sem is held in all paths that call 
+ * this. Additionally, to prevent kswapd from ripping ptes from
+ * under us, raise interrupts around the time that we look at the
+ * pte, kswapd will have to wait to get his smp ipi response from
+ * us. This saves us having to get page_table_lock.
+ */
 static unsigned int get_user_insn(unsigned long tpc)
 {
 	pgd_t *pgdp = pgd_offset(current->mm, tpc);
@@ -99,13 +106,17 @@
 	pte_t *ptep, pte;
 	unsigned long pa;
 	u32 insn = 0;
+	unsigned long pstate;
 
 	if (pgd_none(*pgdp))
-		goto out;
+		goto outret;
 	pmdp = pmd_offset(pgdp, tpc);
 	if (pmd_none(*pmdp))
-		goto out;
+		goto outret;
 	ptep = pte_offset(pmdp, tpc);
+	__asm__ __volatile__("rdpr %%pstate, %0" : "=r" (pstate));
+	__asm__ __volatile__("wrpr %0, %1, %%pstate"
+				: : "r" (pstate), "i" (PSTATE_IE));
 	pte = *ptep;
 	if (!pte_present(pte))
 		goto out;
@@ -119,6 +130,8 @@
 			     : "r" (pa), "i" (ASI_PHYS_USE_EC));
 
 out:
+	__asm__ __volatile__("wrpr %0, 0x0, %%pstate" : : "r" (pstate));
+outret:
 	return insn;
 }
 
@@ -137,21 +150,28 @@
 extern int handle_ldf_stq(u32, struct pt_regs *);
 extern int handle_ld_nf(u32, struct pt_regs *);
 
-static void do_kernel_fault(struct pt_regs *regs, int si_code, int fault_code,
-			    unsigned int insn, unsigned long address)
+static inline unsigned int get_fault_insn(struct pt_regs *regs, unsigned int insn)
 {
-	unsigned long g2;
-	unsigned char asi = ASI_P;
-
 	if (!insn) {
+		if (!regs->tpc || (regs->tpc & 0x3))
+			return 0;
 		if (regs->tstate & TSTATE_PRIV) {
-			if (!regs->tpc || (regs->tpc & 0x3))
-				goto cannot_handle;
 			insn = *(unsigned int *)regs->tpc;
 		} else {
 			insn = get_user_insn(regs->tpc);
 		}
 	}
+	return insn;
+}
+
+static void do_kernel_fault(struct pt_regs *regs, int si_code, int fault_code,
+			    unsigned int insn, unsigned long address)
+{
+	unsigned long g2;
+	unsigned char asi = ASI_P;
+ 
+	if (!insn)
+		goto cannot_handle;
 
 	/* If user insn could be read (thus insn is zero), that
 	 * is fine.  We will just gun down the process with a signal
@@ -232,7 +252,7 @@
 	 * context, we must not take the fault..
 	 */
 	if (in_interrupt() || !mm)
-		goto handle_kernel_fault;
+		goto intr_or_no_mm;
 
 	if ((current->thread.flags & SPARC_FLAG_32BIT) != 0) {
 		regs->tpc &= 0xffffffff;
@@ -255,16 +275,9 @@
 	if (((fault_code &
 	      (FAULT_CODE_DTLB | FAULT_CODE_WRITE | FAULT_CODE_WINFIXUP)) == FAULT_CODE_DTLB) &&
 	    (vma->vm_flags & VM_WRITE) != 0) {
-		unsigned long tpc = regs->tpc;
-
-		if (tpc & 0x3)
+		insn = get_fault_insn(regs, 0);
+		if (!insn)
 			goto continue_fault;
-
-		if (regs->tstate & TSTATE_PRIV)
-			insn = *(unsigned int *)tpc;
-		else
-			insn = get_user_insn(tpc);
-
 		if ((insn & 0xc0200000) == 0xc0200000 &&
 		    (insn & 0x1780000) != 0x1680000) {
 			/* Don't bother updating thread struct value,
@@ -326,6 +339,7 @@
 	 * Fix it, but check if it's kernel or user first..
 	 */
 bad_area:
+	insn = get_fault_insn(regs, insn);
 	up_read(&mm->mmap_sem);
 
 handle_kernel_fault:
@@ -338,13 +352,19 @@
  * us unable to handle the page fault gracefully.
  */
 out_of_memory:
+	insn = get_fault_insn(regs, insn);
 	up_read(&mm->mmap_sem);
 	printk("VM: killing process %s\n", current->comm);
 	if (!(regs->tstate & TSTATE_PRIV))
 		do_exit(SIGKILL);
 	goto handle_kernel_fault;
 
+intr_or_no_mm:
+	insn = get_fault_insn(regs, 0);
+	goto handle_kernel_fault;
+
 do_sigbus:
+	insn = get_fault_insn(regs, insn);
 	up_read(&mm->mmap_sem);
 
 	/*
diff -u --recursive --new-file v2.4.8/linux/arch/sparc64/mm/init.c linux/arch/sparc64/mm/init.c
--- v2.4.8/linux/arch/sparc64/mm/init.c	Sun Aug 12 13:27:59 2001
+++ linux/arch/sparc64/mm/init.c	Sun Aug 12 11:23:32 2001
@@ -1,4 +1,4 @@
-/*  $Id: init.c,v 1.178 2001/08/06 13:09:00 davem Exp $
+/*  $Id: init.c,v 1.179 2001/08/08 07:52:00 davem Exp $
  *  arch/sparc64/mm/init.c
  *
  *  Copyright (C) 1996-1999 David S. Miller (davem@caip.rutgers.edu)
@@ -885,20 +885,20 @@
 struct pgtable_cache_struct pgt_quicklists;
 #endif
 
-/* OK, we have to color these pages because during DTLB
- * protection faults we set the dirty bit via a non-Dcache
- * enabled mapping in the VPTE area.  The kernel can end
- * up missing the dirty bit resulting in processes crashing
- * _iff_ the VPTE mapping of the ptes have a virtual address
- * bit 13 which is different from bit 13 of the physical address.
- *
- * The sequence is:
- *	1) DTLB protection fault, write dirty bit into pte via VPTE
- *	   mappings.
- *	2) Swapper checks pte, does not see dirty bit, frees page.
- *	3) Process faults back in the page, the old pre-dirtied copy
- *	   is provided and here is the corruption.
+/* OK, we have to color these pages. The page tables are accessed
+ * by non-Dcache enabled mapping in the VPTE area by the dtlb_backend.S
+ * code, as well as by PAGE_OFFSET range direct-mapped addresses by 
+ * other parts of the kernel. By coloring, we make sure that the tlbmiss 
+ * fast handlers do not get data from old/garbage dcache lines that 
+ * correspond to an old/stale virtual address (user/kernel) that 
+ * previously mapped the pagetable page while accessing vpte range 
+ * addresses. The idea is that if the vpte color and PAGE_OFFSET range 
+ * color is the same, then when the kernel initializes the pagetable 
+ * using the later address range, accesses with the first address
+ * range will not see the newly initialized data rather than the
+ * garbage.
  */
+ 
 pte_t *pte_alloc_one(struct mm_struct *mm, unsigned long address)
 {
 	struct page *page = alloc_pages(GFP_KERNEL, 1);
diff -u --recursive --new-file v2.4.8/linux/drivers/acorn/block/fd1772.c linux/drivers/acorn/block/fd1772.c
--- v2.4.8/linux/drivers/acorn/block/fd1772.c	Thu Feb  8 16:32:44 2001
+++ linux/drivers/acorn/block/fd1772.c	Sun Aug 12 10:38:48 2001
@@ -3,7 +3,7 @@
  *  Based on ataflop.c in the m68k Linux
  *  Copyright (C) 1993  Greg Harp
  *  Atari Support by Bjoern Brauel, Roman Hodek
- *  Archimedes Support by Dave Gilbert (gilbertd@cs.man.ac.uk)
+ *  Archimedes Support by Dave Gilbert (linux@treblig.org)
  *
  *  Big cleanup Sep 11..14 1994 Roman Hodek:
  *   - Driver now works interrupt driven
@@ -117,12 +117,17 @@
  *
  * DAG 30/01/99 - Started frobbing for 2.2.1
  * DAG 20/06/99 - A little more frobbing:
- *     Included include/asm/uaccess.h for get_user/put_user
+ *		  Included include/asm/uaccess.h for get_user/put_user
+ *
+ * DAG  1/09/00 - Dusted off for 2.4.0-test7
+ *                MAX_SECTORS was name clashing so it is now FD1772_...
+ *                Minor parameter, name layouts for 2.4.x differences
  */
 
 #include <linux/sched.h>
 #include <linux/fs.h>
 #include <linux/fcntl.h>
+#include <linux/slab.h>
 #include <linux/kernel.h>
 #include <linux/interrupt.h>
 #include <linux/timer.h>
@@ -135,16 +140,15 @@
 #include <linux/mm.h>
 
 #include <asm/arch/oldlatches.h>
-#include <asm/system.h>
 #include <asm/bitops.h>
 #include <asm/dma.h>
 #include <asm/hardware.h>
+#include <asm/hardware/ioc.h>
 #include <asm/io.h>
-#include <asm/ioc.h>
 #include <asm/irq.h>
 #include <asm/mach-types.h>
 #include <asm/pgtable.h>
-#include <asm/segment.h>
+#include <asm/system.h>
 #include <asm/uaccess.h>
 
 
@@ -242,7 +246,7 @@
 	outb(val, (reg / 2) + FDC1772BASE);
 };
 
-#define	MAX_SECTORS	22
+#define	FD1772_MAX_SECTORS	22
 
 unsigned char *DMABuffer;	/* buffer for writes */
 /*static unsigned long PhysDMABuffer; *//* physical address */
@@ -276,6 +280,7 @@
 static volatile int fdc_busy = 0;
 static DECLARE_WAIT_QUEUE_HEAD(fdc_wait);
 
+
 /* long req'd for set_bit --RR */
 static unsigned long changed_floppies = 0xff, fake_change = 0;
 #define	CHECK_CHANGE_DELAY	HZ/2
@@ -287,31 +292,29 @@
 #define FLOPPY_TIMEOUT		(6*HZ)
 #define RECALIBRATE_ERRORS	4	/* After this many errors the drive
 					 * will be recalibrated. */
-#define MAX_ERRORS			8	/* After this many errors the driver
-						 * will give up. */
-
-static struct timer_list fd_timer;
+#define MAX_ERRORS		8	/* After this many errors the driver
+					 * will give up. */
 
-#define	START_MOTOR_OFF_TIMER(delay)			\
-    do {						\
-        motor_off_timer.expires = jiffies + (delay);		\
-        add_timer( &motor_off_timer );			\
-        MotorOffTrys = 0;				\
+#define	START_MOTOR_OFF_TIMER(delay)				\
+	do {							\
+		motor_off_timer.expires = jiffies + (delay);	\
+		add_timer( &motor_off_timer );			\
+		MotorOffTrys = 0;				\
 	} while(0)
 
 #define	START_CHECK_CHANGE_TIMER(delay)				\
-    do {							\
-        mod_timer(&fd_timer, jiffies + (delay));		\
+	do {							\
+	        mod_timer(&fd_timer, jiffies + (delay));	\
 	} while(0)
 
-#define	START_TIMEOUT()					     \
-    do {						     \
-        mod_timer(&timeout_timer, jiffies+FLOPPY_TIMEOUT); \
+#define	START_TIMEOUT()						\
+	do {							\
+		mod_timer(&timeout_timer, jiffies+FLOPPY_TIMEOUT); \
 	} while(0)
 
-#define	STOP_TIMEOUT()					\
-    do {						\
-        del_timer( &timeout_timer );			\
+#define	STOP_TIMEOUT()						\
+	do {							\
+		del_timer( &timeout_timer );			\
 	} while(0)
 
 #define ENABLE_IRQ() enable_irq(FIQ_FD1772+64);
@@ -369,18 +372,27 @@
 static int fd_test_drive_present(int drive);
 static void config_types(void);
 static int floppy_open(struct inode *inode, struct file *filp);
-static void floppy_release(struct inode *inode, struct file *filp);
+static int floppy_release(struct inode *inode, struct file *filp);
 
 /************************* End of Prototypes **************************/
 
-static struct timer_list motor_off_timer =
-{NULL, NULL, 0, 0, fd_motor_off_timer};
+static struct timer_list motor_off_timer = {
+	function:	fd_motor_off_timer,
+};
+
 #ifdef TRACKBUFFER
-static struct timer_list readtrack_timer =
-             { NULL, NULL, 0, 0, fd_readtrack_check };
+static struct timer_list readtrack_timer = {
+	function: 	fd_readtrack_check,
+};
 #endif
-static struct timer_list timeout_timer =
-{NULL, NULL, 0, 0, fd_times_out};
+
+static struct timer_list timeout_timer = {
+	function:	fd_times_out,
+};
+
+static struct timer_list fd_timer = {
+	function:	check_change,
+};
 
 /* DAG: Haven't got a clue what this is? */
 int stdma_islocked(void)
@@ -392,13 +404,7 @@
 
 static void fd_select_side(int side)
 {
-	unsigned long flags;
-
-	save_flags(flags);
-	cli();
-
 	oldlatch_aupdate(LATCHA_SIDESEL, side ? 0 : LATCHA_SIDESEL);
-	restore_flags(flags);
 }
 
 
@@ -407,8 +413,6 @@
 
 static void fd_select_drive(int drive)
 {
-	unsigned long flags;
-
 #ifdef DEBUG
 	printk("fd_select_drive:%d\n", drive);
 #endif
@@ -418,10 +422,7 @@
 	if (drive == SelectedDrive)
 		return;
 
-	save_flags(flags);
-	cli();
 	oldlatch_aupdate(LATCHA_FDSELALL, 0xf - (1 << drive));
-	restore_flags(flags);
 
 	/* restore track register to saved value */
 	FDC1772_WRITE(FDC1772REG_TRACK, unit[drive].track);
@@ -439,10 +440,7 @@
 
 	DPRINT(("fd_deselect\n"));
 
-	save_flags(flags);
-	cli();
 	oldlatch_aupdate(LATCHA_FDSELALL | LATCHA_MOTOR | LATCHA_INUSE, 0xf | LATCHA_MOTOR | LATCHA_INUSE);
-	restore_flags(flags);
 
 	SelectedDrive = -1;
 }
@@ -474,9 +472,12 @@
 	status = FDC1772_READ(FDC1772REG_STATUS);
 
 	if (!(status & 0x80)) {
-		/* motor already turned off by FDC1772 -> deselect drives */
-     /* In actual fact its this deselection which turns the motor off on the
-        Arc, since the motor control is actually on Latch A */
+		/*
+		 * motor already turned off by FDC1772 -> deselect drives
+		 * In actual fact its this deselection which turns the motor
+		 * off on the Arc, since the motor control is actually on
+		 * Latch A
+		 */
 		DPRINT(("fdc1772: deselecting in fd_motor_off_timer\n"));
 		fd_deselect();
 		MotorOn = 0;
@@ -485,7 +486,7 @@
 	}
 	/* not yet off, try again */
 
-      retry:
+retry:
 	restore_flags(flags);
 	/* Test again later; if tested too often, it seems there is no disk
 	 * in the drive and the FDC1772 will leave the motor on forever (or,
@@ -623,31 +624,29 @@
 	DPRINT(("do_fd_action unit[drive].track=%d\n", unit[drive].track));
 
 #ifdef TRACKBUFFER
-  repeat:
+repeat:
 
-  if (IS_BUFFERED( drive, ReqSide, ReqTrack )) {
-    if (ReqCmd == READ) {
-      copy_buffer( SECTOR_BUFFER(ReqSector), ReqData );
-      if (++ReqCnt < CURRENT->current_nr_sectors) {
-        /* read next sector */
-        setup_req_params( drive );
-        goto repeat;
-      }
-      else {
-        /* all sectors finished */
-        CURRENT->nr_sectors -= CURRENT->current_nr_sectors;
-        CURRENT->sector += CURRENT->current_nr_sectors;
-        end_request( 1 );
-        redo_fd_request();
-        return;
-      }
-    }
-    else {
-      /* cmd == WRITE, pay attention to track buffer
-       * consistency! */
-      copy_buffer( ReqData, SECTOR_BUFFER(ReqSector) );
-    }
-  }
+	if (IS_BUFFERED( drive, ReqSide, ReqTrack )) {
+		if (ReqCmd == READ) {
+			copy_buffer( SECTOR_BUFFER(ReqSector), ReqData );
+			if (++ReqCnt < CURRENT->current_nr_sectors) {
+				/* read next sector */
+				setup_req_params( drive );
+				goto repeat;
+			} else {
+				/* all sectors finished */
+				CURRENT->nr_sectors -= CURRENT->current_nr_sectors;
+				CURRENT->sector += CURRENT->current_nr_sectors;
+				end_request( 1 );
+				redo_fd_request();
+				return;
+			}
+		} else {
+			/* cmd == WRITE, pay attention to track buffer
+			 * consistency! */
+			copy_buffer( ReqData, SECTOR_BUFFER(ReqSector) );
+		}
+	}
 #endif
 
 	if (SelectedDrive != drive) {
@@ -708,7 +707,7 @@
 
 static void fd_seek(void)
 {
-  unsigned long flags;
+	unsigned long flags;
 	DPRINT(("fd_seek() to track %d (unit[SelectedDrive].track=%d)\n", ReqTrack,
 		unit[SelectedDrive].track));
 	if (unit[SelectedDrive].track == ReqTrack <<
@@ -719,14 +718,14 @@
 	FDC1772_WRITE(FDC1772REG_DATA, ReqTrack <<
 		      unit[SelectedDrive].disktype->stretch);
 	udelay(25);
-  save_flags(flags);
-  cliIF();
+	save_flags(flags);
+	clf();
 	SET_IRQ_HANDLER(fd_seek_done);
 	FDC1772_WRITE(FDC1772REG_CMD, FDC1772CMD_SEEK | unit[SelectedDrive].steprate |
 		/* DAG */
 		(MotorOn?FDC1772CMDADD_H:0));
 
-  restore_flags(flags);
+	restore_flags(flags);
 	MotorOn = 1;
 	set_head_settle_flag();
 	START_TIMEOUT();
@@ -776,13 +775,10 @@
 		paddr = (unsigned long) ReqData;
 		rwflag = 0x100;
 	} else {
+		paddr = (unsigned long) PhysDMABuffer;
 #ifdef TRACKBUFFER
-    if (read_track)
-      paddr = (unsigned long)PhysTrackBuffer;
-    else
-      paddr =(unsigned long)PhysDMABuffer;
-#else
-    paddr = (unsigned long)PhysDMABuffer;
+		if (read_track)
+			paddr = (unsigned long)PhysTrackBuffer;
 #endif
 		rwflag = 0;
 	}
@@ -794,9 +790,9 @@
 	/*DPRINT(("fd_rwsec() before start sector \n")); */
 	/* Start sector of this operation */
 #ifdef TRACKBUFFER
-  FDC1772_WRITE( FDC1772REG_SECTOR, !read_track ? ReqSector : 1 );
+	FDC1772_WRITE( FDC1772REG_SECTOR, !read_track ? ReqSector : 1 );
 #else
-  FDC1772_WRITE( FDC1772REG_SECTOR, ReqSector );
+	FDC1772_WRITE( FDC1772REG_SECTOR, ReqSector );
 #endif
 
 	/* Cheat for track if stretch != 0 */
@@ -810,12 +806,12 @@
 	DPRINT(("fd_rwsec() before setup DMA \n"));
 	/* Setup DMA - Heavily modified by DAG */
 	save_flags(flags);
-	cliIF();
+	clf();
 	disable_dma(FLOPPY_DMA);
 	set_dma_mode(FLOPPY_DMA, rwflag ? DMA_MODE_WRITE : DMA_MODE_READ);
 	set_dma_addr(FLOPPY_DMA, (long) paddr);		/* DAG - changed from Atari specific */
 #ifdef TRACKBUFFER
-  set_dma_count(FLOPPY_DMA,(!read_track ? 1 : unit[SelectedDrive].disktype->spt)*512);
+	set_dma_count(FLOPPY_DMA,(!read_track ? 1 : unit[SelectedDrive].disktype->spt)*512);
 #else
 	set_dma_count(FLOPPY_DMA, 512);		/* Block/sector size - going to have to change */
 #endif
@@ -825,14 +821,14 @@
 	/* Now give it something to do */
 	FDC1772_WRITE(FDC1772REG_CMD, (rwflag ? (FDC1772CMD_WRSEC | FDC1772CMDADD_P) : 
 #ifdef TRACKBUFFER
-              (FDC1772CMD_RDSEC | (read_track ? FDC1772CMDADD_M : 0) |
+	      (FDC1772CMD_RDSEC | (read_track ? FDC1772CMDADD_M : 0) |
 	      /* Hmm - the idea here is to stop the FDC spinning the disc
 	      up when we know that we already still have it spinning */
 	      (MotorOn?FDC1772CMDADD_H:0))
 #else
-              FDC1772CMD_RDSEC
+	      FDC1772CMD_RDSEC
 #endif
-    ));
+		));
 
 	restore_flags(flags);
 	DPRINT(("fd_rwsec() after DMA setup flags=0x%08x\n", flags));
@@ -845,20 +841,19 @@
 	/* wait for interrupt */
 
 #ifdef TRACKBUFFER
-  if (read_track) {
-    /* If reading a whole track, wait about one disk rotation and
-     * then check if all sectors are read. The FDC will even
-     * search for the first non-existant sector and need 1 sec to
-     * recognise that it isn't present :-(
-     */
-    del_timer( &readtrack_timer );
-    readtrack_timer.function = fd_readtrack_check;
-    readtrack_timer.expires = jiffies + HZ/5 + (old_motoron ? 0 : HZ);
-                              /* 1 rot. + 5 rot.s if motor was off  */
-    DPRINT(("Setting readtrack_timer to %d @ %d\n",readtrack_timer.expires,jiffies));
-    add_timer( &readtrack_timer );
-    MultReadInProgress = 1;
- }
+	if (read_track) {
+		/*
+		 * If reading a whole track, wait about one disk rotation and
+		 * then check if all sectors are read. The FDC will even
+		 * search for the first non-existant sector and need 1 sec to
+		 * recognise that it isn't present :-(
+		 */
+		/* 1 rot. + 5 rot.s if motor was off  */
+		mod_timer(&readtrack_timer, jiffies + HZ/5 + (old_motoron ? 0 : HZ));
+		DPRINT(("Setting readtrack_timer to %d @ %d\n",
+			readtrack_timer.expires,jiffies));
+		MultReadInProgress = 1;
+	}
 #endif
 
 	/*DPRINT(("fd_rwsec() before START_TIMEOUT \n")); */
@@ -869,55 +864,54 @@
 
 #ifdef TRACKBUFFER
 
-static void fd_readtrack_check( unsigned long dummy )
+static void fd_readtrack_check(unsigned long dummy)
+{
+	unsigned long flags, addr;
+	extern unsigned char *fdc1772_dataaddr;
+
+	DPRINT(("fd_readtrack_check @ %d\n",jiffies));
+
+	save_flags(flags);
+	clf();
 
-{ unsigned long flags, addr;
-  extern unsigned char *fdc1772_dataaddr;
+	del_timer( &readtrack_timer );
+
+	if (!MultReadInProgress) {
+		/* This prevents a race condition that could arise if the
+		 * interrupt is triggered while the calling of this timer
+		 * callback function takes place. The IRQ function then has
+		 * already cleared 'MultReadInProgress'  when control flow
+		 * gets here.
+		 */
+		restore_flags(flags);
+		return;
+	}
 
-  DPRINT(("fd_readtrack_check @ %d\n",jiffies));
+	/* get the current DMA address */
+	addr=(unsigned long)fdc1772_dataaddr; /* DAG - ? */
+	DPRINT(("fd_readtrack_check: addr=%x PhysTrackBuffer=%x\n",addr,PhysTrackBuffer));
+
+	if (addr >= (unsigned int)PhysTrackBuffer + unit[SelectedDrive].disktype->spt*512) {
+		/* already read enough data, force an FDC interrupt to stop
+		 * the read operation
+		 */
+		SET_IRQ_HANDLER( NULL );
+		restore_flags(flags);
+		DPRINT(("fd_readtrack_check(): done\n"));
+		FDC1772_WRITE( FDC1772REG_CMD, FDC1772CMD_FORCI );
+		udelay(25);
 
-  save_flags(flags);
-  cliIF();
-
-  del_timer( &readtrack_timer );
-
-  if (!MultReadInProgress) {
-    /* This prevents a race condition that could arise if the
-     * interrupt is triggered while the calling of this timer
-     * callback function takes place. The IRQ function then has
-     * already cleared 'MultReadInProgress'  when control flow
-     * gets here.
-     */
-        restore_flags(flags);
-    return;
-  }
-
-  /* get the current DMA address */
-  addr=fdc1772_dataaddr; /* DAG - ? */
-  DPRINT(("fd_readtrack_check: addr=%x PhysTrackBuffer=%x\n",addr,PhysTrackBuffer));
-
-  if (addr >= PhysTrackBuffer + unit[SelectedDrive].disktype->spt*512) {
-    /* already read enough data, force an FDC interrupt to stop
-     * the read operation
-     */
-    SET_IRQ_HANDLER( NULL );
-    restore_flags(flags);
-    DPRINT(("fd_readtrack_check(): done\n"));
-    FDC1772_WRITE( FDC1772REG_CMD, FDC1772CMD_FORCI );
-    udelay(25);
-
-    /* No error until now -- the FDC would have interrupted
-     * otherwise!
-     */
-    fd_rwsec_done( 0 );
-  }
-  else {
-    /* not yet finished, wait another tenth rotation */
-    restore_flags(flags);
-    DPRINT(("fd_readtrack_check(): not yet finished\n"));
-    readtrack_timer.expires = jiffies + HZ/5/10;
-    add_timer( &readtrack_timer );
-  }
+		/* No error until now -- the FDC would have interrupted
+		 * otherwise!
+		 */
+		fd_rwsec_done( 0 );
+	} else {
+		/* not yet finished, wait another tenth rotation */
+		restore_flags(flags);
+		DPRINT(("fd_readtrack_check(): not yet finished\n"));
+		readtrack_timer.expires = jiffies + HZ/5/10;
+		add_timer( &readtrack_timer );
+	}
 }
 
 #endif
@@ -929,13 +923,15 @@
 	DPRINT(("fd_rwsec_done() status=%d @ %d\n", status,jiffies));
 
 #ifdef TRACKBUFFER
-  if (read_track && !MultReadInProgress) return;
-  MultReadInProgress = 0;
+	if (read_track && !MultReadInProgress)
+		return;
+
+	MultReadInProgress = 0;
 
-  STOP_TIMEOUT();
+	STOP_TIMEOUT();
 
-  if (read_track)
-    del_timer( &readtrack_timer );
+	if (read_track)
+		del_timer( &readtrack_timer );
 #endif
 
 
@@ -951,13 +947,13 @@
 	}
 	if ((status & FDC1772STAT_RECNF)
 #ifdef TRACKBUFFER
-    /* RECNF is no error after a multiple read when the FDC
-     * searched for a non-existant sector!
-     */
-    && !(read_track &&
-       FDC1772_READ(FDC1772REG_SECTOR) > unit[SelectedDrive].disktype->spt)
+	    /* RECNF is no error after a multiple read when the FDC
+	     * searched for a non-existant sector!
+	     */
+	    && !(read_track &&
+	       FDC1772_READ(FDC1772REG_SECTOR) > unit[SelectedDrive].disktype->spt)
 #endif
-    ) {
+	    ) {
 		if (Probing) {
 			if (unit[SelectedDrive].disktype > disk_type) {
 				/* try another disk type */
@@ -978,7 +974,7 @@
 		if (Probing) {
 			setup_req_params(SelectedDrive);
 #ifdef TRACKBUFFER
-      BufferDrive = -1;
+			BufferDrive = -1;
 #endif
 			do_fd_action(SelectedDrive);
 			return;
@@ -1001,19 +997,16 @@
 
 	if (ReqCmd == READ) {
 #ifdef TRACKBUFFER
-    if (!read_track)
-      {
-        /*cache_clear (PhysDMABuffer, 512);*/
-        copy_buffer (DMABuffer, ReqData);
-      }
-    else
-      {
-        /*cache_clear (PhysTrackBuffer, MAX_SECTORS * 512);*/
-        BufferDrive = SelectedDrive;
-        BufferSide  = ReqSide;
-        BufferTrack = ReqTrack;
-        copy_buffer (SECTOR_BUFFER (ReqSector), ReqData);
-      }
+		if (!read_track) {
+			/*cache_clear (PhysDMABuffer, 512);*/
+			copy_buffer (DMABuffer, ReqData);
+		} else {
+			/*cache_clear (PhysTrackBuffer, FD1772_MAX_SECTORS * 512);*/
+			BufferDrive = SelectedDrive;
+			BufferSide  = ReqSide;
+			BufferTrack = ReqTrack;
+			copy_buffer (SECTOR_BUFFER (ReqSector), ReqData);
+		}
 #else
 		/*cache_clear( PhysDMABuffer, 512 ); */
 		copy_buffer(DMABuffer, ReqData);
@@ -1032,9 +1025,9 @@
 	}
 	return;
 
-  err_end:
+err_end:
 #ifdef TRACKBUFFER
-  BufferDrive = -1;
+	BufferDrive = -1;
 #endif
 
 	fd_error();
@@ -1118,10 +1111,8 @@
 
 
 /* Prevent "aliased" accesses. */
-static fd_ref[4] =
-{0, 0, 0, 0};
-static fd_device[4] =
-{0, 0, 0, 0};
+static int fd_ref[4];
+static int fd_device[4];
 
 /*
  * Current device number. Taken either from the block header or from the
@@ -1182,7 +1173,7 @@
 	if (test_bit(drive, &changed_floppies) || test_bit(drive, &fake_change)
 	    || unit[drive].disktype == 0) {
 #ifdef TRACKBUFFER
-      BufferDrive = -1;
+		BufferDrive = -1;
 #endif
 		clear_bit(drive, &fake_change);
 		clear_bit(drive, &changed_floppies);
@@ -1214,7 +1205,7 @@
 	ReqData = ReqBuffer + 512 * ReqCnt;
 
 #ifdef TRACKBUFFER
-  read_track = (ReqCmd == READ && CURRENT_ERRORS == 0);
+	read_track = (ReqCmd == READ && CURRENT_ERRORS == 0);
 #endif
 
 	DPRINT(("Request params: Si=%d Tr=%d Se=%d Data=%08lx\n", ReqSide,
@@ -1234,7 +1225,7 @@
 	if (!QUEUE_EMPTY && CURRENT->rq_status == RQ_INACTIVE)
 		goto the_end;
 
-      repeat:
+repeat:
 
 	if (QUEUE_EMPTY)
 		goto the_end;
@@ -1293,25 +1284,25 @@
 
 	return;
 
-      the_end:
+the_end:
 	finish_fdc();
 }
 
 static void fd1772_checkint(void)
 {
-  extern int fdc1772_bytestogo;
+	extern int fdc1772_bytestogo;
 
-  /*printk("fd1772_checkint %d\n",fdc1772_fdc_int_done);*/
-  if (fdc1772_fdc_int_done)
-    floppy_irqconsequencehandler();
-  if ((MultReadInProgress) && (fdc1772_bytestogo==0)) fd_readtrack_check(0);
-  if (fdc_busy) {
-    queue_task(&fd1772_tq,&tq_immediate);
-    mark_bh(IMMEDIATE_BH);
-  };
-};
+	/*printk("fd1772_checkint %d\n",fdc1772_fdc_int_done);*/
+	if (fdc1772_fdc_int_done)
+		floppy_irqconsequencehandler();
+	if ((MultReadInProgress) && (fdc1772_bytestogo==0)) fd_readtrack_check(0);
+	if (fdc_busy) {
+		queue_task(&fd1772_tq,&tq_immediate);
+		mark_bh(IMMEDIATE_BH);
+	}
+}
 
-void do_fd_request(void)
+void do_fd_request(request_queue_t* q)
 {
 	unsigned long flags;
 
@@ -1329,8 +1320,8 @@
 
 	redo_fd_request();
 
-  queue_task(&fd1772_tq,&tq_immediate);
-  mark_bh(IMMEDIATE_BH);
+	queue_task(&fd1772_tq,&tq_immediate);
+	mark_bh(IMMEDIATE_BH);
 }
 
 
@@ -1338,7 +1329,7 @@
 {
 	/* invalidate the buffer track to force a reread */
 #ifdef TRACKBUFFER
-  BufferDrive = -1;
+	BufferDrive = -1;
 #endif
 
 	set_bit(rdev & 3, &fake_change);
@@ -1352,9 +1343,6 @@
 	int drive, device;
 
 	device = inode->i_rdev;
-	switch (cmd) {
-		RO_IOCTLS(inode->i_rdev, param);
-	}
 	drive = MINOR(device);
 	switch (cmd) {
 	case FDFMTBEG:
@@ -1428,7 +1416,7 @@
 		/*  if (!(mfp.par_dt_reg & 0x20))
 		   break; */
 		/* Well this is my nearest guess - quit when we get an FDC interrupt */
-		if (IOC_FIQSTAT & 2)
+		if (ioc_readb(IOC_FIQSTAT) & 2)
 			break;
 	}
 
@@ -1451,7 +1439,7 @@
 		FDC1772_WRITE(FDC1772REG_CMD, FDC1772CMD_SEEK);
 		printk("fd_test_drive_present: just before wait for int\n");
 		/* DAG: Guess means wait for interrupt */
-		while (!(IOC_FIQSTAT & 2));
+		while (!(ioc_readb(IOC_FIQSTAT) & 2));
 		printk("fd_test_drive_present: just after wait for int\n");
 		status = FDC1772_READ(FDC1772REG_STATUS);
 	}
@@ -1553,7 +1541,7 @@
 }
 
 
-static void floppy_release(struct inode *inode, struct file *filp)
+static int floppy_release(struct inode *inode, struct file *filp)
 {
 	int drive = MINOR(inode->i_rdev) & 3;
 
@@ -1563,11 +1551,12 @@
 		printk("floppy_release with fd_ref == 0");
 		fd_ref[drive] = 0;
 	}
+
+	return 0;
 }
 
 static struct block_device_operations floppy_fops =
 {
-	owner:			THIS_MODULE,
 	open:			floppy_open,
 	release:		floppy_release,
 	ioctl:			fd_ioctl,
@@ -1580,7 +1569,7 @@
 {
 	int i;
 
-	if (!machine_is_arc())
+	if (!machine_is_archimedes())
 		return 0;
 
 	if (register_blkdev(MAJOR_NR, "fd", &floppy_fops)) {
@@ -1603,25 +1592,15 @@
 	/* initialize variables */
 	SelectedDrive = -1;
 #ifdef TRACKBUFFER
-  BufferDrive = -1;
-#endif
-
-	/* initialize check_change timer */
-	init_timer(&fd_timer);
-	fd_timer.function = check_change;
-}
-
-#ifdef TRACKBUFFER
-  DMABuffer = (char *)kmalloc((MAX_SECTORS+1)*512,GFP_KERNEL); /* Atari uses 512 - I want to eventually cope with 1K sectors */
-  TrackBuffer = DMABuffer + 512;
+	BufferDrive = BufferSide = BufferTrack = -1;
+	/* Atari uses 512 - I want to eventually cope with 1K sectors */
+	DMABuffer = (char *)kmalloc((FD1772_MAX_SECTORS+1)*512,GFP_KERNEL);
+	TrackBuffer = DMABuffer + 512;
 #else
 	/* Allocate memory for the DMAbuffer - on the Atari this takes it
 	   out of some special memory... */
 	DMABuffer = (char *) kmalloc(2048);	/* Copes with pretty large sectors */
 #endif
-#ifdef TRACKBUFFER  
-  BufferDrive = BufferSide = BufferTrack = -1;
-#endif
 
 	for (i = 0; i < FD_MAX_UNITS; i++) {
 		unit[i].track = -1;
@@ -1635,17 +1614,13 @@
 
 	blk_size[MAJOR_NR] = floppy_sizes;
 	blksize_size[MAJOR_NR] = floppy_blocksizes;
-	blk_dev[MAJOR_NR].request_fn = DEVICE_REQUEST;
+	blk_init_queue(BLK_DEFAULT_QUEUE(MAJOR_NR), DEVICE_REQUEST);
 
 	config_types();
 
 	return 0;
 }
 
-/* Just a dummy at the moment */
-void floppy_setup(char *str, int *ints)
+void floppy_eject(void)
 {
-}
-
-void floppy_eject(void) {
 }
diff -u --recursive --new-file v2.4.8/linux/drivers/acorn/block/mfmhd.c linux/drivers/acorn/block/mfmhd.c
--- v2.4.8/linux/drivers/acorn/block/mfmhd.c	Sat Apr 28 11:27:53 2001
+++ linux/drivers/acorn/block/mfmhd.c	Sun Aug 12 10:38:48 2001
@@ -560,7 +560,7 @@
 		};
 	};			/* Result read */
 
-	/*console_printf ("mfm_rw_intr nearexit [%02X]\n", inb(mfm_IRQPollLoc)); */
+	/*console_printf ("mfm_rw_intr nearexit [%02X]\n", __raw_readb(mfm_IRQPollLoc)); */
 
 	/* If end of command move on */
 	if (mfm_status & (STAT_CED)) {
@@ -1425,7 +1425,7 @@
 		}
 
 		mfm_addr	= ecard_address(ecs, ECARD_IOC, ECARD_MEDIUM) + 0x800;
-		mfm_IRQPollLoc	= mfm_addr + 0x400;
+		mfm_IRQPollLoc	= ioaddr(mfm_addr + 0x400);
 		mfm_irqenable	= mfm_IRQPollLoc;
 		mfm_irq		= ecs->irq;
 		irqmask		= 0x08;
@@ -1444,7 +1444,7 @@
 
 	/* Stuff for the assembler routines to get to */
 	hdc63463_baseaddress	= ioaddr(mfm_addr);
-	hdc63463_irqpolladdress	= ioaddr(mfm_IRQPollLoc);
+	hdc63463_irqpolladdress	= mfm_IRQPollLoc;
 	hdc63463_irqpollmask	= irqmask;
 
 	blk_init_queue(BLK_DEFAULT_QUEUE(MAJOR_NR), DEVICE_REQUEST);
diff -u --recursive --new-file v2.4.8/linux/drivers/acorn/char/Makefile linux/drivers/acorn/char/Makefile
--- v2.4.8/linux/drivers/acorn/char/Makefile	Thu Feb  8 16:32:44 2001
+++ linux/drivers/acorn/char/Makefile	Sun Aug 12 10:38:48 2001
@@ -29,8 +29,12 @@
 obj-$(CONFIG_ATOMWIDE_SERIAL)	+= serial-atomwide.o
 obj-$(CONFIG_DUALSP_SERIAL)	+= serial-dualsp.o
 obj-$(CONFIG_ARCH_ACORN)	+= defkeymap-acorn.o i2c.o pcf8583.o
+obj-$(CONFIG_L7200_KEYB)	+= defkeymap-l7200.o keyb_l7200.o
 
 # Do the i2c and rtc last
-obj-y		+= $(obj-$(MACHINE)) 
+obj-y		+= $(obj-$(MACHINE))
 
 include $(TOPDIR)/Rules.make
+
+%.c: %.map
+	loadkeys --mktable $< > $@
diff -u --recursive --new-file v2.4.8/linux/drivers/acorn/char/defkeymap-acorn.c linux/drivers/acorn/char/defkeymap-acorn.c
--- v2.4.8/linux/drivers/acorn/char/defkeymap-acorn.c	Mon Oct 16 12:58:51 2000
+++ linux/drivers/acorn/char/defkeymap-acorn.c	Sun Aug 12 10:38:48 2001
@@ -1,240 +1,141 @@
-/*
- *  linux/drivers/acorn/char/defkeymap.c
- *
- *  Copyright (C) 1995, 1996 Russell King
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
+/* Do not edit this file! It was automatically generated by   */
+/*    loadkeys --mktable defkeymap.map > defkeymap.c          */
+
 #include <linux/types.h>
 #include <linux/keyboard.h>
 #include <linux/kd.h>
 
-/* Normal (maps 1:1 with no processing) */
-#define KTn	0xF0
-/* Function keys */
-#define KTf	0xF1
-/* Special (Performs special house-keeping funcs) */
-#define KTs	0xF2
-#define KIGNORE		K(KTs, 0)	/* Ignore */
-#define KENTER		K(KTs, 1)	/* Enter */
-#define KREGS		K(KTs, 2)	/* Regs */
-#define KMEM		K(KTs, 3)	/* Mem */
-#define KSTAT		K(KTs, 4)	/* State */
-#define KINTR		K(KTs, 5)	/* Intr */
-#define Ksl	6	/* Last console */
-#define KCAPSLK		K(KTs, 7)	/* Caps lock */
-#define KNUMLK		K(KTs, 8)	/* Num-lock */
-#define KSCRLLK		K(KTs, 9)	/* Scroll-lock */
-#define KSCRLFOR	K(KTs,10)	/* Scroll forward */
-#define KSCRLBAK	K(KTs,11)	/* Scroll back */
-#define KREBOOT		K(KTs,12)	/* Reboot */
-#define KCAPSON		K(KTs,13)	/* Caps on */
-#define KCOMPOSE	K(KTs,14)	/* Compose */
-#define KSAK		K(KTs,15)	/* SAK */
-#define CONS_DEC	K(KTs,16)	/* Dec console */
-#define CONS_INC	K(KTs,17)	/* Incr console */
-#define KFLOPPY		K(KTs,18)	/* Floppy */
-/* Key pad (0-9 = digits, 10=+, 11=-, 12=*, 13=/, 14=enter, 16=., 17=# */
-#define KTp	0xF3
-#define KPAD_0		K(KTp, 0 )
-#define KPAD_1  	K(KTp, 1 )
-#define KPAD_2		K(KTp, 2 )
-#define KPAD_3		K(KTp, 3 )
-#define KPAD_4		K(KTp, 4 )
-#define KPAD_5		K(KTp, 5 )
-#define KPAD_6		K(KTp, 6 )
-#define KPAD_7		K(KTp, 7 )
-#define KPAD_8		K(KTp, 8 )
-#define KPAD_9		K(KTp, 9 )
-#define KPAD_PL		K(KTp,10 )
-#define KPAD_MI		K(KTp,11 )
-#define KPAD_ML		K(KTp,12 )
-#define KPAD_DV		K(KTp,13 )
-#define KPAD_EN		K(KTp,14 )
-#define KPAD_DT		K(KTp,16 )
-#define KPAD_HS		K(KTp,20 )
-/* Console switching */
-#define KCn	0xF5
-/* Cursor */
-#define KTc	0xF6
-#define Kcd	0	/* Cursor down */
-#define Kcl	1	/* Cursor left */
-#define Kcr	2	/* Cursor right */
-#define Kcu	3	/* Cursor up */
-/* Shift/alt modifiers etc */
-#define KMd	0xF7
-#define KSHIFT		K(KMd, 0 )
-#define KALTGR		K(KMd, 1 )
-#define KCTRL		K(KMd, 2 )
-#define KALT		K(KMd, 3 )
-/* Meta */
-#define KMt	0xF8
-#define KAs	0xF9
-#define KPADA_0		K(KAs, 0 )
-#define KPADA_1		K(KAs, 1 )
-#define KPADA_2		K(KAs, 2 )
-#define KPADA_3		K(KAs, 3 )
-#define KPADA_4		K(KAs, 4 )
-#define KPADA_5		K(KAs, 5 )
-#define KPADA_6		K(KAs, 6 )
-#define KPADA_7		K(KAs, 7 )
-#define KPADA_8		K(KAs, 8 )
-#define KPADA_9		K(KAs, 9 )
-#define KPADB_0		K(KAs,10 )
-#define KPADB_1		K(KAs,11 )
-#define KPADB_2		K(KAs,12 )
-#define KPADB_3		K(KAs,13 )
-#define KPADB_4		K(KAs,14 )
-#define KPADB_5		K(KAs,15 )
-#define KPADB_6		K(KAs,16 )
-#define KPADB_7		K(KAs,17 )
-#define KPADB_8		K(KAs,18 )
-#define KPADB_9		K(KAs,19 )
-/* Locking keys */
-#define KLk	0xFA
-/* Letters */
-#define KTl	0xFB
-
-u_short plain_map[NR_KEYS]=
-{
-  K(KTn, 27),K(KTf,  0),K(KTf,  1),K(KTf,  2 ),K(KTf,  3),K(KTf,  4),K(KTf,  5 ),K(KTf,  6),
-  K(KTf,  7),K(KTf,  8),K(KTf,  9),K(KTf, 10 ),K(KTf, 11),KIGNORE   ,KSCRLLK    ,KINTR     ,
-  K(KTn,'`'),K(KTn,'1'),K(KTn,'2'),K(KTn,'3' ),K(KTn,'4'),K(KTn,'5'),K(KTn,'6' ),K(KTn,'7'),
-  K(KTn,'8'),K(KTn,'9'),K(KTn,'0'),K(KTn,'-' ),K(KTn,'='),K(KTn,'Ł'),K(KTn,127 ),K(KTf,21 ),
-  K(KTf,20 ),K(KTf,24 ),KNUMLK    ,KPAD_DV    ,KPAD_ML   ,KPAD_HS   ,K(KTn,  9 ),K(KTl,'q'),
-  K(KTl,'w'),K(KTl,'e'),K(KTl,'r'),K(KTl,'t' ),K(KTl,'y'),K(KTl,'u'),K(KTl,'i' ),K(KTl,'o'),
-  K(KTl,'p'),K(KTn,'['),K(KTn,']'),K(KTn,'\\'),K(KTf,22 ),K(KTf,23 ),K(KTf,25  ),KPAD_7    ,
-  KPAD_8    ,KPAD_9    ,KPAD_MI   ,KCTRL      ,K(KTl,'a'),K(KTl,'s'),K(KTl,'d' ),K(KTl,'f'),
-  K(KTl,'g'),K(KTl,'h'),K(KTl,'j'),K(KTl,'k' ),K(KTl,'l'),K(KTn,';'),K(KTn,'\''),KENTER    ,
-  KPAD_4    ,KPAD_5    ,KPAD_6    ,KPAD_PL    ,KSHIFT    ,KIGNORE   ,K(KTl,'z' ),K(KTl,'x'),
-  K(KTl,'c'),K(KTl,'v'),K(KTl,'b'),K(KTl,'n' ),K(KTl,'m'),K(KTn,','),K(KTn,'.' ),K(KTn,'/'),
-  KSHIFT    ,K(KTc,Kcu),KPAD_1    ,KPAD_2     ,KPAD_3    ,KCAPSLK   ,KALT       ,K(KTn,' '),
-  KALTGR    ,KCTRL     ,K(KTc,Kcl),K(KTc,Kcd ),K(KTc,Kcr),KPAD_0    ,KPAD_DT    ,KPAD_EN   ,
-  KIGNORE   ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,
-  KIGNORE   ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,
-  KIGNORE   ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,
-};
-
-u_short shift_map[NR_KEYS]=
-{
-  K(KTn, 27),K(KTf, 10),K(KTf, 11),K(KTf, 12 ),K(KTf, 13),K(KTf, 14),K(KTf, 15 ),K(KTf, 16),
-  K(KTf, 17),K(KTf, 18),K(KTf, 19),K(KTf, 20 ),K(KTf, 21),KIGNORE   ,KMEM       ,KINTR     ,
-  K(KTn,'~'),K(KTn,'!'),K(KTn,'@'),K(KTn,'#' ),K(KTn,'$'),K(KTn,'%'),K(KTn,'^' ),K(KTn,'&'),
-  K(KTn,'*'),K(KTn,'('),K(KTn,')'),K(KTn,'_' ),K(KTn,'+'),K(KTn,'¤'),K(KTn,127 ),K(KTf,21 ),
-  K(KTf,20 ),KSCRLBAK  ,KNUMLK    ,KPAD_DV    ,KPAD_ML   ,KPAD_HS   ,K(KTn,  9 ),K(KTl,'Q'),
-  K(KTl,'W'),K(KTl,'E'),K(KTl,'R'),K(KTl,'T' ),K(KTl,'Y'),K(KTl,'U'),K(KTl,'I' ),K(KTl,'O'),
-  K(KTl,'P'),K(KTn,'{'),K(KTn,'}'),K(KTn,'|' ),K(KTf,22 ),K(KTf,23 ),KSCRLFOR   ,KPAD_7    ,
-  KPAD_8    ,KPAD_9    ,KPAD_MI   ,KCTRL      ,K(KTl,'A'),K(KTl,'S'),K(KTl,'D' ),K(KTl,'F'),
-  K(KTl,'G'),K(KTl,'H'),K(KTl,'J'),K(KTl,'K' ),K(KTl,'L'),K(KTn,':'),K(KTn,'"' ),KENTER    ,
-  KPAD_4    ,KPAD_5    ,KPAD_6    ,KPAD_PL    ,KSHIFT    ,KIGNORE   ,K(KTl,'Z' ),K(KTl,'X'),
-  K(KTl,'C'),K(KTl,'V'),K(KTl,'B'),K(KTl,'N' ),K(KTl,'M'),K(KTn,'<'),K(KTn,'>' ),K(KTn,'?'),
-  KSHIFT    ,K(KTc,Kcu),KPAD_1    ,KPAD_2     ,KPAD_3    ,KCAPSLK   ,KALT       ,K(KTn,' '),
-  KALTGR    ,KCTRL     ,K(KTc,Kcl),K(KTc,Kcd ),K(KTc,Kcr),KPAD_0    ,KPAD_DT    ,KPAD_EN   ,
-  KIGNORE   ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,
-  KIGNORE   ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,
-  KIGNORE   ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,
-};
-
-u_short altgr_map[NR_KEYS]=
-{
-  KIGNORE   ,K(KCn,12 ),K(KCn,13 ),K(KCn,14  ),K(KCn,15 ),K(KCn,16 ),K(KCn,17  ),K(KCn, 18),
-  K(KCn, 19),K(KCn,20 ),K(KCn,21 ),K(KCn,22  ),K(KCn,23 ),KIGNORE   ,KREGS      ,KINTR     ,
-  KIGNORE   ,KIGNORE   ,K(KTn,'@'),KIGNORE    ,K(KTn,'$'),KIGNORE   ,KIGNORE    ,K(KTn,'{'),
-  K(KTn,'['),K(KTn,']'),K(KTn,'}'),K(KTn,'\\'),KIGNORE   ,KIGNORE   ,KIGNORE    ,K(KTf,21 ),
-  K(KTf,20 ),K(KTf,24 ),KNUMLK    ,KPAD_DV    ,KPAD_ML   ,KPAD_HS   ,KIGNORE    ,K(KTl,'q'),
-  K(KTl,'w'),K(KTl,'e'),K(KTl,'r'),K(KTl,'t' ),K(KTl,'y'),K(KTl,'u'),K(KTl,'i' ),K(KTl,'o'),
-  K(KTl,'p'),KIGNORE   ,K(KTn,'~'),KIGNORE    ,K(KTf,22 ),K(KTf,23 ),K(KTf,25  ),KPADB_7   ,
-  KPADB_8   ,KPADB_9   ,KPAD_MI   ,KCTRL      ,K(KAs,20 ),K(KTl,'s'),K(KAs,23  ),K(KAs,25 ),
-  K(KTl,'g'),K(KTl,'h'),K(KTl,'j'),K(KTl,'k' ),K(KTl,'l'),KIGNORE   ,KIGNORE    ,KENTER    ,
-  KPADB_4   ,KPADB_5   ,KPADB_6   ,KPAD_PL    ,KSHIFT    ,KIGNORE   ,K(KTl,'z' ),K(KTl,'x'),
-  K(KAs,22 ),K(KTl,'v'),K(KTl,21 ),K(KTl,'n' ),K(KTl,'m'),KIGNORE   ,KIGNORE    ,KIGNORE   ,
-  KSHIFT    ,K(KTc,Kcu),KPADB_1   ,KPADB_2    ,KPADB_3   ,KCAPSLK   ,KALT       ,KIGNORE   ,
-  KALTGR    ,KCTRL     ,K(KTc,Kcl),K(KTc,Kcd ),K(KTc,Kcr),KPADB_0   ,KPAD_DT    ,KPAD_EN   ,
-  KIGNORE   ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,
-  KIGNORE   ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,
-  KIGNORE   ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,
-};
-
-u_short ctrl_map[NR_KEYS]=
-{
-  KIGNORE   ,K(KTf,  0),K(KTf,  1),K(KTf,  2 ),K(KTf,  3),K(KTf,  4),K(KTf, 5  ),K(KTf,  6),
-  K(KTf,  7),K(KTf,  8),K(KTf,  9),K(KTf, 10 ),K(KTf, 11),KIGNORE   ,KSTAT      ,KINTR     ,
-  KIGNORE   ,K(KTn, 1 ),K(KTn, 2 ),K(KTn, 3  ),K(KTn, 4 ),K(KTn, 5 ),K(KTn, 6  ),K(KTn, 7 ),
-  K(KTn, 8 ),K(KTn, 9 ),K(KTn, 0 ),K(KTn,31  ),KIGNORE   ,KIGNORE   ,K(KTn, 8  ),K(KTf,21 ),
-  K(KTf,20 ),K(KTf,24 ),KNUMLK    ,KPAD_DV    ,KPAD_ML   ,KPAD_HS   ,KIGNORE    ,K(KTn,17 ),
-  K(KTn,23 ),K(KTn, 5 ),K(KTn,18 ),K(KTn,20  ),K(KTn,25 ),K(KTn,21 ),K(KTn, 9  ),K(KTn,15 ),
-  K(KTn,16 ),K(KTn,27 ),K(KTn,29 ),K(KTn,28  ),K(KTf,22 ),K(KTf,23 ),K(KTf,25  ),KPAD_7    ,
-  KPAD_8    ,KPAD_9    ,KPAD_MI   ,KCTRL      ,K(KTn, 1 ),K(KTn,19 ),K(KTn, 4  ),K(KTn, 6 ),
-  K(KTn, 7 ),K(KTn, 8 ),K(KTn,10 ),K(KTn,11  ),K(KTn,12 ),KIGNORE   ,K(KTn, 7  ),KENTER    ,
-  KPAD_4    ,KPAD_5    ,KPAD_6    ,KPAD_PL    ,KSHIFT    ,KIGNORE   ,K(KTn,26  ),K(KTn,24 ),
-  K(KTn, 3 ),K(KTn,22 ),K(KTn, 2 ),K(KTn,14  ),K(KTn,13 ),KIGNORE   ,KCOMPOSE   ,K(KTn,127),
-  KSHIFT    ,K(KTc,Kcu),KPAD_1    ,KPAD_2     ,KPAD_3    ,KCAPSLK   ,KALT       ,K(KTn, 0 ),
-  KALTGR    ,KCTRL     ,K(KTc,Kcl),K(KTc,Kcd ),K(KTc,Kcr),KPAD_0    ,KPAD_DT    ,KPAD_EN   ,
-  KIGNORE   ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,
-  KIGNORE   ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,
-  KIGNORE   ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,
-};
-
-u_short shift_ctrl_map[NR_KEYS]=
-{
-  KIGNORE   ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,
-  KIGNORE   ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,KIGNORE   ,KFLOPPY    ,KINTR     ,
-  KIGNORE   ,KIGNORE   ,K(KTn, 0 ),KIGNORE    ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,
-  KIGNORE   ,KIGNORE   ,KIGNORE   ,K(KTn,31  ),KIGNORE   ,KIGNORE   ,KIGNORE    ,K(KTf,21 ),
-  K(KTf,20 ),K(KTf,24 ),KNUMLK    ,KPAD_DV    ,KPAD_ML   ,KPAD_HS   ,KIGNORE    ,K(KTn,17 ),
-  K(KTn,23 ),K(KTn, 5 ),K(KTn,18 ),K(KTn,20  ),K(KTn,25 ),K(KTn,21 ),K(KTn, 9  ),K(KTn,15 ),
-  K(KTn,16 ),KIGNORE   ,KIGNORE   ,KIGNORE    ,K(KTf,22 ),K(KTf,23 ),K(KTf,25  ),KPAD_7    ,
-  KPAD_8    ,KPAD_9    ,KPAD_MI   ,KCTRL      ,K(KTn, 1 ),K(KTn,19 ),K(KTn, 4  ),K(KTn, 6 ),
-  K(KTn, 7 ),K(KTn, 8 ),K(KTn,10 ),K(KTn,11  ),K(KTn,12 ),KIGNORE   ,K(KTn, 7  ),KENTER    ,
-  KPAD_4    ,KPAD_5    ,KPAD_6    ,KPAD_PL    ,KSHIFT    ,KIGNORE   ,K(KTn,26  ),K(KTn,24 ),
-  K(KTn, 3 ),K(KTn,22 ),K(KTn, 2 ),K(KTn,14  ),K(KTn,13 ),KIGNORE   ,KIGNORE    ,KIGNORE   ,
-  KSHIFT    ,K(KTc,Kcu),KPAD_1    ,KPAD_2     ,KPAD_3    ,KCAPSLK   ,KALT       ,K(KTn, 0 ),
-  KALTGR    ,KCTRL     ,K(KTc,Kcl),K(KTc,Kcd ),K(KTc,Kcr),KPAD_0    ,KPAD_DT    ,KPAD_EN   ,
-  KIGNORE   ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,
-  KIGNORE   ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,
-  KIGNORE   ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,
-};
-
-u_short alt_map[NR_KEYS]=
-{
-  K(KMt,27 ),K(KCn, 0 ),K(KCn, 1 ),K(KCn, 2  ),K(KCn, 3 ),K(KCn, 4 ),K(KCn, 5  ),K(KCn, 6 ),
-  K(KCn, 7 ),K(KCn, 8 ),K(KCn, 9 ),K(KCn,10  ),K(KCn,11 ),KIGNORE   ,KSCRLLK    ,KINTR     ,
-  K(KMt,'`'),K(KMt,'1'),K(KMt,'2'),K(KMt,'3' ),K(KMt,'4'),K(KMt,'5'),K(KMt,'6' ),K(KMt,'7'),
-  K(KMt,'8'),K(KMt,'9'),K(KMt,'0'),K(KMt,'-' ),K(KMt,'='),K(KMt,'Ł'),K(KMt,127 ),K(KTf,21 ),
-  K(KTf,20 ),K(KTf,24 ),KNUMLK    ,KPAD_DV    ,KPAD_ML   ,KPAD_HS   ,K(KMt, 9  ),K(KMt,'q'),
-  K(KMt,'w'),K(KMt,'e'),K(KMt,'r'),K(KMt,'t' ),K(KMt,'y'),K(KMt,'u'),K(KMt,'i' ),K(KMt,'o'),
-  K(KMt,'p'),K(KMt,'['),K(KMt,']'),K(KMt,'\\'),K(KTf,22 ),K(KTf,23 ),K(KTf,25  ),KPADA_7   ,
-  KPADA_8   ,KPADA_9   ,KPAD_MI   ,KCTRL      ,K(KMt,'a'),K(KMt,'s'),K(KMt,'d' ),K(KMt,'f'),
-  K(KMt,'g'),K(KMt,'h'),K(KMt,'j'),K(KMt,'k' ),K(KMt,'l'),K(KMt,';'),K(KMt,'\''),K(KMt,13 ),
-  KPADA_4   ,KPADA_5   ,KPADA_6   ,KPAD_PL    ,KSHIFT    ,KIGNORE   ,K(KMt,'z' ),K(KMt,'x'),
-  K(KMt,'c'),K(KMt,'v'),K(KMt,'b'),K(KMt,'n' ),K(KMt,'m'),K(KMt,','),K(KMt,'.' ),KIGNORE   ,
-  KSHIFT    ,K(KTc,Kcu),KPADA_1   ,KPADA_2    ,KPADA_3   ,KCAPSLK   ,KALT       ,K(KMt,' '),
-  KALTGR    ,KCTRL     ,CONS_DEC  ,K(KTc,Kcd ),CONS_INC  ,KPADA_0   ,KPAD_DT    ,KPAD_EN   ,
-  KIGNORE   ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,
-  KIGNORE   ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,
-  KIGNORE   ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,
-};
-
-u_short ctrl_alt_map[NR_KEYS]=
-{
-  KIGNORE   ,K(KCn, 0 ),K(KCn, 1 ),K(KCn, 2  ),K(KCn, 3 ),K(KCn, 4 ),K(KCn, 5  ),K(KCn, 6 ),
-  K(KCn, 7 ),K(KCn, 8 ),K(KCn, 9 ),K(KCn,10  ),K(KCn,11 ),KIGNORE   ,KIGNORE    ,KINTR     ,
-  KIGNORE   ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,
-  KIGNORE   ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,KIGNORE   ,KIGNORE    ,K(KTf,21 ),
-  K(KTf,20 ),K(KTf,24 ),KNUMLK    ,KPAD_DV    ,KPAD_ML   ,KPAD_HS   ,KIGNORE    ,K(KMt,17 ),
-  K(KMt,23 ),K(KMt, 5 ),K(KMt,18 ),K(KMt,20  ),K(KMt,25 ),K(KMt,21 ),K(KMt, 9  ),K(KMt,15 ),
-  K(KMt,16 ),KIGNORE   ,KIGNORE   ,KIGNORE    ,KREBOOT   ,K(KTf,23 ),K(KTf,25  ),KPAD_7    ,
-  KPAD_8    ,KPAD_9    ,KPAD_MI   ,KCTRL      ,K(KMt, 1 ),K(KMt,19 ),K(KMt, 4  ),K(KMt, 6 ),
-  K(KMt, 7 ),K(KMt, 8 ),K(KMt,10 ),K(KMt,11  ),K(KMt,12 ),KIGNORE   ,KIGNORE    ,KENTER    ,
-  KPAD_4    ,KPAD_5    ,KPAD_6    ,KPAD_PL    ,KSHIFT    ,KIGNORE   ,K(KMt,26  ),K(KMt,24 ),
-  K(KMt, 3 ),K(KMt,22 ),K(KMt, 2 ),K(KMt,14  ),K(KMt,13 ),KIGNORE   ,KIGNORE    ,KIGNORE   ,
-  KSHIFT    ,K(KTc,Kcu),KPAD_1    ,KPAD_2     ,KPAD_3    ,KCAPSLK   ,KALT       ,KIGNORE   ,
-  KALTGR    ,KCTRL     ,K(KTc,Kcl),K(KTc,Kcd ),K(KTc,Kcr),KPAD_0    ,KREBOOT    ,KPAD_EN   ,
-  KIGNORE   ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,
-  KIGNORE   ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,
-  KIGNORE   ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,
+u_short plain_map[NR_KEYS] = {
+	0xf01b,	0xf100,	0xf101,	0xf102,	0xf103,	0xf104,	0xf105,	0xf106,
+	0xf107,	0xf108,	0xf109,	0xf10a,	0xf10b,	0xf200,	0xf209,	0xf205,
+	0xf060,	0xf031,	0xf032,	0xf033,	0xf034,	0xf035,	0xf036,	0xf037,
+	0xf038,	0xf039,	0xf030,	0xf02d,	0xf03d,	0xf0a3,	0xf07f,	0xf115,
+	0xf114,	0xf118,	0xf208,	0xf30d,	0xf30c,	0xf314,	0xf009,	0xfb71,
+	0xfb77,	0xfb65,	0xfb72,	0xfb74,	0xfb79,	0xfb75,	0xfb69,	0xfb6f,
+	0xfb70,	0xf05b,	0xf05d,	0xf05c,	0xf116,	0xf117,	0xf119,	0xf307,
+	0xf308,	0xf309,	0xf30b,	0xf702,	0xfb61,	0xfb73,	0xfb64,	0xfb66,
+	0xfb67,	0xfb68,	0xfb6a,	0xfb6b,	0xfb6c,	0xf03b,	0xf027,	0xf201,
+	0xf304,	0xf305,	0xf306,	0xf30a,	0xf700,	0xf200,	0xfb7a,	0xfb78,
+	0xfb63,	0xfb76,	0xfb62,	0xfb6e,	0xfb6d,	0xf02c,	0xf02e,	0xf02f,
+	0xf700,	0xf603,	0xf301,	0xf302,	0xf303,	0xf207,	0xf703,	0xf020,
+	0xf701,	0xf702,	0xf601,	0xf600,	0xf602,	0xf300,	0xf310,	0xf30e,
+	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,
+	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,
+	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,
+};
+
+u_short shift_map[NR_KEYS] = {
+	0xf01b,	0xf10a,	0xf10b,	0xf10c,	0xf10d,	0xf10e,	0xf10f,	0xf110,
+	0xf111,	0xf112,	0xf113,	0xf10a,	0xf10b,	0xf200,	0xf203,	0xf205,
+	0xf07e,	0xf021,	0xf040,	0xf023,	0xf024,	0xf025,	0xf05e,	0xf026,
+	0xf02a,	0xf028,	0xf029,	0xf05f,	0xf02b,	0xf0a4,	0xf07f,	0xf115,
+	0xf114,	0xf20b,	0xf208,	0xf30d,	0xf30c,	0xf314,	0xf009,	0xfb51,
+	0xfb57,	0xfb45,	0xfb52,	0xfb54,	0xfb59,	0xfb55,	0xfb49,	0xfb4f,
+	0xfb50,	0xf07b,	0xf07d,	0xf07c,	0xf116,	0xf117,	0xf20a,	0xf307,
+	0xf308,	0xf309,	0xf30b,	0xf702,	0xfb41,	0xfb53,	0xfb44,	0xfb46,
+	0xfb47,	0xfb48,	0xfb4a,	0xfb4b,	0xfb4c,	0xf03a,	0xf022,	0xf201,
+	0xf304,	0xf305,	0xf306,	0xf30a,	0xf700,	0xf200,	0xfb5a,	0xfb58,
+	0xfb43,	0xfb56,	0xfb42,	0xfb4e,	0xfb4d,	0xf03c,	0xf03e,	0xf03f,
+	0xf700,	0xf603,	0xf301,	0xf302,	0xf303,	0xf207,	0xf703,	0xf020,
+	0xf701,	0xf702,	0xf601,	0xf600,	0xf602,	0xf300,	0xf310,	0xf30e,
+	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,
+	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,
+	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,
+};
+
+u_short altgr_map[NR_KEYS] = {
+	0xf200,	0xf50c,	0xf50d,	0xf50e,	0xf50f,	0xf510,	0xf511,	0xf512,
+	0xf513,	0xf514,	0xf515,	0xf516,	0xf517,	0xf200,	0xf202,	0xf205,
+	0xf200,	0xf200,	0xf040,	0xf200,	0xf024,	0xf200,	0xf200,	0xf07b,
+	0xf05b,	0xf05d,	0xf07d,	0xf05c,	0xf200,	0xf200,	0xf200,	0xf115,
+	0xf114,	0xf118,	0xf208,	0xf30d,	0xf30c,	0xf314,	0xf200,	0xfb71,
+	0xfb77,	0xf918,	0xfb72,	0xfb74,	0xfb79,	0xfb75,	0xfb69,	0xfb6f,
+	0xfb70,	0xf200,	0xf07e,	0xf200,	0xf116,	0xf117,	0xf119,	0xf911,
+	0xf912,	0xf913,	0xf30b,	0xf702,	0xf914,	0xfb73,	0xf917,	0xf919,
+	0xfb67,	0xfb68,	0xfb6a,	0xfb6b,	0xfb6c,	0xf200,	0xf200,	0xf201,
+	0xf90e,	0xf90f,	0xf910,	0xf30a,	0xf700,	0xf200,	0xfb7a,	0xfb78,
+	0xf916,	0xfb76,	0xf915,	0xfb6e,	0xfb6d,	0xf200,	0xf200,	0xf200,
+	0xf700,	0xf603,	0xf90b,	0xf90c,	0xf90d,	0xf207,	0xf703,	0xf200,
+	0xf701,	0xf702,	0xf601,	0xf600,	0xf602,	0xf90a,	0xf310,	0xf30e,
+	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,
+	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,
+	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,
+};
+
+u_short ctrl_map[NR_KEYS] = {
+	0xf200,	0xf100,	0xf101,	0xf102,	0xf103,	0xf104,	0xf105,	0xf106,
+	0xf107,	0xf108,	0xf109,	0xf10a,	0xf10b,	0xf200,	0xf204,	0xf205,
+	0xf200,	0xf200,	0xf000,	0xf01b,	0xf01c,	0xf01d,	0xf01e,	0xf01f,
+	0xf07f,	0xf200,	0xf200,	0xf01f,	0xf200,	0xf200,	0xf008,	0xf115,
+	0xf114,	0xf118,	0xf208,	0xf30d,	0xf30c,	0xf314,	0xf200,	0xf011,
+	0xf017,	0xf005,	0xf012,	0xf014,	0xf019,	0xf015,	0xf009,	0xf00f,
+	0xf010,	0xf01b,	0xf01d,	0xf01c,	0xf116,	0xf117,	0xf119,	0xf307,
+	0xf308,	0xf309,	0xf30b,	0xf702,	0xf001,	0xf013,	0xf004,	0xf006,
+	0xf007,	0xf008,	0xf00a,	0xf00b,	0xf00c,	0xf200,	0xf007,	0xf201,
+	0xf304,	0xf305,	0xf306,	0xf30a,	0xf700,	0xf200,	0xf01a,	0xf018,
+	0xf003,	0xf016,	0xf002,	0xf00e,	0xf00d,	0xf200,	0xf20e,	0xf07f,
+	0xf700,	0xf603,	0xf301,	0xf302,	0xf303,	0xf207,	0xf703,	0xf000,
+	0xf701,	0xf702,	0xf601,	0xf600,	0xf602,	0xf300,	0xf310,	0xf30e,
+	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,
+	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,
+	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,
+};
+
+u_short shift_ctrl_map[NR_KEYS] = {
+	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,
+	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf209,	0xf205,
+	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,
+	0xf200,	0xf200,	0xf200,	0xf01f,	0xf200,	0xf200,	0xf200,	0xf115,
+	0xf114,	0xf118,	0xf208,	0xf30d,	0xf30c,	0xf314,	0xf200,	0xf011,
+	0xf017,	0xf005,	0xf012,	0xf014,	0xf019,	0xf015,	0xf009,	0xf00f,
+	0xf010,	0xf200,	0xf200,	0xf200,	0xf116,	0xf117,	0xf119,	0xf307,
+	0xf308,	0xf309,	0xf30b,	0xf702,	0xf001,	0xf013,	0xf004,	0xf006,
+	0xf007,	0xf008,	0xf00a,	0xf00b,	0xf00c,	0xf200,	0xf200,	0xf201,
+	0xf304,	0xf305,	0xf306,	0xf30a,	0xf700,	0xf200,	0xf01a,	0xf018,
+	0xf003,	0xf016,	0xf002,	0xf00e,	0xf00d,	0xf200,	0xf200,	0xf200,
+	0xf700,	0xf603,	0xf301,	0xf302,	0xf303,	0xf207,	0xf703,	0xf200,
+	0xf701,	0xf702,	0xf601,	0xf600,	0xf602,	0xf300,	0xf310,	0xf30e,
+	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,
+	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,
+	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,
+};
+
+u_short alt_map[NR_KEYS] = {
+	0xf81b,	0xf500,	0xf501,	0xf502,	0xf503,	0xf504,	0xf505,	0xf506,
+	0xf507,	0xf508,	0xf509,	0xf50a,	0xf50b,	0xf200,	0xf209,	0xf205,
+	0xf860,	0xf831,	0xf832,	0xf833,	0xf834,	0xf835,	0xf836,	0xf837,
+	0xf838,	0xf839,	0xf830,	0xf82d,	0xf83d,	0xf8a3,	0xf87f,	0xf115,
+	0xf114,	0xf118,	0xf208,	0xf30d,	0xf30c,	0xf314,	0xf809,	0xf871,
+	0xf877,	0xf865,	0xf872,	0xf874,	0xf879,	0xf875,	0xf869,	0xf86f,
+	0xf870,	0xf85b,	0xf85d,	0xf85c,	0xf116,	0xf117,	0xf119,	0xf907,
+	0xf908,	0xf909,	0xf30b,	0xf702,	0xf861,	0xf873,	0xf864,	0xf866,
+	0xf867,	0xf868,	0xf86a,	0xf86b,	0xf86c,	0xf83b,	0xf827,	0xf80d,
+	0xf904,	0xf905,	0xf906,	0xf30a,	0xf700,	0xf200,	0xf87a,	0xf878,
+	0xf863,	0xf876,	0xf862,	0xf86e,	0xf86d,	0xf82c,	0xf82e,	0xf82f,
+	0xf700,	0xf603,	0xf901,	0xf902,	0xf903,	0xf207,	0xf703,	0xf820,
+	0xf701,	0xf702,	0xf210,	0xf600,	0xf211,	0xf900,	0xf310,	0xf30e,
+	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,
+	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,
+	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,
+};
+
+u_short ctrl_alt_map[NR_KEYS] = {
+	0xf200,	0xf500,	0xf501,	0xf502,	0xf503,	0xf504,	0xf505,	0xf506,
+	0xf507,	0xf508,	0xf509,	0xf50a,	0xf50b,	0xf200,	0xf209,	0xf205,
+	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,
+	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf115,
+	0xf114,	0xf118,	0xf208,	0xf30d,	0xf30c,	0xf314,	0xf200,	0xf811,
+	0xf817,	0xf805,	0xf812,	0xf814,	0xf819,	0xf815,	0xf809,	0xf80f,
+	0xf810,	0xf200,	0xf200,	0xf200,	0xf20c,	0xf117,	0xf119,	0xf307,
+	0xf308,	0xf309,	0xf30b,	0xf702,	0xf801,	0xf813,	0xf804,	0xf806,
+	0xf807,	0xf808,	0xf80a,	0xf80b,	0xf80c,	0xf200,	0xf200,	0xf201,
+	0xf304,	0xf305,	0xf306,	0xf30a,	0xf700,	0xf200,	0xf81a,	0xf818,
+	0xf803,	0xf816,	0xf802,	0xf80e,	0xf80d,	0xf200,	0xf200,	0xf200,
+	0xf700,	0xf603,	0xf301,	0xf302,	0xf303,	0xf207,	0xf703,	0xf200,
+	0xf701,	0xf702,	0xf601,	0xf600,	0xf602,	0xf300,	0xf20c,	0xf30e,
+	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,
+	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,
+	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,
 };
 
 ushort *key_maps[MAX_NR_KEYMAPS] = {
@@ -253,39 +154,39 @@
  */
 
 char func_buf[] = {
-	'\033', '[', '[', 'A', 0,
-	'\033', '[', '[', 'B', 0,
-	'\033', '[', '[', 'C', 0,
-	'\033', '[', '[', 'D', 0,
-	'\033', '[', '[', 'E', 0,
-	'\033', '[', '1', '7', '~', 0,
-	'\033', '[', '1', '8', '~', 0,
-	'\033', '[', '1', '9', '~', 0,
-	'\033', '[', '2', '0', '~', 0,
-	'\033', '[', '2', '1', '~', 0,
-	'\033', '[', '2', '3', '~', 0,
-	'\033', '[', '2', '4', '~', 0,
-	'\033', '[', '2', '5', '~', 0,
-	'\033', '[', '2', '6', '~', 0,
-	'\033', '[', '2', '8', '~', 0,
-	'\033', '[', '2', '9', '~', 0,
-	'\033', '[', '3', '1', '~', 0,
-	'\033', '[', '3', '2', '~', 0,
-	'\033', '[', '3', '3', '~', 0,
-	'\033', '[', '3', '4', '~', 0,
-	'\033', '[', '1', '~', 0,
-	'\033', '[', '2', '~', 0,
-	'\033', '[', '3', '~', 0,
-	'\033', '[', '4', '~', 0,
-	'\033', '[', '5', '~', 0,
-	'\033', '[', '6', '~', 0,
-	'\033', '[', 'M', 0,
-	'\033', '[', 'P', 0,
+	'\033', '[', '[', 'A', 0, 
+	'\033', '[', '[', 'B', 0, 
+	'\033', '[', '[', 'C', 0, 
+	'\033', '[', '[', 'D', 0, 
+	'\033', '[', '[', 'E', 0, 
+	'\033', '[', '1', '7', '~', 0, 
+	'\033', '[', '1', '8', '~', 0, 
+	'\033', '[', '1', '9', '~', 0, 
+	'\033', '[', '2', '0', '~', 0, 
+	'\033', '[', '2', '1', '~', 0, 
+	'\033', '[', '2', '3', '~', 0, 
+	'\033', '[', '2', '4', '~', 0, 
+	'\033', '[', '2', '5', '~', 0, 
+	'\033', '[', '2', '6', '~', 0, 
+	'\033', '[', '2', '8', '~', 0, 
+	'\033', '[', '2', '9', '~', 0, 
+	'\033', '[', '3', '1', '~', 0, 
+	'\033', '[', '3', '2', '~', 0, 
+	'\033', '[', '3', '3', '~', 0, 
+	'\033', '[', '3', '4', '~', 0, 
+	'\033', '[', '1', '~', 0, 
+	'\033', '[', '2', '~', 0, 
+	'\033', '[', '3', '~', 0, 
+	'\033', '[', '4', '~', 0, 
+	'\033', '[', '5', '~', 0, 
+	'\033', '[', '6', '~', 0, 
+	'\033', '[', 'M', 0, 
+	'\033', '[', 'P', 0, 
 };
 
 char *funcbufptr = func_buf;
 int funcbufsize = sizeof(func_buf);
-int funcbufleft;          /* space left */
+int funcbufleft = 0;          /* space left */
 
 char *func_table[MAX_NR_FUNC] = {
 	func_buf + 0,
diff -u --recursive --new-file v2.4.8/linux/drivers/acorn/char/defkeymap-acorn.map linux/drivers/acorn/char/defkeymap-acorn.map
--- v2.4.8/linux/drivers/acorn/char/defkeymap-acorn.map	Wed Dec 31 16:00:00 1969
+++ linux/drivers/acorn/char/defkeymap-acorn.map	Sun Aug 12 10:38:48 2001
@@ -0,0 +1,356 @@
+# Default kernel keymap for Acorn machines.  This uses 7 modifier combinations.
+keymaps 0-2,4-5,8,12
+# Change the above line into
+#	keymaps 0-2,4-6,8,12
+# in case you want the entries
+#	altgr	control	keycode  52 = Boot
+#	altgr	control	keycode 102 = Boot
+# below.
+#
+# In fact AltGr is used very little, and one more keymap can
+# be saved by mapping AltGr to Alt (and adapting a few entries):
+# keycode  96 = Alt             
+#
+keycode   0 = Escape
+	shift	keycode   0 = Escape
+	alt	keycode   0 = Meta_Escape
+keycode   1 = F1              F11               Console_13      
+	control	keycode   1 = F1              
+	alt	keycode   1 = Console_1       
+	control	alt	keycode   1 = Console_1       
+keycode   2 = F2              F12               Console_14      
+	control	keycode   2 = F2              
+	alt	keycode   2 = Console_2       
+	control	alt	keycode   2 = Console_2       
+keycode   3 = F3              F13               Console_15      
+	control	keycode   3 = F3              
+	alt	keycode   3 = Console_3       
+	control	alt	keycode   3 = Console_3       
+keycode   4 = F4              F14               Console_16      
+	control	keycode   4 = F4              
+	alt	keycode   4 = Console_4       
+	control	alt	keycode   4 = Console_4       
+keycode   5 = F5              F15               Console_17      
+	control	keycode   5 = F5              
+	alt	keycode   5 = Console_5       
+	control	alt	keycode   5 = Console_5       
+keycode   6 = F6              F16               Console_18      
+	control	keycode   6 = F6              
+	alt	keycode   6 = Console_6       
+	control	alt	keycode   6 = Console_6       
+keycode   7 = F7              F17               Console_19      
+	control	keycode   7 = F7              
+	alt	keycode   7 = Console_7       
+	control	alt	keycode   7 = Console_7       
+keycode   8 = F8              F18               Console_20      
+	control	keycode   8 = F8              
+	alt	keycode   8 = Console_8       
+	control	alt	keycode   8 = Console_8       
+keycode   9 = F9              F19               Console_21
+	control	keycode   9 = F9              
+	alt	keycode   9 = Console_9       
+	control	alt	keycode   9 = Console_9       
+keycode  10 = F10             F20               Console_22
+	control	keycode  10 = F10
+	alt	keycode  10 = Console_10      
+	control	alt	keycode  10 = Console_10      
+keycode  11 = F11             F11               Console_23
+	control	keycode  11 = F11
+	alt	keycode  11 = Console_11      
+	control	alt	keycode  11 = Console_11      
+keycode  12 = F12             F12               Console_24
+	control	keycode  12 = F12
+	alt	keycode  12 = Console_12      
+	control	alt	keycode  12 = Console_12      
+keycode  13 =
+keycode  14 = Scroll_Lock     
+	shift	keycode  14 = Show_Memory     
+	altgr	keycode  14 = Show_Registers  
+	control	keycode  14 = Show_State      
+	alt	keycode  14 = Scroll_Lock
+keycode  15 = Break           
+keycode  16 = grave            asciitilde      
+	alt	keycode  16 = Meta_grave      
+keycode  17 = one              exclam          
+	alt	keycode  17 = Meta_one        
+keycode  18 = two              at               at
+	control	keycode  18 = nul
+	alt	keycode  18 = Meta_two
+keycode  19 = three            numbersign      
+	control	keycode  19 = Escape
+	alt	keycode  19 = Meta_three      
+keycode  20 = four             dollar           dollar
+	control	keycode  20 = Control_backslash
+	alt	keycode  20 = Meta_four       
+keycode  21 = five             percent         
+	control	keycode  21 = Control_bracketright
+	alt	keycode  21 = Meta_five       
+keycode  22 = six              asciicircum     
+	control	keycode  22 = Control_asciicircum
+	alt	keycode  22 = Meta_six        
+keycode  23 = seven            ampersand        braceleft
+	control	keycode  23 = Control_underscore
+	alt	keycode  23 = Meta_seven      
+keycode  24 = eight            asterisk         bracketleft
+	control	keycode  24 = Delete
+	alt	keycode  24 = Meta_eight      
+keycode  25 = nine             parenleft        bracketright
+	alt	keycode  25 = Meta_nine       
+keycode  26 = zero             parenright       braceright
+	alt	keycode  26 = Meta_zero       
+keycode  27 = minus            underscore       backslash
+	control	keycode  27 =  Control_underscore
+	shift	control	keycode  27 = Control_underscore
+	alt	keycode  27 = Meta_minus      
+keycode  28 = equal            plus            
+	alt	keycode  28 = Meta_equal      
+keycode  29 = sterling         currency        
+	alt	keycode  29 = 0x08a3          
+keycode  30 = Delete           Delete          
+	control	keycode  30 = BackSpace       
+	alt	keycode  30 = Meta_Delete     
+keycode  31 = Insert          
+keycode  32 = Find            
+keycode  33 = Prior           
+	shift	keycode  33 = Scroll_Backward 
+keycode  34 = Num_Lock        
+keycode  35 = KP_Divide       
+keycode  36 = KP_Multiply     
+keycode  37 = 0x0314          
+keycode  38 = Tab              Tab             
+	alt	keycode  38 = Meta_Tab        
+keycode  39 = q               
+keycode  40 = w               
+keycode  41 = e               
+	altgr	keycode  41 = Hex_E
+keycode  42 = r               
+keycode  43 = t               
+keycode  44 = y               
+keycode  45 = u               
+keycode  46 = i               
+keycode  47 = o               
+keycode  48 = p               
+keycode  49 = bracketleft      braceleft       
+	control	keycode  49 = Escape          
+	alt	keycode  49 = Meta_bracketleft
+keycode  50 = bracketright     braceright       asciitilde
+	control	keycode  50 = Control_bracketright
+	alt	keycode  50 = Meta_bracketright
+keycode  51 = backslash        bar             
+	control	keycode  51 = Control_backslash
+	alt	keycode  51 = Meta_backslash  
+keycode  52 = Remove          
+#	altgr	control	keycode  52 = Boot
+	control	alt	keycode  52 = Boot            
+keycode  53 = Select          
+keycode  54 = Next            
+	shift	keycode  54 = Scroll_Forward  
+keycode  55 = KP_7            
+	altgr	keycode  55 = Hex_7           
+	alt	keycode  55 = Ascii_7         
+keycode  56 = KP_8            
+	altgr	keycode  56 = Hex_8           
+	alt	keycode  56 = Ascii_8         
+keycode  57 = KP_9            
+	altgr	keycode  57 = Hex_9           
+	alt	keycode  57 = Ascii_9         
+keycode  58 = KP_Subtract     
+keycode  59 = Control         
+keycode  60 = a
+	altgr	keycode  60 = Hex_A
+keycode  61 = s               
+keycode  62 = d
+	altgr	keycode  62 = Hex_D
+keycode  63 = f
+	altgr	keycode  63 = Hex_F
+keycode  64 = g               
+keycode  65 = h               
+keycode  66 = j               
+keycode  67 = k               
+keycode  68 = l               
+keycode  69 = semicolon        colon           
+	alt	keycode  69 = Meta_semicolon  
+keycode  70 = apostrophe       quotedbl        
+	control	keycode  70 = Control_g       
+	alt	keycode  70 = Meta_apostrophe 
+keycode  71 = Return          
+	alt	keycode  71 = Meta_Control_m  
+keycode  72 = KP_4            
+	altgr	keycode  72 = Hex_4           
+	alt	keycode  72 = Ascii_4         
+keycode  73 = KP_5            
+	altgr	keycode  73 = Hex_5           
+	alt	keycode  73 = Ascii_5         
+keycode  74 = KP_6            
+	altgr	keycode  74 = Hex_6           
+	alt	keycode  74 = Ascii_6         
+keycode  75 = KP_Add          
+keycode  76 = Shift           
+keycode  77 =
+keycode  78 = z               
+keycode  79 = x               
+keycode  80 = c
+	altgr	keycode  80 = Hex_C
+keycode  81 = v               
+keycode  82 = b
+	altgr	keycode  82 = Hex_B
+keycode  83 = n               
+keycode  84 = m               
+keycode  85 = comma            less            
+	alt	keycode  85 = Meta_comma      
+keycode  86 = period           greater         
+	control	keycode  86 = Compose         
+	alt	keycode  86 = Meta_period     
+keycode  87 = slash            question        
+	control	keycode  87 = Delete          
+	alt	keycode  87 = Meta_slash
+keycode  88 = Shift           
+keycode  89 = Up              
+keycode  90 = KP_1            
+	altgr	keycode  90 = Hex_1           
+	alt	keycode  90 = Ascii_1         
+keycode  91 = KP_2            
+	altgr	keycode  91 = Hex_2           
+	alt	keycode  91 = Ascii_2         
+keycode  92 = KP_3            
+	altgr	keycode  92 = Hex_3           
+	alt	keycode  92 = Ascii_3         
+keycode  93 = Caps_Lock       
+keycode  94 = Alt             
+keycode  95 = space            space           
+	control	keycode  95 = nul             
+	alt	keycode  95 = Meta_space      
+keycode  96 = AltGr           
+keycode  97 = Control         
+keycode  98 = Left            
+	alt	keycode  98 = Decr_Console    
+keycode  99 = Down            
+keycode 100 = Right           
+	alt	keycode 100 = Incr_Console    
+keycode 101 = KP_0            
+	altgr	keycode 101 = Hex_0           
+	alt	keycode 101 = Ascii_0         
+keycode 102 = KP_Period       
+#	altgr	control	keycode 102 = Boot
+	control	alt	keycode 102 = Boot            
+keycode 103 = KP_Enter        
+keycode 104 =
+keycode 105 =
+keycode 106 =
+keycode 107 =
+keycode 108 =
+keycode 109 =
+keycode 110 =
+keycode 111 =
+keycode 112 =
+keycode 113 =
+keycode 114 =
+keycode 115 =
+keycode 116 =
+keycode 117 =
+keycode 118 =
+keycode 119 =
+keycode 120 =
+keycode 121 =
+keycode 122 =
+keycode 123 =
+keycode 124 =
+keycode 125 =
+keycode 126 =
+keycode 127 =
+string F1 = "\033[[A"
+string F2 = "\033[[B"
+string F3 = "\033[[C"
+string F4 = "\033[[D"
+string F5 = "\033[[E"
+string F6 = "\033[17~"
+string F7 = "\033[18~"
+string F8 = "\033[19~"
+string F9 = "\033[20~"
+string F10 = "\033[21~"
+string F11 = "\033[23~"
+string F12 = "\033[24~"
+string F13 = "\033[25~"
+string F14 = "\033[26~"
+string F15 = "\033[28~"
+string F16 = "\033[29~"
+string F17 = "\033[31~"
+string F18 = "\033[32~"
+string F19 = "\033[33~"
+string F20 = "\033[34~"
+string Find = "\033[1~"
+string Insert = "\033[2~"
+string Remove = "\033[3~"
+string Select = "\033[4~"
+string Prior = "\033[5~"
+string Next = "\033[6~"
+string Macro = "\033[M"
+string Pause = "\033[P"
+compose '`' 'A' to 'Ŕ'
+compose '`' 'a' to 'ŕ'
+compose '\'' 'A' to 'Á'
+compose '\'' 'a' to 'á'
+compose '^' 'A' to 'Â'
+compose '^' 'a' to 'â'
+compose '~' 'A' to 'Ă'
+compose '~' 'a' to 'ă'
+compose '"' 'A' to 'Ä'
+compose '"' 'a' to 'ä'
+compose 'O' 'A' to 'Ĺ'
+compose 'o' 'a' to 'ĺ'
+compose '0' 'A' to 'Ĺ'
+compose '0' 'a' to 'ĺ'
+compose 'A' 'A' to 'Ĺ'
+compose 'a' 'a' to 'ĺ'
+compose 'A' 'E' to 'Ć'
+compose 'a' 'e' to 'ć'
+compose ',' 'C' to 'Ç'
+compose ',' 'c' to 'ç'
+compose '`' 'E' to 'Č'
+compose '`' 'e' to 'č'
+compose '\'' 'E' to 'É'
+compose '\'' 'e' to 'é'
+compose '^' 'E' to 'Ę'
+compose '^' 'e' to 'ę'
+compose '"' 'E' to 'Ë'
+compose '"' 'e' to 'ë'
+compose '`' 'I' to 'Ě'
+compose '`' 'i' to 'ě'
+compose '\'' 'I' to 'Í'
+compose '\'' 'i' to 'í'
+compose '^' 'I' to 'Î'
+compose '^' 'i' to 'î'
+compose '"' 'I' to 'Ď'
+compose '"' 'i' to 'ď'
+compose '-' 'D' to 'Đ'
+compose '-' 'd' to 'đ'
+compose '~' 'N' to 'Ń'
+compose '~' 'n' to 'ń'
+compose '`' 'O' to 'Ň'
+compose '`' 'o' to 'ň'
+compose '\'' 'O' to 'Ó'
+compose '\'' 'o' to 'ó'
+compose '^' 'O' to 'Ô'
+compose '^' 'o' to 'ô'
+compose '~' 'O' to 'Ő'
+compose '~' 'o' to 'ő'
+compose '"' 'O' to 'Ö'
+compose '"' 'o' to 'ö'
+compose '/' 'O' to 'Ř'
+compose '/' 'o' to 'ř'
+compose '`' 'U' to 'Ů'
+compose '`' 'u' to 'ů'
+compose '\'' 'U' to 'Ú'
+compose '\'' 'u' to 'ú'
+compose '^' 'U' to 'Ű'
+compose '^' 'u' to 'ű'
+compose '"' 'U' to 'Ü'
+compose '"' 'u' to 'ü'
+compose '\'' 'Y' to 'Ý'
+compose '\'' 'y' to 'ý'
+compose 'T' 'H' to 'Ţ'
+compose 't' 'h' to 'ţ'
+compose 's' 's' to 'ß'
+compose '"' 'y' to '˙'
+compose 's' 'z' to 'ß'
+compose 'i' 'j' to '˙'
diff -u --recursive --new-file v2.4.8/linux/drivers/acorn/char/defkeymap-l7200.c linux/drivers/acorn/char/defkeymap-l7200.c
--- v2.4.8/linux/drivers/acorn/char/defkeymap-l7200.c	Wed Dec 31 16:00:00 1969
+++ linux/drivers/acorn/char/defkeymap-l7200.c	Sun Aug 12 10:38:48 2001
@@ -0,0 +1,386 @@
+/*
+ * linux/drivers/acorn/char/defkeymap-l7200.c
+ *
+ * Default keyboard maps for LinkUp Systems L7200 board
+ *
+ * Copyright (C) 2000 Steve Hill (sjhill@cotw.com)
+ *
+ * Changelog:
+ *   08-04-2000 SJH     Created file
+ */
+
+#include <linux/types.h>
+#include <linux/keyboard.h>
+#include <linux/kd.h>
+
+/* Normal (maps 1:1 with no processing) */
+#define KTn	0xF0
+/* Function keys */
+#define KTf	0xF1
+/* Special (Performs special house-keeping funcs) */
+#define KTs	0xF2
+#define KIGNORE		K(KTs, 0)	/* Ignore */
+#define KENTER		K(KTs, 1)	/* Enter */
+#define KREGS		K(KTs, 2)	/* Regs */
+#define KMEM		K(KTs, 3)	/* Mem */
+#define KSTAT		K(KTs, 4)	/* State */
+#define KINTR		K(KTs, 5)	/* Intr */
+#define Ksl	6	/* Last console */
+#define KCAPSLK		K(KTs, 7)	/* Caps lock */
+#define KNUMLK		K(KTs, 8)	/* Num-lock */
+#define KSCRLLK		K(KTs, 9)	/* Scroll-lock */
+#define KSCRLFOR	K(KTs,10)	/* Scroll forward */
+#define KSCRLBAK	K(KTs,11)	/* Scroll back */
+#define KREBOOT		K(KTs,12)	/* Reboot */
+#define KCAPSON		K(KTs,13)	/* Caps on */
+#define KCOMPOSE	K(KTs,14)	/* Compose */
+#define KSAK		K(KTs,15)	/* SAK */
+#define CONS_DEC	K(KTs,16)	/* Dec console */
+#define CONS_INC	K(KTs,17)	/* Incr console */
+#define KFLOPPY		K(KTs,18)	/* Floppy */
+/* Key pad (0-9 = digits, 10=+, 11=-, 12=*, 13=/, 14=enter, 16=., 17=# */
+#define KTp	0xF3
+#define KPAD_0		K(KTp, 0 )
+#define KPAD_1  	K(KTp, 1 )
+#define KPAD_2		K(KTp, 2 )
+#define KPAD_3		K(KTp, 3 )
+#define KPAD_4		K(KTp, 4 )
+#define KPAD_5		K(KTp, 5 )
+#define KPAD_6		K(KTp, 6 )
+#define KPAD_7		K(KTp, 7 )
+#define KPAD_8		K(KTp, 8 )
+#define KPAD_9		K(KTp, 9 )
+#define KPAD_PL		K(KTp,10 )
+#define KPAD_MI		K(KTp,11 )
+#define KPAD_ML		K(KTp,12 )
+#define KPAD_DV		K(KTp,13 )
+#define KPAD_EN		K(KTp,14 )
+#define KPAD_DT		K(KTp,16 )
+#define KPAD_HS		K(KTp,20 )
+/* Console switching */
+#define KCn	0xF5
+/* Cursor */
+#define KTc	0xF6
+#define Kcd	0	/* Cursor down */
+#define Kcl	1	/* Cursor left */
+#define Kcr	2	/* Cursor right */
+#define Kcu	3	/* Cursor up */
+/* Shift/alt modifiers etc */
+#define KMd	0xF7
+#define KSHIFT		K(KMd, 0 )
+#define KALTGR		K(KMd, 1 )
+#define KCTRL		K(KMd, 2 )
+#define KALT		K(KMd, 3 )
+/* Meta */
+#define KMt	0xF8
+#define KAs	0xF9
+#define KPADA_0		K(KAs, 0 )
+#define KPADA_1		K(KAs, 1 )
+#define KPADA_2		K(KAs, 2 )
+#define KPADA_3		K(KAs, 3 )
+#define KPADA_4		K(KAs, 4 )
+#define KPADA_5		K(KAs, 5 )
+#define KPADA_6		K(KAs, 6 )
+#define KPADA_7		K(KAs, 7 )
+#define KPADA_8		K(KAs, 8 )
+#define KPADA_9		K(KAs, 9 )
+#define KPADB_0		K(KAs,10 )
+#define KPADB_1		K(KAs,11 )
+#define KPADB_2		K(KAs,12 )
+#define KPADB_3		K(KAs,13 )
+#define KPADB_4		K(KAs,14 )
+#define KPADB_5		K(KAs,15 )
+#define KPADB_6		K(KAs,16 )
+#define KPADB_7		K(KAs,17 )
+#define KPADB_8		K(KAs,18 )
+#define KPADB_9		K(KAs,19 )
+/* Locking keys */
+#define KLk	0xFA
+/* Letters */
+#define KTl	0xFB
+
+/*
+ * Here is the layout of the keys for the Fujitsu QWERTY
+ * style keyboard:
+ *
+ *	static char Fujitsu_Key_Table[] =
+ *	{
+ *        KALT, '`' , KNUL, KCTL, KFUN, KESC, '1' , '2' ,
+ *	  '9' , '0' , '-' , '=' , KNUL, KBSP, KNUL, KNUL,
+ *	  KNUL, KBSL, KSHF, KNUL, KNUL, KDEL, KNUL, 't' ,
+ *	  'y' , 'u' , 'i' , KRET, KSHF, KPGD, KNUL, KNUL,
+ *	  KNUL, KTAB, KNUL, KNUL, KNUL, 'q' , 'w' , 'e' ,
+ *	  'r' , 'o' , 'p' , '[' , KNUL, ']' , KNUL, KNUL,
+ *	  KNUL, 'z' , KNUL, KNUL, KNUL, KSHL, KNUL, KNUL,
+ *	  'k' , 'l' , ';' , KSQT, KNUL, KPGU, KNUL, KNUL,
+ *	  KNUL, 'a' , KNUL, KNUL, KNUL, 's' , 'd' , 'f' ,
+ *	  'g' , 'h' , 'j' , '/' , KNUL, KHME, KNUL, KNUL,
+ *	  KNUL, 'x' , KNUL, KNUL, KNUL, 'c' , 'v' , 'b' ,
+ *	  'n' , 'm' , ',' , '.' , KNUL, ' ' , KNUL, KNUL,
+ *	  KNUL, KNUL, KNUL, KNUL, KNUL, '3' , '4' , '5' ,
+ *	  '6' , '7' , '8' , KNUL, KPRG, KNUL, KEND, KNUL,
+ *	};
+ */
+
+u_short plain_map[NR_KEYS]=
+{
+	0xf703, 0xf060, 0xf200, 0xf702, 0xf200, 0xf01b, 0xf031, 0xf032,
+	0xf039, 0xf030, 0xf02d, 0xf03d, 0xf200, 0xf07f, 0xf200, 0xf200,
+	0xf200, 0xf05c, 0xf700, 0xf200, 0xf200, 0xf116, 0xf000, 0xfb74,
+	0xfb79, 0xfb75, 0xfb69, 0xf201, 0xf700, 0xf600, 0xf200, 0xf200,
+	0xf200, 0xf009, 0xf200, 0xf200, 0xf200, 0xfb71, 0xfb77, 0xfb65,
+	0xfb72, 0xfb6f, 0xfb70, 0xf05b, 0xf200, 0xf05d, 0xf200, 0xf200,
+	0xf200, 0xfb7a, 0xf200, 0xf200, 0xf200, 0xf207, 0xf200, 0xf200,
+	0xfb6b, 0xfb6c, 0xf03b, 0xf027, 0xf200, 0xf603, 0xf200, 0xf200,
+	0xf200, 0xfb61, 0xf200, 0xf200, 0xf200, 0xfb73, 0xfb64, 0xfb66,
+	0xfb67, 0xfb68, 0xfb6a, 0xf02f, 0xf200, 0xf601, 0xf200, 0xf200,
+	0xf200, 0xfb78, 0xf200, 0xf200, 0xf200, 0xfb63, 0xfb76, 0xfb62,
+	0xfb6e, 0xfb6d, 0xf02c, 0xf02e, 0xf200, 0xf020, 0xf200, 0xf200,
+	0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf033, 0xf034, 0xf035, 
+	0xf036, 0xf037, 0xf038, 0xf200, 0xf200, 0xf200, 0xf602, 0xf200, 
+	0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 
+	0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 
+};
+
+u_short shift_map[NR_KEYS]=
+{
+	0xf703, 0xf07e, 0xf200, 0xf702, 0xf200, 0xf01b, 0xf021, 0xf040,
+	0xf028, 0xf029, 0xf05f, 0xf02b, 0xf200, 0xf07f, 0xf200, 0xf200,
+	0xf200, 0xf07c, 0xf700, 0xf200, 0xf200, 0xf116, 0xf000, 0xfb54,
+	0xfb59, 0xfb55, 0xfb49, 0xf201, 0xf700, 0xf600, 0xf200, 0xf200,
+ 	0xf200, 0xf009, 0xf200, 0xf200, 0xf200, 0xfb51, 0xfb57, 0xfb45,
+	0xfb52, 0xfb4f, 0xfb50, 0xf07b, 0xf200, 0xf07d, 0xf200, 0xf200,
+	0xf200, 0xfb5a, 0xf200, 0xf200, 0xf200, 0xf207, 0xf200, 0xf200,
+	0xfb4b, 0xfb4c, 0xf03a, 0xf022, 0xf200, 0xf603, 0xf200, 0xf200,
+	0xf200, 0xfb41, 0xf200, 0xf200, 0xf200, 0xfb53, 0xfb44, 0xfb46,
+	0xfb47, 0xfb48, 0xfb4a, 0xf03f, 0xf200, 0xf601, 0xf200, 0xf200,
+	0xf200, 0xfb58, 0xf200, 0xf200, 0xf200, 0xfb43, 0xfb56, 0xfb42,
+	0xfb4e, 0xfb4d, 0xf03c, 0xf03e, 0xf200, 0xf020, 0xf200, 0xf200,
+	0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf023, 0xf024, 0xf025, 
+	0xf05e, 0xf026, 0xf02a, 0xf200, 0xf200, 0xf200, 0xf602, 0xf200, 
+	0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 
+	0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 
+};
+
+u_short altgr_map[NR_KEYS]=
+{
+  KIGNORE   ,K(KCn,12 ),K(KCn,13 ),K(KCn,14  ),K(KCn,15 ),K(KCn,16 ),K(KCn,17  ),K(KCn, 18),
+  K(KCn, 19),K(KCn,20 ),K(KCn,21 ),K(KCn,22  ),K(KCn,23 ),KIGNORE   ,KREGS      ,KINTR     ,
+  KIGNORE   ,KIGNORE   ,K(KTn,'@'),KIGNORE    ,K(KTn,'$'),KIGNORE   ,KIGNORE    ,K(KTn,'{'),
+  K(KTn,'['),K(KTn,']'),K(KTn,'}'),K(KTn,'\\'),KIGNORE   ,KIGNORE   ,KIGNORE    ,K(KTf,21 ),
+  K(KTf,20 ),K(KTf,24 ),KNUMLK    ,KPAD_DV    ,KPAD_ML   ,KPAD_HS   ,KIGNORE    ,K(KTl,'q'),
+  K(KTl,'w'),K(KTl,'e'),K(KTl,'r'),K(KTl,'t' ),K(KTl,'y'),K(KTl,'u'),K(KTl,'i' ),K(KTl,'o'),
+  K(KTl,'p'),KIGNORE   ,K(KTn,'~'),KIGNORE    ,K(KTf,22 ),K(KTf,23 ),K(KTf,25  ),KPADB_7   ,
+  KPADB_8   ,KPADB_9   ,KPAD_MI   ,KCTRL      ,K(KAs,20 ),K(KTl,'s'),K(KAs,23  ),K(KAs,25 ),
+  K(KTl,'g'),K(KTl,'h'),K(KTl,'j'),K(KTl,'k' ),K(KTl,'l'),KIGNORE   ,KIGNORE    ,KENTER    ,
+  KPADB_4   ,KPADB_5   ,KPADB_6   ,KPAD_PL    ,KSHIFT    ,KIGNORE   ,K(KTl,'z' ),K(KTl,'x'),
+  K(KAs,22 ),K(KTl,'v'),K(KTl,21 ),K(KTl,'n' ),K(KTl,'m'),KIGNORE   ,KIGNORE    ,KIGNORE   ,
+  KSHIFT    ,K(KTc,Kcu),KPADB_1   ,KPADB_2    ,KPADB_3   ,KCAPSLK   ,KALT       ,KIGNORE   ,
+  KALTGR    ,KCTRL     ,K(KTc,Kcl),K(KTc,Kcd ),K(KTc,Kcr),KPADB_0   ,KPAD_DT    ,KPAD_EN   ,
+  KIGNORE   ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,
+  KIGNORE   ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,
+  KIGNORE   ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,
+};
+
+u_short ctrl_map[NR_KEYS]=
+{
+	0xf703, 0xf200, 0xf200, 0xf702, 0xf200, 0xf200, 0xf001, 0xf002,
+	0xf009, 0xf000, 0xf031, 0xf200, 0xf200, 0xf07f, 0xf200, 0xf200,
+	0xf200, 0xf01c, 0xf700, 0xf200, 0xf200, 0xf116, 0xf000, 0xf020,
+	0xf019, 0xf015, 0xf009, 0xf201, 0xf700, 0xf600, 0xf200, 0xf200,
+	0xf200, 0xf009, 0xf200, 0xf200, 0xf200, 0xf011, 0xf017, 0xf005,
+	0xf012, 0xf00f, 0xf010, 0xf01b, 0xf200, 0xf01d, 0xf200, 0xf200,
+	0xf200, 0xf01a, 0xf200, 0xf200, 0xf200, 0xf207, 0xf200, 0xf200,
+	0xf00b, 0xf00c, 0xf200, 0xf007, 0xf200, 0xf603, 0xf200, 0xf200,
+	0xf200, 0xf001, 0xf200, 0xf200, 0xf200, 0xf001, 0xf013, 0xf006,
+	0xf007, 0xf008, 0xf00a, 0xf07f, 0xf200, 0xf601, 0xf200, 0xf200,
+	0xf200, 0xf018, 0xf200, 0xf200, 0xf200, 0xf003, 0xf016, 0xf002,
+	0xf00e, 0xf00d, 0xf200, 0xf200, 0xf200, 0xf000, 0xf200, 0xf200,
+	0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf01b, 0xf01c, 0xf01d, 
+	0xf036, 0xf037, 0xf038, 0xf200, 0xf200, 0xf200, 0xf602, 0xf200, 
+	0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 
+	0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf602, 0xf200, 
+};
+
+u_short shift_ctrl_map[NR_KEYS]=
+{
+  KIGNORE   ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,
+  KIGNORE   ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,KIGNORE   ,KFLOPPY    ,KINTR     ,
+  KIGNORE   ,KIGNORE   ,K(KTn, 0 ),KIGNORE    ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,
+  KIGNORE   ,KIGNORE   ,KIGNORE   ,K(KTn,31  ),KIGNORE   ,KIGNORE   ,KIGNORE    ,K(KTf,21 ),
+  K(KTf,20 ),K(KTf,24 ),KNUMLK    ,KPAD_DV    ,KPAD_ML   ,KPAD_HS   ,KIGNORE    ,K(KTn,17 ),
+  K(KTn,23 ),K(KTn, 5 ),K(KTn,18 ),K(KTn,20  ),K(KTn,25 ),K(KTn,21 ),K(KTn, 9  ),K(KTn,15 ),
+  K(KTn,16 ),KIGNORE   ,KIGNORE   ,KIGNORE    ,K(KTf,22 ),K(KTf,23 ),K(KTf,25  ),KPAD_7    ,
+  KPAD_8    ,KPAD_9    ,KPAD_MI   ,KCTRL      ,K(KTn, 1 ),K(KTn,19 ),K(KTn, 4  ),K(KTn, 6 ),
+  K(KTn, 7 ),K(KTn, 8 ),K(KTn,10 ),K(KTn,11  ),K(KTn,12 ),KIGNORE   ,K(KTn, 7  ),KENTER    ,
+  KPAD_4    ,KPAD_5    ,KPAD_6    ,KPAD_PL    ,KSHIFT    ,KIGNORE   ,K(KTn,26  ),K(KTn,24 ),
+  K(KTn, 3 ),K(KTn,22 ),K(KTn, 2 ),K(KTn,14  ),K(KTn,13 ),KIGNORE   ,KIGNORE    ,KIGNORE   ,
+  KSHIFT    ,K(KTc,Kcu),KPAD_1    ,KPAD_2     ,KPAD_3    ,KCAPSLK   ,KALT       ,K(KTn, 0 ),
+  KALTGR    ,KCTRL     ,K(KTc,Kcl),K(KTc,Kcd ),K(KTc,Kcr),KPAD_0    ,KPAD_DT    ,KPAD_EN   ,
+  KIGNORE   ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,
+  KIGNORE   ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,
+  KIGNORE   ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,
+};
+
+u_short alt_map[NR_KEYS]=
+{
+  K(KMt,27 ),K(KCn, 0 ),K(KCn, 1 ),K(KCn, 2  ),K(KCn, 3 ),K(KCn, 4 ),K(KCn, 5  ),K(KCn, 6 ),
+  K(KCn, 7 ),K(KCn, 8 ),K(KCn, 9 ),K(KCn,10  ),K(KCn,11 ),KIGNORE   ,KSCRLLK    ,KINTR     ,
+  K(KMt,'`'),K(KMt,'1'),K(KMt,'2'),K(KMt,'3' ),K(KMt,'4'),K(KMt,'5'),K(KMt,'6' ),K(KMt,'7'),
+  K(KMt,'8'),K(KMt,'9'),K(KMt,'0'),K(KMt,'-' ),K(KMt,'='),K(KMt,'Ł'),K(KMt,127 ),K(KTf,21 ),
+  K(KTf,20 ),K(KTf,24 ),KNUMLK    ,KPAD_DV    ,KPAD_ML   ,KPAD_HS   ,K(KMt, 9  ),K(KMt,'q'),
+  K(KMt,'w'),K(KMt,'e'),K(KMt,'r'),K(KMt,'t' ),K(KMt,'y'),K(KMt,'u'),K(KMt,'i' ),K(KMt,'o'),
+  K(KMt,'p'),K(KMt,'['),K(KMt,']'),K(KMt,'\\'),K(KTf,22 ),K(KTf,23 ),K(KTf,25  ),KPADA_7   ,
+  KPADA_8   ,KPADA_9   ,KPAD_MI   ,KCTRL      ,K(KMt,'a'),K(KMt,'s'),K(KMt,'d' ),K(KMt,'f'),
+  K(KMt,'g'),K(KMt,'h'),K(KMt,'j'),K(KMt,'k' ),K(KMt,'l'),K(KMt,';'),K(KMt,'\''),K(KMt,13 ),
+  KPADA_4   ,KPADA_5   ,KPADA_6   ,KPAD_PL    ,KSHIFT    ,KIGNORE   ,K(KMt,'z' ),K(KMt,'x'),
+  K(KMt,'c'),K(KMt,'v'),K(KMt,'b'),K(KMt,'n' ),K(KMt,'m'),K(KMt,','),K(KMt,'.' ),KIGNORE   ,
+  KSHIFT    ,K(KTc,Kcu),KPADA_1   ,KPADA_2    ,KPADA_3   ,KCAPSLK   ,KALT       ,K(KMt,' '),
+  KALTGR    ,KCTRL     ,CONS_DEC  ,K(KTc,Kcd ),CONS_INC  ,KPADA_0   ,KPAD_DT    ,KPAD_EN   ,
+  KIGNORE   ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,
+  KIGNORE   ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,
+  KIGNORE   ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,
+};
+
+u_short ctrl_alt_map[NR_KEYS]=
+{
+  KIGNORE   ,K(KCn, 0 ),K(KCn, 1 ),K(KCn, 2  ),K(KCn, 3 ),K(KCn, 4 ),K(KCn, 5  ),K(KCn, 6 ),
+  K(KCn, 7 ),K(KCn, 8 ),K(KCn, 9 ),K(KCn,10  ),K(KCn,11 ),KIGNORE   ,KIGNORE    ,KINTR     ,
+  KIGNORE   ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,
+  KIGNORE   ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,KIGNORE   ,KIGNORE    ,K(KTf,21 ),
+  K(KTf,20 ),K(KTf,24 ),KNUMLK    ,KPAD_DV    ,KPAD_ML   ,KPAD_HS   ,KIGNORE    ,K(KMt,17 ),
+  K(KMt,23 ),K(KMt, 5 ),K(KMt,18 ),K(KMt,20  ),K(KMt,25 ),K(KMt,21 ),K(KMt, 9  ),K(KMt,15 ),
+  K(KMt,16 ),KIGNORE   ,KIGNORE   ,KIGNORE    ,KREBOOT   ,K(KTf,23 ),K(KTf,25  ),KPAD_7    ,
+  KPAD_8    ,KPAD_9    ,KPAD_MI   ,KCTRL      ,K(KMt, 1 ),K(KMt,19 ),K(KMt, 4  ),K(KMt, 6 ),
+  K(KMt, 7 ),K(KMt, 8 ),K(KMt,10 ),K(KMt,11  ),K(KMt,12 ),KIGNORE   ,KIGNORE    ,KENTER    ,
+  KPAD_4    ,KPAD_5    ,KPAD_6    ,KPAD_PL    ,KSHIFT    ,KIGNORE   ,K(KMt,26  ),K(KMt,24 ),
+  K(KMt, 3 ),K(KMt,22 ),K(KMt, 2 ),K(KMt,14  ),K(KMt,13 ),KIGNORE   ,KIGNORE    ,KIGNORE   ,
+  KSHIFT    ,K(KTc,Kcu),KPAD_1    ,KPAD_2     ,KPAD_3    ,KCAPSLK   ,KALT       ,KIGNORE   ,
+  KALTGR    ,KCTRL     ,K(KTc,Kcl),K(KTc,Kcd ),K(KTc,Kcr),KPAD_0    ,KREBOOT    ,KPAD_EN   ,
+  KIGNORE   ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,
+  KIGNORE   ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,
+  KIGNORE   ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,KIGNORE   ,KIGNORE    ,KIGNORE   ,
+};
+
+ushort *key_maps[MAX_NR_KEYMAPS] = {
+	plain_map, shift_map, altgr_map, 0,
+	ctrl_map, shift_ctrl_map, 0, 0,
+	alt_map, 0, 0, 0,
+	ctrl_alt_map,	0
+};
+
+unsigned int keymap_count = 7;
+
+/*
+ * Philosophy: most people do not define more strings, but they who do
+ * often want quite a lot of string space. So, we statically allocate
+ * the default and allocate dynamically in chunks of 512 bytes.
+ */
+
+char func_buf[] = {
+	'\033', '[', '[', 'A', 0,
+	'\033', '[', '[', 'B', 0,
+	'\033', '[', '[', 'C', 0,
+	'\033', '[', '[', 'D', 0,
+	'\033', '[', '[', 'E', 0,
+	'\033', '[', '1', '7', '~', 0,
+	'\033', '[', '1', '8', '~', 0,
+	'\033', '[', '1', '9', '~', 0,
+	'\033', '[', '2', '0', '~', 0,
+	'\033', '[', '2', '1', '~', 0,
+	'\033', '[', '2', '3', '~', 0,
+	'\033', '[', '2', '4', '~', 0,
+	'\033', '[', '2', '5', '~', 0,
+	'\033', '[', '2', '6', '~', 0,
+	'\033', '[', '2', '8', '~', 0,
+	'\033', '[', '2', '9', '~', 0,
+	'\033', '[', '3', '1', '~', 0,
+	'\033', '[', '3', '2', '~', 0,
+	'\033', '[', '3', '3', '~', 0,
+	'\033', '[', '3', '4', '~', 0,
+	'\033', '[', '1', '~', 0,
+	'\033', '[', '2', '~', 0,
+	'\033', '[', '3', '~', 0,
+	'\033', '[', '4', '~', 0,
+	'\033', '[', '5', '~', 0,
+	'\033', '[', '6', '~', 0,
+	'\033', '[', 'M', 0,
+	'\033', '[', 'P', 0,
+};
+
+char *funcbufptr = func_buf;
+int funcbufsize = sizeof(func_buf);
+int funcbufleft = 0;          /* space left */
+
+char *func_table[MAX_NR_FUNC] = {
+	func_buf + 0,
+	func_buf + 5,
+	func_buf + 10,
+	func_buf + 15,
+	func_buf + 20,
+	func_buf + 25,
+	func_buf + 31,
+	func_buf + 37,
+	func_buf + 43,
+	func_buf + 49,
+	func_buf + 55,
+	func_buf + 61,
+	func_buf + 67,
+	func_buf + 73,
+	func_buf + 79,
+	func_buf + 85,
+	func_buf + 91,
+	func_buf + 97,
+	func_buf + 103,
+	func_buf + 109,
+	func_buf + 115,
+	func_buf + 120,
+	func_buf + 125,
+	func_buf + 130,
+	func_buf + 135,
+	func_buf + 140,
+	func_buf + 145,
+	0,
+	0,
+	func_buf + 149,
+	0,
+};
+
+struct kbdiacr accent_table[MAX_DIACR] = {
+	{'`', 'A', '\300'},	{'`', 'a', '\340'},
+	{'\'', 'A', '\301'},	{'\'', 'a', '\341'},
+	{'^', 'A', '\302'},	{'^', 'a', '\342'},
+	{'~', 'A', '\303'},	{'~', 'a', '\343'},
+	{'"', 'A', '\304'},	{'"', 'a', '\344'},
+	{'O', 'A', '\305'},	{'o', 'a', '\345'},
+	{'0', 'A', '\305'},	{'0', 'a', '\345'},
+	{'A', 'A', '\305'},	{'a', 'a', '\345'},
+	{'A', 'E', '\306'},	{'a', 'e', '\346'},
+	{',', 'C', '\307'},	{',', 'c', '\347'},
+	{'`', 'E', '\310'},	{'`', 'e', '\350'},
+	{'\'', 'E', '\311'},	{'\'', 'e', '\351'},
+	{'^', 'E', '\312'},	{'^', 'e', '\352'},
+	{'"', 'E', '\313'},	{'"', 'e', '\353'},
+	{'`', 'I', '\314'},	{'`', 'i', '\354'},
+	{'\'', 'I', '\315'},	{'\'', 'i', '\355'},
+	{'^', 'I', '\316'},	{'^', 'i', '\356'},
+	{'"', 'I', '\317'},	{'"', 'i', '\357'},
+	{'-', 'D', '\320'},	{'-', 'd', '\360'},
+	{'~', 'N', '\321'},	{'~', 'n', '\361'},
+	{'`', 'O', '\322'},	{'`', 'o', '\362'},
+	{'\'', 'O', '\323'},	{'\'', 'o', '\363'},
+	{'^', 'O', '\324'},	{'^', 'o', '\364'},
+	{'~', 'O', '\325'},	{'~', 'o', '\365'},
+	{'"', 'O', '\326'},	{'"', 'o', '\366'},
+	{'/', 'O', '\330'},	{'/', 'o', '\370'},
+	{'`', 'U', '\331'},	{'`', 'u', '\371'},
+	{'\'', 'U', '\332'},	{'\'', 'u', '\372'},
+	{'^', 'U', '\333'},	{'^', 'u', '\373'},
+	{'"', 'U', '\334'},	{'"', 'u', '\374'},
+	{'\'', 'Y', '\335'},	{'\'', 'y', '\375'},
+	{'T', 'H', '\336'},	{'t', 'h', '\376'},
+	{'s', 's', '\337'},	{'"', 'y', '\377'},
+	{'s', 'z', '\337'},	{'i', 'j', '\377'},
+};
+
+unsigned int accent_table_size = 68;
diff -u --recursive --new-file v2.4.8/linux/drivers/acorn/char/keyb_arc.c linux/drivers/acorn/char/keyb_arc.c
--- v2.4.8/linux/drivers/acorn/char/keyb_arc.c	Tue Jul  3 17:08:19 2001
+++ linux/drivers/acorn/char/keyb_arc.c	Sun Aug 12 10:38:48 2001
@@ -427,8 +427,6 @@
 
 void __init a5kkbd_init_hw (void)
 {
-	unsigned long flags;
-
 	if (request_irq (IRQ_KEYBOARDTX, a5kkbd_tx, 0, "keyboard", NULL) != 0)
 		panic("Could not allocate keyboard transmit IRQ!");
 	(void)ioc_readb(IOC_KARTRX);
diff -u --recursive --new-file v2.4.8/linux/drivers/acorn/char/mouse_ps2.c linux/drivers/acorn/char/mouse_ps2.c
--- v2.4.8/linux/drivers/acorn/char/mouse_ps2.c	Tue Jul  3 17:08:19 2001
+++ linux/drivers/acorn/char/mouse_ps2.c	Sun Aug 12 10:38:48 2001
@@ -8,7 +8,7 @@
 #include <linux/tty.h>
 #include <linux/tty_flip.h>
 #include <linux/mm.h>
-#include <linux/malloc.h>
+#include <linux/slab.h>
 #include <linux/ptrace.h>
 #include <linux/signal.h>
 #include <linux/timer.h>
diff -u --recursive --new-file v2.4.8/linux/drivers/acorn/net/etherh.c linux/drivers/acorn/net/etherh.c
--- v2.4.8/linux/drivers/acorn/net/etherh.c	Fri Feb  9 11:30:22 2001
+++ linux/drivers/acorn/net/etherh.c	Sun Aug 12 10:38:48 2001
@@ -7,10 +7,11 @@
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
  *
- * NS8390 ANT etherh specific driver
- *  For Acorn machines
- *
+ * NS8390 I-cubed EtherH and ANT EtherM specific driver
  * Thanks to I-Cubed for information on their cards.
+ * EtherM conversion (C) 1999 Chris Kemp and Tim Watterton
+ * EtherM integration (C) 2000 Aleph One Ltd (Tak-Shing Chan)
+ * EtherM integration re-engineered by Russell King.
  *
  * Changelog:
  *  08-12-1996	RMK	1.00	Created
@@ -19,12 +20,9 @@
  *  16-04-1998	RMK	1.05	Improved media autodetection
  *  10-02-2000	RMK	1.06	Updated for 2.3.43
  *  13-05-2000	RMK	1.07	Updated for 2.3.99-pre8
- *
- * Insmod Module Parameters
- * ------------------------
- *   io=<io_base>
- *   irq=<irqno>
- *   xcvr=<0|1> 0 = 10bT, 1=10b2 (Lan600/600A only)
+ *  12-10-1999  CK/TEW		EtherM driver first release
+ *  21-12-2000	TTC		EtherH/EtherM integration
+ *  25-12-2000	RMK	1.08	Clean integration of EtherM into this driver.
  */
 
 #include <linux/module.h>
@@ -57,18 +55,21 @@
 #define DEBUG_INIT 2
 
 static unsigned int net_debug = NET_DEBUG;
+
 static const card_ids __init etherh_cids[] = {
-	{ MANU_I3, PROD_I3_ETHERLAN500 },
-	{ MANU_I3, PROD_I3_ETHERLAN600 },
-	{ MANU_I3, PROD_I3_ETHERLAN600A },
-	{ 0xffff, 0xffff }
+	{ MANU_ANT, PROD_ANT_ETHERM      },
+	{ MANU_I3,  PROD_I3_ETHERLAN500  },
+	{ MANU_I3,  PROD_I3_ETHERLAN600  },
+	{ MANU_I3,  PROD_I3_ETHERLAN600A },
+	{ 0xffff,   0xffff }
 };
 
+
 MODULE_AUTHOR("Russell King");
-MODULE_DESCRIPTION("i3 EtherH driver");
+MODULE_DESCRIPTION("EtherH/EtherM driver");
 
-static const char version[] __initdata =
-	"etherh [500/600/600A] ethernet driver (c) 2000 R.M.King v1.07\n";
+static char version[] __initdata =
+	"EtherH/EtherM Driver (c) 2000 Russell King v1.08\n";
 
 #define ETHERH500_DATAPORT	0x200	/* MEMC */
 #define ETHERH500_NS8390	0x000	/* MEMC */
@@ -83,13 +84,24 @@
 #define ETHERH_CP_HEARTBEAT	2
 
 #define ETHERH_TX_START_PAGE	1
-#define ETHERH_STOP_PAGE	0x7f
+#define ETHERH_STOP_PAGE	127
+
+/*
+ * These came from CK/TEW
+ */
+#define ETHERM_DATAPORT		0x080	/* MEMC */
+#define ETHERM_NS8390		0x200	/* MEMC */
+#define ETHERM_CTRLPORT		0x08f	/* MEMC */
+
+#define ETHERM_TX_START_PAGE	64
+#define ETHERM_STOP_PAGE	127
 
 /* --------------------------------------------------------------------------- */
 
 static void
 etherh_setif(struct net_device *dev)
 {
+	struct ei_device *ei_local = (struct ei_device *) dev->priv;
 	unsigned long addr, flags;
 
 	save_flags_cli(flags);
@@ -133,6 +145,7 @@
 static int
 etherh_getifstat(struct net_device *dev)
 {
+	struct ei_device *ei_local = (struct ei_device *) dev->priv;
 	int stat = 0;
 
 	switch (dev->mem_end) {
@@ -199,6 +212,8 @@
 static void
 etherh_reset(struct net_device *dev)
 {
+	struct ei_device *ei_local = (struct ei_device *) dev->priv;
+
 	outb_p(E8390_NODMA+E8390_PAGE0+E8390_STOP, dev->base_addr);
 
 	/*
@@ -206,8 +221,8 @@
 	 * Note that we use 'interface_num' as a flag
 	 * to indicate that we need to change the media.
 	 */
-	if (dev->flags & IFF_AUTOMEDIA && ei_status.interface_num) {
-		ei_status.interface_num = 0;
+	if (dev->flags & IFF_AUTOMEDIA && ei_local->interface_num) {
+		ei_local->interface_num = 0;
 
 		if (dev->if_port == IF_PORT_10BASET)
 			dev->if_port = IF_PORT_10BASE2;
@@ -224,17 +239,18 @@
 static void
 etherh_block_output (struct net_device *dev, int count, const unsigned char *buf, int start_page)
 {
+	struct ei_device *ei_local = (struct ei_device *) dev->priv;
 	unsigned int addr, dma_addr;
 	unsigned long dma_start;
-	
-	if (ei_status.dmaing) {
-		printk ("%s: DMAing conflict in etherh_block_input: "
+
+	if (ei_local->dmaing) {
+		printk(KERN_ERR "%s: DMAing conflict in etherh_block_input: "
 			" DMAstat %d irqlock %d\n", dev->name,
-			ei_status.dmaing, ei_status.irqlock);
+			ei_local->dmaing, ei_local->irqlock);
 		return;
 	}
 
-	ei_status.dmaing |= 1;
+	ei_local->dmaing |= 1;
 
 	addr = dev->base_addr;
 	dma_addr = dev->mem_start;
@@ -257,7 +273,7 @@
 	outb (start_page, addr + EN0_RSARHI);
 	outb (E8390_RWRITE | E8390_START, addr + E8390_CMD);
 
-	if (ei_status.word16)
+	if (ei_local->word16)
 		outsw (dma_addr, buf, count >> 1);
 	else
 		outsb (dma_addr, buf, count);
@@ -266,14 +282,15 @@
 
 	while ((inb (addr + EN0_ISR) & ENISR_RDC) == 0)
 		if (jiffies - dma_start > 2*HZ/100) { /* 20ms */
-			printk ("%s: timeout waiting for TX RDC\n", dev->name);
+			printk(KERN_ERR "%s: timeout waiting for TX RDC\n",
+				dev->name);
 			etherh_reset (dev);
 			NS8390_init (dev, 1);
 			break;
 		}
 
 	outb (ENISR_RDC, addr + EN0_ISR);
-	ei_status.dmaing &= ~1;
+	ei_local->dmaing &= ~1;
 }
 
 /*
@@ -282,17 +299,18 @@
 static void
 etherh_block_input (struct net_device *dev, int count, struct sk_buff *skb, int ring_offset)
 {
+	struct ei_device *ei_local = (struct ei_device *) dev->priv;
 	unsigned int addr, dma_addr;
 	unsigned char *buf;
 
-	if (ei_status.dmaing) {
-		printk ("%s: DMAing conflict in etherh_block_input: "
+	if (ei_local->dmaing) {
+		printk(KERN_ERR "%s: DMAing conflict in etherh_block_input: "
 			" DMAstat %d irqlock %d\n", dev->name,
-			ei_status.dmaing, ei_status.irqlock);
+			ei_local->dmaing, ei_local->irqlock);
 		return;
 	}
 
-	ei_status.dmaing |= 1;
+	ei_local->dmaing |= 1;
 
 	addr = dev->base_addr;
 	dma_addr = dev->mem_start;
@@ -305,7 +323,7 @@
 	outb (ring_offset >> 8, addr + EN0_RSARHI);
 	outb (E8390_RREAD | E8390_START, addr + E8390_CMD);
 
-	if (ei_status.word16) {
+	if (ei_local->word16) {
 		insw (dma_addr, buf, count >> 1);
 		if (count & 1)
 			buf[count - 1] = inb (dma_addr);
@@ -313,7 +331,7 @@
 		insb (dma_addr, buf, count);
 
 	outb (ENISR_RDC, addr + EN0_ISR);
-	ei_status.dmaing &= ~1;
+	ei_local->dmaing &= ~1;
 }
 
 /*
@@ -322,16 +340,17 @@
 static void
 etherh_get_header (struct net_device *dev, struct e8390_pkt_hdr *hdr, int ring_page)
 {
+	struct ei_device *ei_local = (struct ei_device *) dev->priv;
 	unsigned int addr, dma_addr;
 
-	if (ei_status.dmaing) {
-		printk ("%s: DMAing conflict in etherh_get_header: "
+	if (ei_local->dmaing) {
+		printk(KERN_ERR "%s: DMAing conflict in etherh_get_header: "
 			" DMAstat %d irqlock %d\n", dev->name,
-			ei_status.dmaing, ei_status.irqlock);
+			ei_local->dmaing, ei_local->irqlock);
 		return;
 	}
 
-	ei_status.dmaing |= 1;
+	ei_local->dmaing |= 1;
 
 	addr = dev->base_addr;
 	dma_addr = dev->mem_start;
@@ -343,13 +362,13 @@
 	outb (ring_page, addr + EN0_RSARHI);
 	outb (E8390_RREAD | E8390_START, addr + E8390_CMD);
 
-	if (ei_status.word16)
+	if (ei_local->word16)
 		insw (dma_addr, hdr, sizeof (*hdr) >> 1);
 	else
 		insb (dma_addr, hdr, sizeof (*hdr));
 
 	outb (ENISR_RDC, addr + EN0_ISR);
-	ei_status.dmaing &= ~1;
+	ei_local->dmaing &= ~1;
 }
 
 /*
@@ -363,7 +382,9 @@
 static int
 etherh_open(struct net_device *dev)
 {
-	if (request_irq(dev->irq, ei_interrupt, 0, "etherh", dev))
+	struct ei_device *ei_local = (struct ei_device *) dev->priv;
+
+	if (request_irq(dev->irq, ei_interrupt, 0, dev->name, dev))
 		return -EAGAIN;
 
 	/*
@@ -371,7 +392,7 @@
 	 * media type on the next reset - we are about to
 	 * do automedia manually now.
 	 */
-	ei_status.interface_num = 0;
+	ei_local->interface_num = 0;
 
 	/*
 	 * If we are doing automedia detection, do it now.
@@ -431,36 +452,7 @@
 	static int version_printed;
 
 	if (net_debug && version_printed++ == 0)
-		printk(version);
-}
-
-static int __init etherh_check_presence(struct net_device *dev)
-{
-	unsigned int addr = dev->base_addr, reg0, tmp;
-
-	reg0 = inb(addr);
-	if (reg0 == 0xff) {
-		if (net_debug & DEBUG_INIT)
-			printk("%s: etherh error: NS8390 command register wrong\n",
-				dev->name);
-		return -ENODEV;
-	}
-
- 	outb(E8390_NODMA | E8390_PAGE1 | E8390_STOP, addr + E8390_CMD);
-	tmp = inb(addr + 13);
-	outb(0xff, addr + 13);
-	outb(E8390_NODMA | E8390_PAGE0, addr + E8390_CMD);
-	inb(addr + EN0_COUNTER0);
-	if (inb(addr + EN0_COUNTER0) != 0) {
-		if (net_debug & DEBUG_INIT)
-			printk("%s: etherh error: NS8390 not found\n",
-				dev->name);
-		outb(reg0, addr);
-		outb(tmp, addr + 13);
-		return -ENODEV;
-	}
-
-	return 0;
+		printk(KERN_INFO "%s", version);
 }
 
 /*
@@ -485,11 +477,36 @@
 	return ENODEV;
 }
 
+/*
+ * Create an ethernet address from the system serial number.
+ */
+static int __init etherm_addr(char *addr)
+{
+	unsigned int serial;
+
+	if (system_serial_low == 0 && system_serial_high == 0)
+		return ENODEV;
+
+	serial = system_serial_low | system_serial_high;
+
+	addr[0] = 0;
+	addr[1] = 0;
+	addr[2] = 0xa4;
+	addr[3] = 0x10 + (serial >> 24);
+	addr[4] = serial >> 16;
+	addr[5] = serial >> 8;
+	return 0;
+}
+
+static u32 etherh_regoffsets[16];
+static u32 etherm_regoffsets[16];
+
 static struct net_device * __init etherh_init_one(struct expansion_card *ec)
 {
+	struct ei_device *ei_local;
 	struct net_device *dev;
 	const char *dev_type;
-	int i;
+	int i, size;
 
 	etherh_banner();
 
@@ -501,8 +518,6 @@
 
 	SET_MODULE_OWNER(dev);
 
-	etherh_addr(dev->dev_addr, ec);
-
 	dev->open	= etherh_open;
 	dev->stop	= etherh_close;
 	dev->set_config	= etherh_set_config;
@@ -512,7 +527,17 @@
 	ec->ops		= &etherh_ops;
 
 	switch (ec->cid.product) {
+	case PROD_ANT_ETHERM:
+		if (etherm_addr(dev->dev_addr))
+			goto free;
+		dev->base_addr += ETHERM_NS8390;
+		dev->mem_start  = dev->base_addr + ETHERM_DATAPORT;
+		ec->irq_data    = (void *)(dev->base_addr + ETHERM_CTRLPORT);
+		break;
+
 	case PROD_I3_ETHERLAN500:
+		if (etherh_addr(dev->dev_addr, ec))
+			goto free;
 		dev->base_addr += ETHERH500_NS8390;
 		dev->mem_start  = dev->base_addr + ETHERH500_DATAPORT;
 		dev->rmem_start = (unsigned long)
@@ -522,34 +547,54 @@
 
 	case PROD_I3_ETHERLAN600:
 	case PROD_I3_ETHERLAN600A:
+		if (etherh_addr(dev->dev_addr, ec))
+			goto free;
 		dev->base_addr += ETHERH600_NS8390;
 		dev->mem_start = dev->base_addr + ETHERH600_DATAPORT;
 		ec->irq_data   = (void *)(dev->base_addr + ETHERH600_CTRLPORT);
 		break;
 
 	default:
-		printk("%s: etherh error: unknown card type %x\n",
+		printk(KERN_ERR "%s: unknown card type %x\n",
 		       dev->name, ec->cid.product);
-		goto out;
+		goto free;
 	}
 
-	if (!request_region(dev->base_addr, 16, dev->name))
-		goto region_not_free;
+	size = 16;
+	if (ec->cid.product == PROD_ANT_ETHERM)
+		size <<= 3;
+
+	if (!request_region(dev->base_addr, size, dev->name))
+		goto free;
 
-	if (etherh_check_presence(dev) || ethdev_init(dev))
+	if (ethdev_init(dev))
 		goto release;
 
+	/*
+	 * Unfortunately, ethdev_init eventually calls
+	 * ether_setup, which re-writes dev->flags.
+	 */
 	switch (ec->cid.product) {
+	case PROD_ANT_ETHERM:
+		dev_type = "ANT EtherM";
+		dev->if_port = IF_PORT_UNKNOWN;
+		break;
+
 	case PROD_I3_ETHERLAN500:
-		dev_type = "500";
+		dev_type = "i3 EtherH 500";
+		dev->if_port = IF_PORT_UNKNOWN;
 		break;
 
 	case PROD_I3_ETHERLAN600:
-		dev_type = "600";
+		dev_type = "i3 EtherH 600";
+		dev->flags  |= IFF_PORTSEL | IFF_AUTOMEDIA;
+		dev->if_port = IF_PORT_10BASET;
 		break;
 
 	case PROD_I3_ETHERLAN600A:
-		dev_type = "600A";
+		dev_type = "i3 EtherH 600A";
+		dev->flags  |= IFF_PORTSEL | IFF_AUTOMEDIA;
+		dev->if_port = IF_PORT_10BASET;
 		break;
 
 	default:
@@ -557,39 +602,31 @@
 		break;
 	}
 
-	printk("%s: etherh %s at %lx, IRQ%d, ether address ",
-		dev->name, dev_type, dev->base_addr, dev->irq);
+	printk(KERN_INFO "%s: %s in slot %d, ",
+		dev->name, dev_type, ec->slot_no);
 
 	for (i = 0; i < 6; i++)
-		printk(i == 5 ? "%2.2x\n" : "%2.2x:", dev->dev_addr[i]);
+		printk("%2.2x%c", dev->dev_addr[i], i == 5 ? '\n' : ':');
 
-	/*
-	 * Unfortunately, ethdev_init eventually calls
-	 * ether_setup, which re-writes dev->flags.
-	 */
-	switch (ec->cid.product) {
-	case PROD_I3_ETHERLAN500:
-		dev->if_port   = IF_PORT_UNKNOWN;
-		break;
-
-	case PROD_I3_ETHERLAN600:
-	case PROD_I3_ETHERLAN600A:
-		dev->flags    |= IFF_PORTSEL | IFF_AUTOMEDIA;
-		dev->if_port   = IF_PORT_10BASET;
-		break;
-	}
-
-	ei_status.name		= dev->name;
-	ei_status.word16	= 1;
-	ei_status.tx_start_page	= ETHERH_TX_START_PAGE;
-	ei_status.rx_start_page	= ei_status.tx_start_page + TX_PAGES;
-	ei_status.stop_page	= ETHERH_STOP_PAGE;
-
-	ei_status.reset_8390	= etherh_reset;
-	ei_status.block_input	= etherh_block_input;
-	ei_status.block_output	= etherh_block_output;
-	ei_status.get_8390_hdr	= etherh_get_header;
-	ei_status.interface_num = 0;
+	ei_local = (struct ei_device *) dev->priv;
+	if (ec->cid.product == PROD_ANT_ETHERM) {
+		ei_local->tx_start_page = ETHERM_TX_START_PAGE;
+		ei_local->stop_page     = ETHERM_STOP_PAGE;
+		ei_local->reg_offset    = etherm_regoffsets;
+	} else {
+		ei_local->tx_start_page = ETHERH_TX_START_PAGE;
+		ei_local->stop_page     = ETHERH_STOP_PAGE;
+		ei_local->reg_offset    = etherh_regoffsets;
+	}
+
+	ei_local->name          = dev->name;
+	ei_local->word16        = 1;
+	ei_local->rx_start_page = ei_local->tx_start_page + TX_PAGES;
+	ei_local->reset_8390    = etherh_reset;
+	ei_local->block_input   = etherh_block_input;
+	ei_local->block_output  = etherh_block_output;
+	ei_local->get_8390_hdr  = etherh_get_header;
+	ei_local->interface_num = 0;
 
 	etherh_reset(dev);
 	NS8390_init(dev, 0);
@@ -597,7 +634,7 @@
 
 release:
 	release_region(dev->base_addr, 16);
-region_not_free:
+free:
 	unregister_netdev(dev);
 	kfree(dev);
 out:
@@ -614,6 +651,11 @@
 {
 	int i, ret = -ENODEV;
 
+	for (i = 0; i < 16; i++) {
+		etherh_regoffsets[i] = i;
+		etherm_regoffsets[i] = i << 3;
+	}
+
 	ecard_startfind();
 
 	for (i = 0; i < MAX_ECARDS; i++) {
@@ -642,8 +684,12 @@
 
 	for (i = 0; i < MAX_ETHERH_CARDS; i++) {
 		if (e_dev[i]) {
+			int size;
 			unregister_netdev(e_dev[i]);
-			release_region(e_dev[i]->base_addr, 16);
+			size = 16;
+			if (e_card[i]->cid.product == PROD_ANT_ETHERM)
+				size <<= 3;
+			release_region(e_dev[i]->base_addr, size);
 			kfree(e_dev[i]);
 			e_dev[i] = NULL;
 		}
diff -u --recursive --new-file v2.4.8/linux/drivers/bluetooth/hci_emu.c linux/drivers/bluetooth/hci_emu.c
--- v2.4.8/linux/drivers/bluetooth/hci_emu.c	Tue Jul  3 17:08:19 2001
+++ linux/drivers/bluetooth/hci_emu.c	Sun Aug 12 10:38:48 2001
@@ -220,11 +220,6 @@
 	return ret;
 }
 
-static loff_t hci_emu_chr_lseek(struct file * file, loff_t offset, int origin)
-{
-	return -ESPIPE;
-}
-
 static int hci_emu_chr_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
 {
 	return -EINVAL;
@@ -295,7 +290,7 @@
 
 static struct file_operations hci_emu_fops = {
 	owner:	THIS_MODULE,	
-	llseek:	hci_emu_chr_lseek,
+	llseek:	no_llseek,
 	read:	hci_emu_chr_read,
 	write:	hci_emu_chr_write,
 	poll:	hci_emu_chr_poll,
diff -u --recursive --new-file v2.4.8/linux/drivers/bluetooth/hci_uart.c linux/drivers/bluetooth/hci_uart.c
--- v2.4.8/linux/drivers/bluetooth/hci_uart.c	Tue Jul  3 17:08:19 2001
+++ linux/drivers/bluetooth/hci_uart.c	Sun Aug 12 10:38:48 2001
@@ -42,7 +42,7 @@
 #include <linux/ptrace.h>
 #include <linux/poll.h>
 
-#include <linux/malloc.h>
+#include <linux/slab.h>
 #include <linux/tty.h>
 #include <linux/errno.h>
 #include <linux/string.h>
diff -u --recursive --new-file v2.4.8/linux/drivers/bluetooth/hci_usb.c linux/drivers/bluetooth/hci_usb.c
--- v2.4.8/linux/drivers/bluetooth/hci_usb.c	Tue Jul  3 17:08:19 2001
+++ linux/drivers/bluetooth/hci_usb.c	Sun Aug 12 10:38:48 2001
@@ -45,7 +45,7 @@
 #include <linux/ptrace.h>
 #include <linux/poll.h>
 
-#include <linux/malloc.h>
+#include <linux/slab.h>
 #include <linux/tty.h>
 #include <linux/errno.h>
 #include <linux/string.h>
diff -u --recursive --new-file v2.4.8/linux/drivers/char/Config.in linux/drivers/char/Config.in
--- v2.4.8/linux/drivers/char/Config.in	Wed Jul 25 17:10:19 2001
+++ linux/drivers/char/Config.in	Sun Aug 12 10:38:48 2001
@@ -174,7 +174,7 @@
 tristate 'Siemens R3964 line discipline' CONFIG_R3964
 tristate 'Applicom intelligent fieldbus card support' CONFIG_APPLICOM
 if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-  tristate 'Sony Vaio Programmable I/O Control Device support' CONFIG_SONYPI $CONFIG_PCI
+   dep_tristate 'Sony Vaio Programmable I/O Control Device support' CONFIG_SONYPI $CONFIG_PCI
 fi
 
 mainmenu_option next_comment
diff -u --recursive --new-file v2.4.8/linux/drivers/char/agp/agpgart_be.c linux/drivers/char/agp/agpgart_be.c
--- v2.4.8/linux/drivers/char/agp/agpgart_be.c	Sun Aug 12 13:27:59 2001
+++ linux/drivers/char/agp/agpgart_be.c	Sun Aug 12 12:29:54 2001
@@ -2338,6 +2338,7 @@
 	retval = serverworks_create_gatt_pages(value->num_entries / 1024);
 	if (retval != 0) {
 		serverworks_free_page_map(&page_dir);
+		serverworks_free_page_map(&serverworks_private.scratch_dir);
 		return retval;
 	}
 
diff -u --recursive --new-file v2.4.8/linux/drivers/char/agp/agpgart_fe.c linux/drivers/char/agp/agpgart_fe.c
--- v2.4.8/linux/drivers/char/agp/agpgart_fe.c	Tue Jul  3 17:08:19 2001
+++ linux/drivers/char/agp/agpgart_fe.c	Sun Aug 12 10:38:48 2001
@@ -749,11 +749,6 @@
 }
 
 
-static long long agp_lseek(struct file *file, long long offset, int origin)
-{
-	return -ESPIPE;
-}
-
 static ssize_t agp_read(struct file *file, char *buf,
 			size_t count, loff_t * ppos)
 {
@@ -1083,7 +1078,7 @@
 static struct file_operations agp_fops =
 {
 	owner:		THIS_MODULE,
-	llseek:		agp_lseek,
+	llseek:		no_llseek,
 	read:		agp_read,
 	write:		agp_write,
 	ioctl:		agp_ioctl,
diff -u --recursive --new-file v2.4.8/linux/drivers/char/console.c linux/drivers/char/console.c
--- v2.4.8/linux/drivers/char/console.c	Tue Jul  3 17:08:19 2001
+++ linux/drivers/char/console.c	Sun Aug 12 10:02:17 2001
@@ -2658,12 +2658,15 @@
 		printk("unblank_screen: tty %d not allocated ??\n", fg_console+1);
 		return;
 	}
+	currcons = fg_console;
+	if (vcmode != KD_TEXT)
+		return; /* but leave console_blanked != 0 */
+
 	console_timer.function = blank_screen;
 	if (blankinterval) {
 		mod_timer(&console_timer, jiffies + blankinterval);
 	}
 
-	currcons = fg_console;
 	console_blanked = 0;
 	if (console_blank_hook)
 		console_blank_hook(0);
diff -u --recursive --new-file v2.4.8/linux/drivers/char/drm/ati_pcigart.h linux/drivers/char/drm/ati_pcigart.h
--- v2.4.8/linux/drivers/char/drm/ati_pcigart.h	Sun Aug 12 13:27:59 2001
+++ linux/drivers/char/drm/ati_pcigart.h	Sun Aug 12 19:02:22 2001
@@ -111,7 +111,7 @@
 	memset( pci_gart, 0, ATI_MAX_PCIGART_PAGES * sizeof(u32) );
 
 	for ( i = 0 ; i < pages ; i++ ) {
-		page_base = virt_to_bus( entry->pagelist[i]->virtual );
+		page_base = page_to_bus( entry->pagelist[i] );
 		for (j = 0; j < (PAGE_SIZE / ATI_PCIGART_PAGE_SIZE); j++) {
 			*pci_gart++ = cpu_to_le32( page_base );
 			page_base += ATI_PCIGART_PAGE_SIZE;
diff -u --recursive --new-file v2.4.8/linux/drivers/char/drm/drm_context.h linux/drivers/char/drm/drm_context.h
--- v2.4.8/linux/drivers/char/drm/drm_context.h	Sun Aug 12 13:27:59 2001
+++ linux/drivers/char/drm/drm_context.h	Sun Aug 12 19:02:22 2001
@@ -160,7 +160,7 @@
 		return -EFAULT;
 
 	down(&dev->struct_sem);
-	if ((int)request.ctx_id >= dev->max_context) {
+	if (dev->max_context < 0 || request.ctx_id >= (unsigned) dev->max_context) {
 		up(&dev->struct_sem);
 		return -EINVAL;
 	}
@@ -193,22 +193,20 @@
 	list_for_each(list, &dev->maplist->head) {
 		r_list = (drm_map_list_t *)list;
 		if(r_list->map &&
-		   r_list->map->handle == request.handle) break;
+		   r_list->map->handle == request.handle)
+			goto found;
 	}
-	if (list == &(dev->maplist->head)) {
-		up(&dev->struct_sem);
-		return -EINVAL;
-	}
-	map = r_list->map;
+bad:
 	up(&dev->struct_sem);
+	return -EINVAL;
 
-	if (!map) return -EINVAL;
-
-	down(&dev->struct_sem);
-	if ((int)request.ctx_id >= dev->max_context) {
-		up(&dev->struct_sem);
-		return -EINVAL;
-	}
+found:
+	map = r_list->map;
+	if (!map) goto bad;
+	if (dev->max_context < 0)
+		goto bad;
+	if (request.ctx_id >= (unsigned) dev->max_context)
+		goto bad;
 	dev->context_sareas[request.ctx_id] = map;
 	up(&dev->struct_sem);
 	return 0;
diff -u --recursive --new-file v2.4.8/linux/drivers/char/drm/drm_scatter.h linux/drivers/char/drm/drm_scatter.h
--- v2.4.8/linux/drivers/char/drm/drm_scatter.h	Sun Aug 12 13:27:59 2001
+++ linux/drivers/char/drm/drm_scatter.h	Sun Aug 12 19:02:22 2001
@@ -155,7 +155,7 @@
 	for ( i = 0 ; i < pages ; i++ ) {
 		unsigned long *tmp;
 
-		tmp = (unsigned long *)entry->pagelist[i]->virtual;
+		tmp = page_address( entry->pagelist[i] );
 		for ( j = 0 ;
 		      j < PAGE_SIZE / sizeof(unsigned long) ;
 		      j++, tmp++ ) {
@@ -173,7 +173,7 @@
 					   "virtual mapping\n" );
 			}
 		}
-		tmp = (unsigned long *)entry->pagelist[i]->virtual;
+		tmp = page_address( entry->pagelist[i] );
 		for(j = 0 ;
 		    j < PAGE_SIZE / sizeof(unsigned long) ;
 		    j++, tmp++) {
diff -u --recursive --new-file v2.4.8/linux/drivers/char/drm/drm_vm.h linux/drivers/char/drm/drm_vm.h
--- v2.4.8/linux/drivers/char/drm/drm_vm.h	Sun Aug 12 13:27:59 2001
+++ linux/drivers/char/drm/drm_vm.h	Sun Aug 12 19:02:22 2001
@@ -86,12 +86,12 @@
 #else
 	drm_map_t	 *map	 = (drm_map_t *)vma->vm_pte;
 #endif
-	unsigned long	 physical;
 	unsigned long	 offset;
 	unsigned long	 i;
 	pgd_t		 *pgd;
 	pmd_t		 *pmd;
 	pte_t		 *pte;
+	struct page	 *page;
 
 	if (address > vma->vm_end) return NOPAGE_SIGBUS; /* Disallow mremap */
 	if (!map)    		   return NOPAGE_OOM;  /* Nothing allocated */
@@ -107,14 +107,15 @@
 	if( !pmd_present( *pmd ) ) return NOPAGE_OOM;
 	pte = pte_offset( pmd, i );
 	if( !pte_present( *pte ) ) return NOPAGE_OOM;
-	physical = (unsigned long)pte_page( *pte )->virtual;
-	atomic_inc(&virt_to_page(physical)->count); /* Dec. by kernel */
 
-	DRM_DEBUG("0x%08lx => 0x%08lx\n", address, physical);
+	page = pte_page(*pte);
+	get_page(page);
+
+	DRM_DEBUG("0x%08lx => 0x%08x\n", address, page_to_bus(page));
 #if LINUX_VERSION_CODE < 0x020317
-	return physical;
+	return page_address(page);
 #else
-	return virt_to_page(physical);
+	return page;
 #endif
 }
 
diff -u --recursive --new-file v2.4.8/linux/drivers/char/drm/ffb_context.c linux/drivers/char/drm/ffb_context.c
--- v2.4.8/linux/drivers/char/drm/ffb_context.c	Sun Aug 12 13:27:59 2001
+++ linux/drivers/char/drm/ffb_context.c	Sun Aug 12 11:23:32 2001
@@ -1,4 +1,4 @@
-/* $Id: ffb_context.c,v 1.4 2000/08/29 07:01:55 davem Exp $
+/* $Id: ffb_context.c,v 1.5 2001/08/09 17:47:51 davem Exp $
  * ffb_context.c: Creator/Creator3D DRI/DRM context switching.
  *
  * Copyright (C) 2000 David S. Miller (davem@redhat.com)
@@ -357,8 +357,6 @@
 int DRM(context_switch)(drm_device_t *dev, int old, int new)
 {
 	ffb_dev_priv_t *fpriv = (ffb_dev_priv_t *) dev->dev_private;
-
-        atomic_inc(&dev->total_ctx);
 
 #if DRM_DMA_HISTOGRAM
         dev->ctx_start = get_cycles();
diff -u --recursive --new-file v2.4.8/linux/drivers/char/drm/ffb_drv.c linux/drivers/char/drm/ffb_drv.c
--- v2.4.8/linux/drivers/char/drm/ffb_drv.c	Sun Aug 12 13:27:59 2001
+++ linux/drivers/char/drm/ffb_drv.c	Sun Aug 12 11:23:32 2001
@@ -1,4 +1,4 @@
-/* $Id: ffb_drv.c,v 1.14 2001/05/24 12:01:47 davem Exp $
+/* $Id: ffb_drv.c,v 1.15 2001/08/09 17:47:51 davem Exp $
  * ffb_drv.c: Creator/Creator3D direct rendering driver.
  *
  * Copyright (C) 2000 David S. Miller (davem@redhat.com)
@@ -73,7 +73,7 @@
 } while(0)
 
 /* For mmap customization */
-#define DRIVER_GET_MAP_OFS	(map->offset & 0xffffffff)
+#define DRIVER_GET_MAP_OFS()	(map->offset & 0xffffffff)
 #define DRIVER_GET_REG_OFS()	ffb_get_reg_offset(dev)
 
 typedef struct _ffb_position_t {
@@ -190,37 +190,6 @@
 	return 0;
 }
 
-static int ffb_presetup(drm_device_t *dev)
-{
-	ffb_dev_priv_t	*ffb_priv;
-	drm_device_t *temp_dev;
-	int ret = 0;
-	int i;
-
-	/* Check for the case where no device was found. */
-	if(ffb_position == NULL) return -ENODEV;
-
-	/* Find our instance number by finding our device in dev structure */
-	for(i = 0; i < DRM(numdevs); i++) {
-		temp_dev = &(DRM(device)[i]);
-		if(temp_dev == dev) break;
-	}
-	if(i == DRM(numdevs)) {
-		return -ENODEV;
-	}
-
-	ffb_priv = kmalloc(sizeof(ffb_dev_priv_t), GFP_KERNEL);
-	if(!ffb_priv) return -ENOMEM;
-	memset(ffb_priv, 0, sizeof(*ffb_priv));
-	dev->dev_private = ffb_priv;
-
-	ret = ffb_init_one(dev,
-			   ffb_position[i].node,
-			   ffb_position[i].root,
-			   i);
-	return ret;
-}
-
 static int __init ffb_count_siblings(int root)
 {
 	int node, child, count = 0;
@@ -248,6 +217,8 @@
 	return instance;
 }
 
+static int ffb_presetup(drm_device_t *);
+
 static int __init ffb_count_card_instances(void)
 {
 	int root, total, instance;
@@ -263,7 +234,8 @@
 	/* Actual failure will be caught during ffb_presetup b/c we can't catch
 	 * it easily here.
 	 */
-	if(!ffb_position) return -ENOMEM;
+	if (!ffb_position)
+		return -ENOMEM;
 
 	instance = ffb_scan_siblings(prom_root_node, 0);
 
@@ -291,9 +263,11 @@
 
 		r_list = (drm_map_list_t *)list;
 		map = r_list->map;
-		if (!map) continue;
+		if (!map)
+			continue;
 		uoff = (map->offset & 0xffffffff);
-		if (uoff == off) return map;
+		if (uoff == off)
+			return map;
 	}
 
 	return NULL;
@@ -347,9 +321,9 @@
 {
 	ffb_dev_priv_t *ffb_priv = (ffb_dev_priv_t *)dev->dev_private;
 
-	if(ffb_priv) {
+	if (ffb_priv)
 		return ffb_priv->card_phys_base;
-	}
+
 	return 0;
 }
 
@@ -359,6 +333,43 @@
 #include "drm_drawable.h"
 #include "drm_drv.h"
 
+/* This functions must be here since it references DRM(numdevs)
+ * which drm_drv.h declares.
+ */
+static int ffb_presetup(drm_device_t *dev)
+{
+	ffb_dev_priv_t	*ffb_priv;
+	drm_device_t *temp_dev;
+	int ret = 0;
+	int i;
+
+	/* Check for the case where no device was found. */
+	if (ffb_position == NULL)
+		return -ENODEV;
+
+	/* Find our instance number by finding our device in dev structure */
+	for (i = 0; i < DRM(numdevs); i++) {
+		temp_dev = &(DRM(device)[i]);
+		if(temp_dev == dev)
+			break;
+	}
+
+	if (i == DRM(numdevs))
+		return -ENODEV;
+
+	ffb_priv = kmalloc(sizeof(ffb_dev_priv_t), GFP_KERNEL);
+	if (!ffb_priv)
+		return -ENOMEM;
+	memset(ffb_priv, 0, sizeof(*ffb_priv));
+	dev->dev_private = ffb_priv;
+
+	ret = ffb_init_one(dev,
+			   ffb_position[i].node,
+			   ffb_position[i].root,
+			   i);
+	return ret;
+}
+
 #ifndef MODULE
 /* DRM(options) is called by the kernel to parse command-line options
  * passed via the boot-loader (e.g., LILO).  It calls the insmod option
@@ -369,13 +380,13 @@
  * anyone can think of a way that we can fit into the __setup macro without
  * changing it, then please send the solution my way.
  */
-static int __init ffb_options( char *str )
+static int __init ffb_options(char *str)
 {
-	DRM(parse_options)( str );
+	DRM(parse_options)(str);
 	return 1;
 }
 
-__setup( DRIVER_NAME "=", ffb_options );
+__setup(DRIVER_NAME "=", ffb_options);
 #endif
 
 #include "drm_fops.h"
diff -u --recursive --new-file v2.4.8/linux/drivers/char/drm/r128_cce.c linux/drivers/char/drm/r128_cce.c
--- v2.4.8/linux/drivers/char/drm/r128_cce.c	Sun Aug 12 13:27:59 2001
+++ linux/drivers/char/drm/r128_cce.c	Sun Aug 12 11:55:12 2001
@@ -351,10 +351,10 @@
 		page_ofs = tmp_ofs >> PAGE_SHIFT;
 
 		R128_WRITE( R128_PM4_BUFFER_DL_RPTR_ADDR,
-			    virt_to_bus(entry->pagelist[page_ofs]->virtual));
+			    page_to_bus(entry->pagelist[page_ofs]));
 
 		DRM_DEBUG( "ring rptr: offset=0x%08lx handle=0x%08lx\n",
-			   virt_to_bus(entry->pagelist[page_ofs]->virtual),
+			   page_to_bus(entry->pagelist[page_ofs]),
 			   entry->handle + tmp_ofs );
 	}
 
diff -u --recursive --new-file v2.4.8/linux/drivers/char/drm/radeon_cp.c linux/drivers/char/drm/radeon_cp.c
--- v2.4.8/linux/drivers/char/drm/radeon_cp.c	Sun Aug 12 13:27:59 2001
+++ linux/drivers/char/drm/radeon_cp.c	Sun Aug 12 13:29:02 2001
@@ -624,10 +624,10 @@
 		page_ofs = tmp_ofs >> PAGE_SHIFT;
 
 		RADEON_WRITE( RADEON_CP_RB_RPTR_ADDR,
-			      virt_to_bus(entry->pagelist[page_ofs]->virtual));
+			      page_to_bus(entry->pagelist[page_ofs]));
 
-		DRM_DEBUG( "ring rptr: offset=0x%08lx handle=0x%08lx\n",
-			   virt_to_bus(entry->pagelist[page_ofs]->virtual),
+		DRM_DEBUG( "ring rptr: offset=0x%08x handle=0x%08lx\n",
+			   page_to_bus(entry->pagelist[page_ofs]),
 			   entry->handle + tmp_ofs );
 	}
 
diff -u --recursive --new-file v2.4.8/linux/drivers/char/lp.c linux/drivers/char/lp.c
--- v2.4.8/linux/drivers/char/lp.c	Wed Jul 25 17:10:19 2001
+++ linux/drivers/char/lp.c	Sun Aug 12 12:31:28 2001
@@ -147,6 +147,10 @@
 
 static unsigned int lp_count = 0;
 
+#ifdef CONFIG_LP_CONSOLE
+static struct parport *console_registered; // initially NULL
+#endif /* CONFIG_LP_CONSOLE */
+
 #undef LP_DEBUG
 
 /* --- low-level port access ----------------------------------- */
@@ -674,8 +678,8 @@
 #ifdef CONFIG_LP_CONSOLE
 	if (!nr) {
 		if (port->modes & PARPORT_MODE_SAFEININT) {
-			MOD_INC_USE_COUNT;
 			register_console (&lpcons);
+			console_registered = port;
 			printk (KERN_INFO "lp%d: console ready\n", CONSOLE_LP);
 		} else
 			printk (KERN_ERR "lp%d: cannot run console on %s\n",
@@ -720,6 +724,12 @@
 static void lp_detach (struct parport *port)
 {
 	/* Write this some day. */
+#ifdef CONFIG_LP_CONSOLE
+	if (console_registered == port) {
+		unregister_console (&lpcons);
+		console_registered = NULL;
+	}
+#endif /* CONFIG_LP_CONSOLE */
 }
 
 static struct parport_driver lp_driver = {
diff -u --recursive --new-file v2.4.8/linux/drivers/char/pc_keyb.c linux/drivers/char/pc_keyb.c
--- v2.4.8/linux/drivers/char/pc_keyb.c	Fri Apr  6 10:42:55 2001
+++ linux/drivers/char/pc_keyb.c	Sun Aug 12 11:13:59 2001
@@ -533,6 +533,86 @@
 	}
 }
 
+#define DEFAULT_KEYB_REP_DELAY	250
+#define DEFAULT_KEYB_REP_RATE	30	/* cps */
+
+static struct kbd_repeat kbdrate={
+	DEFAULT_KEYB_REP_DELAY,
+	DEFAULT_KEYB_REP_RATE
+};
+
+static unsigned char parse_kbd_rate(struct kbd_repeat *r)
+{
+	static struct r2v{
+		int rate;
+		unsigned char val;
+	} kbd_rates[]={	{5,0x14},
+			{7,0x10},
+			{10,0x0c},
+			{15,0x08},
+			{20,0x04},
+			{25,0x02},
+			{30,0x00}
+	};
+	static struct d2v{
+		int delay;
+		unsigned char val;
+	} kbd_delays[]={{250,0},
+			{500,1},
+			{750,2},
+			{1000,3}
+	};
+	int rate=0,delay=0;
+	if (r != NULL){
+		int i,new_rate=30,new_delay=250;
+		if (r->rate <= 0)
+			r->rate=kbdrate.rate;
+		if (r->delay <= 0)
+			r->delay=kbdrate.delay;
+		for (i=0; i < sizeof(kbd_rates)/sizeof(struct r2v); i++)
+			if (kbd_rates[i].rate == r->rate){
+				new_rate=kbd_rates[i].rate;
+				rate=kbd_rates[i].val;
+				break;
+			}
+		for (i=0; i < sizeof(kbd_delays)/sizeof(struct d2v); i++)
+			if (kbd_delays[i].delay == r->delay){
+				new_delay=kbd_delays[i].delay;
+				delay=kbd_delays[i].val;
+				break;
+			}
+		r->rate=new_rate;
+		r->delay=new_delay;
+	}
+	return (delay << 5) | rate;
+}
+
+static int write_kbd_rate(unsigned char r)
+{
+	if (!send_data(KBD_CMD_SET_RATE) || !send_data(r)){
+		send_data(KBD_CMD_ENABLE); 	/* re-enable kbd if any errors */
+		return 0;
+	}else
+		return 1;
+}
+
+int pckbd_rate(struct kbd_repeat *rep)
+{
+	if (rep == NULL)
+		return -EINVAL;
+	else{
+		unsigned char r=parse_kbd_rate(rep);
+		struct kbd_repeat old_rep;
+		memcpy(&old_rep,&kbdrate,sizeof(struct kbd_repeat));
+		if (write_kbd_rate(r)){
+			memcpy(&kbdrate,rep,sizeof(struct kbd_repeat));
+			memcpy(rep,&old_rep,sizeof(struct kbd_repeat));
+			return 0;
+		}
+	}
+	return -EIO;
+}
+
 /*
  * In case we run on a non-x86 hardware we need to initialize both the
  * keyboard controller and the keyboard.  On a x86, the BIOS will
diff -u --recursive --new-file v2.4.8/linux/drivers/char/pcmcia/serial_cs.c linux/drivers/char/pcmcia/serial_cs.c
--- v2.4.8/linux/drivers/char/pcmcia/serial_cs.c	Fri Feb 16 16:02:35 2001
+++ linux/drivers/char/pcmcia/serial_cs.c	Sun Aug 12 11:14:00 2001
@@ -357,6 +357,7 @@
 
 found_port:
     if (i != CS_SUCCESS) {
+	printk(KERN_NOTICE "serial_cs: no usable port range found, giving up\n");
 	cs_error(link->handle, RequestIO, i);
 	return -1;
     }
@@ -436,6 +437,7 @@
     
     i = CardServices(RequestIRQ, link->handle, &link->irq);
     if (i != CS_SUCCESS) {
+	printk(KERN_NOTICE "serial_cs: no usable port range found, giving up\n");
 	cs_error(link->handle, RequestIRQ, i);
 	link->irq.AssignedIRQ = 0;
     }
diff -u --recursive --new-file v2.4.8/linux/drivers/char/ppdev.c linux/drivers/char/ppdev.c
--- v2.4.8/linux/drivers/char/ppdev.c	Sat May 19 18:07:04 2001
+++ linux/drivers/char/ppdev.c	Sun Aug 12 10:38:48 2001
@@ -104,11 +104,6 @@
 	port->ops->enable_irq (port);
 }
 
-static loff_t pp_lseek (struct file * file, long long offset, int origin)
-{
-	return -ESPIPE;
-}
-
 static ssize_t pp_read (struct file * file, char * buf, size_t count,
 			loff_t * ppos)
 {
@@ -726,7 +721,7 @@
 
 static struct file_operations pp_fops = {
 	owner:		THIS_MODULE,
-	llseek:		pp_lseek,
+	llseek:		no_llseek,
 	read:		pp_read,
 	write:		pp_write,
 	poll:		pp_poll,
diff -u --recursive --new-file v2.4.8/linux/drivers/char/rtc.c linux/drivers/char/rtc.c
--- v2.4.8/linux/drivers/char/rtc.c	Tue Jul  3 17:08:19 2001
+++ linux/drivers/char/rtc.c	Sun Aug 12 10:38:48 2001
@@ -94,8 +94,6 @@
 
 static struct timer_list rtc_irq_timer;
 
-static loff_t rtc_llseek(struct file *file, loff_t offset, int origin);
-
 static ssize_t rtc_read(struct file *file, char *buf,
 			size_t count, loff_t *ppos);
 
@@ -189,11 +187,6 @@
  *	Now all the various file operations that we export.
  */
 
-static loff_t rtc_llseek(struct file *file, loff_t offset, int origin)
-{
-	return -ESPIPE;
-}
-
 static ssize_t rtc_read(struct file *file, char *buf,
 			size_t count, loff_t *ppos)
 {
@@ -597,7 +590,7 @@
 
 static struct file_operations rtc_fops = {
 	owner:		THIS_MODULE,
-	llseek:		rtc_llseek,
+	llseek:		no_llseek,
 	read:		rtc_read,
 #if RTC_IRQ
 	poll:		rtc_poll,
@@ -710,15 +703,24 @@
 	if (!(ctrl & RTC_DM_BINARY) || RTC_ALWAYS_BCD)
 		BCD_TO_BIN(year);       /* This should never happen... */
 	
-	if (year >= 20 && year < 48) {
+	if (year < 20) {
+		epoch = 2000;
+		guess = "SRM (post-2000)";
+	} else if (year >= 20 && year < 48) {
 		epoch = 1980;
 		guess = "ARC console";
 	} else if (year >= 48 && year < 70) {
 		epoch = 1952;
 		guess = "Digital UNIX";
+#if defined(__mips__)
 	} else if (year >= 70 && year < 100) {
 		epoch = 1928;
 		guess = "Digital DECstation";
+#else
+	} else if (year >= 70) {
+		epoch = 1900;
+		guess = "Standard PC (1900)";
+#endif
 	}
 	if (guess)
 		printk(KERN_INFO "rtc: %s epoch (%lu) detected\n", guess, epoch);
diff -u --recursive --new-file v2.4.8/linux/drivers/char/sbc60xxwdt.c linux/drivers/char/sbc60xxwdt.c
--- v2.4.8/linux/drivers/char/sbc60xxwdt.c	Sun Aug 12 13:27:59 2001
+++ linux/drivers/char/sbc60xxwdt.c	Sun Aug 12 10:38:48 2001
@@ -229,11 +229,6 @@
 	return 0;
 }
 
-static long long fop_llseek(struct file *file, long long offset, int origin)
-{
-	return -ESPIPE;
-}
-
 static int fop_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
 	unsigned long arg)
 {
@@ -258,7 +253,7 @@
 
 static struct file_operations wdt_fops = {
 	owner:		THIS_MODULE,
-	llseek:		fop_llseek,
+	llseek:		no_llseek,
 	read:		fop_read,
 	write:		fop_write,
 	open:		fop_open,
diff -u --recursive --new-file v2.4.8/linux/drivers/char/tpqic02.c linux/drivers/char/tpqic02.c
--- v2.4.8/linux/drivers/char/tpqic02.c	Fri Mar  2 18:38:37 2001
+++ linux/drivers/char/tpqic02.c	Sun Aug 12 10:38:48 2001
@@ -1734,12 +1734,6 @@
 } /* qic02_tape_interrupt */
 
 
-static long long qic02_tape_lseek(struct file * file, long long offset, int origin)
-{
-	return -EINVAL;	/* not supported */
-} /* qic02_tape_lseek */
-
-
 /* read/write routines:
  * This code copies between a kernel buffer and a user buffer. The 
  * actual data transfer is done using DMA and interrupts. Time-outs
@@ -2766,7 +2760,7 @@
 /* These are (most) of the interface functions: */
 static struct file_operations qic02_tape_fops = {
 	owner:		THIS_MODULE,
-	llseek:		qic02_tape_lseek,	/* not allowed */
+	llseek:		no_llseek,
 	read:		qic02_tape_read,
 	write:		qic02_tape_write,
 	ioctl:		qic02_tape_ioctl,
diff -u --recursive --new-file v2.4.8/linux/drivers/char/tty_io.c linux/drivers/char/tty_io.c
--- v2.4.8/linux/drivers/char/tty_io.c	Wed Jul 25 17:10:20 2001
+++ linux/drivers/char/tty_io.c	Sun Aug 12 17:36:24 2001
@@ -105,7 +105,6 @@
 #ifdef CONFIG_VT
 extern void con_init_devfs (void);
 #endif
-extern int rio_init(void);
 
 #define CONSOLE_DEV MKDEV(TTY_MAJOR,0)
 #define TTY_DEV MKDEV(TTYAUX_MAJOR,0)
@@ -154,7 +153,7 @@
 extern void con3215_init(void);
 extern void tty3215_init(void);
 extern void tub3270_con_init(void);
-extern void tub3270_initfunc(void);
+extern void tub3270_init(void);
 extern void rs285_console_init(void);
 extern void sa1100_rs_console_init(void);
 extern void sgi_serial_console_init(void);
@@ -400,13 +399,8 @@
 	return cmd == TIOCSPGRP ? -ENOTTY : -EIO;
 }
 
-static loff_t tty_lseek(struct file * file, loff_t offset, int orig)
-{
-	return -ESPIPE;
-}
-
 static struct file_operations tty_fops = {
-	llseek:		tty_lseek,
+	llseek:		no_llseek,
 	read:		tty_read,
 	write:		tty_write,
 	poll:		tty_poll,
@@ -417,7 +411,7 @@
 };
 
 static struct file_operations hung_up_tty_fops = {
-	llseek:		tty_lseek,
+	llseek:		no_llseek,
 	read:		hung_up_tty_read,
 	write:		hung_up_tty_write,
 	poll:		hung_up_tty_poll,
@@ -2194,7 +2188,9 @@
 #if (defined(CONFIG_8xx) || defined(CONFIG_8260))
 	console_8xx_init();
 #elif defined(CONFIG_MAC_SERIAL)
-	mac_scc_console_init();
+ 	mac_scc_console_init();
+#elif defined(CONFIG_PARISC)
+	pdc_console_init();
 #elif defined(CONFIG_SERIAL)
 	serial_console_init();
 #endif /* CONFIG_8xx */
@@ -2211,15 +2207,18 @@
 	sci_console_init();
 #endif
 #endif
-#ifdef CONFIG_3215
-        con3215_init();
-#endif
-#ifdef CONFIG_3270_CONSOLE
+#ifdef CONFIG_TN3270_CONSOLE
 	tub3270_con_init();
 #endif
+#ifdef CONFIG_TN3215
+	con3215_init();
+#endif
 #ifdef CONFIG_HWC
         hwc_console_init();
 #endif
+#ifdef CONFIG_STDIO_CONSOLE
+	stdio_console_init();
+#endif
 #ifdef CONFIG_SERIAL_21285_CONSOLE
 	rs285_console_init();
 #endif
@@ -2309,6 +2308,7 @@
 
 	kbd_init();
 #endif
+
 #ifdef CONFIG_ESPSERIAL  /* init ESP before rs, so rs doesn't see the port */
 	espserial_init();
 #endif
@@ -2342,9 +2342,6 @@
 #ifdef CONFIG_SPECIALIX
 	specialix_init();
 #endif
-#ifdef CONFIG_RIO
-	rio_init();
-#endif
 #if (defined(CONFIG_8xx) || defined(CONFIG_8260))
 	rs_8xx_init();
 #endif /* CONFIG_8xx */
@@ -2358,10 +2355,10 @@
 #ifdef CONFIG_VT
 	vcs_init();
 #endif
-#ifdef CONFIG_3270
-	tub3270_initfunc();
+#ifdef CONFIG_TN3270
+	tub3270_init();
 #endif
-#ifdef CONFIG_3215
+#ifdef CONFIG_TN3215
 	tty3215_init();
 #endif
 #ifdef CONFIG_HWC
diff -u --recursive --new-file v2.4.8/linux/drivers/char/tty_ioctl.c linux/drivers/char/tty_ioctl.c
--- v2.4.8/linux/drivers/char/tty_ioctl.c	Wed Mar 15 19:48:06 2000
+++ linux/drivers/char/tty_ioctl.c	Sun Aug 12 17:37:53 2001
@@ -47,7 +47,7 @@
 #ifdef TTY_DEBUG_WAIT_UNTIL_SENT
 	char buf[64];
 	
-	printk("%s wait until sent...\n", tty_name(tty, buf));
+	printk(KERN_DEBUG "%s wait until sent...\n", tty_name(tty, buf));
 #endif
 	if (!tty->driver.chars_in_buffer)
 		return;
@@ -56,7 +56,7 @@
 		timeout = MAX_SCHEDULE_TIMEOUT;
 	do {
 #ifdef TTY_DEBUG_WAIT_UNTIL_SENT
-		printk("waiting %s...(%d)\n", tty_name(tty, buf),
+		printk(KERN_DEBUG "waiting %s...(%d)\n", tty_name(tty, buf),
 		       tty->driver.chars_in_buffer(tty));
 #endif
 		set_current_state(TASK_INTERRUPTIBLE);
@@ -82,7 +82,7 @@
 #define NOSET_MASK(x,y,z) (x = ((x) & ~(z)) | ((y) & (z)))
 
 	if (!locked) {
-		printk("Warning?!? termios_locked is NULL.\n");
+		printk(KERN_WARNING "Warning?!? termios_locked is NULL.\n");
 		return;
 	}
 
diff -u --recursive --new-file v2.4.8/linux/drivers/char/vt.c linux/drivers/char/vt.c
--- v2.4.8/linux/drivers/char/vt.c	Fri Feb  9 11:30:22 2001
+++ linux/drivers/char/vt.c	Sun Aug 12 17:37:53 2001
@@ -7,6 +7,7 @@
  *  Dynamic keymap and string allocation - aeb@cwi.nl - May 1994
  *  Restrict VT switching via ioctl() - grif@cs.ucr.edu - Dec 1995
  *  Some code moved for less code duplication - Andi Kleen - Mar 1997
+ *  Check put/get_user, cleanups - acme@conectiva.com.br - Jun 2001
  */
 
 #include <linux/config.h>
@@ -23,13 +24,11 @@
 #include <linux/major.h>
 #include <linux/fs.h>
 #include <linux/console.h>
+#include <linux/irq.h>
 
 #include <asm/io.h>
 #include <asm/uaccess.h>
-
-#if defined(__mc68000__) || defined(CONFIG_APUS)
-#include <asm/machdep.h>
-#endif
+#include <asm/keyboard.h>
 
 #include <linux/kbd_kern.h>
 #include <linux/vt_kern.h>
@@ -289,8 +288,10 @@
 		p = func_table[i];
 		if(p)
 			for ( ; *p && sz; p++, sz--)
-				put_user(*p, q++);
-		put_user('\0', q);
+				if (put_user(*p, q++))
+					return -EFAULT;
+		if (put_user('\0', q))
+			return -EFAULT;
 		return ((p && *p) ? -EOVERFLOW : 0);
 	case KDSKBSENT:
 		if (!perm)
@@ -497,26 +498,26 @@
 				  (cmd == KDENABIO)) ? -ENXIO : 0;
 #endif
 
-#if defined(__mc68000__) || defined(CONFIG_APUS)
-	/* Linux/m68k interface for setting the keyboard delay/repeat rate */
+	/* Linux m68k/i386 interface for setting the keyboard delay/repeat rate */
 		
 	case KDKBDREP:
 	{
 		struct kbd_repeat kbrep;
 		
-		if (!mach_kbdrate) return( -EINVAL );
-		if (!suser()) return( -EPERM );
+		if (!kbd_rate) return( -EINVAL );
+		if (!capable(CAP_SYS_ADMIN))
+			return -EPERM;
 
 		if (copy_from_user(&kbrep, (void *)arg,
 				   sizeof(struct kbd_repeat)))
 			return -EFAULT;
-		if ((i = mach_kbdrate( &kbrep ))) return( i );
+		if ((i = kbd_rate( &kbrep )))
+			return i;
 		if (copy_to_user((void *)arg, &kbrep,
 				 sizeof(struct kbd_repeat)))
 			return -EFAULT;
 		return 0;
 	}
-#endif
 
 	case KDSETMODE:
 		/*
@@ -741,10 +742,8 @@
 		struct vt_stat *vtstat = (struct vt_stat *)arg;
 		unsigned short state, mask;
 
-		i = verify_area(VERIFY_WRITE,(void *)vtstat, sizeof(struct vt_stat));
-		if (i)
-			return i;
-		put_user(fg_console + 1, &vtstat->v_active);
+		if (put_user(fg_console + 1, &vtstat->v_active))
+			return -EFAULT;
 		state = 1;	/* /dev/tty0 is always open */
 		for (i = 0, mask = 2; i < MAX_NR_CONSOLES && mask; ++i, mask <<= 1)
 			if (VT_IS_IN_USE(i))
@@ -880,11 +879,9 @@
 		ushort ll,cc;
 		if (!perm)
 			return -EPERM;
-		i = verify_area(VERIFY_READ, (void *)vtsizes, sizeof(struct vt_sizes));
-		if (i)
-			return i;
-		get_user(ll, &vtsizes->v_rows);
-		get_user(cc, &vtsizes->v_cols);
+		if (get_user(ll, &vtsizes->v_rows) ||
+		    get_user(cc, &vtsizes->v_cols))
+			return -EFAULT;
 		return vc_resize_all(ll, cc);
 	}
 
@@ -894,15 +891,15 @@
 		ushort ll,cc,vlin,clin,vcol,ccol;
 		if (!perm)
 			return -EPERM;
-		i = verify_area(VERIFY_READ, (void *)vtconsize, sizeof(struct vt_consize));
-		if (i)
-			return i;
-		get_user(ll, &vtconsize->v_rows);
-		get_user(cc, &vtconsize->v_cols);
-		get_user(vlin, &vtconsize->v_vlin);
-		get_user(clin, &vtconsize->v_clin);
-		get_user(vcol, &vtconsize->v_vcol);
-		get_user(ccol, &vtconsize->v_ccol);
+		if (verify_area(VERIFY_READ, (void *)vtconsize,
+				sizeof(struct vt_consize)))
+			return -EFAULT;
+		__get_user(ll, &vtconsize->v_rows);
+		__get_user(cc, &vtconsize->v_cols);
+		__get_user(vlin, &vtconsize->v_vlin);
+		__get_user(clin, &vtconsize->v_clin);
+		__get_user(vcol, &vtconsize->v_vcol);
+		__get_user(ccol, &vtconsize->v_ccol);
 		vlin = vlin ? vlin : video_scan_lines;
 		if ( clin )
 		  {
@@ -1069,10 +1066,6 @@
 
 			if (!perm)
 				return -EPERM;
-			i = verify_area(VERIFY_READ, (void *) arg,
-					sizeof(struct vc_mode));
-			if (i)
-				return i;
 			if (copy_from_user(&mode, (void *) arg, sizeof(mode)))
 				return -EFAULT;
 			return console_setmode(&mode, cmd == VC_SETMODE);
@@ -1090,10 +1083,6 @@
 				   was changed from 0x766a to 0x766c */
 				return console_powermode((int) arg);
 			}
-			i = verify_area(VERIFY_READ, (void *) arg,
-					sizeof(int));
-			if (i)
-				return i;
 			if (get_user(cmap_size, (int *) arg))
 				return -EFAULT;
 			if (cmap_size % 3)
diff -u --recursive --new-file v2.4.8/linux/drivers/char/w83877f_wdt.c linux/drivers/char/w83877f_wdt.c
--- v2.4.8/linux/drivers/char/w83877f_wdt.c	Wed Jul 25 17:10:20 2001
+++ linux/drivers/char/w83877f_wdt.c	Sun Aug 12 10:38:48 2001
@@ -229,11 +229,6 @@
 	return 0;
 }
 
-static long long fop_llseek(struct file *file, long long offset, int origin)
-{
-	return -ESPIPE;
-}
-
 static int fop_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
 	unsigned long arg)
 {
@@ -258,7 +253,7 @@
 
 static struct file_operations wdt_fops = {
 	owner:		THIS_MODULE,
-	llseek:		fop_llseek,
+	llseek:		no_llseek,
 	read:		fop_read,
 	write:		fop_write,
 	open:		fop_open,
diff -u --recursive --new-file v2.4.8/linux/drivers/char/wdt.c linux/drivers/char/wdt.c
--- v2.4.8/linux/drivers/char/wdt.c	Sat May 19 17:43:05 2001
+++ linux/drivers/char/wdt.c	Sun Aug 12 10:38:48 2001
@@ -204,11 +204,6 @@
 }
 
 
-static long long wdt_llseek(struct file *file, long long offset, int origin)
-{
-	return -ESPIPE;
-}
-
 /**
  *	wdt_ping:
  *
@@ -423,7 +418,7 @@
  
 static struct file_operations wdt_fops = {
 	owner:		THIS_MODULE,
-	llseek:		wdt_llseek,
+	llseek:		no_llseek,
 	read:		wdt_read,
 	write:		wdt_write,
 	ioctl:		wdt_ioctl,
diff -u --recursive --new-file v2.4.8/linux/drivers/char/wdt_pci.c linux/drivers/char/wdt_pci.c
--- v2.4.8/linux/drivers/char/wdt_pci.c	Sat May 19 17:43:05 2001
+++ linux/drivers/char/wdt_pci.c	Sun Aug 12 10:38:48 2001
@@ -220,11 +220,6 @@
 }
 
 
-static long long wdtpci_llseek(struct file *file, long long offset, int origin)
-{
-	return -ESPIPE;
-}
-
 /**
  *	wdtpci_ping:
  *
@@ -459,7 +454,7 @@
  
 static struct file_operations wdtpci_fops = {
 	owner:		THIS_MODULE,
-	llseek:		wdtpci_llseek,
+	llseek:		no_llseek,
 	read:		wdtpci_read,
 	write:		wdtpci_write,
 	ioctl:		wdtpci_ioctl,
diff -u --recursive --new-file v2.4.8/linux/drivers/i2c/i2c-dev.c linux/drivers/i2c/i2c-dev.c
--- v2.4.8/linux/drivers/i2c/i2c-dev.c	Wed Jul 25 17:10:20 2001
+++ linux/drivers/i2c/i2c-dev.c	Sun Aug 12 10:38:48 2001
@@ -60,8 +60,6 @@
 
 /* struct file_operations changed too often in the 2.1 series for nice code */
 
-static loff_t i2cdev_lseek (struct file *file, loff_t offset, int origin);
-
 static ssize_t i2cdev_read (struct file *file, char *buf, size_t count, 
                             loff_t *offset);
 static ssize_t i2cdev_write (struct file *file, const char *buf, size_t count, 
@@ -90,7 +88,7 @@
 #if LINUX_KERNEL_VERSION >= KERNEL_VERSION(2,4,0)
 	owner:		THIS_MODULE,
 #endif /* LINUX_KERNEL_VERSION >= KERNEL_VERSION(2,4,0) */
-	llseek:		i2cdev_lseek,
+	llseek:		no_llseek,
 	read:		i2cdev_read,
 	write:		i2cdev_write,
 	ioctl:		i2cdev_ioctl,
@@ -127,18 +125,6 @@
 };
 
 static int i2cdev_initialized;
-
-/* Note that the lseek function is called llseek in 2.1 kernels. But things
-   are complicated enough as is. */
-loff_t i2cdev_lseek (struct file *file, loff_t offset, int origin)
-{
-#ifdef DEBUG
-	struct inode *inode = file->f_dentry->d_inode;
-	printk("i2c-dev.o: i2c-%d lseek to %ld bytes relative to %d.\n",
-	       MINOR(inode->i_rdev),(long) offset,origin);
-#endif /* DEBUG */
-	return -ESPIPE;
-}
 
 static ssize_t i2cdev_read (struct file *file, char *buf, size_t count,
                             loff_t *offset)
diff -u --recursive --new-file v2.4.8/linux/drivers/i2o/i2o_block.c linux/drivers/i2o/i2o_block.c
--- v2.4.8/linux/drivers/i2o/i2o_block.c	Wed Jul 25 17:10:20 2001
+++ linux/drivers/i2o/i2o_block.c	Sun Aug 12 10:52:29 2001
@@ -61,6 +61,7 @@
 
 #include <asm/uaccess.h>
 #include <asm/semaphore.h>
+#include <linux/completion.h>
 #include <asm/io.h>
 #include <asm/atomic.h>
 #include <linux/smp_lock.h>
@@ -187,7 +188,7 @@
  * evt_msg contains the last event.
  */
 static DECLARE_MUTEX_LOCKED(i2ob_evt_sem);
-static DECLARE_MUTEX_LOCKED(i2ob_thread_dead);
+static DECLARE_COMPLETION(i2ob_thread_dead);
 static spinlock_t i2ob_evt_lock = SPIN_LOCK_UNLOCKED;
 static u32 evt_msg[MSG_FRAME_SIZE>>2];
 
@@ -859,7 +860,7 @@
 		}
 	};
 
-	up_and_exit(&i2ob_thread_dead,0);
+	complete_and_exit(&i2ob_thread_dead,0);
 	return 0;
 }
 
@@ -2002,7 +2003,7 @@
 			printk("waiting...");
 		}
 		/* Be sure it died */
-		down(&i2ob_thread_dead);
+		wait_for_completion(&i2ob_thread_dead);
 		printk("done.\n");
 	}
 
diff -u --recursive --new-file v2.4.8/linux/drivers/i2o/i2o_config.c linux/drivers/i2o/i2o_config.c
--- v2.4.8/linux/drivers/i2o/i2o_config.c	Tue May  1 16:10:37 2001
+++ linux/drivers/i2o/i2o_config.c	Sun Aug 12 11:16:18 2001
@@ -183,12 +183,6 @@
 	0xffffffff	// All classes
 };
 
-static long long cfg_llseek(struct file *file, long long offset, int origin)
-{
-	return -ESPIPE;
-}
-
-
 static ssize_t cfg_write(struct file *file, const char *buf, size_t count, loff_t *ppos)
 {
 	printk(KERN_INFO "i2o_config write not yet supported\n");
@@ -899,7 +893,7 @@
 static struct file_operations config_fops =
 {
 	owner:		THIS_MODULE,
-	llseek:		cfg_llseek,
+	llseek:		no_llseek,
 	read:		cfg_read,
 	write:		cfg_write,
 	ioctl:		cfg_ioctl,
diff -u --recursive --new-file v2.4.8/linux/drivers/i2o/i2o_core.c linux/drivers/i2o/i2o_core.c
--- v2.4.8/linux/drivers/i2o/i2o_core.c	Tue May  1 16:10:37 2001
+++ linux/drivers/i2o/i2o_core.c	Sun Aug 12 11:16:18 2001
@@ -43,6 +43,7 @@
 #include <linux/interrupt.h>
 #include <linux/sched.h>
 #include <asm/semaphore.h>
+#include <linux/completion.h>
 
 #include <asm/io.h>
 #include <linux/reboot.h>
@@ -58,15 +59,15 @@
 #endif
 
 /* OSM table */
-static struct i2o_handler *i2o_handlers[MAX_I2O_MODULES] = {NULL};
+static struct i2o_handler *i2o_handlers[MAX_I2O_MODULES];
 
 /* Controller list */
-static struct i2o_controller *i2o_controllers[MAX_I2O_CONTROLLERS] = {NULL};
-struct i2o_controller *i2o_controller_chain = NULL;
-int i2o_num_controllers = 0;
+static struct i2o_controller *i2o_controllers[MAX_I2O_CONTROLLERS];
+struct i2o_controller *i2o_controller_chain;
+int i2o_num_controllers;
 
 /* Initiator Context for Core message */
-static int core_context = 0;
+static int core_context;
 
 /* Initialization && shutdown functions */
 static void i2o_sys_init(void);
@@ -107,9 +108,9 @@
  * sys_tbl_ver is the CurrentChangeIndicator that is
  * used by IOPs to track changes.
  */
-static struct i2o_sys_tbl *sys_tbl = NULL;
-static int sys_tbl_ind = 0;
-static int sys_tbl_len = 0;
+static struct i2o_sys_tbl *sys_tbl;
+static int sys_tbl_ind;
+static int sys_tbl_len;
 
 /*
  * This spin lock is used to keep a device from being
@@ -154,8 +155,8 @@
 	struct i2o_post_wait_data *next;	/* Chain */
 	void *mem[2];		/* Memory blocks to recover on failure path */
 };
-static struct i2o_post_wait_data *post_wait_queue = NULL;
-static u32 post_wait_id = 0;	// Unique ID for each post_wait
+static struct i2o_post_wait_data *post_wait_queue;
+static u32 post_wait_id;	// Unique ID for each post_wait
 static spinlock_t post_wait_lock = SPIN_LOCK_UNLOCKED;
 static void i2o_post_wait_complete(u32, int);
 
@@ -182,9 +183,9 @@
 };
 static struct reply_info evt_reply;
 static struct reply_info events[I2O_EVT_Q_LEN];
-static int evt_in = 0;
-static int evt_out = 0;
-static int evt_q_len = 0;
+static int evt_in;
+static int evt_out;
+static int evt_q_len;
 #define MODINC(x,y) ((x) = ((x) + 1) % (y))
 
 /*
@@ -206,7 +207,7 @@
  */
  
 static DECLARE_MUTEX(evt_sem);
-static DECLARE_MUTEX_LOCKED(evt_dead);
+static DECLARE_COMPLETION(evt_dead);
 DECLARE_WAIT_QUEUE_HEAD(evt_wait);
 
 static struct notifier_block i2o_reboot_notifier =
@@ -220,7 +221,7 @@
  *	Config options
  */
 
-static int verbose = 0;
+static int verbose;
 MODULE_PARM(verbose, "i");
 
 /*
@@ -905,7 +906,7 @@
 			dprintk(KERN_INFO "I2O event thread dead\n");
 			printk("exiting...");
 			evt_running = 0;
-			up_and_exit(&evt_dead, 0);
+			complete_and_exit(&evt_dead, 0);
 		}
 
 		/* 
@@ -1915,11 +1916,71 @@
 	u32 *privbuf = kmalloc(16, GFP_KERNEL);
 	if(privbuf == NULL)
 		return -ENOMEM;
-
-	privbuf[0] = iop->status_block->current_mem_base;
-	privbuf[1] = iop->status_block->current_mem_size;
-	privbuf[2] = iop->status_block->current_io_base;
-	privbuf[3] = iop->status_block->current_io_size;
+	
+	if(iop->type == I2O_TYPE_PCI)
+	{
+		struct resource *root;
+		
+		if(iop->status_block->current_mem_size < iop->status_block->desired_mem_size)
+		{
+			struct resource *res = &iop->mem_resource;
+			res->name = iop->bus.pci.pdev->bus->name;
+			res->flags = IORESOURCE_MEM;
+			res->start = 0;
+			res->end = 0;
+			printk("%s: requires private memory resources.\n", iop->name);
+			root = pci_find_parent_resource(iop->bus.pci.pdev, res);
+			if(root==NULL)
+				printk("Can't find parent resource!\n");
+			if(root && allocate_resource(root, res, 
+					iop->status_block->desired_mem_size,
+					iop->status_block->desired_mem_size,
+					iop->status_block->desired_mem_size,
+					1<<20,	/* Unspecified, so use 1Mb and play safe */
+					NULL,
+					NULL)>=0)
+			{
+				iop->mem_alloc = 1;
+				iop->status_block->current_mem_size = 1 + res->end - res->start;
+				iop->status_block->current_mem_base = res->start;
+				printk(KERN_INFO "%s: allocated %ld bytes of PCI memory at 0x%08lX.\n", 
+					iop->name, 1+res->end-res->start, res->start);
+			}
+		}
+		if(iop->status_block->current_io_size < iop->status_block->desired_io_size)
+		{
+			struct resource *res = &iop->io_resource;
+			res->name = iop->bus.pci.pdev->bus->name;
+			res->flags = IORESOURCE_IO;
+			res->start = 0;
+			res->end = 0;
+			printk("%s: requires private memory resources.\n", iop->name);
+			root = pci_find_parent_resource(iop->bus.pci.pdev, res);
+			if(root==NULL)
+				printk("Can't find parent resource!\n");
+			if(root &&  allocate_resource(root, res, 
+					iop->status_block->desired_io_size,
+					iop->status_block->desired_io_size,
+					iop->status_block->desired_io_size,
+					1<<20,	/* Unspecified, so use 1Mb and play safe */
+					NULL,
+					NULL)>=0)
+			{
+				iop->io_alloc = 1;
+				iop->status_block->current_io_size = 1 + res->end - res->start;
+				iop->status_block->current_mem_base = res->start;
+				printk(KERN_INFO "%s: allocated %ld bytes of PCI I/O at 0x%08lX.\n", 
+					iop->name, 1+res->end-res->start, res->start);
+			}
+		}
+	}
+	else
+	{	
+		privbuf[0] = iop->status_block->current_mem_base;
+		privbuf[1] = iop->status_block->current_mem_size;
+		privbuf[2] = iop->status_block->current_io_base;
+		privbuf[3] = iop->status_block->current_io_size;
+	}
 
 	msg[0] = I2O_MESSAGE_SIZE(12) | SGL_OFFSET_6;
 	msg[1] = I2O_CMD_SYS_TAB_SET<<24 | HOST_TID<<12 | ADAPTER_TID;
@@ -1936,10 +1997,10 @@
  	 */
 	msg[6] = 0x54000000 | sys_tbl_len;
 	msg[7] = virt_to_bus(sys_tbl);
-	msg[8] = 0x54000000 | 0;
+	msg[8] = 0x54000000 | 8;
 	msg[9] = virt_to_bus(privbuf);
-	msg[10] = 0xD4000000 | 0;
-	msg[11] = virt_to_bus(privbuf+8);
+	msg[10] = 0xD4000000 | 8;
+	msg[11] = virt_to_bus(privbuf+2);
 
 	ret=i2o_post_wait_mem(iop, msg, sizeof(msg), 120, privbuf, NULL);
 	
@@ -3427,7 +3488,7 @@
 		stat = kill_proc(evt_pid, SIGTERM, 1);
 		if(!stat) {
 			printk("waiting...");
-			down(&evt_dead);
+			wait_for_completion(&evt_dead);
 		}
 		printk("done.\n");
 	}
diff -u --recursive --new-file v2.4.8/linux/drivers/i2o/i2o_lan.c linux/drivers/i2o/i2o_lan.c
--- v2.4.8/linux/drivers/i2o/i2o_lan.c	Tue Jul  3 17:08:19 2001
+++ linux/drivers/i2o/i2o_lan.c	Sun Aug 12 11:16:18 2001
@@ -28,6 +28,8 @@
 #include <linux/config.h>
 #include <linux/module.h>
 
+#include <linux/pci.h>
+
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
 #include <linux/fddidevice.h>
diff -u --recursive --new-file v2.4.8/linux/drivers/i2o/i2o_pci.c linux/drivers/i2o/i2o_pci.c
--- v2.4.8/linux/drivers/i2o/i2o_pci.c	Tue May  1 16:11:29 2001
+++ linux/drivers/i2o/i2o_pci.c	Sun Aug 12 11:16:18 2001
@@ -159,10 +159,10 @@
 	}
 
 	c->bus.pci.irq = -1;
-
 	c->bus.pci.queue_buggy = 0;
 	c->bus.pci.dpt = 0;
 	c->bus.pci.short_req = 0;
+	c->bus.pci.pdev = dev;
 
 	c->irq_mask = (volatile u32 *)(mem+0x34);
 	c->post_port = (volatile u32 *)(mem+0x40);
@@ -255,7 +255,6 @@
 #else
 			i2o_delete_controller(c);
 #endif /* MODULE */	
-			kfree(c);
 			iounmap(mem);
 			return -EBUSY;
 		}
diff -u --recursive --new-file v2.4.8/linux/drivers/i2o/i2o_proc.c linux/drivers/i2o/i2o_proc.c
--- v2.4.8/linux/drivers/i2o/i2o_proc.c	Tue May  1 16:09:53 2001
+++ linux/drivers/i2o/i2o_proc.c	Sun Aug 12 11:16:18 2001
@@ -40,6 +40,7 @@
 
 #include <linux/types.h>
 #include <linux/kernel.h>
+#include <linux/pci.h>
 #include <linux/i2o.h>
 #include <linux/proc_fs.h>
 #include <linux/init.h>
@@ -942,7 +943,7 @@
 	int token;
 	int i;
 
-	struct
+	typedef struct
 	{
 		u16 result_count;
 		u16 pad;
@@ -952,30 +953,36 @@
 		u16 row_count;
 		u16 more_flag;
 		i2o_driver_store_table dst[MAX_I2O_MODULES];
-	} result;
-
-	i2o_driver_store_table dst;
+	} i2o_driver_result_table;
+	
+	i2o_driver_result_table *result;
+	i2o_driver_store_table *dst;
 
 	spin_lock(&i2o_proc_lock);
 
 	len = 0;
+	
+	result = kmalloc(sizeof(i2o_driver_result_table), GFP_KERNEL);
+	if(result == NULL)
+		return -ENOMEM;
 
 	token = i2o_query_table(I2O_PARAMS_TABLE_GET,
 				c, ADAPTER_TID, 0x0005, -1, NULL, 0, 
-				&result, sizeof(result));
+				result, sizeof(*result));
 
 	if (token < 0) {
 		len += i2o_report_query_status(buf+len, token,"0x0005 DRIVER STORE TABLE");
 		spin_unlock(&i2o_proc_lock);
+		kfree(result);
 		return len;
 	}
 
 	len += sprintf(buf+len, "#  Module_type     Vendor Mod_id  Module_name             Vrs"  
 				"Date     Mod_size Par_size Flags\n");
-	for(i=0, dst=result.dst[0]; i < result.row_count; dst=result.dst[++i])
+	for(i=0, dst=&result->dst[0]; i < result->row_count; dst=&result->dst[++i])
 	{
-		len += sprintf(buf+len, "%-3d", dst.stored_ddm_index);
-		switch(dst.module_type)
+		len += sprintf(buf+len, "%-3d", dst->stored_ddm_index);
+		switch(dst->module_type)
 		{
 		case 0x01:
 			len += sprintf(buf+len, "Downloaded DDM  ");
@@ -989,26 +996,26 @@
 
 #if 0
 		if(c->i2oversion == 0x02)
-			len += sprintf(buf+len, "%-d", dst.module_state);
+			len += sprintf(buf+len, "%-d", dst->module_state);
 #endif
 
-		len += sprintf(buf+len, "%-#7x", dst.i2o_vendor_id);
-		len += sprintf(buf+len, "%-#8x", dst.module_id);
-		len += sprintf(buf+len, "%-29s", chtostr(dst.module_name_version,28));
-		len += sprintf(buf+len, "%-9s", chtostr(dst.date,8));
-		len += sprintf(buf+len, "%8d ", dst.module_size);
-		len += sprintf(buf+len, "%8d ", dst.mpb_size);
-		len += sprintf(buf+len, "0x%04x", dst.module_flags);
+		len += sprintf(buf+len, "%-#7x", dst->i2o_vendor_id);
+		len += sprintf(buf+len, "%-#8x", dst->module_id);
+		len += sprintf(buf+len, "%-29s", chtostr(dst->module_name_version,28));
+		len += sprintf(buf+len, "%-9s", chtostr(dst->date,8));
+		len += sprintf(buf+len, "%8d ", dst->module_size);
+		len += sprintf(buf+len, "%8d ", dst->mpb_size);
+		len += sprintf(buf+len, "0x%04x", dst->module_flags);
 #if 0
 		if(c->i2oversion == 0x02)
 			len += sprintf(buf+len, "%d",
-				       dst.notification_level);
+				       dst->notification_level);
 #endif
 		len += sprintf(buf+len, "\n");
 	}
 
 	spin_unlock(&i2o_proc_lock);
-
+	kfree(result);
 	return len;
 }
 
diff -u --recursive --new-file v2.4.8/linux/drivers/i2o/i2o_scsi.c linux/drivers/i2o/i2o_scsi.c
--- v2.4.8/linux/drivers/i2o/i2o_scsi.c	Tue May  1 16:09:53 2001
+++ linux/drivers/i2o/i2o_scsi.c	Sun Aug 12 11:16:18 2001
@@ -826,7 +826,7 @@
 		m = I2O_POST_READ32(c);
 	}
 	while(m==0xFFFFFFFF);
-	msg = bus_to_virt(c->mem_offset + m);
+	msg = (u32 *)(c->mem_offset + m);
 	
 	__raw_writel(FIVE_WORD_MSG_SIZE, &msg[0]);
 	__raw_writel(I2O_CMD_SCSI_ABORT<<24|HOST_TID<<12|tid, &msg[1]);
@@ -874,13 +874,14 @@
 	if(m == 0xFFFFFFFF)
 		return SCSI_RESET_PUNT;
 	
-	msg = bus_to_virt(c->mem_offset + m);
+	msg = (u32 *)(c->mem_offset + m);
 	__raw_writel(FOUR_WORD_MSG_SIZE|SGL_OFFSET_0, &msg[0]);
 	__raw_writel(I2O_CMD_SCSI_BUSRESET<<24|HOST_TID<<12|tid, &msg[1]);
 	__raw_writel(scsi_context|0x80000000, &msg[2]);
 	/* We use the top bit to split controller and unit transactions */
 	/* Now store unit,tid so we can tie the completion back to a specific device */
 	__raw_writel(c->unit << 16 | tid, &msg[3]);
+	wmb();
 	i2o_post_message(c,m);
 	return SCSI_RESET_PENDING;
 }
diff -u --recursive --new-file v2.4.8/linux/drivers/ide/ide-pci.c linux/drivers/ide/ide-pci.c
--- v2.4.8/linux/drivers/ide/ide-pci.c	Tue Jul  3 17:08:19 2001
+++ linux/drivers/ide/ide-pci.c	Sun Aug 12 15:09:20 2001
@@ -29,13 +29,13 @@
 #define DEVID_PIIXb	((ide_pci_devid_t){PCI_VENDOR_ID_INTEL,   PCI_DEVICE_ID_INTEL_82371FB_1})
 #define DEVID_PIIX3	((ide_pci_devid_t){PCI_VENDOR_ID_INTEL,   PCI_DEVICE_ID_INTEL_82371SB_1})
 #define DEVID_PIIX4	((ide_pci_devid_t){PCI_VENDOR_ID_INTEL,   PCI_DEVICE_ID_INTEL_82371AB})
-#define DEVID_PIIX4E	((ide_pci_devid_t){PCI_VENDOR_ID_INTEL,   PCI_DEVICE_ID_INTEL_82801AB_1})
+#define DEVID_ICH0	((ide_pci_devid_t){PCI_VENDOR_ID_INTEL,   PCI_DEVICE_ID_INTEL_82801AB_1})
 #define DEVID_PIIX4E2	((ide_pci_devid_t){PCI_VENDOR_ID_INTEL,   PCI_DEVICE_ID_INTEL_82443MX_1})
-#define DEVID_PIIX4U	((ide_pci_devid_t){PCI_VENDOR_ID_INTEL,   PCI_DEVICE_ID_INTEL_82801AA_1})
+#define DEVID_ICH	((ide_pci_devid_t){PCI_VENDOR_ID_INTEL,   PCI_DEVICE_ID_INTEL_82801AA_1})
 #define DEVID_PIIX4U2	((ide_pci_devid_t){PCI_VENDOR_ID_INTEL,   PCI_DEVICE_ID_INTEL_82372FB_1})
 #define DEVID_PIIX4NX	((ide_pci_devid_t){PCI_VENDOR_ID_INTEL,   PCI_DEVICE_ID_INTEL_82451NX})
-#define DEVID_PIIX4U3	((ide_pci_devid_t){PCI_VENDOR_ID_INTEL,   PCI_DEVICE_ID_INTEL_82801BA_9})
-#define DEVID_PIIX4U4	((ide_pci_devid_t){PCI_VENDOR_ID_INTEL,   PCI_DEVICE_ID_INTEL_82801BA_8})
+#define DEVID_ICH2	((ide_pci_devid_t){PCI_VENDOR_ID_INTEL,   PCI_DEVICE_ID_INTEL_82801BA_9})
+#define DEVID_ICH2M	((ide_pci_devid_t){PCI_VENDOR_ID_INTEL,   PCI_DEVICE_ID_INTEL_82801BA_8})
 #define DEVID_VIA_IDE	((ide_pci_devid_t){PCI_VENDOR_ID_VIA,     PCI_DEVICE_ID_VIA_82C561})
 #define DEVID_VP_IDE	((ide_pci_devid_t){PCI_VENDOR_ID_VIA,     PCI_DEVICE_ID_VIA_82C586_1})
 #define DEVID_PDC20246	((ide_pci_devid_t){PCI_VENDOR_ID_PROMISE, PCI_DEVICE_ID_PROMISE_20246})
@@ -341,13 +341,13 @@
 	{DEVID_PIIXb,	"PIIX",		NULL,		NULL,		INIT_PIIX,	NULL,		{{0x41,0x80,0x80}, {0x43,0x80,0x80}}, 	ON_BOARD,	0 },
 	{DEVID_PIIX3,	"PIIX3",	PCI_PIIX,	NULL,		INIT_PIIX,	NULL,		{{0x41,0x80,0x80}, {0x43,0x80,0x80}}, 	ON_BOARD,	0 },
 	{DEVID_PIIX4,	"PIIX4",	PCI_PIIX,	NULL,		INIT_PIIX,	NULL,		{{0x41,0x80,0x80}, {0x43,0x80,0x80}}, 	ON_BOARD,	0 },
-	{DEVID_PIIX4E,	"PIIX4",	PCI_PIIX,	NULL,		INIT_PIIX,	NULL,		{{0x41,0x80,0x80}, {0x43,0x80,0x80}},	ON_BOARD,	0 },
+	{DEVID_ICH0,	"ICH0",		PCI_PIIX,	NULL,		INIT_PIIX,	NULL,		{{0x41,0x80,0x80}, {0x43,0x80,0x80}},	ON_BOARD,	0 },
 	{DEVID_PIIX4E2,	"PIIX4",	PCI_PIIX,	NULL,		INIT_PIIX,	NULL,		{{0x41,0x80,0x80}, {0x43,0x80,0x80}},	ON_BOARD,	0 },
-	{DEVID_PIIX4U,	"PIIX4",	PCI_PIIX,	ATA66_PIIX,	INIT_PIIX,	NULL,		{{0x41,0x80,0x80}, {0x43,0x80,0x80}},	ON_BOARD,	0 },
+	{DEVID_ICH,	"ICH",		PCI_PIIX,	ATA66_PIIX,	INIT_PIIX,	NULL,		{{0x41,0x80,0x80}, {0x43,0x80,0x80}},	ON_BOARD,	0 },
 	{DEVID_PIIX4U2,	"PIIX4",	PCI_PIIX,	ATA66_PIIX,	INIT_PIIX,	NULL,		{{0x41,0x80,0x80}, {0x43,0x80,0x80}},	ON_BOARD,	0 },
 	{DEVID_PIIX4NX,	"PIIX4",	PCI_PIIX,	NULL,		INIT_PIIX,	NULL,		{{0x41,0x80,0x80}, {0x43,0x80,0x80}},	ON_BOARD,	0 },
-	{DEVID_PIIX4U3,	"PIIX4",	PCI_PIIX,	ATA66_PIIX,	INIT_PIIX,	NULL,		{{0x41,0x80,0x80}, {0x43,0x80,0x80}},	ON_BOARD,	0 },
-	{DEVID_PIIX4U4, "PIIX4",	PCI_PIIX,	ATA66_PIIX,	INIT_PIIX,	NULL,		{{0x41,0x80,0x80}, {0x43,0x80,0x80}},	ON_BOARD,	0 },
+	{DEVID_ICH2,	"ICH2",		PCI_PIIX,	ATA66_PIIX,	INIT_PIIX,	NULL,		{{0x41,0x80,0x80}, {0x43,0x80,0x80}},	ON_BOARD,	0 },
+	{DEVID_ICH2M,	"ICH2-M",	PCI_PIIX,	ATA66_PIIX,	INIT_PIIX,	NULL,		{{0x41,0x80,0x80}, {0x43,0x80,0x80}},	ON_BOARD,	0 },
 	{DEVID_VIA_IDE,	"VIA_IDE",	NULL,		NULL,		NULL,		NULL,		{{0x00,0x00,0x00}, {0x00,0x00,0x00}},	ON_BOARD,	0 },
 	{DEVID_VP_IDE,	"VP_IDE",	PCI_VIA82CXXX,	ATA66_VIA82CXXX,INIT_VIA82CXXX,	DMA_VIA82CXXX,	{{0x40,0x02,0x02}, {0x40,0x01,0x01}}, 	ON_BOARD,	0 },
 	{DEVID_PDC20246,"PDC20246",	PCI_PDC202XX,	NULL,		INIT_PDC202XX,	NULL,		{{0x50,0x02,0x02}, {0x50,0x04,0x04}}, 	OFF_BOARD,	16 },
@@ -760,7 +760,7 @@
 
 	switch(class_rev) {
 		case 4:
-		case 3:	printk("%s: IDE controller on PCI bus %02x dev %02x\n", d->name, dev->bus->number, dev->devfn);
+		case 3:	printk("%s: IDE controller on PCI slot %s\n", d->name, dev->slot_name);
 			ide_setup_pci_device(dev, d);
 			return;
 		default:	break;
@@ -783,12 +783,12 @@
 			break;
 		}
 	}
-	printk("%s: IDE controller on PCI bus %02x dev %02x\n", d->name, dev->bus->number, dev->devfn);
+	printk("%s: IDE controller on PCI slot %s\n", d->name, dev->slot_name);
 	ide_setup_pci_device(dev, d);
 	if (!dev2)
 		return;
 	d2 = d;
-	printk("%s: IDE controller on PCI bus %02x dev %02x\n", d2->name, dev2->bus->number, dev2->devfn);
+	printk("%s: IDE controller on PCI slot %s\n", d2->name, dev2->slot_name);
 	ide_setup_pci_device(dev2, d2);
 }
 
@@ -816,10 +816,10 @@
 		hpt366_device_order_fixup(dev, d);
 	else if (!IDE_PCI_DEVID_EQ(d->devid, IDE_PCI_DEVID_NULL) || (dev->class >> 8) == PCI_CLASS_STORAGE_IDE) {
 		if (IDE_PCI_DEVID_EQ(d->devid, IDE_PCI_DEVID_NULL))
-			printk("%s: unknown IDE controller on PCI bus %02x device %02x, VID=%04x, DID=%04x\n",
-			       d->name, dev->bus->number, dev->devfn, devid.vid, devid.did);
+			printk("%s: unknown IDE controller on PCI slot %s, VID=%04x, DID=%04x\n",
+			       d->name, dev->slot_name, devid.vid, devid.did);
 		else
-			printk("%s: IDE controller on PCI bus %02x dev %02x\n", d->name, dev->bus->number, dev->devfn);
+			printk("%s: IDE controller on PCI slot %s\n", d->name, dev->slot_name);
 		ide_setup_pci_device(dev, d);
 	}
 }
diff -u --recursive --new-file v2.4.8/linux/drivers/ide/piix.c linux/drivers/ide/piix.c
--- v2.4.8/linux/drivers/ide/piix.c	Wed Jul 25 17:10:20 2001
+++ linux/drivers/ide/piix.c	Sun Aug 12 15:09:20 2001
@@ -107,30 +107,7 @@
 	c0 = inb_p((unsigned short)bibma + 0x02);
 	c1 = inb_p((unsigned short)bibma + 0x0a);
 
-	switch(bmide_dev->device) {
-		case PCI_DEVICE_ID_INTEL_82801BA_8:
-		case PCI_DEVICE_ID_INTEL_82801BA_9:
-			p += sprintf(p, "\n                                Intel PIIX4 Ultra 100 Chipset.\n");
-			break;
-		case PCI_DEVICE_ID_INTEL_82372FB_1:
-		case PCI_DEVICE_ID_INTEL_82801AA_1:
-			p += sprintf(p, "\n                                Intel PIIX4 Ultra 66 Chipset.\n");
-			break;
-		case PCI_DEVICE_ID_INTEL_82451NX:
-		case PCI_DEVICE_ID_INTEL_82801AB_1:
-		case PCI_DEVICE_ID_INTEL_82443MX_1:
-		case PCI_DEVICE_ID_INTEL_82371AB:
-			p += sprintf(p, "\n                                Intel PIIX4 Ultra 33 Chipset.\n");
-			break;
-		case PCI_DEVICE_ID_INTEL_82371SB_1:
-			p += sprintf(p, "\n                                Intel PIIX3 Chipset.\n");
-			break;
-		case PCI_DEVICE_ID_INTEL_82371FB_1:
-		case PCI_DEVICE_ID_INTEL_82371FB_0:
-		default:
-			p += sprintf(p, "\n                                Intel PIIX Chipset.\n");
-			break;
-	}
+	p += sprintf(p, "\n                    %s Chipset.\n", bmide_dev->name);
 	p += sprintf(p, "--------------- Primary Channel ---------------- Secondary Channel -------------\n");
 	p += sprintf(p, "                %sabled                         %sabled\n",
 			(c0&0x80) ? "dis" : " en",
diff -u --recursive --new-file v2.4.8/linux/drivers/ide/via82cxxx.c linux/drivers/ide/via82cxxx.c
--- v2.4.8/linux/drivers/ide/via82cxxx.c	Sat Feb  3 11:27:43 2001
+++ linux/drivers/ide/via82cxxx.c	Sun Aug 12 11:14:00 2001
@@ -1,5 +1,5 @@
 /*
- * $Id: via82cxxx.c,v 3.20 2001/01/27 10:13:60 vojtech Exp $
+ * $Id: via82cxxx.c,v 3.23 2001/03/09 09:30:00 vojtech Exp $
  *
  *  Copyright (c) 2000-2001 Vojtech Pavlik
  *
@@ -32,14 +32,9 @@
  *   PIO 0-5, MWDMA 0-2, SWDMA 0-2 and UDMA 0-5
  *
  * (this includes UDMA33, 66 and 100) modes. UDMA66 and higher modes are
- * autodetected only in case the BIOS has detected a 80 wire cable. To ignore
- * the BIOS data, use 'ide0=ata66' or 'ide1=ata66' on the kernel command line.
- *
- * For correct operation it's needed to tell the driver the speed of the PCI
- * bus. The default, and most common value is 33 MHz. Most likely, your system
- * is using this value and you don't need to use any command line options. If
- * you run your PCI bus speed at 25, 30, 37, 40 or 42 MHz, use the 'idebus=xx'
- * option of the IDE driver. Note that this has nothing to do with UDMA66.
+ * autoenabled only in case the BIOS has detected a 80 wire cable. To ignore
+ * the BIOS data and assume the cable is present, use 'ide0=ata66' or
+ * 'ide1=ata66' on the kernel command line.
  */
 
 /*
@@ -84,15 +79,16 @@
 #define VIA_ADDRESS_SETUP	0x4c
 #define VIA_UDMA_TIMING		0x50
 
-#define VIA_UDMA		0x07
-#define VIA_UDMA_NONE		0x00
-#define VIA_UDMA_33		0x01
-#define VIA_UDMA_66		0x02
-#define VIA_UDMA_100		0x03
-#define VIA_BAD_PREQ		0x10
-#define VIA_BAD_CLK66		0x20
-#define VIA_SET_FIFO		0x40
-#define VIA_SET_THRESH		0x80
+#define VIA_UDMA		0x007
+#define VIA_UDMA_NONE		0x000
+#define VIA_UDMA_33		0x001
+#define VIA_UDMA_66		0x002
+#define VIA_UDMA_100		0x003
+#define VIA_BAD_PREQ		0x010	/* Crashes if PREQ# till DDACK# set */
+#define VIA_BAD_CLK66		0x020	/* 66 MHz clock doesn't work correctly */
+#define VIA_SET_FIFO		0x040	/* Needs to have FIFO split set */
+#define VIA_SET_THRESH		0x080	/* Needs to have FIFO thresholds set */
+#define VIA_BAD_PIO		0x100	/* Always uses 26 PCICLK/xfer regardles of PIO mode */
 
 /*
  * VIA SouthBridge chips.
@@ -103,13 +99,15 @@
 	unsigned short id;
 	unsigned char rev_min;
 	unsigned char rev_max;
-	unsigned char flags;
+	unsigned short flags;
 } via_isa_bridges[] = {
+#ifdef VIA_NEW_BRIDGES_TESTED
 	{ "vt8233",	PCI_DEVICE_ID_VIA_8233_0,   0x00, 0x2f, VIA_UDMA_100 },
 	{ "vt8231",	PCI_DEVICE_ID_VIA_8231,     0x00, 0x2f, VIA_UDMA_66 },
-	{ "vt82c686b",	PCI_DEVICE_ID_VIA_82C686,   0x40, 0x4f, VIA_UDMA_100 },
+#endif
+	{ "vt82c686b",	PCI_DEVICE_ID_VIA_82C686,   0x40, 0x4f, VIA_UDMA_100 | VIA_BAD_PIO },
 	{ "vt82c686a",	PCI_DEVICE_ID_VIA_82C686,   0x10, 0x2f, VIA_UDMA_66 },
-	{ "vt82c686",	PCI_DEVICE_ID_VIA_82C686,   0x00, 0x0f, VIA_UDMA_66 },
+	{ "vt82c686",	PCI_DEVICE_ID_VIA_82C686,   0x00, 0x0f, VIA_UDMA_33 | VIA_BAD_CLK66 },
 	{ "vt82c596b",	PCI_DEVICE_ID_VIA_82C596,   0x10, 0x2f, VIA_UDMA_66 },
 	{ "vt82c596a",	PCI_DEVICE_ID_VIA_82C596,   0x00, 0x0f, VIA_UDMA_33 | VIA_BAD_CLK66 },
 	{ "vt82c586b",	PCI_DEVICE_ID_VIA_82C586_0, 0x40, 0x4f, VIA_UDMA_33 | VIA_SET_FIFO | VIA_BAD_PREQ },
@@ -123,6 +121,7 @@
 static unsigned char via_enabled;
 static unsigned int via_80w;
 static unsigned int via_clock;
+static char *via_dma[] = { "MWDMA16", "UDMA33", "UDMA66", "UDMA100" };
 
 /*
  * VIA /proc entry.
@@ -145,8 +144,8 @@
 
 static int via_get_info(char *buffer, char **addr, off_t offset, int count)
 {
-	short speed[4], cycle[4], setup[4], active[4],
-		recover[4], uen[4], udma[4], active8b[4], recover8b[4];
+	short speed[4], cycle[4], setup[4], active[4], recover[4], den[4],
+		 uen[4], udma[4], umul[4], active8b[4], recover8b[4];
 	struct pci_dev *dev = bmide_dev;
 	unsigned int v, u, i;
 	unsigned short c, w;
@@ -155,12 +154,13 @@
 
 	via_print("----------VIA BusMastering IDE Configuration----------------");
 
-	via_print("Driver Version:                     3.20");
+	via_print("Driver Version:                     3.23");
 	via_print("South Bridge:                       VIA %s", via_config->name);
 
 	pci_read_config_byte(isa_dev, PCI_REVISION_ID, &t);
 	pci_read_config_byte(dev, PCI_REVISION_ID, &x);
 	via_print("Revision:                           ISA %#x IDE %#x", t, x);
+	via_print("Highest DMA rate:                   %s", via_dma[via_config->flags & VIA_UDMA]);
 
 	via_print("BM-DMA base:                        %#x", via_base);
 	via_print("PCI clock:                          %dMHz", via_clock);
@@ -200,28 +200,43 @@
 	else u = 0;
 
 	for (i = 0; i < 4; i++) {
+
 		setup[i]     = ((t >> ((3 - i) << 1)) & 0x3) + 1;
 		recover8b[i] = ((w >> ((1 - (i >> 1)) << 3)) & 0xf) + 1;
 		active8b[i]  = ((w >> (((1 - (i >> 1)) << 3) + 4)) & 0xf) + 1;
 		active[i]    = ((v >> (((3 - i) << 3) + 4)) & 0xf) + 1;
 		recover[i]   = ((v >> ((3 - i) << 3)) & 0xf) + 1;
 		udma[i]      = ((u >> ((3 - i) << 3)) & 0x7) + 2;
+		umul[i]      = ((u >> (((3 - i) & 2) << 3)) & 0x8) ? 1 : 2;
+		uen[i]       = ((u >> ((3 - i) << 3)) & 0x20);
+		den[i]       = (c & ((i & 1) ? 0x40 : 0x20) << ((i & 2) << 2));
+
+		speed[i] = 20 * via_clock / (active[i] + recover[i]);
+		cycle[i] = 1000 / via_clock * (active[i] + recover[i]);
 
-		if ((via_config->flags & VIA_UDMA) == VIA_UDMA_100) {
-			speed[i] = 2000 / udma[i];
-			cycle[i] = 10 * udma[i];
+		if (!uen[i] || !den[i])
 			continue;
-		}
 
-		uen[i]   = (u >> ((3 - i) << 3)) & 0x20;
-		udma[i] *= ((u >> (((3 - i) & 2) << 3)) & 0x8) ? 1 : 2;
+		switch (via_config->flags & VIA_UDMA) {
+			
+			case VIA_UDMA_100:
+				speed[i] = 2000 / udma[i];
+				cycle[i] = 10 * udma[i];
+				break;
+
+			case VIA_UDMA_66:
+				speed[i] = 40 * via_clock / (udma[i] * umul[i]);
+				cycle[i] = 500 / via_clock * (udma[i] * umul[i]);
+				break;
 
-		speed[i] = 40 * via_clock / (uen[i] ? udma[i] : (active[i] + recover[i]) * 2);
-		cycle[i] = 1000 / via_clock * (uen[i] ? udma[i] : (active[i] + recover[i]) * 2) / 2;
+			case VIA_UDMA_33:
+				speed[i] = 20 * via_clock / udma[i];
+				cycle[i] = 1000 / via_clock * udma[i];
+				break;
+		}
 	}
 
-	via_print_drive("Transfer Mode: ", "%10s",
-			(c & ((i & 1) ? 0x40 : 0x20) << ((i & 2) << 2)) ? (uen[i] ? "UDMA" : "DMA") : "PIO");
+	via_print_drive("Transfer Mode: ", "%10s", den[i] ? (uen[i] ? "UDMA" : "DMA") : "PIO");
 
 	via_print_drive("Address Setup: ", "%8dns", (1000 / via_clock) * setup[i]);
 	via_print_drive("Cmd Active:    ", "%8dns", (1000 / via_clock) * active8b[i]);
@@ -342,12 +357,13 @@
 		short speed = ide_find_best_mode(drive,
 			XFER_PIO | XFER_EPIO | XFER_SWDMA | XFER_MWDMA |
 			(via_config->flags & VIA_UDMA ? XFER_UDMA : 0) |
-			(w80 && (via_config->flags & VIA_UDMA) == VIA_UDMA_66 ? XFER_UDMA_66 : 0) |
-			(w80 && (via_config->flags & VIA_UDMA) == VIA_UDMA_100 ? XFER_UDMA_100 : 0));
-
-		func = ((speed & XFER_MODE) != XFER_PIO) ? ide_dma_on : ide_dma_off_quietly;
+			(w80 && (via_config->flags & VIA_UDMA) >= VIA_UDMA_66 ? XFER_UDMA_66 : 0) |
+			(w80 && (via_config->flags & VIA_UDMA) >= VIA_UDMA_100 ? XFER_UDMA_100 : 0));
 
 		via_set_drive(drive, speed);
+
+		func = (HWIF(drive)->autodma && (speed & XFER_MODE) != XFER_PIO)
+			? ide_dma_on : ide_dma_off_quietly;
 	}
 
 	return ide_dmaproc(func, drive);
@@ -459,11 +475,7 @@
 
 	pci_read_config_byte(isa, PCI_REVISION_ID, &t);
 	printk(KERN_INFO "VP_IDE: VIA %s (rev %02x) IDE %s controller on pci%s\n",
-			via_config->name, t,
-			(via_config->flags & VIA_UDMA) == VIA_UDMA_100 ? "UDMA100" :
-			(via_config->flags & VIA_UDMA) == VIA_UDMA_66 ? "UDMA66" :
-			(via_config->flags & VIA_UDMA) == VIA_UDMA_33 ? "UDMA33" : "MWDMA16",
-			dev->slot_name);
+		via_config->name, t, via_dma[via_config->flags & VIA_UDMA], dev->slot_name);
 
 /*
  * Setup /proc/ide/via entry.
@@ -471,11 +483,11 @@
 
 #ifdef CONFIG_PROC_FS
 	if (!via_proc) {
-		via_proc = 1;
 		via_base = pci_resource_start(dev, 4);
 		bmide_dev = dev;
 		isa_dev = isa;
 		via_display_info = &via_get_info;
+		via_proc = 1;
 	}
 #endif
 
@@ -506,7 +518,8 @@
 	if (hwif->dma_base) {
 		hwif->dmaproc = &via82cxxx_dmaproc;
 #ifdef CONFIG_IDEDMA_AUTO
-		hwif->autodma = 1;
+		if (!noautodma)
+			hwif->autodma = 1;
 #endif
 	}
 #endif /* CONFIG_BLK_DEV_IDEDMA */
diff -u --recursive --new-file v2.4.8/linux/drivers/ieee1394/hosts.c linux/drivers/ieee1394/hosts.c
--- v2.4.8/linux/drivers/ieee1394/hosts.c	Sun Aug 12 13:27:59 2001
+++ linux/drivers/ieee1394/hosts.c	Sun Aug 12 12:39:02 2001
@@ -95,11 +95,12 @@
         struct hpsb_host *h;
 
         h = vmalloc(sizeof(struct hpsb_host) + hd_size);
-        if (h == NULL) {
-                return NULL;
-        }
+        if (!h) return NULL;
 
         memset(h, 0, sizeof(struct hpsb_host) + hd_size);
+
+        atomic_set(&h->generation, 0);
+
         INIT_LIST_HEAD(&h->pending_packets);
         spin_lock_init(&h->pending_pkt_lock);
 
@@ -239,7 +240,6 @@
         }
         spin_unlock(&templates_lock);
 
-        inc_hpsb_generation();
         return retval;
 }
 
diff -u --recursive --new-file v2.4.8/linux/drivers/ieee1394/hosts.h linux/drivers/ieee1394/hosts.h
--- v2.4.8/linux/drivers/ieee1394/hosts.h	Wed Jul 25 17:10:20 2001
+++ linux/drivers/ieee1394/hosts.h	Sun Aug 12 12:39:02 2001
@@ -1,4 +1,3 @@
-
 #ifndef _IEEE1394_HOSTS_H
 #define _IEEE1394_HOSTS_H
 
@@ -15,6 +14,8 @@
 struct hpsb_host {
 /* private fields (hosts, do not use them) */
         struct hpsb_host *next;
+
+        atomic_t generation;
 
         struct list_head pending_packets;
         spinlock_t pending_pkt_lock;
diff -u --recursive --new-file v2.4.8/linux/drivers/ieee1394/ieee1394_core.c linux/drivers/ieee1394/ieee1394_core.c
--- v2.4.8/linux/drivers/ieee1394/ieee1394_core.c	Sun Aug 12 13:27:59 2001
+++ linux/drivers/ieee1394/ieee1394_core.c	Sun Aug 12 12:39:02 2001
@@ -10,7 +10,6 @@
  * directory of the kernel sources for details.
  */
 
-#include <linux/module.h>
 #include <linux/config.h>
 #include <linux/kernel.h>
 #include <linux/list.h>
@@ -31,8 +30,7 @@
 #include "csr.h"
 #include "nodemgr.h"
 
-
-atomic_t hpsb_generation = ATOMIC_INIT(0);
+static kmem_cache_t *hpsb_packet_cache;
 
 
 static void dump_packet(const char *text, quadlet_t *data, int size)
@@ -76,16 +74,17 @@
         void *data = NULL;
         int kmflags = in_interrupt() ? GFP_ATOMIC : GFP_KERNEL;
 
-        packet = kmalloc(sizeof(struct hpsb_packet), kmflags);
-        if (!packet) return NULL;
+        packet = kmem_cache_alloc(hpsb_packet_cache, kmflags);
+        if (packet == NULL)
+                return NULL;
 
         memset(packet, 0, sizeof(struct hpsb_packet));
         packet->header = packet->embedded_header;
 
         if (data_size) {
                 data = kmalloc(data_size + 8, kmflags);
-                if (!data) {
-                        kfree(packet);
+                if (data == NULL) {
+			kmem_cache_free(hpsb_packet_cache, packet);
                         return NULL;
                 }
 
@@ -93,11 +92,11 @@
                 packet->data_size = data_size;
         }
 
-        INIT_LIST_HEAD(&packet->complete_tq);
+        INIT_TQ_HEAD(packet->complete_tq);
         INIT_LIST_HEAD(&packet->list);
         sema_init(&packet->state_change, 0);
         packet->state = unused;
-        packet->generation = get_hpsb_generation();
+        packet->generation = -1;
         packet->data_be = 1;
 
         return packet;
@@ -116,7 +115,7 @@
         if (!packet) return;
 
         kfree(packet->data);
-        kfree(packet);
+        kmem_cache_free(hpsb_packet_cache, packet);
 }
 
 
@@ -126,7 +125,7 @@
                 return 1;
         }
 
-        if (!hpsb_bus_reset(host)) {
+        if (!host->in_bus_reset) {
                 host->template->devctl(host, RESET_BUS, type);
                 return 0;
         } else {
@@ -333,7 +332,7 @@
         }
 
         host->reset_retries = 0;
-        inc_hpsb_generation();
+        atomic_inc(&host->generation);
         if (isroot) host->template->devctl(host, ACT_CYCLE_MASTER, 1);
         highlevel_host_reset(host);
 }
@@ -353,7 +352,7 @@
         }
 
         if (ackcode != ACK_PENDING || !packet->expect_response) {
-                packet->state = completed;
+                packet->state = complete;
                 up(&packet->state_change);
                 up(&packet->state_change);
                 run_task_queue(&packet->complete_tq);
@@ -390,7 +389,7 @@
         struct hpsb_host *host = packet->host;
 
         if (!host->initialized || host->in_bus_reset 
-            || (packet->generation != get_hpsb_generation())) {
+            || (packet->generation != get_hpsb_generation(host))) {
                 return 0;
         }
 
@@ -442,14 +441,12 @@
 
         spin_lock_irqsave(&host->pending_pkt_lock, flags);
 
-        lh = host->pending_packets.next;
-        while (lh != &host->pending_packets) {
+        list_for_each(lh, &host->pending_packets) {
                 packet = list_entry(lh, struct hpsb_packet, list);
                 if ((packet->tlabel == tlabel)
                     && (packet->node_id == (data[1] >> 16))){
                         break;
                 }
-                lh = lh->next;
         }
 
         if (lh == &host->pending_packets) {
@@ -506,7 +503,7 @@
                 break;
         }
 
-        packet->state = completed;
+        packet->state = complete;
         up(&packet->state_change);
         run_task_queue(&packet->complete_tq);
 }
@@ -721,12 +718,9 @@
         INIT_LIST_HEAD(&host->pending_packets);
         spin_unlock_irqrestore(&host->pending_pkt_lock, flags);
 
-        lh = llist.next;
-
-        while (lh != &llist) {
+        list_for_each(lh, &llist) {
                 packet = list_entry(lh, struct hpsb_packet, list);
-                lh = lh->next;
-                packet->state = completed;
+                packet->state = complete;
                 packet->ack_code = ACKX_ABORTED;
                 up(&packet->state_change);
                 run_task_queue(&packet->complete_tq);
@@ -751,11 +745,9 @@
 
 
         spin_lock_irqsave(&host->pending_pkt_lock, flags);
-        lh = host->pending_packets.next;
 
-        while (lh != &host->pending_packets) {
+        list_for_each(lh, &host->pending_packets) {
                 packet = list_entry(lh, struct hpsb_packet, list);
-                lh = lh->next;
                 if (time_before(packet->sendtime + expire, jiffies)) {
                         list_del(&packet->list);
                         list_add(&packet->list, &expiredlist);
@@ -767,11 +759,9 @@
         }
         spin_unlock_irqrestore(&host->pending_pkt_lock, flags);
 
-        lh = expiredlist.next;
-        while (lh != &expiredlist) {
+        list_for_each(lh, &expiredlist) {
                 packet = list_entry(lh, struct hpsb_packet, list);
-                lh = lh->next;
-                packet->state = completed;
+                packet->state = complete;
                 packet->ack_code = ACKX_TIMEOUT;
                 up(&packet->state_change);
                 run_task_queue(&packet->complete_tq);
@@ -781,16 +771,19 @@
 
 static int __init ieee1394_init(void)
 {
-        init_hpsb_highlevel();
-        init_csr();
-        init_ieee1394_nodemgr();
+	hpsb_packet_cache = kmem_cache_create("hpsb_packet", sizeof(struct hpsb_packet),
+					      0, 0, NULL, NULL);
+	init_hpsb_highlevel();
+	init_csr();
+	init_ieee1394_nodemgr();
 	return 0;
 }
 
 static void __exit ieee1394_cleanup(void)
 {
-        cleanup_ieee1394_nodemgr();
-        cleanup_csr();
+	cleanup_ieee1394_nodemgr();
+	cleanup_csr();
+	kmem_cache_destroy(hpsb_packet_cache);
 }
 
 module_init(ieee1394_init);
diff -u --recursive --new-file v2.4.8/linux/drivers/ieee1394/ieee1394_core.h linux/drivers/ieee1394/ieee1394_core.h
--- v2.4.8/linux/drivers/ieee1394/ieee1394_core.h	Sun Aug 12 13:27:59 2001
+++ linux/drivers/ieee1394/ieee1394_core.h	Sun Aug 12 12:39:02 2001
@@ -3,6 +3,7 @@
 #define _IEEE1394_CORE_H
 
 #include <linux/tqueue.h>
+#include <linux/slab.h>
 #include <asm/semaphore.h>
 #include "hosts.h"
 
@@ -24,11 +25,11 @@
         /* Okay, this is core internal and a no care for hosts.
          * queued   = queued for sending
          * pending  = sent, waiting for response
-         * completed = processing completed, successful or not
+         * complete = processing completed, successful or not
          * incoming = incoming packet
          */
         enum { 
-                unused, queued, pending, completed, incoming 
+                unused, queued, pending, complete, incoming 
         } __attribute__((packed)) state;
 
         /* These are core internal. */
@@ -89,16 +90,10 @@
  * Use the functions, not the variable.
  */
 #include <asm/atomic.h>
-extern atomic_t hpsb_generation;
 
-inline static unsigned int get_hpsb_generation(void)
+static inline unsigned int get_hpsb_generation(struct hpsb_host *host)
 {
-        return atomic_read(&hpsb_generation);
-}
-
-inline static void inc_hpsb_generation(void)
-{
-        atomic_inc(&hpsb_generation);
+        return atomic_read(&host->generation);
 }
 
 
diff -u --recursive --new-file v2.4.8/linux/drivers/ieee1394/ieee1394_hotplug.h linux/drivers/ieee1394/ieee1394_hotplug.h
--- v2.4.8/linux/drivers/ieee1394/ieee1394_hotplug.h	Wed Dec 31 16:00:00 1969
+++ linux/drivers/ieee1394/ieee1394_hotplug.h	Sun Aug 12 12:39:02 2001
@@ -0,0 +1,33 @@
+#ifndef _IEEE1394_HOTPLUG_H
+#define _IEEE1394_HOTPLUG_H
+
+#include "ieee1394_core.h"
+
+#define IEEE1394_DEVICE_ID_MATCH_VENDOR_ID		0x0001
+#define IEEE1394_DEVICE_ID_MATCH_MODEL_ID		0x0002
+#define IEEE1394_DEVICE_ID_MATCH_SW_SPECIFIER_ID	0x0004
+#define IEEE1394_DEVICE_ID_MATCH_SW_SPECIFIER_VERSION	0x0008
+
+struct ieee1394_device_id {
+	u32 match_flags;
+	u32 vendor_id;
+	u32 model_id;
+	u32 sw_specifier_id;
+	u32 sw_specifier_version;
+};
+
+#define IEEE1394_PROTOCOL(id, version) {				       \
+	match_flags:		IEEE1394_DEVICE_ID_MATCH_SW_SPECIFIER_ID |     \
+				IEEE1394_DEVICE_ID_MATCH_SW_SPECIFIER_VERSION, \
+	sw_specifier_id:	id,					       \
+	sw_specifier_version:	version					       \
+}
+
+#define IEEE1394_DEVICE(vendor_id, model_id) {			\
+	match_flags: 	IEEE1394_DEVICE_ID_MATCH_VENDOR_ID |	\
+			IEEE1394_DEVICE_ID_MATCH_MODEL_ID,	\
+	vendor_id:	vendor_id,				\
+	model_id:	vendor_id,				\
+}
+
+#endif /* _IEEE1394_HOTPLUG_H */
diff -u --recursive --new-file v2.4.8/linux/drivers/ieee1394/ieee1394_syms.c linux/drivers/ieee1394/ieee1394_syms.c
--- v2.4.8/linux/drivers/ieee1394/ieee1394_syms.c	Sun Aug 12 13:27:59 2001
+++ linux/drivers/ieee1394/ieee1394_syms.c	Sun Aug 12 12:39:02 2001
@@ -9,8 +9,9 @@
  * directory of the kernel sources for details.
  */
 
-#include <linux/types.h>
+#include <linux/config.h>
 #include <linux/module.h>
+#include <linux/types.h>
 #include <linux/string.h>
 
 #include "ieee1394_types.h"
@@ -35,7 +36,6 @@
 EXPORT_SYMBOL(hpsb_selfid_complete);
 EXPORT_SYMBOL(hpsb_packet_sent);
 EXPORT_SYMBOL(hpsb_packet_received);
-EXPORT_SYMBOL(hpsb_generation);
 
 EXPORT_SYMBOL(get_tlabel);
 EXPORT_SYMBOL(free_tlabel);
@@ -75,6 +75,7 @@
 EXPORT_SYMBOL(highlevel_remove_host);
 EXPORT_SYMBOL(highlevel_host_reset);
 EXPORT_SYMBOL(highlevel_add_one_host);
-EXPORT_SYMBOL(hpsb_guid_get_handle);
+EXPORT_SYMBOL(hpsb_guid_get_entry);
+EXPORT_SYMBOL(hpsb_nodeid_get_entry);
 EXPORT_SYMBOL(hpsb_get_host_by_ne);
 EXPORT_SYMBOL(hpsb_guid_fill_packet);
diff -u --recursive --new-file v2.4.8/linux/drivers/ieee1394/ieee1394_transactions.c linux/drivers/ieee1394/ieee1394_transactions.c
--- v2.4.8/linux/drivers/ieee1394/ieee1394_transactions.c	Wed Jul 25 17:10:20 2001
+++ linux/drivers/ieee1394/ieee1394_transactions.c	Sun Aug 12 12:39:02 2001
@@ -447,7 +447,12 @@
                 return -ENOMEM;
         }
 
-        hpsb_send_packet(packet);
+	packet->generation = get_hpsb_generation(host);
+        if (!hpsb_send_packet(packet)) {
+		retval = -EINVAL;
+		goto hpsb_read_fail;
+	}
+
         down(&packet->state_change);
         down(&packet->state_change);
         retval = hpsb_packet_success(packet);
@@ -460,6 +465,7 @@
                 }
         }
 
+hpsb_read_fail:
         free_tlabel(host, node, packet->tlabel);
         free_hpsb_packet(packet);
 
@@ -514,11 +520,17 @@
 	if (!packet)
 		return -ENOMEM;
 
-        hpsb_send_packet(packet);
+	packet->generation = get_hpsb_generation(host);
+        if (!hpsb_send_packet(packet)) {
+		retval = -EINVAL;
+		goto hpsb_write_fail;
+	}
+
         down(&packet->state_change);
         down(&packet->state_change);
         retval = hpsb_packet_success(packet);
 
+hpsb_write_fail:
         free_tlabel(host, node, packet->tlabel);
         free_hpsb_packet(packet);
 
@@ -574,7 +586,11 @@
         }
         fill_async_lock(packet, addr, extcode, length);
 
-        hpsb_send_packet(packet);
+	packet->generation = get_hpsb_generation(host);
+        if (!hpsb_send_packet(packet)) {
+		retval = -EINVAL;
+		goto hpsb_lock_fail;
+	}
         down(&packet->state_change);
         down(&packet->state_change);
         retval = hpsb_packet_success(packet);
@@ -583,6 +599,7 @@
                 *data = packet->data[0];
         }
 
+hpsb_lock_fail:
         free_tlabel(host, node, packet->tlabel);
         free_hpsb_packet(packet);
 
diff -u --recursive --new-file v2.4.8/linux/drivers/ieee1394/ieee1394_types.h linux/drivers/ieee1394/ieee1394_types.h
--- v2.4.8/linux/drivers/ieee1394/ieee1394_types.h	Wed Jul 25 17:10:20 2001
+++ linux/drivers/ieee1394/ieee1394_types.h	Sun Aug 12 12:39:02 2001
@@ -9,7 +9,22 @@
 #include <asm/byteorder.h>
 
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0)
+#include "linux22compat.h"
+#else
+#define V22_COMPAT_MOD_INC_USE_COUNT do {} while (0)
+#define V22_COMPAT_MOD_DEC_USE_COUNT do {} while (0)
+#define OWNER_THIS_MODULE owner: THIS_MODULE,
+
+#define INIT_TQ_LINK(tq) INIT_LIST_HEAD(&(tq).list)
+#define INIT_TQ_HEAD(tq) INIT_LIST_HEAD(&(tq))
+#endif
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,18)
+#include <asm/spinlock.h>
+#else
 #include <linux/spinlock.h>
+#endif
 
 #ifndef MIN
 #define MIN(a,b) ((a) < (b) ? (a) : (b))
diff -u --recursive --new-file v2.4.8/linux/drivers/ieee1394/nodemgr.c linux/drivers/ieee1394/nodemgr.c
--- v2.4.8/linux/drivers/ieee1394/nodemgr.c	Sun Aug 12 13:27:59 2001
+++ linux/drivers/ieee1394/nodemgr.c	Sun Aug 12 12:40:27 2001
@@ -22,11 +22,16 @@
 #include "ieee1394_transactions.h"
 #include "highlevel.h"
 #include "csr.h"
+#include "nodemgr.h"
 
 
+#define NODE_BUS_FMT	"%d:%d"
+#define NODE_BUS_ARGS(nodeid) \
+	(nodeid & NODE_MASK), ((nodeid & BUS_MASK) >> 6)
+
 /* Basically what we do here is start off retrieving the bus_info block.
  * From there will fill in some info about the node, verify it is of IEEE
- * 1394 type, and the the crc checks out ok. After that we start off with
+ * 1394 type, and that the crc checks out ok. After that we start off with
  * the root directory, and subdirectories. To do this, we retrieve the
  * quadlet header for a directory, find out the length, and retrieve the
  * complete directory entry (be it a leaf or a directory). We then process
@@ -40,47 +45,17 @@
 
 
 static LIST_HEAD(node_list);
-rwlock_t node_lock = RW_LOCK_UNLOCKED;
+static rwlock_t node_lock = RW_LOCK_UNLOCKED;
 
 static LIST_HEAD(host_info_list);
-spinlock_t host_info_lock = SPIN_LOCK_UNLOCKED;
-
-struct bus_options {
-	u8	irmc;		/* Iso Resource Manager Capable */
-	u8	cmc;		/* Cycle Master Capable */
-	u8	isc;		/* Iso Capable */
-	u8	bmc;		/* Bus Master Capable */
-	u8	pmc;		/* Power Manager Capable (PNP spec) */
-	u8	cyc_clk_acc;	/* Cycle clock accuracy */
-	u8	generation;	/* Incremented when configrom changes */
-	u8	lnkspd;		/* Link speed */
-	u16	max_rec;	/* Maximum packet size node can receive */
-	atomic_t changed;	/* We set this to 1 if generation has changed */
-};
+static spinlock_t host_info_lock = SPIN_LOCK_UNLOCKED;
 
 struct host_info {
 	struct hpsb_host *host;
-	pid_t pid;			/* PID of the nodemgr thread */
-	pid_t ppid;			/* Parent PID for the thread */
-	struct tq_struct task;		/* Used to kickstart the thread */
-	wait_queue_head_t reset_wait;	/* Wait queue awoken on bus reset */
+	struct tq_struct task;
 	struct list_head list;
 };
 
-struct node_entry {
-        struct list_head list;
-        atomic_t refcount;
-
-        u64 guid;
-
-        struct hpsb_host *host;
-        nodeid_t node_id;
-
-	struct bus_options busopt;
-
-        atomic_t generation;
-};
-
 static struct node_entry *create_node_entry(void)
 {
         struct node_entry *ne;
@@ -90,12 +65,11 @@
         if (!ne) return NULL;
 
         INIT_LIST_HEAD(&ne->list);
-        atomic_set(&ne->refcount, 0);
+	INIT_LIST_HEAD(&ne->unit_directories);
         ne->guid = (u64) -1;
         ne->host = NULL;
-        ne->node_id = 0;
+        ne->nodeid = 0;
         atomic_set(&ne->generation, -1);
-	atomic_set(&ne->busopt.changed, 0);
 
         write_lock_irqsave(&node_lock, flags);
         list_add_tail(&ne->list, &node_list);
@@ -104,39 +78,212 @@
         return ne;
 }
 
-static struct node_entry *find_entry(u64 guid)
+static struct node_entry *find_entry_by_guid(u64 guid)
 {
         struct list_head *lh;
         struct node_entry *ne;
         
-        lh = node_list.next;
-        while (lh != &node_list) {
+        list_for_each(lh, &node_list) {
                 ne = list_entry(lh, struct node_entry, list);
                 if (ne->guid == guid) return ne;
-                lh = lh->next;
         }
 
         return NULL;
 }
 
-static int register_guid(struct hpsb_host *host, nodeid_t nodeid, u64 guid,
+static struct node_entry *find_entry_by_nodeid(nodeid_t nodeid)
+{
+	struct list_head *lh;
+	struct node_entry *ne;
+
+	list_for_each(lh, &node_list) {
+		ne = list_entry(lh, struct node_entry, list);
+		if (ne->nodeid == nodeid) return ne;
+	}
+
+	return NULL;
+}
+
+int nodemgr_read_quadlet(struct node_entry *ne, 
+			 octlet_t address, quadlet_t *quad)
+{
+	if (hpsb_read(ne->host, ne->nodeid, address, quad, 4)) {
+		HPSB_DEBUG("read of address %Lx failed", address);
+		return -EAGAIN;
+	}
+	*quad = be32_to_cpu(*quad);
+
+	return 0;
+}
+
+#define CONFIG_ROM_VENDOR_ID		0x03
+#define CONFIG_ROM_MODEL_ID		0x17
+#define CONFIG_ROM_NODE_CAPABILITES	0x0C
+#define CONFIG_ROM_UNIT_DIRECTORY	0xd1
+#define CONFIG_ROM_SPECIFIER_ID		0x12 
+#define CONFIG_ROM_VERSION		0x13
+#define CONFIG_ROM_DESCRIPTOR_LEAF	0x81
+#define CONFIG_ROM_DESCRIPTOR_DIRECTORY	0xc1
+
+/* This implementation currently only scans the config rom and its
+ * immediate unit directories looking for software_id and
+ * software_version entries, in order to get driver autoloading working.
+ */
+
+static void nodemgr_process_unit_directory(struct node_entry *ne, 
+					   octlet_t address)
+{
+	struct unit_directory *ud;
+	octlet_t a;
+	quadlet_t quad;
+	int length, i;
+	
+
+	if (!(ud = kmalloc (sizeof *ud, GFP_KERNEL)))
+		goto unit_directory_error;
+
+	memset (ud, 0, sizeof *ud);
+	ud->address = address;
+
+	if (nodemgr_read_quadlet(ne, address, &quad))
+		goto unit_directory_error;
+	length = quad >> 16;
+	a = address + 4;
+
+	for (i = 0; i < length; i++, a += 4) {
+		int code, value;
+
+		if (nodemgr_read_quadlet(ne, a, &quad))
+			goto unit_directory_error;
+		code = quad >> 24;
+		value = quad & 0xffffff;
+
+		switch (code) {
+		case CONFIG_ROM_VENDOR_ID:
+			ud->vendor_id = value;
+			ud->flags |= UNIT_DIRECTORY_VENDOR_ID;
+			break;
+
+		case CONFIG_ROM_MODEL_ID:
+			ud->model_id = value;
+			ud->flags |= UNIT_DIRECTORY_MODEL_ID;
+			break;
+
+		case CONFIG_ROM_SPECIFIER_ID:
+			ud->specifier_id = value;
+			ud->flags |= UNIT_DIRECTORY_SPECIFIER_ID;
+			break;
+
+		case CONFIG_ROM_VERSION:
+			ud->version = value;
+			ud->flags |= UNIT_DIRECTORY_VERSION;
+			break;
+
+		case CONFIG_ROM_DESCRIPTOR_LEAF:
+		case CONFIG_ROM_DESCRIPTOR_DIRECTORY:
+			/* TODO: read strings... icons? */
+			break;
+		}
+	}
+
+	list_add_tail (&ud->list, &ne->unit_directories);
+	return;
+
+unit_directory_error:	
+	if (ud != NULL)
+		kfree(ud);
+}
+
+#ifdef CONFIG_IEEE1394_VERBOSEDEBUG
+static void dump_directories (struct node_entry *ne)
+{
+	struct list_head *l;
+
+	HPSB_DEBUG("vendor_id=0x%06x, capabilities=0x%06x",
+		   ne->vendor_id, ne->capabilities);
+	list_for_each (l, &ne->unit_directories) {
+		struct unit_directory *ud = list_entry (l, struct unit_directory, list);
+		HPSB_DEBUG("unit directory:");
+		if (ud->flags & UNIT_DIRECTORY_VENDOR_ID)
+			HPSB_DEBUG("  vendor_id=0x%06x ", ud->vendor_id);
+		if (ud->flags & UNIT_DIRECTORY_MODEL_ID)
+			HPSB_DEBUG("  model_id=0x%06x ", ud->model_id);
+		if (ud->flags & UNIT_DIRECTORY_SPECIFIER_ID)
+			HPSB_DEBUG("  specifier_id=0x%06x ", ud->specifier_id);
+		if (ud->flags & UNIT_DIRECTORY_VERSION)
+			HPSB_DEBUG("  version=0x%06x ", ud->version);
+	}
+}
+#endif
+
+static void nodemgr_process_root_directory(struct node_entry *ne)
+{
+	octlet_t address;
+	quadlet_t quad;
+	int length, i;
+
+	address = CSR_REGISTER_BASE + CSR_CONFIG_ROM;
+	
+	if (nodemgr_read_quadlet(ne, address, &quad))
+		return;
+	address += 4 + (quad >> 24) * 4;
+
+	if (nodemgr_read_quadlet(ne, address, &quad))
+		return;
+	length = quad >> 16;
+	address += 4;
+
+	for (i = 0; i < length; i++, address += 4) {
+		int code, value;
+
+		if (nodemgr_read_quadlet(ne, address, &quad))
+			return;
+		code = quad >> 24;
+		value = quad & 0xffffff;
+
+		switch (code) {
+		case CONFIG_ROM_VENDOR_ID:
+			ne->vendor_id = value;
+			break;
+
+		case CONFIG_ROM_NODE_CAPABILITES:
+			ne->capabilities = value;
+			break;
+
+		case CONFIG_ROM_UNIT_DIRECTORY:
+			nodemgr_process_unit_directory(ne, address + value * 4);
+			break;			
+
+		case CONFIG_ROM_DESCRIPTOR_LEAF:
+		case CONFIG_ROM_DESCRIPTOR_DIRECTORY:
+			/* TODO: read strings... icons? */
+			break;
+		}
+	}
+#ifdef CONFIG_IEEE1394_VERBOSEDEBUG
+	dump_directories(ne);
+#endif
+}
+
+static void register_node(struct hpsb_host *host, nodeid_t nodeid, u64 guid,
 			  quadlet_t busoptions)
 {
         struct node_entry *ne;
         unsigned long flags, new = 0;
 
         read_lock_irqsave(&node_lock, flags);
-        ne = find_entry(guid);
+        ne = find_entry_by_guid(guid);
         read_unlock_irqrestore(&node_lock, flags);
 
 	/* New entry */
 	if (!ne) {
 		if ((ne = create_node_entry()) == NULL)
-			return -1;
+			return;
 
-		HPSB_DEBUG("%s added: node %d, bus %d: GUID %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x",
+		HPSB_DEBUG("%s added: node " NODE_BUS_FMT
+			   ", GUID %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x",
 			   (host->node_id == nodeid) ? "Local host" : "Device",
-			   nodeid & NODE_MASK, (nodeid & BUS_MASK) >> 6, ((u8 *)&guid)[0],
+			   NODE_BUS_ARGS(nodeid), ((u8 *)&guid)[0],
 			   ((u8 *)&guid)[1], ((u8 *)&guid)[2], ((u8 *)&guid)[3],
 			   ((u8 *)&guid)[4], ((u8 *)&guid)[5], ((u8 *)&guid)[6],
 			   ((u8 *)&guid)[7]);
@@ -145,14 +292,12 @@
 		new = 1;
 	}
 
-	if (!new && ne->node_id != nodeid)
-		HPSB_DEBUG("Node %d changed to %d on bus %d",
-			   ne->node_id & NODE_MASK, nodeid & NODE_MASK, (nodeid & BUS_MASK) >> 6);
+	if (!new && ne->nodeid != nodeid)
+		HPSB_DEBUG("Node " NODE_BUS_FMT " changed to " NODE_BUS_FMT,
+			   NODE_BUS_ARGS(ne->nodeid), NODE_BUS_ARGS(nodeid));
 
 	ne->host = host;
-        ne->node_id = nodeid;
-
-        atomic_set(&ne->generation, get_hpsb_generation());
+        ne->nodeid = nodeid;
 
 	/* Now set the bus options. Only do all this crap if this is a new
 	 * node, or if the generation number has changed.  */
@@ -167,25 +312,29 @@
 		ne->busopt.generation	= (busoptions >> 6) & 0x3;
 		ne->busopt.lnkspd	= busoptions & 0x7;
 
-		new = 1; /* To make sure we probe the rest of the ConfigROM too */
+		/* Now, process the rest of the tree */
+		nodemgr_process_root_directory(ne);
 	}
 
+	/* Since that's done, we can declare this record current */
+	atomic_set(&ne->generation, get_hpsb_generation(host));
+
 #ifdef CONFIG_IEEE1394_VERBOSEDEBUG
 	HPSB_DEBUG("raw=0x%08x irmc=%d cmc=%d isc=%d bmc=%d pmc=%d cyc_clk_acc=%d "
-		   "max_rec=%d gen=%d lspd=%d\n", busoptions,
+		   "max_rec=%d gen=%d lspd=%d", busoptions,
 		   ne->busopt.irmc, ne->busopt.cmc, ne->busopt.isc, ne->busopt.bmc,
 		   ne->busopt.pmc, ne->busopt.cyc_clk_acc, ne->busopt.max_rec,
 		   ne->busopt.generation, ne->busopt.lnkspd);
 #endif
 
-	return new;
+	return;
 }
 
 static void nodemgr_remove_node(struct node_entry *ne)
 {
-	HPSB_DEBUG("Device removed: node %d, bus %d: GUID "
+	HPSB_DEBUG("Device removed: node " NODE_BUS_FMT ", GUID "
 		   "%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x",
-		   ne->node_id & NODE_MASK, (ne->node_id & BUS_MASK) >> 6,
+		   NODE_BUS_ARGS(ne->nodeid),
 		   ((u8 *)&ne->guid)[0], ((u8 *)&ne->guid)[1],
 		   ((u8 *)&ne->guid)[2], ((u8 *)&ne->guid)[3],
 		   ((u8 *)&ne->guid)[4], ((u8 *)&ne->guid)[5],
@@ -199,8 +348,9 @@
 
 /* This is where we probe the nodes for their information and provided
  * features.  */
-static void nodemgr_node_probe(struct hpsb_host *host)
+static void nodemgr_node_probe(void *data)
 {
+	struct hpsb_host *host = (struct hpsb_host *)data;
         struct selfid *sid = (struct selfid *)host->topology_map;
 	struct list_head *lh;
 	struct node_entry *ne;
@@ -235,8 +385,9 @@
 retry_configrom:
 		
 		if (!retries--) {
-			HPSB_ERR("Giving up on node %d for ConfigROM probe, too many errors",
-				 nodeid & NODE_MASK);
+			HPSB_ERR("Giving up on node " NODE_BUS_FMT
+				 " for ConfigROM probe, too many errors",
+				 NODE_BUS_ARGS(nodeid));
 			continue;
 		}
 
@@ -244,7 +395,8 @@
 		header_size = 0;
 
 #ifdef CONFIG_IEEE1394_VERBOSEDEBUG
-		HPSB_INFO("Initiating ConfigROM request for node %d", nodeid & NODE_MASK);
+		HPSB_INFO("Initiating ConfigROM request for node " NODE_BUS_FMT,
+			  NODE_BUS_ARGS(nodeid));
 #endif
 
 		/* Now, P1212 says that devices should support 64byte block
@@ -253,8 +405,8 @@
 		 * sized reads.  */
 
 		if (hpsb_read(host, nodeid, base, &quad, 4)) {
-			HPSB_ERR("ConfigROM quadlet transaction error for node %d",
-				 nodeid & NODE_MASK);
+			HPSB_ERR("ConfigROM quadlet transaction error for node " NODE_BUS_FMT,
+				 NODE_BUS_ARGS(nodeid));
 			goto retry_configrom;
 		}
 		buffer[header_count++] = be32_to_cpu(quad);
@@ -262,42 +414,35 @@
 		header_size = buffer[0] >> 24;
 
 		if (header_size < 4) {
-			HPSB_INFO("Node %d on bus %d has non-standard ROM format (%d quads), "
-				  "cannot parse", nodeid & NODE_MASK, (nodeid & BUS_MASK) >> 6,
-				  header_size);
+			HPSB_INFO("Node " NODE_BUS_FMT " has non-standard ROM format (%d quads), "
+				  "cannot parse", NODE_BUS_ARGS(nodeid), header_size);
 			continue;
 		}
 
 		while (header_count <= header_size && (header_count<<2) < sizeof(buffer)) {
 			if (hpsb_read(host, nodeid, base + (header_count<<2), &quad, 4)) {
-				HPSB_ERR("ConfigROM quadlet transaction error for %d",
-					 nodeid & NODE_MASK);
+				HPSB_ERR("ConfigROM quadlet transaction error for " NODE_BUS_FMT,
+					 NODE_BUS_ARGS(nodeid));
 				goto retry_configrom;
 			}
 			buffer[header_count++] = be32_to_cpu(quad);
 		}
 set_options:
-		guid = be64_to_cpu(((u64)buffer[3] << 32) | buffer[4]);
-		switch (register_guid(host, nodeid, guid, buffer[2])) {
-			case -1:
-				HPSB_ERR("Failed to register node in ConfigROM probe");
-				continue;
-			case 1:
-				/* Need to probe the rest of the ConfigROM
-				 * here.  */
-				break;
-			default:
-				/* Nothing to do, this is an old unchanged
-				 * node.  */
-				break;
+		if (buffer[1] != IEEE1394_BUSID_MAGIC) {
+			/* This isn't a 1394 device */
+			HPSB_ERR("Node " NODE_BUS_FMT " isn't an IEEE 1394 device",
+				 NODE_BUS_ARGS(nodeid));
+			continue;
 		}
+
+		guid = be64_to_cpu(((u64)buffer[3] << 32) | buffer[4]);
+		register_node(host, nodeid, guid, buffer[2]);
         }
 
 	/* Now check to see if we have any nodes that aren't referenced
 	 * any longer.  */
         write_lock_irqsave(&node_lock, flags);
-	lh = node_list.next;
-	while (lh != &node_list) {
+	list_for_each(lh, &node_list) {
 		ne = list_entry(lh, struct node_entry, list);
 
 		/* Only checking this host */
@@ -308,10 +453,8 @@
 		 * node was removed, or it failed the above probe. Either
 		 * way, we remove references to it, since they are
 		 * invalid.  */
-		if (atomic_read(&ne->generation) != get_hpsb_generation())
+		if (atomic_read(&ne->generation) != get_hpsb_generation(host))
 			nodemgr_remove_node(ne);
-
-		lh = lh->next;
 	}
 	write_unlock_irqrestore(&node_lock, flags);
 
@@ -319,73 +462,49 @@
 }
 
 
-struct node_entry *hpsb_guid_get_handle(u64 guid)
+struct node_entry *hpsb_guid_get_entry(u64 guid)
 {
         unsigned long flags;
         struct node_entry *ne;
 
         read_lock_irqsave(&node_lock, flags);
-        ne = find_entry(guid);
-        if (ne) atomic_inc(&ne->refcount);
+        ne = find_entry_by_guid(guid);
         read_unlock_irqrestore(&node_lock, flags);
 
         return ne;
 }
 
+struct node_entry *hpsb_nodeid_get_entry(nodeid_t nodeid)
+{
+	unsigned long flags;
+	struct node_entry *ne;
+
+	read_lock_irqsave(&node_lock, flags);
+	ne = find_entry_by_nodeid(nodeid);
+	read_unlock_irqrestore(&node_lock, flags);
+
+	return ne;
+}
+
 struct hpsb_host *hpsb_get_host_by_ne(struct node_entry *ne)
 {
-        if (atomic_read(&ne->generation) != get_hpsb_generation()) return NULL;
-        if (ne->node_id == ne->host->node_id) return ne->host;
+        if (atomic_read(&ne->generation) != get_hpsb_generation(ne->host))
+		return NULL;
+        if (ne->nodeid == ne->host->node_id) return ne->host;
         return NULL;
 }
 
 int hpsb_guid_fill_packet(struct node_entry *ne, struct hpsb_packet *pkt)
 {
-        if (atomic_read(&ne->generation) != get_hpsb_generation()) return 0;
+        if (atomic_read(&ne->generation) != get_hpsb_generation(ne->host))
+		return 0;
 
         pkt->host = ne->host;
-        pkt->node_id = ne->node_id;
+        pkt->node_id = ne->nodeid;
         pkt->generation = atomic_read(&ne->generation);
         return 1;
 }
 
-static int nodemgr_reset_handler(void *__hi)
-{
-	struct host_info *hi = (struct host_info *)__hi;
-	struct hpsb_host *host = hi->host;
-
-
-	lock_kernel();
-
-	siginitsetinv(&current->blocked, sigmask(SIGKILL)|sigmask(SIGINT)|sigmask(SIGTERM));
-
-	strcpy(current->comm, "NodeMngr");
-
-	unlock_kernel();
-
-	do {
-		current->state = TASK_INTERRUPTIBLE;
-		schedule_timeout(HZ/50);
-
-		if (hi && host) {
-			nodemgr_node_probe(host);
-			interruptible_sleep_on(&hi->reset_wait);
-		} else
-			break;
-
-	} while (!signal_pending(current) && hi);
-
-	return(0);
-}
-
-static void nodemgr_schedule_thread (void *__hi)
-{
-	struct host_info *hi = (struct host_info *)__hi;
-
-	hi->ppid = current->pid;
-	hi->pid = kernel_thread(nodemgr_reset_handler, hi, 0);
-}
-
 static void nodemgr_add_host(struct hpsb_host *host)
 {
 	struct host_info *hi = kmalloc (sizeof (struct host_info), GFP_KERNEL);
@@ -400,10 +519,7 @@
 	 * until the first bus reset.  */
 	hi->host = host;
 	INIT_LIST_HEAD(&hi->list);
-	hi->pid = -1;
-	hi->ppid = -1;
-	init_waitqueue_head(&hi->reset_wait);
-	INIT_TQUEUE(&hi->task, nodemgr_schedule_thread, hi);
+	INIT_TQUEUE(&hi->task, nodemgr_node_probe, host);
 
 	spin_lock_irqsave (&host_info_lock, flags);
 	list_add_tail (&hi->list, &host_info_list);
@@ -419,14 +535,12 @@
 	int flags;
 
 	spin_lock_irqsave (&host_info_lock, flags);
-	lh = host_info_list.next;
-	while (lh != &host_info_list) {
+	list_for_each(lh, &host_info_list) {
 		struct host_info *myhi = list_entry(lh, struct host_info, list);
 		if (myhi->host == host) {
 			hi = myhi;
 			break;
 		}
-		lh = lh->next;
 	}
 
 	if (hi == NULL) {
@@ -434,11 +548,7 @@
 		goto done_reset_host;
 	}
 
-	if (hi->pid >= 0) {
-		wake_up(&hi->reset_wait);
-	} else {
-		schedule_task(&hi->task);
-	}
+	schedule_task(&hi->task);
 
 done_reset_host:
 	spin_unlock_irqrestore (&host_info_lock, flags);
@@ -453,10 +563,12 @@
 	struct node_entry *ne;
 	int flags;
 
+	/* Make sure we have no active scans */
+	flush_scheduled_tasks();
+
 	/* First remove all node entries for this host */
 	write_lock_irqsave(&node_lock, flags);
-	lh = node_list.next;
-	while (lh != &node_list) {
+	list_for_each(lh, &node_list) {
 		ne = list_entry(lh, struct node_entry, list);
 
 		/* Only checking this host */
@@ -464,19 +576,16 @@
 			continue;
 
 		nodemgr_remove_node(ne);
-		lh = lh->next;
 	}
 	write_unlock_irqrestore(&node_lock, flags);
 
 	spin_lock_irqsave (&host_info_lock, flags);
-	lh = host_info_list.next;
-	while (lh != &host_info_list) {
+	list_for_each(lh, &host_info_list) {
 		struct host_info *myhi = list_entry(lh, struct host_info, list);
 		if (myhi->host == host) {
 			hi = myhi;
 			break;
 		}
-		lh = lh->next;
 	}
 
 	if (hi == NULL) {
@@ -484,21 +593,7 @@
 		goto done_remove_host;
 	}
 
-	mb();
-
-	if (hi->pid >= 0) {
-		/* Kill the proc */
-		kill_proc(hi->pid, SIGKILL, 1);
-
-		/* XXX: We need a better way... */
-		current->state = TASK_INTERRUPTIBLE;
-		schedule_timeout(HZ/20);
-
-		/* Now tell the parent to sluff off the zombied body */
-		mb();
-		kill_proc(hi->ppid, SIGCHLD, 1);
-	}
-
+	list_del(&hi->list);
 	kfree (hi);
 
 done_remove_host:
@@ -507,7 +602,7 @@
 	return;
 }
 
-static struct hpsb_highlevel_ops guid_ops = {
+static struct hpsb_highlevel_ops nodemgr_ops = {
 	add_host:	nodemgr_add_host,
 	host_reset:	nodemgr_host_reset,
 	remove_host:	nodemgr_remove_host,
@@ -517,7 +612,7 @@
 
 void init_ieee1394_nodemgr(void)
 {
-        hl = hpsb_register_highlevel("Node manager", &guid_ops);
+        hl = hpsb_register_highlevel("Node manager", &nodemgr_ops);
         if (!hl) {
                 HPSB_ERR("Out of memory during ieee1394 initialization");
         }
diff -u --recursive --new-file v2.4.8/linux/drivers/ieee1394/nodemgr.h linux/drivers/ieee1394/nodemgr.h
--- v2.4.8/linux/drivers/ieee1394/nodemgr.h	Sun Aug 12 13:27:59 2001
+++ linux/drivers/ieee1394/nodemgr.h	Sun Aug 12 12:39:02 2001
@@ -20,41 +20,76 @@
 #ifndef _IEEE1394_NODEMGR_H
 #define _IEEE1394_NODEMGR_H
 
+/* '1' '3' '9' '4' in ASCII */
+#define IEEE1394_BUSID_MAGIC	0x31333934
 
-/*
- * General information: Finding out which GUID belongs to which node is done by
- * sending packets and therefore waiting for the answers.  Wherever it is
- * mentioned that a node is inaccessible this could just as well mean that we
- * just don't know yet (usually, bus reset handlers can't rely on GUIDs being
- * associated with current nodes).
- */
-
-struct node_entry;
-typedef struct node_entry *hpsb_guid_t;
-
+/* This is the start of a Node entry structure. It should be a stable API
+ * for which to gather info from the Node Manager about devices attached
+ * to the bus.  */
+struct bus_options {
+	u8	irmc;		/* Iso Resource Manager Capable */
+	u8	cmc;		/* Cycle Master Capable */
+	u8	isc;		/* Iso Capable */
+	u8	bmc;		/* Bus Master Capable */
+	u8	pmc;		/* Power Manager Capable (PNP spec) */
+	u8	cyc_clk_acc;	/* Cycle clock accuracy */
+	u8	generation;	/* Incremented when configrom changes */
+	u8	lnkspd;		/* Link speed */
+	u16	max_rec;	/* Maximum packet size node can receive */
+};
+
+#define UNIT_DIRECTORY_VENDOR_ID    0x01
+#define UNIT_DIRECTORY_MODEL_ID     0x02
+#define UNIT_DIRECTORY_SPECIFIER_ID 0x04
+#define UNIT_DIRECTORY_VERSION      0x08
+
+struct unit_directory {
+	struct list_head list;
+	octlet_t address;	/* Address of the unit directory on the node */
+	u8 flags;		/* Indicates which entries were read */
+	quadlet_t vendor_id;
+	char *vendor_name;
+	quadlet_t model_id;
+	char *model_name;
+	quadlet_t specifier_id;
+	quadlet_t version;
+};
+
+struct node_entry {
+	struct list_head list;
+	u64 guid;			/* GUID of this node */
+	struct hpsb_host *host;		/* Host this node is attached to */
+	nodeid_t nodeid;		/* NodeID */
+	struct bus_options busopt;	/* Bus Options */
+	atomic_t generation;		/* Synced with hpsb generation */
+
+	/* The following is read from the config rom */
+	u32 vendor_id;
+	u32 capabilities;	
+	struct list_head unit_directories;
+};
 
 /*
- * Returns a guid handle (which has its reference count incremented) or NULL if
- * there is the GUID in question is not known of.  Getting a valid handle does
- * not mean that the node with this GUID is currently accessible (might not be
- * plugged in or powered down).
+ * Returns a node entry (which has its reference count incremented) or NULL if
+ * the GUID in question is not known.  Getting a valid entry does not mean that
+ * the node with this GUID is currently accessible (might be powered down).
  */
-hpsb_guid_t hpsb_guid_get_handle(u64 guid);
+struct node_entry *hpsb_guid_get_entry(u64 guid);
+
+/* Same as above, but use the nodeid to get an node entry. This is not
+ * fool-proof by itself, since the nodeid can change.  */
+struct node_entry *hpsb_nodeid_get_entry(nodeid_t nodeid);
 
 /*
- * If the handle refers to a local host, this function will return the pointer
+ * If the entry refers to a local host, this function will return the pointer
  * to the hpsb_host structure.  It will return NULL otherwise.  Once you have
  * established it is a local host, you can use that knowledge from then on (the
- * GUID won't wander to an external node).
- *
- * Note that the local GUID currently isn't collected, so this will always
- * return NULL.
- */
-struct hpsb_host *hpsb_get_host_by_ne(hpsb_guid_t handle);
+ * GUID won't wander to an external node).  */
+struct hpsb_host *hpsb_get_host_by_ne(struct node_entry *ne);
 
 /*
  * This will fill in the given, pre-initialised hpsb_packet with the current
- * information from the GUID handle (host, node ID, generation number).  It will
+ * information from the node entry (host, node ID, generation number).  It will
  * return false if the node owning the GUID is not accessible (and not modify the 
  * hpsb_packet) and return true otherwise.
  *
@@ -63,7 +98,7 @@
  * number).  It will at least reliably fail so that you don't accidentally and
  * unknowingly send your packet to the wrong node.
  */
-int hpsb_guid_fill_packet(hpsb_guid_t handle, struct hpsb_packet *pkt);
+int hpsb_guid_fill_packet(struct node_entry *ne, struct hpsb_packet *pkt);
 
 
 void init_ieee1394_nodemgr(void);
diff -u --recursive --new-file v2.4.8/linux/drivers/ieee1394/ohci1394.c linux/drivers/ieee1394/ohci1394.c
--- v2.4.8/linux/drivers/ieee1394/ohci1394.c	Sun Aug 12 13:27:59 2001
+++ linux/drivers/ieee1394/ohci1394.c	Sun Aug 12 12:39:02 2001
@@ -172,7 +172,7 @@
 MODULE_DEVICE_TABLE(pci, ohci1394_pci_tbl);
 
 static char version[] __devinitdata =
-	"v0.50 15/Jul/01 Ben Collins <bcollins@debian.org>";
+	"v0.51 08/08/01 Ben Collins <bcollins@debian.org>";
 
 /* Module Parameters */
 MODULE_PARM(attempt_root,"i");
@@ -217,7 +217,7 @@
 	r = reg_read(ohci, OHCI1394_PhyControl);
 
 	if (i >= OHCI_LOOP_COUNT)
-		PRINT (KERN_ERR, ohci->id, "Get PHY Reg timeout [0x%08x/0x%08x/%d]\n",
+		PRINT (KERN_ERR, ohci->id, "Get PHY Reg timeout [0x%08x/0x%08x/%d]",
 		       r, r & 0x80000000, i);
   
 	spin_unlock_irqrestore (&ohci->phy_reg_lock, flags);
@@ -243,7 +243,7 @@
 	}
 
 	if (i == OHCI_LOOP_COUNT)
-		PRINT (KERN_ERR, ohci->id, "Set PHY Reg timeout [0x%08x/0x%08x/%d]\n",
+		PRINT (KERN_ERR, ohci->id, "Set PHY Reg timeout [0x%08x/0x%08x/%d]",
 		       r, r & 0x00004000, i);
 
 	spin_unlock_irqrestore (&ohci->phy_reg_lock, flags);
@@ -263,7 +263,7 @@
 	return;
 }
 
-static int handle_selfid(struct ti_ohci *ohci, struct hpsb_host *host,
+static void handle_selfid(struct ti_ohci *ohci, struct hpsb_host *host,
 				int phyid, int isroot)
 {
 	quadlet_t *q = ohci->selfid_buf_cpu;
@@ -295,7 +295,7 @@
 			PRINT(KERN_ERR, ohci->id, 
 			      "Too many errors on SelfID error reception, giving up!");
 		}
-		return -1;
+		return;
 	}
 	
 	size = ((self_id_count & 0x00001FFC) >> 2) - 1;
@@ -326,7 +326,8 @@
 	DBGMSG(ohci->id, "SelfID complete");
 
 	hpsb_selfid_complete(host, phyid, isroot);
-	return 0;
+
+	return;
 }
 
 static int ohci_soft_reset(struct ti_ohci *ohci) {
@@ -427,7 +428,7 @@
 	d->pending_first = NULL;
 	d->pending_last = NULL;
 
-	DBGMSG(ohci->id, "Transmit dma ctx=%d initialized", d->ctx);
+	DBGMSG(ohci->id, "Transmit DMA ctx=%d initialized", d->ctx);
 }
 
 /* Count the number of available iso contexts */
@@ -475,6 +476,16 @@
 	/* Set Link Power Status (LPS) */
 	reg_write(ohci, OHCI1394_HCControlSet, 0x00080000);
 
+	/* After enabling LPS, we need to wait for the connection
+	 * between phy and link to be established.  This should be
+	 * signaled by the LPS bit becoming 1, but this happens
+	 * immediately.  Instead we wait for reads from LinkControl to
+	 * give a valid result, i.e. not 0xffffffff. */
+	while (reg_read(ohci, OHCI1394_LinkControlSet) == 0xffffffff) {
+		DBGMSG(ohci->id, "waiting for phy-link connection");
+		mdelay(2);
+	}
+
 	/* Set the bus number */
 	reg_write(ohci, OHCI1394_NodeID, 0x0000ffc0);
 
@@ -640,11 +651,12 @@
 	u32 cycleTimer;
 	int idx = d->prg_ind;
 
-	DBGMSG(ohci->id, "Inserting packet for node %d, tlabel=%d, tcode=0x%x, speed=%d\n",
+	DBGMSG(ohci->id, "Inserting packet for node %d, tlabel=%d, tcode=0x%x, speed=%d",
 			packet->node_id, packet->tlabel, packet->tcode, packet->speed_code);
 
 	d->prg_cpu[idx]->begin.address = 0;
 	d->prg_cpu[idx]->begin.branchAddress = 0;
+
 	if (d->ctx==1) {
 		/* 
 		 * For response packets, we need to put a timeout value in
@@ -749,7 +761,7 @@
 
                 d->prg_cpu[idx]->end.branchAddress = 0;
                 d->prg_cpu[idx]->end.status = 0;
-                DBGMSG(ohci->id, "iso xmit context info: header[%08x %08x]\n"
+                DBGMSG(ohci->id, "Iso xmit context info: header[%08x %08x]\n"
                        "                       begin=%08x %08x %08x %08x\n"
                        "                             %08x %08x %08x %08x\n"
                        "                       end  =%08x %08x %08x %08x",
@@ -876,7 +888,7 @@
 
 	switch (cmd) {
 	case RESET_BUS:
-		DBGMSG(ohci->id, "Bus reset requested%s",
+		DBGMSG(ohci->id, "devctl: Bus reset requested%s",
 		       ((host->attempt_root || attempt_root) ? 
 		       " and attempting to become root" : ""));
 		set_phy_reg_mask (ohci, 1, 0x40 | ((host->attempt_root || attempt_root) ?
@@ -1074,7 +1086,7 @@
 	spin_lock_irqsave(&ohci->event_lock, flags);
 	event = reg_read(ohci, OHCI1394_IntEventClear);
 	reg_write(ohci, OHCI1394_IntEventClear,
-		  event & ~(OHCI1394_selfIDComplete|OHCI1394_busReset));
+		  event & ~(OHCI1394_selfIDComplete | OHCI1394_busReset));
 	spin_unlock_irqrestore(&ohci->event_lock, flags);
 
 	if (!event) return;
@@ -1091,7 +1103,7 @@
 	/* Someone wants a bus reset. Better watch what you wish for... */
 	if (event & OHCI1394_busReset) {
 		if (!host->in_bus_reset) {
-			DBGMSG(ohci->id, "Bus reset requested%s",
+			DBGMSG(ohci->id, "irq_handler: Bus reset requested%s",
 			      ((host->attempt_root || attempt_root) ?
 			      " and attempting to become root" : ""));
 			
@@ -1263,7 +1275,7 @@
 	/* Make sure we handle everything, just in case we accidentally
 	 * enabled an interrupt that we didn't write a handler for.  */
 	if (event)
-		PRINT(KERN_ERR, ohci->id, "Unhandled interrupt(s) 0x%08x\n",
+		PRINT(KERN_ERR, ohci->id, "Unhandled interrupt(s) 0x%08x",
 		      event);
 }
 
@@ -1367,7 +1379,7 @@
 		 * over more than one descriptor. The next case is where
 		 * it's all in the first descriptor.  */
 		if ((offset + length) > d->buf_size) {
-			DBGMSG(ohci->id,"Split packet rcv'd\n");
+			DBGMSG(ohci->id,"Split packet rcv'd");
 			if (length > d->split_buf_size) {
 				ohci1394_stop_context(ohci, d->ctrlClear,
 					     "Split packet size exceeded");
@@ -1417,7 +1429,7 @@
 				buf_ptr += offset/4;
 			}
 		} else {
-			DBGMSG(ohci->id,"Single packet rcv'd\n");
+			DBGMSG(ohci->id,"Single packet rcv'd");
 			memcpy(d->spb, buf_ptr, length);
 			offset += length;
 			buf_ptr += length/4;
@@ -1837,7 +1849,7 @@
 #define cf_put_4bytes(cr, b1, b2, b3, b4) \
 	(((cr)->data++)[0] = cpu_to_be32(((b1) << 24) | ((b2) << 16) | ((b3) << 8) | (b4)))
 
-#define cf_put_keyval(cr, key, val) (((cr)->data++)[0] = cpu_to_be32((key) << 24) | (val))
+#define cf_put_keyval(cr, key, val) (((cr)->data++)[0] = cpu_to_be32(((key) << 24) | (val)))
 
 static inline void cf_put_crc16(struct config_rom_ptr *cr, int unit)
 {
@@ -1851,7 +1863,7 @@
 {
 	if (cr->unitdir[unit].refer != NULL) {
 		*cr->unitdir[unit].refer |=
-			cr->data - cr->unitdir[unit].refer;
+			cpu_to_be32 (cr->data - cr->unitdir[unit].refer);
 		cf_put_crc16(cr, cr->unitdir[unit].refunit);
 	}
 	cr->unitnum = unit;
@@ -1891,7 +1903,7 @@
 	cf_put_1quad(&cr, reg_read(ohci, OHCI1394_GUIDLo));
 	cf_unit_end(&cr);
 
-	DBGMSG(ohci->id, "GUID: %08x:%08x\n", reg_read(ohci, OHCI1394_GUIDHi),
+	DBGMSG(ohci->id, "GUID: %08x:%08x", reg_read(ohci, OHCI1394_GUIDHi),
 		reg_read(ohci, OHCI1394_GUIDLo));
 
 	/* IEEE P1212 suggests the initial ROM header CRC should only
@@ -1962,10 +1974,10 @@
 	cf_put_4bytes(&cr, 'I', 'P', 'v', '6');
 	cf_unit_end(&cr);
 
-	return;
+	ohci->csr_config_rom_length = cr.data - ohci->csr_config_rom_cpu;
 }
 
-static size_t get_ohci_rom(struct hpsb_host *host, const quadlet_t **ptr)
+static size_t ohci_get_rom(struct hpsb_host *host, const quadlet_t **ptr)
 {
 	struct ti_ohci *ohci=host->hostdata;
 
@@ -1974,7 +1986,7 @@
 
 	*ptr = ohci->csr_config_rom_cpu;
 
-	return sizeof(ohci->csr_config_rom_cpu);
+	return ohci->csr_config_rom_length * 4;
 }
 
 int ohci_compare_swap(struct ti_ohci *ohci, quadlet_t *data,
@@ -2010,7 +2022,7 @@
 	name:			OHCI1394_DRIVER_NAME,
 	initialize_host:	ohci_initialize,
 	release_host:		ohci_remove,
-	get_rom:		get_ohci_rom,
+	get_rom:		ohci_get_rom,
 	transmit_packet:	ohci_transmit,
 	devctl:			ohci_devctl,
 	hw_csr_reg:		ohci_hw_csr_reg,
@@ -2329,7 +2341,7 @@
 			block_swab32(data, 1);
 			break;
                 default:
-			PRINT_G(KERN_ERR, "Invalid tcode in packet_swab (0x%x)\n", tcode);
+			PRINT_G(KERN_ERR, "Invalid tcode in packet_swab (0x%x)", tcode);
                         break;
         }
 	return;
@@ -2418,7 +2430,7 @@
 		return -ENXIO;
 	}
 	if ((ret = pci_module_init(&ohci1394_driver))) {
-		PRINT_G(KERN_ERR, "PCI module init failed\n");
+		PRINT_G(KERN_ERR, "PCI module init failed");
 		hpsb_unregister_lowlevel(&ohci_template);
 		return ret;
 	}
diff -u --recursive --new-file v2.4.8/linux/drivers/ieee1394/ohci1394.h linux/drivers/ieee1394/ohci1394.h
--- v2.4.8/linux/drivers/ieee1394/ohci1394.h	Wed Jul 25 17:10:20 2001
+++ linux/drivers/ieee1394/ohci1394.h	Sun Aug 12 12:39:02 2001
@@ -159,6 +159,7 @@
 	/* buffer for csr config rom */
         quadlet_t *csr_config_rom_cpu; 
         dma_addr_t csr_config_rom_bus; 
+	int csr_config_rom_length;
 
 	unsigned int max_packet_size;
 
diff -u --recursive --new-file v2.4.8/linux/drivers/ieee1394/pcilynx.c linux/drivers/ieee1394/pcilynx.c
--- v2.4.8/linux/drivers/ieee1394/pcilynx.c	Sun Aug 12 13:27:59 2001
+++ linux/drivers/ieee1394/pcilynx.c	Sun Aug 12 12:39:02 2001
@@ -58,20 +58,10 @@
 #define PRINTD(level, card, fmt, args...) do {} while (0)
 #endif
 
-static struct pci_device_id pcilynx_pci_tbl[] __devinitdata = {
-	{
-	  vendor: PCI_VENDOR_ID_TI,
-	  device: PCI_DEVICE_ID_TI_PCILYNX,
-	  subvendor: PCI_ANY_ID,
-	  subdevice: PCI_ANY_ID,
-	},
-	{ }			/* Terminating entry */
-};
-MODULE_DEVICE_TABLE(pci, pcilynx_pci_tbl);
 
 static struct ti_lynx cards[MAX_PCILYNX_CARDS];
 static int num_of_cards = 0;
-
+static struct hpsb_host_template lynx_template;
 
 /*
  * PCL handling functions.
@@ -152,10 +142,8 @@
 #endif
 
 
-static int add_card(struct pci_dev *dev);
-static void remove_card(struct ti_lynx *lynx);
-static int init_driver(void);
-
+static int add_card(struct pci_dev *dev, const struct pci_device_id *devid);
+static void remove_card(struct pci_dev *dev);
 
 
 
@@ -451,6 +439,7 @@
 }
 
 
+#if 0
 static int lynx_detect(struct hpsb_host_template *tmpl)
 {
         struct hpsb_host *host;
@@ -470,6 +459,7 @@
 
         return num_of_cards;
 }
+#endif
 
 static int lynx_initialize(struct hpsb_host *host)
 {
@@ -595,7 +585,7 @@
         
         if (host != NULL) {
                 lynx = host->hostdata;
-                remove_card(lynx);
+                remove_card(lynx->dev);
         } else {
 #ifdef CONFIG_IEEE1394_PCILYNX_PORTS
                 unregister_chrdev(PCILYNX_MAJOR, PCILYNX_DRIVER_NAME);
@@ -782,7 +772,7 @@
 
 
 static struct file_operations aux_ops = {
-	owner:		THIS_MODULE,
+        OWNER_THIS_MODULE
         read:           mem_read,
         write:          mem_write,
         poll:           aux_poll,
@@ -807,18 +797,23 @@
         enum { t_rom, t_aux, t_ram } type;
         struct memdata *md;
         
+        V22_COMPAT_MOD_INC_USE_COUNT;
+
         if (cid < PCILYNX_MINOR_AUX_START) {
                 /* just for completeness */
+                V22_COMPAT_MOD_DEC_USE_COUNT;
                 return -ENXIO;
         } else if (cid < PCILYNX_MINOR_ROM_START) {
                 cid -= PCILYNX_MINOR_AUX_START;
                 if (cid >= num_of_cards || !cards[cid].aux_port) {
+                        V22_COMPAT_MOD_DEC_USE_COUNT;
                         return -ENXIO;
                 }
                 type = t_aux;
         } else if (cid < PCILYNX_MINOR_RAM_START) {
                 cid -= PCILYNX_MINOR_ROM_START;
                 if (cid >= num_of_cards || !cards[cid].local_rom) {
+                        V22_COMPAT_MOD_DEC_USE_COUNT;
                         return -ENXIO;
                 }
                 type = t_rom;
@@ -827,16 +822,17 @@
                  * It is currently used inside the driver! */
                 cid -= PCILYNX_MINOR_RAM_START;
                 if (cid >= num_of_cards || !cards[cid].local_ram) {
+                        V22_COMPAT_MOD_DEC_USE_COUNT;
                         return -ENXIO;
                 }
                 type = t_ram;
         }
 
         md = (struct memdata *)kmalloc(sizeof(struct memdata), SLAB_KERNEL);
-        if (md == NULL)
+        if (md == NULL) {
+                V22_COMPAT_MOD_DEC_USE_COUNT;
                 return -ENOMEM;
-
-	MOD_INC_USE_COUNT;
+        }
 
         md->lynx = &cards[cid];
         md->cid = cid;
@@ -866,7 +862,7 @@
 
         kfree(md);
 
-	MOD_DEC_USE_COUNT;
+        V22_COMPAT_MOD_DEC_USE_COUNT;
         return 0;
 }
 
@@ -1210,8 +1206,7 @@
 
                 spin_unlock(&lynx->iso_rcv.lock);
 
-                queue_task(&lynx->iso_rcv.tq, &tq_immediate);
-                mark_bh(IMMEDIATE_BH);
+		tasklet_schedule(&lynx->iso_rcv.tq);
         }
 
         if (intmask & PCI_INT_DMA_HLT(CHANNEL_ASYNC_SEND)) {
@@ -1339,13 +1334,14 @@
 }
 
 
-static int add_card(struct pci_dev *dev)
+static int __devinit add_card(struct pci_dev *dev,
+                              const struct pci_device_id *devid)
 {
 #define FAIL(fmt, args...) do { \
         PRINT_G(KERN_ERR, fmt , ## args); \
         num_of_cards--; \
-        remove_card(lynx); \
-        return 1; \
+        remove_card(dev); \
+        return -1; \
         } while (0)
 
         struct ti_lynx *lynx; /* shortcut to currently handled device */
@@ -1355,27 +1351,31 @@
                 PRINT_G(KERN_WARNING, "cannot handle more than %d cards.  "
                         "Adjust MAX_PCILYNX_CARDS in pcilynx.h.",
                         MAX_PCILYNX_CARDS);
-                return 1;
+                return -1;
         }
 
         lynx = &cards[num_of_cards++];
 
-        lynx->id = num_of_cards-1;
-        lynx->dev = dev;
-	lynx->host->pdev = dev;
-
-	lynx->lock = SPIN_LOCK_UNLOCKED;
-	lynx->phy_reg_lock = SPIN_LOCK_UNLOCKED;
-
-        if (pci_set_dma_mask(dev, 0xffffffff)) {
+        if (pci_set_dma_mask(dev, 0xffffffff))
                 FAIL("DMA address limits not supported for PCILynx hardware %d",
                      lynx->id);
-        }
-        if (pci_enable_device(dev)) {
+        if (pci_enable_device(dev))
                 FAIL("failed to enable PCILynx hardware %d", lynx->id);
-        }
         pci_set_master(dev);
 
+        lynx->host = hpsb_get_host(&lynx_template, 0);
+        if (!lynx->host)
+                FAIL("failed to allocate host structure");
+
+        lynx->state = have_host_struct;
+
+        lynx->id = num_of_cards-1;
+        lynx->dev = dev;
+	lynx->host->pdev = dev;
+
+        lynx->lock = SPIN_LOCK_UNLOCKED;
+        lynx->phy_reg_lock = SPIN_LOCK_UNLOCKED;
+
 #ifndef CONFIG_IEEE1394_PCILYNX_LOCALRAM
         lynx->pcl_mem = pci_alloc_consistent(dev, LOCALRAM_SIZE,
                                              &lynx->pcl_mem_dma);
@@ -1475,7 +1475,8 @@
         init_waitqueue_head(&lynx->aux_intr_wait);
 #endif
 
-	INIT_TQUEUE(&lynx->iso_rcv.tq, (void (*)(void*))iso_rcv_bh, lynx);
+	tasklet_init(&lynx->iso_rcv.tq, (void (*)(unsigned long))iso_rcv_bh,
+		     (unsigned long)lynx);
 
         lynx->iso_rcv.lock = SPIN_LOCK_UNLOCKED;
 
@@ -1504,10 +1505,14 @@
 #undef FAIL
 }
 
-static void remove_card(struct ti_lynx *lynx)
+static void remove_card(struct pci_dev *dev)
 {
+        struct ti_lynx *lynx;
         int i;
 
+        lynx = cards;
+        while (lynx->dev != dev) lynx++;
+
         switch (lynx->state) {
         case have_intr:
                 reg_write(lynx, PCI_INT_ENABLE, 0);
@@ -1538,13 +1543,18 @@
                 pci_free_consistent(lynx->dev, LOCALRAM_SIZE, lynx->pcl_mem,
                                     lynx->pcl_mem_dma);
 #endif
+        case have_host_struct:
+                /* FIXME - verify host freeing */
         case clear:;
                 /* do nothing - already freed */
         }
 
+	tasklet_kill(&lynx->iso_rcv.tq);
+
         lynx->state = clear;
 }
 
+#if 0
 static int init_driver()
 {
         struct pci_dev *dev = NULL;
@@ -1580,6 +1590,7 @@
 
         return 0;
 }
+#endif
 
 
 static size_t get_lynx_rom(struct hpsb_host *host, const quadlet_t **ptr)
@@ -1588,40 +1599,60 @@
         return sizeof(lynx_csr_rom);
 }
 
-struct hpsb_host_template *get_lynx_template(void)
-{
-        static struct hpsb_host_template tmpl = {
-                name:             "pcilynx",
-                detect_hosts:     lynx_detect,
-                initialize_host:  lynx_initialize,
-                release_host:     lynx_release,
-                get_rom:          get_lynx_rom,
-                transmit_packet:  lynx_transmit,
-                devctl:           lynx_devctl
-        };
+static struct hpsb_host_template lynx_template = {
+	name:             PCILYNX_DRIVER_NAME,
+	initialize_host:  lynx_initialize,
+	release_host:     lynx_release,
+	get_rom:          get_lynx_rom,
+	transmit_packet:  lynx_transmit,
+	devctl:           lynx_devctl
+};
 
-        return &tmpl;
-}
+static struct pci_device_id pci_table[] __devinitdata = {
+	{
+                vendor:     PCI_VENDOR_ID_TI,
+                device:     PCI_DEVICE_ID_TI_PCILYNX,
+                subvendor:  PCI_ANY_ID,
+                subdevice:  PCI_ANY_ID,
+	},
+	{ }			/* Terminating entry */
+};
 
+static struct pci_driver lynx_pcidriver = {
+        name:      PCILYNX_DRIVER_NAME,
+        id_table:  pci_table,
+        probe:     add_card,
+        remove:    remove_card,
+};
 
 MODULE_AUTHOR("Andreas E. Bombe <andreas.bombe@munich.netsurf.de>");
 MODULE_DESCRIPTION("driver for Texas Instruments PCI Lynx IEEE-1394 controller");
 MODULE_SUPPORTED_DEVICE("pcilynx");
+MODULE_DEVICE_TABLE(pci, pci_table);
 
 static void __exit pcilynx_cleanup(void)
 {
-        hpsb_unregister_lowlevel(get_lynx_template());
+        pci_unregister_driver(&lynx_pcidriver);
+        hpsb_unregister_lowlevel(&lynx_template);
         PRINT_G(KERN_INFO, "removed " PCILYNX_DRIVER_NAME " module");
 }
 
 static int __init pcilynx_init(void)
 {
-        if (hpsb_register_lowlevel(get_lynx_template())) {
+        int ret;
+
+        if (hpsb_register_lowlevel(&lynx_template)) {
                 PRINT_G(KERN_ERR, "registering failed");
                 return -ENXIO;
-        } else {
-                return 0;
         }
+
+        ret = pci_module_init(&lynx_pcidriver);
+        if (ret < 0) {
+                PRINT_G(KERN_ERR, "PCI module init failed");
+                hpsb_unregister_lowlevel(&lynx_template);
+        }
+
+        return ret;
 }
 
 module_init(pcilynx_init);
diff -u --recursive --new-file v2.4.8/linux/drivers/ieee1394/pcilynx.h linux/drivers/ieee1394/pcilynx.h
--- v2.4.8/linux/drivers/ieee1394/pcilynx.h	Sun Feb  4 21:34:18 2001
+++ linux/drivers/ieee1394/pcilynx.h	Sun Aug 12 12:39:02 2001
@@ -40,7 +40,7 @@
                 u32 product;
         } phyic;
 
-        enum { clear, have_intr, have_aux_buf, have_pcl_mem,
+        enum { clear, have_host_struct,  have_intr, have_aux_buf, have_pcl_mem,
                have_1394_buffers, have_iomappings } state;
         
         /* remapped memory spaces */
@@ -106,7 +106,7 @@
                 pcl_t pcl_start;
                 int chan_count;
                 int next, last, used, running;
-                struct tq_struct tq;
+                struct tasklet_struct tq;
                 spinlock_t lock;
         } iso_rcv;
 };
@@ -125,23 +125,23 @@
 /*
  * Register read and write helper functions.
  */
-inline static void reg_write(const struct ti_lynx *lynx, int offset, u32 data)
+static inline void reg_write(const struct ti_lynx *lynx, int offset, u32 data)
 {
         writel(data, lynx->registers + offset);
 }
 
-inline static u32 reg_read(const struct ti_lynx *lynx, int offset)
+static inline u32 reg_read(const struct ti_lynx *lynx, int offset)
 {
         return readl(lynx->registers + offset);
 }
 
-inline static void reg_set_bits(const struct ti_lynx *lynx, int offset,
+static inline void reg_set_bits(const struct ti_lynx *lynx, int offset,
                                 u32 mask)
 {
         reg_write(lynx, offset, (reg_read(lynx, offset) | mask));
 }
 
-inline static void reg_clear_bits(const struct ti_lynx *lynx, int offset,
+static inline void reg_clear_bits(const struct ti_lynx *lynx, int offset,
                                   u32 mask)
 {
         reg_write(lynx, offset, (reg_read(lynx, offset) & ~mask));
@@ -370,7 +370,7 @@
 
 #ifdef CONFIG_IEEE1394_PCILYNX_LOCALRAM
 
-inline static void put_pcl(const struct ti_lynx *lynx, pcl_t pclid,
+static inline void put_pcl(const struct ti_lynx *lynx, pcl_t pclid,
                            const struct ti_pcl *pcl)
 {
         int i;
@@ -378,11 +378,11 @@
         u32 *out = (u32 *)(lynx->local_ram + pclid * sizeof(struct ti_pcl));
 
         for (i = 0; i < 32; i++, out++, in++) {
-                writel(cpu_to_le32(*in), out);
+                writel(*in, out);
         }
 }
 
-inline static void get_pcl(const struct ti_lynx *lynx, pcl_t pclid,
+static inline void get_pcl(const struct ti_lynx *lynx, pcl_t pclid,
                            struct ti_pcl *pcl)
 {
         int i;
@@ -390,25 +390,25 @@
         u32 *in = (u32 *)(lynx->local_ram + pclid * sizeof(struct ti_pcl));
 
         for (i = 0; i < 32; i++, out++, in++) {
-                *out = le32_to_cpu(readl(in));
+                *out = readl(in);
         }
 }
 
-inline static u32 pcl_bus(const struct ti_lynx *lynx, pcl_t pclid)
+static inline u32 pcl_bus(const struct ti_lynx *lynx, pcl_t pclid)
 {
         return pci_resource_start(lynx->dev, 1) + pclid * sizeof(struct ti_pcl);
 }
 
 #else /* CONFIG_IEEE1394_PCILYNX_LOCALRAM */
 
-inline static void put_pcl(const struct ti_lynx *lynx, pcl_t pclid,
+static inline void put_pcl(const struct ti_lynx *lynx, pcl_t pclid,
                            const struct ti_pcl *pcl)
 {
         memcpy_le32((u32 *)(lynx->pcl_mem + pclid * sizeof(struct ti_pcl)),
                     (u32 *)pcl, sizeof(struct ti_pcl));
 }
 
-inline static void get_pcl(const struct ti_lynx *lynx, pcl_t pclid,
+static inline void get_pcl(const struct ti_lynx *lynx, pcl_t pclid,
                            struct ti_pcl *pcl)
 {
         memcpy_le32((u32 *)pcl,
@@ -416,7 +416,7 @@
                     sizeof(struct ti_pcl));
 }
 
-inline static u32 pcl_bus(const struct ti_lynx *lynx, pcl_t pclid)
+static inline u32 pcl_bus(const struct ti_lynx *lynx, pcl_t pclid)
 {
         return lynx->pcl_mem_dma + pclid * sizeof(struct ti_pcl);
 }
@@ -427,14 +427,14 @@
 #if defined (CONFIG_IEEE1394_PCILYNX_LOCALRAM) || defined (__BIG_ENDIAN)
 typedef struct ti_pcl pcltmp_t;
 
-inline static struct ti_pcl *edit_pcl(const struct ti_lynx *lynx, pcl_t pclid,
+static inline struct ti_pcl *edit_pcl(const struct ti_lynx *lynx, pcl_t pclid,
                                       pcltmp_t *tmp)
 {
         get_pcl(lynx, pclid, tmp);
         return tmp;
 }
 
-inline static void commit_pcl(const struct ti_lynx *lynx, pcl_t pclid,
+static inline void commit_pcl(const struct ti_lynx *lynx, pcl_t pclid,
                               pcltmp_t *tmp)
 {
         put_pcl(lynx, pclid, tmp);
@@ -443,20 +443,20 @@
 #else
 typedef int pcltmp_t; /* just a dummy */
 
-inline static struct ti_pcl *edit_pcl(const struct ti_lynx *lynx, pcl_t pclid,
+static inline struct ti_pcl *edit_pcl(const struct ti_lynx *lynx, pcl_t pclid,
                                       pcltmp_t *tmp)
 {
         return lynx->pcl_mem + pclid * sizeof(struct ti_pcl);
 }
 
-inline static void commit_pcl(const struct ti_lynx *lynx, pcl_t pclid,
+static inline void commit_pcl(const struct ti_lynx *lynx, pcl_t pclid,
                               pcltmp_t *tmp)
 {
 }
 #endif
 
 
-inline static void run_sub_pcl(const struct ti_lynx *lynx, pcl_t pclid, int idx,
+static inline void run_sub_pcl(const struct ti_lynx *lynx, pcl_t pclid, int idx,
                                int dmachan)
 {
         reg_write(lynx, DMA0_CURRENT_PCL + dmachan * 0x20,
@@ -465,7 +465,7 @@
                   DMA_CHAN_CTRL_ENABLE | DMA_CHAN_CTRL_LINK);
 }
 
-inline static void run_pcl(const struct ti_lynx *lynx, pcl_t pclid, int dmachan)
+static inline void run_pcl(const struct ti_lynx *lynx, pcl_t pclid, int dmachan)
 {
         run_sub_pcl(lynx, pclid, 0, dmachan);
 }
diff -u --recursive --new-file v2.4.8/linux/drivers/ieee1394/raw1394.c linux/drivers/ieee1394/raw1394.c
--- v2.4.8/linux/drivers/ieee1394/raw1394.c	Wed Jul 25 17:10:20 2001
+++ linux/drivers/ieee1394/raw1394.c	Sun Aug 12 12:41:36 2001
@@ -20,8 +20,11 @@
 #include <linux/version.h>
 #include <linux/smp_lock.h>
 #include <asm/uaccess.h>
+#include <asm/atomic.h>
 
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,3,0)
 #include <linux/devfs_fs_kernel.h>
+#endif
 
 #include "ieee1394.h"
 #include "ieee1394_types.h"
@@ -43,9 +46,10 @@
 
 static devfs_handle_t devfs_handle;
 
-LIST_HEAD(host_info_list);
+static LIST_HEAD(host_info_list);
 static int host_count;
-spinlock_t host_info_lock = SPIN_LOCK_UNLOCKED;
+static spinlock_t host_info_lock = SPIN_LOCK_UNLOCKED;
+static atomic_t internal_generation = ATOMIC_INIT(0);
 
 static struct hpsb_highlevel *hl_handle;
 
@@ -69,7 +73,7 @@
         return req;
 }
 
-inline static struct pending_request *alloc_pending_request(void)
+static inline struct pending_request *alloc_pending_request(void)
 {
         return __alloc_pending_request(SLAB_KERNEL);
 }
@@ -148,6 +152,8 @@
                 host_count++;
                 spin_unlock_irq(&host_info_lock);
         }
+
+        atomic_inc(&internal_generation);
 }
 
 
@@ -156,13 +162,11 @@
         struct list_head *lh;
         struct host_info *hi;
 
-        lh = host_info_list.next;
-        while (lh != &host_info_list) {
+        list_for_each(lh, &host_info_list) {
                 hi = list_entry(lh, struct host_info, list);
                 if (hi->host == host) {
                         return hi;
                 }
-                lh = lh->next;
         }
 
         return NULL;
@@ -202,16 +206,14 @@
         hi = find_host_info(host);
 
         if (hi != NULL) {
-                lh = hi->file_info_list.next;
-
-                while (lh != &hi->file_info_list) {
+                list_for_each(lh, &hi->file_info_list) {
                         fi = list_entry(lh, struct file_info, list);
                         req = __alloc_pending_request(SLAB_ATOMIC);
 
                         if (req != NULL) {
                                 req->file_info = fi;
                                 req->req.type = RAW1394_REQ_BUS_RESET;
-                                req->req.generation = get_hpsb_generation();
+                                req->req.generation = get_hpsb_generation(host);
                                 req->req.misc = (host->node_id << 16)
                                         | host->node_count;
                                 if (fi->protocol_version > 3) {
@@ -221,11 +223,11 @@
 
                                 queue_complete_req(req);
                         }
-                                
-                        lh = lh->next;
                 }
         }
         spin_unlock_irqrestore(&host_info_lock, flags);
+
+        atomic_inc(&internal_generation);
 }
 
 static void iso_receive(struct hpsb_host *host, int channel, quadlet_t *data,
@@ -248,8 +250,7 @@
         hi = find_host_info(host);
 
         if (hi != NULL) {
-                for (lh = hi->file_info_list.next; lh != &hi->file_info_list;
-                     lh = lh->next) {
+		list_for_each(lh, &hi->file_info_list) {
                         fi = list_entry(lh, struct file_info, list);
 
                         if (!(fi->listen_channels & (1ULL << channel))) {
@@ -279,7 +280,7 @@
                         req->ibs = ibs;
                         req->data = ibs->data;
                         req->req.type = RAW1394_REQ_ISO_RECEIVE;
-                        req->req.generation = get_hpsb_generation();
+                        req->req.generation = get_hpsb_generation(host);
                         req->req.misc = 0;
                         req->req.recvb = ptr2int(fi->iso_buffer);
                         req->req.length = MIN(length, fi->iso_buffer_length);
@@ -289,10 +290,8 @@
         }
         spin_unlock_irqrestore(&host_info_lock, flags);
 
-        lh = reqs.next;
-        while (lh != &reqs) {
+        list_for_each(lh, &reqs) {
                 req = list_entry(lh, struct pending_request, list);
-                lh = lh->next;
                 queue_complete_req(req);
         }
 }
@@ -317,8 +316,7 @@
         hi = find_host_info(host);
 
         if (hi != NULL) {
-                for (lh = hi->file_info_list.next; lh != &hi->file_info_list;
-                     lh = lh->next) {
+		list_for_each(lh, &hi->file_info_list) {
                         fi = list_entry(lh, struct file_info, list);
 
                         if (!fi->fcp_buffer) {
@@ -348,7 +346,7 @@
                         req->ibs = ibs;
                         req->data = ibs->data;
                         req->req.type = RAW1394_REQ_FCP_REQUEST;
-                        req->req.generation = get_hpsb_generation();
+                        req->req.generation = get_hpsb_generation(host);
                         req->req.misc = nodeid | (direction << 16);
                         req->req.recvb = ptr2int(fi->fcp_buffer);
                         req->req.length = length;
@@ -358,16 +356,14 @@
         }
         spin_unlock_irqrestore(&host_info_lock, flags);
 
-        lh = reqs.next;
-        while (lh != &reqs) {
+        list_for_each(lh, &reqs) {
                 req = list_entry(lh, struct pending_request, list);
-                lh = lh->next;
                 queue_complete_req(req);
         }
 }
 
 
-static ssize_t dev_read(struct file *file, char *buffer, size_t count,
+static ssize_t raw1394_read(struct file *file, char *buffer, size_t count,
                     loff_t *offset_is_ignored)
 {
         struct file_info *fi = (struct file_info *)file->private_data;
@@ -421,7 +417,7 @@
                         fi->state = initialized;
                         fi->protocol_version = req->req.misc;
                         req->req.error = RAW1394_ERROR_NONE;
-                        req->req.generation = get_hpsb_generation();
+                        req->req.generation = atomic_read(&internal_generation);
                         break;
 
                 default:
@@ -443,9 +439,9 @@
         struct host_info *hi;
         struct raw1394_khost_list *khl;
 
-        if (req->req.generation != get_hpsb_generation()) {
+        if (req->req.generation != atomic_read(&internal_generation)) {
                 req->req.error = RAW1394_ERROR_GENERATION;
-                req->req.generation = get_hpsb_generation();
+                req->req.generation = atomic_read(&internal_generation);
                 req->req.length = 0;
                 queue_complete_req(req);
                 return sizeof(struct raw1394_request);
@@ -461,15 +457,13 @@
                         req->req.misc = host_count;
                         req->data = (quadlet_t *)khl;
                         
-                        lh = host_info_list.next;
-                        while (lh != &host_info_list) {
+                        list_for_each(lh, &host_info_list) {
                                 hi = list_entry(lh, struct host_info, list);
 
                                 khl->nodes = hi->host->node_count;
                                 strcpy(khl->name, hi->host->template->name);
 
                                 khl++;
-                                lh = lh->next;
                         }
                 }
                 spin_unlock_irq(&host_info_lock);
@@ -504,6 +498,7 @@
 
                 if (lh != NULL) {
                         req->req.error = RAW1394_ERROR_NONE;
+                        req->req.generation = get_hpsb_generation(fi->host);
                         req->req.misc = (fi->host->node_id << 16) 
                                 | fi->host->node_count;
                         if (fi->protocol_version > 3) {
@@ -810,9 +805,9 @@
                 return handle_iso_send(fi, req, node);
         }
 
-        if (req->req.generation != get_hpsb_generation()) {
+        if (req->req.generation != get_hpsb_generation(fi->host)) {
                 req->req.error = RAW1394_ERROR_GENERATION;
-                req->req.generation = get_hpsb_generation();
+                req->req.generation = get_hpsb_generation(fi->host);
                 req->req.length = 0;
                 queue_complete_req(req);
                 return sizeof(struct raw1394_request);
@@ -846,7 +841,7 @@
 }
 
 
-static ssize_t dev_write(struct file *file, const char *buffer, size_t count,
+static ssize_t raw1394_write(struct file *file, const char *buffer, size_t count,
                      loff_t *offset_is_ignored)
 {
         struct file_info *fi = (struct file_info *)file->private_data;
@@ -889,7 +884,7 @@
         return retval;
 }
 
-static unsigned int dev_poll(struct file *file, poll_table *pt)
+static unsigned int raw1394_poll(struct file *file, poll_table *pt)
 {
         struct file_info *fi = file->private_data;
         unsigned int mask = POLLOUT | POLLWRNORM;
@@ -905,7 +900,7 @@
         return mask;
 }
 
-static int dev_open(struct inode *inode, struct file *file)
+static int raw1394_open(struct inode *inode, struct file *file)
 {
         struct file_info *fi;
 
@@ -913,14 +908,14 @@
                 return -ENXIO;
         }
 
-	MOD_INC_USE_COUNT;
+        V22_COMPAT_MOD_INC_USE_COUNT;
 
         fi = kmalloc(sizeof(struct file_info), SLAB_KERNEL);
         if (fi == NULL) {
-		MOD_DEC_USE_COUNT;
+                V22_COMPAT_MOD_DEC_USE_COUNT;
                 return -ENOMEM;
         }
-
+        
         memset(fi, 0, sizeof(struct file_info));
 
         INIT_LIST_HEAD(&fi->list);
@@ -936,7 +931,7 @@
         return 0;
 }
 
-static int dev_release(struct inode *inode, struct file *file)
+static int raw1394_release(struct inode *inode, struct file *file)
 {
         struct file_info *fi = file->private_data;
         struct list_head *lh;
@@ -966,15 +961,11 @@
                         free_pending_request(req);
                 }
 
-                if (list_empty(&fi->req_pending)) {
-                        done = 1;
-                }
+                if (list_empty(&fi->req_pending)) done = 1;
 
                 spin_unlock_irq(&fi->reqlists_lock);
 
-                if (!done) {
-                        down_interruptible(&fi->complete_sem);
-                }
+                if (!done) down_interruptible(&fi->complete_sem);
         }
 
         if (fi->state == connected) {
@@ -987,7 +978,7 @@
 
         kfree(fi);
 
-        MOD_DEC_USE_COUNT;
+        V22_COMPAT_MOD_DEC_USE_COUNT;
         unlock_kernel();
         return 0;
 }
@@ -1001,12 +992,12 @@
 };
 
 static struct file_operations file_ops = {
-	owner:    THIS_MODULE,
-        read:     dev_read, 
-        write:    dev_write, 
-        poll:     dev_poll, 
-        open:     dev_open, 
-        release:  dev_release, 
+        OWNER_THIS_MODULE
+        read:     raw1394_read, 
+        write:    raw1394_write, 
+        poll:     raw1394_poll, 
+        open:     raw1394_open, 
+        release:  raw1394_release, 
 };
 
 static int __init init_raw1394(void)
diff -u --recursive --new-file v2.4.8/linux/drivers/ieee1394/sbp2.c linux/drivers/ieee1394/sbp2.c
--- v2.4.8/linux/drivers/ieee1394/sbp2.c	Wed Jul 25 17:10:20 2001
+++ linux/drivers/ieee1394/sbp2.c	Sun Aug 12 12:39:02 2001
@@ -76,29 +76,6 @@
  * fdisk, mkfs, etc.).
  *
  *
- * Module Load Options:
- *
- * The SBP-2 driver now has a number of module load parameters available for use
- * in debugging/testing. Following are the valid parameters 
- *	
- * no_bus_scan - Skip the initial scsi bus scan during module load
- * (1 = skip bus scan, 0 = perform bus scan, default = 0)
- *
- * mode_sense_hack - Emulate mode sense for devices like 1394 memory stick readers
- * (1 = emulate/fake mode sense, 0 = do not emulate/fake mode sense, default = 0)  
- *
- * max_speed - Force max speed allowed
- * (0 = 100mb, 1 = 200mb, 2 = 400mb, default = auto configure)
- *
- * serialize_io - Force scsi stack to send down one command at a time, for debugging
- * (1 = serialize all I/O, 0 = do not serialize I/O, default = 1) 
- *
- * no_large_packets - Force scsi stack to limit max packet size sent down, for debugging
- * (1 = limit max transfer size, 0 = do not limit max packet size, default = 0)
- *
- * (e.g. insmod sbp2 no_bus_scan=1)
- *
- *
  * Current Support:
  *
  * The SBP-2 driver is still in an early state, but supports a variety of devices.
@@ -166,20 +143,6 @@
  *	  define below).
  *
  *
- * Core IEEE-1394 Stack Changes:
- *
- *	- The IEEE-1394 core stack guid code attempts to read the node unique id from
- *	  each attached device after a bus reset. It currently uses a block read
- *	  request to do this, which "upsets" certain not-well-behaved devices, such as
- *	  some drives from QPS. If you have trouble with your IEEE-1394 storage 
- *	  device being detected after loading sbp2, try commenting out the 
- *	  init_ieee1394_guid() and cleanup_ieee1394_guid() lines at the bottom of 
- *	  ieee1394_core.c (and rebuild ieee1394.o). 
- *
- *	- In ohci1394.h, remove the IEEE1394_USE_BOTTOM_HALVES #define, and rebuild. 
- *	  This will give you around 30% to 40% performance increase.
- *
- *
  * History:
  *
  *	07/25/00 - Initial revision (JSG)
@@ -257,6 +220,8 @@
  *		   128KB max transfer limit.
  *	06/16/01 - Converted DMA interfaces to pci_dma - Ben Collins
  *							 <bcollins@debian.org
+ *	07/22/01 - Use NodeMngr to get info about the local host and
+ *		   attached devices. Ben Collins
  */
     
 /*
@@ -289,8 +254,10 @@
 #include "ieee1394_types.h"
 #include "ieee1394_core.h"
 #include "hosts.h"
+#include "nodemgr.h"
 #include "highlevel.h"
 #include "ieee1394_transactions.h"
+#include "ieee1394_hotplug.h"
 #include "../scsi/scsi.h"
 #include "../scsi/hosts.h"
 #include "../scsi/sd.h"
@@ -349,7 +316,7 @@
  */
 MODULE_PARM(max_speed,"i");
 MODULE_PARM_DESC(max_speed, "Force down max speed (2 = 400mb default, 1 = 200mb, 0 = 100mb)");
-static int max_speed = SPEED_S400;
+static int max_speed = SPEED_400;
 
 /*
  * Set serialize_io to 1 if you'd like only one scsi command sent down to us at a time (debugging).
@@ -366,14 +333,24 @@
 MODULE_PARM(no_large_packets,"i");
 MODULE_PARM_DESC(no_large_packets, "Do not allow large transfers from scsi drivers (debugging)");
 static int no_large_packets = 0;
- 
+
+/*
+ * Export information about protocols/devices supported by this driver
+ */
+static struct ieee1394_device_id sbp2_id_table[] = {
+	IEEE1394_PROTOCOL(SBP2_UNIT_SPEC_ID_ENTRY, SBP2_SW_VERSION_ENTRY),
+	{ }
+};
+
+MODULE_DEVICE_TABLE(ieee1394, sbp2_id_table); 
+
 /*
  * Debug levels, configured via kernel config.
  */
 
 #ifdef CONFIG_IEEE1394_SBP2_DEBUG_ORBS
 #define SBP2_ORB_DEBUG(fmt, args...)	HPSB_ERR("sbp2("__FUNCTION__"): "fmt, ## args)
-u32 global_outstanding_command_orbs = 0;
+static u32 global_outstanding_command_orbs = 0;
 #define outstanding_orb_incr global_outstanding_command_orbs++
 #define outstanding_orb_decr global_outstanding_command_orbs--
 #else
@@ -389,7 +366,7 @@
 #define SBP2_DMA_FREE(fmt, args...) \
 	HPSB_ERR("sbp2("__FUNCTION__")free(%d): "fmt, \
 		 --global_outstanding_dmas, ## args)
-u32 global_outstanding_dmas = 0;
+static u32 global_outstanding_dmas = 0;
 #else
 #define SBP2_DMA_ALLOC(fmt, args...)
 #define SBP2_DMA_FREE(fmt, args...)
@@ -432,9 +409,9 @@
 
 Scsi_Host_Template *global_scsi_tpnt = NULL;
 
-LIST_HEAD(sbp2_host_info_list);
+static LIST_HEAD(sbp2_host_info_list);
 static int sbp2_host_count = 0;
-spinlock_t sbp2_host_info_lock = SPIN_LOCK_UNLOCKED;
+static spinlock_t sbp2_host_info_lock = SPIN_LOCK_UNLOCKED;
 
 static struct hpsb_highlevel *sbp2_hl_handle = NULL;
 
@@ -681,7 +658,7 @@
 		INIT_LIST_HEAD(&packet->list);
 		sema_init(&packet->state_change, 0);
 		packet->state = unused;
-		packet->generation = get_hpsb_generation();
+		packet->generation = get_hpsb_generation(hi->host);
 		packet->data_be = 1;
 
 		packet->host = hi->host;
@@ -1021,7 +998,7 @@
 		sbp2_spin_lock(&sbp2_host_info_lock, flags);
 		list_add_tail(&hi->list, &sbp2_host_info_list);
 		sbp2_host_count++;
-		sbp2_spin_lock(&sbp2_host_info_lock, flags);
+		sbp2_spin_unlock(&sbp2_host_info_lock, flags);
 
 		/*
 		 * Initialize us to bus reset in progress
@@ -1046,19 +1023,19 @@
 }
 
 /*
- * This fuction returns a host info structure from the host structure, in case we have multiple hosts
+ * This fuction returns a host info structure from the host structure,
+ * in case we have multiple hosts
  */
-static struct sbp2scsi_host_info *sbp2_find_host_info(struct hpsb_host *host) {
+static struct sbp2scsi_host_info *sbp2_find_host_info(struct hpsb_host *host)
+{
 	struct list_head *lh;
 	struct sbp2scsi_host_info *hi;
 
-	lh = sbp2_host_info_list.next;
-	while (lh != &sbp2_host_info_list) {
+	list_for_each (lh, &sbp2_host_info_list) {
 		hi = list_entry(lh, struct sbp2scsi_host_info, list);
 		if (hi->host == host) {
 			return hi;
 		}
-		lh = lh->next;
 	}
 
 	return(NULL);
@@ -1142,12 +1119,14 @@
 	 * This thread doesn't need any user-level access,
 	 * so get rid of all our resources
 	 */
+#if LINUX_VERSION_CODE > 0x20300
 	daemonize();
+#endif
 
 	/* 
 	 * Set-up a nice name
 	 */
-	strcpy(current->comm, "sbp2");
+	strcpy(current->comm, SBP2_DEVICE_NAME);
 
 	unlock_kernel();
         
@@ -1179,35 +1158,22 @@
  */
 static int sbp2_start_device(struct sbp2scsi_host_info *hi, int node_id)
 {
-	quadlet_t node_unique_id_lo, node_unique_id_hi;
 	u64 node_unique_id;
 	struct scsi_id_instance_data *scsi_id = NULL;
+	struct node_entry *ne;
 	int i;
 
 	SBP2_DEBUG("sbp2: sbp2_start_device");
 
-	/*
-	 * Let's read the node unique id off of the device (using two quadlet reads for hi and lo)
-	 */
-	if (sbp2util_read_quadlet(hi, LOCAL_BUS | node_id, CONFIG_ROM_NODE_UNIQUE_ID_HI_ADDRESS, 
-				  &node_unique_id_hi)) {
-		SBP2_DEBUG("sbp2: Error reading node unique id - bad status");
-		return(-EIO);
-	}
-
-	if (sbp2util_read_quadlet(hi, LOCAL_BUS | node_id, CONFIG_ROM_NODE_UNIQUE_ID_LO_ADDRESS, 
-				  &node_unique_id_lo)) {
-		SBP2_DEBUG("sbp2: Error reading node unique id - bad status");
-		return(-EIO);
+	/* XXX: This will go away once we start using the nodemgr's
+	 * feature subscription API.  */
+	ne = hpsb_nodeid_get_entry(node_id|(hi->host->node_id & BUS_MASK));
+	if (!ne) {
+		HPSB_ERR("sbp2: Could not find device node");
+		return -ENXIO;
 	}
 
-	/*
-	 * Spit out the node unique ids we got
-	 */
-	SBP2_DEBUG("sbp2: Node %x, node unique id hi = %x", (LOCAL_BUS | node_id), (unsigned int) node_unique_id_hi);
-	SBP2_DEBUG("sbp2: Node %x, node unique id lo = %x", (LOCAL_BUS | node_id), (unsigned int) node_unique_id_lo);
-
-	node_unique_id = (((u64)node_unique_id_hi) << 32) | ((u64)node_unique_id_lo);
+	node_unique_id = ne->guid;
 
 	/*
 	 * First, we need to find out whether this is a "new" SBP-2 device plugged in, or one that already
@@ -1355,7 +1321,7 @@
 	scsi_id->node_id = node_id;
 	scsi_id->node_unique_id = node_unique_id;
 	scsi_id->validated = 1;
-	scsi_id->speed_code = SPEED_S100;
+	scsi_id->speed_code = SPEED_100;
 	scsi_id->max_payload_size = MAX_PAYLOAD_S100;
 
 	init_waitqueue_head(&scsi_id->sbp2_login_wait);
@@ -1458,7 +1424,7 @@
 }
 
 /*
- * This function trys to determine if a device is a valid SBP-2 device
+ * This function tries to determine if a device is a valid SBP-2 device
  */
 static int sbp2_check_device(struct sbp2scsi_host_info *hi, int node_id)
 {
@@ -2249,65 +2215,43 @@
  */
 static int sbp2_max_speed_and_size(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id)
 {
-	quadlet_t node_options, max_rec;
 	u8 speed_code;
+	struct node_entry *ne;
 
 	SBP2_DEBUG("sbp2: sbp2_max_speed_and_size");
 
-	/*
-	 * Get speed code from internal host structure. There should be a better way to obtain this.
-	 */
-	speed_code = hi->host->speed_map[(hi->host->node_id & NODE_MASK) * 64 + (scsi_id->node_id & NODE_MASK)];
+	/* Get this nodes information */
+	ne = hpsb_nodeid_get_entry(hi->host->node_id);
 
-	/*
-	 * Bump down our speed if there is a module parameter forcing us slower
-	 */
+	if (!ne) {
+		HPSB_ERR("sbp2: Unknown device, using S100, payload 512 bytes");
+		scsi_id->speed_code = SPEED_100;
+		scsi_id->max_payload_size = MAX_PAYLOAD_S100;
+		return(0);
+	}
+
+	speed_code = ne->busopt.lnkspd;
+
+	/* Bump down our speed if there is a module parameter forcing us slower */
 	if (speed_code > max_speed) {
 		speed_code = max_speed;
 		SBP2_ERR("sbp2: Reducing SBP-2 max speed allowed (%x)", max_speed); 
 	}
 
-	switch (speed_code) {
-		case SPEED_S100:
-			scsi_id->speed_code = SPEED_S100;
-			scsi_id->max_payload_size = MAX_PAYLOAD_S100;
-			SBP2_INFO("sbp2: SBP-2 device max speed S100 and payload 512 bytes"); 
-			break;
-		case SPEED_S200:
-			scsi_id->speed_code = SPEED_S200;
-			scsi_id->max_payload_size = MAX_PAYLOAD_S200;
-			SBP2_INFO("sbp2: SBP-2 device max speed S200 and payload 1KB"); 
-			break;
-		case SPEED_S400:
-			scsi_id->speed_code = SPEED_S400;
-			scsi_id->max_payload_size = MAX_PAYLOAD_S400;
-			SBP2_INFO("sbp2: SBP-2 device max speed S400 and payload 2KB"); 
-			break;
-		default:
-			scsi_id->speed_code = SPEED_S100;
-			scsi_id->max_payload_size = MAX_PAYLOAD_S100;
-			SBP2_ERR("sbp2: Undefined speed: Using SBP-2 device max speed S100 and payload 512 bytes"); 
-			break;
-	}
-
-	/*
-	 * Finally, check the adapter's capabilities to further bump down our max payload size
-	 * if necessary. For instance, TILynx may not support the default max payload at a 
-	 * particular speed.
-	 */
-	if (!hpsb_read(hi->host, hi->host->node_id | LOCAL_BUS, CONFIG_ROM_NODE_OPTIONS, &node_options, 4)) {
-
-		/* 
-		 * Grab max_rec (max payload = 2 ^ (max_rec+1)) from node options. Sbp2 max payload is 
-		 * defined as 2 ^ (max_pay+2)... so, have to subtract one from max rec for comparison...
-		 * confusing, eh?   ;-)
-		 */
-		max_rec = (be32_to_cpu(node_options) & 0x0000f000) >> 12;
-		if (scsi_id->max_payload_size > (max_rec - 1)) {
-			scsi_id->max_payload_size = (max_rec - 1);
-			SBP2_ERR("sbp2: Reducing SBP-2 max payload allowed (%x)", (max_rec - 1)); 
-		}
-
+	/* Support the devices max_rec and max speed. We choose a setting
+	 * that fits both values, since they may differ.  */
+	if (speed_code >= SPEED_400 && ne->busopt.max_rec >= MAX_REC_S400) {
+		HPSB_INFO("sbp2: SBP-2 device max speed S400 and payload 2KB");
+		scsi_id->speed_code = SPEED_400;
+		scsi_id->max_payload_size = MAX_PAYLOAD_S400;
+	} else if (speed_code >= SPEED_200 && ne->busopt.max_rec >= MAX_REC_S200) {
+		HPSB_INFO("sbp2: SBP-2 device max speed S200 and payload 1KB");
+		scsi_id->speed_code = SPEED_200;
+		scsi_id->max_payload_size = MAX_PAYLOAD_S200;
+	} else {
+		HPSB_INFO("sbp2: SBP-2 device max speed S100 and payload 512 bytes");
+		scsi_id->speed_code = SPEED_100;
+		scsi_id->max_payload_size = MAX_PAYLOAD_S100;
 	}
 
 	return(0);
@@ -3480,9 +3424,9 @@
 	SBP2_DEBUG("sbp2: sbp2scsi_detect");
 
 	global_scsi_tpnt = tpnt;
-
-	global_scsi_tpnt->proc_name = "sbp2";
-
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,3,26)
+	global_scsi_tpnt->proc_name = SBP2_DEVICE_NAME;
+#endif
 	/*
 	 * Module load option for force one command at a time
 	 */
@@ -3554,9 +3498,7 @@
 	return;
 }
 
-/*
- * Called when our module is released
- */
+/* Called when our module is released */
 static int sbp2scsi_release(struct Scsi_Host *host)
 {
 	SBP2_DEBUG("sbp2: sbp2scsi_release");
@@ -3564,25 +3506,32 @@
 	return(0);
 }
 
-/*
- * Called for contents of procfs
- */
+/* Called for contents of procfs */
 static const char *sbp2scsi_info (struct Scsi_Host *host)
 {
 	return "IEEE-1394 SBP-2 protocol driver";
 }
 
-/*
- * Module related section
- */
-
 MODULE_AUTHOR("James Goodwin <jamesg@filanet.com>");
 MODULE_DESCRIPTION("IEEE-1394 SBP-2 protocol driver");
-MODULE_SUPPORTED_DEVICE("sbp2");
+MODULE_SUPPORTED_DEVICE(SBP2_DEVICE_NAME);
 
-/*
- * SCSI host template
- */
-static Scsi_Host_Template driver_template = SBP2SCSI;
+/* SCSI host template */
+static Scsi_Host_Template driver_template = {
+	name:		"IEEE1394 SBP-2",
+	detect:		sbp2scsi_detect,
+	release:	sbp2scsi_release,
+	info:		sbp2scsi_info,
+	queuecommand:	sbp2scsi_queuecommand,
+	abort:		sbp2scsi_abort,
+	reset:		sbp2scsi_reset,
+	bios_param:	sbp2scsi_biosparam,
+	can_queue:	SBP2SCSI_MAX_OUTSTANDING_CMDS,
+	this_id:	-1,
+	sg_tablesize:	SBP2_MAX_SG_ELEMENTS,
+	cmd_per_lun:	SBP2SCSI_MAX_CMDS_PER_LUN,
+	use_clustering:	SBP2_CLUSTERING,
+	emulated:	1
+};
 
 #include "../scsi/scsi_module.c"
diff -u --recursive --new-file v2.4.8/linux/drivers/ieee1394/sbp2.h linux/drivers/ieee1394/sbp2.h
--- v2.4.8/linux/drivers/ieee1394/sbp2.h	Wed Jul 25 17:10:20 2001
+++ linux/drivers/ieee1394/sbp2.h	Sun Aug 12 12:39:02 2001
@@ -43,11 +43,16 @@
 #define SPEED_S1600			0x4
 #define SPEED_S3200			0x5
 
-/* 2^(MAX_PAYLOAD+2) = Maximum data transfer length */
+/* 2^(MAX_PAYLOAD+1) = Maximum data transfer length */
 #define MAX_PAYLOAD_S100		0x7
 #define MAX_PAYLOAD_S200		0x8
 #define MAX_PAYLOAD_S400		0x9
 
+/* Max rec matches node_entry values */
+#define MAX_REC_S100			512
+#define MAX_REC_S200			1024
+#define MAX_REC_S400			2048
+
 #define ORB_SET_NOTIFY(value)                   ((value & 0x1) << 31)
 #define ORB_SET_RQ_FMT(value)                   ((value & 0x3) << 29)
 #define ORB_SET_NODE_ID(value)			((value & 0xffff) << 16)
@@ -238,10 +243,7 @@
 
 #define CONFIG_ROM_BASE_ADDRESS					0xfffff0000400ULL
 #define CONFIG_ROM_ROOT_DIR_BASE				0xfffff0000414ULL
-#define CONFIG_ROM_NODE_UNIQUE_ID_HI_ADDRESS			0xfffff000040cULL
-#define CONFIG_ROM_NODE_UNIQUE_ID_LO_ADDRESS			0xfffff0000410ULL
 #define CONFIG_ROM_SIGNATURE_ADDRESS				0xfffff0000404ULL
-#define CONFIG_ROM_NODE_OPTIONS					0xfffff0000408ULL
 #define CONFIG_ROM_UNIT_DIRECTORY_OFFSET			0xfffff0000424ULL
 
 #define IEEE1394_CONFIG_ROM_SIGNATURE				0x31333934
@@ -301,26 +303,6 @@
 	DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN
 };
 
-
-/*
- * Scsi_Host structure
- */
-#define SBP2SCSI { \
-	name:		"IEEE1394 SBP-2",		\
-	detect:		sbp2scsi_detect,		\
-	release:	sbp2scsi_release,		\
-	info:		sbp2scsi_info,			\
-	queuecommand:	sbp2scsi_queuecommand,		\
-	abort:		sbp2scsi_abort,			\
-	reset:		sbp2scsi_reset,			\
-	bios_param:	sbp2scsi_biosparam,		\
-	can_queue:	SBP2SCSI_MAX_OUTSTANDING_CMDS,	\
-	this_id:	-1,				\
-	sg_tablesize:	SBP2_MAX_SG_ELEMENTS,		\
-	cmd_per_lun:	SBP2SCSI_MAX_CMDS_PER_LUN,	\
-	use_clustering:	SBP2_CLUSTERING,		\
-	emulated:	1				\
-}
 
 /*
  * Number of request packets available for actual sbp2 I/O requests (these are used
diff -u --recursive --new-file v2.4.8/linux/drivers/ieee1394/video1394.c linux/drivers/ieee1394/video1394.c
--- v2.4.8/linux/drivers/ieee1394/video1394.c	Sun Aug 12 13:27:59 2001
+++ linux/drivers/ieee1394/video1394.c	Sun Aug 12 12:39:02 2001
@@ -103,6 +103,7 @@
 	int ctxMatch;
 	wait_queue_head_t waitq;
         spinlock_t lock;
+    unsigned int syt_offset;
 	int flags;
 };
 
@@ -140,10 +141,10 @@
 #define PRINT(level, card, fmt, args...) \
 printk(level "video1394_%d: " fmt "\n" , card , ## args)
 
-void irq_handler(int card, quadlet_t isoRecvIntEvent, 
+static void irq_handler(int card, quadlet_t isoRecvIntEvent, 
 		 quadlet_t isoXmitIntEvent);
 
-LIST_HEAD(video1394_cards);
+static LIST_HEAD(video1394_cards);
 static spinlock_t video1394_cards_lock = SPIN_LOCK_UNLOCKED;
 
 static devfs_handle_t devfs_handle;
@@ -607,7 +608,7 @@
 }
 
 static inline void put_timestamp(struct ti_ohci *ohci, struct dma_iso_ctx * d,
-				 int curr, int n)
+				 int n)
 {
 	unsigned char* buf = d->buf + n * d->buf_size;
 	u32 cycleTimer;
@@ -619,13 +620,39 @@
 
 	cycleTimer = reg_read(ohci, OHCI1394_IsochronousCycleTimer);
 
-	timeStamp = ((cycleTimer & 0x0fff) + 11059);
+	timeStamp = ((cycleTimer & 0x0fff) + d->syt_offset); /* 11059 = 450 us */
 	timeStamp = (timeStamp % 3072 + ((timeStamp / 3072) << 12)
 		+ (cycleTimer & 0xf000)) & 0xffff;
 	
 	buf[6] = timeStamp >> 8; 
 	buf[7] = timeStamp & 0xff; 
 
+    /* if first packet is empty packet, then put timestamp into the next full one too */
+    if ( (d->it_prg[n][0].data[1] >>16) == 0x008) {
+   	    buf += d->packet_size;
+    	buf[6] = timeStamp >> 8;
+	    buf[7] = timeStamp & 0xff;
+	}
+
+    /* do the next buffer frame too in case of irq latency */
+	n = d->next_buffer[n];
+	if (n == -1) {
+	  return;
+	}
+	buf = d->buf + n * d->buf_size;
+
+	timeStamp += (d->last_used_cmd[n] << 12) & 0xffff;
+
+	buf[6] = timeStamp >> 8;
+	buf[7] = timeStamp & 0xff;
+
+    /* if first packet is empty packet, then put timestamp into the next full one too */
+    if ( (d->it_prg[n][0].data[1] >>16) == 0x008) {
+   	    buf += d->packet_size;
+    	buf[6] = timeStamp >> 8;
+	    buf[7] = timeStamp & 0xff;
+	}
+
 #if 0
 	printk("curr: %d, next: %d, cycleTimer: %08x timeStamp: %08x\n",
 	       curr, n, cycleTimer, timeStamp);
@@ -646,7 +673,7 @@
 	for (i=0;i<d->num_desc;i++) {
 		if (d->it_prg[i][d->last_used_cmd[i]].end.status& 0xFFFF0000) {
 			int next = d->next_buffer[i];
-			put_timestamp(ohci, d, i, next);
+			put_timestamp(ohci, d, next);
 			d->it_prg[i][d->last_used_cmd[i]].end.status = 0;
 			d->buffer_status[i] = VIDEO1394_BUFFER_READY;
 		}
@@ -757,12 +784,13 @@
 }
 
 static void initialize_dma_it_ctx(struct dma_iso_ctx *d, int sync_tag,
-				  int flags)
+				  unsigned int syt_offset, int flags)
 {
 	struct ti_ohci *ohci = (struct ti_ohci *)d->ohci;
 	int i;
 
 	d->flags = flags;
+	d->syt_offset = (syt_offset == 0 ? 11000 : syt_offset);
 
 	ohci1394_stop_context(ohci, d->ctrlClear, NULL);
 
@@ -807,7 +835,7 @@
 			   unsigned int cmd, unsigned long arg)
 {
 	struct video_card *video = NULL;
-	struct ti_ohci *ohci;
+	struct ti_ohci *ohci = NULL;
 	unsigned long flags;
 	struct list_head *lh;
 
@@ -931,7 +959,7 @@
 				return -EFAULT;
 			}
 			initialize_dma_it_ctx(video->it_context[i], 
-					      v.sync_tag, v.flags);
+					      v.sync_tag, v.syt_offset, v.flags);
 
 			video->current_ctx = video->it_context[i];
 
@@ -1200,6 +1228,7 @@
 		{
 			DBGMSG(ohci->id, "Starting iso transmit DMA ctx=%d",
 			       d->ctx);
+			put_timestamp(ohci, d, d->last_buffer);
 
 			/* Tell the controller where the first program is */
 			reg_write(ohci, d->cmdPtr, 
@@ -1214,6 +1243,7 @@
 				PRINT(KERN_INFO, ohci->id, 
 				      "Waking up iso transmit dma ctx=%d", 
 				      d->ctx);
+				put_timestamp(ohci, d, d->last_buffer);
 				reg_write(ohci, d->ctrlSet, 0x1000);
 			}
 		}
@@ -1340,7 +1370,7 @@
         if (video == NULL)
                 return -EIO;
 
-	MOD_INC_USE_COUNT;
+	V22_COMPAT_MOD_INC_USE_COUNT;
 
 	return 0;
 }
@@ -1407,13 +1437,13 @@
 			free_dma_iso_ctx(&video->it_context[i]);
 		}
 
-	MOD_DEC_USE_COUNT;
+	V22_COMPAT_MOD_DEC_USE_COUNT;
 
 	unlock_kernel();
 	return 0;
 }
 
-void irq_handler(int card, quadlet_t isoRecvIntEvent, 
+static void irq_handler(int card, quadlet_t isoRecvIntEvent, 
 		 quadlet_t isoXmitIntEvent)
 {
 	int i, flags;
@@ -1455,7 +1485,7 @@
 
 static struct file_operations video1394_fops=
 {
-	owner:		THIS_MODULE,
+        OWNER_THIS_MODULE
 	ioctl:		video1394_ioctl,
 	mmap:		video1394_mmap,
 	open:		video1394_open,
@@ -1623,7 +1653,12 @@
 				VIDEO1394_MAJOR);
 		return -EIO;
 	}
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0)
+	devfs_handle = devfs_mk_dir(NULL, VIDEO1394_DRIVER_NAME,
+			strlen(VIDEO1394_DRIVER_NAME), NULL);
+#else
 	devfs_handle = devfs_mk_dir(NULL, VIDEO1394_DRIVER_NAME, NULL);
+#endif
 
 	hl_handle = hpsb_register_highlevel (VIDEO1394_DRIVER_NAME, &hl_ops);
 	if (hl_handle == NULL) {
diff -u --recursive --new-file v2.4.8/linux/drivers/ieee1394/video1394.h linux/drivers/ieee1394/video1394.h
--- v2.4.8/linux/drivers/ieee1394/video1394.h	Wed Jul 25 17:10:20 2001
+++ linux/drivers/ieee1394/video1394.h	Sun Aug 12 12:39:02 2001
@@ -54,6 +54,7 @@
 	unsigned int packet_size; /* For VARIABLE_PACKET_SIZE: 
 				     Maximum packet size */
 	unsigned int fps;
+	unsigned int syt_offset;
 	unsigned int flags;
 };
 
diff -u --recursive --new-file v2.4.8/linux/drivers/isdn/avmb1/capi.c linux/drivers/isdn/avmb1/capi.c
--- v2.4.8/linux/drivers/isdn/avmb1/capi.c	Tue Jul  3 17:08:19 2001
+++ linux/drivers/isdn/avmb1/capi.c	Sun Aug 12 10:38:48 2001
@@ -697,12 +697,6 @@
 
 /* -------- file_operations for capidev ----------------------------- */
 
-static loff_t
-capi_llseek(struct file *file, loff_t offset, int origin)
-{
-	return -ESPIPE;
-}
-
 static ssize_t
 capi_read(struct file *file, char *buf, size_t count, loff_t *ppos)
 {
@@ -1073,7 +1067,7 @@
 static struct file_operations capi_fops =
 {
 	owner:		THIS_MODULE,
-	llseek:		capi_llseek,
+	llseek:		no_llseek,
 	read:		capi_read,
 	write:		capi_write,
 	poll:		capi_poll,
@@ -1110,12 +1104,6 @@
 	return 0;
 }
 
-static loff_t
-capinc_raw_llseek(struct file *file, loff_t offset, int origin)
-{
-	return -ESPIPE;
-}
-
 static ssize_t
 capinc_raw_read(struct file *file, char *buf, size_t count, loff_t *ppos)
 {
@@ -1269,7 +1257,7 @@
 static struct file_operations capinc_raw_fops =
 {
 	owner:		THIS_MODULE,
-	llseek:		capinc_raw_llseek,
+	llseek:		no_llseek,
 	read:		capinc_raw_read,
 	write:		capinc_raw_write,
 	poll:		capinc_raw_poll,
diff -u --recursive --new-file v2.4.8/linux/drivers/isdn/divert/divert_procfs.c linux/drivers/isdn/divert/divert_procfs.c
--- v2.4.8/linux/drivers/isdn/divert/divert_procfs.c	Mon Nov 27 16:53:43 2000
+++ linux/drivers/isdn/divert/divert_procfs.c	Sun Aug 12 10:38:48 2001
@@ -276,15 +276,9 @@
 
 
 #ifdef CONFIG_PROC_FS
-static loff_t
-isdn_divert_lseek(struct file *file, loff_t offset, int orig)
-{
-	return -ESPIPE;
-}
-
 static struct file_operations isdn_fops =
 {
-	llseek:         isdn_divert_lseek,
+	llseek:         no_llseek,
 	read:           isdn_divert_read,
 	write:          isdn_divert_write,
 	poll:           isdn_divert_poll,
diff -u --recursive --new-file v2.4.8/linux/drivers/isdn/eicon/common.c linux/drivers/isdn/eicon/common.c
--- v2.4.8/linux/drivers/isdn/eicon/common.c	Tue Jul  3 17:08:19 2001
+++ linux/drivers/isdn/eicon/common.c	Sun Aug 12 17:37:53 2001
@@ -37,9 +37,6 @@
 #define DIVAS_IRQ_RESET		0xC18
 #define DIVAS_IRQ_RESET_VAL	0xFE
 
-#define	PCI_LATENCY	PCI_LATENCY_TIMER
-#define PCI_INTERRUPT	PCI_INTERRUPT_LINE
-
 #define TEST_INT_DIVAS		0x11
 #define TEST_INT_DIVAS_BRI	0x12
 #define TEST_INT_DIVAS_Q	0x13
@@ -78,7 +75,7 @@
 
 void    DIVA_DIDD_Read( DESCRIPTOR *table, int tablelength )
 {
-        bzero(table, tablelength);
+        memset(table, 0, tablelength);
 
         if (tablelength > sizeof(DIDD_Table))
           tablelength = sizeof(DIDD_Table);
@@ -89,7 +86,7 @@
         }
 
         if (tablelength > 0)
-          bcopy((void *)DIDD_Table, (void *)table, tablelength);
+          memcpy((void *)table, (void *)DIDD_Table, tablelength);
 
 	return;
 }
@@ -99,7 +96,7 @@
         if (tablelength > sizeof(DIDD_Table))
           tablelength = sizeof(DIDD_Table);
 
-	bcopy((void *)table, (void *)DIDD_Table, tablelength);
+	memcpy((void *)DIDD_Table, (void *)table, tablelength);
 
 	return;
 }
@@ -109,7 +106,7 @@
 {
     DESCRIPTOR d[32];
 
-    bzero(d, sizeof(d));
+    memset(d, 0, sizeof(d));
 
     d[0].type = IDI_DIMAINT;  /* identify the DIMAINT entry */
     d[0].channels = 0; /* zero channels associated with dimaint*/
@@ -478,7 +475,6 @@
 int DivasCardNew(dia_card_t *card_info)
 {
 	card_t *card;
-	byte b;
 	static boolean_t first_call = TRUE;
 	boolean_t NeedISRandReset = FALSE;
 
@@ -567,10 +563,6 @@
 			return -1;
 		}
 
-		b = card->cfg.irq;
-
-		UxPciConfigWrite(card->hw, sizeof(b), PCI_INTERRUPT_LINE, &b);
-
 		if (card_info->card_type != DIA_CARD_TYPE_DIVA_SERVER_Q)
 		{
 			if ((*card->card_reset)(card))
@@ -670,7 +662,7 @@
 		return -1;
 	}
 
-	bzero(card->e_tbl, sizeof(E_INFO) * num_entities);
+	memset(card->e_tbl, 0, sizeof(E_INFO) * num_entities);
 	card->e_max = num_entities;
 
     DIVA_DIDD_Read(d, sizeof(d));
diff -u --recursive --new-file v2.4.8/linux/drivers/isdn/eicon/eicon_mod.c linux/drivers/isdn/eicon/eicon_mod.c
--- v2.4.8/linux/drivers/isdn/eicon/eicon_mod.c	Fri Mar  2 11:12:08 2001
+++ linux/drivers/isdn/eicon/eicon_mod.c	Sun Aug 12 11:16:18 2001
@@ -1,4 +1,4 @@
-/* $Id: eicon_mod.c,v 1.37.6.4 2001/02/16 09:09:50 armin Exp $
+/* $Id: eicon_mod.c,v 1.37.6.5 2001/07/17 19:42:31 armin Exp $
  *
  * ISDN lowlevel-module for Eicon active cards.
  * 
@@ -55,7 +55,7 @@
 static eicon_card *cards = (eicon_card *) NULL;   /* glob. var , contains
                                                      start of card-list   */
 
-static char *eicon_revision = "$Revision: 1.37.6.4 $";
+static char *eicon_revision = "$Revision: 1.37.6.5 $";
 
 extern char *eicon_pci_revision;
 extern char *eicon_isa_revision;
@@ -1200,24 +1200,16 @@
 static void
 eicon_freecard(eicon_card *card) {
 	int i;
-	struct sk_buff *skb;
 
 	for(i = 0; i < (card->nchannels + 1); i++) {
-		while((skb = skb_dequeue(&card->bch[i].e.X)))
-			dev_kfree_skb(skb);
-		while((skb = skb_dequeue(&card->bch[i].e.R)))
-			dev_kfree_skb(skb);
+		skb_queue_purge(&card->bch[i].e.X);
+		skb_queue_purge(&card->bch[i].e.R);
 	}
-	while((skb = skb_dequeue(&card->sndq)))
-		dev_kfree_skb(skb);
-	while((skb = skb_dequeue(&card->rcvq)))
-		dev_kfree_skb(skb);
-	while((skb = skb_dequeue(&card->rackq)))
-		dev_kfree_skb(skb);
-	while((skb = skb_dequeue(&card->sackq)))
-		dev_kfree_skb(skb);
-	while((skb = skb_dequeue(&card->statq)))
-		dev_kfree_skb(skb);
+	skb_queue_purge(&card->sndq);
+	skb_queue_purge(&card->rcvq);
+	skb_queue_purge(&card->rackq);
+	skb_queue_purge(&card->sackq);
+	skb_queue_purge(&card->statq);
 
 #ifdef CONFIG_ISDN_DRV_EICON_PCI
 	kfree(card->sbufp);
diff -u --recursive --new-file v2.4.8/linux/drivers/isdn/eicon/kprintf.c linux/drivers/isdn/eicon/kprintf.c
--- v2.4.8/linux/drivers/isdn/eicon/kprintf.c	Sat May 19 17:43:06 2001
+++ linux/drivers/isdn/eicon/kprintf.c	Sun Aug 12 11:16:18 2001
@@ -37,468 +37,6 @@
 #include "divalog.h"
 #include "uxio.h"
 
-/*
- * Implementation of printf and sprintf for kernel
- */
-
-#define MAX_BUFF    (80)        /* limit size of temporary buffers */
-
-#define WRITE_CHAR(BUFFER, SIZE, C) \
-  if (--(SIZE) < 0) { (BUFFER)--; *(BUFFER) = '\0'; return; } *(BUFFER)++ = (C)
-
-
-/*
- * convert a number to decimal ASCII
- */
-
-static
-void    do_decimal( char            *temp,
-                    int             temp_len,
-                    unsigned int    value,
-                    char            *s)
-
-{
-    int     i;
-
-    temp[0] = '\0';
-
-    for (i = 1; i < temp_len; i++)
-    {
-        temp[i] = (char) ((value % 10) + (int) '0');
-        value /= 10;
-    }
-
-    for (i = (temp_len - 1); temp[i] == '0'; i--)
-    {
-        ;
-    }
-
-    if (i == 0)
-    {
-        i++;
-    }
-
-    while (i >= 0)
-    {
-        *s++ = temp[i--];
-    }
-
-    return;
-}
-
-/*
- * convert a number to octal ASCII
- */
-
-static
-void    do_octal(   char            *temp,
-                    unsigned int    value,
-                    char            *s)
-
-{
-    int     i;
-
-    temp[0] = '\0';
-
-    for (i = 1; i <= 11; i++)
-    {
-        temp[i] = (char) ((value & 07) + (int) '0');
-        value >>= 3;
-    }
-    temp[11] &= '3';
-
-    for (i = 11; temp[i] == '0'; i--)
-    {
-        ;
-    }
-
-    if (i == 0)
-    {
-        i++;
-    }
-
-    while (i >= 0)
-    {
-        *s++ = temp[i--];
-    }
-
-    return;
-}
-
-/*
- * convert a number to hex ASCII
- */
-
-static
-void    do_hex( char            *temp,
-                unsigned int    value,
-                char            *s)
-
-{
-    int     i;
-    static
-    char    *dec_to_hex = "0123456789abcdef";
-
-    temp[0] = '\0';
-
-    for (i = 1; i <= 8; i++)
-    {
-        temp[i] = dec_to_hex[value & 0x0f];
-        value >>= 4;
-    }
-
-    for (i = 8; temp[i] == '0'; i--)
-    {
-        ;
-    }
-
-    if (i == 0)
-    {
-        i++;
-    }
-
-    while (i >= 0)
-    {
-        *s++ = temp[i--];
-    }
-
-    return;
-}
-
-/*
- * convert a buffer to ASCII HEX
- */
-
-static
-void    do_buffer(  char    *buffer,
-                    int     length,
-                    char    *s)
-
-{
-    static
-    char    hex_char [] = "0123456789abcdef";
-    char    *b = buffer;
-    int     hex_byte;
-    int     nybble;
-
-    length = (length >= ((MAX_BUFF / 3) + 1)) ? (MAX_BUFF / 3) : length;
-
-    while (length)
-    {
-        hex_byte = (int) *b++;
-        nybble = (hex_byte >> 4) & 0xf;
-        *s++ = hex_char[nybble];
-        nybble = hex_byte & 0xf;
-        *s++ = hex_char[nybble];
-        *s++ = ' ';
-        length--;
-    }
-    *s = '\0';
-
-    return;
-}
-
-/*
- * Body of sprintf function: behaves just like standard sprintf, except we
- * have an extra argument (buffer size) which we use to ensure we don't
- * overflow
- */
-
-void    Divas_vsprintf(   char    *buffer,
-                    int     size,
-                    char    *fmt,
-                    va_list argptr)
-
-{
-    char        c;          /* single character buffer */
-    int         i;          /* handy scratch counter */
-    int         f;          /* format character (after %) */
-    char        *str;       /* pointer into string */
-    char        temp[20];   /* temp buffer used in printing numbers */
-    char        string[MAX_BUFF]; /* output from number conversion */
-    int         length;     /* length of string "str" */
-    char        fill;       /* fill character ' ' or '0' */
-    boolean_t   leftjust;   /* TRUE if left justified, else right justified */
-    int         fmax, fmin; /* field specifiers % MIN . MAX s */
-    int         leading;    /* number of leading/trailing fill characters */
-    char        sign;       /* set to '-' for negative decimals */
-    int         number;     /* numeric argument */
-
-    char        *buff_ptr;  /* pointer to user's buffer of hex data */
-    int         buff_len;   /* length of hex data */
-
-    /* make sure we have somthing to write into */
-
-    if ((!buffer) || (size <= 0))
-    {
-        return;
-    }
-
-    while (TRUE)
-    {
-        /* echo characters until end or '%' encountered */
-
-        while ((c = *fmt++) != '%')
-        {
-            if (!c)
-            {
-                *buffer = '\0';
-                return;
-            }
-            WRITE_CHAR(buffer, size, c);
-        }
-
-        /* echo %% as % */
-
-        if (*fmt == '%')
-        {
-            WRITE_CHAR(buffer, size, *fmt);
-            continue;
-        }
-
-        /* %- turns on left-justify */
-
-        if ((leftjust = (boolean_t) ((*fmt == '-') ? TRUE : FALSE)))
-        {
-            fmt++;
-        }
-
-        /* %0 turns on zero filling */
-
-        if (*fmt == '0')
-        {
-            fill = '0';
-        }
-        else
-        {
-            fill = ' ';
-        }
-
-        /* minium field width specifier for %d, u, x, c, s */
-
-        fmin = 0;
-
-        if (*fmt == '*')
-        {
-            fmin = va_arg(argptr, int);
-            fmt++;
-        }
-        else
-        {
-            while ('0' <= *fmt && *fmt <= '9')
-            {
-                fmin = (fmin * 10) + (*fmt++ - '0');
-            }
-        }
-
-        /* maximum string width specifier for %s */
-
-        fmax = 0;
-
-        if (*fmt == '.')
-        {
-            if (*(++fmt) == '*')
-            {
-                fmax = va_arg(argptr, int);
-                fmt++;
-            }
-            else
-            {
-                while ('0' <= *fmt && *fmt <= '9')
-                {
-                    fmax = (fmax * 10) + (*fmt++ - '0');
-                }
-            }
-        }
-
-        /* skip over 'l' option (ints are assumed same size as longs) */
-
-        if (*fmt == 'l')
-        {
-            fmt++;
-        }
-
-        /* get the format chacater */
-
-        if (!(f = *fmt++))
-        {
-            WRITE_CHAR(buffer, size, '%');
-            *buffer = '\0';
-            return;
-        }
-
-        sign = '\0';        /* sign == '-' for negative decimal */
-
-        str = string;
-
-        switch (f)
-        {
-        case 'c' :
-            string[0] = (char) va_arg(argptr, int);
-            string[1] = '\0';
-            fmax = 0;
-            fill = ' ';
-            break;
-
-        case 's' :
-            str = va_arg(argptr, char *);
-            fill = ' ';
-            break;
-
-        case 'D' :
-        case 'd' :
-            number = va_arg(argptr, int);
-            if (number < 0)
-            {
-                sign = '-';
-                number = -number;
-            }
-            do_decimal(temp, DIM(temp), (unsigned int) number, str);
-            fmax = 0;
-            break;
-
-        case 'U' :
-        case 'u' :
-            number = va_arg(argptr, int);
-            do_decimal(temp, DIM(temp), (unsigned int) number, str);
-            fmax = 0;
-            break;
-
-        case 'O' :
-        case 'o' :
-            number = va_arg(argptr, int);
-            do_octal(temp, (unsigned int) number, str);
-            fmax = 0;
-            break;
-
-        case 'X' :
-        case 'x' :
-            number = va_arg(argptr, int);
-            do_hex(temp, (unsigned int) number, str);
-            fmax = 0;
-            break;
-
-        case 'H' :
-        case 'h' :
-            buff_ptr = va_arg(argptr, char *);
-            buff_len = va_arg(argptr, int);
-            do_buffer(buff_ptr, buff_len, str);
-            fmax = 0;
-            break;
-
-        default :
-            WRITE_CHAR(buffer, size, ((char) f));
-            break;
-        }
-
-        /* get the length of the string */
-
-        length = 0;
-        while (str[length])
-        {
-            length++;
-        }
-
-        /* make sure we have fmax and fmin values that are O.K. */
-
-        if (fmin > DIM(string) || fmin < 0)
-        {
-            fmin = 0;
-        }
-
-        if (fmax > DIM(string) || fmax < 0)
-        {
-            fmax = 0;
-        }
-
-        /* figure out how many leading characters thare are */
-
-        leading = 0;
-
-        if (fmax || fmin)
-        {
-            if (fmax)
-            {
-                if (length > fmax)
-                {
-                    length = fmax;
-                }
-            }
-
-            if (fmin)
-            {
-                leading = fmin - length;
-            }
-
-            if (sign == '-')
-            {
-                leading--;
-            }
-        }
-
-        /* output sign now, if fill is numeric */
-
-        if (sign == '-' && fill == '0')
-        {
-            WRITE_CHAR(buffer, size, '-');
-        }
-
-        /* if right justified, output fill characters */
-
-        if (!leftjust)
-        {
-            for (i = 0; i < leading; i++)
-            {
-                WRITE_CHAR(buffer, size, fill);
-            }
-        }
-
-        /* output sign now, if fill is spaces */
-
-        if (sign == '-' && fill == ' ')
-        {
-            WRITE_CHAR(buffer, size, '-');
-        }
-
-        /* now the actual value */
-
-        for (i = 0; i < length; i++)
-        {
-            WRITE_CHAR(buffer, size, str[i]);
-        }
-
-        /* if left justified, fill out with the fill character */
-
-        if (leftjust)
-        {
-            for (i = 0; i < leading; i++)
-            {
-                WRITE_CHAR(buffer, size, fill);
-            }
-        }
-    }
-}
-
-/*
- * sprintf for kernel
- *
- * call our vsprintf assuming user has a big buffer....
- */
-
-void    DivasSprintf(char *buffer, char *fmt, ...)
-
-{
-    va_list     argptr;         /* pointer to additional args */
-
-    va_start(argptr, fmt);
-
-    Divas_vsprintf(buffer, 1024, fmt, argptr);
-
-    va_end(argptr);
-
-    return;
-}
-
 void    DivasPrintf(char  *fmt, ...)
 
 {
@@ -510,7 +48,7 @@
 
     /* clear log entry */
 
-    bzero((caddr_t) &log, sizeof(klog_t));
+    memset((void *) &log, 0, sizeof(klog_t));
 
     log.card = -1;
     log.type = KLOG_TEXT_MSG;
@@ -521,7 +59,7 @@
 
     /* call vsprintf to format the user's information */
 
-    Divas_vsprintf(log.buffer, DIM(log.buffer), fmt, argptr);
+    vsnprintf(log.buffer, DIM(log.buffer), fmt, argptr);
 
     va_end(argptr);
 
diff -u --recursive --new-file v2.4.8/linux/drivers/isdn/eicon/linchr.c linux/drivers/isdn/eicon/linchr.c
--- v2.4.8/linux/drivers/isdn/eicon/linchr.c	Tue Jul  3 17:08:19 2001
+++ linux/drivers/isdn/eicon/linchr.c	Sun Aug 12 17:37:53 2001
@@ -37,7 +37,6 @@
 
 extern int DivasCardNext;
 void UxPause(long ms);
-void bcopy(void *pSource, void *pDest, dword dwLength);
 int DivasGetMem(mem_block_t *);
 
 #define DIA_IOCTL_UNLOCK 12
@@ -157,11 +156,8 @@
 {
 	word wMask = 0;
 
-    if (!DivasLogFifoEmpty())
-    {
+	if (!DivasLogFifoEmpty())
 		wMask |= POLLIN | POLLRDNORM;
-	}
-
 	return wMask;
 }
 
@@ -174,14 +170,14 @@
 	{
 		printk(KERN_WARNING "Divas: Divalog buffer specifed a size that is too small (%d - %d required)\n",
 			BufferSize, sizeof(klog_t));
-		return 0;
+		return -EIO;
 	}
 
 	pHeadItem = (klog_t *) DivasLogFifoRead();
 
 	if (pHeadItem)
 	{
-		bcopy(pHeadItem, pClientLogBuffer, sizeof(klog_t));
+		memcpy(pClientLogBuffer, pHeadItem, sizeof(klog_t));
 		kfree(pHeadItem);
 		return sizeof(klog_t);
 	}
diff -u --recursive --new-file v2.4.8/linux/drivers/isdn/eicon/linsys.c linux/drivers/isdn/eicon/linsys.c
--- v2.4.8/linux/drivers/isdn/eicon/linsys.c	Fri Mar  2 11:12:08 2001
+++ linux/drivers/isdn/eicon/linsys.c	Sun Aug 12 17:37:53 2001
@@ -38,18 +38,6 @@
 
 #include "uxio.h"
 
-#ifdef MODULE
-void bcopy(void *pSource, void *pDest, dword dwLength)
-{
-	memcpy(pDest, pSource, dwLength);
-}
-#endif
-
-void bzero(void *pDataArea, dword dwLength)
-{
-	memset(pDataArea, 0, dwLength);
-}
-
 int Divas4BRIInitPCI(card_t *card, dia_card_t *cfg)
 {
 	/* Use UxPciConfigWrite	routines to initialise PCI config space */
diff -u --recursive --new-file v2.4.8/linux/drivers/isdn/eicon/log.c linux/drivers/isdn/eicon/log.c
--- v2.4.8/linux/drivers/isdn/eicon/log.c	Fri Mar  2 11:12:08 2001
+++ linux/drivers/isdn/eicon/log.c	Sun Aug 12 11:16:18 2001
@@ -96,7 +96,7 @@
 	}
 
 	m_count++;
-	bzero(new_klog,sizeof(KNODE));
+	memset(new_klog, 0, sizeof(KNODE));
 
 	/* Set head & tail to point to the new Msg Struct */
 	head=tail=new_klog;
@@ -112,7 +112,7 @@
 	}
 
 	m_count++;
-	bzero(new_klog,sizeof(KNODE));
+	memset(new_klog, 0, sizeof(KNODE));
 
 	/* Let last Msg Struct point to new Msg Struct & inc tail */
 	tail->next=new_klog;
@@ -125,7 +125,7 @@
         length = sizeof(klog_t);
     }
 
-    bcopy(entry,&tail->klog,length);
+    memcpy(&tail->klog, entry, length);
 
     return;
 }
@@ -155,7 +155,7 @@
 {
 	klog_t		klog;
 
-	bzero(&klog, sizeof(klog));
+	memset(&klog, 0, sizeof(klog));
 
 	klog.time_stamp = UxTimeGet();
 
@@ -166,7 +166,7 @@
 
 	klog.type = request ? KLOG_IDI_REQ : KLOG_IDI_CALLBACK;
 	klog.code = 0;
-	bcopy(e, klog.buffer, klog.length);
+	memcpy(klog.buffer, e, klog.length);
 
     /* send to the log driver and return */
 
diff -u --recursive --new-file v2.4.8/linux/drivers/isdn/eicon/uxio.h linux/drivers/isdn/eicon/uxio.h
--- v2.4.8/linux/drivers/isdn/eicon/uxio.h	Fri Mar  2 11:12:08 2001
+++ linux/drivers/isdn/eicon/uxio.h	Sun Aug 12 17:37:53 2001
@@ -58,10 +58,6 @@
 	isr_fn_t	*user_isr;
 };
 
-void bcopy(void *pSource, void *pDest, dword dwLength);
-void bzero(void *pDataArea, dword dwLength);
-
-
 /*
  * Get a card handle to enable card to be accessed
  */
diff -u --recursive --new-file v2.4.8/linux/drivers/isdn/eicon/xlog.c linux/drivers/isdn/eicon/xlog.c
--- v2.4.8/linux/drivers/isdn/eicon/xlog.c	Fri Mar  2 11:12:08 2001
+++ linux/drivers/isdn/eicon/xlog.c	Sun Aug 12 11:16:18 2001
@@ -59,7 +59,7 @@
 
 	x = (card_xlog_t *) b;
 
-	bzero(&klog, sizeof(klog));
+	memset(&klog, 0, sizeof(klog));
 
 	klog.time_stamp = (dword) x->time_hi;
 	klog.time_stamp = (klog.time_stamp << 16) | (dword) x->time_lo;
@@ -71,13 +71,13 @@
 	{
 		klog.type = KLOG_XTXT_MSG;
 		klog.code = 0;
-		bcopy(&x->xcode, klog.buffer, klog.length);
+		memcpy(klog.buffer, &x->xcode, klog.length);
 	}
 	else if (x->code == 2)
 	{
 		klog.type = KLOG_XLOG_MSG;
 		klog.code = x->xcode;
-		bcopy(&x->data, klog.buffer, klog.length);
+		memcpy(klog.buffer, &x->data, klog.length);
 	}
 	else
 	{
diff -u --recursive --new-file v2.4.8/linux/drivers/isdn/hysdn/hysdn_procconf.c linux/drivers/isdn/hysdn/hysdn_procconf.c
--- v2.4.8/linux/drivers/isdn/hysdn/hysdn_procconf.c	Sat May 19 17:54:14 2001
+++ linux/drivers/isdn/hysdn/hysdn_procconf.c	Sun Aug 12 10:38:48 2001
@@ -92,15 +92,6 @@
 	return (0);
 }				/* process_line */
 
-/*************************/
-/* dummy file operations */
-/*************************/
-static loff_t
-hysdn_dummy_lseek(struct file *file, loff_t offset, int orig)
-{
-	return -ESPIPE;
-}				/* hysdn_dummy_lseek */
-
 /***********************************/
 /* conf file operations and tables */
 /***********************************/
@@ -396,7 +387,7 @@
 /******************************************************/
 static struct file_operations conf_fops =
 {
-	llseek:         hysdn_dummy_lseek,
+	llseek:         no_llseek,
 	read:           hysdn_conf_read,
 	write:          hysdn_conf_write,
 	open:           hysdn_conf_open,
diff -u --recursive --new-file v2.4.8/linux/drivers/isdn/hysdn/hysdn_procfs.c linux/drivers/isdn/hysdn/hysdn_procfs.c
--- v2.4.8/linux/drivers/isdn/hysdn/hysdn_procfs.c	Fri Mar  2 11:12:10 2001
+++ linux/drivers/isdn/hysdn/hysdn_procfs.c	Sun Aug 12 10:38:48 2001
@@ -113,15 +113,6 @@
 }				/* put_log_buffer */
 
 
-/*************************/
-/* dummy file operations */
-/*************************/
-static loff_t
-hysdn_dummy_lseek(struct file *file, loff_t offset, int orig)
-{
-	return -ESPIPE;
-}				/* hysdn_dummy_lseek */
-
 /**********************************/
 /* log file operations and tables */
 /**********************************/
@@ -340,7 +331,7 @@
 /**************************************************/
 static struct file_operations log_fops =
 {
-	llseek:		hysdn_dummy_lseek,
+	llseek:		no_llseek,
 	read:		hysdn_log_read,
 	write:		hysdn_log_write,
 	poll:		hysdn_log_poll,
diff -u --recursive --new-file v2.4.8/linux/drivers/isdn/hysdn/hysdn_proclog.c linux/drivers/isdn/hysdn/hysdn_proclog.c
--- v2.4.8/linux/drivers/isdn/hysdn/hysdn_proclog.c	Tue Jul  3 17:08:19 2001
+++ linux/drivers/isdn/hysdn/hysdn_proclog.c	Sun Aug 12 10:38:48 2001
@@ -153,15 +153,6 @@
 }				/* put_log_buffer */
 
 
-/*************************/
-/* dummy file operations */
-/*************************/
-static loff_t
-hysdn_dummy_lseek(struct file *file, loff_t offset, int orig)
-{
-	return -ESPIPE;
-}				/* hysdn_dummy_lseek */
-
 /******************************/
 /* file operations and tables */
 /******************************/
@@ -411,7 +402,7 @@
 /**************************************************/
 static struct file_operations log_fops =
 {
-	llseek:         hysdn_dummy_lseek,
+	llseek:         no_llseek,
 	read:           hysdn_log_read,
 	write:          hysdn_log_write,
 	poll:           hysdn_log_poll,
diff -u --recursive --new-file v2.4.8/linux/drivers/isdn/isdn_common.c linux/drivers/isdn/isdn_common.c
--- v2.4.8/linux/drivers/isdn/isdn_common.c	Tue Jul  3 17:08:19 2001
+++ linux/drivers/isdn/isdn_common.c	Sun Aug 12 10:38:48 2001
@@ -1077,12 +1077,6 @@
 	return retval;
 }
 
-static loff_t
-isdn_llseek(struct file *file, loff_t offset, int orig)
-{
-	return -ESPIPE;
-}
-
 static ssize_t
 isdn_write(struct file *file, const char *buf, size_t count, loff_t * off)
 {
@@ -1748,7 +1742,7 @@
 static struct file_operations isdn_fops =
 {
 	owner:		THIS_MODULE,
-	llseek:		isdn_llseek,
+	llseek:		no_llseek,
 	read:		isdn_read,
 	write:		isdn_write,
 	poll:		isdn_poll,
diff -u --recursive --new-file v2.4.8/linux/drivers/macintosh/adb.c linux/drivers/macintosh/adb.c
--- v2.4.8/linux/drivers/macintosh/adb.c	Fri Feb  9 11:30:23 2001
+++ linux/drivers/macintosh/adb.c	Sun Aug 12 10:38:48 2001
@@ -543,11 +543,6 @@
 	return 0;
 }
 
-static long long adb_lseek(struct file *file, loff_t offset, int origin)
-{
-	return -ESPIPE;
-}
-
 static ssize_t adb_read(struct file *file, char *buf,
 			size_t count, loff_t *ppos)
 {
@@ -665,7 +660,7 @@
 }
 
 static struct file_operations adb_fops = {
-	llseek:		adb_lseek,
+	llseek:		no_llseek,
 	read:		adb_read,
 	write:		adb_write,
 	open:		adb_open,
diff -u --recursive --new-file v2.4.8/linux/drivers/macintosh/rtc.c linux/drivers/macintosh/rtc.c
--- v2.4.8/linux/drivers/macintosh/rtc.c	Fri Feb  9 11:30:23 2001
+++ linux/drivers/macintosh/rtc.c	Sun Aug 12 10:38:48 2001
@@ -58,11 +58,6 @@
 	(ppc_md.set_rtc_time)(nowtime);
 }
 
-static loff_t rtc_lseek(struct file *file, loff_t offset, int origin)
-{
-	return -ESPIPE;
-}
-
 static int rtc_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
 	unsigned long arg)
 {
@@ -125,7 +120,7 @@
 
 static struct file_operations rtc_fops = {
 	owner:		THIS_MODULE,
-	llseek:		rtc_lseek,
+	llseek:		no_llseek,
 	ioctl:		rtc_ioctl,
 	open:		rtc_open,
 	release:	rtc_release
diff -u --recursive --new-file v2.4.8/linux/drivers/md/md.c linux/drivers/md/md.c
--- v2.4.8/linux/drivers/md/md.c	Tue Jul  3 17:08:20 2001
+++ linux/drivers/md/md.c	Sun Aug 12 12:39:02 2001
@@ -483,19 +483,6 @@
 	}
 }
 
-static inline int mark_rdev_faulty (mdk_rdev_t * rdev)
-{
-	if (!rdev) {
-		MD_BUG();
-		return 0;
-	}
-	if (rdev->faulty)
-		return 0;
-	free_disk_sb(rdev);
-	rdev->faulty = 1;
-	return 1;
-}
-
 static int read_disk_sb (mdk_rdev_t * rdev)
 {
 	int ret = -EINVAL;
@@ -2088,7 +2075,7 @@
 		return -EFAULT;
 
 	nr = info.number;
-	if (nr >= mddev->sb->nr_disks)
+	if (nr >= mddev->sb->raid_disks+mddev->sb->spare_disks)
 		return -EINVAL;
 
 	SET_FROM_SB(major);
@@ -2793,6 +2780,7 @@
 int md_thread(void * arg)
 {
 	mdk_thread_t *thread = arg;
+	struct completion *event;
 
 	md_lock_kernel();
 
@@ -2822,9 +2810,9 @@
 	current->nice = -20;
 	md_unlock_kernel();
 
-	up(thread->sem);
-
-	for (;;) {
+	complete(thread->event);
+	while (thread->run) {
+		void (*run)(void *data);
 		DECLARE_WAITQUEUE(wait, current);
 
 		add_wait_queue(&thread->wqueue, &wait);
@@ -2838,18 +2826,17 @@
 		remove_wait_queue(&thread->wqueue, &wait);
 		clear_bit(THREAD_WAKEUP, &thread->flags);
 
-		if (thread->run) {
-			thread->run(thread->data);
+		if ((run=thread->run)) {
+			run(thread->data);
 			run_task_queue(&tq_disk);
-		} else
-			break;
+		}
 		if (md_signal_pending(current)) {
 			printk("md: %8s(%d) flushing signals.\n", current->comm,
 				current->pid);
 			md_flush_signals();
 		}
 	}
-	up(thread->sem);
+	complete(thread->event);
 	return 0;
 }
 
@@ -2865,7 +2852,7 @@
 {
 	mdk_thread_t *thread;
 	int ret;
-	DECLARE_MUTEX_LOCKED(sem);
+	struct completion event;
 	
 	thread = (mdk_thread_t *) kmalloc
 				(sizeof(mdk_thread_t), GFP_KERNEL);
@@ -2874,8 +2861,9 @@
 	
 	memset(thread, 0, sizeof(mdk_thread_t));
 	md_init_waitqueue_head(&thread->wqueue);
-	
-	thread->sem = &sem;
+
+	init_completion(&event);	
+	thread->event = &event;
 	thread->run = run;
 	thread->data = data;
 	thread->name = name;
@@ -2884,7 +2872,7 @@
 		kfree(thread);
 		return NULL;
 	}
-	down(&sem);
+	wait_for_completion(&event);
 	return thread;
 }
 
@@ -2900,17 +2888,16 @@
 
 void md_unregister_thread (mdk_thread_t *thread)
 {
-	DECLARE_MUTEX_LOCKED(sem);
+	struct completion event;
+
+	init_completion(&event);
 	
-	thread->sem = &sem;
+	thread->event = &event;
 	thread->run = NULL;
 	thread->name = NULL;
-	if (!thread->tsk) {
-		MD_BUG();
-		return;
-	}
 	md_interrupt_thread(thread);
-	down(&sem);
+	wait_for_completion(&event);
+	kfree(thread);
 }
 
 void md_recover_arrays (void)
@@ -2926,7 +2913,6 @@
 int md_error (mddev_t *mddev, kdev_t rdev)
 {
 	mdk_rdev_t * rrdev;
-	int rc;
 
 /*	printk("md_error dev:(%d:%d), rdev:(%d:%d), (caller: %p,%p,%p,%p).\n",MAJOR(dev),MINOR(dev),MAJOR(rdev),MINOR(rdev), __builtin_return_address(0),__builtin_return_address(1),__builtin_return_address(2),__builtin_return_address(3));
  */
@@ -2935,8 +2921,14 @@
 		return 0;
 	}
 	rrdev = find_rdev(mddev, rdev);
-	if (!mark_rdev_faulty(rrdev))
+	if (rrdev->faulty)
 		return 0;
+	if (mddev->pers->error_handler == NULL
+	    || mddev->pers->error_handler(mddev,rdev) <= 0) {
+		free_disk_sb(rrdev);
+		rrdev->faulty = 1;
+	} else
+		return 1;
 	/*
 	 * if recovery was running, stop it now.
 	 */
@@ -2944,11 +2936,8 @@
 		mddev->pers->stop_resync(mddev);
 	if (mddev->recovery_running)
 		md_interrupt_thread(md_recovery_thread);
-	if (mddev->pers->error_handler) {
-		rc = mddev->pers->error_handler(mddev, rdev);
-		md_recover_arrays();
-		return rc;
-	}
+	md_recover_arrays();
+
 	return 0;
 }
 
diff -u --recursive --new-file v2.4.8/linux/drivers/md/raid1.c linux/drivers/md/raid1.c
--- v2.4.8/linux/drivers/md/raid1.c	Tue Jul  3 17:08:20 2001
+++ linux/drivers/md/raid1.c	Sun Aug 12 12:39:02 2001
@@ -33,6 +33,9 @@
 
 #define MAX_WORK_PER_DISK 128
 
+#define	NR_RESERVED_BUFS	32
+
+
 /*
  * The following can be used to debug the driver
  */
@@ -62,7 +65,7 @@
 	while(cnt) {
 		struct buffer_head *t;
 		md_spin_lock_irq(&conf->device_lock);
-		if (conf->freebh_cnt >= cnt)
+		if (!conf->freebh_blocked && conf->freebh_cnt >= cnt)
 			while (cnt) {
 				t = conf->freebh;
 				conf->freebh = t->b_next;
@@ -75,15 +78,18 @@
 		md_spin_unlock_irq(&conf->device_lock);
 		if (cnt == 0)
 			break;
-		t = (struct buffer_head *)kmalloc(sizeof(struct buffer_head), GFP_NOIO);
+		t = kmem_cache_alloc(bh_cachep, SLAB_NOIO);
 		if (t) {
-			memset(t, 0, sizeof(*t));
 			t->b_next = bh;
 			bh = t;
 			cnt--;
 		} else {
 			PRINTK("raid1: waiting for %d bh\n", cnt);
-			wait_event(conf->wait_buffer, conf->freebh_cnt >= cnt);
+			conf->freebh_blocked = 1;
+			wait_disk_event(conf->wait_buffer,
+					!conf->freebh_blocked ||
+					conf->freebh_cnt > conf->raid_disks * NR_RESERVED_BUFS/2);
+			conf->freebh_blocked = 0;
 		}
 	}
 	return bh;
@@ -97,7 +103,7 @@
 		struct buffer_head *t = bh;
 		bh=bh->b_next;
 		if (t->b_pprev == NULL)
-			kfree(t);
+			kmem_cache_free(bh_cachep, t);
 		else {
 			t->b_next= conf->freebh;
 			conf->freebh = t;
@@ -110,14 +116,13 @@
 
 static int raid1_grow_bh(raid1_conf_t *conf, int cnt)
 {
-	/* allocate cnt buffer_heads, possibly less if kalloc fails */
+	/* allocate cnt buffer_heads, possibly less if kmalloc fails */
 	int i = 0;
 
 	while (i < cnt) {
 		struct buffer_head *bh;
-		bh = kmalloc(sizeof(*bh), GFP_KERNEL);
+		bh = kmem_cache_alloc(bh_cachep, SLAB_KERNEL);
 		if (!bh) break;
-		memset(bh, 0, sizeof(*bh));
 
 		md_spin_lock_irq(&conf->device_lock);
 		bh->b_pprev = &conf->freebh;
@@ -131,21 +136,18 @@
 	return i;
 }
 
-static int raid1_shrink_bh(raid1_conf_t *conf, int cnt)
+static void raid1_shrink_bh(raid1_conf_t *conf)
 {
-	/* discard cnt buffer_heads, if we can find them */
-	int i = 0;
+	/* discard all buffer_heads */
 
 	md_spin_lock_irq(&conf->device_lock);
-	while ((i < cnt) && conf->freebh) {
+	while (conf->freebh) {
 		struct buffer_head *bh = conf->freebh;
 		conf->freebh = bh->b_next;
-		kfree(bh);
-		i++;
+		kmem_cache_free(bh_cachep, bh);
 		conf->freebh_cnt--;
 	}
 	md_spin_unlock_irq(&conf->device_lock);
-	return i;
 }
 		
 
@@ -155,9 +157,10 @@
 
 	do {
 		md_spin_lock_irq(&conf->device_lock);
-		if (conf->freer1) {
+		if (!conf->freer1_blocked && conf->freer1) {
 			r1_bh = conf->freer1;
 			conf->freer1 = r1_bh->next_r1;
+			conf->freer1_cnt--;
 			r1_bh->next_r1 = NULL;
 			r1_bh->state = 0;
 			r1_bh->bh_req.b_state = 0;
@@ -170,7 +173,12 @@
 			memset(r1_bh, 0, sizeof(*r1_bh));
 			return r1_bh;
 		}
-		wait_event(conf->wait_buffer, conf->freer1);
+		conf->freer1_blocked = 1;
+		wait_disk_event(conf->wait_buffer,
+				!conf->freer1_blocked ||
+				conf->freer1_cnt > NR_RESERVED_BUFS/2
+			);
+		conf->freer1_blocked = 0;
 	} while (1);
 }
 
@@ -186,7 +194,11 @@
 		spin_lock_irqsave(&conf->device_lock, flags);
 		r1_bh->next_r1 = conf->freer1;
 		conf->freer1 = r1_bh;
+		conf->freer1_cnt++;
 		spin_unlock_irqrestore(&conf->device_lock, flags);
+		/* don't need to wakeup wait_buffer because
+		 *  raid1_free_bh below will do that
+		 */
 	} else {
 		kfree(r1_bh);
 	}
@@ -203,13 +215,10 @@
 		if (!r1_bh)
 			break;
 		memset(r1_bh, 0, sizeof(*r1_bh));
-
-		md_spin_lock_irq(&conf->device_lock);
 		set_bit(R1BH_PreAlloc, &r1_bh->state);
-		r1_bh->next_r1 = conf->freer1;
-		conf->freer1 = r1_bh;
-		md_spin_unlock_irq(&conf->device_lock);
+		r1_bh->mddev = conf->mddev;
 
+		raid1_free_r1bh(r1_bh);
 		i++;
 	}
 	return i;
@@ -221,6 +230,7 @@
 	while (conf->freer1) {
 		struct raid1_bh *r1_bh = conf->freer1;
 		conf->freer1 = r1_bh->next_r1;
+		conf->freer1_cnt--;
 		kfree(r1_bh);
 	}
 	md_spin_unlock_irq(&conf->device_lock);
@@ -551,7 +561,7 @@
 	struct buffer_head *bh_req, *bhl;
 	struct raid1_bh * r1_bh;
 	int disks = MD_SB_DISKS;
-	int i, sum_bhs = 0, sectors;
+	int i, sum_bhs = 0;
 	struct mirror_info *mirror;
 
 	if (!buffer_locked(bh))
@@ -592,7 +602,6 @@
 	r1_bh->mddev = mddev;
 	r1_bh->cmd = rw;
 
-	sectors = bh->b_size >> 9;
 	if (rw == READ) {
 		/*
 		 * read balancing logic:
@@ -665,6 +674,11 @@
 		sum_bhs++;
 	}
 	if (bhl) raid1_free_bh(conf,bhl);
+	if (!sum_bhs) {
+		/* Gag - all mirrors non-operational.. */
+		raid1_end_bh_io(r1_bh, 0);
+		return 0;
+	}
 	md_atomic_set(&r1_bh->remaining, sum_bhs);
 
 	/*
@@ -727,12 +741,14 @@
 	mark_disk_faulty(sb->disks+mirror->number);
 	mark_disk_nonsync(sb->disks+mirror->number);
 	mark_disk_inactive(sb->disks+mirror->number);
-	sb->active_disks--;
+	if (!mirror->write_only)
+		sb->active_disks--;
 	sb->working_disks--;
 	sb->failed_disks++;
 	mddev->sb_dirty = 1;
 	md_wakeup_thread(conf->thread);
-	conf->working_disks--;
+	if (!mirror->write_only)
+		conf->working_disks--;
 	printk (DISK_FAILED, partition_name (mirror->dev),
 				 conf->working_disks);
 }
@@ -744,28 +760,27 @@
 	int disks = MD_SB_DISKS;
 	int i;
 
-	if (conf->working_disks == 1) {
-		/*
-		 * Uh oh, we can do nothing if this is our last disk, but
-		 * first check if this is a queued request for a device
-		 * which has just failed.
-		 */
-		for (i = 0; i < disks; i++) {
-			if (mirrors[i].dev==dev && !mirrors[i].operational)
-				return 0;
-		}
-		printk (LAST_DISK);
-	} else {
-		/*
-		 * Mark disk as unusable
+	/* Find the drive.
+	 * If it is not operational, then we have already marked it as dead
+	 * else if it is the last working disks, ignore the error, let the
+	 * next level up know.
+	 * else mark the drive as failed
+	 */
+
+	for (i = 0; i < disks; i++)
+		if (mirrors[i].dev==dev && mirrors[i].operational)
+			break;
+	if (i == disks)
+		return 0;
+
+	if (i < conf->raid_disks && conf->working_disks == 1) {
+		/* Don't fail the drive, act as though we were just a
+		 * normal single drive
 		 */
-		for (i = 0; i < disks; i++) {
-			if (mirrors[i].dev==dev && mirrors[i].operational) {
-				mark_disk_bad(mddev, i);
-				break;
-			}
-		}
+
+		return 1;
 	}
+	mark_disk_bad(mddev, i);
 	return 0;
 }
 
@@ -1185,6 +1200,15 @@
 				md_atomic_set(&r1_bh->remaining, sum_bhs);
 				if (bhl) raid1_free_bh(conf, bhl);
 				mbh = r1_bh->mirror_bh_list;
+
+				if (!sum_bhs) {
+					/* nowhere to write this too... I guess we
+					 * must be done
+					 */
+					sync_request_done(bh->b_blocknr, conf);
+					md_done_sync(mddev, bh->b_size>>9, 0);
+					raid1_free_buf(r1_bh);
+				} else
 				while (mbh) {
 					struct buffer_head *bh1 = mbh;
 					mbh = mbh->b_next;
@@ -1192,18 +1216,12 @@
 					md_sync_acct(bh1->b_dev, bh1->b_size/512);
 				}
 			} else {
-				dev = bh->b_dev;
-				raid1_map (mddev, &bh->b_dev);
-				if (bh->b_dev == dev) {
-					printk (IO_ERROR, partition_name(bh->b_dev), bh->b_blocknr);
-					md_done_sync(mddev, bh->b_size>>9, 0);
-				} else {
-					printk (REDIRECT_SECTOR,
-						partition_name(bh->b_dev), bh->b_blocknr);
-					bh->b_rdev = bh->b_dev;
-					bh->b_rsector = bh->b_blocknr; 
-					generic_make_request(READ, bh);
-				}
+				/* There is no point trying a read-for-reconstruct
+				 * as reconstruct is about to be aborted
+				 */
+
+				printk (IO_ERROR, partition_name(bh->b_dev), bh->b_blocknr);
+				md_done_sync(mddev, bh->b_size>>9, 0);
 			}
 
 			break;
@@ -1615,12 +1633,14 @@
 	 * As a minimum, 1 r1bh and raid_disks buffer_heads
 	 * would probably get us by in tight memory situations,
 	 * but a few more is probably a good idea.
-	 * For now, try 16 r1bh and 16*raid_disks bufferheads
-	 * This will allow at least 16 concurrent reads or writes
-	 * even if kmalloc starts failing
-	 */
-	if (raid1_grow_r1bh(conf, 16) < 16 ||
-	    raid1_grow_bh(conf, 16*conf->raid_disks)< 16*conf->raid_disks) {
+	 * For now, try NR_RESERVED_BUFS r1bh and
+	 * NR_RESERVED_BUFS*raid_disks bufferheads
+	 * This will allow at least NR_RESERVED_BUFS concurrent
+	 * reads or writes even if kmalloc starts failing
+	 */
+	if (raid1_grow_r1bh(conf, NR_RESERVED_BUFS) < NR_RESERVED_BUFS ||
+	    raid1_grow_bh(conf, NR_RESERVED_BUFS*conf->raid_disks)
+	                      < NR_RESERVED_BUFS*conf->raid_disks) {
 		printk(MEM_ERROR, mdidx(mddev));
 		goto out_free_conf;
 	}
@@ -1711,7 +1731,7 @@
 
 out_free_conf:
 	raid1_shrink_r1bh(conf);
-	raid1_shrink_bh(conf, conf->freebh_cnt);
+	raid1_shrink_bh(conf);
 	raid1_shrink_buffers(conf);
 	kfree(conf);
 	mddev->private = NULL;
@@ -1772,7 +1792,7 @@
 	if (conf->resync_thread)
 		md_unregister_thread(conf->resync_thread);
 	raid1_shrink_r1bh(conf);
-	raid1_shrink_bh(conf, conf->freebh_cnt);
+	raid1_shrink_bh(conf);
 	raid1_shrink_buffers(conf);
 	kfree(conf);
 	mddev->private = NULL;
diff -u --recursive --new-file v2.4.8/linux/drivers/media/radio/Config.in linux/drivers/media/radio/Config.in
--- v2.4.8/linux/drivers/media/radio/Config.in	Sun Aug 12 13:27:59 2001
+++ linux/drivers/media/radio/Config.in	Sun Aug 12 11:16:18 2001
@@ -27,9 +27,6 @@
 dep_tristate '  miroSOUND PCM20 radio' CONFIG_RADIO_MIROPCM20 $CONFIG_VIDEO_DEV $CONFIG_SOUND_ACI_MIXER
 dep_tristate '    miroSOUND PCM20 radio RDS user interface (EXPERIMENTAL)' CONFIG_RADIO_MIROPCM20_RDS $CONFIG_RADIO_MIROPCM20 $CONFIG_EXPERIMENTAL
 dep_tristate '  SF16FMI Radio' CONFIG_RADIO_SF16FMI $CONFIG_VIDEO_DEV
-if [ "$CONFIG_RADIO_SF16FMI" = "y" ]; then
-   hex '    SF16FMI I/O port (0x284 or 0x384)' CONFIG_RADIO_SF16FMI_PORT 284
-fi
 dep_tristate '  TerraTec ActiveRadio ISA Standalone' CONFIG_RADIO_TERRATEC $CONFIG_VIDEO_DEV
 if [ "$CONFIG_RADIO_TERRATEC" = "y" ]; then
    hex '    Terratec i/o port (normally 0x590)' CONFIG_RADIO_TERRATEC_PORT 590
diff -u --recursive --new-file v2.4.8/linux/drivers/media/radio/radio-sf16fmi.c linux/drivers/media/radio/radio-sf16fmi.c
--- v2.4.8/linux/drivers/media/radio/radio-sf16fmi.c	Sat May 19 17:43:06 2001
+++ linux/drivers/media/radio/radio-sf16fmi.c	Sun Aug 12 11:16:18 2001
@@ -5,6 +5,7 @@
  *
  * Fitted to new interface by Alan Cox <alan.cox@linux.org>
  * Made working and cleaned up functions <mikael.hedin@irf.se>
+ * Support for ISAPnP by Ladislav Michl <ladis@psi.cz>
  *
  * Notes on the hardware
  *
@@ -14,14 +15,15 @@
  *  
  */
 
+#include <linux/kernel.h>	/* __setup			*/
 #include <linux/module.h>	/* Modules 			*/
 #include <linux/init.h>		/* Initdata			*/
 #include <linux/ioport.h>	/* check_region, request_region	*/
 #include <linux/delay.h>	/* udelay			*/
+#include <linux/videodev.h>	/* kernel radio structs		*/
+#include <linux/isapnp.h>
 #include <asm/io.h>		/* outb, outb_p			*/
 #include <asm/uaccess.h>	/* copy to/from user		*/
-#include <linux/videodev.h>	/* kernel radio structs		*/
-#include <linux/config.h>	/* CONFIG_RADIO_SF16MI_PORT 	*/
 #include <asm/semaphore.h>
 
 struct fmi_device
@@ -32,13 +34,10 @@
         __u32 flags;
 };
 
-#ifndef CONFIG_RADIO_SF16FMI_PORT
-#define CONFIG_RADIO_SF16FMI_PORT -1
-#endif
-
-static int io = CONFIG_RADIO_SF16FMI_PORT; 
+static int io = -1; 
 static int radio_nr = -1;
 static int users = 0;
+static struct pci_dev *dev = NULL;
 static struct semaphore lock;
 
 /* freq is in 1/16 kHz to internal number, hw precision is 50 kHz */
@@ -284,16 +283,51 @@
 	ioctl:		fmi_ioctl,
 };
 
+/* ladis: this is my card. does any other types exist? */
+static struct isapnp_device_id id_table[] __devinitdata = {
+	{	ISAPNP_ANY_ID, ISAPNP_ANY_ID,
+		ISAPNP_VENDOR('M','F','R'), ISAPNP_FUNCTION(0xad10), 0},
+	{	ISAPNP_CARD_END, },
+};
+
+MODULE_DEVICE_TABLE(isapnp, id_table);
+
+static int isapnp_fmi_probe(void)
+{
+	int i = 0;
+
+	while (id_table[i].card_vendor != 0 && dev == NULL) {
+		dev = isapnp_find_dev(NULL, id_table[i].vendor,
+				      id_table[i].function, NULL);
+	}
+
+	if (!dev)
+		return -ENODEV;
+	if (dev->prepare(dev) < 0)
+		return -EAGAIN;
+	if (!(dev->resource[0].flags & IORESOURCE_IO))
+		return -ENODEV;
+	if (dev->activate(dev) < 0) {
+		printk ("radio-sf16fmi: ISAPnP configure failed (out of resources?)\n");
+		return -ENOMEM;
+	}
+
+	i = dev->resource[0].start;
+	printk ("radio-sf16fmi: ISAPnP reports card at %#x\n", i);
+
+	return i;
+}
+
 static int __init fmi_init(void)
 {
-	if(io==-1)
-	{
-		printk(KERN_ERR "You must set an I/O address with io=0x???\n");
-		return -EINVAL;
+	if (io < 0)
+		io = isapnp_fmi_probe();
+	if (io < 0) {
+		printk(KERN_ERR "radio-sf16fmi: No PnP card found.");
+		return io;
 	}
-	if (!request_region(io, 2, "fmi")) 
-	{
-		printk(KERN_ERR "fmi: port 0x%x already in use\n", io);
+	if (!request_region(io, 2, "radio-sf16fmi")) {
+		printk(KERN_ERR "radio-sf16fmi: port 0x%x already in use\n", io);
 		return -EBUSY;
 	}
 
@@ -305,14 +339,12 @@
 	
 	init_MUTEX(&lock);
 	
-	if(video_register_device(&fmi_radio, VFL_TYPE_RADIO, radio_nr)==-1)
-	{
+	if (video_register_device(&fmi_radio, VFL_TYPE_RADIO, radio_nr) == -1) {
 		release_region(io, 2);
 		return -EINVAL;
 	}
 		
-	printk(KERN_INFO "SF16FMx radio card driver at 0x%x.\n", io);
-	printk(KERN_INFO "(c) 1998 Petr Vandrovec, vandrove@vc.cvut.cz.\n");
+	printk(KERN_INFO "SF16FMx radio card driver at 0x%x\n", io);
 	/* mute card - prevents noisy bootups */
 	fmi_mute(io);
 	return 0;
@@ -329,9 +361,20 @@
 static void __exit fmi_cleanup_module(void)
 {
 	video_unregister_device(&fmi_radio);
-	release_region(io,2);
+	release_region(io, 2);
+	if (dev)
+		dev->deactivate(dev);
 }
 
 module_init(fmi_init);
 module_exit(fmi_cleanup_module);
 
+#ifndef MODULE
+static int __init fmi_setup_io(char *str)
+{
+	get_option(&str, &io);
+	return 1;
+}
+
+__setup("sf16fm=", fmi_setup_io);
+#endif
diff -u --recursive --new-file v2.4.8/linux/drivers/media/video/tvmixer.c linux/drivers/media/video/tvmixer.c
--- v2.4.8/linux/drivers/media/video/tvmixer.c	Fri Feb  9 11:30:23 2001
+++ linux/drivers/media/video/tvmixer.c	Sun Aug 12 10:38:48 2001
@@ -42,7 +42,6 @@
 static int tvmixer_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg);
 static int tvmixer_open(struct inode *inode, struct file *file);
 static int tvmixer_release(struct inode *inode, struct file *file);
-static loff_t tvmixer_llseek(struct file *file, loff_t offset, int origin);
 
 
 static struct i2c_driver driver = {
@@ -55,7 +54,7 @@
 
 static struct file_operations tvmixer_fops = {
 	owner:		THIS_MODULE,
-	llseek:         tvmixer_llseek,
+	llseek:         no_llseek,
 	ioctl:          tvmixer_ioctl,
 	open:           tvmixer_open,
 	release:        tvmixer_release,
@@ -231,11 +230,6 @@
 	if (client->adapter->dec_use)
 		client->adapter->dec_use(client->adapter);
 	return 0;
-}
-
-static loff_t tvmixer_llseek(struct file *file, loff_t offset, int origin)
-{
-        return -ESPIPE;
 }
 
 /* ----------------------------------------------------------------------- */
diff -u --recursive --new-file v2.4.8/linux/drivers/media/video/videodev.c linux/drivers/media/video/videodev.c
--- v2.4.8/linux/drivers/media/video/videodev.c	Tue Jul  3 17:08:20 2001
+++ linux/drivers/media/video/videodev.c	Sun Aug 12 10:38:48 2001
@@ -72,9 +72,6 @@
 #ifdef CONFIG_VIDEO_PLANB
 extern int init_planbs(struct video_init *);
 #endif
-#ifdef CONFIG_VIDEO_ZORAN
-extern int init_zoran_cards(struct video_init *);
-#endif
 
 static struct video_init video_init_list[]={
 #ifdef CONFIG_VIDEO_BWQCAM
@@ -86,9 +83,6 @@
 #ifdef CONFIG_VIDEO_PLANB
 	{"planb", init_planbs},
 #endif
-#ifdef CONFIG_VIDEO_ZORAN
-	{"zoran", init_zoran_cards},
-#endif	
 	{"end", NULL}
 };
 
@@ -208,17 +202,6 @@
 	return 0;
 }
 
-/*
- *	Question: Should we be able to capture and then seek around the
- *	image ?
- */
- 
-static long long video_lseek(struct file * file,
-			  long long offset, int origin)
-{
-	return -ESPIPE;
-}
-
 static int video_ioctl(struct inode *inode, struct file *file,
 	unsigned int cmd, unsigned long arg)
 {
@@ -548,7 +531,7 @@
 static struct file_operations video_fops=
 {
 	owner:		THIS_MODULE,
-	llseek:		video_lseek,
+	llseek:		no_llseek,
 	read:		video_read,
 	write:		video_write,
 	ioctl:		video_ioctl,
diff -u --recursive --new-file v2.4.8/linux/drivers/message/fusion/mptctl.c linux/drivers/message/fusion/mptctl.c
--- v2.4.8/linux/drivers/message/fusion/mptctl.c	Wed Jul 25 17:10:20 2001
+++ linux/drivers/message/fusion/mptctl.c	Sun Aug 12 10:38:48 2001
@@ -205,13 +205,6 @@
 }
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
-static loff_t
-mptctl_llseek(struct file *file, loff_t offset, int origin)
-{
-	return -ESPIPE;
-}
-
-/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 static ssize_t
 mptctl_write(struct file *file, const char *buf, size_t count, loff_t *ppos)
 {
@@ -1092,7 +1085,7 @@
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,51)
 	owner:		THIS_MODULE,
 #endif
-	llseek:		mptctl_llseek,
+	llseek:		no_llseek,
 	read:		mptctl_read,
 	write:		mptctl_write,
 	ioctl:		mpt_ioctl,
diff -u --recursive --new-file v2.4.8/linux/drivers/net/3c505.c linux/drivers/net/3c505.c
--- v2.4.8/linux/drivers/net/3c505.c	Wed Jul 25 17:10:21 2001
+++ linux/drivers/net/3c505.c	Sun Aug 12 10:51:42 2001
@@ -607,7 +607,7 @@
 
 	skb_reserve(skb, 2);
 	target = skb_put(skb, rlen);
-	if (virt_to_bus(target + rlen) >= MAX_DMA_ADDRESS) {
+	if ((unsigned long)(target + rlen) >= MAX_DMA_ADDRESS) {
 		adapter->current_dma.target = target;
 		target = adapter->dma_buffer;
 	} else {
@@ -1027,10 +1027,12 @@
 	adapter->current_dma.direction = 1;
 	adapter->current_dma.start_time = jiffies;
 
-	target = virt_to_bus(skb->data);
-	if ((target + nlen) >= MAX_DMA_ADDRESS) {
+	if ((unsigned long)(skb->data + nlen) >= MAX_DMA_ADDRESS) {
 		memcpy(adapter->dma_buffer, skb->data, nlen);
 		target = virt_to_bus(adapter->dma_buffer);
+	}
+	else {
+		target = virt_to_bus(skb->data);
 	}
 	adapter->current_dma.skb = skb;
 
diff -u --recursive --new-file v2.4.8/linux/drivers/net/3c59x.c linux/drivers/net/3c59x.c
--- v2.4.8/linux/drivers/net/3c59x.c	Tue Jul  3 17:08:20 2001
+++ linux/drivers/net/3c59x.c	Sun Aug 12 12:27:18 2001
@@ -9,9 +9,13 @@
 	Members of the series include Fast EtherLink 3c590/3c592/3c595/3c597
 	and the EtherLink XL 3c900 and 3c905 cards.
 
+	Problem reports and questions should be directed to
+	vortex@scyld.com
+
 	The author may be reached as becker@scyld.com, or C/O
-	Center of Excellence in Space Data and Information Sciences
-	   Code 930.5, Goddard Space Flight Center, Greenbelt MD 20771
+	Scyld Computing Corporation
+	410 Severn Ave., Suite 210
+	Annapolis MD 21403
 
 	Linux Kernel Additions:
 	
@@ -50,7 +54,7 @@
     - Put vortex_info_tbl into __devinitdata
     - In the vortex_error StatsFull HACK, disable stats in vp->intr_enable as well
       as in the hardware.
-    - Increased the loop counter in wait_for_completion from 2,000 to 4,000.
+    - Increased the loop counter in issue_and_wait from 2,000 to 4,000.
 
     LK1.1.5 28 April 2000, andrewm
     - Added powerpc defines (John Daniel <jdaniel@etresoft.com> said these work...)
@@ -92,7 +96,7 @@
     - Ignore request_region() return value - already reserved if Cardbus.
     - Merged some additional Cardbus flags from Don's 0.99Qk
     - Some fixes for 3c556 (Fred Maciel)
-    - Fix for EISA initialisation (Jan Rkorajski)
+    - Fix for EISA initialisation (Jan Rekorajski)
     - Renamed MII_XCVR_PWR and EEPROM_230 to align with 3c575_cb and D. Becker's drivers
     - Fixed MII_XCVR_PWR for 3CCFE575CT
     - Added INVERT_LED_PWR, used it.
@@ -121,7 +125,7 @@
    LK1.1.12 1 Jan 2001 andrewm (2.4.0-pre1)
     - Call pci_enable_device before we request our IRQ (Tobias Ringstrom)
     - Add 3c590 PCI latency timer hack to vortex_probe1 (from 0.99Ra)
-    - Added extended wait_for_completion for the 3c905CX.
+    - Added extended issue_and_wait for the 3c905CX.
     - Look for an MII on PHY index 24 first (3c905CX oddity).
     - Add HAS_NWAY to 3cSOHO100-TX (Brett Frankenberger)
     - Don't free skbs we don't own on oom path in vortex_open().
@@ -149,6 +153,19 @@
     - Implemented alloc_etherdev() API
     - Special-case the 'Tx error 82' message.
 
+   LK1.1.16 18 July 2001 akpm
+    - Make NETIF_F_SG dependent upon nr_free_highpages(), not on CONFIG_HIGHMEM
+    - Lessen verbosity of bootup messages
+    - Fix WOL - use new PM API functions.
+    - Use netif_running() instead of vp->open in suspend/resume.
+    - Don't reset the interface logic on open/close/rmmod.  It upsets
+      autonegotiation, and hence DHCP (from 0.99T).
+    - Back out EEPROM_NORESET flag because of the above (we do it for all
+      NICs).
+    - Correct 3c982 identification string
+    - Rename wait_for_completion() to issue_and_wait() to avoid completion.h
+      clash.
+
     - See http://www.uow.edu.au/~andrewm/linux/#3c59x-2.3 for more details.
     - Also see Documentation/networking/vortex.txt
 */
@@ -164,8 +181,8 @@
 
 
 #define DRV_NAME	"3c59x"
-#define DRV_VERSION	"LK1.1.15"
-#define DRV_RELDATE	"6 June 2001"
+#define DRV_VERSION	"LK1.1.16"
+#define DRV_RELDATE	"19 July 2001"
 
 
 
@@ -230,6 +247,7 @@
 #include <linux/etherdevice.h>
 #include <linux/skbuff.h>
 #include <linux/ethtool.h>
+#include <linux/highmem.h>
 #include <asm/irq.h>			/* For NR_IRQS only. */
 #include <asm/bitops.h>
 #include <asm/io.h>
@@ -244,10 +262,11 @@
 
 
 static char version[] __devinitdata =
-DRV_NAME ".c:" DRV_VERSION " " DRV_RELDATE "  Donald Becker and others. http://www.scyld.com/network/vortex.html\n";
+DRV_NAME ": Donald Becker and others. www.scyld.com/network/vortex.html\n";
 
 MODULE_AUTHOR("Donald Becker <becker@scyld.com>");
-MODULE_DESCRIPTION("3Com 3c59x/3c90x/3c575 series Vortex/Boomerang/Cyclone driver");
+MODULE_DESCRIPTION("3Com 3c59x/3c9xx ethernet driver "
+					DRV_VERSION " " DRV_RELDATE);
 MODULE_PARM(debug, "i");
 MODULE_PARM(options, "1-" __MODULE_STRING(8) "i");
 MODULE_PARM(full_duplex, "1-" __MODULE_STRING(8) "i");
@@ -379,7 +398,7 @@
 	EEPROM_8BIT=0x10,	/* AKPM: Uses 0x230 as the base bitmaps for EEPROM reads */
 	HAS_PWR_CTRL=0x20, HAS_MII=0x40, HAS_NWAY=0x80, HAS_CB_FNS=0x100,
 	INVERT_MII_PWR=0x200, INVERT_LED_PWR=0x400, MAX_COLLISION_RESET=0x800,
-	EEPROM_OFFSET=0x1000, EEPROM_NORESET=0x2000, HAS_HWCKSM=0x4000 };
+	EEPROM_OFFSET=0x1000, HAS_HWCKSM=0x2000 };
 
 enum vortex_chips {
 	CH_3C590 = 0,
@@ -436,7 +455,7 @@
 #define EISA_TBL_OFFSET	0		/* Offset of this entry for vortex_eisa_init */
 	{"3c590 Vortex 10Mbps",
 	 PCI_USES_IO|PCI_USES_MASTER, IS_VORTEX, 32, },
-	{"3c592 EISA 10mbps Demon/Vortex",					/* AKPM: from Don's 3c59x_cb.c 0.49H */
+	{"3c592 EISA 10Mbps Demon/Vortex",					/* AKPM: from Don's 3c59x_cb.c 0.49H */
 	 PCI_USES_IO|PCI_USES_MASTER, IS_VORTEX, 32, },
 	{"3c597 EISA Fast Demon/Vortex",					/* AKPM: from Don's 3c59x_cb.c 0.49H */
 	 PCI_USES_IO|PCI_USES_MASTER, IS_VORTEX, 32, },
@@ -475,7 +494,7 @@
 	 PCI_USES_IO|PCI_USES_MASTER, IS_TORNADO|HAS_NWAY|HAS_HWCKSM, 128, },
 	{"3c980 Cyclone",
 	 PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_HWCKSM, 128, },
-	{"3c980 10/100 Base-TX NIC(Python-T)",
+	{"3c982 Dual Port Server Cyclone",
 	 PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_HWCKSM, 128, },
 
 	{"3cSOHO100-TX Hurricane",
@@ -487,7 +506,7 @@
 									HAS_HWCKSM, 128, },
 	{"3c556B Laptop Hurricane",
 	 PCI_USES_IO|PCI_USES_MASTER, IS_TORNADO|HAS_NWAY|EEPROM_OFFSET|HAS_CB_FNS|INVERT_MII_PWR|
-									EEPROM_NORESET|HAS_HWCKSM, 128, },
+									HAS_HWCKSM, 128, },
 	{"3c575 [Megahertz] 10/100 LAN 	CardBus",
 	PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG|HAS_MII|EEPROM_8BIT, 128, },
 
@@ -752,6 +771,7 @@
 		partner_flow_ctrl:1,			/* Partner supports flow control */
 		has_nway:1,
 		enable_wol:1,					/* Wake-on-LAN is enabled */
+		pm_state_valid:1,				/* power_state[] has sane contents */
 		open:1,
 		medialock:1,
 		must_free_region:1;				/* Flag: if zero, Cardbus owns the I/O region */
@@ -767,6 +787,7 @@
 	u16 io_size;						/* Size of PCI region (for release_region) */
 	spinlock_t lock;					/* Serialise access to device & its vortex_private */
 	spinlock_t mdio_lock;				/* Serialise access to mdio hardware */
+	u32 power_state[16];
 };
 
 /* The action to take with a media selection timer tick.
@@ -847,11 +868,8 @@
 {
 	struct net_device *dev = pdev->driver_data;
 
-	printk(KERN_DEBUG "vortex_suspend(%s)\n", dev->name);
-
 	if (dev && dev->priv) {
-		struct vortex_private *vp = (struct vortex_private *)dev->priv;
-		if (vp->open) {
+		if (netif_running(dev)) {
 			netif_device_detach(dev);
 			vortex_down(dev);
 		}
@@ -863,11 +881,8 @@
 {
 	struct net_device *dev = pdev->driver_data;
 
-	printk(KERN_DEBUG "vortex_resume(%s)\n", dev->name);
-
 	if (dev && dev->priv) {
-		struct vortex_private *vp = (struct vortex_private *)dev->priv;
-		if (vp->open) {
+		if (netif_running(dev)) {
 			vortex_up(dev);
 			netif_device_attach(dev);
 		}
@@ -958,13 +973,12 @@
 	int i, step;
 	struct net_device *dev;
 	static int printed_version;
-	int retval;
+	int retval, print_info;
 	struct vortex_chip_info * const vci = &vortex_info_tbl[chip_idx];
 	char *print_name;
 
 	if (!printed_version) {
-		printk (KERN_INFO "%s", version);
-		printk (KERN_INFO "See Documentation/networking/vortex.txt\n");
+		printk (version);
 		printed_version = 1;
 	}
 
@@ -977,14 +991,40 @@
 		goto out;
 	}
 	SET_MODULE_OWNER(dev);
+	vp = dev->priv;
+
+	/* The lower four bits are the media type. */
+	if (dev->mem_start) {
+		/*
+		 * The 'options' param is passed in as the third arg to the
+		 * LILO 'ether=' argument for non-modular use
+		 */
+		option = dev->mem_start;
+	}
+	else if (card_idx < MAX_UNITS)
+		option = options[card_idx];
+	else
+		option = -1;
 
-	printk(KERN_INFO "%s: 3Com %s %s at 0x%lx, ",
+	if (option > 0) {
+		if (option & 0x8000)
+			vortex_debug = 7;
+		if (option & 0x4000)
+			vortex_debug = 2;
+		if (option & 0x0400)
+			vp->enable_wol = 1;
+	}
+
+	print_info = (vortex_debug > 1);
+	if (print_info)
+		printk (KERN_INFO "See Documentation/networking/vortex.txt\n");
+
+	printk(KERN_INFO "%s: 3Com %s %s at 0x%lx. Vers " DRV_VERSION "\n",
 	       print_name,
 	       pdev ? "PCI" : "EISA",
 	       vci->name,
 	       ioaddr);
 
-	vp = dev->priv;
 	dev->base_addr = ioaddr;
 	dev->irq = irq;
 	dev->mtu = mtu;
@@ -1048,19 +1088,6 @@
 	if (pdev)
 		pci_set_drvdata(pdev, dev);
 
-	/* The lower four bits are the media type. */
-	if (dev->mem_start) {
-		/*
-		 * AKPM: ewww..  The 'options' param is passed in as the third arg to the
-		 * LILO 'ether=' argument for non-modular use
-		 */
-		option = dev->mem_start;
-	}
-	else if (card_idx < MAX_UNITS)
-		option = options[card_idx];
-	else
-		option = -1;
-
 	vp->media_override = 7;
 	if (option >= 0) {
 		vp->media_override = ((option & 7) == 2)  ?  0  :  option & 15;
@@ -1117,27 +1144,33 @@
 		printk(" ***INVALID CHECKSUM %4.4x*** ", checksum);
 	for (i = 0; i < 3; i++)
 		((u16 *)dev->dev_addr)[i] = htons(eeprom[i + 10]);
-	for (i = 0; i < 6; i++)
-		printk("%c%2.2x", i ? ':' : ' ', dev->dev_addr[i]);
+	if (print_info) {
+		for (i = 0; i < 6; i++)
+			printk("%c%2.2x", i ? ':' : ' ', dev->dev_addr[i]);
+	}
 	EL3WINDOW(2);
 	for (i = 0; i < 6; i++)
 		outb(dev->dev_addr[i], ioaddr + i);
 
 #ifdef __sparc__
-	printk(", IRQ %s\n", __irq_itoa(dev->irq));
+	if (print_info)
+		printk(", IRQ %s\n", __irq_itoa(dev->irq));
 #else
-	printk(", IRQ %d\n", dev->irq);
+	if (print_info)
+		printk(", IRQ %d\n", dev->irq);
 	/* Tell them about an invalid IRQ. */
-	if (vortex_debug && (dev->irq <= 0 || dev->irq >= NR_IRQS))
+	if (dev->irq <= 0 || dev->irq >= NR_IRQS)
 		printk(KERN_WARNING " *** Warning: IRQ %d is unlikely to work! ***\n",
 			   dev->irq);
 #endif
 
 	EL3WINDOW(4);
 	step = (inb(ioaddr + Wn4_NetDiag) & 0x1e) >> 1;
-	printk(KERN_INFO "  product code %02x%02x rev %02x.%d date %02d-"
-		   "%02d-%02d\n", eeprom[6]&0xff, eeprom[6]>>8, eeprom[0x14],
-		   step, (eeprom[4]>>5) & 15, eeprom[4] & 31, eeprom[4]>>9);
+	if (print_info) {
+		printk(KERN_INFO "  product code %02x%02x rev %02x.%d date %02d-"
+			"%02d-%02d\n", eeprom[6]&0xff, eeprom[6]>>8, eeprom[0x14],
+			step, (eeprom[4]>>5) & 15, eeprom[4] & 31, eeprom[4]>>9);
+	}
 
 
 	if (pdev && vci->drv_flags & HAS_CB_FNS) {
@@ -1151,8 +1184,10 @@
 			if (!vp->cb_fn_base)
 				goto free_ring;
 		}
-		printk(KERN_INFO "%s: CardBus functions mapped %8.8lx->%p\n",
-			   print_name, fn_st_addr, vp->cb_fn_base);
+		if (print_info) {
+			printk(KERN_INFO "%s: CardBus functions mapped %8.8lx->%p\n",
+				print_name, fn_st_addr, vp->cb_fn_base);
+		}
 		EL3WINDOW(2);
 
 		n = inw(ioaddr + Wn2_ResetOptions) & ~0x4010;
@@ -1170,7 +1205,8 @@
 
 	if (vp->info1 & 0x8000) {
 		vp->full_duplex = 1;
-		printk(KERN_INFO "Full duplex capable\n");
+		if (print_info)
+			printk(KERN_INFO "Full duplex capable\n");
 	}
 
 	{
@@ -1181,16 +1217,17 @@
 		if ((vp->available_media & 0xff) == 0)		/* Broken 3c916 */
 			vp->available_media = 0x40;
 		config = inl(ioaddr + Wn3_Config);
-		if (vortex_debug > 1)
+		if (print_info) {
 			printk(KERN_DEBUG "  Internal config register is %4.4x, "
 				   "transceivers %#x.\n", config, inw(ioaddr + Wn3_Options));
-		printk(KERN_INFO "  %dK %s-wide RAM %s Rx:Tx split, %s%s interface.\n",
-			   8 << RAM_SIZE(config),
-			   RAM_WIDTH(config) ? "word" : "byte",
-			   ram_split[RAM_SPLIT(config)],
-			   AUTOSELECT(config) ? "autoselect/" : "",
-			   XCVR(config) > XCVR_ExtMII ? "<invalid transceiver>" :
-			   media_tbl[XCVR(config)].name);
+			printk(KERN_INFO "  %dK %s-wide RAM %s Rx:Tx split, %s%s interface.\n",
+				   8 << RAM_SIZE(config),
+				   RAM_WIDTH(config) ? "word" : "byte",
+				   ram_split[RAM_SPLIT(config)],
+				   AUTOSELECT(config) ? "autoselect/" : "",
+				   XCVR(config) > XCVR_ExtMII ? "<invalid transceiver>" :
+				   media_tbl[XCVR(config)].name);
+		}
 		vp->default_media = XCVR(config);
 		if (vp->default_media == XCVR_NWAY)
 			vp->has_nway = 1;
@@ -1198,8 +1235,9 @@
 	}
 
 	if (vp->media_override != 7) {
-		printk(KERN_INFO "  Media override to transceiver type %d (%s).\n",
-			   vp->media_override, media_tbl[vp->media_override].name);
+		printk(KERN_INFO "%s:  Media override to transceiver type %d (%s).\n",
+				print_name, vp->media_override,
+				media_tbl[vp->media_override].name);
 		dev->if_port = vp->media_override;
 	} else
 		dev->if_port = vp->default_media;
@@ -1226,8 +1264,10 @@
 			mii_status = mdio_read(dev, phyx, 1);
 			if (mii_status  &&  mii_status != 0xffff) {
 				vp->phys[phy_idx++] = phyx;
-				printk(KERN_INFO "  MII transceiver found at address %d,"
-					   " status %4x.\n", phyx, mii_status);
+				if (print_info) {
+					printk(KERN_INFO "  MII transceiver found at address %d,"
+						" status %4x.\n", phyx, mii_status);
+				}
 				if ((mii_status & 0x0040) == 0)
 					mii_preamble_required++;
 			}
@@ -1246,13 +1286,12 @@
 		}
 	}
 
-	if (pdev && vp->enable_wol && (vp->capabilities & CapPwrMgmt))
-		acpi_set_WOL(dev);
-
 	if (vp->capabilities & CapBusMaster) {
 		vp->full_bus_master_tx = 1;
-		printk(KERN_INFO"  Enabling bus-master transmits and %s receives.\n",
-			   (vp->info2 & 1) ? "early" : "whole-frame" );
+		if (print_info) {
+			printk(KERN_INFO "  Enabling bus-master transmits and %s receives.\n",
+			(vp->info2 & 1) ? "early" : "whole-frame" );
+		}
 		vp->full_bus_master_rx = (vp->info2 & 1) ? 1 : 2;
 		vp->bus_master = 0;		/* AKPM: vortex only */
 	}
@@ -1260,11 +1299,14 @@
 	/* The 3c59x-specific entries in the device structure. */
 	dev->open = vortex_open;
 	if (vp->full_bus_master_tx) {
+		struct sysinfo sysinfo;
+
 		dev->hard_start_xmit = boomerang_start_xmit;
-#ifndef CONFIG_HIGHMEM
-		/* Actually, it still should work with iommu. */
-		dev->features |= NETIF_F_SG;
-#endif
+		si_meminfo(&sysinfo);
+		if (sysinfo.totalhigh == 0) {
+			/* Actually, it still should work with iommu. */
+			dev->features |= NETIF_F_SG;
+		}
 		if (((hw_checksums[card_idx] == -1) && (vp->drv_flags & HAS_HWCKSM)) ||
 					(hw_checksums[card_idx] == 1)) {
 				dev->features |= NETIF_F_IP_CSUM;
@@ -1273,7 +1315,7 @@
 		dev->hard_start_xmit = vortex_start_xmit;
 	}
 
-	if (vortex_debug > 0) {
+	if (print_info) {
 		printk(KERN_INFO "%s: scatter/gather %sabled. h/w checksums %sabled\n",
 				print_name,
 				(dev->features & NETIF_F_SG) ? "en":"dis",
@@ -1286,6 +1328,11 @@
 	dev->set_multicast_list = set_rx_mode;
 	dev->tx_timeout = vortex_tx_timeout;
 	dev->watchdog_timeo = (watchdog * HZ) / 1000;
+	if (pdev && vp->enable_wol) {
+		vp->pm_state_valid = 1;
+ 		pci_save_state(vp->pdev, vp->power_state);
+ 		acpi_set_WOL(dev);
+	}
 	retval = register_netdev(dev);
 	if (retval == 0)
 		return 0;
@@ -1306,7 +1353,7 @@
 }
 
 static void
-wait_for_completion(struct net_device *dev, int cmd)
+issue_and_wait(struct net_device *dev, int cmd)
 {
 	int i;
 
@@ -1338,8 +1385,10 @@
 	unsigned int config;
 	int i;
 
-	if (vp->pdev && vp->enable_wol)			/* AKPM: test not needed? */
+	if (vp->pdev && vp->enable_wol) {
 		pci_set_power_state(vp->pdev, 0);	/* Go active */
+		pci_restore_state(vp->pdev, vp->power_state);
+	}
 
 	/* Before initializing select the active media port. */
 	EL3WINDOW(3);
@@ -1352,19 +1401,23 @@
 		dev->if_port = vp->media_override;
 	} else if (vp->autoselect) {
 		if (vp->has_nway) {
-			printk(KERN_INFO "%s: using NWAY device table, not %d\n", dev->name, dev->if_port);
+			if (vortex_debug > 1)
+				printk(KERN_INFO "%s: using NWAY device table, not %d\n",
+								dev->name, dev->if_port);
 			dev->if_port = XCVR_NWAY;
 		} else {
 			/* Find first available media type, starting with 100baseTx. */
 			dev->if_port = XCVR_100baseTx;
 			while (! (vp->available_media & media_tbl[dev->if_port].mask))
 				dev->if_port = media_tbl[dev->if_port].next;
-			printk(KERN_INFO "%s: first available media type: %s\n",
+			if (vortex_debug > 1)
+				printk(KERN_INFO "%s: first available media type: %s\n",
 					dev->name, media_tbl[dev->if_port].name);
 		}
 	} else {
 		dev->if_port = vp->default_media;
-		printk(KERN_INFO "%s: using default media %s\n",
+		if (vortex_debug > 1)
+			printk(KERN_INFO "%s: using default media %s\n",
 				dev->name, media_tbl[dev->if_port].name);
 	}
 
@@ -1420,8 +1473,11 @@
 			dev->name, config);
 	}
 
-	wait_for_completion(dev, TxReset);
-	wait_for_completion(dev, RxReset);
+	issue_and_wait(dev, TxReset);
+	/*
+	 * Don't reset the PHY - that upsets autonegotiation during DHCP operations.
+	 */
+	issue_and_wait(dev, RxReset|0x04);
 
 	outw(SetStatusEnb | 0x00, ioaddr + EL3_CMD);
 
@@ -1494,7 +1550,7 @@
 	set_rx_mode(dev);
 	outw(StatsEnable, ioaddr + EL3_CMD); /* Turn on statistics. */
 
-//	wait_for_completion(dev, SetTxStart|0x07ff);
+//	issue_and_wait(dev, SetTxStart|0x07ff);
 	outw(RxEnable, ioaddr + EL3_CMD); /* Enable the receiver. */
 	outw(TxEnable, ioaddr + EL3_CMD); /* Enable transmitter. */
 	/* Allow status bits to be seen. */
@@ -1523,9 +1579,6 @@
 	int i;
 	int retval;
 
-	if (vp->pdev && vp->enable_wol)				/* AKPM: test not needed? */
-		pci_set_power_state(vp->pdev, 0);		/* Go active */
-
 	/* Use the now-standard shared IRQ implementation. */
 	if ((retval = request_irq(dev->irq, vp->full_bus_master_rx ?
 				&boomerang_interrupt : &vortex_interrupt, SA_SHIRQ, dev->name, dev))) {
@@ -1566,7 +1619,6 @@
 	}
 
 	vortex_up(dev);
-	vp->open = 1;
 	return 0;
 
 out_free_irq:
@@ -1732,7 +1784,7 @@
 	if (vortex_debug > 0)
 		dump_tx_ring(dev);
 
-	wait_for_completion(dev, TxReset);
+	issue_and_wait(dev, TxReset);
 
 	vp->stats.tx_errors++;
 	if (vp->full_bus_master_tx) {
@@ -1842,12 +1894,13 @@
 
 			/* In this case, blow the card away */
 			vortex_down(dev);
-			wait_for_completion(dev, TotalReset | 0xff);
+			issue_and_wait(dev, TotalReset | 0xff);
 			vortex_up(dev);		/* AKPM: bug.  vortex_up() assumes that the rx ring is full. It may not be. */
 		} else if (fifo_diag & 0x0400)
 			do_tx_reset = 1;
 		if (fifo_diag & 0x3000) {
-			wait_for_completion(dev, RxReset);
+			/* Reset Rx fifo and upload logic */
+			issue_and_wait(dev, RxReset|0x07);
 			/* Set the Rx filter to the current state. */
 			set_rx_mode(dev);
 			outw(RxEnable, ioaddr + EL3_CMD); /* Re-enable the receiver. */
@@ -1856,7 +1909,7 @@
 	}
 
 	if (do_tx_reset) {
-		wait_for_completion(dev, TxReset|reset_mask);
+		issue_and_wait(dev, TxReset|reset_mask);
 		outw(TxEnable, ioaddr + EL3_CMD);
 		if (!vp->full_bus_master_tx)
 			netif_wake_queue(dev);
@@ -1908,7 +1961,7 @@
 				if (tx_status & 0x04) vp->stats.tx_fifo_errors++;
 				if (tx_status & 0x38) vp->stats.tx_aborted_errors++;
 				if (tx_status & 0x30) {
-					wait_for_completion(dev, TxReset);
+					issue_and_wait(dev, TxReset);
 				}
 				outw(TxEnable, ioaddr + EL3_CMD);
 			}
@@ -1985,7 +2038,7 @@
 
 	spin_lock_irqsave(&vp->lock, flags);
 	/* Wait for the stall to complete. */
-	wait_for_completion(dev, DownStall);
+	issue_and_wait(dev, DownStall);
 	prev_entry->next = cpu_to_le32(vp->tx_ring_dma + entry * sizeof(struct boom_tx_desc));
 	if (inl(ioaddr + DownListPtr) == 0) {
 		outl(vp->tx_ring_dma + entry * sizeof(struct boom_tx_desc), ioaddr + DownListPtr);
@@ -2306,7 +2359,7 @@
 					   "size %d.\n", dev->name, pkt_len);
 		}
 		vp->stats.rx_dropped++;
-		wait_for_completion(dev, RxDiscard);
+		issue_and_wait(dev, RxDiscard);
 	}
 
 	return 0;
@@ -2459,8 +2512,10 @@
 	if (vp->full_bus_master_tx)
 		outl(0, ioaddr + DownListPtr);
 
-	if (vp->pdev && vp->enable_wol && (vp->capabilities & CapPwrMgmt))
+	if (vp->pdev && vp->enable_wol) {
+		pci_save_state(vp->pdev, vp->power_state);
 		acpi_set_WOL(dev);
+	}
 }
 
 static int
@@ -2522,7 +2577,6 @@
 		}
 	}
 
-	vp->open = 0;
 	return 0;
 }
 
@@ -2544,7 +2598,7 @@
 			printk(KERN_ERR "  Transmit list %8.8x vs. %p.\n",
 				   inl(ioaddr + DownListPtr),
 				   &vp->tx_ring[vp->dirty_tx % TX_RING_SIZE]);
-			wait_for_completion(dev, DownStall);
+			issue_and_wait(dev, DownStall);
 			for (i = 0; i < TX_RING_SIZE; i++) {
 				printk(KERN_ERR "  %d: @%p  length %8.8x status %8.8x\n", i,
 					   &vp->tx_ring[i],
@@ -2821,8 +2875,10 @@
 	/* The RxFilter must accept the WOL frames. */
 	outw(SetRxFilter|RxStation|RxMulticast|RxBroadcast, ioaddr + EL3_CMD);
 	outw(RxEnable, ioaddr + EL3_CMD);
+
 	/* Change the power state to D3; RxEnable doesn't take effect. */
-	pci_set_power_state(vp->pdev, 0x8103);
+	pci_enable_wake(vp->pdev, 0, 1);
+	pci_set_power_state(vp->pdev, 3);
 }
 
 
@@ -2843,8 +2899,15 @@
 	 * here
 	 */
 	unregister_netdev(dev);
-	/* Should really use wait_for_completion() here */
-	outw((vp->drv_flags & EEPROM_NORESET) ? (TotalReset|0x10) : TotalReset, dev->base_addr + EL3_CMD);
+	/* Should really use issue_and_wait() here */
+	outw(TotalReset|0x14, dev->base_addr + EL3_CMD);
+
+	if (vp->pdev && vp->enable_wol) {
+		pci_set_power_state(vp->pdev, 0);	/* Go active */
+		if (vp->pm_state_valid)
+			pci_restore_state(vp->pdev, vp->power_state);
+	}
+
 	pci_free_consistent(pdev,
 						sizeof(struct boom_rx_desc) * RX_RING_SIZE
 							+ sizeof(struct boom_tx_desc) * TX_RING_SIZE,
diff -u --recursive --new-file v2.4.8/linux/drivers/net/8139too.c linux/drivers/net/8139too.c
--- v2.4.8/linux/drivers/net/8139too.c	Wed Jul 25 17:10:21 2001
+++ linux/drivers/net/8139too.c	Sun Aug 12 10:52:29 2001
@@ -137,7 +137,7 @@
 */
 
 #define DRV_NAME	"8139too"
-#define DRV_VERSION	"0.9.18"
+#define DRV_VERSION	"0.9.18a"
 
 
 #include <linux/config.h>
@@ -152,10 +152,10 @@
 #include <linux/delay.h>
 #include <linux/ethtool.h>
 #include <linux/mii.h>
+#include <linux/completion.h>
 #include <asm/io.h>
 #include <asm/uaccess.h>
 
-
 #define RTL8139_DRIVER_NAME   DRV_NAME " Fast Ethernet driver " DRV_VERSION
 #define PFX DRV_NAME ": "
 
@@ -585,7 +585,7 @@
 	chip_t chipset;
 	pid_t thr_pid;
 	wait_queue_head_t thr_wait;
-	struct semaphore thr_exited;
+	struct completion thr_exited;
 	u32 rx_config;
 	struct rtl_extra_stats xstats;
 };
@@ -970,7 +970,7 @@
 	tp->mmio_addr = ioaddr;
 	spin_lock_init (&tp->lock);
 	init_waitqueue_head (&tp->thr_wait);
-	init_MUTEX_LOCKED (&tp->thr_exited);
+	init_completion (&tp->thr_exited);
 
 	/* dev is fully set up and ready to use now */
 	DPRINTK("about to register device named %s (%p)...\n", dev->name, dev);
@@ -1632,7 +1632,7 @@
 		rtnl_unlock ();
 	}
 
-	up_and_exit (&tp->thr_exited, 0);
+	complete_and_exit (&tp->thr_exited, 0);
 }
 
 
@@ -2138,7 +2138,7 @@
 			printk (KERN_ERR "%s: unable to signal thread\n", dev->name);
 			return ret;
 		}
-		down (&tp->thr_exited);
+		wait_for_completion (&tp->thr_exited);
 	}
 
 	DPRINTK ("%s: Shutting down ethercard, status was 0x%4.4x.\n",
diff -u --recursive --new-file v2.4.8/linux/drivers/net/Config.in linux/drivers/net/Config.in
--- v2.4.8/linux/drivers/net/Config.in	Wed Jul 25 17:10:21 2001
+++ linux/drivers/net/Config.in	Sun Aug 12 10:51:42 2001
@@ -16,7 +16,7 @@
 fi
 
 if [ "$CONFIG_ISAPNP" = "y" -o "$CONFIG_ISAPNP" = "m" ]; then
-   tristate 'General Instruments Surfboard 1000' CONFIG_NET_SB1000 $CONFIG_ISAPNP
+   dep_tristate 'General Instruments Surfboard 1000' CONFIG_NET_SB1000 $CONFIG_ISAPNP
 fi
 
 #
diff -u --recursive --new-file v2.4.8/linux/drivers/net/ariadne.c linux/drivers/net/ariadne.c
--- v2.4.8/linux/drivers/net/ariadne.c	Thu Apr 12 12:15:25 2001
+++ linux/drivers/net/ariadne.c	Sun Aug 12 10:51:42 2001
@@ -160,24 +160,29 @@
 	unsigned long board = z->resource.start;
 	unsigned long base_addr = board+ARIADNE_LANCE;
 	unsigned long mem_start = board+ARIADNE_RAM;
+	struct resource *r1, *r2;
 
-	if (!request_mem_region(base_addr, sizeof(struct Am79C960),
-		    		"Am79C960"))
-	    continue;
-	if (!request_mem_region(mem_start, ARIADNE_RAM_SIZE, "RAM")) {
-	    release_mem_region(base_addr, sizeof(struct Am79C960));
+	r1 = request_mem_region(base_addr, sizeof(struct Am79C960),
+		    		"Am79C960");
+	if (!r1) continue;
+	r2 = request_mem_region(mem_start, ARIADNE_RAM_SIZE, "RAM");
+	if (!r2) {
+	    release_resource(r1);
 	    continue;
 	}
 
 	dev = init_etherdev(NULL, sizeof(struct ariadne_private));
 
 	if (dev == NULL) {
-	    release_mem_region(base_addr, sizeof(struct Am79C960));
-	    release_mem_region(mem_start, ARIADNE_RAM_SIZE);
+	    release_resource(r1);
+	    release_resource(r2);
 	    return -ENOMEM;
 	}
-	priv = (struct ariadne_private *)dev->priv;
-	memset(priv, 0, sizeof(struct ariadne_private));
+	SET_MODULE_OWNER(dev);
+	priv = dev->priv;
+
+	r1->name = dev->name;
+	r2->name = dev->name;
 
 	priv->dev = dev;
 	dev->dev_addr[0] = 0x00;
@@ -218,6 +223,7 @@
     volatile struct Am79C960 *lance = (struct Am79C960*)dev->base_addr;
     u_short in;
     u_long version;
+    int i;
 
     /* Reset the LANCE */
     in = lance->Reset;
@@ -307,15 +313,13 @@
 
     netif_start_queue(dev);
 
-    if (request_irq(IRQ_AMIGA_PORTS, ariadne_interrupt, SA_SHIRQ,
-                    "Ariadne Ethernet", dev))
-	return -EAGAIN;
+    i = request_irq(IRQ_AMIGA_PORTS, ariadne_interrupt, SA_SHIRQ,
+                    dev->name, dev);
+    if (i) return i;
 
     lance->RAP = CSR0;		/* PCnet-ISA Controller Status */
     lance->RDP = INEA|STRT;
 
-    MOD_INC_USE_COUNT;
-
     return 0;
 }
 
@@ -388,8 +392,6 @@
     lance->RDP = STOP;
 
     free_irq(IRQ_AMIGA_PORTS, dev);
-
-    MOD_DEC_USE_COUNT;
 
     return 0;
 }
diff -u --recursive --new-file v2.4.8/linux/drivers/net/depca.c linux/drivers/net/depca.c
--- v2.4.8/linux/drivers/net/depca.c	Tue Jul  3 17:08:20 2001
+++ linux/drivers/net/depca.c	Sun Aug 12 12:33:23 2001
@@ -2060,6 +2060,8 @@
 cleanup_module(void)
 {
   struct depca_private *lp = thisDepca.priv;
+
+  unregister_netdev(&thisDepca);
   if (lp) {
     iounmap(lp->sh_mem);
 #ifdef CONFIG_MCA      
@@ -2071,7 +2073,6 @@
   }
   thisDepca.irq=0;
 
-  unregister_netdev(&thisDepca);
   release_region(thisDepca.base_addr, DEPCA_TOTAL_SIZE);
 }
 #endif /* MODULE */
diff -u --recursive --new-file v2.4.8/linux/drivers/net/eepro.c linux/drivers/net/eepro.c
--- v2.4.8/linux/drivers/net/eepro.c	Tue Jul  3 17:08:20 2001
+++ linux/drivers/net/eepro.c	Sun Aug 12 10:51:42 2001
@@ -588,7 +588,7 @@
 	return -ENODEV;
 }
 
-static void printEEPROMInfo(short ioaddr, struct net_device *dev)
+static void __init printEEPROMInfo(short ioaddr, struct net_device *dev)
 {
 	unsigned short Word;
 	int i,j;
@@ -647,7 +647,7 @@
    probes on the ISA bus.  A good device probe avoids doing writes, and
    verifies that the correct device exists and functions.  */
 
-static int eepro_probe1(struct net_device *dev, short ioaddr)
+static int __init eepro_probe1(struct net_device *dev, short ioaddr)
 {
 	unsigned short station_addr[6], id, counter;
 	int i,j, irqMask;
diff -u --recursive --new-file v2.4.8/linux/drivers/net/hamachi.c linux/drivers/net/hamachi.c
--- v2.4.8/linux/drivers/net/hamachi.c	Wed Jul 25 17:10:21 2001
+++ linux/drivers/net/hamachi.c	Sun Aug 12 10:51:42 2001
@@ -784,7 +784,7 @@
 	return ret;
 }
 
-static int read_eeprom(long ioaddr, int location)
+static int __init read_eeprom(long ioaddr, int location)
 {
 	int bogus_cnt = 1000;
 
diff -u --recursive --new-file v2.4.8/linux/drivers/net/irda/Config.in linux/drivers/net/irda/Config.in
--- v2.4.8/linux/drivers/net/irda/Config.in	Wed Jul 25 17:10:21 2001
+++ linux/drivers/net/irda/Config.in	Sun Aug 12 10:51:42 2001
@@ -24,6 +24,7 @@
 if [ "$CONFIG_EXPERIMENTAL" != "n" ]; then
 dep_tristate 'SMC IrCC (Experimental)' CONFIG_SMC_IRCC_FIR $CONFIG_IRDA
 dep_tristate 'ALi M5123 FIR (Experimental)' CONFIG_ALI_FIR $CONFIG_IRDA
+dep_tristate 'VLSI 82C147 SIR/MIR/FIR (Experimental)' CONFIG_VLSI_FIR $CONFIG_IRDA
 fi
 
 endmenu
diff -u --recursive --new-file v2.4.8/linux/drivers/net/irda/Makefile linux/drivers/net/irda/Makefile
--- v2.4.8/linux/drivers/net/irda/Makefile	Wed Jul 25 17:10:21 2001
+++ linux/drivers/net/irda/Makefile	Sun Aug 12 10:51:42 2001
@@ -18,6 +18,7 @@
 obj-$(CONFIG_TOSHIBA_FIR)	+= toshoboe.o
 obj-$(CONFIG_SMC_IRCC_FIR)	+= smc-ircc.o	irport.o
 obj-$(CONFIG_ALI_FIR)		+= ali-ircc.o
+obj-$(CONFIG_VLSI_FIR)		+= vlsi_ir.o
 obj-$(CONFIG_ESI_DONGLE)	+= esi.o
 obj-$(CONFIG_TEKRAM_DONGLE)	+= tekram.o
 obj-$(CONFIG_ACTISYS_DONGLE)	+= actisys.o
diff -u --recursive --new-file v2.4.8/linux/drivers/net/irda/irport.c linux/drivers/net/irda/irport.c
--- v2.4.8/linux/drivers/net/irda/irport.c	Wed Jul 25 17:10:21 2001
+++ linux/drivers/net/irda/irport.c	Sun Aug 12 10:51:42 2001
@@ -293,9 +293,9 @@
 
 	iobase = self->io.sir_base;
 
-	spin_lock_irqsave(&self->lock, flags);
-
 	irport_stop(self);
+	
+	spin_lock_irqsave(&self->lock, flags);
 
 	/* Initialize UART */
 	outb(UART_LCR_WLEN8, iobase+UART_LCR);  /* Reset DLAB */
@@ -353,7 +353,7 @@
 	int lcr;    /* Line control reg */
 	int divisor;
 
-	IRDA_DEBUG(2, __FUNCTION__ "(), Setting speed to: %d\n", speed);
+	IRDA_DEBUG(0, __FUNCTION__ "(), Setting speed to: %d\n", speed);
 
 	ASSERT(self != NULL, return;);
 
@@ -616,7 +616,9 @@
 	struct irport_cb *self;
 	unsigned long flags;
 	int iobase;
-	__s32 speed;
+	s32 speed;
+
+	IRDA_DEBUG(0, __FUNCTION__ "()\n");
 
 	ASSERT(dev != NULL, return 0;);
 	
@@ -773,14 +775,19 @@
 	struct irport_cb *self;
 	int iobase;
 
+	IRDA_DEBUG(0, __FUNCTION__ "()\n");
+	
 	ASSERT(dev != NULL, return -1;);
 	self = (struct irport_cb *) dev->priv;
 
 	iobase = self->io.sir_base;
 
 	if (request_irq(self->io.irq, self->interrupt, 0, dev->name, 
-			(void *) dev))
+			(void *) dev)) {
+		IRDA_DEBUG(0, __FUNCTION__ "(), unable to allocate irq=%d\n",
+			   self->io.irq);
 		return -EAGAIN;
+	}
 
 	irport_start(self);
 
diff -u --recursive --new-file v2.4.8/linux/drivers/net/irda/smc-ircc.c linux/drivers/net/irda/smc-ircc.c
--- v2.4.8/linux/drivers/net/irda/smc-ircc.c	Wed Jul 25 17:10:21 2001
+++ linux/drivers/net/irda/smc-ircc.c	Sun Aug 12 10:51:42 2001
@@ -8,8 +8,11 @@
  * Created at:    
  * Modified at:   Tue Feb 22 10:05:06 2000
  * Modified by:   Dag Brattli <dag@brattli.net>
+ * Modified at:   Tue Jun 26 2001
+ * Modified by:   Stefani Seibold <stefani@seibold.net>
  * 
- *     Copyright (c) 1999-2000 Dag Brattli
+ *     Copyright (c) 2001      Stefani Seibold
+ *     Copyright (c) 1999-2001 Dag Brattli
  *     Copyright (c) 1998-1999 Thomas Davis, 
  *     All Rights Reserved.
  *      
@@ -28,8 +31,9 @@
  *     Foundation, Inc., 59 Temple Place, Suite 330, Boston, 
  *     MA 02111-1307 USA
  *
- *     SIO's: SMC FDC37N869, FDC37C669, FDC37N958
- *     Applicable Models : Fujitsu Lifebook 635t, Sony PCG-505TX
+ *     SIO's: all SIO documentet by SMC (June, 2001)
+ *     Applicable Models :	Fujitsu Lifebook 635t, Sony PCG-505TX,
+ *     				Dell Inspiron 8000
  *
  ********************************************************************/
 
@@ -56,55 +60,106 @@
 #include <net/irda/irmod.h>
 #include <net/irda/irlap_frame.h>
 #include <net/irda/irda_device.h>
-
 #include <net/irda/smc-ircc.h>
 #include <net/irda/irport.h>
 
-static char *driver_name = "smc-ircc";
+struct smc_chip {
+	char *name;
+	u16 flags;
+	u8 devid;
+	u8 rev;
+};
+typedef struct smc_chip smc_chip_t;
 
-#define CHIP_IO_EXTENT 8
+static const char *driver_name = "smc-ircc";
 
-static unsigned int io[]  = { ~0, ~0 }; 
-static unsigned int io2[] = { 0, 0 };
+#define	DIM(x)	(sizeof(x)/(sizeof(*(x))))
+
+#define CHIP_IO_EXTENT 8
 
 static struct ircc_cb *dev_self[] = { NULL, NULL};
 
 /* Some prototypes */
-static int  ircc_open(int i, unsigned int iobase, unsigned int board_addr);
-#ifdef MODULE
-static int  ircc_close(struct ircc_cb *self);
-#endif /* MODULE */
-static int  ircc_probe(int iobase, int board_addr);
-static int  ircc_probe_58(smc_chip_t *chip, chipio_t *info);
-static int  ircc_probe_69(smc_chip_t *chip, chipio_t *info);
+static int  ircc_open(unsigned int iobase, unsigned int board_addr);
 static int  ircc_dma_receive(struct ircc_cb *self, int iobase); 
 static void ircc_dma_receive_complete(struct ircc_cb *self, int iobase);
 static int  ircc_hard_xmit(struct sk_buff *skb, struct net_device *dev);
 static void ircc_dma_xmit(struct ircc_cb *self, int iobase, int bofs);
-static void ircc_change_speed(void *priv, __u32 speed);
+static void ircc_change_speed(void *priv, u32 speed);
 static void ircc_interrupt(int irq, void *dev_id, struct pt_regs *regs);
-#if 0 /* unused */
-static int  ircc_is_receiving(struct ircc_cb *self);
-#endif /* unused */
-
 static int  ircc_net_open(struct net_device *dev);
 static int  ircc_net_close(struct net_device *dev);
 static int  ircc_pmproc(struct pm_dev *dev, pm_request_t rqst, void *data);
 
-/* These are the currently known SMC chipsets */
-static smc_chip_t chips[] =
+#define	KEY55_1	0	/* SuperIO Configuration mode with Key <0x55> */
+#define	KEY55_2	1	/* SuperIO Configuration mode with Key <0x55,0x55> */
+#define	NoIRDA	2	/* SuperIO Chip has no IRDA Port */
+#define	SIR	0	/* SuperIO Chip has only slow IRDA */
+#define	FIR	4	/* SuperIO Chip has fast IRDA */
+#define	SERx4	8	/* SuperIO Chip supports 115,2 KBaud * 4=460,8 KBaud */
+
+/* These are the currently known SMC SuperIO chipsets */
+static const smc_chip_t __init fdc_chips_flat[]=
+{
+	/* Base address 0x3f0 or 0x370 */
+	{ "37C44",	KEY55_1|NoIRDA,		0x00, 0x00 }, /* This chip can not detected */
+	{ "37C665GT",	KEY55_2|NoIRDA,		0x65, 0x01 },
+	{ "37C665GT",	KEY55_2|NoIRDA,		0x66, 0x01 },
+	{ "37C669",	KEY55_2|SIR|SERx4,	0x03, 0x02 },
+	{ "37C669",	KEY55_2|SIR|SERx4,	0x04, 0x02 }, /* ID? */
+	{ "37C78",	KEY55_2|NoIRDA,		0x78, 0x00 },
+	{ "37N769",	KEY55_1|FIR|SERx4,	0x28, 0x00 },
+	{ "37N869",	KEY55_1|FIR|SERx4,	0x29, 0x00 },
+	{ NULL }
+};
+
+static const smc_chip_t __init fdc_chips_paged[]=
 {
-	{ "FDC37C669", 0x55, 0x55, 0x0d, 0x04, ircc_probe_69 },
-	{ "FDC37N769", 0x55, 0x55, 0x0d, 0x28, ircc_probe_69 },
-	{ "FDC37N869", 0x55, 0x00, 0x0d, 0x29, ircc_probe_69 },
-	{ "FDC37N958", 0x55, 0x55, 0x20, 0x09, ircc_probe_58 },
-	{ "FDC37N971", 0x55, 0x55, 0x20, 0x0a, ircc_probe_58 },
-	{ "FDC37N972", 0x55, 0x55, 0x20, 0x0b, ircc_probe_58 },
+	/* Base address 0x3f0 or 0x370 */
+	{ "37B72X",	KEY55_1|SIR|SERx4,	0x4c, 0x00 },
+	{ "37B77X",	KEY55_1|SIR|SERx4,	0x43, 0x00 },
+	{ "37B78X",	KEY55_1|SIR|SERx4,	0x44, 0x00 },
+	{ "37B80X",	KEY55_1|SIR|SERx4,	0x42, 0x00 },
+	{ "37C67X",	KEY55_1|FIR|SERx4,	0x40, 0x00 },
+	{ "37C93X",	KEY55_2|SIR|SERx4,	0x02, 0x01 },
+	{ "37C93XAPM",	KEY55_1|SIR|SERx4,	0x30, 0x01 },
+	{ "37C93XFR",	KEY55_2|FIR|SERx4,	0x03, 0x01 },
+	{ "37M707",	KEY55_1|SIR|SERx4,	0x42, 0x00 },
+	{ "37M81X",	KEY55_1|SIR|SERx4,	0x4d, 0x00 },
+	{ "37N958FR",	KEY55_1|FIR|SERx4,	0x09, 0x04 },
+	{ "37N972",	KEY55_1|FIR|SERx4,	0x0a, 0x00 },
+	{ "37N972",	KEY55_1|FIR|SERx4,	0x0b, 0x00 },
+	{ NULL }
+};
+
+static const smc_chip_t __init lpc_chips_flat[]=
+{
+	/* Base address 0x2E or 0x4E */
+	{ "47N227",	KEY55_1|FIR|SERx4,	0x5a, 0x00 },
+	{ "47N267",	KEY55_1|FIR|SERx4,	0x5e, 0x00 },
+	{ NULL }
+};
+
+static const smc_chip_t __init lpc_chips_paged[]=
+{
+	/* Base address 0x2E or 0x4E */
+	{ "47B27X",	KEY55_1|SIR|SERx4,	0x51, 0x00 },
+	{ "47B37X",	KEY55_1|SIR|SERx4,	0x52, 0x00 },
+	{ "47M10X",	KEY55_1|SIR|SERx4,	0x59, 0x00 },
+	{ "47M120",	KEY55_1|NoIRDA|SERx4,	0x5c, 0x00 },
+	{ "47M13X",	KEY55_1|SIR|SERx4,	0x59, 0x00 },
+	{ "47M14X",	KEY55_1|SIR|SERx4,	0x5f, 0x00 },
+	{ "47N252",	KEY55_1|FIR|SERx4,	0x0e, 0x00 },
+	{ "47S42X",	KEY55_1|SIR|SERx4,	0x57, 0x00 },
 	{ NULL }
 };
 
 static int ircc_irq=255;
 static int ircc_dma=255;
+static int ircc_fir=0;
+static int ircc_sir=0;
+
+static unsigned short	dev_count=0;
 
 static inline void register_bank(int iobase, int bank)
 {
@@ -112,89 +167,303 @@
                iobase+IRCC_MASTER);
 }
 
+static int __init smc_access(unsigned short cfg_base,unsigned char reg)
+{
+	IRDA_DEBUG(0, __FUNCTION__ "()\n");
+
+	outb(reg, cfg_base);
+
+	if (inb(cfg_base)!=reg)
+		return -1;
+
+	return 0;
+}
+
+static const smc_chip_t * __init smc_probe(unsigned short cfg_base,u8 reg,const smc_chip_t *chip,char *type)
+{
+	u8 devid,xdevid,rev; 
+
+	IRDA_DEBUG(0, __FUNCTION__ "()\n");
+
+	/* Leave configuration */
+
+	outb(0xaa, cfg_base);
+
+	if (inb(cfg_base)==0xaa)	/* not a smc superio chip */
+		return NULL;
+
+	outb(reg, cfg_base);
+
+	xdevid=inb(cfg_base+1);
+
+	/* Enter configuration */
+
+	outb(0x55, cfg_base);
+
+	if (smc_access(cfg_base,0x55))	/* send second key and check */
+		return NULL;
+
+	/* probe device ID */
+
+	if (smc_access(cfg_base,reg))
+		return NULL;
+
+	devid=inb(cfg_base+1);
+
+	if (devid==0)			/* typical value for unused port */
+		return NULL;
+
+	if (devid==0xff)		/* typical value for unused port */
+		return NULL;
+
+	/* probe revision ID */
+
+	if (smc_access(cfg_base,reg+1))
+		return NULL;
+
+	rev=inb(cfg_base+1);
+
+	if (rev>=128)			/* i think this will make no sense */
+		return NULL;
+
+	if (devid==xdevid)		/* protection against false positives */        
+		return NULL;
+
+	/* Check for expected device ID; are there others? */
+
+	while(chip->devid!=devid) {
+
+		chip++;
+
+		if (chip->name==NULL)
+			return NULL;
+	}
+	if (chip->rev>rev)
+		return NULL;
+
+	MESSAGE("found SMC SuperIO Chip (devid=0x%02x rev=%02X base=0x%04x): %s%s\n",devid,rev,cfg_base,type,chip->name);
+	
+	if (chip->flags&NoIRDA)
+		MESSAGE("chipset does not support IRDA\n");
+
+	return chip;
+}
+
 /*
- * Function ircc_init ()
+ * Function smc_superio_flat (chip, base, type)
+ *
+ *    Try get configuration of a smc SuperIO chip with flat register model
  *
- *    Initialize chip. Just try to find out how many chips we are dealing with
- *    and where they are
  */
-int __init ircc_init(void)
+static int __init smc_superio_flat(const smc_chip_t *chips, unsigned short cfg_base, char *type)
 {
-	static int smcreg[] = { 0x3f0, 0x370 };
-	smc_chip_t *chip;
-	chipio_t info;
+	unsigned short fir_io;
+	unsigned short sir_io;
+	u8 mode;
 	int ret = -ENODEV;
-	int i;
 
-	IRDA_DEBUG(0, __FUNCTION__ "\n");
+	IRDA_DEBUG(0, __FUNCTION__ "()\n");
+
+	if (smc_probe(cfg_base,0xD,chips,type)==NULL)
+		return ret;
 
-	/* Probe for all the NSC chipsets we know about */
-	for (chip=chips; chip->name ; chip++) {
-		for (i=0; i<2; i++) {
-			info.cfg_base = smcreg[i];
-			
-			/* 
-			 * First we check if the user has supplied any
-                         * parameters which we should use instead of probed
-			 * values
-			 */
-			if (io[i] < 0x2000) {
-				info.fir_base = io[i];
-				info.sir_base = io2[i];
-			} else if (chip->probe(chip, &info) < 0)
-				continue;
-			if (check_region(info.fir_base, CHIP_IO_EXTENT) < 0)
-				continue;
-			if (check_region(info.sir_base, CHIP_IO_EXTENT) < 0)
-				continue;
-			if (ircc_open(i, info.fir_base, info.sir_base) == 0)
-				ret = 0; 
+	outb(0x0c, cfg_base);
+
+	mode = inb(cfg_base+1);
+	mode = (mode & 0x38) >> 3;
+		
+	/* Value for IR port */
+	if (mode && mode < 4) {
+		/* SIR iobase */
+		outb(0x25, cfg_base);
+		sir_io = inb(cfg_base+1) << 2;
+
+	       	/* FIR iobase */
+		outb(0x2b, cfg_base);
+		fir_io = inb(cfg_base+1) << 3;
+
+		if (fir_io) {
+			if (ircc_open(fir_io, sir_io) == 0)
+				ret=0; 
 		}
 	}
+	
+	/* Exit configuration */
+	outb(0xaa, cfg_base);
+
 	return ret;
 }
 
 /*
- * Function ircc_cleanup ()
+ * Function smc_superio_paged (chip, base, type)
  *
- *    Close all configured chips
+ *    Try  get configuration of a smc SuperIO chip with paged register model
  *
  */
-#ifdef MODULE
-static void ircc_cleanup(void)
+static int __init smc_superio_paged(const smc_chip_t *chips, unsigned short cfg_base, char *type)
 {
-	int i;
+	unsigned short fir_io;
+	unsigned short sir_io;
+	int ret = -ENODEV;
+	
+	IRDA_DEBUG(0, __FUNCTION__ "()\n");
+
+	if (smc_probe(cfg_base,0x20,chips,type)==NULL)
+		return ret;
+	
+	/* Select logical device (UART2) */
+	outb(0x07, cfg_base);
+	outb(0x05, cfg_base + 1);
+		
+	/* SIR iobase */
+	outb(0x60, cfg_base);
+	sir_io  = inb(cfg_base + 1) << 8;
+	outb(0x61, cfg_base);
+	sir_io |= inb(cfg_base + 1);
+		
+	/* Read FIR base */
+	outb(0x62, cfg_base);
+	fir_io = inb(cfg_base + 1) << 8;
+	outb(0x63, cfg_base);
+	fir_io |= inb(cfg_base + 1);
+	outb(0x2b, cfg_base); /* ??? */
+
+	if (fir_io) {
+		if (ircc_open(fir_io, sir_io) == 0)
+			ret=0; 
+	}
+	
+	/* Exit configuration */
+	outb(0xaa, cfg_base);
+
+	return ret;
+}
+
+static int __init smc_superio_fdc(unsigned short cfg_base)
+{
+	if (check_region(cfg_base, 2) < 0) {
+		IRDA_DEBUG(0, __FUNCTION__ ": can't get cfg_base of 0x%03x\n",
+			   cfg_base);
+		return -1;
+	}
+
+	if (!smc_superio_flat(fdc_chips_flat,cfg_base,"FDC")||!smc_superio_paged(fdc_chips_paged,cfg_base,"FDC"))
+		return 0;
+
+	return -1;
+}
+
+static int __init smc_superio_lpc(unsigned short cfg_base)
+{
+#if 0
+	if (check_region(cfg_base, 2) < 0) {
+		IRDA_DEBUG(0, __FUNCTION__ ": can't get cfg_base of 0x%03x\n",
+			   cfg_base);
+		return -1;
+	}
+#endif
+
+	if (!smc_superio_flat(lpc_chips_flat,cfg_base,"LPC")||!smc_superio_paged(lpc_chips_paged,cfg_base,"LPC"))
+		return 0;
+
+	return -1;
+}
+
+/*
+ * Function ircc_init ()
+ *
+ *    Initialize chip. Just try to find out how many chips we are dealing with
+ *    and where they are
+ */
+int __init ircc_init(void)
+{
+	int ret=-ENODEV;
 
 	IRDA_DEBUG(0, __FUNCTION__ "\n");
 
-	for (i=0; i < 2; i++) {
-		if (dev_self[i])
-			ircc_close(dev_self[i]);
+	dev_count=0;
+
+	if ((ircc_fir>0)&&(ircc_sir>0)) {
+	        MESSAGE(" Overriding FIR address 0x%04x\n", ircc_fir);
+		MESSAGE(" Overriding SIR address 0x%04x\n", ircc_sir);
+
+		if (ircc_open(ircc_fir, ircc_sir) == 0)
+			return 0;
+
+		return -ENODEV;
 	}
+
+	/* Trys to open for all the SMC chipsets we know about */
+
+	IRDA_DEBUG(0, __FUNCTION__ 
+	" Try to open all known SMC chipsets\n");
+
+	if (!smc_superio_fdc(0x3f0))
+		ret=0;
+	if (!smc_superio_fdc(0x370))
+		ret=0;
+	if (!smc_superio_lpc(0x2e))
+		ret=0;
+	if (!smc_superio_lpc(0x4e))
+		ret=0;
+
+	return ret;
 }
-#endif /* MODULE */
 
 /*
  * Function ircc_open (iobase, irq)
  *
- *    Open driver instance
+ *    Try to open driver instance
  *
  */
-static int ircc_open(int i, unsigned int fir_base, unsigned int sir_base)
+static int __init ircc_open(unsigned int fir_base, unsigned int sir_base)
 {
 	struct ircc_cb *self;
         struct irport_cb *irport;
-	int config;
-	int ret;
+	unsigned char low, high, chip, config, dma, irq, version;
+
 
 	IRDA_DEBUG(0, __FUNCTION__ "\n");
 
-	if ((config = ircc_probe(fir_base, sir_base)) == -1) {
+	if (check_region(fir_base, CHIP_IO_EXTENT) < 0) {
+		IRDA_DEBUG(0, __FUNCTION__ ": can't get fir_base of 0x%03x\n",
+			   fir_base);
+		return -ENODEV;
+	}
+#if POSSIBLE_USED_BY_SERIAL_DRIVER
+	if (check_region(sir_base, CHIP_IO_EXTENT) < 0) {
+		IRDA_DEBUG(0, __FUNCTION__ ": can't get sir_base of 0x%03x\n",
+			   sir_base);
+		return -ENODEV;
+	}
+#endif
+
+	register_bank(fir_base, 3);
+
+	high    = inb(fir_base+IRCC_ID_HIGH);
+	low     = inb(fir_base+IRCC_ID_LOW);
+	chip    = inb(fir_base+IRCC_CHIP_ID);
+	version = inb(fir_base+IRCC_VERSION);
+	config  = inb(fir_base+IRCC_INTERFACE);
+
+	irq     = config >> 4 & 0x0f;
+	dma     = config & 0x0f;
+
+        if (high != 0x10 || low != 0xb8 || (chip != 0xf1 && chip != 0xf2)) { 
 	        IRDA_DEBUG(0, __FUNCTION__ 
 			   "(), addr 0x%04x - no device found!\n", fir_base);
-		return -1;
+		return -ENODEV;
 	}
-	
+	MESSAGE("SMC IrDA Controller found\n IrCC version %d.%d, "
+		"firport 0x%03x, sirport 0x%03x dma=%d, irq=%d\n",
+		chip & 0x0f, version, fir_base, sir_base, dma, irq);
+
+	if (dev_count>DIM(dev_self)) {
+	        IRDA_DEBUG(0, __FUNCTION__ 
+			   "(), to many devices!\n");
+		return -ENOMEM;
+	}
+
 	/*
 	 *  Allocate new instance of the driver
 	 */
@@ -206,46 +475,75 @@
 	}
 	memset(self, 0, sizeof(struct ircc_cb));
 	spin_lock_init(&self->lock);
-   
-	/* Need to store self somewhere */
-	dev_self[i] = self;
 
-	irport = irport_open(i, sir_base, config >> 4 & 0x0f);
-	if (!irport)
+	/* Max DMA buffer size needed = (data_size + 6) * (window_size) + 6; */
+	self->rx_buff.truesize = 4000; 
+	self->tx_buff.truesize = 4000;
+
+	self->rx_buff.head = (u8 *) kmalloc(self->rx_buff.truesize,
+					      GFP_KERNEL|GFP_DMA);
+	if (self->rx_buff.head == NULL) {
+		ERROR("%s, Can't allocate memory for receive buffer!\n",
+                      driver_name);
+		kfree(self);
+		return -ENOMEM;
+	}
+
+	self->tx_buff.head = (u8 *) kmalloc(self->tx_buff.truesize, 
+					      GFP_KERNEL|GFP_DMA);
+	if (self->tx_buff.head == NULL) {
+		ERROR("%s, Can't allocate memory for transmit buffer!\n",
+                      driver_name);
+		kfree(self->rx_buff.head);
+		kfree(self);
+		return -ENOMEM;
+	}
+
+	irport = irport_open(dev_count, sir_base, irq);
+	if (!irport) {
+		kfree(self->tx_buff.head);
+		kfree(self->rx_buff.head);
+		kfree(self);
 		return -ENODEV;
+	}
+
+	memset(self->rx_buff.head, 0, self->rx_buff.truesize);
+	memset(self->tx_buff.head, 0, self->tx_buff.truesize);
+   
+	/* Need to store self somewhere */
+	dev_self[dev_count++] = self;
 
 	/* Steal the network device from irport */
 	self->netdev = irport->netdev;
 	self->irport = irport;
+
 	irport->priv = self;
 
 	/* Initialize IO */
-	self->io.fir_base  = fir_base;
-        self->io.sir_base  = sir_base; /* Used by irport */
-        self->io.irq       = config >> 4 & 0x0f;
+	self->io           = &irport->io;
+	self->io->fir_base  = fir_base;
+        self->io->sir_base  = sir_base;	/* Used by irport */
+        self->io->fir_ext   = CHIP_IO_EXTENT;
+        self->io->sir_ext   = 8;		/* Used by irport */
+
 	if (ircc_irq < 255) {
-	        MESSAGE("%s, Overriding IRQ - chip says %d, using %d\n",
-			driver_name, self->io.irq, ircc_irq);
-		self->io.irq = ircc_irq;
-	}
-        self->io.fir_ext   = CHIP_IO_EXTENT;
-        self->io.sir_ext   = 8;       /* Used by irport */
-        self->io.dma       = config & 0x0f;
+		if (ircc_irq!=irq)
+			MESSAGE("%s, Overriding IRQ - chip says %d, using %d\n",
+				driver_name, self->io->irq, ircc_irq);
+		self->io->irq = ircc_irq;
+	}
+	else
+		self->io->irq = irq;
 	if (ircc_dma < 255) {
-	        MESSAGE("%s, Overriding DMA - chip says %d, using %d\n",
-			driver_name, self->io.dma, ircc_dma);
-		self->io.dma = ircc_dma;
+		if (ircc_dma!=dma)
+			MESSAGE("%s, Overriding DMA - chip says %d, using %d\n",
+				driver_name, self->io->dma, ircc_dma);
+		self->io->dma = ircc_dma;
 	}
+	else
+		self->io->dma = dma;
 
-	/* Lock the port that we need */
-	ret = check_region(self->io.fir_base, self->io.fir_ext);
-	if (ret < 0) { 
-		IRDA_DEBUG(0, __FUNCTION__ ": can't get fir_base of 0x%03x\n",
-			   self->io.fir_base);
-                kfree(self);
-		return -ENODEV;
-	}
-	request_region(self->io.fir_base, self->io.fir_ext, driver_name);
+	request_region(fir_base, CHIP_IO_EXTENT, driver_name);
 
 	/* Initialize QoS for this device */
 	irda_init_max_qos_capabilies(&irport->qos);
@@ -260,23 +558,6 @@
 
 	irport->flags = IFF_FIR|IFF_MIR|IFF_SIR|IFF_DMA|IFF_PIO;
 	
-	/* Max DMA buffer size needed = (data_size + 6) * (window_size) + 6; */
-	self->rx_buff.truesize = 4000; 
-	self->tx_buff.truesize = 4000;
-
-	self->rx_buff.head = (__u8 *) kmalloc(self->rx_buff.truesize,
-					      GFP_KERNEL|GFP_DMA);
-	if (self->rx_buff.head == NULL)
-		return -ENOMEM;
-	memset(self->rx_buff.head, 0, self->rx_buff.truesize);
-	
-	self->tx_buff.head = (__u8 *) kmalloc(self->tx_buff.truesize, 
-					      GFP_KERNEL|GFP_DMA);
-	if (self->tx_buff.head == NULL) {
-		kfree(self->rx_buff.head);
-		return -ENOMEM;
-	}
-	memset(self->tx_buff.head, 0, self->tx_buff.truesize);
 
 	self->rx_buff.in_frame = FALSE;
 	self->rx_buff.state = OUTSIDE_FRAME;
@@ -295,196 +576,12 @@
         if (self->pmdev)
                 self->pmdev->data = self;
 
-	return 0;
-}
-
-/*
- * Function ircc_close (self)
- *
- *    Close driver instance
- *
- */
-#ifdef MODULE
-static int ircc_close(struct ircc_cb *self)
-{
-	int iobase;
-
-	IRDA_DEBUG(0, __FUNCTION__ "\n");
-
-	ASSERT(self != NULL, return -1;);
-
-        iobase = self->io.fir_base;
-
-	irport_close(self->irport);
-
-	/* Stop interrupts */
-	register_bank(iobase, 0);
-	outb(0, iobase+IRCC_IER);
-	outb(IRCC_MASTER_RESET, iobase+IRCC_MASTER);
-	outb(0x00, iobase+IRCC_MASTER);
-#if 0
-	/* Reset to SIR mode */
-	register_bank(iobase, 1);
-        outb(IRCC_CFGA_IRDA_SIR_A|IRCC_CFGA_TX_POLARITY, iobase+IRCC_SCE_CFGA);
-        outb(IRCC_CFGB_IR, iobase+IRCC_SCE_CFGB);
-#endif
-	/* Release the PORT that this driver is using */
-	IRDA_DEBUG(0, __FUNCTION__ "(), releasing 0x%03x\n", 
-		   self->io.fir_base);
-
-	release_region(self->io.fir_base, self->io.fir_ext);
-
-	if (self->tx_buff.head)
-		kfree(self->tx_buff.head);
-	
-	if (self->rx_buff.head)
-		kfree(self->rx_buff.head);
+	/* Power on device */
 
-	kfree(self);
+	outb(0x00, fir_base+IRCC_MASTER);
 
 	return 0;
 }
-#endif /* MODULE */
-
-/*
- * Function ircc_probe_69 (chip, info)
- *
- *    Probes for the SMC FDC37C669 and FDC37N869
- *
- */
-static int ircc_probe_69(smc_chip_t *chip, chipio_t *info)
-{
-	int cfg_base = info->cfg_base;
-	__u8 devid, mode;
-	int ret = -ENODEV;
-	int fir_io;
-	
-	IRDA_DEBUG(0, __FUNCTION__ "()\n");
-
-	/* Enter configuration */
-	outb(chip->entr1, cfg_base);
-	outb(chip->entr2, cfg_base);
-	
-	outb(chip->cid_index, cfg_base);
-	devid = inb(cfg_base+1);
-	IRDA_DEBUG(0, __FUNCTION__ "(), devid=0x%02x\n",devid);
-	
-	/* Check for expected device ID; are there others? */
-	if (devid == chip->cid_value) {
-		outb(0x0c, cfg_base);
-		mode = inb(cfg_base+1);
-		mode = (mode & 0x38) >> 3;
-		
-		/* Value for IR port */
-		if (mode && mode < 4) {
-			/* SIR iobase */
-			outb(0x25, cfg_base);
-			info->sir_base = inb(cfg_base+1) << 2;
-
-		       	/* FIR iobase */
-			outb(0x2b, cfg_base);
-			fir_io = inb(cfg_base+1) << 3;
-			if (fir_io) {
-				ret = 0;
-				info->fir_base = fir_io;
-			}
-		}
-	}
-	
-	/* Exit configuration */
-	outb(0xaa, cfg_base);
-
-	return ret;
-}
-
-/*
- * Function ircc_probe_58 (chip, info)
- *
- *    Probes for the SMC FDC37N958
- *
- */
-static int ircc_probe_58(smc_chip_t *chip, chipio_t *info)
-{
-	int cfg_base = info->cfg_base;
-	__u8 devid;
-	int ret = -ENODEV;
-	int fir_io;
-	
-	IRDA_DEBUG(0, __FUNCTION__ "()\n");
-
-	/* Enter configuration */
-	outb(chip->entr1, cfg_base);
-	outb(chip->entr2, cfg_base);
-	
-	outb(chip->cid_index, cfg_base);
-	devid = inb(cfg_base+1);
-	IRDA_DEBUG(0, __FUNCTION__ "(), devid=0x%02x\n",devid);
-	
-	/* Check for expected device ID; are there others? */
-	if (devid == chip->cid_value) {
-		/* Select logical device (UART2) */
-		outb(0x07, cfg_base);
-		outb(0x05, cfg_base + 1);
-		
-		/* SIR iobase */
-		outb(0x60, cfg_base);
-		info->sir_base = inb(cfg_base + 1) << 8;
-		outb(0x61, cfg_base);
-		info->sir_base |= inb(cfg_base + 1);
-		
-		/* Read FIR base */
-		outb(0x62, cfg_base);
-		fir_io = inb(cfg_base + 1) << 8;
-		outb(0x63, cfg_base);
-		fir_io |= inb(cfg_base + 1);
-		outb(0x2b, cfg_base);
-		if (fir_io) {
-			ret = 0;
-			info->fir_base = fir_io;
-		}
-	}
-	
-	/* Exit configuration */
-	outb(0xaa, cfg_base);
-
-	return ret;
-}
-
-/*
- * Function ircc_probe (iobase, board_addr, irq, dma)
- *
- *    Returns non-negative on success.
- *
- */
-static int ircc_probe(int fir_base, int sir_base) 
-{
-	int low, high, chip, config, dma, irq;
-	int iobase = fir_base;
-	int version = 1;
-
-	IRDA_DEBUG(0, __FUNCTION__ "\n");
-
-	register_bank(iobase, 3);
-	high    = inb(iobase+IRCC_ID_HIGH);
-	low     = inb(iobase+IRCC_ID_LOW);
-	chip    = inb(iobase+IRCC_CHIP_ID);
-	version = inb(iobase+IRCC_VERSION);
-	config  = inb(iobase+IRCC_INTERFACE);
-	irq     = config >> 4 & 0x0f;
-	dma     = config & 0x0f;
-
-        if (high == 0x10 && low == 0xb8 && (chip == 0xf1 || chip == 0xf2)) { 
-                MESSAGE("SMC IrDA Controller found; IrCC version %d.%d, "
-			"port 0x%03x, dma=%d, irq=%d\n",
-			chip & 0x0f, version, iobase, dma, irq);
-	} else
-		return -ENODEV;
-
-	/* Power on device */
-	outb(0x00, iobase+IRCC_MASTER);
-
-	return config;
-}
 
 /*
  * Function ircc_change_speed (self, baud)
@@ -492,7 +589,7 @@
  *    Change the speed of the device
  *
  */
-static void ircc_change_speed(void *priv, __u32 speed)
+static void ircc_change_speed(void *priv, u32 speed)
 {
 	int iobase, ir_mode, ctrl, fast; 
 	struct ircc_cb *self = (struct ircc_cb *) priv;
@@ -503,10 +600,10 @@
 	ASSERT(self != NULL, return;);
 
 	dev = self->netdev;
-	iobase = self->io.fir_base;
+	iobase = self->io->fir_base;
 
 	/* Update accounting for new speed */
-	self->io.speed = speed;
+	self->io->speed = speed;
 
 	outb(IRCC_MASTER_RESET, iobase+IRCC_MASTER);
 	outb(0x00, iobase+IRCC_MASTER);
@@ -560,7 +657,7 @@
 		 * Don't know why we have to do this, but FIR interrupts 
 		 * stops working if we remove it.
 		 */
-		/* outb(UART_MCR_OUT2, self->io.sir_base + UART_MCR); */
+		/* outb(UART_MCR_OUT2, self->io->sir_base + UART_MCR); */
 
 		/* Be ready for incoming frames */
 		ircc_dma_receive(self, iobase);
@@ -608,7 +705,7 @@
 	struct irport_cb *irport;
 	struct ircc_cb *self;
 	unsigned long flags;
-	__s32 speed;
+	s32 speed;
 	int iobase;
 	int mtt;
 
@@ -616,13 +713,13 @@
 	self = (struct ircc_cb *) irport->priv;
 	ASSERT(self != NULL, return 0;);
 
-	iobase = self->io.fir_base;
+	iobase = self->io->fir_base;
 
 	netif_stop_queue(dev);
 
 	/* Check if we need to change the speed after this frame */
 	speed = irda_get_next_speed(skb);
-	if ((speed != self->io.speed) && (speed != -1)) {
+	if ((speed != self->io->speed) && (speed != -1)) {
 		/* Check for empty frame */
 		if (!skb->len) {
 			ircc_change_speed(self, speed); 
@@ -647,7 +744,7 @@
 		 * Compute how many BOFs (STA or PA's) we need to waste the
 		 * min turn time given the speed of the link.
 		 */
-		bofs = mtt * (self->io.speed / 1000) / 8000;
+		bofs = mtt * (self->io->speed / 1000) / 8000;
 		if (bofs > 4095)
 			bofs = 4095;
 
@@ -670,7 +767,7 @@
  */
 static void ircc_dma_xmit(struct ircc_cb *self, int iobase, int bofs)
 {
-	__u8 ctrl;
+	u8 ctrl;
 
 	IRDA_DEBUG(2, __FUNCTION__ "\n");
 #if 0	
@@ -682,7 +779,7 @@
 	outb(inb(iobase+IRCC_SCE_CFGB) & ~IRCC_CFGB_DMA_ENABLE, 
 	     iobase+IRCC_SCE_CFGB);
 
-	self->io.direction = IO_XMIT;
+	self->io->direction = IO_XMIT;
 
 	/* Set BOF additional count for generating the min turn time */
 	register_bank(iobase, 4);
@@ -695,10 +792,10 @@
 	outb(self->tx_buff.len & 0xff, iobase+IRCC_TX_SIZE_LO);
 
 	/* Setup DMA controller (must be done after enabling chip DMA) */
-	setup_dma(self->io.dma, self->tx_buff.data, self->tx_buff.len, 
+	setup_dma(self->io->dma, self->tx_buff.data, self->tx_buff.len, 
 		  DMA_TX_MODE);
 
-	outb(UART_MCR_OUT2, self->io.sir_base + UART_MCR);
+	outb(UART_MCR_OUT2, self->io->sir_base + UART_MCR);
 	/* Enable burst mode chip Tx DMA */
 	register_bank(iobase, 1);
 	outb(inb(iobase+IRCC_SCE_CFGB) | IRCC_CFGB_DMA_ENABLE |
@@ -728,9 +825,9 @@
 	register_bank(iobase, 0);
 	outb(0x00, iobase+IRCC_LCR_B);
 #endif
-	register_bank(self->io.fir_base, 1);
-	outb(inb(self->io.fir_base+IRCC_SCE_CFGB) & ~IRCC_CFGB_DMA_ENABLE,
-	     self->io.fir_base+IRCC_SCE_CFGB);
+	register_bank(self->io->fir_base, 1);
+	outb(inb(self->io->fir_base+IRCC_SCE_CFGB) & ~IRCC_CFGB_DMA_ENABLE,
+	     self->io->fir_base+IRCC_SCE_CFGB);
 
 	/* Check for underrrun! */
 	register_bank(iobase, 0);
@@ -765,12 +862,13 @@
  */
 static int ircc_dma_receive(struct ircc_cb *self, int iobase) 
 {	
+#if 0
 	/* Turn off chip DMA */
-	//register_bank(iobase, 1);
-	//outb(inb(iobase+IRCC_SCE_CFGB) & ~IRCC_CFGB_DMA_ENABLE, 
-	//     iobase+IRCC_SCE_CFGB);
-
-	setup_dma(self->io.dma, self->rx_buff.data, self->rx_buff.truesize, 
+	register_bank(iobase, 1);
+	outb(inb(iobase+IRCC_SCE_CFGB) & ~IRCC_CFGB_DMA_ENABLE, 
+	     iobase+IRCC_SCE_CFGB);
+#endif
+	setup_dma(self->io->dma, self->rx_buff.data, self->rx_buff.truesize, 
 		  DMA_RX_MODE);
 
 	/* Set max Rx frame size */
@@ -778,7 +876,7 @@
 	outb((2050 >> 8) & 0x0f, iobase+IRCC_RX_SIZE_HI);
 	outb(2050 & 0xff, iobase+IRCC_RX_SIZE_LO);
 
-	self->io.direction = IO_RECV;
+	self->io->direction = IO_RECV;
 	self->rx_buff.data = self->rx_buff.head;
 
 	/* Setup DMA controller */
@@ -817,12 +915,12 @@
 	msgcnt = inb(iobase+IRCC_LCR_B) & 0x08;
 
 	IRDA_DEBUG(2, __FUNCTION__ ": dma count = %d\n",
-		   get_dma_residue(self->io.dma));
+		   get_dma_residue(self->io->dma));
 
-	len = self->rx_buff.truesize - get_dma_residue(self->io.dma);
+	len = self->rx_buff.truesize - get_dma_residue(self->io->dma);
 	
 	/* Remove CRC */
-	if (self->io.speed < 4000000)
+	if (self->io->speed < 4000000)
 		len -= 2;
 	else
 		len -= 4;
@@ -875,11 +973,11 @@
 	ASSERT(self != NULL, return;);
 
 	/* Check if we should use the SIR interrupt handler */
-	if (self->io.speed < 576000) {
+	if (self->io->speed < 576000) {
 		irport_interrupt(irq, dev_id, regs);
 		return;
 	}
-	iobase = self->io.fir_base;
+	iobase = self->io->fir_base;
 
 	spin_lock(&self->lock);	
 
@@ -892,7 +990,7 @@
 	IRDA_DEBUG(2, __FUNCTION__ "(), iir = 0x%02x\n", iir);
 
 	if (iir & IRCC_IIR_EOM) {
-		if (self->io.direction == IO_RECV)
+		if (self->io->direction == IO_RECV)
 			ircc_dma_receive_complete(self, iobase);
 		else
 			ircc_dma_xmit_complete(self, iobase);
@@ -924,7 +1022,7 @@
 	ASSERT(self != NULL, return FALSE;);
 
 	IRDA_DEBUG(0, __FUNCTION__ ": dma count = %d\n",
-		   get_dma_residue(self->io.dma));
+		   get_dma_residue(self->io->dma));
 
 	status = (self->rx_buff.state != OUTSIDE_FRAME);
 	
@@ -952,7 +1050,7 @@
 
 	ASSERT(self != NULL, return 0;);
 	
-	iobase = self->io.fir_base;
+	iobase = self->io->fir_base;
 
 	irport_net_open(dev); /* irport allocates the irq */
 
@@ -960,9 +1058,10 @@
 	 * Always allocate the DMA channel after the IRQ,
 	 * and clean up on failure.
 	 */
-	if (request_dma(self->io.dma, dev->name)) {
+	if (request_dma(self->io->dma, dev->name)) {
 		irport_net_close(dev);
 
+		WARNING(__FUNCTION__ "(), unable to allocate DMA=%d\n", self->io->dma);
 		return -EAGAIN;
 	}
 	
@@ -991,13 +1090,13 @@
 	
 	ASSERT(self != NULL, return 0;);
 	
-	iobase = self->io.fir_base;
+	iobase = self->io->fir_base;
 
 	irport_net_close(dev);
 
-	disable_dma(self->io.dma);
+	disable_dma(self->io->dma);
 
-	free_dma(self->io.dma);
+	free_dma(self->io->dma);
 
 	MOD_DEC_USE_COUNT;
 
@@ -1008,19 +1107,19 @@
 {
 	MESSAGE("%s, Suspending\n", driver_name);
 
-	if (self->io.suspended)
+	if (self->io->suspended)
 		return;
 
 	ircc_net_close(self->netdev);
 
-	self->io.suspended = 1;
+	self->io->suspended = 1;
 }
 
 static void ircc_wakeup(struct ircc_cb *self)
 {
 	unsigned long flags;
 
-	if (!self->io.suspended)
+	if (!self->io->suspended)
 		return;
 
 	save_flags(flags);
@@ -1049,21 +1148,84 @@
 }
 
 #ifdef MODULE
-MODULE_AUTHOR("Thomas Davis <tadavis@jps.net>");
-MODULE_DESCRIPTION("SMC IrCC controller driver");
-MODULE_PARM(ircc_dma, "1i");
-MODULE_PARM_DESC(ircc_dma, "DMA channel");
-MODULE_PARM(ircc_irq, "1i");
-MODULE_PARM_DESC(ircc_irq, "IRQ line");
 
-int init_module(void)
+/*
+ * Function ircc_close (self)
+ *
+ *    Close driver instance
+ *
+ */
+#ifdef MODULE
+static int __exit ircc_close(struct ircc_cb *self)
+{
+	int iobase;
+
+	IRDA_DEBUG(0, __FUNCTION__ "\n");
+
+	ASSERT(self != NULL, return -1;);
+
+        iobase = self->irport->io.fir_base;
+
+	irport_close(self->irport);
+
+	/* Stop interrupts */
+	register_bank(iobase, 0);
+	outb(0, iobase+IRCC_IER);
+	outb(IRCC_MASTER_RESET, iobase+IRCC_MASTER);
+	outb(0x00, iobase+IRCC_MASTER);
+#if 0
+	/* Reset to SIR mode */
+	register_bank(iobase, 1);
+        outb(IRCC_CFGA_IRDA_SIR_A|IRCC_CFGA_TX_POLARITY, iobase+IRCC_SCE_CFGA);
+        outb(IRCC_CFGB_IR, iobase+IRCC_SCE_CFGB);
+#endif
+	/* Release the PORT that this driver is using */
+	IRDA_DEBUG(0, __FUNCTION__ "(), releasing 0x%03x\n", 
+		   self->io->fir_base);
+
+	release_region(self->io->fir_base, self->io->fir_ext);
+
+	if (self->tx_buff.head)
+		kfree(self->tx_buff.head);
+	
+	if (self->rx_buff.head)
+		kfree(self->rx_buff.head);
+
+	kfree(self);
+
+	return 0;
+}
+#endif /* MODULE */
+
+int __init smc_init(void)
 {
 	return ircc_init();
 }
 
-void cleanup_module(void)
+void __exit smc_cleanup(void)
 {
-	ircc_cleanup();
+	int i;
+
+	IRDA_DEBUG(0, __FUNCTION__ "\n");
+
+	for (i=0; i < 2; i++) {
+		if (dev_self[i])
+			ircc_close(dev_self[i]);
+	}
 }
+
+module_init(smc_init);
+module_exit(smc_cleanup);
+ 
+MODULE_AUTHOR("Thomas Davis <tadavis@jps.net>");
+MODULE_DESCRIPTION("SMC IrCC controller driver");
+MODULE_PARM(ircc_dma, "1i");
+MODULE_PARM_DESC(ircc_dma, "DMA channel");
+MODULE_PARM(ircc_irq, "1i");
+MODULE_PARM_DESC(ircc_irq, "IRQ line");
+MODULE_PARM(ircc_fir, "1-4i");
+MODULE_PARM_DESC(ircc_fir, "FIR Base Address");
+MODULE_PARM(ircc_sir, "1-4i");
+MODULE_PARM_DESC(ircc_sir, "SIR Base Address");
 
 #endif /* MODULE */
diff -u --recursive --new-file v2.4.8/linux/drivers/net/irda/vlsi_ir.c linux/drivers/net/irda/vlsi_ir.c
--- v2.4.8/linux/drivers/net/irda/vlsi_ir.c	Wed Dec 31 16:00:00 1969
+++ linux/drivers/net/irda/vlsi_ir.c	Sun Aug 12 10:51:42 2001
@@ -0,0 +1,1259 @@
+/*********************************************************************
+ *
+ *	vlsi_ir.c:	VLSI82C147 PCI IrDA controller driver for Linux
+ *
+ *	Version:	0.1, Aug 6, 2001
+ *
+ *	Copyright (c) 2001 Martin Diehl
+ *
+ *	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., 59 Temple Place, Suite 330, Boston, 
+ *	MA 02111-1307 USA
+ *
+ ********************************************************************/
+
+#include <linux/module.h>
+ 
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/pci.h>
+#include <linux/slab.h>
+#include <linux/netdevice.h>
+#include <linux/skbuff.h>
+#include <linux/delay.h>
+
+#include <net/irda/irda.h>
+#include <net/irda/irda_device.h>
+#include <net/irda/wrapper.h>
+#include <net/irda/irlap.h>
+
+#include <net/irda/vlsi_ir.h>
+
+
+/********************************************************/
+
+
+MODULE_DESCRIPTION("IrDA SIR/MIR/FIR driver for VLSI 82C147");
+MODULE_AUTHOR("Martin Diehl <info@mdiehl.de>");
+
+
+static /* const */ char drivername[] = "vlsi_ir";
+
+
+#define PCI_CLASS_IRDA_GENERIC 0x0d00
+
+static struct pci_device_id vlsi_irda_table [] __devinitdata = { {
+
+	class:          PCI_CLASS_IRDA_GENERIC << 8,
+	vendor:         PCI_VENDOR_ID_VLSI,
+	device:         PCI_DEVICE_ID_VLSI_82C147,
+	}, { /* all zeroes */ }
+};
+
+MODULE_DEVICE_TABLE(pci, vlsi_irda_table);
+
+
+/********************************************************/
+
+
+MODULE_PARM(clksrc, "i");
+MODULE_PARM_DESC(clksrc, "clock input source selection");
+
+/*	clksrc: which clock source to be used
+ *		0: auto - try PLL, fallback to 40MHz XCLK
+ *		1: on-chip 48MHz PLL
+ *		2: external 48MHz XCLK
+ *		3: external 40MHz XCLK (HP OB-800)
+ */
+
+static int clksrc = 0;			/* default is 0(auto) */
+
+
+MODULE_PARM(ringsize, "1-2i");
+MODULE_PARM_DESC(ringsize, "tx, rx ring descriptor size");
+
+/*	ringsize: size of the tx and rx descriptor rings
+ *		independent for tx and rx
+ *		specify as ringsize=tx[,rx]
+ *		allowed values: 4, 8, 16, 32, 64
+ */
+
+static int ringsize[] = {16,16};	/* default is tx=rx=16 */
+
+
+MODULE_PARM(sirpulse, "i");
+MODULE_PARM_DESC(sirpulse, "sir pulse width tuning");
+
+/*	sirpulse: tuning of the sir pulse width within IrPHY 1.3 limits
+ *		0: real short, 1.5us (exception 6us at 2.4kb/s)
+ *		1: nominal 3/16 bittime width
+ */
+
+static int sirpulse = 1;		/* default is 3/16 bittime */
+
+
+MODULE_PARM(mtt_bits, "i");
+MODULE_PARM_DESC(mtt_bits, "IrLAP bitfield representing min-turn-time");
+
+/*	mtt_bit: encoded min-turn-time values we accept for connections
+ *		 according to IrLAP definition (section 6.6.8)
+ *		 the widespreadly used HP HDLS-1100 requires 1 msec
+ */
+
+static int mtt_bits = 0x07;		/* default is 1 ms or more */
+
+
+/********************************************************/
+
+
+/* some helpers for operations on ring descriptors */
+
+
+static inline int rd_is_active(struct ring_descr *rd)
+{
+	return ((rd->rd_status & RD_STAT_ACTIVE) != 0);
+}
+
+static inline void rd_set_addr_status(struct ring_descr *rd, dma_addr_t a, u8 s)
+{
+	/* overlayed - order is important! */
+
+	rd->rd_addr = a;
+	rd->rd_status = s;
+}
+
+static inline void rd_set_status(struct ring_descr *rd, u8 s)
+{
+	rd->rd_status = s;
+}
+
+static inline void rd_set_count(struct ring_descr *rd, u16 c)
+{
+	rd->rd_count = c;
+}
+
+static inline u8 rd_get_status(struct ring_descr *rd)
+{
+	return rd->rd_status;
+}
+
+static inline dma_addr_t rd_get_addr(struct ring_descr *rd)
+{
+	dma_addr_t	a;
+
+	a = (rd->rd_addr & DMA_MASK_MSTRPAGE) | (MSTRPAGE_VALUE << 24);
+	return a;
+}
+
+static inline u16 rd_get_count(struct ring_descr *rd)
+{
+	return rd->rd_count;
+}
+
+
+/* advancing indices pointing into descriptor rings */
+
+static inline void ring_ptr_inc(unsigned *ptr, unsigned mask)
+{
+	*ptr = (*ptr + 1) & mask;
+}
+
+
+/********************************************************/
+
+
+#define MAX_PACKET_LEN		2048	/* IrDA MTU */
+
+/* increase transfer buffer size somewhat so we have enough space left
+ * when packet size increases during wrapping due to XBOFs and escapes.
+ * well, this wastes some memory - anyway, later we will
+ * either map skb's directly or use pci_pool allocator...
+ */
+
+#define XFER_BUF_SIZE		(MAX_PACKET_LEN+512)
+
+/* the memory required to hold the 2 descriptor rings */
+
+#define RING_AREA_SIZE		(2 * MAX_RING_DESCR * sizeof(struct ring_descr))
+
+/* the memory required to hold the rings' buffer entries */
+
+#define RING_ENTRY_SIZE		(2 * MAX_RING_DESCR * sizeof(struct ring_entry))
+
+
+/********************************************************/
+
+/* just dump all registers */
+
+static void vlsi_reg_debug(int iobase, const char *s)
+{
+	int	i;
+
+	mb();
+	printk(KERN_DEBUG "%s: ", s);
+	for (i = 0; i < 0x20; i++)
+		printk("%02x", (unsigned)inb((iobase+i)));
+	printk("\n");
+}
+
+/********************************************************/
+
+
+static int vlsi_set_clock(struct pci_dev *pdev)
+{
+	u8	clkctl, lock;
+	int	i, count;
+
+	if (clksrc < 0  ||  clksrc > 3) {
+		printk(KERN_ERR "%s: invalid clksrc=%d\n", __FUNCTION__, clksrc);
+		return -1;
+	}
+	if (clksrc < 2) { /* auto or PLL: try PLL */
+		clkctl = CLKCTL_NO_PD | CLKCTL_CLKSTP;
+		pci_write_config_byte(pdev, VLSI_PCI_CLKCTL, clkctl);
+
+		/* protocol to detect PLL lock synchronisation */
+		udelay(500);
+		count = 0;
+		for (i = 500; i <= 10000; i += 50) { /* max 10 msec */
+			pci_read_config_byte(pdev, VLSI_PCI_CLKCTL, &lock);
+			if (lock&CLKCTL_LOCK) {
+				if (++count >= 3)
+					break;
+			}
+			udelay(50);
+		}
+		if (count < 3) {
+			if (clksrc == 1) { /* explicitly asked for PLL hence bail out */
+				printk(KERN_ERR "%s: no PLL or failed to lock!\n",
+					__FUNCTION__);
+				clkctl = CLKCTL_CLKSTP;
+				pci_write_config_byte(pdev, VLSI_PCI_CLKCTL, clkctl);
+				return -1;
+			}
+			else /* was: clksrc=0(auto) */
+				clksrc = 3; /* fallback to 40MHz XCLK (OB800) */
+
+			printk(KERN_INFO "%s: PLL not locked, fallback to clksrc=%d\n",
+				__FUNCTION__, clksrc);
+		}
+		else { /* got succesful PLL lock */
+			clksrc = 1;
+			return 0;
+		}
+	}
+
+	/* we get here if either no PLL detected in auto-mode or
+	   the external clock source explicitly specified */
+
+	clkctl = CLKCTL_EXTCLK | CLKCTL_CLKSTP;
+	if (clksrc == 3)
+		clkctl |= CLKCTL_XCKSEL;	
+	pci_write_config_byte(pdev, VLSI_PCI_CLKCTL, clkctl);
+
+	/* no way to test for working XCLK */
+
+	return 0;
+}
+
+
+static void vlsi_start_clock(struct pci_dev *pdev)
+{
+	u8	clkctl;
+
+	printk(KERN_INFO "%s: start clock using %s as input\n", __FUNCTION__,
+		(clksrc&2)?((clksrc&1)?"40MHz XCLK":"48MHz XCLK"):"48MHz PLL");
+	pci_read_config_byte(pdev, VLSI_PCI_CLKCTL, &clkctl);
+	clkctl &= ~CLKCTL_CLKSTP;
+	pci_write_config_byte(pdev, VLSI_PCI_CLKCTL, clkctl);
+}
+			
+
+static void vlsi_stop_clock(struct pci_dev *pdev)
+{
+	u8	clkctl;
+
+	pci_read_config_byte(pdev, VLSI_PCI_CLKCTL, &clkctl);
+	clkctl |= CLKCTL_CLKSTP;
+	pci_write_config_byte(pdev, VLSI_PCI_CLKCTL, clkctl);
+}
+			
+
+static void vlsi_unset_clock(struct pci_dev *pdev)
+{
+	u8	clkctl;
+
+	pci_read_config_byte(pdev, VLSI_PCI_CLKCTL, &clkctl);
+	if (!(clkctl&CLKCTL_CLKSTP))
+		/* make sure clock is already stopped */
+		vlsi_stop_clock(pdev);
+
+	clkctl &= ~(CLKCTL_EXTCLK | CLKCTL_NO_PD);
+	pci_write_config_byte(pdev, VLSI_PCI_CLKCTL, clkctl);
+}
+
+/********************************************************/
+
+
+/* ### FIXME: don't use old virt_to_bus() anymore! */
+
+static int vlsi_alloc_buffers_init(vlsi_irda_dev_t *idev)
+{
+	void *buf;
+	int i, j;
+
+	idev->ring_buf = kmalloc(RING_ENTRY_SIZE,GFP_KERNEL);
+	if (!idev->ring_buf)
+		return -ENOMEM;
+	memset(idev->ring_buf, 0, RING_ENTRY_SIZE);
+
+	for (i = MAX_RING_DESCR; i < MAX_RING_DESCR+ringsize[0]; i++) {
+		buf = kmalloc(XFER_BUF_SIZE, GFP_KERNEL|GFP_DMA);
+		if (!buf) {
+			for (j = MAX_RING_DESCR; j < i; j++)
+				kfree(idev->ring_buf[j].head);
+			kfree(idev->ring_buf);
+			idev->ring_buf = NULL;
+			return -ENOMEM;
+		}
+		idev->ring_buf[i].head = buf;
+		idev->ring_buf[i].skb = NULL;
+		rd_set_addr_status(idev->ring_hw+i,virt_to_bus(buf), 0);
+	}
+
+	for (i = 0; i < ringsize[1]; i++) {
+		buf = kmalloc(XFER_BUF_SIZE, GFP_KERNEL|GFP_DMA);
+		if (!buf) {
+			for (j = 0; j < i; j++)
+				kfree(idev->ring_buf[j].head);
+			for (j = MAX_RING_DESCR; j < MAX_RING_DESCR+ringsize[0]; j++)
+				kfree(idev->ring_buf[j].head);
+			kfree(idev->ring_buf);
+			idev->ring_buf = NULL;
+			return -ENOMEM;
+		}
+		idev->ring_buf[i].head = buf;
+		idev->ring_buf[i].skb = NULL;
+		rd_set_addr_status(idev->ring_hw+i,virt_to_bus(buf), RD_STAT_ACTIVE);
+	}
+
+	return 0;
+}
+
+
+static int vlsi_init_ring(vlsi_irda_dev_t *idev)
+{
+
+	idev->tx_mask = MAX_RING_DESCR | (ringsize[0] - 1);
+	idev->rx_mask = ringsize[1] - 1;
+
+	idev->ring_hw = pci_alloc_consistent(idev->pdev,
+		RING_AREA_SIZE, &idev->busaddr);
+	if (!idev->ring_hw) {
+		printk(KERN_ERR "%s: insufficient memory for descriptor rings\n",
+			__FUNCTION__);
+		return -ENOMEM;
+	}
+#if 0
+	printk(KERN_DEBUG "%s: (%d,%d)-ring %p / %p\n", __FUNCTION__,
+		ringsize[0], ringsize[1], idev->ring_hw, 
+		(void *)(unsigned)idev->busaddr);
+#endif
+	memset(idev->ring_hw, 0, RING_AREA_SIZE);
+
+	if (vlsi_alloc_buffers_init(idev)) {
+		
+		pci_free_consistent(idev->pdev, RING_AREA_SIZE,
+			idev->ring_hw, idev->busaddr);
+		printk(KERN_ERR "%s: insufficient memory for ring buffers\n",
+			__FUNCTION__);
+		return -1;
+	}
+
+	return 0;
+}
+
+
+
+/********************************************************/
+
+
+
+static int vlsi_set_baud(struct net_device *ndev)
+{
+	vlsi_irda_dev_t *idev = ndev->priv;
+	unsigned long flags;
+	u16 nphyctl;
+	int iobase; 
+	u16 config;
+	unsigned mode;
+	int	ret;
+	int	baudrate;
+
+	baudrate = idev->new_baud;
+	iobase = ndev->base_addr;
+
+	printk(KERN_DEBUG "%s: %d -> %d\n", __FUNCTION__, idev->baud, idev->new_baud);
+
+	spin_lock_irqsave(&idev->lock, flags);
+
+	outw(0, iobase+VLSI_PIO_IRENABLE);
+
+	if (baudrate == 4000000) {
+		mode = IFF_FIR;
+		config = IRCFG_FIR;
+		nphyctl = PHYCTL_FIR;
+	}
+	else if (baudrate == 1152000) {
+		mode = IFF_MIR;
+		config = IRCFG_MIR | IRCFG_CRC16;
+		nphyctl = PHYCTL_MIR(baudrate);
+	}
+	else {
+		mode = IFF_SIR;
+		config = IRCFG_SIR | IRCFG_SIRFILT | IRCFG_RXANY;
+		switch(baudrate) {
+			default:
+				printk(KERN_ERR "%s: undefined baudrate %d - fallback to 9600!\n",
+					__FUNCTION__, baudrate);
+				baudrate = 9600;
+				/* fallthru */
+			case 2400:
+			case 9600:
+			case 19200:
+			case 38400:
+			case 57600:
+			case 115200:
+				nphyctl = PHYCTL_SIR(baudrate,sirpulse,clksrc==3);
+				break;
+		}
+	}
+
+	config |= IRCFG_MSTR | IRCFG_ENRX;
+
+	outw(config, iobase+VLSI_PIO_IRCFG);
+
+	outw(nphyctl, iobase+VLSI_PIO_NPHYCTL);
+	wmb();
+	outw(IRENABLE_IREN, iobase+VLSI_PIO_IRENABLE);
+		/* chip fetches IRCFG on next rising edge of its 8MHz clock */
+
+	mb();
+	config = inw(iobase+VLSI_PIO_IRENABLE) & IRENABLE_MASK;
+
+	if (mode == IFF_FIR)
+		config ^= IRENABLE_FIR_ON;
+	else if (mode == IFF_MIR)
+		config ^= (IRENABLE_FIR_ON|IRENABLE_CRC16_ON);
+	else
+		config ^= IRENABLE_SIR_ON;
+
+
+	if (config != (IRENABLE_IREN|IRENABLE_ENRXST)) {
+		printk(KERN_ERR "%s: failed to set %s mode!\n", __FUNCTION__,
+			(mode==IFF_SIR)?"SIR":((mode==IFF_MIR)?"MIR":"FIR"));
+		ret = -1;
+	}
+	else {
+		if (inw(iobase+VLSI_PIO_PHYCTL) != nphyctl) {
+			printk(KERN_ERR "%s: failed to apply baudrate %d\n",
+				__FUNCTION__, baudrate);
+			ret = -1;
+		}
+		else {
+			idev->mode = mode;
+			idev->baud = baudrate;
+			idev->new_baud = 0;
+			ret = 0;
+		}
+	}
+	spin_unlock_irqrestore(&idev->lock, flags);
+
+	if (ret)
+		vlsi_reg_debug(iobase,__FUNCTION__);
+
+	return ret;
+}
+
+
+
+static int vlsi_init_chip(struct net_device *ndev)
+{
+	vlsi_irda_dev_t *idev = ndev->priv;
+	u16 ptr;
+	unsigned  iobase;
+
+
+	iobase = ndev->base_addr;
+
+	outw(0, iobase+VLSI_PIO_IRENABLE);
+
+	outb(IRINTR_INT_MASK, iobase+VLSI_PIO_IRINTR); /* w/c pending IRQ, disable all INT */
+
+	/* disable everything, particularly IRCFG_MSTR - which resets the RING_PTR */
+
+	outw(0, iobase+VLSI_PIO_IRCFG);
+	wmb();
+	outw(IRENABLE_IREN, iobase+VLSI_PIO_IRENABLE);
+
+	mb();
+
+	outw(0, iobase+VLSI_PIO_IRENABLE);
+
+	outw(MAX_PACKET_LEN, iobase+VLSI_PIO_MAXPKT);
+
+	outw(BUS_TO_RINGBASE(idev->busaddr), iobase+VLSI_PIO_RINGBASE);
+
+	outw(TX_RX_TO_RINGSIZE(ringsize[0], ringsize[1]), iobase+VLSI_PIO_RINGSIZE);	
+
+
+	ptr = inw(iobase+VLSI_PIO_RINGPTR);
+	idev->rx_put = idev->rx_get = RINGPTR_GET_RX(ptr);
+	idev->tx_put = idev->tx_get = RINGPTR_GET_TX(ptr);
+
+	outw(IRCFG_MSTR, iobase+VLSI_PIO_IRCFG);		/* ready for memory access */
+	wmb();
+	outw(IRENABLE_IREN, iobase+VLSI_PIO_IRENABLE);
+
+	mb();
+
+	idev->new_baud = 9600;		/* start with IrPHY using 9600(SIR) mode */
+	vlsi_set_baud(ndev);
+
+	outb(IRINTR_INT_MASK, iobase+VLSI_PIO_IRINTR);
+	wmb();
+
+	/* DO NOT BLINDLY ENABLE IRINTR_ACTEN!
+	 * basically every received pulse fires an ACTIVITY-INT
+	 * leading to >1000 INT's per second instead of few 10
+	 */
+
+	outb(IRINTR_RPKTEN|IRINTR_TPKTEN, iobase+VLSI_PIO_IRINTR);
+	wmb();
+
+	return 0;
+}
+
+
+/**************************************************************/
+
+
+static int vlsi_rx_interrupt(struct net_device *ndev)
+{
+	vlsi_irda_dev_t *idev = ndev->priv;
+	int	iobase;
+	int	entry;
+	int	len;
+	u8	status;
+	u16	word;
+	struct sk_buff	*skb;
+	int	crclen;
+
+	iobase = ndev->base_addr;
+
+	entry = idev->rx_get;
+
+	while ( !rd_is_active(idev->ring_hw+idev->rx_get) ) {
+
+		ring_ptr_inc(&idev->rx_get, idev->rx_mask);
+
+		while (entry != idev->rx_get) {
+
+			status = rd_get_status(idev->ring_hw+entry);
+
+			if (status & RD_STAT_ACTIVE) {
+				printk(KERN_CRIT "%s: rx still active!!!\n",
+					__FUNCTION__);
+				break;
+			}
+			if (status & RX_STAT_ERROR) {
+				idev->stats.rx_errors++;
+				if (status & RX_STAT_OVER)  
+					idev->stats.rx_over_errors++;
+				if (status & RX_STAT_LENGTH)  
+					idev->stats.rx_length_errors++;
+				if (status & RX_STAT_PHYERR)  
+					idev->stats.rx_frame_errors++;
+				if (status & RX_STAT_CRCERR)  
+					idev->stats.rx_crc_errors++;
+			}
+			else {
+				len = rd_get_count(idev->ring_hw+entry);
+				crclen = (idev->mode==IFF_FIR) ? 4 : 2;
+				if (len < crclen)
+					printk(KERN_ERR "%s: strange frame (len=%d)\n",
+						__FUNCTION__, len);
+				else
+					len -= crclen;		/* remove trailing CRC */
+
+				skb = dev_alloc_skb(len+1);
+				if (skb) {
+					skb->dev = ndev;
+					skb_reserve(skb,1);
+					memcpy(skb_put(skb,len), idev->ring_buf[entry].head, len);
+					idev->stats.rx_packets++;
+					idev->stats.rx_bytes += len;
+					skb->mac.raw = skb->data;
+					skb->protocol = htons(ETH_P_IRDA);
+					netif_rx(skb);				
+				}
+				else {
+					idev->stats.rx_dropped++;
+					printk(KERN_ERR "%s: rx packet dropped\n", __FUNCTION__);
+				}
+			}
+			rd_set_count(idev->ring_hw+entry, 0);
+			rd_set_status(idev->ring_hw+entry, RD_STAT_ACTIVE);
+			ring_ptr_inc(&entry, idev->rx_mask);
+		}
+	}
+	idev->rx_put = idev->rx_get;
+	idev->rx_get = entry;
+
+	word = inw(iobase+VLSI_PIO_IRENABLE);
+	if (!(word & IRENABLE_ENTXST)) {
+
+		/* only rewrite ENRX, if tx not running!
+		 * rewriting ENRX during tx in progress wouldn't hurt
+		 * but would be racy since we would also have to rewrite
+		 * ENTX then (same register) - which might get disabled meanwhile.
+		 */
+
+		outw(0, iobase+VLSI_PIO_IRENABLE);
+
+		word = inw(iobase+VLSI_PIO_IRCFG);
+		mb();
+		outw(word | IRCFG_ENRX, iobase+VLSI_PIO_IRCFG);
+		wmb();
+		outw(IRENABLE_IREN, iobase+VLSI_PIO_IRENABLE);
+	}
+	mb();
+	outw(0, iobase+VLSI_PIO_PROMPT);
+	return 0;
+}
+
+
+static int vlsi_tx_interrupt(struct net_device *ndev)
+{
+	vlsi_irda_dev_t *idev = ndev->priv;
+	int	iobase;
+	int	entry;
+	int	ret;
+	u16	config;
+	u16	status;
+
+	ret = 0;
+	iobase = ndev->base_addr;
+
+	entry = idev->tx_get;
+
+	while ( !rd_is_active(idev->ring_hw+idev->tx_get) ) {
+
+		if (idev->tx_get == idev->tx_put) { /* tx ring empty */
+			/* sth more to do here? */
+			break;
+		}
+		ring_ptr_inc(&idev->tx_get, idev->tx_mask);
+		while (entry != idev->tx_get) {
+			status = rd_get_status(idev->ring_hw+entry);
+			if (status & RD_STAT_ACTIVE) {
+				printk(KERN_CRIT "%s: tx still active!!!\n",
+					__FUNCTION__);
+				break;
+			}
+			if (status & TX_STAT_UNDRN) {
+				idev->stats.tx_errors++;
+				idev->stats.tx_fifo_errors++;
+			}
+			else {
+				idev->stats.tx_packets++;
+				idev->stats.tx_bytes += rd_get_count(idev->ring_hw+entry);
+			}
+			rd_set_count(idev->ring_hw+entry, 0);
+			rd_set_status(idev->ring_hw+entry, 0);
+			ring_ptr_inc(&entry, idev->tx_mask);
+		}
+	}
+
+	outw(0, iobase+VLSI_PIO_IRENABLE);
+	config = inw(iobase+VLSI_PIO_IRCFG);
+	mb();
+
+	if (idev->tx_get != idev->tx_put) {	/* tx ring not empty */
+		outw(config | IRCFG_ENTX, iobase+VLSI_PIO_IRCFG);
+		ret = 1;			/* no speed-change-check */
+	}
+	else
+		outw((config & ~IRCFG_ENTX) | IRCFG_ENRX, iobase+VLSI_PIO_IRCFG);
+	wmb();
+	outw(IRENABLE_IREN, iobase+VLSI_PIO_IRENABLE);
+
+	mb();
+
+	outw(0, iobase+VLSI_PIO_PROMPT);
+	wmb();
+
+	idev->tx_get = entry;
+	if (netif_queue_stopped(ndev)) {
+		netif_wake_queue(ndev);
+		printk(KERN_DEBUG "%s: queue awoken\n", __FUNCTION__);
+	}
+	return ret;
+}
+
+
+static int vlsi_act_interrupt(struct net_device *ndev)
+{
+	printk(KERN_DEBUG "%s\n", __FUNCTION__);
+	return 0;
+}
+
+
+static void vlsi_interrupt(int irq, void *dev_instance, struct pt_regs *regs)
+{
+	struct net_device *ndev = dev_instance;
+	vlsi_irda_dev_t *idev = ndev->priv;
+	int		iobase;
+	u8		irintr;
+	int 		boguscount = 20;
+	int		no_speed_check = 0;
+	unsigned	flags;
+
+
+	iobase = ndev->base_addr;
+	spin_lock_irqsave(&idev->lock,flags);
+	do {
+		irintr = inb(iobase+VLSI_PIO_IRINTR);
+		rmb();
+		outb(irintr, iobase+VLSI_PIO_IRINTR); /* acknowledge asap */
+		wmb();
+
+		if (!(irintr&=IRINTR_INT_MASK))		/* not our INT - probably shared */
+			break;
+
+//		vlsi_reg_debug(iobase,__FUNCTION__);
+
+		if (irintr&IRINTR_RPKTINT)
+			no_speed_check |= vlsi_rx_interrupt(ndev);
+
+		if (irintr&IRINTR_TPKTINT)
+			no_speed_check |= vlsi_tx_interrupt(ndev);
+
+		if ((irintr&IRINTR_ACTIVITY) && !(irintr^IRINTR_ACTIVITY) )
+			no_speed_check |= vlsi_act_interrupt(ndev);
+
+		if (irintr & ~(IRINTR_RPKTINT|IRINTR_TPKTINT|IRINTR_ACTIVITY))
+			printk(KERN_DEBUG "%s: IRINTR = %02x\n",
+				__FUNCTION__, (unsigned)irintr);
+			
+	} while (--boguscount > 0);
+	spin_unlock_irqrestore(&idev->lock,flags);
+
+	if (boguscount <= 0)
+		printk(KERN_ERR "%s: too much work in interrupt!\n", __FUNCTION__);
+
+	else if (!no_speed_check) {
+		if (idev->new_baud)
+			vlsi_set_baud(ndev);
+	}
+}
+
+
+/**************************************************************/
+
+static int vlsi_open(struct net_device *ndev)
+{
+	vlsi_irda_dev_t *idev = ndev->priv;
+	struct pci_dev *pdev = idev->pdev;
+	int	err;
+
+	MOD_INC_USE_COUNT;		/* still needed? - we have SET_MODULE_OWNER! */
+
+	if (pci_request_regions(pdev,drivername)) {
+		printk(KERN_ERR "%s: io resource busy\n", __FUNCTION__);
+		MOD_DEC_USE_COUNT;
+		return -EAGAIN;
+	}
+
+	if (request_irq(ndev->irq, vlsi_interrupt, SA_SHIRQ|SA_INTERRUPT,
+			drivername, ndev)) {
+		printk(KERN_ERR "%s: couldn't get IRQ: %d\n",
+			__FUNCTION__, ndev->irq);
+		pci_release_regions(pdev);
+		MOD_DEC_USE_COUNT;
+		return -EAGAIN;
+	}
+	printk(KERN_INFO "%s: got resources for %s - irq=%d / io=%04lx\n",
+		__FUNCTION__, ndev->name, ndev->irq, ndev->base_addr );
+
+	if (vlsi_set_clock(pdev)) {
+		printk(KERN_ERR "%s: no valid clock source\n",
+			__FUNCTION__);
+		free_irq(ndev->irq,ndev);
+		pci_release_regions(pdev);
+		MOD_DEC_USE_COUNT;
+		return -EIO;
+	}
+
+	vlsi_start_clock(pdev);
+
+	err = vlsi_init_ring(idev);
+	if (err) {
+		vlsi_unset_clock(pdev);
+		free_irq(ndev->irq,ndev);
+		pci_release_regions(pdev);
+		MOD_DEC_USE_COUNT;
+		return err;
+	}
+
+	vlsi_init_chip(ndev);
+
+	printk(KERN_INFO "%s: IrPHY setup: %d baud (%s), %s SIR-pulses\n",
+		__FUNCTION__, idev->baud, 
+		(idev->mode==IFF_SIR)?"SIR":((idev->mode==IFF_MIR)?"MIR":"FIR"),
+		(sirpulse)?"3/16 bittime":"short");
+
+	idev->irlap = irlap_open(ndev,&idev->qos);
+
+	netif_start_queue(ndev);
+
+	printk(KERN_INFO "%s: device %s operational using (%d,%d) tx,rx-ring\n",
+		__FUNCTION__, ndev->name, ringsize[0], ringsize[1]);
+
+	return 0;
+}
+
+
+static int vlsi_close(struct net_device *ndev)
+{
+	vlsi_irda_dev_t *idev = ndev->priv;
+	struct pci_dev *pdev = idev->pdev;
+	int	i;
+	u8	cmd;
+	unsigned iobase;
+
+
+	iobase = ndev->base_addr;
+	netif_stop_queue(ndev);
+
+	if (idev->irlap)
+		irlap_close(idev->irlap);
+	idev->irlap = NULL;
+
+	outb(IRINTR_INT_MASK, iobase+VLSI_PIO_IRINTR);	/* w/c pending + disable further IRQ */
+	wmb();
+	outw(0, iobase+VLSI_PIO_IRENABLE);
+	outw(0, iobase+VLSI_PIO_IRCFG);			/* disable everything */
+	wmb();
+	outw(IRENABLE_IREN, iobase+VLSI_PIO_IRENABLE);
+	mb();				/* from now on */
+
+	outw(0, iobase+VLSI_PIO_IRENABLE);
+	wmb();
+
+	vlsi_stop_clock(pdev);
+
+	vlsi_unset_clock(pdev);
+
+	free_irq(ndev->irq,ndev);
+
+	if (idev->ring_buf) {
+		for (i = 0; i < 2*MAX_RING_DESCR; i++) {
+			if (idev->ring_buf[i].head)
+				kfree(idev->ring_buf[i].head);
+		}
+		kfree(idev->ring_buf);
+	}
+
+	if (idev->busaddr)
+		pci_free_consistent(idev->pdev,RING_AREA_SIZE,idev->ring_hw,idev->busaddr);
+
+	idev->ring_buf = NULL;
+	idev->ring_hw = NULL;
+	idev->busaddr = 0;
+
+	pci_read_config_byte(pdev, PCI_COMMAND, &cmd);
+	cmd &= ~PCI_COMMAND_MASTER;
+	pci_write_config_byte(pdev, PCI_COMMAND, cmd);
+
+	pci_release_regions(pdev);
+
+	printk(KERN_INFO "%s: device %s stopped\n", __FUNCTION__, ndev->name);
+
+	MOD_DEC_USE_COUNT;
+	return 0;
+}
+
+static struct net_device_stats * vlsi_get_stats(struct net_device *ndev)
+{
+	vlsi_irda_dev_t *idev = ndev->priv;
+
+	return &idev->stats;
+}
+
+static int vlsi_hard_start_xmit(struct sk_buff *skb, struct net_device *ndev)
+{
+	vlsi_irda_dev_t *idev = ndev->priv;
+	unsigned long flags;
+	int iobase;
+	u8 status;
+	u16 config;
+	int mtt;
+	int entry;
+	int len, speed;
+
+
+	iobase = ndev->base_addr;
+
+	speed = irda_get_next_speed(skb);
+
+	if (speed != -1  &&  speed != idev->baud) {
+		idev->new_baud = speed;
+		if (!skb->len) {
+			dev_kfree_skb(skb);
+			vlsi_set_baud(ndev);
+			return 0;
+		}
+		status = TX_STAT_CLRENTX;  /* stop tx-ring after this frame */
+	}
+	else
+		status = 0;
+
+
+	spin_lock_irqsave(&idev->lock,flags);
+
+	entry = idev->tx_put;
+
+	if (idev->mode == IFF_SIR) {
+		status |= TX_STAT_DISCRC;
+		len = async_wrap_skb(skb, idev->ring_buf[entry].head,
+			XFER_BUF_SIZE);
+	}
+	else {				/* hw deals with MIR/FIR mode */
+		len = skb->len;
+		memcpy(idev->ring_buf[entry].head, skb->data, len);
+	}
+
+	if (len == 0)
+		printk(KERN_ERR "%s: sending 0-size packet???\n",
+			__FUNCTION__);
+
+	status |= RD_STAT_ACTIVE;
+
+	rd_set_count(idev->ring_hw+entry, len);
+	rd_set_status(idev->ring_hw+entry, status);
+	ring_ptr_inc(&idev->tx_put, idev->tx_mask);
+
+	dev_kfree_skb(skb);	
+
+#if 0
+	printk(KERN_DEBUG "%s: dump entry %d: %u %02x %08x\n",
+		__FUNCTION__, entry,
+		idev->ring_hw[entry].rd_count,
+		(unsigned)idev->ring_hw[entry].rd_status,
+		idev->ring_hw[entry].rd_addr & 0xffffffff);
+	vlsi_reg_debug(iobase,__FUNCTION__);
+#endif
+
+/*
+ *	race window due to concurrent controller processing!
+ *
+ *	we may loose ENTX at any time when the controller
+ *	fetches an inactive descr or one with CLR_ENTX set.
+ *	therefore we only rely on the controller telling us
+ *	tx is already stopped because (cannot restart without PROMPT).
+ *	instead we depend on the tx-complete-isr to detect the
+ *	false negatives and retrigger the tx ring.
+ *	that's why we need interrupts disabled till tx has been
+ *	kicked, so the tx-complete-isr was either already finished
+ *	before we've put the new active descriptor on the ring - or
+ *	the isr will be called after the new active descr is on the
+ *	ring _and_ the ring was prompted. Making these two steps
+ *	atomic allows to resolve the race.
+ */
+
+	iobase = ndev->base_addr;
+
+	if (!(inw(iobase+VLSI_PIO_IRENABLE) & IRENABLE_ENTXST)) {
+
+		mtt = irda_get_mtt(skb);
+		if (mtt) {
+			udelay(mtt);		/* ### FIXME ... */
+		}
+
+		outw(0, iobase+VLSI_PIO_IRENABLE);
+
+		config = inw(iobase+VLSI_PIO_IRCFG);
+		rmb();
+		outw(config | IRCFG_ENTX, iobase+VLSI_PIO_IRCFG);
+		wmb();
+		outw(IRENABLE_IREN, iobase+VLSI_PIO_IRENABLE);
+
+		mb();
+
+		outw(0, iobase+VLSI_PIO_PROMPT);
+		wmb();
+	}
+
+	spin_unlock_irqrestore(&idev->lock, flags);
+
+	if (idev->tx_put == idev->tx_get) {
+		netif_stop_queue(ndev);
+		printk(KERN_DEBUG "%s: tx ring full - queue stopped: %d/%d\n",
+			__FUNCTION__, idev->tx_put, idev->tx_get);
+		entry = idev->tx_get;
+		printk(KERN_INFO "%s: dump stalled entry %d: %u %02x %08x\n",
+			__FUNCTION__, entry,
+			idev->ring_hw[entry].rd_count,
+			(unsigned)idev->ring_hw[entry].rd_status,
+			idev->ring_hw[entry].rd_addr & 0xffffffff);
+		vlsi_reg_debug(iobase,__FUNCTION__);
+	}
+
+//	vlsi_reg_debug(iobase, __FUNCTION__);
+
+	return 0;
+}
+
+
+static int vlsi_ioctl(struct net_device *ndev, struct ifreq *rq, int cmd)
+{
+	vlsi_irda_dev_t *idev = ndev->priv;
+	struct if_irda_req *irq = (struct if_irda_req *) rq;
+	unsigned long flags;
+	u16 fifocnt;
+	int ret = 0;
+
+	spin_lock_irqsave(&idev->lock,flags);
+	switch (cmd) {
+		case SIOCSBANDWIDTH:
+			if (!capable(CAP_NET_ADMIN)) {
+				ret = -EPERM;
+				break;
+			}
+			idev->new_baud = irq->ifr_baudrate;
+			break;
+		case SIOCSMEDIABUSY:
+			if (!capable(CAP_NET_ADMIN)) {
+				ret = -EPERM;
+				break;
+			}
+			irda_device_set_media_busy(ndev, TRUE);
+			break;
+		case SIOCGRECEIVING:
+			fifocnt = inw(ndev->base_addr+VLSI_PIO_RCVBCNT) & RCVBCNT_MASK;
+			irq->ifr_receiving = (fifocnt!=0) ? 1 : 0;
+			break;
+		default:
+			printk(KERN_ERR "%s: notsupp - cmd=%04x\n",
+				__FUNCTION__, cmd);
+			ret = -EOPNOTSUPP;
+	}	
+	spin_unlock_irqrestore(&idev->lock,flags);
+	
+	return ret;
+}
+
+
+
+int vlsi_irda_init(struct net_device *ndev)
+{
+	vlsi_irda_dev_t *idev = ndev->priv;
+	struct pci_dev *pdev = idev->pdev;
+	u8	byte;
+
+
+	SET_MODULE_OWNER(ndev);
+
+	ndev->irq = pdev->irq;
+	ndev->base_addr = pci_resource_start(pdev,0);
+
+	/* PCI busmastering - see include file for details! */
+
+	if (pci_set_dma_mask(pdev,DMA_MASK_USED_BY_HW)) {
+		printk(KERN_ERR "%s: aborting due to PCI BM-DMA address limitations\n",
+			__FUNCTION__);
+		return -1;
+	}
+	pci_set_master(pdev);
+
+	pdev->dma_mask = DMA_MASK_MSTRPAGE;
+	pci_write_config_byte(pdev, VLSI_PCI_MSTRPAGE, MSTRPAGE_VALUE);
+
+	/* we don't use the legacy UART, disable its address decoding */
+
+	pci_read_config_byte(pdev, VLSI_PCI_IRMISC, &byte);
+	byte &= ~(IRMISC_UARTEN | IRMISC_UARTTST);
+	pci_write_config_byte(pdev, VLSI_PCI_IRMISC, byte);
+
+
+	irda_init_max_qos_capabilies(&idev->qos);
+
+	/* the VLSI82C147 does not support 576000! */
+
+	idev->qos.baud_rate.bits = IR_2400 | IR_9600
+		| IR_19200 | IR_38400 | IR_57600 | IR_115200
+		| IR_1152000 | (IR_4000000 << 8);
+
+	idev->qos.min_turn_time.bits = mtt_bits;
+
+	irda_qos_bits_to_value(&idev->qos);
+
+	irda_device_setup(ndev);
+
+	/* currently no media definitions for SIR/MIR/FIR */
+
+	ndev->flags |= IFF_PORTSEL | IFF_AUTOMEDIA;
+	ndev->if_port = IF_PORT_UNKNOWN;
+ 
+	ndev->open	      = vlsi_open;
+	ndev->stop	      = vlsi_close;
+	ndev->get_stats	      = vlsi_get_stats;
+	ndev->hard_start_xmit = vlsi_hard_start_xmit;
+	ndev->do_ioctl	      = vlsi_ioctl;
+
+	return 0;
+}	
+
+/**************************************************************/
+
+static int __devinit
+vlsi_irda_probe(struct pci_dev *pdev, const struct pci_device_id *id)
+{
+	struct net_device	*ndev;
+	vlsi_irda_dev_t		*idev;
+	int			alloc_size;
+
+	printk(KERN_INFO "%s: found IrDA PCI controler %s\n", drivername, pdev->name);
+
+	if (pci_enable_device(pdev))
+		goto out;
+
+	if ( !pci_resource_start(pdev,0)
+	     || !(pci_resource_flags(pdev,0) & IORESOURCE_IO) ) {
+		printk(KERN_ERR "%s: bar 0 invalid", __FUNCTION__);
+		goto out;
+	}
+
+	alloc_size = sizeof(*ndev) + sizeof(*idev);
+
+	ndev = (struct net_device *) kmalloc (alloc_size, GFP_KERNEL);
+	if (ndev==NULL) {
+		printk(KERN_ERR "%s: Unable to allocate device memory.\n",
+			__FUNCTION__);
+		goto out;
+	}
+
+	memset(ndev, 0, alloc_size);
+
+	idev = (vlsi_irda_dev_t *) (ndev + 1);
+	ndev->priv = (void *) idev;
+
+	spin_lock_init(&idev->lock);
+	idev->pdev = pdev;
+	ndev->init = vlsi_irda_init;
+	strcpy(ndev->name,"irda%d");
+	if (register_netdev(ndev)) {
+		printk(KERN_ERR "%s: register_netdev failed\n",
+			__FUNCTION__);
+		goto out_freedev;
+	}
+	printk(KERN_INFO "%s: registered device %s\n", drivername, ndev->name);
+
+	pdev->driver_data = ndev;
+
+	return 0;
+
+out_freedev:
+	kfree(ndev);
+out:
+	pdev->driver_data = NULL;
+	return -ENODEV;
+}
+
+static void __devexit vlsi_irda_remove(struct pci_dev *pdev)
+{
+	struct net_device *ndev = pdev->driver_data;
+
+	if (ndev) {
+		printk(KERN_INFO "%s: unregister device %s\n",
+			drivername, ndev->name);
+
+		unregister_netdev(ndev);
+		/* do not free - async completed by unregister_netdev()
+		 * ndev->destructor called (if present) when going to free
+		 */
+
+	}
+	else
+		printk(KERN_CRIT "%s: lost netdevice?\n", drivername);
+	pdev->driver_data = NULL;
+
+	pci_disable_device(pdev);
+	printk(KERN_INFO "%s: %s disabled\n", drivername, pdev->name);
+}
+
+static int vlsi_irda_suspend(struct pci_dev *pdev, u32 state)
+{
+	printk(KERN_ERR "%s - %s\n", __FUNCTION__, pdev->name);
+	return 0;
+}
+
+static int vlsi_irda_resume(struct pci_dev *pdev)
+{
+	printk(KERN_ERR "%s - %s\n", __FUNCTION__, pdev->name);
+	return 0;
+}
+
+/*********************************************************/
+
+static struct pci_driver vlsi_irda_driver = {
+	name:           drivername,
+	id_table:       vlsi_irda_table,
+	probe:          vlsi_irda_probe,
+	remove:         vlsi_irda_remove,
+	suspend:        vlsi_irda_suspend,
+	resume:         vlsi_irda_resume,
+};
+
+static int __init vlsi_mod_init(void)
+{
+	if (clksrc < 0  ||  clksrc > 3) {
+		printk(KERN_ERR "%s: invalid clksrc=%d\n", __FUNCTION__, clksrc);
+		return -1;
+	}
+	if ( ringsize[0]==0  ||  (ringsize[0] & ~(64|32|16|8|4))
+	     ||  ((ringsize[0]-1)&ringsize[0])) {
+		printk(KERN_INFO "%s: invalid tx ringsize %d - using default=16\n",
+			__FUNCTION__, ringsize[0]);
+		ringsize[0] = 16;
+	} 
+	if ( ringsize[1]==0  ||  (ringsize[1] & ~(64|32|16|8|4))
+	     ||  ((ringsize[1]-1)&ringsize[1])) {
+		printk(KERN_INFO "%s: invalid rx ringsize %d - using default=16\n",
+			__FUNCTION__, ringsize[1]);
+		ringsize[1] = 16;
+	}
+	sirpulse = !!sirpulse;
+	return pci_module_init(&vlsi_irda_driver);
+}
+
+static void __exit vlsi_mod_exit(void)
+{
+	pci_unregister_driver(&vlsi_irda_driver);
+}
+
+module_init(vlsi_mod_init);
+module_exit(vlsi_mod_exit);
+
diff -u --recursive --new-file v2.4.8/linux/drivers/net/lasi_82596.c linux/drivers/net/lasi_82596.c
--- v2.4.8/linux/drivers/net/lasi_82596.c	Wed Jul 25 17:10:21 2001
+++ linux/drivers/net/lasi_82596.c	Sun Aug 12 10:51:42 2001
@@ -96,7 +96,7 @@
 #include <asm/cache.h>
 
 static char version[] __initdata =
-	"82596.c $Revision: 1.14 $\n";
+	"82596.c $Revision: 1.20 $\n";
 
 /* DEBUG flags
  */
@@ -994,30 +994,35 @@
 
 static int i596_open(struct net_device *dev)
 {
-	int res = 0;
-
 	DEB(DEB_OPEN,printk("%s: i596_open() irq %d.\n", dev->name, dev->irq));
 
+	MOD_INC_USE_COUNT;
+
 	if (request_irq(dev->irq, &i596_interrupt, 0, "i82596", dev)) {
 		printk("%s: IRQ %d not free\n", dev->name, dev->irq);
-		return -EAGAIN;
+		goto out;
 	}
 
-	request_region(dev->base_addr, 12, dev->name);
-
 	init_rx_bufs(dev);
 
+	if (init_i596_mem(dev)) {
+		printk("%s: Failed to init memory\n", dev->name);
+		goto out_remove_rx_bufs;
+	}
+
+	request_mem_region(dev->base_addr, I596_TOTAL_SIZE, "i82596");
+
 	netif_start_queue(dev);
 
-	MOD_INC_USE_COUNT;
+	return 0;
 
-	/* Initialize the 82596 memory */
-	if (init_i596_mem(dev)) {
-		res = -EAGAIN;
-		free_irq(dev->irq, dev);
-	}
+out_remove_rx_bufs:
+	remove_rx_bufs(dev);
+	free_irq(dev->irq, dev);
+out:
+	MOD_DEC_USE_COUNT;
 
-	return res;
+	return -EAGAIN;
 }
 
 static void i596_tx_timeout (struct net_device *dev)
@@ -1162,7 +1167,7 @@
 	if (!dev->base_addr || !dev->irq)
 	    return -ENODEV;
 
-	if (!pdc_lan_station_id( (char*)&eth_addr, (void*)dev->base_addr)) {
+	if (pdc_lan_station_id( (char*)&eth_addr, (void*)dev->base_addr)) {
 	    for(i=0;i<6;i++)
 		eth_addr[i] = gsc_readb(LAN_PROM_ADDR+i);
 	    printk("82596.c: MAC of HP700 LAN blindely read from the prom!\n");
@@ -1176,9 +1181,6 @@
 		dev->mem_start = (int)__get_free_pages(GFP_ATOMIC, 0);
 		if (!dev->mem_start) {
 			printk("%s: Couldn't get shared memory\n", dev->name);
-#ifdef ENABLE_APRICOT
-			release_region(dev->base_addr, I596_TOTAL_SIZE);
-#endif
 			return -ENOMEM;
 		}
 		dma_addr = virt_to_bus(dev->mem_start);
@@ -1211,9 +1213,6 @@
 			sizeof(struct i596_private), (unsigned long)&lp->scb));
 	memset((void *) lp, 0, sizeof(struct i596_private));
 
-#if 0
-	kernel_set_cachemode((void *)(dev->mem_start), 4096, IOMAP_NOCACHE_SER);
-#endif
 	lp->options = options;
 	lp->scb.command = 0;
 	lp->scb.cmd = I596_NULL;
@@ -1422,7 +1421,7 @@
 	free_irq(dev->irq, dev);
 	remove_rx_bufs(dev);
 
-	release_region(dev->base_addr, 12);
+	release_mem_region(dev->base_addr, I596_TOTAL_SIZE);
 
 	MOD_DEC_USE_COUNT;
 
@@ -1548,4 +1547,3 @@
 }
 
 #endif				/* MODULE */
-
diff -u --recursive --new-file v2.4.8/linux/drivers/net/smc-mca.c linux/drivers/net/smc-mca.c
--- v2.4.8/linux/drivers/net/smc-mca.c	Tue Jul  3 17:08:20 2001
+++ linux/drivers/net/smc-mca.c	Sun Aug 12 10:51:42 2001
@@ -91,7 +91,7 @@
 	char *name;
 };
 
-static const struct smc_mca_adapters_t smc_mca_adapters[] = {
+static struct smc_mca_adapters_t smc_mca_adapters[] __initdata = {
     { 0x61c8, "SMC Ethercard PLUS Elite/A BNC/AUI (WD8013EP/A)" },
     { 0x61c9, "SMC Ethercard PLUS Elite/A UTP/AUI (WD8013WP/A)" },
     { 0x6fc0, "WD Ethercard PLUS/A (WD8003E/A or WD8003ET/A)" },
diff -u --recursive --new-file v2.4.8/linux/drivers/net/tun.c linux/drivers/net/tun.c
--- v2.4.8/linux/drivers/net/tun.c	Sun Aug 12 13:27:59 2001
+++ linux/drivers/net/tun.c	Sun Aug 12 10:38:48 2001
@@ -29,7 +29,7 @@
 #include <linux/kernel.h>
 #include <linux/major.h>
 #include <linux/sched.h>
-#include <linux/malloc.h>
+#include <linux/slab.h>
 #include <linux/poll.h>
 #include <linux/fcntl.h>
 #include <linux/init.h>
@@ -327,11 +327,6 @@
 	return ret;
 }
 
-static loff_t tun_chr_lseek(struct file * file, loff_t offset, int origin)
-{
-	return -ESPIPE;
-}
-
 static int tun_set_iff(struct file *file, struct ifreq *ifr)
 {
 	struct tun_struct *tun;
@@ -549,7 +544,7 @@
 
 static struct file_operations tun_fops = {
 	owner:	THIS_MODULE,	
-	llseek:	tun_chr_lseek,
+	llseek:	no_llseek,
 	read:	tun_chr_read,
 	write:	tun_chr_write,
 	poll:	tun_chr_poll,
diff -u --recursive --new-file v2.4.8/linux/drivers/net/wan/Config.in linux/drivers/net/wan/Config.in
--- v2.4.8/linux/drivers/net/wan/Config.in	Wed Jul 25 17:10:22 2001
+++ linux/drivers/net/wan/Config.in	Sun Aug 12 10:38:48 2001
@@ -39,6 +39,10 @@
 
    dep_tristate '  Etinc PCISYNC serial board support (EXPERIMENTAL)' CONFIG_DSCC4 m
 
+# FarSite Communications' cards
+
+   tristate '  FarSync T-Series X.21 (and V.35/V.24) cards' CONFIG_FARSYNC
+
 #
 # Lan Media's board. Currently 1000, 1200, 5200, 5245
 #
@@ -101,7 +105,10 @@
    fi
 
    if [ "$CONFIG_X86" = "y" ]; then
-      tristate '  SBNI12-xx support' CONFIG_SBNI
+      tristate '  Granch SBNI12 Leased Line adapter support' CONFIG_SBNI
+      if [ "$CONFIG_SBNI" != "n" ]; then
+         bool '    Multiple line feature support' CONFIG_SBNI_MULTILINE
+      fi
    fi
 fi
 
diff -u --recursive --new-file v2.4.8/linux/drivers/net/wan/Makefile linux/drivers/net/wan/Makefile
--- v2.4.8/linux/drivers/net/wan/Makefile	Thu Apr 12 12:11:39 2001
+++ linux/drivers/net/wan/Makefile	Sun Aug 12 10:38:48 2001
@@ -33,6 +33,7 @@
 obj-$(CONFIG_COMX_PROTO_LAPB)	+=				comx-proto-lapb.o
 obj-$(CONFIG_COMX_PROTO_FR)	+=				comx-proto-fr.o
 obj-$(CONFIG_COSA)		+=		syncppp.o	cosa.o
+obj-$(CONFIG_FARSYNC)		+=		syncppp.o	farsync.o
 obj-$(CONFIG_DSCC4)             +=				dscc4.o
 obj-$(CONFIG_LANMEDIA)		+=		syncppp.o
 obj-$(CONFIG_SYNCLINK_SYNCPPP)	+=		syncppp.o
diff -u --recursive --new-file v2.4.8/linux/drivers/net/wan/cosa.c linux/drivers/net/wan/cosa.c
--- v2.4.8/linux/drivers/net/wan/cosa.c	Tue Jul  3 17:08:20 2001
+++ linux/drivers/net/wan/cosa.c	Sun Aug 12 10:38:48 2001
@@ -303,7 +303,6 @@
 static char *chrdev_setup_rx(struct channel_data *channel, int size);
 static int chrdev_rx_done(struct channel_data *channel);
 static int chrdev_tx_done(struct channel_data *channel, int size);
-static loff_t cosa_lseek(struct file *file, loff_t offset, int origin);
 static ssize_t cosa_read(struct file *file,
 	char *buf, size_t count, loff_t *ppos);
 static ssize_t cosa_write(struct file *file,
@@ -319,7 +318,7 @@
 
 static struct file_operations cosa_fops = {
 	owner:		THIS_MODULE,
-	llseek:		cosa_lseek,
+	llseek:		no_llseek,
 	read:		cosa_read,
 	write:		cosa_write,
 	poll:		cosa_poll,
@@ -780,11 +779,6 @@
 {
 	init_MUTEX(&chan->rsem);
 	init_MUTEX(&chan->wsem);
-}
-
-static loff_t cosa_lseek(struct file * file, loff_t offset, int origin)
-{
-	return -ESPIPE;
 }
 
 static ssize_t cosa_read(struct file *file,
diff -u --recursive --new-file v2.4.8/linux/drivers/net/wan/farsync.c linux/drivers/net/wan/farsync.c
--- v2.4.8/linux/drivers/net/wan/farsync.c	Wed Dec 31 16:00:00 1969
+++ linux/drivers/net/wan/farsync.c	Sun Aug 12 10:38:48 2001
@@ -0,0 +1,1831 @@
+/*
+ *      FarSync X21 driver for Linux (2.4.x kernel version)
+ *
+ *      Actually sync driver for X.21, V.35 and V.24 on FarSync T-series cards
+ *
+ *      Copyright (C) 2001 FarSite Communications Ltd.
+ *      www.farsite.co.uk
+ *
+ *      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.
+ *
+ *      Author: R.J.Dunlop      <bob.dunlop@farsite.co.uk>
+ */
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/pci.h>
+#include <linux/ioport.h>
+#include <linux/netdevice.h>
+#include <linux/init.h>
+#include <linux/if_arp.h>
+#include <asm/uaccess.h>
+#include <net/syncppp.h>
+
+#include "farsync.h"
+
+
+/*
+ *      Module info
+ */
+MODULE_AUTHOR("R.J.Dunlop <bob.dunlop@farsite.co.uk>");
+MODULE_DESCRIPTION("FarSync T-Series X21 driver. FarSite Communications Ltd.");
+
+EXPORT_NO_SYMBOLS;
+
+
+/*      Driver configuration and global parameters
+ *      ==========================================
+ */
+
+/*      Number of ports (per card) supported
+ */
+#define FST_MAX_PORTS           4
+
+
+/*      PCI vendor and device IDs
+ */
+#define FSC_PCI_VENDOR_ID       0x1619  /* FarSite Communications Ltd */
+#define T2P_PCI_DEVICE_ID       0x0400  /* T2P X21 2 port card */
+#define T4P_PCI_DEVICE_ID       0x0440  /* T4P X21 4 port card */
+
+
+/*      Default parameters for the link
+ */
+#define FST_TX_QUEUE_LEN        100     /* At 8Mbps a longer queue length is
+                                         * useful, the syncppp module forces
+                                         * this down assuming a slower line I
+                                         * guess.
+                                         */
+#define FST_MAX_MTU             8000    /* Huge but possible */
+#define FST_DEF_MTU             1500    /* Common sane value */
+
+#define FST_TX_TIMEOUT          (2*HZ)
+
+
+#ifdef ARPHRD_RAWHDLC
+#define ARPHRD_MYTYPE   ARPHRD_RAWHDLC  /* Raw frames */
+#else
+#define ARPHRD_MYTYPE   ARPHRD_HDLC     /* Cisco-HDLC (keepalives etc) */
+#endif
+
+
+/*      Card shared memory layout
+ *      =========================
+ */
+#pragma pack(1)
+
+/*      This information is derived in part from the FarSite FarSync Smc.h
+ *      file. Unfortunately various name clashes and the non-portability of the
+ *      bit field declarations in that file have meant that I have chosen to
+ *      recreate the information here.
+ *
+ *      The SMC (Shared Memory Configuration) has a version number that is
+ *      incremented every time there is a significant change. This number can
+ *      be used to check that we have not got out of step with the firmware
+ *      contained in the .CDE files.
+ */
+#define SMC_VERSION 11
+
+#define FST_MEMSIZE 0x100000    /* Size of card memory (1Mb) */
+
+#define SMC_BASE 0x00002000L    /* Base offset of the shared memory window main
+                                 * configuration structure */
+#define BFM_BASE 0x00010000L    /* Base offset of the shared memory window DMA
+                                 * buffers */
+
+#define LEN_TX_BUFFER 8192      /* Size of packet buffers */
+#define LEN_RX_BUFFER 8192
+
+#define LEN_SMALL_TX_BUFFER 256 /* Size of obsolete buffs used for DOS diags */
+#define LEN_SMALL_RX_BUFFER 256
+
+#define NUM_TX_BUFFER 2         /* Must be power of 2. Fixed by firmware */
+#define NUM_RX_BUFFER 8
+
+/* Interrupt retry time in milliseconds */
+#define INT_RETRY_TIME 2
+
+
+/*      The Am186CH/CC processors support a SmartDMA mode using circular pools
+ *      of buffer descriptors. The structure is almost identical to that used
+ *      in the LANCE Ethernet controllers. Details available as PDF from the
+ *      AMD web site: http://www.amd.com/products/epd/processors/\
+ *                    2.16bitcont/3.am186cxfa/a21914/21914.pdf
+ */
+struct txdesc {                 /* Transmit descriptor */
+        volatile u16 ladr;      /* Low order address of packet. This is a
+                                 * linear address in the Am186 memory space
+                                 */
+        volatile u8  hadr;      /* High order address. Low 4 bits only, high 4
+                                 * bits must be zero
+                                 */
+        volatile u8  bits;      /* Status and config */
+        volatile u16 bcnt;      /* 2s complement of packet size in low 15 bits.
+                                 * Transmit terminal count interrupt enable in
+                                 * top bit.
+                                 */
+                 u16 unused;    /* Not used in Tx */
+};
+
+struct rxdesc {                 /* Receive descriptor */
+        volatile u16 ladr;      /* Low order address of packet */
+        volatile u8  hadr;      /* High order address */
+        volatile u8  bits;      /* Status and config */
+        volatile u16 bcnt;      /* 2s complement of buffer size in low 15 bits.
+                                 * Receive terminal count interrupt enable in
+                                 * top bit.
+                                 */
+        volatile u16 mcnt;      /* Message byte count (15 bits) */
+};
+
+/* Convert a length into the 15 bit 2's complement */
+/* #define cnv_bcnt(len)   (( ~(len) + 1 ) & 0x7FFF ) */
+/* Since we need to set the high bit to enable the completion interrupt this
+ * can be made a lot simpler
+ */
+#define cnv_bcnt(len)   (-(len))
+
+/* Status and config bits for the above */
+#define DMA_OWN         0x80            /* SmartDMA owns the descriptor */
+#define TX_STP          0x02            /* Tx: start of packet */
+#define TX_ENP          0x01            /* Tx: end of packet */
+#define RX_ERR          0x40            /* Rx: error (OR of next 4 bits) */
+#define RX_FRAM         0x20            /* Rx: framing error */
+#define RX_OFLO         0x10            /* Rx: overflow error */
+#define RX_CRC          0x08            /* Rx: CRC error */
+#define RX_HBUF         0x04            /* Rx: buffer error */
+#define RX_STP          0x02            /* Rx: start of packet */
+#define RX_ENP          0x01            /* Rx: end of packet */
+
+
+/* Interrupts from the card are caused by various events and these are presented
+ * in a circular buffer as several events may be processed on one physical int
+ */
+#define MAX_CIRBUFF     32
+
+struct cirbuff {
+        u8 rdindex;             /* read, then increment and wrap */
+        u8 wrindex;             /* write, then increment and wrap */
+        u8 evntbuff[MAX_CIRBUFF];
+};
+
+/* Interrupt event codes.
+ * Where appropriate the two low order bits indicate the port number
+ */
+#define CTLA_CHG        0x18    /* Control signal changed */
+#define CTLB_CHG        0x19
+#define CTLC_CHG        0x1A
+#define CTLD_CHG        0x1B
+
+#define INIT_CPLT       0x20    /* Initialisation complete */
+#define INIT_FAIL       0x21    /* Initialisation failed */
+
+#define ABTA_SENT       0x24    /* Abort sent */
+#define ABTB_SENT       0x25
+#define ABTC_SENT       0x26
+#define ABTD_SENT       0x27
+
+#define TXA_UNDF        0x28    /* Transmission underflow */
+#define TXB_UNDF        0x29
+#define TXC_UNDF        0x2A
+#define TXD_UNDF        0x2B
+
+
+/* Port physical configuration. See farsync.h for field values */
+struct port_cfg {
+        u16  lineInterface;     /* Physical interface type */
+        u8   x25op;             /* Unused at present */
+        u8   internalClock;     /* 1 => internal clock, 0 => external */
+        u32  lineSpeed;         /* Speed in bps */
+};
+
+/* Finally sling all the above together into the shared memory structure.
+ * Sorry it's a hodge podge of arrays, structures and unused bits, it's been
+ * evolving under NT for some time so I guess we're stuck with it.
+ * The structure starts at offset SMC_BASE.
+ * See farsync.h for some field values.
+ */
+struct fst_shared {
+                                /* DMA descriptor rings */
+        struct rxdesc rxDescrRing[FST_MAX_PORTS][NUM_RX_BUFFER];
+        struct txdesc txDescrRing[FST_MAX_PORTS][NUM_TX_BUFFER];
+
+                                /* Obsolete small buffers */
+        u8  smallRxBuffer[FST_MAX_PORTS][NUM_RX_BUFFER][LEN_SMALL_RX_BUFFER];
+        u8  smallTxBuffer[FST_MAX_PORTS][NUM_TX_BUFFER][LEN_SMALL_TX_BUFFER];
+
+        u8  taskStatus;         /* 0x00 => initialising, 0x01 => running,
+                                 * 0xFF => halted
+                                 */
+
+        u8  interruptHandshake; /* Set to 0x01 by adapter to signal interrupt,
+                                 * set to 0xEE by host to acknowledge interrupt
+                                 */
+
+        u16 smcVersion;         /* Must match SMC_VERSION */
+
+        u32 smcFirmwareVersion; /* 0xIIVVRRBB where II = product ID, VV = major
+                                 * version, RR = revision and BB = build
+                                 */
+
+        u16 txa_done;           /* Obsolete completion flags */
+        u16 rxa_done;
+        u16 txb_done;
+        u16 rxb_done;
+        u16 txc_done;
+        u16 rxc_done;
+        u16 txd_done;
+        u16 rxd_done;
+
+        u16 mailbox[4];         /* Diagnostics mailbox. Not used */
+
+        struct cirbuff interruptEvent;  /* interrupt causes */
+
+        u32 v24IpSts[FST_MAX_PORTS];    /* V.24 control input status */
+        u32 v24OpSts[FST_MAX_PORTS];    /* V.24 control output status */
+
+        struct port_cfg portConfig[FST_MAX_PORTS];
+
+        u16 clockStatus[FST_MAX_PORTS]; /* lsb: 0=> present, 1=> absent */
+
+        u16 cableStatus;                /* lsb: 0=> present, 1=> absent */
+
+        u16 txDescrIndex[FST_MAX_PORTS]; /* transmit descriptor ring index */
+        u16 rxDescrIndex[FST_MAX_PORTS]; /* receive descriptor ring index */
+
+        u16 portMailbox[FST_MAX_PORTS][2];      /* command, modifier */
+        u16 cardMailbox[4];                     /* Not used */
+
+                                /* Number of times that card thinks the host has
+                                 * missed an interrupt by not acknowledging
+                                 * within 2mS (I guess NT has problems)
+                                 */
+        u32 interruptRetryCount;
+
+                                /* Driver private data used as an ID. We'll not
+                                 * use this on Linux I'd rather keep such things
+                                 * in main memory rather than on the PCI bus
+                                 */
+        u32 portHandle[FST_MAX_PORTS];
+
+                                /* Count of Tx underflows for stats */
+        u32 transmitBufferUnderflow[FST_MAX_PORTS];
+
+                                /* Debounced V.24 control input status */
+        u32 v24DebouncedSts[FST_MAX_PORTS];
+
+                                /* Adapter debounce timers. Don't touch */
+        u32 ctsTimer[FST_MAX_PORTS];
+        u32 ctsTimerRun[FST_MAX_PORTS];
+        u32 dcdTimer[FST_MAX_PORTS];
+        u32 dcdTimerRun[FST_MAX_PORTS];
+
+        u32 numberOfPorts;      /* Number of ports detected at startup */
+
+        u16 _reserved[64];
+
+        u16 cardMode;           /* Bit-mask to enable features:
+                                 * Bit 0: 1 enables LED identify mode
+                                 */
+
+        u16 portScheduleOffset;
+
+        u32 endOfSmcSignature;  /* endOfSmcSignature MUST be the last member of
+                                 * the structure and marks the end of the shared
+                                 * memory. Adapter code initializes its value as
+                                 * END_SIG.
+                                 */
+};
+
+/* endOfSmcSignature value */
+#define END_SIG                 0x12345678
+
+/* Mailbox values. (portMailbox) */
+#define NOP             0       /* No operation */
+#define ACK             1       /* Positive acknowledgement to PC driver */
+#define NAK             2       /* Negative acknowledgement to PC driver */
+#define STARTPORT       3       /* Start an HDLC port */
+#define STOPPORT        4       /* Stop an HDLC port */
+#define ABORTTX         5       /* Abort the transmitter for a port */
+#define SETV24O         6       /* Set V24 outputs */
+
+
+/* Larger buffers are positioned in memory at offset BFM_BASE */
+struct buf_window {
+        u8 txBuffer[FST_MAX_PORTS][NUM_TX_BUFFER][LEN_TX_BUFFER];
+        u8 rxBuffer[FST_MAX_PORTS][NUM_RX_BUFFER][LEN_RX_BUFFER];
+};
+
+/* Calculate offset of a buffer object within the shared memory window */
+#define BUF_OFFSET(X)   ((unsigned int)&(((struct buf_window *)BFM_BASE)->X))
+
+#pragma pack()
+
+
+/*      Device driver private information
+ *      =================================
+ */
+/*      Per port (line or channel) information
+ */
+struct fst_port_info {
+        void                   *if_ptr; /* Some drivers describe this as a
+                                         * general purpose pointer. However if
+                                         * using syncPPP it has a very specific
+                                         * purpose: it must be the first item in
+                                         * the structure pointed to by dev->priv
+                                         * and must in turn point to the
+                                         * associated ppp_device structure.
+                                         */
+        struct fst_card_info   *card;   /* Card we're associated with */
+        int                     index;  /* Port index on the card */
+        int                     proto;  /* Protocol we are running */
+        int                     hwif;   /* Line hardware (lineInterface copy) */
+        int                     run;    /* Port is running */
+        int                     rxpos;  /* Next Rx buffer to use */
+        int                     txpos;  /* Next Tx buffer to use */
+        int                     txipos; /* Next Tx buffer to check for free */
+        int                     txcnt;  /* Count of Tx buffers in use */
+        struct net_device      *dev;    /* Kernel network device entry */
+        struct net_device_stats stats;  /* Standard statistics */
+        struct ppp_device       pppdev; /* Link to syncPPP */
+};
+
+/*      Per card information
+ */
+struct fst_card_info {
+        char          *mem;             /* Card memory mapped to kernel space */
+        char          *ctlmem;          /* Control memory for PCI cards */
+        unsigned int   phys_mem;        /* Physical memory window address */
+        unsigned int   phys_ctlmem;     /* Physical control memory address */
+        unsigned int   irq;             /* Interrupt request line number */
+        unsigned int   nports;          /* Number of serial ports */
+        unsigned int   type;            /* Type index of card */
+        unsigned int   state;           /* State of card */
+        spinlock_t     card_lock;       /* Lock for SMP access */
+        unsigned short pci_conf;        /* PCI card config in I/O space */
+                                        /* Per port info */
+        struct fst_port_info ports[ FST_MAX_PORTS ];
+};
+
+
+/*
+ *      Shared memory window access macros
+ *
+ *      We have a nice memory based structure above, which could be directly
+ *      mapped on i386 but might not work on other architectures unless we use
+ *      the readb,w,l and writeb,w,l macros. Unfortunately these macros take
+ *      physical offsets so we have to convert. The only saving grace is that
+ *      this should all collapse back to a simple indirection eventually.
+ */
+#define WIN_OFFSET(X)   ((long)&(((struct fst_shared *)SMC_BASE)->X))
+
+#define FST_RDB(C,E)    readb ((C)->mem + WIN_OFFSET(E))
+#define FST_RDW(C,E)    readw ((C)->mem + WIN_OFFSET(E))
+#define FST_RDL(C,E)    readl ((C)->mem + WIN_OFFSET(E))
+
+#define FST_WRB(C,E,B)  writeb ((B), (C)->mem + WIN_OFFSET(E))
+#define FST_WRW(C,E,W)  writew ((W), (C)->mem + WIN_OFFSET(E))
+#define FST_WRL(C,E,L)  writel ((L), (C)->mem + WIN_OFFSET(E))
+
+
+/*
+ *      Debug support
+ */
+#if FST_DEBUG
+
+static int fst_debug_mask = { FST_DEBUG };
+
+/* Most common debug activity is to print something if the corresponding bit
+ * is set in the debug mask. Note: this uses a non-ANSI extension in GCC to
+ * support variable numbers of macro parameters. The inverted if prevents us
+ * eating someone else's else clause.
+ */
+#define dbg(F,fmt,A...) if ( ! ( fst_debug_mask & (F))) \
+                                ; \
+                        else \
+                                printk ( KERN_DEBUG FST_NAME ": " fmt, ## A )
+
+#else
+# define dbg(X...)      /* NOP */
+#endif
+
+
+/*      Printing short cuts
+ */
+#define printk_err(fmt,A...)    printk ( KERN_ERR     FST_NAME ": " fmt, ## A )
+#define printk_warn(fmt,A...)   printk ( KERN_WARNING FST_NAME ": " fmt, ## A )
+#define printk_info(fmt,A...)   printk ( KERN_INFO    FST_NAME ": " fmt, ## A )
+
+
+/*
+ *      PCI ID lookup table
+ */
+static struct pci_device_id fst_pci_dev_id[] __devinitdata = {
+        { FSC_PCI_VENDOR_ID, T2P_PCI_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+                                        FST_TYPE_T2P },
+        { FSC_PCI_VENDOR_ID, T4P_PCI_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+                                        FST_TYPE_T4P },
+        { 0, }                          /* End */
+};
+
+MODULE_DEVICE_TABLE ( pci, fst_pci_dev_id );
+
+
+/*      Card control functions
+ *      ======================
+ */
+/*      Place the processor in reset state
+ *
+ * Used to be a simple write to card control space but a glitch in the latest
+ * AMD Am186CH processor means that we now have to do it by asserting and de-
+ * asserting the PLX chip PCI Adapter Software Reset. Bit 30 in CNTRL register
+ * at offset 0x50.
+ */
+static inline void
+fst_cpureset ( struct fst_card_info *card )
+{
+        unsigned int regval;
+
+        regval = inl ( card->pci_conf + 0x50 );
+
+        outl ( regval |  0x40000000, card->pci_conf + 0x50 );
+        outl ( regval & ~0x40000000, card->pci_conf + 0x50 );
+}
+
+/*      Release the processor from reset
+ */
+static inline void
+fst_cpurelease ( struct fst_card_info *card )
+{
+        (void) readb ( card->ctlmem );
+}
+
+/*      Clear the cards interrupt flag
+ */
+static inline void
+fst_clear_intr ( struct fst_card_info *card )
+{
+        /* Poke the appropriate PLX chip register (same as enabling interrupts)
+         */
+        outw ( 0x0543, card->pci_conf + 0x4C );
+}
+
+/*      Disable card interrupts
+ */
+static inline void
+fst_disable_intr ( struct fst_card_info *card )
+{
+        outw ( 0x0000, card->pci_conf + 0x4C );
+}
+
+
+/*      Issue a Mailbox command for a port.
+ *      Note we issue them on a fire and forget basis, not expecting to see an
+ *      error and not waiting for completion.
+ */
+static void
+fst_issue_cmd ( struct fst_port_info *port, unsigned short cmd )
+{
+        struct fst_card_info *card;
+        unsigned short mbval;
+        unsigned long flags;
+        int safety;
+
+        card = port->card;
+        spin_lock_irqsave ( &card->card_lock, flags );
+        mbval = FST_RDW ( card, portMailbox[port->index][0]);
+
+        safety = 0;
+        /* Wait for any previous command to complete */
+        while ( mbval > NAK )
+        {
+                spin_unlock_irqrestore ( &card->card_lock, flags );
+                schedule_timeout ( 1 );
+                spin_lock_irqsave ( &card->card_lock, flags );
+
+                if ( ++safety > 1000 )
+                {
+                        printk_err ("Mailbox safety timeout\n");
+                        break;
+                }
+
+                mbval = FST_RDW ( card, portMailbox[port->index][0]);
+        }
+        if ( safety > 0 )
+        {
+                dbg ( DBG_CMD,"Mailbox clear after %d jiffies\n", safety );
+        }
+        if ( mbval == NAK )
+        {
+                dbg ( DBG_CMD,"issue_cmd: previous command was NAK'd\n");
+        }
+
+        FST_WRW ( card, portMailbox[port->index][0], cmd );
+
+        if ( cmd == ABORTTX || cmd == STARTPORT )
+        {
+                port->txpos  = 0;
+                port->txipos = 0;
+                port->txcnt  = 0;
+        }
+
+        spin_unlock_irqrestore ( &card->card_lock, flags );
+}
+
+
+/*      Port output signals control
+ */
+static inline void
+fst_op_raise ( struct fst_port_info *port, unsigned int outputs )
+{
+        outputs |= FST_RDL ( port->card, v24OpSts[port->index]);
+        FST_WRL ( port->card, v24OpSts[port->index], outputs );
+
+        if ( port->run )
+                fst_issue_cmd ( port, SETV24O );
+}
+
+static inline void
+fst_op_lower ( struct fst_port_info *port, unsigned int outputs )
+{
+        outputs = ~outputs & FST_RDL ( port->card, v24OpSts[port->index]);
+        FST_WRL ( port->card, v24OpSts[port->index], outputs );
+
+        if ( port->run )
+                fst_issue_cmd ( port, SETV24O );
+}
+
+
+/*
+ *      Setup port Rx buffers
+ */
+static void
+fst_rx_config ( struct fst_port_info *port )
+{
+        int i;
+        int pi;
+        unsigned int offset;
+        unsigned long flags;
+        struct fst_card_info *card;
+
+        pi   = port->index;
+        card = port->card;
+        spin_lock_irqsave ( &card->card_lock, flags );
+        for ( i = 0 ; i < NUM_RX_BUFFER ; i++ )
+        {
+                offset = BUF_OFFSET ( rxBuffer[pi][i][0]);
+
+                FST_WRW ( card, rxDescrRing[pi][i].ladr, (u16) offset );
+                FST_WRB ( card, rxDescrRing[pi][i].hadr, (u8)( offset >> 16 ));
+                FST_WRW ( card, rxDescrRing[pi][i].bcnt,
+                                        cnv_bcnt ( LEN_RX_BUFFER ));
+                FST_WRW ( card, rxDescrRing[pi][i].mcnt, 0 );
+                FST_WRB ( card, rxDescrRing[pi][i].bits, DMA_OWN );
+        }
+        port->rxpos  = 0;
+        spin_unlock_irqrestore ( &card->card_lock, flags );
+}
+
+
+/*
+ *      Setup port Tx buffers
+ */
+static void
+fst_tx_config ( struct fst_port_info *port )
+{
+        int i;
+        int pi;
+        unsigned int offset;
+        unsigned long flags;
+        struct fst_card_info *card;
+
+        pi   = port->index;
+        card = port->card;
+        spin_lock_irqsave ( &card->card_lock, flags );
+        for ( i = 0 ; i < NUM_TX_BUFFER ; i++ )
+        {
+                offset = BUF_OFFSET ( txBuffer[pi][i][0]);
+
+                FST_WRW ( card, txDescrRing[pi][i].ladr, (u16) offset );
+                FST_WRB ( card, txDescrRing[pi][i].hadr, (u8)( offset >> 16 ));
+                FST_WRW ( card, txDescrRing[pi][i].bcnt, 0 );
+                FST_WRB ( card, txDescrRing[pi][i].bits, 0 );
+        }
+        port->txpos  = 0;
+        port->txipos = 0;
+        port->txcnt  = 0;
+        spin_unlock_irqrestore ( &card->card_lock, flags );
+}
+
+
+/*      Control signal change interrupt event
+ */
+static void
+fst_intr_ctlchg ( struct fst_card_info *card, struct fst_port_info *port )
+{
+        int signals;
+
+        signals = FST_RDL ( card, v24DebouncedSts[port->index]);
+
+        if ( signals & (( port->hwif == X21 ) ? IPSTS_INDICATE : IPSTS_DCD ))
+        {
+                if ( ! netif_carrier_ok ( port->dev ))
+                {
+                        dbg ( DBG_INTR,"DCD active\n");
+
+                        /* Poke sPPP to renegotiate */
+                        if ( port->proto == FST_HDLC || port->proto == FST_PPP )
+                        {
+                                sppp_reopen ( port->dev );
+                        }
+
+                        netif_carrier_on ( port->dev );
+                }
+        }
+        else
+        {
+                if ( netif_carrier_ok ( port->dev ))
+                {
+                        dbg ( DBG_INTR,"DCD lost\n");
+                        netif_carrier_off ( port->dev );
+                }
+        }
+}
+
+
+/*      Rx complete interrupt
+ */
+static void
+fst_intr_rx ( struct fst_card_info *card, struct fst_port_info *port )
+{
+        unsigned char dmabits;
+        int pi;
+        int rxp;
+        unsigned short len;
+        struct sk_buff *skb;
+        int i;
+
+
+        /* Check we have a buffer to process */
+        pi  = port->index;
+        rxp = port->rxpos;
+        dmabits = FST_RDB ( card, rxDescrRing[pi][rxp].bits );
+        if ( dmabits & DMA_OWN )
+        {
+                dbg ( DBG_RX | DBG_INTR,"intr_rx: No buffer port %d pos %d\n",
+                                        pi, rxp );
+                return;
+        }
+
+        /* Get buffer length */
+        len = FST_RDW ( card, rxDescrRing[pi][rxp].mcnt );
+        /* Discard the CRC */
+        len -= 2;
+
+        /* Check buffer length and for other errors. We insist on one packet
+         * in one buffer. This simplifies things greatly and since we've
+         * allocated 8K it shouldn't be a real world limitation
+         */
+        dbg ( DBG_RX,"intr_rx: %d,%d: flags %x len %d\n", pi, rxp, dmabits,
+                                        len );
+        if ( dmabits != ( RX_STP | RX_ENP ) || len > LEN_RX_BUFFER - 2 )
+        {
+                port->stats.rx_errors++;
+
+                /* Update error stats and discard buffer */
+                if ( dmabits & RX_OFLO )
+                {
+                        port->stats.rx_fifo_errors++;
+                }
+                if ( dmabits & RX_CRC )
+                {
+                        port->stats.rx_crc_errors++;
+                }
+                if ( dmabits & RX_FRAM )
+                {
+                        port->stats.rx_frame_errors++;
+                }
+                if ( dmabits == ( RX_STP | RX_ENP ))
+                {
+                        port->stats.rx_length_errors++;
+                }
+
+                /* Discard buffer descriptors until we see the end of packet
+                 * marker
+                 */
+                i = 0;
+                while (( dmabits & ( DMA_OWN | RX_ENP )) == 0 )
+                {
+                        FST_WRB ( card, rxDescrRing[pi][rxp].bits, DMA_OWN );
+                        if ( ++rxp >= NUM_RX_BUFFER )
+                                rxp = 0;
+                        if ( ++i > NUM_RX_BUFFER )
+                        {
+                                dbg ( DBG_ASS,"intr_rx: Discarding more bufs"
+                                                " than we have\n");
+                                break;
+                        }
+                        dmabits = FST_RDB ( card, rxDescrRing[pi][rxp].bits );
+                }
+
+                /* Discard the terminal buffer */
+                if ( ! ( dmabits & DMA_OWN ))
+                {
+                        FST_WRB ( card, rxDescrRing[pi][rxp].bits, DMA_OWN );
+                        if ( ++rxp >= NUM_RX_BUFFER )
+                                rxp = 0;
+                }
+                port->rxpos = rxp;
+                return;
+        }
+
+        /* Allocate SKB */
+        if (( skb = dev_alloc_skb ( len )) == NULL )
+        {
+                dbg ( DBG_RX,"intr_rx: can't allocate buffer\n");
+
+                port->stats.rx_dropped++;
+
+                /* Return descriptor to card */
+                FST_WRB ( card, rxDescrRing[pi][rxp].bits, DMA_OWN );
+
+                if ( ++rxp >= NUM_RX_BUFFER )
+                        port->rxpos = 0;
+                else
+                        port->rxpos = rxp;
+                return;
+        }
+
+        memcpy_fromio ( skb_put ( skb, len ),
+                                card->mem + BUF_OFFSET ( rxBuffer[pi][rxp][0]),
+                                len );
+
+        /* Reset buffer descriptor */
+        FST_WRB ( card, rxDescrRing[pi][rxp].bits, DMA_OWN );
+        if ( ++rxp >= NUM_RX_BUFFER )
+                port->rxpos = 0;
+        else
+                port->rxpos = rxp;
+
+        /* Update stats */
+        port->stats.rx_packets++;
+        port->stats.rx_bytes += len;
+
+        /* Push upstream */
+        if ( port->proto == FST_HDLC || port->proto == FST_PPP )
+        {
+                /* Mark for further processing by sPPP module */
+                skb->protocol = htons ( ETH_P_WAN_PPP );
+        }
+        else
+        {
+                /* DEC customer specific protocol (since nothing defined for
+                 * marking raw data), at least one other driver uses this value
+                 * for this purpose.
+                 */
+                skb->protocol = htons ( ETH_P_CUST );
+                skb->pkt_type = PACKET_HOST;
+        }
+        skb->mac.raw = skb->data;
+        skb->dev = port->dev;
+        netif_rx ( skb );
+
+        port->dev->last_rx = jiffies;
+}
+
+
+/*
+ *      The interrupt service routine
+ *      Dev_id is our fst_card_info pointer
+ */
+static void
+fst_intr ( int irq, void *dev_id, struct pt_regs *regs )
+{
+        struct fst_card_info *card;
+        struct fst_port_info *port;
+        int rdidx;                      /* Event buffer indices */
+        int wridx;
+        int event;                      /* Actual event for processing */
+        int pi;
+
+        if (( card = dev_id ) == NULL )
+        {
+                dbg ( DBG_INTR,"intr: spurious %d\n", irq );
+                return;
+        }
+
+        dbg ( DBG_INTR,"intr: %d %p\n", irq, card );
+
+        spin_lock ( &card->card_lock );
+
+        /* Clear and reprime the interrupt source */
+        fst_clear_intr ( card );
+
+        /* Set the software acknowledge */
+        FST_WRB ( card, interruptHandshake, 0xEE );
+
+        /* Drain the event queue */
+        rdidx = FST_RDB ( card, interruptEvent.rdindex );
+        wridx = FST_RDB ( card, interruptEvent.wrindex );
+        while ( rdidx != wridx )
+        {
+                event = FST_RDB ( card, interruptEvent.evntbuff[rdidx]);
+
+                port = &card->ports[event & 0x03];
+
+                dbg ( DBG_INTR,"intr: %x\n", event );
+
+                switch ( event )
+                {
+                case CTLA_CHG:
+                case CTLB_CHG:
+                case CTLC_CHG:
+                case CTLD_CHG:
+                        if ( port->run && port->dev != NULL )
+                                fst_intr_ctlchg ( card, port );
+                        break;
+
+                case ABTA_SENT:
+                case ABTB_SENT:
+                case ABTC_SENT:
+                case ABTD_SENT:
+                        dbg ( DBG_TX,"Abort complete port %d\n", event & 0x03 );
+                        break;
+
+                case TXA_UNDF:
+                case TXB_UNDF:
+                case TXC_UNDF:
+                case TXD_UNDF:
+                        /* Difficult to see how we'd get this given that we
+                         * always load up the entire packet for DMA.
+                         */
+                        dbg ( DBG_TX,"Tx underflow port %d\n", event & 0x03 );
+
+                        port->stats.tx_errors++;
+                        port->stats.tx_fifo_errors++;
+                        break;
+
+                case INIT_CPLT:
+                        dbg ( DBG_INIT,"Card init OK intr\n");
+                        break;
+
+                case INIT_FAIL:
+                        dbg ( DBG_INIT,"Card init FAILED intr\n");
+                        card->state = FST_IFAILED;
+                        break;
+
+                default:
+                        printk_err ("intr: unknown card event code. ignored\n");
+                        break;
+                }
+
+                /* Bump and wrap the index */
+                if ( ++rdidx >= MAX_CIRBUFF )
+                        rdidx = 0;
+        }
+        FST_WRB ( card, interruptEvent.rdindex, rdidx );
+
+        for ( pi = 0, port = card->ports ; pi < card->nports ; pi++, port++ )
+        {
+                if ( port->dev == NULL || ! port->run )
+                        continue;
+
+                /* Check for rx completions */
+                while ( ! ( FST_RDB ( card, rxDescrRing[pi][port->rxpos].bits )
+                                                                & DMA_OWN ))
+                {
+                        fst_intr_rx ( card, port );
+                }
+
+                /* Check for Tx completions */
+                while ( port->txcnt > 0 && ! ( FST_RDB ( card,
+                        txDescrRing[pi][port->txipos].bits ) & DMA_OWN ))
+                {
+                        --port->txcnt;
+                        if ( ++port->txipos >= NUM_TX_BUFFER )
+                                port->txipos = 0;
+                        netif_wake_queue ( port->dev );
+                }
+        }
+
+        spin_unlock ( &card->card_lock );
+}
+
+
+/*      Check that the shared memory configuration is one that we can handle
+ *      and that some basic parameters are correct
+ */
+static void
+check_started_ok ( struct fst_card_info *card )
+{
+        int i;
+
+        /* Check structure version and end marker */
+        if ( FST_RDW ( card, smcVersion ) != SMC_VERSION )
+        {
+                printk_err ("Bad shared memory version %d expected %d\n",
+                                FST_RDW ( card, smcVersion ), SMC_VERSION );
+                card->state = FST_BADVERSION;
+                return;
+        }
+        if ( FST_RDL ( card, endOfSmcSignature ) != END_SIG )
+        {
+                printk_err ("Missing shared memory signature\n");
+                card->state = FST_BADVERSION;
+                return;
+        }
+        /* Firmware status flag, 0x00 = initialising, 0x01 = OK, 0xFF = fail */
+        if (( i = FST_RDB ( card, taskStatus )) == 0x01 )
+        {
+                card->state = FST_RUNNING;
+        }
+        else if ( i == 0xFF )
+        {
+                printk_err ("Firmware initialisation failed. Card halted\n");
+                card->state = FST_HALTED;
+                return;
+        }
+        else if ( i != 0x00 )
+        {
+                printk_err ("Unknown firmware status 0x%x\n", i );
+                card->state = FST_HALTED;
+                return;
+        }
+
+        /* Finally check the number of ports reported by firmware against the
+         * number we assumed at card detection. Should never happen with
+         * existing firmware etc so we just report it for the moment.
+         */
+        if ( FST_RDL ( card, numberOfPorts ) != card->nports )
+        {
+                printk_warn ("Port count mismatch."
+                                " Firmware thinks %d we say %d\n",
+                                FST_RDL ( card, numberOfPorts ), card->nports );
+        }
+}
+
+
+static int
+fst_change_mtu ( struct net_device *dev, int new_mtu )
+{
+        if ( new_mtu < 128 || new_mtu > FST_MAX_MTU )
+                return -EINVAL;
+        dev->mtu = new_mtu;
+        return 0;
+}
+
+
+/* Sooner or later you can't avoid a forward declaration */
+static int fst_ioctl ( struct net_device *dev, struct ifreq *ifr, int cmd );
+
+static int
+switch_proto ( struct fst_port_info *port, int new_proto )
+{
+        int err;
+        int orig_mtu;
+        struct net_device *dev;
+
+        dev = port->dev;
+
+        /* Turn off sPPP module ? */
+        if (( new_proto != FST_HDLC && new_proto != FST_PPP )
+                && ( port->proto == FST_HDLC || port->proto == FST_PPP ))
+        {
+                sppp_close ( port->pppdev.dev );
+                sppp_detach ( port->pppdev.dev );
+
+                /* Reset some fields overwritten by sPPP */
+                dev->hard_header     = NULL;
+                dev->rebuild_header  = NULL;
+                dev->tx_queue_len    = FST_TX_QUEUE_LEN;
+                dev->type            = ARPHRD_MYTYPE;
+                dev->addr_len        = 0;
+                dev->hard_header_len = 0;
+                dev->do_ioctl        = fst_ioctl;
+                dev->change_mtu      = fst_change_mtu;
+                dev->flags           = IFF_POINTOPOINT|IFF_NOARP;
+
+                return 0;
+        }
+
+        /* Turn on sPPP ? */
+        if (( new_proto == FST_HDLC || new_proto == FST_PPP )
+                && ( port->proto != FST_HDLC && port->proto != FST_PPP ))
+        {
+                orig_mtu = dev->mtu;
+
+                /* Attach to sync PPP module */
+                port->pppdev.dev = dev;
+                sppp_attach ( &port->pppdev );
+
+                if ( orig_mtu < dev->mtu )
+                        dev->change_mtu ( dev, orig_mtu );
+
+                /* Claw back the ioctl routine. We promise to be good and call
+                 * the sync PPP routines once we've eliminated our functions.
+                 */
+                dev->do_ioctl = fst_ioctl;
+
+                /* Set the mode */
+                if ( new_proto == FST_HDLC )
+                {
+                        err = sppp_do_ioctl ( port->pppdev.dev, NULL,
+                                                                SPPPIOCCISCO );
+                }
+                else
+                {
+                        err = sppp_do_ioctl ( port->pppdev.dev, NULL,
+                                                                SPPPIOCPPP );
+                }
+
+                /* Open the device */
+                if ( err == 0 )
+                {
+                        (void) sppp_open ( port->dev );
+                }
+
+                return err;
+        }
+
+        /* Switch sPPP mode to that desired */
+        err = 0;
+        if ( new_proto == FST_HDLC && port->pppdev.dev != NULL )
+        {
+                err = sppp_do_ioctl ( port->pppdev.dev, NULL, SPPPIOCCISCO );
+        }
+        else if ( new_proto == FST_PPP && port->pppdev.dev != NULL )
+        {
+                err = sppp_do_ioctl ( port->pppdev.dev, NULL, SPPPIOCPPP );
+        }
+
+        /* Anything else is switching from one raw mode to another which is
+         * basically a NOP
+         */
+
+        return err;
+}
+
+
+static int
+set_conf_from_info ( struct fst_card_info *card, struct fst_port_info *port,
+                struct fstioc_info *info )
+{
+        int err;
+
+        /* Set things according to the user set valid flags */
+        err = 0;
+        if ( info->valid & FSTVAL_PROTO )
+        {
+                if ( port->proto != info->proto )
+                {
+                        err = switch_proto ( port, info->proto );
+                        if ( err == 0 )
+                                port->proto = info->proto;
+                }
+        }
+        if ( info->valid & FSTVAL_CABLE )
+        {
+                FST_WRB ( card, portConfig[port->index].lineInterface,
+                                        info->lineInterface );
+                port->hwif = info->lineInterface;
+        }
+        if ( info->valid & FSTVAL_SPEED )
+        {
+                FST_WRL ( card, portConfig[port->index].lineSpeed,
+                                        info->lineSpeed );
+                FST_WRB ( card, portConfig[port->index].internalClock,
+                                        info->internalClock );
+        }
+        if ( info->valid & FSTVAL_MODE )
+        {
+                FST_WRW ( card, cardMode, info->cardMode );
+        }
+#if FST_DEBUG
+        if ( info->valid & FSTVAL_DEBUG )
+        {
+                fst_debug_mask = info->debug;
+        }
+#endif
+
+        return err;
+}
+
+static void
+gather_conf_info ( struct fst_card_info *card, struct fst_port_info *port,
+                struct fstioc_info *info )
+{
+        int i;
+
+        memset ( info, 0, sizeof ( struct fstioc_info ));
+
+        i = port->index;
+        info->nports = card->nports;
+        info->type   = card->type;
+        info->state  = card->state;
+        info->proto  = port->proto;
+        info->index  = i;
+#if FST_DEBUG
+        info->debug  = fst_debug_mask;
+#endif
+
+        /* Only mark information as valid if card is running.
+         * Copy the data anyway in case it is useful for diagnostics
+         */
+        info->valid
+                = (( card->state == FST_RUNNING ) ? FSTVAL_ALL : FSTVAL_CARD )
+#if FST_DEBUG
+                | FSTVAL_DEBUG
+#endif
+                ;
+
+        info->lineInterface = FST_RDW ( card, portConfig[i].lineInterface );
+        info->internalClock = FST_RDB ( card, portConfig[i].internalClock );
+        info->lineSpeed     = FST_RDL ( card, portConfig[i].lineSpeed );
+        info->v24IpSts      = FST_RDL ( card, v24IpSts[i] );
+        info->v24OpSts      = FST_RDL ( card, v24OpSts[i] );
+        info->clockStatus   = FST_RDW ( card, clockStatus[i] );
+        info->cableStatus   = FST_RDW ( card, cableStatus );
+        info->cardMode      = FST_RDW ( card, cardMode );
+        info->smcFirmwareVersion  = FST_RDL ( card, smcFirmwareVersion );
+}
+
+
+static int
+fst_ioctl ( struct net_device *dev, struct ifreq *ifr, int cmd )
+{
+        struct fst_card_info *card;
+        struct fst_port_info *port;
+        struct fstioc_write wrthdr;
+        struct fstioc_info info;
+        unsigned long flags;
+
+        dbg ( DBG_IOCTL,"ioctl: %x, %p\n", cmd, ifr->ifr_data );
+
+        port = dev->priv;
+        card = port->card;
+
+        if ( !capable ( CAP_NET_ADMIN ))
+                return -EPERM;
+
+        switch ( cmd )
+        {
+        case FSTCPURESET:
+                fst_cpureset ( card );
+                card->state = FST_RESET;
+                return 0;
+
+        case FSTCPURELEASE:
+                fst_cpurelease ( card );
+                card->state = FST_STARTING;
+                return 0;
+
+        case FSTWRITE:                  /* Code write (download) */
+
+                /* First copy in the header with the length and offset of data
+                 * to write
+                 */
+                if ( ifr->ifr_data == NULL )
+                {
+                        return -EINVAL;
+                }
+                if ( copy_from_user ( &wrthdr, ifr->ifr_data,
+                                        sizeof ( struct fstioc_write )))
+                {
+                        return -EFAULT;
+                }
+
+                /* Sanity check the parameters. We don't support partial writes
+                 * when going over the top
+                 */
+                if ( wrthdr.size + wrthdr.offset > FST_MEMSIZE )
+                {
+                        return -ENXIO;
+                }
+
+                /* Now copy the data to the card.
+                 * This will probably break on some architectures.
+                 * I'll fix it when I have something to test on.
+                 */
+                if ( copy_from_user ( card->mem + wrthdr.offset,
+                                ifr->ifr_data + sizeof ( struct fstioc_write ),
+                                wrthdr.size ))
+                {
+                        return -EFAULT;
+                }
+
+                /* Writes to the memory of a card in the reset state constitute
+                 * a download
+                 */
+                if ( card->state == FST_RESET )
+                {
+                        card->state = FST_DOWNLOAD;
+                }
+                return 0;
+
+        case FSTGETCONF:
+
+                /* If card has just been started check the shared memory config
+                 * version and marker
+                 */
+                if ( card->state == FST_STARTING )
+                {
+                        check_started_ok ( card );
+
+                        /* If everything checked out enable card interrupts */
+                        if ( card->state == FST_RUNNING )
+                        {
+                                spin_lock_irqsave ( &card->card_lock, flags );
+                                fst_clear_intr ( card );
+                                FST_WRB ( card, interruptHandshake, 0xEE );
+                                spin_unlock_irqrestore ( &card->card_lock,
+                                                                flags );
+                        }
+                }
+
+                if ( ifr->ifr_data == NULL )
+                {
+                        return -EINVAL;
+                }
+
+                gather_conf_info ( card, port, &info );
+
+                if ( copy_to_user ( ifr->ifr_data, &info, sizeof ( info )))
+                {
+                        return -EFAULT;
+                }
+                return 0;
+
+        case FSTSETCONF:
+
+                if ( copy_from_user ( &info,  ifr->ifr_data, sizeof ( info )))
+                {
+                        return -EFAULT;
+                }
+
+                return set_conf_from_info ( card, port, &info );
+
+        default:
+                /* Not one of ours. Pass it through to sPPP package */
+                if ( port->proto == FST_HDLC || port->proto == FST_PPP )
+                        return sppp_do_ioctl ( dev, ifr, cmd );
+                else
+                        return -EINVAL;
+        }
+}
+
+
+static void
+fst_openport ( struct fst_port_info *port )
+{
+        int signals;
+
+        /* Only init things if card is actually running. This allows open to
+         * succeed for downloads etc.
+         */
+        if ( port->card->state == FST_RUNNING )
+        {
+                if ( port->run )
+                {
+                        dbg ( DBG_OPEN,"open: found port already running\n");
+
+                        fst_issue_cmd ( port, STOPPORT );
+                        port->run = 0;
+                }
+
+                fst_rx_config ( port );
+                fst_tx_config ( port );
+                fst_op_raise ( port, OPSTS_RTS | OPSTS_DTR );
+
+                fst_issue_cmd ( port, STARTPORT );
+                port->run = 1;
+
+                signals = FST_RDL ( port->card, v24DebouncedSts[port->index]);
+                if ( signals & (( port->hwif == X21 ) ? IPSTS_INDICATE
+                                                      : IPSTS_DCD ))
+                        netif_carrier_on ( port->dev );
+                else
+                        netif_carrier_off ( port->dev );
+        }
+}
+
+static void
+fst_closeport ( struct fst_port_info *port )
+{
+        if ( port->card->state == FST_RUNNING )
+        {
+                if ( port->run )
+                {
+                        port->run = 0;
+                        fst_op_lower ( port, OPSTS_RTS | OPSTS_DTR );
+
+                        fst_issue_cmd ( port, STOPPORT );
+                }
+                else
+                {
+                        dbg ( DBG_OPEN,"close: port not running\n");
+                }
+        }
+}
+
+
+static int
+fst_open ( struct net_device *dev )
+{
+        struct fst_card_info *card;
+        struct fst_port_info *port;
+        int orig_mtu;
+        int err;
+
+        MOD_INC_USE_COUNT;
+
+        port = dev->priv;
+        card = port->card;
+
+        switch ( port->proto )
+        {
+        case FST_HDLC:
+        case FST_PPP:
+
+                orig_mtu = dev->mtu;
+
+                /* Attach to sync PPP module */
+                port->pppdev.dev = dev;
+                sppp_attach ( &port->pppdev );
+
+                if ( orig_mtu < dev->mtu )
+                        dev->change_mtu ( dev, orig_mtu );
+
+                /* Claw back the ioctl routine. We promise to be good and call
+                 * the sync PPP routines once we've eliminated our functions.
+                 */
+                dev->do_ioctl = fst_ioctl;
+
+                err = sppp_do_ioctl ( dev, NULL, port->proto == FST_HDLC
+                                                ? SPPPIOCCISCO : SPPPIOCPPP );
+                if ( err )
+		{
+			sppp_detach ( dev );
+			MOD_DEC_USE_COUNT;
+			return err;
+		}
+
+                err = sppp_open ( dev );
+                if ( err )
+		{
+			sppp_detach ( dev );
+			MOD_DEC_USE_COUNT;
+			return err;
+		}
+                break;
+
+        case FST_MONITOR:
+        case FST_RAW:
+                break;
+
+        default:
+                dbg ( DBG_OPEN,"open: Unknown proto %d\n", port->proto );
+                break;
+        }
+
+        fst_openport ( port );
+
+        netif_wake_queue ( dev );
+        return 0;
+}
+
+static int
+fst_close ( struct net_device *dev )
+{
+        struct fst_port_info *port;
+
+        port = dev->priv;
+
+        netif_stop_queue ( dev );
+        switch ( port->proto )
+        {
+        case FST_HDLC:
+        case FST_PPP:
+                sppp_close ( dev );
+                sppp_detach ( dev );
+                break;
+
+        case FST_MONITOR:
+        case FST_RAW:
+                break;
+
+        default:
+                dbg ( DBG_OPEN,"close: Unknown proto %d\n", port->proto );
+                break;
+        }
+
+        fst_closeport ( port );
+
+        MOD_DEC_USE_COUNT;
+        return 0;
+}
+
+
+static void
+fst_tx_timeout ( struct net_device *dev )
+{
+        struct fst_port_info *port;
+
+        dbg ( DBG_INTR | DBG_TX,"tx_timeout\n");
+
+        port = dev->priv;
+
+        port->stats.tx_errors++;
+        port->stats.tx_aborted_errors++;
+
+        if ( port->txcnt > 0 )
+                fst_issue_cmd ( port, ABORTTX );
+
+        dev->trans_start = jiffies;
+        netif_wake_queue ( dev );
+}
+
+
+static int
+fst_start_xmit ( struct sk_buff *skb, struct net_device *dev )
+{
+        struct fst_card_info *card;
+        struct fst_port_info *port;
+        unsigned char dmabits;
+        unsigned long flags;
+        int pi;
+        int txp;
+
+        port = dev->priv;
+        card = port->card;
+
+        /* Drop packet if in monitor (rx only) mode */
+        if ( port->proto == FST_MONITOR )
+        {
+                dev_kfree_skb ( skb );
+                return 0;
+        }
+
+        /* Drop packet with error if we don't have carrier */
+        if ( ! netif_carrier_ok ( dev ))
+        {
+                dev_kfree_skb ( skb );
+                port->stats.tx_errors++;
+                port->stats.tx_carrier_errors++;
+                return 0;
+        }
+
+        /* Drop it if it's too big! MTU failure ? */
+        if ( skb->len > LEN_TX_BUFFER )
+        {
+                dbg ( DBG_TX,"Packet too large %d vs %d\n", skb->len,
+                                                LEN_TX_BUFFER );
+                dev_kfree_skb ( skb );
+                port->stats.tx_errors++;
+                return 0;
+        }
+
+        /* Check we have a buffer */
+        pi = port->index;
+        spin_lock_irqsave ( &card->card_lock, flags );
+        txp = port->txpos;
+        dmabits = FST_RDB ( card, txDescrRing[pi][txp].bits );
+        if ( dmabits & DMA_OWN )
+        {
+                spin_unlock_irqrestore ( &card->card_lock, flags );
+                dbg ( DBG_TX,"Out of Tx buffers\n");
+                dev_kfree_skb ( skb );
+                port->stats.tx_errors++;
+                return 0;
+        }
+        if ( ++port->txpos >= NUM_TX_BUFFER )
+                port->txpos = 0;
+
+        if ( ++port->txcnt >= NUM_TX_BUFFER )
+                netif_stop_queue ( dev );
+
+        /* Release the card lock before we copy the data as we now have
+         * exclusive access to the buffer.
+         */
+        spin_unlock_irqrestore ( &card->card_lock, flags );
+
+        /* Enqueue the packet */
+        memcpy_toio ( card->mem + BUF_OFFSET ( txBuffer[pi][txp][0]),
+                                                skb->data, skb->len );
+        FST_WRW ( card, txDescrRing[pi][txp].bcnt, cnv_bcnt ( skb->len ));
+        FST_WRB ( card, txDescrRing[pi][txp].bits, DMA_OWN | TX_STP | TX_ENP );
+
+        port->stats.tx_packets++;
+        port->stats.tx_bytes += skb->len;
+
+        dev_kfree_skb ( skb );
+
+        dev->trans_start = jiffies;
+        return 0;
+}
+
+
+static struct net_device_stats *
+fst_get_stats ( struct net_device *dev )
+{
+        struct fst_port_info *port;
+
+        if (( port = dev->priv ) != NULL )
+                return &port->stats;
+        else
+                return NULL;
+}
+
+
+/*
+ *      Card setup having checked hardware resources.
+ *      Should be pretty bizarre if we get an error here (kernel memory
+ *      exhaustion is one possibility). If we do see a problem we report it
+ *      via a printk and leave the corresponding interface and all that follow
+ *      disabled.
+ */
+static char *type_strings[] __devinitdata = {
+        "no hardware",                  /* Should never be seen */
+        "FarSync T2P",
+        "FarSync T4P"
+};
+
+static void __devinit
+fst_init_card ( struct fst_card_info *card )
+{
+        int i;
+        int err;
+        struct net_device *dev;
+
+        /* We're working on a number of ports based on the card ID. If the
+         * firmware detects something different later (should never happen)
+         * we'll have to revise it in some way then.
+         */
+        for ( i = 0 ; i < card->nports ; i++ )
+        {
+                card->ports[i].if_ptr = &card->ports[i].pppdev;
+                card->ports[i].card   = card;
+                card->ports[i].index  = i;
+                card->ports[i].proto  = FST_HDLC;
+                card->ports[i].run    = 0;
+
+                dev = kmalloc ( sizeof ( struct net_device ), GFP_KERNEL );
+                if ( dev == NULL )
+                {
+                        printk_err ("Cannot allocate net_device for port %d\n",
+                                        i );
+                        /* No point going any further */
+                        card->nports = i;
+                        break;
+                }
+                memset ( dev, 0, sizeof ( struct net_device ));
+                card->ports[i].dev = dev;
+
+                if ( dev_alloc_name ( dev, FST_NDEV_NAME "%d") < 0 )
+                {
+                        printk_err ("Cannot allocate i/f name for port %d\n",
+                                        i );
+                        kfree ( dev );
+                        card->nports = i;
+                        break;
+                }
+
+                /* Fill in remainder of the net device info */
+                                /* Since this is a PCI setup this is purely
+                                 * informational. Give them the buffer addresses
+                                 * and basic card I/O.
+                                 */
+                dev->mem_start   = card->phys_mem
+                                 + BUF_OFFSET ( txBuffer[i][0][0]);
+                dev->mem_end     = card->phys_mem
+                                 + BUF_OFFSET ( txBuffer[i][NUM_TX_BUFFER][0]);
+                dev->rmem_start  = card->phys_mem
+                                 + BUF_OFFSET ( rxBuffer[i][0][0]);
+                dev->rmem_end    = card->phys_mem
+                                 + BUF_OFFSET ( rxBuffer[i][NUM_RX_BUFFER][0]);
+                dev->base_addr   = card->pci_conf;
+                dev->irq         = card->irq;
+
+                dev->get_stats          = fst_get_stats;
+                dev->mtu                = FST_DEF_MTU;
+                dev->change_mtu         = fst_change_mtu;
+                dev->priv               = &card->ports[i];
+                dev->tx_queue_len       = FST_TX_QUEUE_LEN;
+                dev->type               = ARPHRD_MYTYPE;
+                dev->addr_len           = 0;
+                dev->open               = fst_open;
+                dev->stop               = fst_close;
+                dev->hard_start_xmit    = fst_start_xmit;
+                dev->do_ioctl           = fst_ioctl;
+                dev->watchdog_timeo     = FST_TX_TIMEOUT;
+                dev->tx_timeout         = fst_tx_timeout;
+                dev->flags              = IFF_POINTOPOINT|IFF_NOARP;
+
+                if (( err = register_netdev ( dev )) < 0 )
+                {
+                        printk_err ("Cannot register %s (errno %d)\n",
+                                        dev->name, -err );
+                        kfree ( dev );
+                        card->nports = i;
+                        break;
+                }
+        }
+
+        spin_lock_init ( &card->card_lock );
+
+        printk ( KERN_INFO "%s-%s: %s IRQ%d, %d ports\n",
+                        card->ports[0].dev->name,
+                        card->ports[card->nports-1].dev->name,
+                        type_strings[card->type], card->irq, card->nports );
+}
+
+
+/*
+ *      Initialise card when detected.
+ *      Returns 0 to indicate success, or errno otherwise.
+ */
+static int __devinit
+fst_add_one ( struct pci_dev *pdev, const struct pci_device_id *ent )
+{
+        static int firsttime_done = 0;
+        struct fst_card_info *card;
+        int err = 0;
+
+        if ( ! firsttime_done )
+        {
+                printk ( KERN_INFO "FarSync X21 driver " FST_USER_VERSION
+                                " (c) 2001 FarSite Communications Ltd.\n");
+                firsttime_done = 1;
+        }
+
+        /* Allocate driver private data */
+        card = kmalloc ( sizeof ( struct fst_card_info ),  GFP_KERNEL);
+        if (card == NULL)
+        {
+                printk_err ("FarSync card found but insufficient memory for"
+                                " driver storage\n");
+                return -ENOMEM;
+        }
+        memset ( card, 0, sizeof ( struct fst_card_info ));
+
+        /* Record info we need*/
+        card->irq         = pdev->irq;
+        card->pci_conf    = pci_resource_start ( pdev, 1 );
+        card->phys_mem    = pci_resource_start ( pdev, 2 );
+        card->phys_ctlmem = pci_resource_start ( pdev, 3 );
+
+        card->type        = ent->driver_data;
+        card->nports      = ( ent->driver_data == FST_TYPE_T2P ) ? 2 : 4;
+
+        card->state       = FST_UNINIT;
+
+        dbg ( DBG_PCI,"type %d nports %d irq %d\n", card->type,
+                        card->nports, card->irq );
+        dbg ( DBG_PCI,"conf %04x mem %08x ctlmem %08x\n",
+                        card->pci_conf, card->phys_mem, card->phys_ctlmem );
+
+        /* Check we can get access to the memory and I/O regions */
+        if ( ! request_region ( card->pci_conf, 0x80,"PLX config regs"))
+        {
+                printk_err ("Unable to get config I/O @ 0x%04X\n",
+                                                card->pci_conf );
+                err = -ENODEV;
+                goto error_free_card;
+        }
+        if ( ! request_mem_region ( card->phys_mem, FST_MEMSIZE,"Shared RAM"))
+        {
+                printk_err ("Unable to get main memory @ 0x%08X\n",
+                                                card->phys_mem );
+                err = -ENODEV;
+                goto error_release_io;
+        }
+        if ( ! request_mem_region ( card->phys_ctlmem, 0x10,"Control memory"))
+        {
+                printk_err ("Unable to get control memory @ 0x%08X\n",
+                                                card->phys_ctlmem );
+                err = -ENODEV;
+                goto error_release_mem;
+        }
+
+        /* Try to enable the device */
+        if (( err = pci_enable_device ( pdev )) != 0 )
+        {
+                printk_err ("Failed to enable card. Err %d\n", -err );
+                goto error_release_ctlmem;
+        }
+
+        /* Get virtual addresses of memory regions */
+        if (( card->mem = ioremap ( card->phys_mem, FST_MEMSIZE )) == NULL )
+        {
+                printk_err ("Physical memory remap failed\n");
+                err = -ENODEV;
+                goto error_release_ctlmem;
+        }
+        if (( card->ctlmem = ioremap ( card->phys_ctlmem, 0x10 )) == NULL )
+        {
+                printk_err ("Control memory remap failed\n");
+                err = -ENODEV;
+                goto error_unmap_mem;
+        }
+        dbg ( DBG_PCI,"kernel mem %p, ctlmem %p\n", card->mem, card->ctlmem);
+
+        /* Reset the card's processor */
+        fst_cpureset ( card );
+        card->state = FST_RESET;
+
+        /* Register the interrupt handler */
+        if ( request_irq ( card->irq, fst_intr, SA_SHIRQ, FST_DEV_NAME, card ))
+        {
+
+                printk_err ("Unable to register interrupt %d\n", card->irq );
+                err = -ENODEV;
+                goto error_unmap_ctlmem;
+        }
+
+        /* Record driver data for later use */
+        pdev->driver_data = card;
+
+        /* Remainder of card setup */
+        fst_init_card ( card );
+
+        return 0;                       /* Success */
+
+
+                                        /* Failure. Release resources */
+error_unmap_ctlmem:
+        iounmap ( card->ctlmem );
+
+error_unmap_mem:
+        iounmap ( card->mem );
+
+error_release_ctlmem:
+        release_mem_region ( card->phys_ctlmem, 0x10 );
+
+error_release_mem:
+        release_mem_region ( card->phys_mem, FST_MEMSIZE );
+
+error_release_io:
+        release_region ( card->pci_conf, 0x80 );
+
+error_free_card:
+        kfree ( card );
+        return err;
+}
+
+
+/*
+ *      Cleanup and close down a card
+ */
+static void __devexit
+fst_remove_one ( struct pci_dev *pdev )
+{
+        struct fst_card_info *card;
+        int i;
+
+        card = pdev->driver_data;
+
+        for ( i = 0 ; i < card->nports ; i++ )
+        {
+                unregister_netdev ( card->ports[i].dev );
+                kfree ( card->ports[i].dev );
+        }
+
+        fst_disable_intr ( card );
+        free_irq ( card->irq, card );
+
+        iounmap ( card->ctlmem );
+        iounmap ( card->mem );
+
+        release_mem_region ( card->phys_ctlmem, 0x10 );
+        release_mem_region ( card->phys_mem, FST_MEMSIZE );
+        release_region ( card->pci_conf, 0x80 );
+
+        kfree ( card );
+}
+
+static struct pci_driver fst_driver = {
+        name:           FST_NAME,
+        id_table:       fst_pci_dev_id,
+        probe:          fst_add_one,
+        remove:         fst_remove_one,
+        suspend:        NULL,
+        resume:         NULL,
+};
+
+static int __init
+fst_init(void)
+{
+        return pci_module_init ( &fst_driver );
+}
+
+static void __exit
+fst_cleanup_module(void)
+{
+        pci_unregister_driver ( &fst_driver );
+}
+
+module_init ( fst_init );
+module_exit ( fst_cleanup_module );
+
diff -u --recursive --new-file v2.4.8/linux/drivers/net/wan/farsync.h linux/drivers/net/wan/farsync.h
--- v2.4.8/linux/drivers/net/wan/farsync.h	Wed Dec 31 16:00:00 1969
+++ linux/drivers/net/wan/farsync.h	Sun Aug 12 10:38:48 2001
@@ -0,0 +1,226 @@
+/*
+ *      FarSync X21 driver for Linux
+ *
+ *      Actually sync driver for X.21, V.35 and V.24 on FarSync T-series cards
+ *
+ *      Copyright (C) 2001 FarSite Communications Ltd.
+ *      www.farsite.co.uk
+ *
+ *      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.
+ *
+ *      Author: R.J.Dunlop      <bob.dunlop@farsite.co.uk>
+ *
+ *      For the most part this file only contains structures and information
+ *      that is visible to applications outside the driver. Shared memory
+ *      layout etc is internal to the driver and described within farsync.c.
+ *      Overlap exists in that the values used for some fields within the
+ *      ioctl interface extend into the cards firmware interface so values in
+ *      this file may not be changed arbitrarily.
+ */
+
+/*      What's in a name
+ *
+ *      The project name for this driver is Oscar. The driver is intended to be
+ *      used with the FarSite T-Series cards (T2P & T4P) running in the high
+ *      speed frame shifter mode. This is sometimes referred to as X.21 mode
+ *      which is a complete misnomer as the card continues to support V.24 and
+ *      V.35 as well as X.21.
+ *
+ *      A short common prefix is useful for routines within the driver to avoid
+ *      conflict with other similar drivers and I chosen to use "fst_" for this
+ *      purpose (FarSite T-series).
+ *
+ *      Finally the device driver needs a short network interface name. Since
+ *      "hdlc" is already in use I've chosen the even less informative "sync"
+ *      for the present.
+ */
+#define FST_NAME                "fst"           /* In debug/info etc */
+#define FST_NDEV_NAME           "sync"          /* For net interface */
+#define FST_DEV_NAME            "farsync"       /* For misc interfaces */
+
+
+/*      User version number
+ *
+ *      This version number is incremented with each official release of the
+ *      package and is a simplified number for normal user reference.
+ *      Individual files are tracked by the version control system and may
+ *      have individual versions (or IDs) that move much faster than the
+ *      the release version as individual updates are tracked.
+ */
+#define FST_USER_VERSION        "0.09"
+
+
+/*      Ioctl call command values
+ *
+ *      The first three private ioctls are used by the sync-PPP module,
+ *      allowing a little room for expansion we start our numbering at 10.
+ */
+#define FSTWRITE        (SIOCDEVPRIVATE+10)
+#define FSTCPURESET     (SIOCDEVPRIVATE+11)
+#define FSTCPURELEASE   (SIOCDEVPRIVATE+12)
+#define FSTGETCONF      (SIOCDEVPRIVATE+13)
+#define FSTSETCONF      (SIOCDEVPRIVATE+14)
+
+
+/*      FSTWRITE
+ *
+ *      Used to write a block of data (firmware etc) before the card is running
+ */
+struct fstioc_write {
+        unsigned int  size;
+        unsigned int  offset;
+        unsigned char data[0];
+};
+
+
+/*      FSTCPURESET and FSTCPURELEASE
+ *
+ *      These take no additional data.
+ *      FSTCPURESET forces the cards CPU into a reset state and holds it there.
+ *      FSTCPURELEASE releases the CPU from this reset state allowing it to run,
+ *      the reset vector should be setup before this ioctl is run.
+ */
+
+/*      FSTGETCONF and FSTSETCONF
+ *
+ *      Get and set a card/ports configuration.
+ *      In order to allow selective setting of items and for the kernel to
+ *      indicate a partial status response the first field "valid" is a bitmask
+ *      indicating which other fields in the structure are valid.
+ *      Many of the field names in this structure match those used in the
+ *      firmware shared memory configuration interface and come originally from
+ *      the NT header file Smc.h
+ *
+ *      When used with FSTGETCONF this structure should be zeroed before use.
+ *      This is to allow for possible future expansion when some of the fields
+ *      might be used to indicate a different (expanded) structure.
+ */
+struct fstioc_info {
+        unsigned int   valid;           /* Bits of structure that are valid */
+        unsigned int   nports;          /* Number of serial ports */
+        unsigned int   type;            /* Type index of card */
+        unsigned int   state;           /* State of card */
+        unsigned int   index;           /* Index of port ioctl was issued on */
+        unsigned int   smcFirmwareVersion;
+        unsigned short lineInterface;   /* Physical interface type */
+        unsigned char  proto;           /* Line protocol */
+        unsigned char  internalClock;   /* 1 => internal clock, 0 => external */
+        unsigned int   lineSpeed;       /* Speed in bps */
+        unsigned int   v24IpSts;        /* V.24 control input status */
+        unsigned int   v24OpSts;        /* V.24 control output status */
+        unsigned short clockStatus;     /* lsb: 0=> present, 1=> absent */
+        unsigned short cableStatus;     /* lsb: 0=> present, 1=> absent */
+        unsigned short cardMode;        /* lsb: LED id mode */
+        unsigned short debug;           /* Debug flags */
+};
+
+/* "valid" bitmask */
+#define FSTVAL_NONE     0x00000000      /* Nothing valid (firmware not running).
+                                         * Slight misnomer. In fact nports,
+                                         * type, state and index will be set
+                                         * based on hardware detected.
+                                         */
+#define FSTVAL_OMODEM   0x0000001F      /* First 5 bits correspond to the
+                                         * output status bits defined for
+                                         * v24OpSts
+                                         */
+#define FSTVAL_SPEED    0x00000020      /* internalClock, lineSpeed, clockStatus
+                                         */
+#define FSTVAL_CABLE    0x00000040      /* lineInterface, cableStatus */
+#define FSTVAL_IMODEM   0x00000080      /* v24IpSts */
+#define FSTVAL_CARD     0x00000100      /* nports, type, state, index,
+                                         * smcFirmwareVersion
+                                         */
+#define FSTVAL_PROTO    0x00000200      /* proto */
+#define FSTVAL_MODE     0x00000400      /* cardMode */
+#define FSTVAL_DEBUG    0x80000000      /* debug */
+#define FSTVAL_ALL      0x000007FF      /* Note: does not include DEBUG flag */
+
+/* "type" */
+#define FST_TYPE_NONE   0               /* Probably should never happen */
+#define FST_TYPE_T2P    1               /* T2P X21 2 port card */
+#define FST_TYPE_T4P    2               /* T4P X21 4 port card */
+
+/* "state" */
+#define FST_UNINIT      0               /* Raw uninitialised state following
+                                         * system startup */
+#define FST_RESET       1               /* Processor held in reset state */
+#define FST_DOWNLOAD    2               /* Card being downloaded */
+#define FST_STARTING    3               /* Released following download */
+#define FST_RUNNING     4               /* Processor running */
+#define FST_BADVERSION  5               /* Bad shared memory version detected */
+#define FST_HALTED      6               /* Processor flagged a halt */
+#define FST_IFAILED     7               /* Firmware issued initialisation failed
+                                         * interrupt
+                                         */
+/* "lineInterface" */
+#define V24             1
+#define X21             2
+#define V35             3
+
+/* "proto" */
+#define FST_HDLC        1               /* Cisco compatible HDLC */
+#define FST_PPP         2               /* Sync PPP */
+#define FST_MONITOR     3               /* Monitor only (raw packet reception) */
+#define FST_RAW         4               /* Two way raw packets */
+#define FST_GEN_HDLC    5               /* Using "Generic HDLC" module */
+
+/* "internalClock" */
+#define INTCLK          1
+#define EXTCLK          0
+
+/* "v24IpSts" bitmask */
+#define IPSTS_CTS       0x00000001      /* Clear To Send (Indicate for X.21) */
+#define IPSTS_INDICATE  IPSTS_CTS
+#define IPSTS_DSR       0x00000002      /* Data Set Ready (T2P Port A) */
+#define IPSTS_DCD       0x00000004      /* Data Carrier Detect */
+#define IPSTS_RI        0x00000008      /* Ring Indicator (T2P Port A) */
+#define IPSTS_TMI       0x00000010      /* Test Mode Indicator (Not Supported)*/
+
+/* "v24OpSts" bitmask */
+#define OPSTS_RTS       0x00000001      /* Request To Send (Control for X.21) */
+#define OPSTS_CONTROL   OPSTS_RTS
+#define OPSTS_DTR       0x00000002      /* Data Terminal Ready */
+#define OPSTS_DSRS      0x00000004      /* Data Signalling Rate Select (Not
+                                         * Supported) */
+#define OPSTS_SS        0x00000008      /* Select Standby (Not Supported) */
+#define OPSTS_LL        0x00000010      /* Maintenance Test (Not Supported) */
+
+/* "cardMode" bitmask */
+#define CARD_MODE_IDENTIFY      0x0001
+
+
+/*      Debug support
+ *
+ *      These should only be enabled for development kernels, production code
+ *      should define FST_DEBUG=0 in order to exclude the code.
+ *      Setting FST_DEBUG=1 will include all the debug code but in a disabled
+ *      state, use the FSTSETCONF ioctl to enable specific debug actions, or
+ *      FST_DEBUG can be set to prime the debug selection.
+ */
+#define FST_DEBUG       0x0000
+#if FST_DEBUG
+
+extern int fst_debug_mask;              /* Bit mask of actions to debug, bits
+                                         * listed below. Note: Bit 0 is used
+                                         * to trigger the inclusion of this
+                                         * code, without enabling any actions.
+                                         */
+#define DBG_INIT        0x0002          /* Card detection and initialisation */
+#define DBG_OPEN        0x0004          /* Open and close sequences */
+#define DBG_PCI         0x0008          /* PCI config operations */
+#define DBG_IOCTL       0x0010          /* Ioctls and other config */
+#define DBG_INTR        0x0020          /* Interrupt routines (be careful) */
+#define DBG_TX          0x0040          /* Packet transmission */
+#define DBG_RX          0x0080          /* Packet reception */
+#define DBG_CMD         0x0100          /* Port command issuing */
+
+#define DBG_ASS         0xFFFF          /* Assert like statements. Code that
+                                         * should never be reached, if you see
+                                         * one of these then I've been an ass
+                                         */
+#endif  /* FST_DEBUG */
+
diff -u --recursive --new-file v2.4.8/linux/drivers/net/wan/sbni.c linux/drivers/net/wan/sbni.c
--- v2.4.8/linux/drivers/net/wan/sbni.c	Sun Aug 12 13:27:59 2001
+++ linux/drivers/net/wan/sbni.c	Sun Aug 12 10:38:48 2001
@@ -44,7 +44,7 @@
 #include <linux/fcntl.h>
 #include <linux/ioport.h>
 #include <linux/interrupt.h>
-#include <linux/malloc.h>
+#include <linux/slab.h>
 #include <linux/string.h>
 #include <linux/errno.h>
 
diff -u --recursive --new-file v2.4.8/linux/drivers/net/wan/sdla_chdlc.c linux/drivers/net/wan/sdla_chdlc.c
--- v2.4.8/linux/drivers/net/wan/sdla_chdlc.c	Fri Apr 20 11:54:22 2001
+++ linux/drivers/net/wan/sdla_chdlc.c	Sun Aug 12 10:38:48 2001
@@ -53,7 +53,7 @@
 #include <linux/stddef.h>	/* offsetof(), etc. */
 #include <linux/errno.h>	/* return codes */
 #include <linux/string.h>	/* inline memset(), etc. */
-#include <linux/malloc.h>	/* kmalloc(), kfree() */
+#include <linux/slab.h>	/* kmalloc(), kfree() */
 #include <linux/wanrouter.h>	/* WAN router definitions */
 #include <linux/wanpipe.h>	/* WANPIPE common user API definitions */
 #include <linux/if_arp.h>	/* ARPHRD_* defines */
diff -u --recursive --new-file v2.4.8/linux/drivers/net/wan/sdla_fr.c linux/drivers/net/wan/sdla_fr.c
--- v2.4.8/linux/drivers/net/wan/sdla_fr.c	Tue Jul  3 17:08:20 2001
+++ linux/drivers/net/wan/sdla_fr.c	Sun Aug 12 10:38:48 2001
@@ -143,7 +143,7 @@
 #include <linux/stddef.h>	/* offsetof(), etc. */
 #include <linux/errno.h>	/* return codes */
 #include <linux/string.h>	/* inline memset(), etc. */
-#include <linux/malloc.h>	/* kmalloc(), kfree() */
+#include <linux/slab.h>	/* kmalloc(), kfree() */
 #include <linux/wanrouter.h>	/* WAN router definitions */
 #include <linux/wanpipe.h>	/* WANPIPE common user API definitions */
 #include <linux/if_arp.h>	/* ARPHRD_* defines */
diff -u --recursive --new-file v2.4.8/linux/drivers/net/wan/sdla_ft1.c linux/drivers/net/wan/sdla_ft1.c
--- v2.4.8/linux/drivers/net/wan/sdla_ft1.c	Thu Apr 12 12:11:39 2001
+++ linux/drivers/net/wan/sdla_ft1.c	Sun Aug 12 10:38:48 2001
@@ -25,7 +25,7 @@
 #include <linux/stddef.h>	/* offsetof(), etc. */
 #include <linux/errno.h>	/* return codes */
 #include <linux/string.h>	/* inline memset(), etc. */
-#include <linux/malloc.h>	/* kmalloc(), kfree() */
+#include <linux/slab.h>	/* kmalloc(), kfree() */
 #include <linux/wanrouter.h>	/* WAN router definitions */
 #include <linux/wanpipe.h>	/* WANPIPE common user API definitions */
 #include <linux/if_arp.h>	/* ARPHRD_* defines */
diff -u --recursive --new-file v2.4.8/linux/drivers/net/wan/sdla_ppp.c linux/drivers/net/wan/sdla_ppp.c
--- v2.4.8/linux/drivers/net/wan/sdla_ppp.c	Sun May 20 12:11:39 2001
+++ linux/drivers/net/wan/sdla_ppp.c	Sun Aug 12 10:38:48 2001
@@ -95,7 +95,7 @@
 #include <linux/stddef.h>	/* offsetof(), etc. */
 #include <linux/errno.h>	/* return codes */
 #include <linux/string.h>	/* inline memset(), etc. */
-#include <linux/malloc.h>	/* kmalloc(), kfree() */
+#include <linux/slab.h>	/* kmalloc(), kfree() */
 #include <linux/wanrouter.h>	/* WAN router definitions */
 #include <linux/wanpipe.h>	/* WANPIPE common user API definitions */
 #include <linux/if_arp.h>	/* ARPHRD_* defines */
diff -u --recursive --new-file v2.4.8/linux/drivers/net/wan/sdla_x25.c linux/drivers/net/wan/sdla_x25.c
--- v2.4.8/linux/drivers/net/wan/sdla_x25.c	Tue Jul  3 17:08:20 2001
+++ linux/drivers/net/wan/sdla_x25.c	Sun Aug 12 10:38:48 2001
@@ -87,7 +87,7 @@
 #include <linux/errno.h>	/* return codes */
 #include <linux/string.h>	/* inline memset(), etc. */
 #include <linux/ctype.h>
-#include <linux/malloc.h>	/* kmalloc(), kfree() */
+#include <linux/slab.h>	/* kmalloc(), kfree() */
 #include <linux/wanrouter.h>	/* WAN router definitions */
 #include <linux/wanpipe.h>	/* WANPIPE common user API definitions */
 #include <asm/byteorder.h>	/* htons(), etc. */
diff -u --recursive --new-file v2.4.8/linux/drivers/net/wan/sdlamain.c linux/drivers/net/wan/sdlamain.c
--- v2.4.8/linux/drivers/net/wan/sdlamain.c	Wed Apr 18 11:49:14 2001
+++ linux/drivers/net/wan/sdlamain.c	Sun Aug 12 10:38:48 2001
@@ -51,7 +51,7 @@
 #include <linux/stddef.h>	/* offsetof(), etc. */
 #include <linux/errno.h>	/* return codes */
 #include <linux/string.h>	/* inline memset(), etc. */
-#include <linux/malloc.h>	/* kmalloc(), kfree() */
+#include <linux/slab.h>	/* kmalloc(), kfree() */
 #include <linux/kernel.h>	/* printk(), and other useful stuff */
 #include <linux/module.h>	/* support for loadable modules */
 #include <linux/ioport.h>	/* request_region(), release_region() */
diff -u --recursive --new-file v2.4.8/linux/drivers/net/wan/syncppp.c linux/drivers/net/wan/syncppp.c
--- v2.4.8/linux/drivers/net/wan/syncppp.c	Tue Jul  3 17:08:20 2001
+++ linux/drivers/net/wan/syncppp.c	Sun Aug 12 10:38:48 2001
@@ -156,7 +156,7 @@
 
 static void if_down(struct net_device *dev)
 {
-	struct sppp *sp = &((struct ppp_device *)dev)->sppp;
+	struct sppp *sp = (struct sppp *)sppp_of(dev);
 
 	sp->pp_link_state=SPPP_LINK_DOWN;
 }
diff -u --recursive --new-file v2.4.8/linux/drivers/net/wan/wanpipe_multppp.c linux/drivers/net/wan/wanpipe_multppp.c
--- v2.4.8/linux/drivers/net/wan/wanpipe_multppp.c	Tue May 22 10:23:16 2001
+++ linux/drivers/net/wan/wanpipe_multppp.c	Sun Aug 12 10:38:48 2001
@@ -22,7 +22,7 @@
 #include <linux/stddef.h>	/* offsetof(), etc. */
 #include <linux/errno.h>	/* return codes */
 #include <linux/string.h>	/* inline memset(), etc. */
-#include <linux/malloc.h>	/* kmalloc(), kfree() */
+#include <linux/slab.h>	/* kmalloc(), kfree() */
 #include <linux/wanrouter.h>	/* WAN router definitions */
 #include <linux/wanpipe.h>	/* WANPIPE common user API definitions */
 #include <linux/if_arp.h>	/* ARPHRD_* defines */
diff -u --recursive --new-file v2.4.8/linux/drivers/parport/ChangeLog linux/drivers/parport/ChangeLog
--- v2.4.8/linux/drivers/parport/ChangeLog	Wed Jul 25 17:10:22 2001
+++ linux/drivers/parport/ChangeLog	Sun Aug 12 12:31:28 2001
@@ -1,3 +1,8 @@
+2001-08-08  Tim Waugh  <twaugh@redhat.com>
+
+	* share.c (parport_unregister_device): Remove device from wait list
+	too.
+
 2001-06-20  Tim Waugh  <twaugh@redhat.com>
 
 	* parport_pc.c: Make 'io_hi=0' work.
diff -u --recursive --new-file v2.4.8/linux/drivers/parport/share.c linux/drivers/parport/share.c
--- v2.4.8/linux/drivers/parport/share.c	Tue May 22 19:54:04 2001
+++ linux/drivers/parport/share.c	Sun Aug 12 12:31:28 2001
@@ -782,6 +782,21 @@
 
 	spin_unlock(&port->pardevice_lock);
 
+	/* Make sure we haven't left any pointers around in the wait
+	 * list. */
+	spin_lock (&port->waitlist_lock);
+	if (dev->waitprev || dev->waitnext || port->waithead == dev) {
+		if (dev->waitprev)
+			dev->waitprev->waitnext = dev->waitnext;
+		else
+			port->waithead = dev->waitnext;
+		if (dev->waitnext)
+			dev->waitnext->waitprev = dev->waitprev;
+		else
+			port->waittail = dev->waitprev;
+	}
+	spin_unlock (&port->waitlist_lock);
+
 	kfree(dev->state);
 	kfree(dev);
 
@@ -1063,6 +1078,7 @@
 
 	/* If anybody is waiting, find out who's been there longest and
 	   then wake them up. (Note: no locking required) */
+	/* !!! LOCKING IS NEEDED HERE */
 	for (pd = port->waithead; pd; pd = pd->waitnext) {
 		if (pd->waiting & 2) { /* sleeping in claim_or_block */
 			parport_claim(pd);
@@ -1080,6 +1096,7 @@
 
 	/* Nobody was waiting, so walk the list to see if anyone is
 	   interested in being woken up. (Note: no locking required) */
+	/* !!! LOCKING IS NEEDED HERE */
 	for (pd = port->devices; (port->cad == NULL) && pd; pd = pd->next) {
 		if (pd->wakeup && pd != dev)
 			pd->wakeup(pd->private);
diff -u --recursive --new-file v2.4.8/linux/drivers/pci/pci.c linux/drivers/pci/pci.c
--- v2.4.8/linux/drivers/pci/pci.c	Wed Jul 25 17:10:22 2001
+++ linux/drivers/pci/pci.c	Sun Aug 12 17:37:53 2001
@@ -290,6 +290,15 @@
 	/* enter specified state */
 	pci_write_config_word(dev, pm + PCI_PM_CTRL, pmcsr);
 
+	/* Mandatory power management transition delays */
+	/* see PCI PM 1.1 5.6.1 table 18 */
+	if(state == 3 || dev->current_state == 3)
+	{
+		set_current_state(TASK_UNINTERRUPTIBLE);
+		schedule_timeout(HZ/100);
+	}
+	else if(state == 2 || dev->current_state == 2)
+		udelay(200);
 	dev->current_state = state;
 
 	return 0;
diff -u --recursive --new-file v2.4.8/linux/drivers/pci/pci.ids linux/drivers/pci/pci.ids
--- v2.4.8/linux/drivers/pci/pci.ids	Tue Jul  3 17:08:20 2001
+++ linux/drivers/pci/pci.ids	Sun Aug 12 17:37:53 2001
@@ -1561,8 +1561,8 @@
 		10b7 1000  3C905C-TX Fast Etherlink for PC Management NIC
 	9800  3c980-TX [Fast Etherlink XL Server Adapter]
 		10b7 9800  3c980-TX Fast Etherlink XL Server Adapter
-	9805  3c980-TX 10/100baseTX NIC [Python-T]
-		10b7 9805  3c980 10/100baseTX NIC [Python-T]
+	9805  3c982 Dual Port Server Cyclone
+		10b7 9805  3c982 Dual Port Server Cyclone
 10b8  Standard Microsystems Corp [SMC]
 	0005  83C170QF
 		1055 e000  LANEPIC
@@ -4270,6 +4270,9 @@
 1607  Lava Semiconductor Manufacturing Inc
 1608  Automated Wagering International
 1609  Scimetric Instruments Inc
+1619  FarSite Communications Ltd
+	0400  FarSync T2P (2 port X.21/V.35/V.24)
+	0440  FarSync T4P (4 port X.21/V.35/V.24)
 1668  Action Tec Electronics Inc
 1813  Ambient Technologies Inc
 1a08  Sierra semiconductor
diff -u --recursive --new-file v2.4.8/linux/drivers/pcmcia/bulkmem.c linux/drivers/pcmcia/bulkmem.c
--- v2.4.8/linux/drivers/pcmcia/bulkmem.c	Tue Mar  6 19:28:32 2001
+++ linux/drivers/pcmcia/bulkmem.c	Sun Aug 12 17:37:53 2001
@@ -211,7 +211,7 @@
     retry_erase((erase_busy_t *)arg, MTD_REQ_TIMEOUT);
 }
 
-static void setup_erase_request(client_handle_t handle, eraseq_entry_t *erase)
+static int setup_erase_request(client_handle_t handle, eraseq_entry_t *erase)
 {
     erase_busy_t *busy;
     region_info_t *info;
@@ -229,6 +229,8 @@
 	else {
 	    erase->State = 1;
 	    busy = kmalloc(sizeof(erase_busy_t), GFP_KERNEL);
+	    if (!busy)
+		return CS_GENERAL_FAILURE;
 	    busy->erase = erase;
 	    busy->client = handle;
 	    init_timer(&busy->timeout);
@@ -238,6 +240,7 @@
 	    retry_erase(busy, 0);
 	}
     }
+    return CS_SUCCESS;
 } /* setup_erase_request */
 
 /*======================================================================
@@ -322,7 +325,7 @@
     
 ======================================================================*/
 
-static void setup_regions(client_handle_t handle, int attr,
+static int setup_regions(client_handle_t handle, int attr,
 			  memory_handle_t *list)
 {
     int i, code, has_jedec, has_geo;
@@ -337,7 +340,7 @@
 
     code = (attr) ? CISTPL_DEVICE_A : CISTPL_DEVICE;
     if (read_tuple(handle, code, &device) != CS_SUCCESS)
-	return;
+	return CS_GENERAL_FAILURE;
     code = (attr) ? CISTPL_JEDEC_A : CISTPL_JEDEC_C;
     has_jedec = (read_tuple(handle, code, &jedec) == CS_SUCCESS);
     if (has_jedec && (device.ndev != jedec.nid)) {
@@ -360,6 +363,8 @@
 	if ((device.dev[i].type != CISTPL_DTYPE_NULL) &&
 	    (device.dev[i].size != 0)) {
 	    r = kmalloc(sizeof(*r), GFP_KERNEL);
+	    if (!r)
+		return CS_GENERAL_FAILURE;
 	    r->region_magic = REGION_MAGIC;
 	    r->state = 0;
 	    r->dev_info[0] = '\0';
@@ -384,6 +389,7 @@
 	}
 	offset += device.dev[i].size;
     }
+    return CS_SUCCESS;
 } /* setup_regions */
 
 /*======================================================================
@@ -417,8 +423,10 @@
     
     if ((handle->Attributes & INFO_MASTER_CLIENT) &&
 	(!(s->state & SOCKET_REGION_INFO))) {
-	setup_regions(handle, 0, &s->c_region);
-	setup_regions(handle, 1, &s->a_region);
+	if (setup_regions(handle, 0, &s->c_region) != CS_SUCCESS)
+	    return CS_GENERAL_FAILURE;
+	if (setup_regions(handle, 1, &s->a_region) != CS_SUCCESS)
+	    return CS_GENERAL_FAILURE;
 	s->state |= SOCKET_REGION_INFO;
     }
 
diff -u --recursive --new-file v2.4.8/linux/drivers/sbus/audio/audio.c linux/drivers/sbus/audio/audio.c
--- v2.4.8/linux/drivers/sbus/audio/audio.c	Tue Jul  3 17:08:20 2001
+++ linux/drivers/sbus/audio/audio.c	Sun Aug 12 10:38:48 2001
@@ -217,11 +217,6 @@
         return mask;
 }
 
-static loff_t sparcaudio_llseek(struct file * file, loff_t offset, int origin)
-{
-	return -ESPIPE;
-}
-
 static ssize_t sparcaudio_read(struct file * file, char *buf, 
                                size_t count, loff_t *ppos)
 {
@@ -1892,7 +1887,7 @@
 
 static struct file_operations sparcaudio_fops = {
 	owner:		THIS_MODULE,
-	llseek:		sparcaudio_llseek,
+	llseek:		no_llseek,
 	read:		sparcaudio_read,
 	write:		sparcaudio_write,
 	poll:		sparcaudio_poll,
diff -u --recursive --new-file v2.4.8/linux/drivers/sbus/char/aurora.c linux/drivers/sbus/char/aurora.c
--- v2.4.8/linux/drivers/sbus/char/aurora.c	Wed Jul 25 17:10:22 2001
+++ linux/drivers/sbus/char/aurora.c	Sun Aug 12 10:51:41 2001
@@ -1,7 +1,7 @@
 /*	$Id: aurora.c,v 1.14 2001/06/29 23:07:37 davem Exp $
  *	linux/drivers/sbus/char/aurora.c -- Aurora multiport driver
  *
- *	Copyright (c) 1999 by Oliver Aldulea (oli@bv.ro)
+ *	Copyright (c) 1999 by Oliver Aldulea (oli at bv dot ro)
  *
  *	This code is based on the RISCom/8 multiport serial driver written
  *	by Dmitry Gorodchanin (pgmdsg@ibi.com), based on the Linux serial
diff -u --recursive --new-file v2.4.8/linux/drivers/sbus/char/envctrl.c linux/drivers/sbus/char/envctrl.c
--- v2.4.8/linux/drivers/sbus/char/envctrl.c	Mon Mar 26 15:43:01 2001
+++ linux/drivers/sbus/char/envctrl.c	Sun Aug 12 11:23:32 2001
@@ -1,4 +1,4 @@
-/* $Id: envctrl.c,v 1.22 2001/03/25 09:12:15 davem Exp $
+/* $Id: envctrl.c,v 1.23 2001/08/09 23:42:09 davem Exp $
  * envctrl.c: Temperature and Fan monitoring on Machines providing it.
  *
  * Copyright (C) 1998  Eddie C. Dost  (ecd@skynet.be)
@@ -26,11 +26,16 @@
 #include <linux/miscdevice.h>
 #include <linux/mm.h>
 #include <linux/slab.h>
+#include <linux/kernel.h>
 
 #include <asm/ebus.h>
 #include <asm/uaccess.h>
 #include <asm/envctrl.h>
 
+#define __KERNEL_SYSCALLS__
+static int errno;
+#include <asm/unistd.h>
+
 #define ENVCTRL_MINOR	162
 
 #define PCF8584_ADDRESS	0x55
@@ -373,7 +378,7 @@
 /* Function Description: Read cpu-related data such as cpu temperature, voltage.
  * Return: Number of read bytes. Data is stored in bufdata in ascii format.
  */
-static int envctrl_read_cpu_info(struct i2c_child_t *pchild,
+static int envctrl_read_cpu_info(int cpu, struct i2c_child_t *pchild,
 				 char mon_type, unsigned char *bufdata)
 {
 	unsigned char data;
@@ -383,13 +388,13 @@
 	/* Find the right monitor type and channel. */
 	for (i = 0; i < PCF8584_MAX_CHANNELS; i++) {
 		if (pchild->mon_type[i] == mon_type) {
-			if (++j == read_cpu) {
+			if (++j == cpu) {
 				break;
 			}
 		}
 	}
 
-	if (j != read_cpu)
+	if (j != cpu)
 		return 0;
 
         /* Read data from address and port. */
@@ -588,7 +593,7 @@
 	case ENVCTRL_RD_CPU_TEMPERATURE:
 		if (!(pchild = envctrl_get_i2c_child(ENVCTRL_CPUTEMP_MON)))
 			return 0;
-		ret = envctrl_read_cpu_info(pchild, ENVCTRL_CPUTEMP_MON, data);
+		ret = envctrl_read_cpu_info(read_cpu, pchild, ENVCTRL_CPUTEMP_MON, data);
 
 		/* Reset cpu to the default cpu0. */
 		copy_to_user((unsigned char *)buf, data, ret);
@@ -597,7 +602,7 @@
 	case ENVCTRL_RD_CPU_VOLTAGE:
 		if (!(pchild = envctrl_get_i2c_child(ENVCTRL_CPUVOLTAGE_MON)))
 			return 0;
-		ret = envctrl_read_cpu_info(pchild, ENVCTRL_CPUVOLTAGE_MON, data);
+		ret = envctrl_read_cpu_info(read_cpu, pchild, ENVCTRL_CPUVOLTAGE_MON, data);
 
 		/* Reset cpu to the default cpu0. */
 		copy_to_user((unsigned char *)buf, data, ret);
@@ -976,6 +981,74 @@
 	return NULL;
 }
 
+static void envctrl_do_shutdown(void)
+{
+	static int inprog = 0;
+	static char *envp[] = {	
+		"HOME=/", "TERM=linux", "PATH=/sbin:/usr/sbin:/bin:/usr/bin", NULL };
+	char *argv[] = { 
+		"/sbin/shutdown", "-h", "now", NULL };	
+
+	if (inprog != 0)
+		return;
+
+	inprog = 1;
+	printk(KERN_CRIT "kenvctrld: WARNING: Shutting down the system now.\n");
+	if (0 > execve("/sbin/shutdown", argv, envp)) {
+		printk(KERN_CRIT "kenvctrld: WARNING: system shutdown failed!\n"); 
+		inprog = 0;  /* unlikely to succeed, but we could try again */
+	}
+}
+
+static struct task_struct *kenvctrld_task;
+
+static int kenvctrld(void *__unused)
+{
+	int poll_interval;
+	int whichcpu;
+	char tempbuf[10];
+	struct i2c_child_t *cputemp;
+
+	if (NULL == (cputemp = envctrl_get_i2c_child(ENVCTRL_CPUTEMP_MON))) {
+		printk(KERN_ERR 
+		       "envctrl: kenvctrld unable to monitor CPU temp-- exiting\n");
+		return -ENODEV;
+	}
+
+	poll_interval = 5 * HZ; /* TODO env_mon_interval */
+
+	daemonize();
+	strcpy(current->comm, "kenvctrld");
+	kenvctrld_task = current;
+
+	printk(KERN_INFO "envctrl: %s starting...\n", current->comm);
+	for (;;) {
+		current->state = TASK_INTERRUPTIBLE;
+		schedule_timeout(poll_interval);
+		current->state = TASK_RUNNING;
+
+		if(signal_pending(current))
+			break;
+
+		for (whichcpu = 0; whichcpu < ENVCTRL_MAX_CPU; ++whichcpu) {
+			if (0 < envctrl_read_cpu_info(whichcpu, cputemp,
+						      ENVCTRL_CPUTEMP_MON,
+						      tempbuf)) {
+				if (tempbuf[0] >= shutdown_temperature) {
+					printk(KERN_CRIT 
+						"%s: WARNING: CPU%i temperature %i C meets or exceeds "\
+						"shutdown threshold %i C\n", 
+						current->comm, whichcpu, 
+						tempbuf[0], shutdown_temperature);
+					envctrl_do_shutdown();
+				}
+			}
+		}
+	}
+	printk(KERN_INFO "envctrl: %s exiting...\n", current->comm);
+	return 0;
+}
+
 static int __init envctrl_init(void)
 {
 #ifdef CONFIG_PCI
@@ -1054,6 +1127,8 @@
 			i2c_childlist[i].addr, (0 == i) ? ("\n") : (" "));
 	}
 
+	kernel_thread(kenvctrld, NULL, CLONE_FS | CLONE_FILES);
+
 	return 0;
 #else
 	return -ENODEV;
@@ -1063,6 +1138,31 @@
 static void __exit envctrl_cleanup(void)
 {
 	int i;
+
+	if (NULL != kenvctrld_task) {
+		force_sig(SIGKILL, kenvctrld_task);
+		for (;;) {
+			struct task_struct *p;
+			int found = 0;
+
+			read_lock(&tasklist_lock);
+			for_each_task(p) {
+				if (p == kenvctrld_task) {
+					found = 1;
+					break;
+				}
+			}
+			read_unlock(&tasklist_lock);
+
+			if (!found)
+				break;
+
+			current->state = TASK_INTERRUPTIBLE;
+			schedule_timeout(HZ);
+			current->state = TASK_RUNNING;
+		}
+		kenvctrld_task = NULL;
+	}
 
 	iounmap(i2c);
 	misc_deregister(&envctrl_dev);
diff -u --recursive --new-file v2.4.8/linux/drivers/sbus/char/openprom.c linux/drivers/sbus/char/openprom.c
--- v2.4.8/linux/drivers/sbus/char/openprom.c	Fri Feb  9 11:30:23 2001
+++ linux/drivers/sbus/char/openprom.c	Sun Aug 12 10:38:48 2001
@@ -586,11 +586,6 @@
 	}
 }
 
-static long long openprom_lseek(struct file * file, long long offset, int origin)
-{
-	return -ESPIPE;
-}
-
 static int openprom_open(struct inode * inode, struct file * file)
 {
 	DATA *data;
@@ -614,7 +609,7 @@
 
 static struct file_operations openprom_fops = {
 	owner:		THIS_MODULE,
-	llseek:		openprom_lseek,
+	llseek:		no_llseek,
 	ioctl:		openprom_ioctl,
 	open:		openprom_open,
 	release:	openprom_release,
diff -u --recursive --new-file v2.4.8/linux/drivers/sbus/char/rtc.c linux/drivers/sbus/char/rtc.c
--- v2.4.8/linux/drivers/sbus/char/rtc.c	Sun Mar 25 18:14:20 2001
+++ linux/drivers/sbus/char/rtc.c	Sun Aug 12 10:38:48 2001
@@ -81,11 +81,6 @@
 	spin_unlock_irq(&mostek_lock);
 }
 
-static long long rtc_lseek(struct file *file, long long offset, int origin)
-{
-	return -ESPIPE;
-}
-
 static int rtc_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
 	unsigned long arg)
 {
@@ -143,7 +138,7 @@
 
 static struct file_operations rtc_fops = {
 	owner:		THIS_MODULE,
-	llseek:		rtc_lseek,
+	llseek:		no_llseek,
 	ioctl:		rtc_ioctl,
 	open:		rtc_open,
 	release:	rtc_release,
diff -u --recursive --new-file v2.4.8/linux/drivers/sbus/char/uctrl.c linux/drivers/sbus/char/uctrl.c
--- v2.4.8/linux/drivers/sbus/char/uctrl.c	Sun Feb 18 19:49:55 2001
+++ linux/drivers/sbus/char/uctrl.c	Sun Aug 12 10:38:48 2001
@@ -198,12 +198,6 @@
 void uctrl_get_event_status(void);
 void uctrl_get_external_status(void);
 
-static loff_t
-uctrl_llseek(struct file *file, loff_t offset, int type)
-{
-	return -ESPIPE;
-}
-
 static int
 uctrl_ioctl(struct inode *inode, struct file *file,
 	      unsigned int cmd, unsigned long arg)
@@ -231,7 +225,7 @@
 
 static struct file_operations uctrl_fops = {
 	owner:		THIS_MODULE,
-	llseek:		uctrl_llseek,
+	llseek:		no_llseek,
 	ioctl:		uctrl_ioctl,
 	open:		uctrl_open,
 };
diff -u --recursive --new-file v2.4.8/linux/drivers/sbus/char/vfc_dev.c linux/drivers/sbus/char/vfc_dev.c
--- v2.4.8/linux/drivers/sbus/char/vfc_dev.c	Tue Mar  6 22:44:16 2001
+++ linux/drivers/sbus/char/vfc_dev.c	Sun Aug 12 10:38:48 2001
@@ -642,15 +642,9 @@
 }
 
 
-static int vfc_lseek(struct inode *inode, struct file *file, 
-		     off_t offset, int origin) 
-{
-	return -ESPIPE;
-}
-
 static struct file_operations vfc_fops = {
 	owner:		THIS_MODULE,
-	llseek:		vfc_lseek,
+	llseek:		no_llseek,
 	ioctl:		vfc_ioctl,
 	mmap:		vfc_mmap,
 	open:		vfc_open,
diff -u --recursive --new-file v2.4.8/linux/drivers/scsi/advansys.c linux/drivers/scsi/advansys.c
--- v2.4.8/linux/drivers/scsi/advansys.c	Fri Apr 27 13:59:18 2001
+++ linux/drivers/scsi/advansys.c	Sun Aug 12 17:37:53 2001
@@ -789,7 +789,7 @@
 #include <linux/types.h>
 #include <linux/ioport.h>
 #include <linux/delay.h>
-#include <linux/malloc.h>
+#include <linux/slab.h>
 #include <linux/mm.h>
 #include <linux/proc_fs.h>
 #include <linux/init.h>
diff -u --recursive --new-file v2.4.8/linux/drivers/scsi/aic7xxx/Makefile linux/drivers/scsi/aic7xxx/Makefile
--- v2.4.8/linux/drivers/scsi/aic7xxx/Makefile	Fri May  4 15:16:28 2001
+++ linux/drivers/scsi/aic7xxx/Makefile	Sun Aug 12 10:51:42 2001
@@ -10,14 +10,23 @@
 
 obj-$(CONFIG_SCSI_AIC7XXX)	+= aic7xxx_mod.o
 
+#EXTRA_CFLAGS += -g
+
 # Platform Specific Files
-AIC7XXX_OBJS = aic7xxx_linux.o aic7xxx_linux_pci.o
+AIC7XXX_OBJS = aic7xxx_linux.o 
 AIC7XXX_OBJS += aic7xxx_proc.o aic7770_linux.o
+#PCI Specific Platform Files
+ifeq ($(CONFIG_PCI),y)
+AIC7XXX_OBJS += aic7xxx_linux_pci.o
+endif
 # Core Files
-AIC7XXX_OBJS += aic7xxx.o aic7xxx_pci.o aic7xxx_93cx6.o aic7770.o
+AIC7XXX_OBJS += aic7xxx.o aic7xxx_93cx6.o aic7770.o
+#PCI Specific Core Files
+ifeq ($(CONFIG_PCI),y)
+AIC7XXX_OBJS += aic7xxx_pci.o
+endif
 
 # Override our module desitnation
-MOD_DESTDIR = $(shell cd .. && $(CONFIG_SHELL) $(TOPDIR)/scripts/pathdown.sh)
 MOD_TARGET = aic7xxx.o
 
 include $(TOPDIR)/Rules.make
@@ -28,9 +37,6 @@
 ifeq ($(CONFIG_AIC7XXX_BUILD_FIRMWARE),y)
 aic7xxx_seq.h aic7xxx_reg.h: aic7xxx.seq aic7xxx.reg aicasm/aicasm
 	aicasm/aicasm -I. -r aic7xxx_reg.h -o aic7xxx_seq.h aic7xxx.seq
-else
-aic7xxx_seq.h aic7xxx_reg.h: aic7xxx.seq aic7xxx.reg
-	echo "Warning, generated aic7xxx firmware files may be out of date!\n"
 endif
 
 aicasm/aicasm: aicasm/*.[chyl]
diff -u --recursive --new-file v2.4.8/linux/drivers/scsi/aic7xxx/aic7770.c linux/drivers/scsi/aic7xxx/aic7770.c
--- v2.4.8/linux/drivers/scsi/aic7xxx/aic7770.c	Fri May  4 15:16:28 2001
+++ linux/drivers/scsi/aic7xxx/aic7770.c	Sun Aug 12 17:37:53 2001
@@ -15,7 +15,7 @@
  *    derived from this software without specific prior written permission.
  *
  * Alternatively, this software may be distributed under the terms of the
- * GNU Public License ("GPL").
+ * GNU General Public License ("GPL").
  *
  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
@@ -29,7 +29,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $Id: //depot/src/aic7xxx/aic7770.c#11 $
+ * $Id: //depot/src/aic7xxx/aic7770.c#12 $
  *
  * $FreeBSD: src/sys/dev/aic7xxx/aic7770.c,v 1.1 2000/09/16 20:02:27 gibbs Exp $
  */
@@ -90,14 +90,12 @@
 int
 aic7770_config(struct ahc_softc *ahc, struct aic7770_identity *entry)
 {
-	struct	ahc_probe_config probe_config;
 	int	error;
 	u_int	hostconf;
 	u_int   irq;
 	u_int	intdef;
 
-	ahc_init_probe_config(&probe_config);
-	error = entry->setup(ahc->dev_softc, &probe_config);
+	error = entry->setup(ahc);
 	if (error != 0)
 		return (error);
 
@@ -105,8 +103,8 @@
 	if (error != 0)
 		return (error);
 
-	probe_config.description = entry->name;
-	error = ahc_softc_init(ahc, &probe_config);
+	ahc->description = entry->name;
+	error = ahc_softc_init(ahc);
 
 	error = ahc_reset(ahc);
 	if (error != 0)
@@ -131,7 +129,7 @@
 	if ((intdef & EDGE_TRIG) != 0)
 		ahc->flags |= AHC_EDGE_INTERRUPT;
 
-	switch (probe_config.chip & (AHC_EISA|AHC_VL)) {
+	switch (ahc->chip & (AHC_EISA|AHC_VL)) {
 	case AHC_EISA:
 	{
 		u_int biosctrl;
@@ -312,34 +310,33 @@
 }
 
 static int
-ahc_aic7770_VL_setup(ahc_dev_softc_t dev, struct ahc_probe_config *probe_config)
+ahc_aic7770_VL_setup(struct ahc_softc *ahc)
 {
 	int error;
 
-	error = ahc_aic7770_setup(dev, probe_config);
-	probe_config->chip |= AHC_VL;
+	error = ahc_aic7770_setup(ahc);
+	ahc->chip |= AHC_VL;
 	return (error);
 }
 
 static int
-ahc_aic7770_EISA_setup(ahc_dev_softc_t dev,
-		       struct ahc_probe_config *probe_config)
+ahc_aic7770_EISA_setup(struct ahc_softc *ahc)
 {
 	int error;
 
-	error = ahc_aic7770_setup(dev, probe_config);
-	probe_config->chip |= AHC_EISA;
+	error = ahc_aic7770_setup(ahc);
+	ahc->chip |= AHC_EISA;
 	return (error);
 }
 
 static int
-ahc_aic7770_setup(ahc_dev_softc_t dev, struct ahc_probe_config *probe_config)
+ahc_aic7770_setup(struct ahc_softc *ahc)
 {
-	probe_config->channel = 'A';
-	probe_config->channel_b = 'B';
-	probe_config->chip = AHC_AIC7770;
-	probe_config->features = AHC_AIC7770_FE;
-	probe_config->bugs |= AHC_TMODE_WIDEODD_BUG;
-	probe_config->flags |= AHC_PAGESCBS;
+	ahc->channel = 'A';
+	ahc->channel_b = 'B';
+	ahc->chip = AHC_AIC7770;
+	ahc->features = AHC_AIC7770_FE;
+	ahc->bugs |= AHC_TMODE_WIDEODD_BUG;
+	ahc->flags |= AHC_PAGESCBS;
 	return (0);
 }
diff -u --recursive --new-file v2.4.8/linux/drivers/scsi/aic7xxx/aic7770_linux.c linux/drivers/scsi/aic7xxx/aic7770_linux.c
--- v2.4.8/linux/drivers/scsi/aic7xxx/aic7770_linux.c	Fri May  4 15:16:28 2001
+++ linux/drivers/scsi/aic7xxx/aic7770_linux.c	Sun Aug 12 17:37:53 2001
@@ -14,7 +14,7 @@
  *    derived from this software without specific prior written permission.
  *
  * Alternatively, this software may be distributed under the terms of the
- * GNU Public License ("GPL").
+ * GNU General Public License ("GPL").
  *
  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
diff -u --recursive --new-file v2.4.8/linux/drivers/scsi/aic7xxx/aic7xxx.c linux/drivers/scsi/aic7xxx/aic7xxx.c
--- v2.4.8/linux/drivers/scsi/aic7xxx/aic7xxx.c	Sun Aug 12 13:28:00 2001
+++ linux/drivers/scsi/aic7xxx/aic7xxx.c	Sun Aug 12 17:37:53 2001
@@ -14,7 +14,7 @@
  *    derived from this software without specific prior written permission.
  *
  * Alternatively, this software may be distributed under the terms of the
- * GNU Public License ("GPL").
+ * GNU General Public License ("GPL").
  *
  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
@@ -28,7 +28,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $Id: //depot/src/aic7xxx/aic7xxx.c#39 $
+ * $Id: //depot/src/aic7xxx/aic7xxx.c#44 $
  *
  * $FreeBSD: src/sys/dev/aic7xxx/aic7xxx.c,v 1.61 2000/11/13 03:35:43 gibbs Exp $
  */
@@ -179,6 +179,7 @@
 					      struct ahc_devinfo *devinfo);
 static void		ahc_handle_ign_wide_residue(struct ahc_softc *ahc,
 						struct ahc_devinfo *devinfo);
+static void		ahc_reinitialize_dataptrs(struct ahc_softc *ahc);
 static void		ahc_handle_devreset(struct ahc_softc *ahc,
 					    struct ahc_devinfo *devinfo,
 					    cam_status status, char *message,
@@ -282,6 +283,7 @@
 	struct scb *scb;
 	u_int  scb_index;
 
+	ahc_sync_qoutfifo(ahc, BUS_DMASYNC_POSTREAD);
 	while (ahc->qoutfifo[ahc->qoutfifonext] != SCB_LIST_NULL) {
 
 		scb_index = ahc->qoutfifo[ahc->qoutfifonext];
@@ -290,13 +292,17 @@
 
 			/*
 			 * Clear 32bits of QOUTFIFO at a time
-			 * so that we don't clobber an incomming
+			 * so that we don't clobber an incoming
 			 * byte DMA to the array on architectures
 			 * that only support 32bit load and store
 			 * operations.
 			 */
 			modnext = ahc->qoutfifonext & ~0x3;
 			*((uint32_t *)(&ahc->qoutfifo[modnext])) = 0xFFFFFFFFUL;
+			ahc_dmamap_sync(ahc, ahc->shared_data_dmat,
+					ahc->shared_data_dmamap,
+					/*offset*/modnext, /*len*/4,
+					BUS_DMASYNC_PREREAD);
 		}
 		ahc->qoutfifonext++;
 
@@ -624,6 +630,9 @@
 	case IGN_WIDE_RES:
 		ahc_handle_ign_wide_residue(ahc, &devinfo);
 		break;
+	case PDATA_REINIT:
+		ahc_reinitialize_dataptrs(ahc);
+		break;
 	case BAD_PHASE:
 	{
 		u_int lastphase;
@@ -777,8 +786,11 @@
 		       ahc_get_transfer_length(scb), scb->sg_count);
 		if (scb->sg_count > 0) {
 			for (i = 0; i < scb->sg_count; i++) {
-				printf("sg[%d] - Addr 0x%x : Length %d\n",
+
+				printf("sg[%d] - Addr 0x%x%x : Length %d\n",
 				       i,
+				       (ahc_le32toh(scb->sg_list[i].len) >> 24
+				        & SG_HIGH_ADDR_BITS),
 				       ahc_le32toh(scb->sg_list[i].addr),
 				       ahc_le32toh(scb->sg_list[i].len)
 				       & AHC_SG_LEN_MASK);
@@ -791,6 +803,26 @@
 		ahc_freeze_devq(ahc, scb);
 		ahc_set_transaction_status(scb, CAM_DATA_RUN_ERR);
 		ahc_freeze_scb(scb);
+
+		if ((ahc->features & AHC_ULTRA2) != 0) {
+			/*
+			 * Clear the channel in case we return
+			 * to data phase later.
+			 */
+			ahc_outb(ahc, SXFRCTL0,
+				 ahc_inb(ahc, SXFRCTL0) | CLRSTCNT|CLRCHN);
+			ahc_outb(ahc, SXFRCTL0,
+				 ahc_inb(ahc, SXFRCTL0) | CLRSTCNT|CLRCHN);
+		}
+		if ((ahc->flags & AHC_39BIT_ADDRESSING) != 0) {
+			u_int dscommand1;
+
+			/* Ensure HHADDR is 0 for future DMA operations. */
+			dscommand1 = ahc_inb(ahc, DSCOMMAND1);
+			ahc_outb(ahc, DSCOMMAND1, dscommand1 | HADDLDSEL0);
+			ahc_outb(ahc, HADDR, 0);
+			ahc_outb(ahc, DSCOMMAND1, dscommand1);
+		}
 		break;
 	}
 	case MKMSG_FAILED:
@@ -1049,7 +1081,7 @@
 		/*
 		 * Although the driver does not care about the
 		 * 'Selection in Progress' status bit, the busy
-		 * LED does.  SELINGO is only cleared by a sucessful
+		 * LED does.  SELINGO is only cleared by a sucessfull
 		 * selection, so we must manually clear it to insure
 		 * the LED turns off just incase no future successful
 		 * selections occur (e.g. no devices on the bus).
@@ -1269,6 +1301,13 @@
 		seqaddr = ahc_inb(ahc, SEQADDR0)
 			| (ahc_inb(ahc, SEQADDR1) << 8);
 
+		/*
+		 * Seqaddr represents the next instruction to execute, 
+		 * so we are really executing the instruction just
+		 * before it.
+		 */
+		if (seqaddr != 0)
+			seqaddr -= 1;
 		cs = ahc->critical_sections;
 		for (i = 0; i < ahc->num_critical_sections; i++, cs++) {
 			
@@ -1338,7 +1377,7 @@
 	struct hardware_scb *hscb = scb->hscb;
 
 	printf("scb:%p control:0x%x scsiid:0x%x lun:%d cdb_len:%d\n",
-	       scb,
+	       (void *)scb,
 	       hscb->control,
 	       hscb->scsiid,
 	       hscb->lun,
@@ -1365,8 +1404,10 @@
 		hscb->tag);
 	if (scb->sg_count > 0) {
 		for (i = 0; i < scb->sg_count; i++) {
-			printf("sg[%d] - Addr 0x%x : Length %d\n",
+			printf("sg[%d] - Addr 0x%x%x : Length %d\n",
 			       i,
+			       (ahc_le32toh(scb->sg_list[i].len) >> 24
+			        & SG_HIGH_ADDR_BITS),
 			       ahc_le32toh(scb->sg_list[i].addr),
 			       ahc_le32toh(scb->sg_list[i].len));
 		}
@@ -1470,8 +1511,7 @@
 			/* Can't do DT on an SE bus */
 			*ppr_options &= ~MSG_EXT_PPR_DT_REQ;
 		}
-	} else if ((ahc->features & AHC_ULTRA) != 0
-		&& (ahc->flags & AHC_ULTRA_DISABLED) == 0) {
+	} else if ((ahc->features & AHC_ULTRA) != 0) {
 		maxsync = AHC_SYNCRATE_ULTRA;
 	} else {
 		maxsync = AHC_SYNCRATE_FAST;
@@ -1911,7 +1951,7 @@
 		struct hardware_scb *pending_hscb;
 		struct ahc_initiator_tinfo *tinfo;
 		struct ahc_tmode_tstate *tstate;
-		
+
 		ahc_scb_devinfo(ahc, &devinfo, pending_scb);
 		tinfo = ahc_fetch_transinfo(ahc, devinfo.channel,
 					    devinfo.our_scsiid,
@@ -1927,6 +1967,8 @@
 			pending_scb->flags &= ~SCB_AUTO_NEGOTIATE;
 			pending_hscb->control &= ~MK_MESSAGE;
 		}
+		ahc_sync_scb(ahc, pending_scb,
+			     BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
 		pending_scb_count++;
 	}
 
@@ -2181,6 +2223,9 @@
 	 */
 	period = tinfo->goal.period;
 	ppr_options = tinfo->goal.ppr_options;
+	/* Target initiated PPR is not allowed in the SCSI spec */
+	if (devinfo->role == ROLE_TARGET)
+		ppr_options = 0;
 	rate = ahc_devlimited_syncrate(ahc, tinfo, &period,
 				       &ppr_options, devinfo->role);
 	dowide = tinfo->curr.width != tinfo->goal.width;
@@ -2615,7 +2660,7 @@
 }
 
 /*
- * Wait for a complete incomming message, parse it, and respond accordingly.
+ * Wait for a complete incoming message, parse it, and respond accordingly.
  */
 static int
 ahc_parse_msg(struct ahc_softc *ahc, struct ahc_devinfo *devinfo)
@@ -3208,13 +3253,15 @@
 			struct ahc_dma_seg *sg;
 			uint32_t data_cnt;
 			uint32_t data_addr;
+			uint32_t sglen;
 
 			/* Pull in the rest of the sgptr */
 			sgptr |= (ahc_inb(ahc, SCB_RESIDUAL_SGPTR + 3) << 24)
 			      | (ahc_inb(ahc, SCB_RESIDUAL_SGPTR + 2) << 16)
 			      | (ahc_inb(ahc, SCB_RESIDUAL_SGPTR + 1) << 8);
 			sgptr &= SG_PTR_MASK;
-			data_cnt = (ahc_inb(ahc, SCB_RESIDUAL_DATACNT+2) << 16)
+			data_cnt = (ahc_inb(ahc, SCB_RESIDUAL_DATACNT+3) << 24)
+				 | (ahc_inb(ahc, SCB_RESIDUAL_DATACNT+2) << 16)
 				 | (ahc_inb(ahc, SCB_RESIDUAL_DATACNT+1) << 8)
 				 | (ahc_inb(ahc, SCB_RESIDUAL_DATACNT));
 
@@ -3232,13 +3279,19 @@
 			 * to load so we must go back one.
 			 */
 			sg--;
+			sglen = ahc_le32toh(sg->len) & AHC_SG_LEN_MASK;
 			if (sg != scb->sg_list
-			 && (sg->len & AHC_SG_LEN_MASK) < data_cnt) {
+			 && sglen < (data_cnt & AHC_SG_LEN_MASK)) {
 
 				sg--;
-				data_cnt = 1 | (sg->len & AHC_DMA_LAST_SEG);
-				data_addr = sg->addr
-					  + (sg->len & AHC_SG_LEN_MASK) - 1;
+				sglen = ahc_le32toh(sg->len);
+				/*
+				 * Preserve High Address and SG_LIST bits
+				 * while setting the count to 1.
+				 */
+				data_cnt = 1 | (sglen & (~AHC_SG_LEN_MASK));
+				data_addr = ahc_le32toh(sg->addr)
+					  + (sglen & AHC_SG_LEN_MASK) - 1;
 
 				/*
 				 * Increment sg so it points to the
@@ -3255,31 +3308,72 @@
 				ahc_outb(ahc, SCB_RESIDUAL_SGPTR, sgptr);
 			}
 
-/* XXX What about high address byte??? */
 			ahc_outb(ahc, SCB_RESIDUAL_DATACNT + 3, data_cnt >> 24);
 			ahc_outb(ahc, SCB_RESIDUAL_DATACNT + 2, data_cnt >> 16);
 			ahc_outb(ahc, SCB_RESIDUAL_DATACNT + 1, data_cnt >> 8);
 			ahc_outb(ahc, SCB_RESIDUAL_DATACNT, data_cnt);
-
-/* XXX Perhaps better to just keep the saved address in sram */
-			if ((ahc->features & AHC_ULTRA2) != 0) {
-				ahc_outb(ahc, HADDR + 3, data_addr >> 24);
-				ahc_outb(ahc, HADDR + 2, data_addr >> 16);
-				ahc_outb(ahc, HADDR + 1, data_addr >> 8);
-				ahc_outb(ahc, HADDR, data_addr);
-				ahc_outb(ahc, DFCNTRL, PRELOADEN);
-				ahc_outb(ahc, SXFRCTL0,
-					 ahc_inb(ahc, SXFRCTL0) | CLRCHN);
-			} else {
-				ahc_outb(ahc, HADDR + 3, data_addr >> 24);
-				ahc_outb(ahc, HADDR + 2, data_addr >> 16);
-				ahc_outb(ahc, HADDR + 1, data_addr >> 8);
-				ahc_outb(ahc, HADDR, data_addr);
-			}
 		}
 	}
 }
 
+
+/*
+ * Reinitialize the data pointers for the active transfer
+ * based on its current residual.
+ */
+static void
+ahc_reinitialize_dataptrs(struct ahc_softc *ahc)
+{
+	struct	 scb *scb;
+	struct	 ahc_dma_seg *sg;
+	u_int	 scb_index;
+	uint32_t sgptr;
+	uint32_t resid;
+	uint32_t dataptr;
+
+	scb_index = ahc_inb(ahc, SCB_TAG);
+	scb = ahc_lookup_scb(ahc, scb_index);
+	sgptr = (ahc_inb(ahc, SCB_RESIDUAL_SGPTR + 3) << 24)
+	      | (ahc_inb(ahc, SCB_RESIDUAL_SGPTR + 2) << 16)
+	      | (ahc_inb(ahc, SCB_RESIDUAL_SGPTR + 1) << 8)
+	      |	ahc_inb(ahc, SCB_RESIDUAL_SGPTR);
+
+	sgptr &= SG_PTR_MASK;
+	sg = ahc_sg_bus_to_virt(scb, sgptr);
+
+	/* The residual sg_ptr always points to the next sg */
+	sg--;
+
+	resid = (ahc_inb(ahc, SCB_RESIDUAL_DATACNT + 2) << 16)
+	      | (ahc_inb(ahc, SCB_RESIDUAL_DATACNT + 1) << 8)
+	      | ahc_inb(ahc, SCB_RESIDUAL_DATACNT);
+
+	dataptr = ahc_le32toh(sg->addr)
+		+ (ahc_le32toh(sg->len) & AHC_SG_LEN_MASK)
+		- resid;
+	if ((ahc->flags & AHC_39BIT_ADDRESSING) != 0) {
+		u_int dscommand1;
+
+		dscommand1 = ahc_inb(ahc, DSCOMMAND1);
+		ahc_outb(ahc, DSCOMMAND1, dscommand1 | HADDLDSEL0);
+		ahc_outb(ahc, HADDR,
+			 (ahc_le32toh(sg->len) >> 24) & SG_HIGH_ADDR_BITS);
+		ahc_outb(ahc, DSCOMMAND1, dscommand1);
+	}
+	ahc_outb(ahc, HADDR + 3, dataptr >> 24);
+	ahc_outb(ahc, HADDR + 2, dataptr >> 16);
+	ahc_outb(ahc, HADDR + 1, dataptr >> 8);
+	ahc_outb(ahc, HADDR, dataptr);
+	ahc_outb(ahc, HCNT + 2, resid >> 16);
+	ahc_outb(ahc, HCNT + 1, resid >> 8);
+	ahc_outb(ahc, HCNT, resid);
+	if ((ahc->features & AHC_ULTRA2) == 0) {
+		ahc_outb(ahc, STCNT + 2, resid >> 16);
+		ahc_outb(ahc, STCNT + 1, resid >> 8);
+		ahc_outb(ahc, STCNT, resid);
+	}
+}
+
 /*
  * Handle the effects of issuing a bus device reset message.
  */
@@ -3385,6 +3479,14 @@
 	/* We don't know our unit number until the OSM sets it */
 	ahc->name = name;
 	ahc->unit = -1;
+	ahc->description = NULL;
+	ahc->channel = 'A';
+	ahc->channel_b = 'B';
+	ahc->chip = AHC_NONE;
+	ahc->features = AHC_FENONE;
+	ahc->bugs = AHC_BUGNONE;
+	ahc->flags = AHC_FNONE;
+
 	for (i = 0; i < 16; i++)
 		TAILQ_INIT(&ahc->untagged_queues[i]);
 	if (ahc_platform_alloc(ahc, platform_arg) != 0) {
@@ -3395,21 +3497,14 @@
 }
 
 int
-ahc_softc_init(struct ahc_softc *ahc, struct ahc_probe_config *config)
+ahc_softc_init(struct ahc_softc *ahc)
 {
 
-	ahc->chip = config->chip;
-	ahc->features = config->features;
-	ahc->bugs = config->bugs;
-	ahc->flags = config->flags;
-	ahc->channel = config->channel; 
-	ahc->unpause = (ahc_inb(ahc, HCNTRL) & IRQMS);
-	ahc->description = config->description;
 	/* The IRQMS bit is only valid on VL and EISA chips */
 	if ((ahc->chip & AHC_PCI) != 0)
 		ahc->unpause &= ~IRQMS;
 	ahc->pause = ahc->unpause | PAUSE; 
-	/* XXX The shared scb data stuff should be depricated */
+	/* XXX The shared scb data stuff should be deprecated */
 	if (ahc->scb_data == NULL) {
 		ahc->scb_data = malloc(sizeof(*ahc->scb_data),
 				       M_DEVBUF, M_NOWAIT);
@@ -3697,18 +3792,6 @@
 	return (i);
 }
 
-void
-ahc_init_probe_config(struct ahc_probe_config *probe_config)
-{
-	probe_config->description = NULL;
-	probe_config->channel = 'A';
-	probe_config->channel_b = 'B';
-	probe_config->chip = AHC_NONE;
-	probe_config->features = AHC_FENONE;
-	probe_config->bugs = AHC_BUGNONE;
-	probe_config->flags = AHC_FNONE;
-}
-
 static void
 ahc_dmamap_cb(void *arg, bus_dma_segment_t *segs, int nseg, int error) 
 {
@@ -3794,7 +3877,8 @@
 
 	/* DMA tag for our hardware scb structures */
 	if (ahc_dma_tag_create(ahc, ahc->parent_dmat, /*alignment*/1,
-			       /*boundary*/0, /*lowaddr*/BUS_SPACE_MAXADDR,
+			       /*boundary*/BUS_SPACE_MAXADDR_32BIT + 1,
+			       /*lowaddr*/BUS_SPACE_MAXADDR_32BIT,
 			       /*highaddr*/BUS_SPACE_MAXADDR,
 			       /*filter*/NULL, /*filterarg*/NULL,
 			       AHC_SCB_MAX * sizeof(struct hardware_scb),
@@ -3806,7 +3890,7 @@
 
 	scb_data->init_level++;
 
-	/* Allocation for our ccbs */
+	/* Allocation for our hscbs */
 	if (ahc_dmamem_alloc(ahc, scb_data->hscb_dmat,
 			     (void **)&scb_data->hscbs,
 			     BUS_DMA_NOWAIT, &scb_data->hscb_dmamap) != 0) {
@@ -3825,7 +3909,8 @@
 
 	/* DMA tag for our sense buffers */
 	if (ahc_dma_tag_create(ahc, ahc->parent_dmat, /*alignment*/1,
-			       /*boundary*/0, /*lowaddr*/BUS_SPACE_MAXADDR,
+			       /*boundary*/BUS_SPACE_MAXADDR_32BIT + 1,
+			       /*lowaddr*/BUS_SPACE_MAXADDR_32BIT,
 			       /*highaddr*/BUS_SPACE_MAXADDR,
 			       /*filter*/NULL, /*filterarg*/NULL,
 			       AHC_SCB_MAX * sizeof(struct scsi_sense_data),
@@ -3856,7 +3941,8 @@
 
 	/* DMA tag for our S/G structures.  We allocate in page sized chunks */
 	if (ahc_dma_tag_create(ahc, ahc->parent_dmat, /*alignment*/1,
-			       /*boundary*/0, /*lowaddr*/BUS_SPACE_MAXADDR,
+			       /*boundary*/BUS_SPACE_MAXADDR_32BIT + 1,
+			       /*lowaddr*/BUS_SPACE_MAXADDR_32BIT,
 			       /*highaddr*/BUS_SPACE_MAXADDR,
 			       /*filter*/NULL, /*filterarg*/NULL,
 			       PAGE_SIZE, /*nsegments*/1,
@@ -3999,6 +4085,7 @@
 		if (pdata == NULL)
 			break;
 		next_scb->platform_data = pdata;
+		next_scb->sg_map = sg_map;
 		next_scb->sg_list = segs;
 		/*
 		 * The sequencer always starts with the second entry.
@@ -4126,7 +4213,8 @@
 #ifndef __linux__
 	/* DMA tag for mapping buffers into device visible space. */
 	if (ahc_dma_tag_create(ahc, ahc->parent_dmat, /*alignment*/1,
-			       /*boundary*/0, /*lowaddr*/BUS_SPACE_MAXADDR,
+			       /*boundary*/BUS_SPACE_MAXADDR_32BIT + 1,
+			       /*lowaddr*/BUS_SPACE_MAXADDR,
 			       /*highaddr*/BUS_SPACE_MAXADDR,
 			       /*filter*/NULL, /*filterarg*/NULL,
 			       /*maxsize*/MAXBSIZE, /*nsegments*/AHC_NSEG,
@@ -4153,7 +4241,8 @@
 		driver_data_size += AHC_TMODE_CMDS * sizeof(struct target_cmd)
 				 + /*DMA WideOdd Bug Buffer*/1;
 	if (ahc_dma_tag_create(ahc, ahc->parent_dmat, /*alignment*/1,
-			       /*boundary*/0, /*lowaddr*/BUS_SPACE_MAXADDR,
+			       /*boundary*/BUS_SPACE_MAXADDR_32BIT + 1,
+			       /*lowaddr*/BUS_SPACE_MAXADDR_32BIT,
 			       /*highaddr*/BUS_SPACE_MAXADDR,
 			       /*filter*/NULL, /*filterarg*/NULL,
 			       driver_data_size,
@@ -4187,6 +4276,7 @@
 		/* All target command blocks start out invalid. */
 		for (i = 0; i < AHC_TMODE_CMDS; i++)
 			ahc->targetcmds[i].cmd_valid = 0;
+		ahc_sync_tqinfifo(ahc, BUS_DMASYNC_PREREAD);
 		ahc->tqinfifonext = 1;
 		ahc_outb(ahc, KERNEL_TQINPOS, ahc->tqinfifonext - 1);
 		ahc_outb(ahc, TQINPOS, ahc->tqinfifonext);
@@ -4306,8 +4396,6 @@
 			ultraenb = (ahc_inb(ahc, ULTRA_ENB + 1) << 8)
 				      | ahc_inb(ahc, ULTRA_ENB);
 	}
-	if ((ahc->flags & AHC_ULTRA_DISABLED) != 0)
-		ultraenb = 0;
 
 	if ((ahc->features & (AHC_WIDE|AHC_TWIN)) == 0)
 		max_targ = 7;
@@ -4433,6 +4521,7 @@
 	/* All of our queues are empty */
 	for (i = 0; i < 256; i++)
 		ahc->qoutfifo[i] = SCB_LIST_NULL;
+	ahc_sync_qoutfifo(ahc, BUS_DMASYNC_PREREAD);
 
 	for (i = 0; i < 256; i++)
 		ahc->qinfifo[i] = SCB_LIST_NULL;
@@ -4898,12 +4987,16 @@
 ahc_qinfifo_requeue(struct ahc_softc *ahc, struct scb *prev_scb,
 		    struct scb *scb)
 {
-	if (prev_scb == NULL)
+	if (prev_scb == NULL) {
 		ahc_outb(ahc, NEXT_QUEUED_SCB, scb->hscb->tag);
-	else
+	} else {
 		prev_scb->hscb->next = scb->hscb->tag;
+		ahc_sync_scb(ahc, prev_scb, 
+			     BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
+	}
 	ahc->qinfifo[ahc->qinfifonext++] = scb->hscb->tag;
 	scb->hscb->next = ahc->next_queued_scb->hscb->tag;
+	ahc_sync_scb(ahc, scb, BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
 }
 
 static int
@@ -4967,6 +5060,12 @@
 
 	while (qinpos != qintail) {
 		scb = ahc_lookup_scb(ahc, ahc->qinfifo[qinpos]);
+		if (scb == NULL) {
+			printf("qinpos = %d, SCB index = %d\n",
+				qinpos, ahc->qinfifo[qinpos]);
+			panic("Loop 1\n");
+		}
+
 		if (ahc_match_scb(ahc, scb, target, channel, lun, tag, role)) {
 			/*
 			 * We found an scb that needs to be acted on.
@@ -5028,6 +5127,11 @@
 		 */
 		scb = ahc_lookup_scb(ahc, ahc->qinfifo[qinstart]);
 
+		if (scb == NULL) {
+			printf("found = %d, qinstart = %d, qinfifionext = %d\n",
+				found, qinstart, ahc->qinfifonext);
+			panic("First/Second Qinfifo fixup\n");
+		}
 		/*
 		 * ahc_swap_with_next_hscb forces our next pointer to
 		 * point to the reserved SCB for future commands.  Save
@@ -5069,6 +5173,11 @@
 			panic("for safety");
 		}
 		scb = ahc_lookup_scb(ahc, scb_index);
+		if (scb == NULL) {
+			printf("scb_index = %d, next = %d\n",
+				scb_index, next);
+			panic("Waiting List traversal\n");
+		}
 		if (ahc_match_scb(ahc, scb, target, channel,
 				  lun, SCB_LIST_NULL, role)) {
 			/*
@@ -5442,7 +5551,7 @@
 	 * Go through the pending CCB list and look for
 	 * commands for this target that are still active.
 	 * These are other tagged commands that were
-	 * disconnected when the reset occured.
+	 * disconnected when the reset occurred.
 	 */
 	scbp_next = LIST_FIRST(&ahc->pending_scbs);
 	while (scbp_next != NULL) {
@@ -5492,6 +5601,8 @@
 	struct	ahc_devinfo devinfo;
 	u_int	initiator, target, max_scsiid;
 	u_int	sblkctl;
+	u_int	scsiseq;
+	u_int	simode1;
 	int	found;
 	int	restart_needed;
 	char	cur_channel;
@@ -5528,31 +5639,48 @@
 	if ((ahc->features & AHC_TWIN) != 0
 	 && ((sblkctl & SELBUSB) != 0))
 	    cur_channel = 'B';
+	scsiseq = ahc_inb(ahc, SCSISEQ_TEMPLATE);
 	if (cur_channel != channel) {
 		/* Case 1: Command for another bus is active
 		 * Stealthily reset the other bus without
 		 * upsetting the current bus.
 		 */
 		ahc_outb(ahc, SBLKCTL, sblkctl ^ SELBUSB);
-		ahc_outb(ahc, SIMODE1,
-			 ahc_inb(ahc, SIMODE1) & ~(ENBUSFREE|ENSCSIRST));
-		ahc_outb(ahc, SCSISEQ,
-			 ahc_inb(ahc, SCSISEQ) & (ENSELI|ENRSELI|ENAUTOATNP));
+		simode1 = ahc_inb(ahc, SIMODE1) & ~(ENBUSFREE|ENSCSIRST);
+		ahc_outb(ahc, SIMODE1, simode1);
 		if (initiate_reset)
 			ahc_reset_current_bus(ahc);
 		ahc_clear_intstat(ahc);
+#if AHC_TARGET_MODE
+		/*
+		 * Bus resets clear ENSELI, so we cannot
+		 * defer re-enabling bus reset interrupts
+		 * if we are in target mode.
+		 */
+		if ((ahc->flags & AHC_TARGETROLE) != 0)
+			ahc_outb(ahc, SIMODE1, simode1 | ENSCSIRST);
+#endif
+		ahc_outb(ahc, SCSISEQ, scsiseq & (ENSELI|ENRSELI|ENAUTOATNP));
 		ahc_outb(ahc, SBLKCTL, sblkctl);
 		restart_needed = FALSE;
 	} else {
 		/* Case 2: A command from this bus is active or we're idle */
 		ahc_clear_msg_state(ahc);
-		ahc_outb(ahc, SIMODE1,
-			 ahc_inb(ahc, SIMODE1) & ~(ENBUSFREE|ENSCSIRST));
-		ahc_outb(ahc, SCSISEQ,
-			 ahc_inb(ahc, SCSISEQ) & (ENSELI|ENRSELI|ENAUTOATNP));
+		simode1 = ahc_inb(ahc, SIMODE1) & ~(ENBUSFREE|ENSCSIRST);
+		ahc_outb(ahc, SIMODE1, simode1);
 		if (initiate_reset)
 			ahc_reset_current_bus(ahc);
 		ahc_clear_intstat(ahc);
+#if AHC_TARGET_MODE
+		/*
+		 * Bus resets clear ENSELI, so we cannot
+		 * defer re-enabling bus reset interrupts
+		 * if we are in target mode.
+		 */
+		if ((ahc->flags & AHC_TARGETROLE) != 0)
+			ahc_outb(ahc, SIMODE1, simode1 | ENSCSIRST);
+#endif
+		ahc_outb(ahc, SCSISEQ, scsiseq & (ENSELI|ENRSELI|ENAUTOATNP));
 		restart_needed = TRUE;
 	}
 
@@ -5704,7 +5832,7 @@
 		ahc_set_sense_residual(scb, resid);
 
 #ifdef AHC_DEBUG
-	if (ahc_debug & AHC_SHOWMISC) {
+	if ((ahc_debug & AHC_SHOWMISC) != 0) {
 		ahc_print_path(ahc, scb);
 		printf("Handled Residual of %d bytes\n", resid);
 	}
@@ -6107,6 +6235,10 @@
 	printf("%s: Dumping Card State %s, at SEQADDR 0x%x\n",
 	       ahc_name(ahc), ahc_lookup_phase_entry(last_phase)->phasemsg,
 	       ahc_inb(ahc, SEQADDR0) | (ahc_inb(ahc, SEQADDR1) << 8));
+	printf("ACCUM = 0x%x, SINDEX = 0x%x, DINDEX = 0x%x, ARG_2 = 0x%x\n",
+	       ahc_inb(ahc, ACCUM), ahc_inb(ahc, SINDEX), ahc_inb(ahc, DINDEX),
+	       ahc_inb(ahc, ARG_2));
+	printf("HCNT = 0x%x\n", ahc_inb(ahc, HCNT));
 	printf("SCSISEQ = 0x%x, SBLKCTL = 0x%x\n",
 	       ahc_inb(ahc, SCSISEQ), ahc_inb(ahc, SBLKCTL));
 	printf(" DFCNTRL = 0x%x, DFSTATUS = 0x%x\n",
@@ -6159,6 +6291,7 @@
 	}
 	printf("\n");
 		
+	ahc_sync_qoutfifo(ahc, BUS_DMASYNC_POSTREAD);
 	printf("QOUTFIFO entries: ");
 	qoutpos = ahc->qoutfifonext;
 	i = 0;
@@ -6183,7 +6316,14 @@
 	LIST_FOREACH(scb, &ahc->pending_scbs, pending_links) {
 		if (i++ > 256)
 			break;
-		printf("%d ", scb->hscb->tag);
+		if (scb != LIST_FIRST(&ahc->pending_scbs))
+			printf(", ");
+		printf("%d", scb->hscb->tag);
+		if ((ahc->flags & AHC_PAGESCBS) == 0) {
+			ahc_outb(ahc, SCBPTR, scb->hscb->tag);
+			printf("(0x%x, 0x%x)", ahc_inb(ahc, SCB_CONTROL),
+			       ahc_inb(ahc, SCB_TAG));
+		}
 	}
 	printf("\n");
 
@@ -6631,6 +6771,7 @@
 	if ((ahc->features & AHC_AUTOPAUSE) != 0)
 		paused = TRUE;
 
+	ahc_sync_tqinfifo(ahc, BUS_DMASYNC_POSTREAD);
 	while ((cmd = &ahc->targetcmds[ahc->tqinfifonext])->cmd_valid != 0) {
 
 		/*
@@ -6640,11 +6781,16 @@
 		if (ahc_handle_target_cmd(ahc, cmd) != 0)
 			break;
 
-		ahc->tqinfifonext++;
 		cmd->cmd_valid = 0;
+		ahc_dmamap_sync(ahc, ahc->shared_data_dmat,
+				ahc->shared_data_dmamap,
+				ahc_targetcmd_offset(ahc, ahc->tqinfifonext),
+				sizeof(struct target_cmd),
+				BUS_DMASYNC_PREREAD);
+		ahc->tqinfifonext++;
 
 		/*
-		 * Lazily update our position in the target mode incomming
+		 * Lazily update our position in the target mode incoming
 		 * command queue as seen by the sequencer.
 		 */
 		if ((ahc->tqinfifonext & (HOST_TQINPOS - 1)) == 1) {
diff -u --recursive --new-file v2.4.8/linux/drivers/scsi/aic7xxx/aic7xxx.h linux/drivers/scsi/aic7xxx/aic7xxx.h
--- v2.4.8/linux/drivers/scsi/aic7xxx/aic7xxx.h	Fri May  4 15:16:28 2001
+++ linux/drivers/scsi/aic7xxx/aic7xxx.h	Sun Aug 12 10:51:42 2001
@@ -28,7 +28,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $Id: //depot/src/aic7xxx/aic7xxx.h#27 $
+ * $Id: //depot/src/aic7xxx/aic7xxx.h#29 $
  *
  * $FreeBSD: src/sys/dev/aic7xxx/aic7xxx.h,v 1.30 2000/11/10 20:13:40 gibbs Exp $
  */
@@ -142,7 +142,7 @@
  *	   we must be sure that 4 slots are empty when we write to clear
  *	   the queue.  This reduces us to 253 SCBs: 1 that just completed
  *	   and the known three additional empty slots in the queue that
- *	   preceed it.
+ *	   precede it.
  */
 #define AHC_MAX_QUEUE	253
 
@@ -334,29 +334,11 @@
 					   */
 	AHC_BIOS_ENABLED      = 0x80000,
 	AHC_ALL_INTERRUPTS    = 0x100000,
-	AHC_ULTRA_DISABLED    = 0x200000, /*
-					   * The precision resistor for
-					   * ultra transmission speeds is
-					   * missing, so we must limit
-					   * ourselves to fast SCSI.
-					   */
 	AHC_PAGESCBS	      = 0x400000, /* Enable SCB paging */
-	AHC_EDGE_INTERRUPT    = 0x800000  /* Device uses edge triggered ints */
+	AHC_EDGE_INTERRUPT    = 0x800000, /* Device uses edge triggered ints */
+	AHC_39BIT_ADDRESSING  = 0x1000000 /* Use 39 bit addressing scheme. */
 } ahc_flag;
 
-/*
- * Controller  Information composed at probe time.
- */
-struct ahc_probe_config {
-	const char	*description;
-	char		 channel;
-	char		 channel_b;
-	ahc_chip	 chip;
-	ahc_feature	 features;
-	ahc_bug		 bugs;
-	ahc_flag	 flags;
-};
-
 /************************* Hardware  SCB Definition ***************************/
 
 /*
@@ -505,6 +487,13 @@
 #define	AHC_SG_LEN_MASK		0x00FFFFFF
 };
 
+struct sg_map_node {
+	bus_dmamap_t		 sg_dmamap;
+	bus_addr_t		 sg_physaddr;
+	struct ahc_dma_seg*	 sg_vaddr;
+	SLIST_ENTRY(sg_map_node) links;
+};
+
 /*
  * The current state of this SCB.
  */
@@ -544,18 +533,12 @@
 	bus_dmamap_t		  dmamap;
 #endif
 	struct scb_platform_data *platform_data;
-	struct	ahc_dma_seg 	 *sg_list;
+	struct sg_map_node	 *sg_map;
+	struct ahc_dma_seg 	 *sg_list;
 	bus_addr_t		  sg_list_phys;
 	u_int			  sg_count;/* How full ahc_dma_seg is */
 };
 
-struct sg_map_node {
-	bus_dmamap_t		 sg_dmamap;
-	bus_addr_t		 sg_physaddr;
-	struct ahc_dma_seg*	 sg_vaddr;
-	SLIST_ENTRY(sg_map_node) links;
-};
-
 struct scb_data {
 	SLIST_HEAD(, scb) free_scbs;	/*
 					 * Pool of SCBs ready to be assigned
@@ -871,7 +854,7 @@
 	/*
 	 * SCBs that have been sent to the controller
 	 */
-	LIST_HEAD(, scb)	 pending_scbs;
+	LIST_HEAD(, scb)	  pending_scbs;
 
 	/*
 	 * Counting lock for deferring the release of additional
@@ -1045,8 +1028,7 @@
 };
 
 /****************************** PCI Structures ********************************/
-typedef int (ahc_device_setup_t)(ahc_dev_softc_t,
-				 struct ahc_probe_config *);
+typedef int (ahc_device_setup_t)(struct ahc_softc *);
 
 struct ahc_pci_identity {
 	uint64_t		 full_id;
@@ -1099,10 +1081,8 @@
 			      u_int tag, role_t role);
 
 /****************************** Initialization ********************************/
-void			 ahc_init_probe_config(struct ahc_probe_config *);
 struct ahc_softc	*ahc_alloc(void *platform_arg, char *name);
-int			 ahc_softc_init(struct ahc_softc *,
-					struct ahc_probe_config*);
+int			 ahc_softc_init(struct ahc_softc *);
 void			 ahc_controller_info(struct ahc_softc *ahc, char *buf);
 int			 ahc_init(struct ahc_softc *ahc);
 void			 ahc_intr_enable(struct ahc_softc *ahc, int enable);
diff -u --recursive --new-file v2.4.8/linux/drivers/scsi/aic7xxx/aic7xxx.reg linux/drivers/scsi/aic7xxx/aic7xxx.reg
--- v2.4.8/linux/drivers/scsi/aic7xxx/aic7xxx.reg	Fri May  4 15:16:28 2001
+++ linux/drivers/scsi/aic7xxx/aic7xxx.reg	Sun Aug 12 10:51:42 2001
@@ -28,10 +28,9 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $Id: //depot/src/aic7xxx/aic7xxx.reg#17 $
- *
  * $FreeBSD: src/sys/dev/aic7xxx/aic7xxx.reg,v 1.31 2000/11/10 20:13:40 gibbs Exp $
  */
+VERSION = "$Id: //depot/src/aic7xxx/aic7xxx.reg#19 $"
 
 /*
  * This file is processed by the aic7xxx_asm utility for use in assembling
@@ -683,8 +682,16 @@
 	bit	CIOPARCKEN	0x01	/* Internal bus parity error enable */
 }
 
+register DSCOMMAND1 {
+	address			0x085
+	access_mode RW
+	mask	DSLATT		0xfc	/* PCI latency timer (non-ultra2) */
+	bit	HADDLDSEL1	0x02	/* Host Address Load Select Bits */
+	bit	HADDLDSEL0	0x01
+}
+
 /*
- * Bus On/Off Time (p. 3-44)
+ * Bus On/Off Time (p. 3-44) aic7770 only
  */
 register BUSTIME {
 	address			0x085
@@ -781,7 +788,13 @@
 	mask	NO_IDENT	0x20|SEQINT	/* no IDENTIFY after reconnect*/
 	mask	NO_MATCH	0x30|SEQINT	/* no cmd match for reconnect */
 	mask	IGN_WIDE_RES	0x40|SEQINT	/* Complex IGN Wide Res Msg */
-	mask	RESIDUAL	0x50|SEQINT	/* Residual byte count != 0 */
+	mask	PDATA_REINIT	0x50|SEQINT	/*
+						 * Returned to data phase
+						 * that requires data
+						 * transfer pointers to be
+						 * recalculated from the
+						 * transfer residual.
+						 */
 	mask	HOST_MSG_LOOP	0x60|SEQINT	/*
 						 * The bus is ready for the
 						 * host to perform another
diff -u --recursive --new-file v2.4.8/linux/drivers/scsi/aic7xxx/aic7xxx.seq linux/drivers/scsi/aic7xxx/aic7xxx.seq
--- v2.4.8/linux/drivers/scsi/aic7xxx/aic7xxx.seq	Fri May  4 15:16:28 2001
+++ linux/drivers/scsi/aic7xxx/aic7xxx.seq	Sun Aug 12 10:51:42 2001
@@ -28,11 +28,11 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $Id: //depot/src/aic7xxx/aic7xxx.seq#27 $
- *
  * $FreeBSD: src/sys/dev/aic7xxx/aic7xxx.seq,v 1.106 2000/11/12 05:19:46 gibbs Exp $
  */
 
+VERSION = "$Id: //depot/src/aic7xxx/aic7xxx.seq#33 $"
+
 #include "aic7xxx.reg"
 #include "scsi_message.h"
 
@@ -175,16 +175,7 @@
 		 * We've just been selected.  Assert BSY and
 		 * setup the phase for receiving messages
 		 * from the target.
-		 *
-		 * If bus reset interrupts have been disabled (from a
-		 * previous reset), re-enable them now.  Resets are only
-		 * of interest when we have outstanding transactions, so
-		 * we can safely defer re-enabling the interrupt until,
-		 * as a target, we start receiving transactions again.
-		 */
-		test	SIMODE1, ENSCSIRST	jnz . + 3;
-		mvi	CLRSINT1, CLRSCSIRSTI;
-		or	SIMODE1, ENSCSIRST;
+		 */
 		mvi	SCSISIGO, P_MESGOUT|BSYO;
 
 		/*
@@ -524,7 +515,7 @@
 		mvi	MSG_DISCONNECT call target_outb;
 
 target_busfree_wait:
-		/* Wait for preceeding I/O session to complete. */
+		/* Wait for preceding I/O session to complete. */
 		test	SCSISIGI, ACKI jnz .;
 target_busfree:
 		and	SIMODE1, ~ENBUSFREE;
@@ -749,13 +740,13 @@
 	if ((ahc->features & AHC_ULTRA2) != 0) {
 		/* Does the hardware have space for another SG entry? */
 		test	DFSTATUS, PRELOAD_AVAIL jz return;
-		bmov 	HADDR, CCSGRAM, 4;
-		bmov	SINDEX, CCSGRAM, 1;
-		test	SINDEX, 0x1 jz . + 2;
+		bmov 	HADDR, CCSGRAM, 7;
+		test	HCNT[0], 0x1 jz . + 2;
 		xor	DATA_COUNT_ODD, 0x1;
-		bmov	HCNT[0], SINDEX, 1;
-		bmov	HCNT[1], CCSGRAM, 2;
 		bmov	SCB_RESIDUAL_DATACNT[3], CCSGRAM, 1;
+		if ((ahc->flags & AHC_39BIT_ADDRESSING) != 0) {
+			mov	SCB_RESIDUAL_DATACNT[3] call set_hhaddr;
+		}
 		call	sg_advance;
 		mov	SINDEX, SCB_RESIDUAL_SGPTR[0];
 		test	DATA_COUNT_ODD, 0x1 jz . + 2;
@@ -803,29 +794,10 @@
 	adc	HCNT[2], -1 ret;
 }
 
-/*
- * If we re-enter the data phase after going through another phase, the
- * STCNT may have been cleared, so restore it from the residual field.
- */
-data_phase_reinit:
-	if ((ahc->features & AHC_ULTRA2) != 0) {
-		/*
-		 * The preload circuitry requires us to
-		 * reload the address too, so pull it from
-		 * the shaddow address.
-		 */
-		bmov	HADDR, SHADDR, 4;
-		bmov	HCNT, SCB_RESIDUAL_DATACNT, 3;
-	} else if ((ahc->features & AHC_CMD_CHAN) != 0) {
-		bmov	STCNT, SCB_RESIDUAL_DATACNT, 3;
-	} else {
-		mvi	DINDEX, STCNT;
-		mvi	SCB_RESIDUAL_DATACNT call bcopy_3;
-	}
-	and	DATA_COUNT_ODD, 0x1, SCB_RESIDUAL_DATACNT[0];
-	jmp	data_phase_loop;
-
 p_data:
+	test	SEQ_FLAGS,IDENTIFY_SEEN	jnz p_data_okay;
+	mvi	NO_IDENT jmp set_seqint;
+p_data_okay:
 	if ((ahc->features & AHC_ULTRA2) != 0) {
 		mvi	DMAPARAMS, PRELOADEN|SCSIEN|HDMAEN;
 	} else {
@@ -833,17 +805,23 @@
 	}
 	test	LASTPHASE, IOI jnz . + 2;
 	or	DMAPARAMS, DIRECTION;
-	call	assert;			/*
-					 * Ensure entering a data
-					 * phase is okay - seen identify, etc.
-					 */
 	if ((ahc->features & AHC_CMD_CHAN) != 0) {
 		/* We don't have any valid S/G elements */
 		mvi	CCSGADDR, SG_PREFETCH_CNT;
 	}
-	test	SEQ_FLAGS, DPHASE	jnz data_phase_reinit;
+	test	SEQ_FLAGS, DPHASE	jz data_phase_initialize;
+
+	/*
+	 * If we re-enter the data phase after going through another
+	 * phase, our transfer location has almost certainly been
+	 * corrupted by the interveining, non-data, transfers.  Ask
+	 * the host driver to fix us up based on the transfer residual.
+	 */
+	mvi	PDATA_REINIT	call set_seqint;
+	jmp	data_phase_loop;
 
-	/* We have seen a data phase */
+data_phase_initialize:
+	/* We have seen a data phase for the first time */
 	or	SEQ_FLAGS, DPHASE;
 
 	/*
@@ -853,6 +831,10 @@
 	 * modify the saved values in the SCB until we see a save
 	 * data pointers message.
 	 */
+	if ((ahc->flags & AHC_39BIT_ADDRESSING) != 0) {
+		/* The lowest address byte must be loaded last. */
+		mov	SCB_DATACNT[3] call set_hhaddr;
+	}
 	if ((ahc->features & AHC_CMD_CHAN) != 0) {
 		bmov	HADDR, SCB_DATAPTR, 7;
 		bmov	SCB_RESIDUAL_DATACNT[3], SCB_DATACNT[3], 5;
@@ -1057,6 +1039,29 @@
 ultra2_dmahalt:
 		and     DFCNTRL, ~(SCSIEN|HDMAEN);
 		test	DFCNTRL, SCSIEN|HDMAEN jnz .;
+		if ((ahc->flags & AHC_39BIT_ADDRESSING) != 0) {
+			/*
+			 * Keep HHADDR cleared for future, 32bit addressed
+			 * only, DMA operations.
+			 *
+			 * Due to bayonette style S/G handling, our residual
+			 * data must be "fixed up" once the transfer is halted.
+			 * Here we fixup the HSHADDR stored in the high byte
+			 * of the residual data cnt.  By postponing the fixup,
+			 * we can batch the clearing of HADDR with the fixup.
+			 * If we halted on the last segment, the residual is
+			 * already correct.   If we are not on the last
+			 * segment, copy the high address directly from HSHADDR.
+			 * We don't need to worry about maintaining the
+			 * SG_LAST_SEG flag as it will always be false in the
+			 * case where an update is required.
+			 */
+			or	DSCOMMAND1, HADDLDSEL0;
+			test	SG_CACHE_SHADOW, LAST_SEG jnz . + 2;
+			mov	SCB_RESIDUAL_DATACNT[3], SHADDR;
+			clr	HADDR;
+			and	DSCOMMAND1, ~HADDLDSEL0;
+		}
 	} else {
 		/* If we are the last SG block, tell the hardware. */
 		if ((ahc->bugs & AHC_PCI_MWI_BUG) != 0
@@ -1163,9 +1168,18 @@
 			call	idle_loop;
 			test	CCSGCTL, CCSGEN jnz . - 1;
 			bmov 	HADDR, CCSGRAM, 7;
-			test	CCSGRAM, SG_LAST_SEG jz . + 2;
-			or	SCB_RESIDUAL_DATACNT[3], SG_LAST_SEG;
+			/*
+			 * Workaround for flaky external SCB RAM
+			 * on certain aic7895 setups.  It seems
+			 * unable to handle direct transfers from
+			 * S/G ram to certain SCB locations.
+			 */
+			mov	SINDEX, CCSGRAM;
+			mov	SCB_RESIDUAL_DATACNT[3], SINDEX;
 		} else {
+			if ((ahc->flags & AHC_39BIT_ADDRESSING) != 0) {
+				mov	ALLZEROS call set_hhaddr;
+			}
 			mvi	DINDEX, HADDR;
 			mvi	SCB_RESIDUAL_SGPTR	call bcopy_4;
 
@@ -1180,6 +1194,17 @@
 			mov	SCB_RESIDUAL_DATACNT[3], DFDAT;
 		}
 
+		if ((ahc->flags & AHC_39BIT_ADDRESSING) != 0) {
+			mov	SCB_RESIDUAL_DATACNT[3] call set_hhaddr;
+
+			/*
+			 * The lowest address byte must be loaded
+			 * last as it triggers the computation of
+			 * some items in the PCI block.  The ULTRA2
+			 * chips do this on PRELOAD.
+			 */
+			mov	HADDR, HADDR;
+		}
 		if ((ahc->bugs & AHC_PCI_MWI_BUG) != 0
 		  && ahc->pci_cachesize != 0) {
 			call calc_mwi_residual;
@@ -1234,6 +1259,24 @@
 		call	disable_ccsgen;
 	}
 
+	if ((ahc->features & AHC_ULTRA2) == 0) {
+		/*
+		 * Clear the high address byte so that all other DMA
+		 * operations, which use 32bit addressing, can assume
+		 * HHADDR is 0.
+		 */
+		if ((ahc->flags & AHC_39BIT_ADDRESSING) != 0) {
+			mov	ALLZEROS call set_hhaddr;
+		}
+	}
+
+	/*
+	 * Update our residual information before the information is
+	 * lost by some other type of SCSI I/O (e.g. PIO).  If we have
+	 * transferred all data, no update is needed.
+	 *
+	 */
+	test	SCB_RESIDUAL_SGPTR, SG_LIST_NULL jnz residual_update_done;
 	if ((ahc->bugs & AHC_PCI_MWI_BUG) != 0
 	  && ahc->pci_cachesize != 0) {
 		if ((ahc->features & AHC_CMD_CHAN) != 0) {
@@ -1257,7 +1300,7 @@
 		mov	SCB_RESIDUAL_DATACNT[1], STCNT[1];
 		mov	SCB_RESIDUAL_DATACNT[2], STCNT[2];
 	}
-
+residual_update_done:
 	/*
 	 * Since we've been through a data phase, the SCB_RESID* fields
 	 * are now initialized.  Clear the full residual flag.
@@ -1289,7 +1332,9 @@
  * Command phase.  Set up the DMA registers and let 'er rip.
  */
 p_command:
-	call	assert;
+	test	SEQ_FLAGS,IDENTIFY_SEEN	jnz p_command_okay;
+	mvi	NO_IDENT jmp set_seqint;
+p_command_okay:
 
 	if ((ahc->features & AHC_ULTRA2) != 0) {
 		bmov	HCNT[0], SCB_CDB_LEN,  1;
@@ -1323,7 +1368,7 @@
 	jmp	p_command_loop;
 p_command_embedded:
 	/*
-	 * The data fifo seems to require 4 byte alligned
+	 * The data fifo seems to require 4 byte aligned
 	 * transfers from the sequencer.  Force this to
 	 * be the case by clearing HADDR[0] even though
 	 * we aren't going to touch host memeory.
@@ -1383,8 +1428,9 @@
  * and store it into the SCB.
  */
 p_status:
-	call	assert;
-
+	test	SEQ_FLAGS,IDENTIFY_SEEN	jnz p_status_okay;
+	mvi	NO_IDENT jmp set_seqint;
+p_status_okay:
 	mov	SCB_SCSI_STATUS, SCSIDATL;
 	jmp	ITloop;
 
@@ -1626,6 +1672,22 @@
 	} else {
 		test	SEQ_FLAGS, DPHASE	jz mesgin_done;
 	}
+
+	/*
+	 * If we are asked to save our position at the end of the
+	 * transfer, just mark us at the end rather than perform a
+	 * full save.
+	 */
+	test	SCB_RESIDUAL_SGPTR[0], SG_LIST_NULL jz mesgin_sdptrs_full;
+	or	SCB_SGPTR, SG_LIST_NULL;
+	if ((ahc->features & AHC_ULTRA2) != 0) {
+		jmp	ITloop;
+	} else {
+		jmp	mesgin_done;
+	}
+
+mesgin_sdptrs_full:
+
 	/*
 	 * The SCB_SGPTR becomes the next one we'll download,
 	 * and the SCB_DATAPTR becomes the current SHADDR.
@@ -1907,16 +1969,6 @@
 	and	SXFRCTL0, ~SPIOEN ret;
 }
 	
-
-/*
- * Assert that if we've been reselected, then we've seen an IDENTIFY
- * message.
- */
-assert:
-	test	SEQ_FLAGS,IDENTIFY_SEEN	jnz return;	/* seen IDENTIFY? */
-
-	mvi	NO_IDENT jmp set_seqint;	/* no - tell the kernel */
-
 /*
  * Locate a disconnected SCB by SCBID.  Upon return, SCBPTR and SINDEX will
  * be set to the position of the SCB.  If the SCB cannot be found locally,
@@ -2157,32 +2209,21 @@
 			 * The PCI module no longer intends to perform
 			 * a PCI transaction.  Drain the fifo.
 			 */
-dma_scb_hang_empty_fifo:
-			/*
-			 * Skip lines not yet transfered into the FIFO.
-			 */
-			add	SINDEX, 7, HCNT;
-			shr	SINDEX, 3;
-
-			/*
-			 * Skip lines already copied out of the FIFO.
-			 */
-			add	A, A, SINDEX;
-
-			call	dma_scb_hang_dma_drain_fifo;
-
-			/*
-			 * Set the lines transferred to all but
-			 * those yet to reach the FIFO.
-			 */
-			not	SINDEX;
-			add	A, 5, SINDEX;
-			cmp	A, 4	je dma_finish_nowait;
+dma_scb_hang_dma_drain_fifo:
+			not	A, HCNT;
+			add	A, SCB_DOWNLOAD_SIZE+SCB_BASE+1;
+			and	A, ~0x7;
+			mov	DINDIR,DFDAT;
+			cmp	DINDEX, A jne . - 1;
+			cmp	DINDEX, SCB_DOWNLOAD_SIZE+SCB_BASE
+				je	dma_finish_nowait;
+			/* Restore A as the lines left to transfer. */
+			add	A, -SCB_BASE, DINDEX;
+			shr	A, 3;
 			jmp	dma_scb_hang_fifo;
 dma_scb_hang_dma_done:
 			and	DFCNTRL, ~HDMAEN;
 			test	DFCNTRL, HDMAEN jnz .;
-dma_scb_hang_dma_drain_fifo:
 			add	SEQADDR0, A;
 		} else {
 			call	dma_finish;
@@ -2249,6 +2290,13 @@
 	} else {
 		mvi	SCB_TAG, SCB_LIST_NULL ret;
 	}
+
+if ((ahc->flags & AHC_39BIT_ADDRESSING) != 0) {
+set_hhaddr:
+	or	DSCOMMAND1, HADDLDSEL0;
+	and	HADDR, SG_HIGH_ADDR_BITS, SINDEX;
+	and	DSCOMMAND1, ~HADDLDSEL0 ret;
+}
 
 if ((ahc->flags & AHC_PAGESCBS) != 0) {
 get_free_or_disc_scb:
diff -u --recursive --new-file v2.4.8/linux/drivers/scsi/aic7xxx/aic7xxx_93cx6.c linux/drivers/scsi/aic7xxx/aic7xxx_93cx6.c
--- v2.4.8/linux/drivers/scsi/aic7xxx/aic7xxx_93cx6.c	Sun Mar  4 14:30:18 2001
+++ linux/drivers/scsi/aic7xxx/aic7xxx_93cx6.c	Sun Aug 12 17:37:53 2001
@@ -14,7 +14,7 @@
  *    derived from this software without specific prior written permission.
  *
  * Alternatively, this software may be distributed under the terms of the
- * GNU Public License ("GPL").
+ * GNU General Public License ("GPL").
  *
  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
@@ -28,7 +28,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $Id: //depot/src/aic7xxx/aic7xxx_93cx6.c#7 $
+ * $Id: //depot/src/aic7xxx/aic7xxx_93cx6.c#8 $
  *
  * $FreeBSD: src/sys/dev/aic7xxx/aic7xxx_93cx6.c,v 1.9 2000/11/10 20:13:41 gibbs Exp $
  */
@@ -41,7 +41,7 @@
  *     -------------------------------------------------------------------
  *     READ        1    10   A5 - A0             Reads data stored in memory,
  *                                               starting at specified address
- *     EWEN        1    00   11XXXX              Write enable must preceed
+ *     EWEN        1    00   11XXXX              Write enable must precede
  *                                               all programming modes
  *     ERASE       1    11   A5 - A0             Erase register A5A4A3A2A1A0
  *     WRITE       1    01   A5 - A0   D15 - D0  Writes register
diff -u --recursive --new-file v2.4.8/linux/drivers/scsi/aic7xxx/aic7xxx_inline.h linux/drivers/scsi/aic7xxx/aic7xxx_inline.h
--- v2.4.8/linux/drivers/scsi/aic7xxx/aic7xxx_inline.h	Fri May  4 15:16:28 2001
+++ linux/drivers/scsi/aic7xxx/aic7xxx_inline.h	Sun Aug 12 10:51:42 2001
@@ -28,7 +28,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $Id: //depot/src/aic7xxx/aic7xxx_inline.h#21 $
+ * $Id: //depot/src/aic7xxx/aic7xxx_inline.h#27 $
  *
  * $FreeBSD: src/sys/dev/aic7xxx/aic7xxx_inline.h,v 1.8 2000/11/12 05:19:46 gibbs Exp $
  */
@@ -37,8 +37,8 @@
 #define _AIC7XXX_INLINE_H_
 
 /************************* Sequencer Execution Control ************************/
-static __inline int  ahc_is_paused(struct ahc_softc *ahc);
 static __inline void ahc_pause_bug_fix(struct ahc_softc *ahc);
+static __inline int  ahc_is_paused(struct ahc_softc *ahc);
 static __inline void ahc_pause(struct ahc_softc *ahc);
 static __inline void ahc_unpause(struct ahc_softc *ahc);
 
@@ -146,6 +146,13 @@
 					   struct ahc_dma_seg *sg);
 static __inline uint32_t
 			ahc_hscb_busaddr(struct ahc_softc *ahc, u_int index);
+static __inline void	ahc_sync_scb(struct ahc_softc *ahc,
+				     struct scb *scb, int op);
+static __inline void	ahc_sync_sglist(struct ahc_softc *ahc,
+					struct scb *scb, int op);
+static __inline uint32_t
+			ahc_targetcmd_offset(struct ahc_softc *ahc,
+					     u_int index);
 
 static __inline struct ahc_dma_seg *
 ahc_sg_bus_to_virt(struct scb *scb, uint32_t sg_busaddr)
@@ -177,6 +184,33 @@
 		+ (sizeof(struct hardware_scb) * index));
 }
 
+static __inline void
+ahc_sync_scb(struct ahc_softc *ahc, struct scb *scb, int op)
+{
+	ahc_dmamap_sync(ahc, ahc->scb_data->hscb_dmat,
+			ahc->scb_data->hscb_dmamap,
+			/*offset*/(scb->hscb - ahc->hscbs) * sizeof(*scb->hscb),
+			/*len*/sizeof(*scb->hscb), op);
+}
+
+static __inline void
+ahc_sync_sglist(struct ahc_softc *ahc, struct scb *scb, int op)
+{
+	if (scb->sg_count == 0)
+		return;
+
+	ahc_dmamap_sync(ahc, ahc->scb_data->sg_dmat, scb->sg_map->sg_dmamap,
+			/*offset*/(scb->sg_list - scb->sg_map->sg_vaddr)
+				* sizeof(struct ahc_dma_seg),
+			/*len*/sizeof(struct ahc_dma_seg) * scb->sg_count, op);
+}
+
+static __inline uint32_t
+ahc_targetcmd_offset(struct ahc_softc *ahc, u_int index)
+{
+	return (((uint8_t *)&ahc->targetcmds[index]) - ahc->qoutfifo);
+}
+
 /******************************** Debugging ***********************************/
 static __inline char *ahc_name(struct ahc_softc *ahc);
 
@@ -219,8 +253,6 @@
 	sgptr = ahc_le32toh(scb->hscb->sgptr);
 	if ((sgptr & SG_RESID_VALID) != 0)
 		ahc_calc_residual(scb);
-	else
-		ahc_set_residual(scb, 0);
 }
 
 /*
@@ -284,8 +316,13 @@
 static __inline struct scb *
 ahc_lookup_scb(struct ahc_softc *ahc, u_int tag)
 {
-	return (ahc->scb_data->scbindex[tag]);
+	struct scb* scb;
 
+	scb = ahc->scb_data->scbindex[tag];
+	if (scb != NULL)
+		ahc_sync_scb(ahc, scb,
+			     BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
+	return (scb);
 }
 
 static __inline void
@@ -342,6 +379,14 @@
 	 * Keep a history of SCBs we've downloaded in the qinfifo.
 	 */
 	ahc->qinfifo[ahc->qinfifonext++] = scb->hscb->tag;
+
+	/*
+	 * Make sure our data is consistant from the
+	 * perspective of the adapter.
+	 */
+	ahc_sync_scb(ahc, scb, BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
+
+	/* Tell the adapter about the newly queued SCB */
 	if ((ahc->features & AHC_QUEUE_REGS) != 0) {
 		ahc_outb(ahc, HNSCB_QOFF, ahc->qinfifonext);
 	} else {
@@ -373,8 +418,31 @@
 }
 
 /************************** Interrupt Processing ******************************/
-static __inline u_int ahc_check_cmdcmpltqueues(struct ahc_softc *ahc);
-static __inline void ahc_intr(struct ahc_softc *ahc);
+static __inline void	ahc_sync_qoutfifo(struct ahc_softc *ahc, int op);
+static __inline void	ahc_sync_tqinfifo(struct ahc_softc *ahc, int op);
+static __inline u_int	ahc_check_cmdcmpltqueues(struct ahc_softc *ahc);
+static __inline void	ahc_intr(struct ahc_softc *ahc);
+
+static __inline void
+ahc_sync_qoutfifo(struct ahc_softc *ahc, int op)
+{
+	ahc_dmamap_sync(ahc, ahc->shared_data_dmat, ahc->shared_data_dmamap,
+			/*offset*/0, /*len*/256, op);
+}
+
+static __inline void
+ahc_sync_tqinfifo(struct ahc_softc *ahc, int op)
+{
+#ifdef AHC_TARGET_MODE
+	if ((ahc->flags & AHC_TARGETROLE) != 0) {
+		ahc_dmamap_sync(ahc, ahc->shared_data_dmat,
+				ahc->shared_data_dmamap,
+				ahc_targetcmd_offset(ahc, 0),
+				sizeof(struct target_cmd) * AHC_TMODE_CMDS,
+				op);
+	}
+#endif
+}
 
 /*
  * See if the firmware has posted any completed commands
@@ -388,12 +456,21 @@
 	u_int retval;
 
 	retval = 0;
+	ahc_dmamap_sync(ahc, ahc->shared_data_dmat, ahc->shared_data_dmamap,
+			/*offset*/ahc->qoutfifonext, /*len*/1,
+			BUS_DMASYNC_POSTREAD);
 	if (ahc->qoutfifo[ahc->qoutfifonext] != SCB_LIST_NULL)
 		retval |= AHC_RUN_QOUTFIFO;
 #ifdef AHC_TARGET_MODE
-	if ((ahc->flags & AHC_TARGETROLE) != 0
-	 && ahc->targetcmds[ahc->tqinfifonext].cmd_valid != 0)
-		retval |= AHC_RUN_TQINFIFO;
+	if ((ahc->flags & AHC_TARGETROLE) != 0) {
+		ahc_dmamap_sync(ahc, ahc->shared_data_dmat,
+				ahc->shared_data_dmamap,
+				ahc_targetcmd_offset(ahc, ahc->tqinfifofnext),
+				/*len*/sizeof(struct target_cmd),
+				BUS_DMASYNC_POSTREAD);
+		if (ahc->targetcmds[ahc->tqinfifonext].cmd_valid != 0)
+			retval |= AHC_RUN_TQINFIFO;
+	}
 #endif
 	return (retval);
 }
@@ -418,36 +495,13 @@
 		intstat = CMDCMPLT;
 	else {
 		intstat = ahc_inb(ahc, INTSTAT);
-		/*
-		 * We can't generate queuestat once above
-		 * or we are exposed to a race when our
-		 * interrupt is shared with another device.
-		 * if instat showed a command complete interrupt,
-		 * but our first generation of queue stat
-		 * "just missed" the delivery of this transaction,
-		 * we would clear the command complete interrupt
-		 * below without ever servicing the completed
-		 * command.
-		 */
-		queuestat = ahc_check_cmdcmpltqueues(ahc);
-#if AHC_PCI_CONFIG > 0
-		if (ahc->unsolicited_ints > 500
-		 && (ahc->chip & AHC_PCI) != 0
-		 && (ahc_inb(ahc, ERROR) & PCIERRSTAT) != 0)
-			ahc->bus_intr(ahc);
+		queuestat = AHC_RUN_QOUTFIFO;
+#ifdef AHC_TARGET_MODE
+		if ((ahc->flags & AHC_TARGETROLE) != 0)
+			queuestat |= AHC_RUN_TQINFIFO;
 #endif
 	}
 
-	if (intstat == 0xFF && (ahc->features & AHC_REMOVABLE) != 0)
-		/* Hot eject */
-		return;
-
-	if ((intstat & INT_PEND) == 0) {
-		ahc->unsolicited_ints++;
-		return;
-	}
-	ahc->unsolicited_ints = 0;
-
 	if (intstat & CMDCMPLT) {
 		ahc_outb(ahc, CLRINT, CLRCMDINT);
 
@@ -469,6 +523,25 @@
 			ahc_run_tqinfifo(ahc, /*paused*/FALSE);
 #endif
 	}
+
+	if (intstat == 0xFF && (ahc->features & AHC_REMOVABLE) != 0)
+		/* Hot eject */
+		return;
+
+	if ((intstat & INT_PEND) == 0) {
+#if AHC_PCI_CONFIG > 0
+		if (ahc->unsolicited_ints > 500) {
+			ahc->unsolicited_ints = 0;
+			if ((ahc->chip & AHC_PCI) != 0
+			 && (ahc_inb(ahc, ERROR) & PCIERRSTAT) != 0)
+				ahc->bus_intr(ahc);
+		}
+#endif
+		ahc->unsolicited_ints++;
+		return;
+	}
+	ahc->unsolicited_ints = 0;
+
 	if (intstat & BRKADRINT) {
 		ahc_handle_brkadrint(ahc);
 		/* Fatal error, no more interrupts to handle. */
diff -u --recursive --new-file v2.4.8/linux/drivers/scsi/aic7xxx/aic7xxx_linux.c linux/drivers/scsi/aic7xxx/aic7xxx_linux.c
--- v2.4.8/linux/drivers/scsi/aic7xxx/aic7xxx_linux.c	Sun May 20 12:11:39 2001
+++ linux/drivers/scsi/aic7xxx/aic7xxx_linux.c	Sun Aug 12 17:37:53 2001
@@ -1,7 +1,7 @@
 /*
  * Adaptec AIC7xxx device driver for Linux.
  *
- * $Id: //depot/src/linux/drivers/scsi/aic7xxx/aic7xxx_linux.c#66 $
+ * $Id: //depot/src/linux/drivers/scsi/aic7xxx/aic7xxx_linux.c#72 $
  *
  * Copyright (c) 1994 John Aycock
  *   The University of Calgary Department of Computer Science.
@@ -52,7 +52,7 @@
  *    derived from this software without specific prior written permission.
  *
  * Alternatively, this software may be distributed under the terms of the
- * GNU Public License ("GPL").
+ * GNU General Public License ("GPL").
  *
  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
@@ -113,8 +113,6 @@
  *
  */
 
-#include <linux/config.h>
-
 /*
  * The next three defines are user configurable.  These should be the only
  * defines a user might need to get in here and change.  There are other
@@ -122,14 +120,10 @@
  * under normal conditions.
  */
 
-#if defined(MODULE) || defined(PCMCIA)
+#if defined(MODULE)
 #include <linux/module.h>
 #endif
 
-#if defined(PCMCIA)
-#undef MODULE
-#endif
-
 #include "aic7xxx_osm.h"
 #include "aic7xxx_inline.h"
 
@@ -139,6 +133,8 @@
 
 #include "../sd.h"		/* For geometry detection */
 
+#include <linux/mm.h>		/* For fetching system memory size */
+
 /*
  * To generate the correct addresses for the controller to issue
  * on the bus.  Originally added for DEC Alpha support.
@@ -483,7 +479,8 @@
 static void ahc_linux_handle_scsi_status(struct ahc_softc *,
 					 struct ahc_linux_device *,
 					 struct scb *);
-static void ahc_linux_filter_command(struct ahc_softc *ahc, Scsi_Cmnd *cmd);
+static void ahc_linux_filter_command(struct ahc_softc*, Scsi_Cmnd*,
+				     struct scb*);
 static void ahc_linux_sem_timeout(u_long arg);
 static void ahc_linux_freeze_sim_queue(struct ahc_softc *ahc);
 static void ahc_linux_release_sim_queue(u_long arg);
@@ -517,9 +514,14 @@
 						  struct ahc_cmd *acmd);
 static __inline void ahc_linux_check_device_queue(struct ahc_softc *ahc,
 						  struct ahc_linux_device *dev);
-static __inline void ahc_linux_sniff_command(struct ahc_softc*, Scsi_Cmnd*);
+static __inline void ahc_linux_sniff_command(struct ahc_softc*, Scsi_Cmnd*,
+					     struct scb*);
 static __inline void ahc_linux_unmap_scb(struct ahc_softc*, struct scb*);
 
+static __inline int ahc_linux_map_seg(struct ahc_softc *ahc, struct scb *scb,
+		 		      struct ahc_dma_seg *sg,
+				      bus_addr_t addr, bus_size_t len);
+
 static __inline struct ahc_linux_device*
 ahc_linux_get_device(struct ahc_softc *ahc, u_int channel, u_int target,
 	       u_int lun, int alloc)
@@ -628,15 +630,15 @@
 
 	while ((ahc->flags & AHC_RESOURCE_SHORTAGE) == 0
 	    && ahc->platform_data->qfrozen == 0
-	    && (dev = LIST_FIRST(&ahc->platform_data->device_runq)) != NULL) {
-		LIST_REMOVE(dev, links);
+	    && (dev = TAILQ_FIRST(&ahc->platform_data->device_runq)) != NULL) {
+		TAILQ_REMOVE(&ahc->platform_data->device_runq, dev, links);
 		dev->flags &= ~AHC_DEV_ON_RUN_LIST;
 		ahc_linux_check_device_queue(ahc, dev);
 	}
 }
 
 static __inline void
-ahc_linux_sniff_command(struct ahc_softc *ahc, Scsi_Cmnd *cmd)
+ahc_linux_sniff_command(struct ahc_softc *ahc, Scsi_Cmnd *cmd, struct scb *scb)
 {
 	/*
 	 * Determine whether we care to filter
@@ -645,7 +647,7 @@
 	 * heavy weight processing.
 	 */
 	if (cmd->cmnd[0] == INQUIRY)
-		ahc_linux_filter_command(ahc, cmd);
+		ahc_linux_filter_command(ahc, cmd, scb);
 }
 
 static __inline void
@@ -654,6 +656,7 @@
 	Scsi_Cmnd *cmd;
 
 	cmd = scb->io_ctx;
+	ahc_sync_sglist(ahc, scb, BUS_DMASYNC_POSTWRITE);
 	if (cmd->use_sg != 0) {
 		struct scatterlist *sg;
 
@@ -667,6 +670,48 @@
 				 scsi_to_pci_dma_dir(cmd->sc_data_direction));
 }
 
+static __inline int
+ahc_linux_map_seg(struct ahc_softc *ahc, struct scb *scb,
+		  struct ahc_dma_seg *sg, bus_addr_t addr, bus_size_t len)
+{
+	int	 consumed;
+
+	if ((scb->sg_count + 1) > AHC_NSEG)
+		panic("Too few segs for dma mapping.  "
+		      "Increase AHC_NSEG\n");
+
+	consumed = 1;
+	sg->addr = ahc_htole32(addr & 0xFFFFFFFF);
+	scb->platform_data->xfer_len += len;
+	if (sizeof(bus_addr_t) > 4
+	 && (ahc->flags & AHC_39BIT_ADDRESSING) != 0) {
+		/*
+		 * Due to DAC restrictions, we can't
+		 * cross a 4GB boundary.
+		 */
+		if ((addr ^ (addr + len - 1)) & ~0xFFFFFFFF) {
+			struct	 ahc_dma_seg *next_sg;
+			uint32_t next_len;
+
+			printf("Crossed Seg\n");
+			if ((scb->sg_count + 2) > AHC_NSEG)
+				panic("Too few segs for dma mapping.  "
+				      "Increase AHC_NSEG\n");
+
+			consumed++;
+			next_sg = sg + 1;
+			next_sg->addr = 0;
+			next_len = 0x100000000 - (addr & 0xFFFFFFFF);
+			len -= next_len;
+			next_len |= ((addr >> 8) + 0x1000000) & 0x7F000000;
+			next_sg->len = ahc_htole32(next_len);
+		}
+		len |= (addr >> 8) & 0x7F000000;
+	}
+	sg->len = ahc_htole32(len);
+	return (consumed);
+}
+
 /************************ Shutdown/halt/reboot hook ***************************/
 #include <linux/notifier.h>
 #include <linux/reboot.h>
@@ -736,9 +781,26 @@
 	map = malloc(sizeof(*map), M_DEVBUF, M_NOWAIT);
 	if (map == NULL)
 		return (ENOMEM);
+	/*
+	 * Although we can dma data above 4GB, our
+	 * "consistent" memory is below 4GB for
+	 * space efficiency reasons (only need a 4byte
+	 * address).  For this reason, we have to reset
+	 * our dma mask when doing allocations.
+	 */
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,3)
+	pci_set_dma_mask(ahc->dev_softc, 0xFFFFFFFF);
+#else
+	ahc->dev_softc->dma_mask = 0xFFFFFFFF;
+#endif
 	*vaddr = pci_alloc_consistent(ahc->dev_softc,
 				      dmat->maxsize, &map->bus_addr);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,3)
+	pci_set_dma_mask(ahc->dev_softc, ahc->platform_data->hw_dma_mask);
 #else
+	ahc->dev_softc->dma_mask = ahc->platform_data->hw_dma_mask;
+#endif
+#else /* LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0) */
 	/*
 	 * At least in 2.2.14, malloc is a slab allocator so all
 	 * allocations are aligned.  We assume, for these kernel versions
@@ -1131,6 +1193,15 @@
 	return (0);
 }
 
+uint64_t
+ahc_linux_get_memsize()
+{
+	struct sysinfo si;
+
+	si_meminfo(&si);
+	return (si.totalram << PAGE_SHIFT);
+}
+
 /*
  * Find the smallest available unit number to use
  * for a new device.  We don't just use a static
@@ -1240,7 +1311,8 @@
 		return (ENOMEM);
 	memset(ahc->platform_data, 0, sizeof(struct ahc_platform_data));
 	TAILQ_INIT(&ahc->platform_data->completeq);
-	LIST_INIT(&ahc->platform_data->device_runq);
+	TAILQ_INIT(&ahc->platform_data->device_runq);
+	ahc->platform_data->hw_dma_mask = 0xFFFFFFFF;
 	ahc_lockinit(ahc);
 	ahc_done_lockinit(ahc);
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
@@ -1305,6 +1377,8 @@
 	dev = ahc_linux_get_device(ahc, devinfo->channel - 'A',
 				   devinfo->target,
 				   devinfo->lun, /*alloc*/FALSE);
+	if (dev == NULL)
+		return;
 	was_queuing = dev->flags & (AHC_DEV_Q_BASIC|AHC_DEV_Q_TAGGED);
 	now_queuing = alg != AHC_QUEUE_NONE;
 	if ((dev->flags & AHC_DEV_FREEZE_TIL_EMPTY) == 0
@@ -1516,7 +1590,11 @@
 	}
 	cmd->result = CAM_REQ_INPROG << 16;
 	TAILQ_INSERT_TAIL(&dev->busyq, (struct ahc_cmd *)cmd, acmd_links.tqe);
-	ahc_linux_run_device_queue(ahc, dev);
+	if ((dev->flags & AHC_DEV_ON_RUN_LIST) == 0) {
+		TAILQ_INSERT_TAIL(&ahc->platform_data->device_runq, dev, links);
+		dev->flags |= AHC_DEV_ON_RUN_LIST;
+		ahc_linux_run_device_queues(ahc);
+	}
 	ahc_unlock(ahc, &flags);
 	return (0);
 }
@@ -1532,6 +1610,9 @@
 	struct	 ahc_tmode_tstate *tstate;
 	uint16_t mask;
 
+	if ((dev->flags & AHC_DEV_ON_RUN_LIST) != 0)
+		panic("running device on run list");
+
 	while ((acmd = TAILQ_FIRST(&dev->busyq)) != NULL
 	    && dev->openings > 0 && dev->qfrozen == 0) {
 
@@ -1540,11 +1621,9 @@
 		 * running is because the whole controller Q is frozen.
 		 */
 		if (ahc->platform_data->qfrozen != 0) {
-			if ((dev->flags & AHC_DEV_ON_RUN_LIST) != 0)
-				return;
 
-			LIST_INSERT_HEAD(&ahc->platform_data->device_runq,
-					 dev, links);
+			TAILQ_INSERT_TAIL(&ahc->platform_data->device_runq,
+					  dev, links);
 			dev->flags |= AHC_DEV_ON_RUN_LIST;
 			return;
 		}
@@ -1552,14 +1631,10 @@
 		 * Get an scb to use.
 		 */
 		if ((scb = ahc_get_scb(ahc)) == NULL) {
-			if ((dev->flags & AHC_DEV_ON_RUN_LIST) != 0)
-				panic("running device on run list");
-			LIST_INSERT_HEAD(&ahc->platform_data->device_runq,
+			TAILQ_INSERT_TAIL(&ahc->platform_data->device_runq,
 					 dev, links);
 			dev->flags |= AHC_DEV_ON_RUN_LIST;
 			ahc->flags |= AHC_RESOURCE_SHORTAGE;
-			printf("%s: Temporary Resource Shortage\n",
-			       ahc_name(ahc));
 			return;
 		}
 		TAILQ_REMOVE(&dev->busyq, acmd, acmd_links.tqe);
@@ -1611,6 +1686,8 @@
 		}
 
 		scb->platform_data->xfer_len = 0;
+		ahc_set_residual(scb, 0);
+		ahc_set_sense_residual(scb, 0);
 		if (cmd->use_sg != 0) {
 			struct	ahc_dma_seg *sg;
 			struct	scatterlist *cur_seg;
@@ -1623,13 +1700,22 @@
 			end_seg = cur_seg + nseg;
 			/* Copy the segments into the SG list. */
 			sg = scb->sg_list;
+			/*
+			 * The sg_count may be larger than nseg if
+			 * a transfer crosses a 32bit page.
+			 */ 
+			scb->sg_count = 0;
 			while(cur_seg < end_seg) {
-				sg->addr = ahc_htole32(sg_dma_address(cur_seg));
-/* XXX Add in the 5th byte of the address later.*/
-				sg->len = ahc_htole32(sg_dma_len(cur_seg));
-				scb->platform_data->xfer_len +=
-				    sg_dma_len(cur_seg);
-				sg++;
+				bus_addr_t addr;
+				bus_size_t len;
+				int consumed;
+
+				addr = sg_dma_address(cur_seg);
+				len = sg_dma_len(cur_seg);
+				consumed = ahc_linux_map_seg(ahc, scb,
+							     sg, addr, len);
+				sg += consumed;
+				scb->sg_count += consumed;
 				cur_seg++;
 			}
 			sg--;
@@ -1647,24 +1733,19 @@
 			 */
 			scb->hscb->dataptr = scb->sg_list->addr;
 			scb->hscb->datacnt = scb->sg_list->len;
-
-			/*
-			 * Remember the number of segments for later
-			 * residual calculations.
-			 */
-			scb->sg_count = nseg;
 		} else if (cmd->request_bufflen != 0) {
 			struct	 ahc_dma_seg *sg;
-			uint32_t baddr;
+			bus_addr_t addr;
 
 			sg = scb->sg_list;
-			baddr = pci_map_single(ahc->dev_softc,
+			addr = pci_map_single(ahc->dev_softc,
 			       cmd->request_buffer,
 			       cmd->request_bufflen,
 			       scsi_to_pci_dma_dir(cmd->sc_data_direction));
-			sg->addr = ahc_htole32(baddr);
-			sg->len = ahc_htole32(cmd->request_bufflen
-					      | AHC_DMA_LAST_SEG);
+			scb->sg_count = ahc_linux_map_seg(ahc, scb,
+							  sg, addr,
+							  cmd->request_bufflen);
+			sg->len |= ahc_htole32(AHC_DMA_LAST_SEG);
 
 			/*
 			 * Reset the sg list pointer.
@@ -1678,13 +1759,6 @@
 			 */
 			scb->hscb->dataptr = sg->addr;
 			scb->hscb->datacnt = sg->len;
-			scb->platform_data->xfer_len = cmd->request_bufflen;
-
-			/*
-			 * Remember the number of segments for later
-			 * residual calculations.
-			 */
-			scb->sg_count = 1;
 		} else {
 			scb->hscb->sgptr = ahc_htole32(SG_LIST_NULL);
 			scb->hscb->dataptr = 0;
@@ -1692,6 +1766,7 @@
 			scb->sg_count = 0;
 		}
 
+		ahc_sync_sglist(ahc, scb, BUS_DMASYNC_PREWRITE);
 		LIST_INSERT_HEAD(&ahc->pending_scbs, scb, pending_links);
 		dev->openings--;
 		dev->active++;
@@ -1936,7 +2011,10 @@
 		break;
         case AC_BUS_RESET:
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
-		scsi_report_bus_reset(ahc->platform_data->host, channel - 'A');
+		if (ahc->platform_data->host != NULL) {
+			scsi_report_bus_reset(ahc->platform_data->host,
+					      channel - 'A');
+		}
 #endif
                 break;
         default:
@@ -1978,6 +2056,15 @@
 		memcpy(cmd->sense_buffer, ahc_get_sense_buf(ahc, scb),
 		       MIN(sizeof(struct scsi_sense_data),
 			   sizeof(cmd->sense_buffer)));
+		cmd->result |= (DRIVER_SENSE << 24);
+	} else {
+		/*
+		 * Guard against stale sense data.
+		 * The Linux mid-layer assumes that sense
+		 * was retrieved anytime the first byte of
+		 * the sense buffer looks "sane".
+		 */
+		cmd->sense_buffer[0] = 0;
 	}
 	if (ahc_get_transaction_status(scb) == CAM_REQ_INPROG) {
 		uint32_t amount_xferred;
@@ -1992,7 +2079,7 @@
 			ahc_set_transaction_status(scb, CAM_DATA_RUN_ERR);
 		} else {
 			ahc_set_transaction_status(scb, CAM_REQ_CMP);
-			ahc_linux_sniff_command(ahc, cmd);
+			ahc_linux_sniff_command(ahc, cmd, scb);
 		}
 	} else if (ahc_get_transaction_status(scb) == DID_OK) {
 		ahc_linux_handle_scsi_status(ahc, dev, scb);
@@ -2031,7 +2118,7 @@
 		 && dev->active == 0)
 			ahc_linux_free_device(ahc, dev);
 	} else if ((dev->flags & AHC_DEV_ON_RUN_LIST) == 0) {
-		LIST_INSERT_HEAD(&ahc->platform_data->device_runq, dev, links);
+		TAILQ_INSERT_TAIL(&ahc->platform_data->device_runq, dev, links);
 		dev->flags |= AHC_DEV_ON_RUN_LIST;
 	}
 
@@ -2127,12 +2214,13 @@
 }
 
 static void
-ahc_linux_filter_command(struct ahc_softc *ahc, Scsi_Cmnd *cmd)
+ahc_linux_filter_command(struct ahc_softc *ahc, Scsi_Cmnd *cmd, struct scb *scb)
 {
 	switch (cmd->cmnd[0]) {
 	case INQUIRY:
 	{
 		struct	ahc_devinfo devinfo;
+		struct	scsi_inquiry *inq;
 		struct	scsi_inquiry_data *sid;
 		struct	ahc_initiator_tinfo *targ_info;
 		struct	ahc_tmode_tstate *tstate;
@@ -2140,17 +2228,30 @@
 		struct	ahc_linux_device *dev;
 		u_int	scsiid;
 		u_int	maxsync;
+		int	transferred_len;
 		int	minlen;
 		u_int	width;
 		u_int	period;
 		u_int	offset;
 		u_int	ppr_options;
 
+		 /*
+		  * Validate the command.  We only want to filter
+		  * standard inquiry commands, not those querying
+		  * Vital Product Data.
+		  */
+		inq = (struct scsi_inquiry *)cmd->cmnd;
+		if ((inq->byte2 & SI_EVPD) != 0
+		 || inq->page_code != 0)
+			break;
+
 		if (cmd->use_sg != 0) {
 			printf("%s: SG Inquiry response ignored\n",
 			       ahc_name(ahc));
 			break;
 		}
+		transferred_len = ahc_get_transfer_length(scb)
+				- ahc_get_residual(scb);
 		sid = (struct scsi_inquiry_data *)cmd->request_buffer;
 
 		/*
@@ -2163,7 +2264,7 @@
 		dev = ahc_linux_get_device(ahc, cmd->channel,
 					   cmd->target, cmd->lun,
 					   /*alloc*/FALSE);
-		if (cmd->request_bufflen >= 1
+		if (transferred_len >= 1
 		 && SID_QUAL(sid) == SID_QUAL_LU_CONNECTED) {
 
 			dev->flags &= ~AHC_DEV_UNCONFIGURED;
@@ -2184,13 +2285,12 @@
 		targ_info = ahc_fetch_transinfo(ahc, devinfo.channel,
 						devinfo.our_scsiid,
 						devinfo.target, &tstate);
-		/* Structure copy */
 		width = targ_info->user.width;
 		period = targ_info->user.period;
 		offset = targ_info->user.offset;
 		ppr_options = targ_info->user.ppr_options;
 		minlen = offsetof(struct scsi_inquiry_data, version) + 1;
-		if (cmd->request_bufflen >= minlen) {
+		if (transferred_len >= minlen) {
 			targ_info->curr.protocol_version = SID_ANSI_REV(sid);
 
 			/*
@@ -2206,7 +2306,7 @@
 		}
 
 		minlen = offsetof(struct scsi_inquiry_data, flags) + 1;
-		if (cmd->request_bufflen >= minlen
+		if (transferred_len >= minlen
 		 && (sid->additional_length + 4) >= minlen) {
 			if ((sid->flags & SID_WBus16) == 0)
 				width = MSG_EXT_WDTR_BUS_8_BIT;
@@ -2231,7 +2331,7 @@
 		 * available.
 		 */
 		if ((sid->additional_length + 4) >= minlen) {
-			if (cmd->request_bufflen >= minlen
+			if (transferred_len >= minlen
 			 && (sid->spi3data & SID_SPI_CLOCK_DT) == 0)
 				ppr_options = 0;
 
diff -u --recursive --new-file v2.4.8/linux/drivers/scsi/aic7xxx/aic7xxx_linux_pci.c linux/drivers/scsi/aic7xxx/aic7xxx_linux_pci.c
--- v2.4.8/linux/drivers/scsi/aic7xxx/aic7xxx_linux_pci.c	Wed Jul 25 17:10:23 2001
+++ linux/drivers/scsi/aic7xxx/aic7xxx_linux_pci.c	Sun Aug 12 17:37:53 2001
@@ -1,7 +1,7 @@
 /*
  * Linux driver attachment glue for PCI based controllers.
  *
- * Copyright (c) 2000 Adaptec Inc.
+ * Copyright (c) 2000, 2001 Adaptec Inc.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -14,7 +14,7 @@
  *    derived from this software without specific prior written permission.
  *
  * Alternatively, this software may be distributed under the terms of the
- * GNU Public License ("GPL").
+ * GNU General Public License ("GPL").
  *
  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
@@ -28,7 +28,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $Id: //depot/src/linux/drivers/scsi/aic7xxx/aic7xxx_linux_pci.c#17 $
+ * $Id: //depot/src/linux/drivers/scsi/aic7xxx/aic7xxx_linux_pci.c#23 $
  */
 
 #include "aic7xxx_osm.h"
@@ -42,13 +42,9 @@
 static int	ahc_linux_pci_dev_probe(struct pci_dev *pdev,
 					const struct pci_device_id *ent);
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
-#include <linux/module.h>
-
 static void	ahc_linux_pci_dev_remove(struct pci_dev *pdev);
 
-/* We do our own ID filtering.  So we grab all Adaptec SCSI storage class
- * devices here.
- */
+/* We do our own ID filtering.  So, grab all SCSI storage class devices. */
 static struct pci_device_id ahc_linux_pci_id_table[] = {
 	{
 		0x9004, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
@@ -60,7 +56,6 @@
 	},
 	{ 0 }
 };
-MODULE_DEVICE_TABLE(pci,ahc_linux_pci_id_table);
 
 struct pci_driver aic7xxx_pci_driver = {
 	name:		"aic7xxx",
@@ -127,6 +122,22 @@
 		return (-ENODEV);
 	}
 	pci_set_master(pdev);
+
+	if (sizeof(bus_addr_t) > 4
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,3)
+	 && ahc_linux_get_memsize() > 0x80000000
+	 && pci_set_dma_mask(pdev, 0x7FFFFFFFFFULL) == 0) {
+#else
+	 && ahc_linux_get_memsize() > 0x80000000) {
+		ahc->dev_softc->dma_mask = 
+		    (bus_addr_t)(0x7FFFFFFFFFULL
+			       & ((1ULL << (sizeof(bus_addr_t) * 8))-1));
+#endif
+		ahc->flags |= AHC_39BIT_ADDRESSING;
+		ahc->platform_data->hw_dma_mask =
+		    (bus_addr_t)(0x7FFFFFFFFFULL
+			       & ((1ULL << (sizeof(bus_addr_t) * 8))-1));
+	}
 #endif
 	ahc->dev_softc = pci;
 	ahc->platform_data->irq = pdev->irq;
@@ -196,9 +207,11 @@
 {
 	uint32_t command;
 	u_long	 base;
+#ifdef MMAPIO
 	u_long	 start;
 	u_long	 base_page;
 	u_long	 base_offset;
+#endif
 	uint8_t *maddr;
 
 	command = ahc_pci_read_config(ahc->dev_softc, PCIR_COMMAND, 4);
diff -u --recursive --new-file v2.4.8/linux/drivers/scsi/aic7xxx/aic7xxx_osm.h linux/drivers/scsi/aic7xxx/aic7xxx_osm.h
--- v2.4.8/linux/drivers/scsi/aic7xxx/aic7xxx_osm.h	Fri May  4 15:16:28 2001
+++ linux/drivers/scsi/aic7xxx/aic7xxx_osm.h	Sun Aug 12 10:51:42 2001
@@ -18,7 +18,7 @@
  * along with this program; see the file COPYING.  If not, write to
  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  * 
- * $Id: //depot/src/linux/drivers/scsi/aic7xxx/aic7xxx_linux.h#59 $
+ * $Id: //depot/src/linux/drivers/scsi/aic7xxx/aic7xxx_linux.h#65 $
  *
  * Copyright (c) 2000, 2001 Adaptec Inc.
  * All rights reserved.
@@ -47,7 +47,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $Id: //depot/src/linux/drivers/scsi/aic7xxx/aic7xxx_linux.h#59 $
+ * $Id: //depot/src/linux/drivers/scsi/aic7xxx/aic7xxx_linux.h#65 $
  *
  */
 #ifndef _AIC7XXX_LINUX_H_
@@ -58,7 +58,7 @@
 #include <linux/blkdev.h>
 #include <linux/delay.h>
 #include <linux/ioport.h>
-#include <linux/malloc.h>
+#include <linux/slab.h>
 #include <linux/pci.h>
 #include <linux/version.h>
 
@@ -159,6 +159,7 @@
 					 */
 
 #define BUS_SPACE_MAXADDR	0xFFFFFFFF
+#define BUS_SPACE_MAXADDR_32BIT	0xFFFFFFFF
 #define BUS_SPACE_MAXSIZE_32BIT	0xFFFFFFFF
 
 int	ahc_dma_tag_create(struct ahc_softc *, bus_dma_tag_t /*parent*/,
@@ -188,8 +189,23 @@
 
 int	ahc_dmamap_unload(struct ahc_softc *, bus_dma_tag_t, bus_dmamap_t);
 
-/* XXX May do selective memory barrier operations on certain platforms */
-#define ahc_dmamap_sync(ahc, dma_tag, dmamap, op)
+/*
+ * Operations performed by ahc_dmamap_sync().
+ */
+#define BUS_DMASYNC_PREREAD	0x01	/* pre-read synchronization */
+#define BUS_DMASYNC_POSTREAD	0x02	/* post-read synchronization */
+#define BUS_DMASYNC_PREWRITE	0x04	/* pre-write synchronization */
+#define BUS_DMASYNC_POSTWRITE	0x08	/* post-write synchronization */
+
+/*
+ * XXX
+ * ahc_dmamap_sync is only used on buffers allocated with
+ * the pci_alloc_consistent() API.  Although I'm not sure how
+ * this works on architectures with a write buffer, Linux does
+ * not have an API to sync "coherent" memory.  Perhaps we need
+ * to do an mb()?
+ */
+#define ahc_dmamap_sync(ahc, dma_tag, dmamap, offset, len, op)
 
 /************************** SCSI Constants/Structures *************************/
 #define SCSI_REV_2 2
@@ -230,6 +246,17 @@
 	uint8_t	extra_bytes[14];
 };
 
+struct scsi_inquiry
+{ 
+	u_int8_t opcode;
+	u_int8_t byte2;
+#define	SI_EVPD 0x01
+	u_int8_t page_code;
+	u_int8_t reserved;
+	u_int8_t length;
+	u_int8_t control;
+};
+
 struct scsi_inquiry_data
 {
 	uint8_t device;
@@ -349,7 +376,7 @@
 #include <linux/smp.h>
 #endif
 
-#define AIC7XXX_DRIVER_VERSION  "6.1.13"
+#define AIC7XXX_DRIVER_VERSION  "6.2.1"
 
 /**************************** Front End Queues ********************************/
 /*
@@ -400,7 +427,7 @@
 
 struct ahc_linux_target;
 struct ahc_linux_device {
-	LIST_ENTRY(ahc_linux_device) links;
+	TAILQ_ENTRY(ahc_linux_device) links;
 	struct		ahc_busyq busyq;
 
 	/*
@@ -513,7 +540,7 @@
 	 * Fields accessed from interrupt context.
 	 */
 	struct ahc_linux_target *targets[AHC_NUM_TARGETS]; 
-	LIST_HEAD(, ahc_linux_device) device_runq;
+	TAILQ_HEAD(, ahc_linux_device) device_runq;
 	struct ahc_completeq	 completeq;
 
 #if LINUX_VERSION_CODE > KERNEL_VERSION(2,1,0)
@@ -526,6 +553,7 @@
 	uint32_t		 irq;		/* IRQ for this adapter */
 	uint32_t		 bios_address;
 	uint32_t		 mem_busaddr;	/* Mem Base Addr */
+	bus_addr_t		 hw_dma_mask;
 };
 
 /************************** OS Utility Wrappers *******************************/
@@ -552,26 +580,8 @@
 
 
 /***************************** Low Level I/O **********************************/
-#if defined(__powerpc__)
-#define MMAPIO
-#ifdef mb
-#undef mb
-#endif
-#define mb() \
-	__asm__ __volatile__("eieio" ::: "memory")
-#elif defined(__i386__)
+#if defined(__powerpc__) || defined(__i386__) || defined(__ia64__)
 #define MMAPIO
-#ifdef mb
-#undef mb
-#endif
-#define mb() \
-	do { ; } while(0)
-#elif defined(__alpha__)
-#ifdef mb
-#undef mb
-#endif
-#define mb() \
-	__asm__ __volatile__("mb": : :"memory")
 #endif
 
 static __inline uint8_t ahc_inb(struct ahc_softc * ahc, long port);
@@ -643,8 +653,10 @@
 }
 
 /**************************** Initialization **********************************/
-int	ahc_linux_register_host(struct ahc_softc *,
-				Scsi_Host_Template *);
+int		ahc_linux_register_host(struct ahc_softc *,
+					Scsi_Host_Template *);
+
+uint64_t	ahc_linux_get_memsize(void);
 
 /*************************** Pretty Printing **********************************/
 struct info_str {
@@ -846,6 +858,7 @@
 	default:
 		panic("ahc_pci_read_config: Read size too big");
 		/* NOTREACHED */
+		return (0);
 	}
 }
 
diff -u --recursive --new-file v2.4.8/linux/drivers/scsi/aic7xxx/aic7xxx_pci.c linux/drivers/scsi/aic7xxx/aic7xxx_pci.c
--- v2.4.8/linux/drivers/scsi/aic7xxx/aic7xxx_pci.c	Fri May  4 15:16:28 2001
+++ linux/drivers/scsi/aic7xxx/aic7xxx_pci.c	Sun Aug 12 17:37:53 2001
@@ -16,7 +16,7 @@
  *    derived from this software without specific prior written permission.
  *
  * Alternatively, this software may be distributed under the terms of the
- * GNU Public License ("GPL").
+ * GNU General Public License ("GPL").
  *
  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
@@ -30,7 +30,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $Id: //depot/src/aic7xxx/aic7xxx_pci.c#24 $
+ * $Id: //depot/src/aic7xxx/aic7xxx_pci.c#28 $
  *
  * $FreeBSD: src/sys/dev/aic7xxx/aic7xxx_pci.c,v 1.6 2000/11/10 20:13:41 gibbs Exp $
  */
@@ -628,9 +628,10 @@
 #define	DEVCONFIG		0x40
 #define		SCBSIZE32	0x00010000ul	/* aic789X only */
 #define		REXTVALID	0x00001000ul	/* ultra cards only */
-#define		MPORTMODE	0x00000400ul	/* aic7870 only */
-#define		RAMPSM		0x00000200ul	/* aic7870 only */
+#define		MPORTMODE	0x00000400ul	/* aic7870+ only */
+#define		RAMPSM		0x00000200ul	/* aic7870+ only */
 #define		VOLSENSE	0x00000100ul
+#define		PCI64BIT	0x00000080ul	/* 64Bit PCI bus (Ultra2 Only)*/
 #define		SCBRAMSEL	0x00000080ul
 #define		MRDCEN		0x00000040ul
 #define		EXTSCBTIME	0x00000020ul	/* aic7870 only */
@@ -693,9 +694,16 @@
 				 subdevice,
 				 subvendor);
 
-	/* If the second function is not hooked up, ignore it. */
+	/*
+	 * If the second function is not hooked up, ignore it.
+	 * Unfortunately, not all MB vendors implement the
+	 * subdevice ID as per the Adaptec spec, so do our best
+	 * to sanity check it prior to accepting the subdevice
+	 * ID as valid.
+	 */
 	if (ahc_get_pci_function(pci) > 0
 	 && subvendor == 0x9005
+	 && subdevice != device
 	 && SUBID_9005_TYPE_KNOWN(subdevice) != 0
 	 && SUBID_9005_MFUNCENB(subdevice) == 0)
 		return (NULL);
@@ -715,7 +723,6 @@
 int
 ahc_pci_config(struct ahc_softc *ahc, struct ahc_pci_identity *entry)
 {
-	struct		 ahc_probe_config probe_config;
 	struct scb_data *shared_scb_data;
 	u_int		 command;
 	u_int		 our_id = 0;
@@ -726,12 +733,11 @@
 	uint8_t		 sblkctl;
 
 	shared_scb_data = NULL;
-	ahc_init_probe_config(&probe_config);
-	error = entry->setup(ahc->dev_softc, &probe_config);
+	error = entry->setup(ahc);
 	if (error != 0)
 		return (error);
-	probe_config.chip |= AHC_PCI;
-	probe_config.description = entry->name;
+	ahc->chip |= AHC_PCI;
+	ahc->description = entry->name;
 
 	error = ahc_pci_map_registers(ahc);
 	if (error != 0)
@@ -739,15 +745,34 @@
 
 	ahc_power_state_change(ahc, AHC_POWER_STATE_D0);
 
+	/*
+	 * If we need to support high memory, enable dual
+	 * address cycles.  This bit must be set to enable
+	 * high address bit generation even if we are on a
+	 * 64bit bus (PCI64BIT set in devconfig).
+	 */
+	if ((ahc->flags & AHC_39BIT_ADDRESSING) != 0) {
+		uint32_t devconfig;
+
+		if (bootverbose)
+			printf("%s: Enabling 39Bit Addressing\n",
+			       ahc_name(ahc));
+		devconfig = ahc_pci_read_config(ahc->dev_softc,
+						DEVCONFIG, /*bytes*/4);
+		devconfig |= DACEN;
+		ahc_pci_write_config(ahc->dev_softc, DEVCONFIG,
+				     devconfig, /*bytes*/4);
+	}
+	
 	/* Ensure busmastering is enabled */
 	command = ahc_pci_read_config(ahc->dev_softc, PCIR_COMMAND, /*bytes*/1);
 	command |= PCIM_CMD_BUSMASTEREN;
 	ahc_pci_write_config(ahc->dev_softc, PCIR_COMMAND, command, /*bytes*/1);
 
 	/* On all PCI adapters, we allow SCB paging */
-	probe_config.flags |= AHC_PAGESCBS;
+	ahc->flags |= AHC_PAGESCBS;
 
-	error = ahc_softc_init(ahc, &probe_config);
+	error = ahc_softc_init(ahc);
 	if (error != 0)
 		return (error);
 
@@ -815,6 +840,14 @@
 				/*bytes*/1) & CACHESIZE;
 	ahc->pci_cachesize *= 4;
 
+	if ((ahc->bugs & AHC_PCI_2_1_RETRY_BUG) != 0
+	 && ahc->pci_cachesize == 4) {
+
+		ahc_pci_write_config(ahc->dev_softc, CSIZE_LATTIME,
+				     0, /*bytes*/1);
+		ahc->pci_cachesize = 0;
+	}
+
 	/*
 	 * We cannot perform ULTRA speeds without the presense
 	 * of the external precision resistor.
@@ -1764,14 +1797,15 @@
 		printf("%s: Data Parity Error has been reported via PERR#\n",
 		       ahc_name(ahc));
 	}
-	if ((status1 & (DPE|SSE|RMA|RTA|STA|DPR)) == 0) {
-		printf("%s: Latched PCIERR interrupt with "
-		       "no status bits set\n", ahc_name(ahc)); 
-	}
+
+	/* Clear latched errors. */
 	ahc_pci_write_config(ahc->dev_softc, PCIR_STATUS + 1,
 			     status1, /*bytes*/1);
 
-	if (status1 & (DPR|RMA|RTA)) {
+	if ((status1 & (DPE|SSE|RMA|RTA|STA|DPR)) == 0) {
+		printf("%s: Latched PCIERR interrupt with "
+		       "no status bits set\n", ahc_name(ahc)); 
+	} else {
 		ahc_outb(ahc, CLRINT, CLRPARERR);
 	}
 
@@ -1779,187 +1813,204 @@
 }
 
 static int
-ahc_aic785X_setup(ahc_dev_softc_t pci, struct ahc_probe_config *probe_config)
+ahc_aic785X_setup(struct ahc_softc *ahc)
 {
+	ahc_dev_softc_t pci;
 	uint8_t rev;
 
-	probe_config->channel = 'A';
-	probe_config->chip = AHC_AIC7850;
-	probe_config->features = AHC_AIC7850_FE;
-	probe_config->bugs |= AHC_TMODE_WIDEODD_BUG|AHC_CACHETHEN_BUG
-			   |  AHC_PCI_MWI_BUG;
+	pci = ahc->dev_softc;
+	ahc->channel = 'A';
+	ahc->chip = AHC_AIC7850;
+	ahc->features = AHC_AIC7850_FE;
+	ahc->bugs |= AHC_TMODE_WIDEODD_BUG|AHC_CACHETHEN_BUG|AHC_PCI_MWI_BUG;
 	rev = ahc_pci_read_config(pci, PCIR_REVID, /*bytes*/1);
 	if (rev >= 1)
-		probe_config->bugs |= AHC_PCI_2_1_RETRY_BUG;
+		ahc->bugs |= AHC_PCI_2_1_RETRY_BUG;
 	return (0);
 }
 
 static int
-ahc_aic7860_setup(ahc_dev_softc_t pci, struct ahc_probe_config *probe_config)
+ahc_aic7860_setup(struct ahc_softc *ahc)
 {
+	ahc_dev_softc_t pci;
 	uint8_t rev;
 
-	probe_config->channel = 'A';
-	probe_config->chip = AHC_AIC7860;
-	probe_config->features = AHC_AIC7860_FE;
-	probe_config->bugs |= AHC_TMODE_WIDEODD_BUG|AHC_CACHETHEN_BUG
-			   |  AHC_PCI_MWI_BUG;
+	pci = ahc->dev_softc;
+	ahc->channel = 'A';
+	ahc->chip = AHC_AIC7860;
+	ahc->features = AHC_AIC7860_FE;
+	ahc->bugs |= AHC_TMODE_WIDEODD_BUG|AHC_CACHETHEN_BUG|AHC_PCI_MWI_BUG;
 	rev = ahc_pci_read_config(pci, PCIR_REVID, /*bytes*/1);
 	if (rev >= 1)
-		probe_config->bugs |= AHC_PCI_2_1_RETRY_BUG;
+		ahc->bugs |= AHC_PCI_2_1_RETRY_BUG;
 	return (0);
 }
 
 static int
-ahc_apa1480_setup(ahc_dev_softc_t pci, struct ahc_probe_config *probe_config)
+ahc_apa1480_setup(struct ahc_softc *ahc)
 {
+	ahc_dev_softc_t pci;
 	int error;
 
-	error = ahc_aic7860_setup(pci, probe_config);
+	pci = ahc->dev_softc;
+	error = ahc_aic7860_setup(ahc);
 	if (error != 0)
 		return (error);
-	probe_config->features |= AHC_REMOVABLE;
+	ahc->features |= AHC_REMOVABLE;
 	return (0);
 }
 
 static int
-ahc_aic7870_setup(ahc_dev_softc_t pci, struct ahc_probe_config *probe_config)
+ahc_aic7870_setup(struct ahc_softc *ahc)
 {
-	probe_config->channel = 'A';
-	probe_config->chip = AHC_AIC7870;
-	probe_config->features = AHC_AIC7870_FE;
-	probe_config->bugs |= AHC_TMODE_WIDEODD_BUG|AHC_CACHETHEN_BUG
-			   |  AHC_PCI_MWI_BUG;
+	ahc_dev_softc_t pci;
+
+	pci = ahc->dev_softc;
+	ahc->channel = 'A';
+	ahc->chip = AHC_AIC7870;
+	ahc->features = AHC_AIC7870_FE;
+	ahc->bugs |= AHC_TMODE_WIDEODD_BUG|AHC_CACHETHEN_BUG|AHC_PCI_MWI_BUG;
 	return (0);
 }
 
 static int
-ahc_aha394X_setup(ahc_dev_softc_t pci, struct ahc_probe_config *probe_config)
+ahc_aha394X_setup(struct ahc_softc *ahc)
 {
 	int error;
 
-	error = ahc_aic7870_setup(pci, probe_config);
+	error = ahc_aic7870_setup(ahc);
 	if (error == 0)
-		error = ahc_aha394XX_setup(pci, probe_config);
+		error = ahc_aha394XX_setup(ahc);
 	return (error);
 }
 
 static int
-ahc_aha398X_setup(ahc_dev_softc_t pci, struct ahc_probe_config *probe_config)
+ahc_aha398X_setup(struct ahc_softc *ahc)
 {
 	int error;
 
-	error = ahc_aic7870_setup(pci, probe_config);
+	error = ahc_aic7870_setup(ahc);
 	if (error == 0)
-		error = ahc_aha398XX_setup(pci, probe_config);
+		error = ahc_aha398XX_setup(ahc);
 	return (error);
 }
 
 static int
-ahc_aha494X_setup(ahc_dev_softc_t pci, struct ahc_probe_config *probe_config)
+ahc_aha494X_setup(struct ahc_softc *ahc)
 {
 	int error;
 
-	error = ahc_aic7870_setup(pci, probe_config);
+	error = ahc_aic7870_setup(ahc);
 	if (error == 0)
-		error = ahc_aha494XX_setup(pci, probe_config);
+		error = ahc_aha494XX_setup(ahc);
 	return (error);
 }
 
 static int
-ahc_aic7880_setup(ahc_dev_softc_t pci, struct ahc_probe_config *probe_config)
+ahc_aic7880_setup(struct ahc_softc *ahc)
 {
+	ahc_dev_softc_t pci;
 	uint8_t rev;
 
-	probe_config->channel = 'A';
-	probe_config->chip = AHC_AIC7880;
-	probe_config->features = AHC_AIC7880_FE;
-	probe_config->bugs |= AHC_TMODE_WIDEODD_BUG;
+	pci = ahc->dev_softc;
+	ahc->channel = 'A';
+	ahc->chip = AHC_AIC7880;
+	ahc->features = AHC_AIC7880_FE;
+	ahc->bugs |= AHC_TMODE_WIDEODD_BUG;
 	rev = ahc_pci_read_config(pci, PCIR_REVID, /*bytes*/1);
 	if (rev >= 1) {
-		probe_config->bugs |= AHC_PCI_2_1_RETRY_BUG;
+		ahc->bugs |= AHC_PCI_2_1_RETRY_BUG;
 	} else {
-		probe_config->bugs |= AHC_CACHETHEN_BUG|AHC_PCI_MWI_BUG;
+		ahc->bugs |= AHC_CACHETHEN_BUG|AHC_PCI_MWI_BUG;
 	}
 	return (0);
 }
 
 static int
-ahc_aha2940Pro_setup(ahc_dev_softc_t pci, struct ahc_probe_config *probe_config)
+ahc_aha2940Pro_setup(struct ahc_softc *ahc)
 {
+	ahc_dev_softc_t pci;
 	int error;
 
-	probe_config->flags |= AHC_INT50_SPEEDFLEX;
-	error = ahc_aic7880_setup(pci, probe_config);
+	pci = ahc->dev_softc;
+	ahc->flags |= AHC_INT50_SPEEDFLEX;
+	error = ahc_aic7880_setup(ahc);
 	return (0);
 }
 
 static int
-ahc_aha394XU_setup(ahc_dev_softc_t pci, struct ahc_probe_config *probe_config)
+ahc_aha394XU_setup(struct ahc_softc *ahc)
 {
 	int error;
 
-	error = ahc_aic7880_setup(pci, probe_config);
+	error = ahc_aic7880_setup(ahc);
 	if (error == 0)
-		error = ahc_aha394XX_setup(pci, probe_config);
+		error = ahc_aha394XX_setup(ahc);
 	return (error);
 }
 
 static int
-ahc_aha398XU_setup(ahc_dev_softc_t pci, struct ahc_probe_config *probe_config)
+ahc_aha398XU_setup(struct ahc_softc *ahc)
 {
 	int error;
 
-	error = ahc_aic7880_setup(pci, probe_config);
+	error = ahc_aic7880_setup(ahc);
 	if (error == 0)
-		error = ahc_aha398XX_setup(pci, probe_config);
+		error = ahc_aha398XX_setup(ahc);
 	return (error);
 }
 
 static int
-ahc_aic7890_setup(ahc_dev_softc_t pci, struct ahc_probe_config *probe_config)
+ahc_aic7890_setup(struct ahc_softc *ahc)
 {
+	ahc_dev_softc_t pci;
 	uint8_t rev;
 
-	probe_config->channel = 'A';
-	probe_config->chip = AHC_AIC7890;
-	probe_config->features = AHC_AIC7890_FE;
-	probe_config->flags |= AHC_NEWEEPROM_FMT;
+	pci = ahc->dev_softc;
+	ahc->channel = 'A';
+	ahc->chip = AHC_AIC7890;
+	ahc->features = AHC_AIC7890_FE;
+	ahc->flags |= AHC_NEWEEPROM_FMT;
 	rev = ahc_pci_read_config(pci, PCIR_REVID, /*bytes*/1);
 	if (rev == 0)
-		probe_config->bugs |= AHC_AUTOFLUSH_BUG|AHC_CACHETHEN_BUG;
+		ahc->bugs |= AHC_AUTOFLUSH_BUG|AHC_CACHETHEN_BUG;
 	return (0);
 }
 
 static int
-ahc_aic7892_setup(ahc_dev_softc_t pci, struct ahc_probe_config *probe_config)
+ahc_aic7892_setup(struct ahc_softc *ahc)
 {
-	probe_config->channel = 'A';
-	probe_config->chip = AHC_AIC7892;
-	probe_config->features = AHC_AIC7892_FE;
-	probe_config->flags |= AHC_NEWEEPROM_FMT;
-	probe_config->bugs |= AHC_SCBCHAN_UPLOAD_BUG;
+	ahc_dev_softc_t pci;
+
+	pci = ahc->dev_softc;
+	ahc->channel = 'A';
+	ahc->chip = AHC_AIC7892;
+	ahc->features = AHC_AIC7892_FE;
+	ahc->flags |= AHC_NEWEEPROM_FMT;
+	ahc->bugs |= AHC_SCBCHAN_UPLOAD_BUG;
 	return (0);
 }
 
 static int
-ahc_aic7895_setup(ahc_dev_softc_t pci, struct ahc_probe_config *probe_config)
+ahc_aic7895_setup(struct ahc_softc *ahc)
 {
+	ahc_dev_softc_t pci;
 	uint8_t rev;
 
-	probe_config->channel = ahc_get_pci_function(pci) == 1 ? 'B' : 'A';
+	pci = ahc->dev_softc;
+	ahc->channel = ahc_get_pci_function(pci) == 1 ? 'B' : 'A';
 	/*
 	 * The 'C' revision of the aic7895 has a few additional features.
 	 */
 	rev = ahc_pci_read_config(pci, PCIR_REVID, /*bytes*/1);
 	if (rev >= 4) {
-		probe_config->chip = AHC_AIC7895C;
-		probe_config->features = AHC_AIC7895C_FE;
+		ahc->chip = AHC_AIC7895C;
+		ahc->features = AHC_AIC7895C_FE;
 	} else  {
 		u_int command;
 
-		probe_config->chip = AHC_AIC7895;
-		probe_config->features = AHC_AIC7895_FE;
+		ahc->chip = AHC_AIC7895;
+		ahc->features = AHC_AIC7895_FE;
 
 		/*
 		 * The BIOS disables the use of MWI transactions
@@ -1970,14 +2021,14 @@
 		command = ahc_pci_read_config(pci, PCIR_COMMAND, /*bytes*/1);
 		command |= PCIM_CMD_MWRICEN;
 		ahc_pci_write_config(pci, PCIR_COMMAND, command, /*bytes*/1);
-		probe_config->bugs |= AHC_PCI_MWI_BUG;
+		ahc->bugs |= AHC_PCI_MWI_BUG;
 	}
 	/*
 	 * XXX Does CACHETHEN really not work???  What about PCI retry?
 	 * on C level chips.  Need to test, but for now, play it safe.
 	 */
-	probe_config->bugs |= AHC_TMODE_WIDEODD_BUG|AHC_PCI_2_1_RETRY_BUG
-			   |  AHC_CACHETHEN_BUG;
+	ahc->bugs |= AHC_TMODE_WIDEODD_BUG|AHC_PCI_2_1_RETRY_BUG
+		  |  AHC_CACHETHEN_BUG;
 
 #if 0
 	uint32_t devconfig;
@@ -1991,116 +2042,131 @@
 	devconfig |= MRDCEN;
 	ahc_pci_write_config(pci, DEVCONFIG, devconfig, /*bytes*/1);
 #endif
-	probe_config->flags |= AHC_NEWEEPROM_FMT;
+	ahc->flags |= AHC_NEWEEPROM_FMT;
 	return (0);
 }
 
 static int
-ahc_aic7896_setup(ahc_dev_softc_t pci, struct ahc_probe_config *probe_config)
+ahc_aic7896_setup(struct ahc_softc *ahc)
 {
-	probe_config->channel = ahc_get_pci_function(pci) == 1 ? 'B' : 'A';
-	probe_config->chip = AHC_AIC7896;
-	probe_config->features = AHC_AIC7896_FE;
-	probe_config->flags |= AHC_NEWEEPROM_FMT;
-	probe_config->bugs |= AHC_CACHETHEN_DIS_BUG;
+	ahc_dev_softc_t pci;
+
+	pci = ahc->dev_softc;
+	ahc->channel = ahc_get_pci_function(pci) == 1 ? 'B' : 'A';
+	ahc->chip = AHC_AIC7896;
+	ahc->features = AHC_AIC7896_FE;
+	ahc->flags |= AHC_NEWEEPROM_FMT;
+	ahc->bugs |= AHC_CACHETHEN_DIS_BUG;
 	return (0);
 }
 
 static int
-ahc_aic7899_setup(ahc_dev_softc_t pci, struct ahc_probe_config *probe_config)
+ahc_aic7899_setup(struct ahc_softc *ahc)
 {
-	probe_config->channel = ahc_get_pci_function(pci) == 1 ? 'B' : 'A';
-	probe_config->chip = AHC_AIC7899;
-	probe_config->features = AHC_AIC7899_FE;
-	probe_config->flags |= AHC_NEWEEPROM_FMT;
-	probe_config->bugs |= AHC_SCBCHAN_UPLOAD_BUG;
+	ahc_dev_softc_t pci;
+
+	pci = ahc->dev_softc;
+	ahc->channel = ahc_get_pci_function(pci) == 1 ? 'B' : 'A';
+	ahc->chip = AHC_AIC7899;
+	ahc->features = AHC_AIC7899_FE;
+	ahc->flags |= AHC_NEWEEPROM_FMT;
+	ahc->bugs |= AHC_SCBCHAN_UPLOAD_BUG;
 	return (0);
 }
 
 static int
-ahc_aha29160C_setup(ahc_dev_softc_t pci, struct ahc_probe_config *probe_config)
+ahc_aha29160C_setup(struct ahc_softc *ahc)
 {
 	int error;
 
-	error = ahc_aic7899_setup(pci, probe_config);
+	error = ahc_aic7899_setup(ahc);
 	if (error != 0)
 		return (error);
-	probe_config->features |= AHC_REMOVABLE;
+	ahc->features |= AHC_REMOVABLE;
 	return (0);
 }
 
 static int
-ahc_raid_setup(ahc_dev_softc_t pci, struct ahc_probe_config *probe_config)
+ahc_raid_setup(struct ahc_softc *ahc)
 {
 	printf("RAID functionality unsupported\n");
 	return (ENXIO);
 }
 
 static int
-ahc_aha394XX_setup(ahc_dev_softc_t pci, struct ahc_probe_config *probe_config)
+ahc_aha394XX_setup(struct ahc_softc *ahc)
 {
+	ahc_dev_softc_t pci;
+
+	pci = ahc->dev_softc;
 	switch (ahc_get_pci_slot(pci)) {
 	case AHC_394X_SLOT_CHANNEL_A:
-		probe_config->channel = 'A';
+		ahc->channel = 'A';
 		break;
 	case AHC_394X_SLOT_CHANNEL_B:
-		probe_config->channel = 'B';
+		ahc->channel = 'B';
 		break;
 	default:
 		printf("adapter at unexpected slot %d\n"
 		       "unable to map to a channel\n",
 		       ahc_get_pci_slot(pci));
-		probe_config->channel = 'A';
+		ahc->channel = 'A';
 	}
 	return (0);
 }
 
 static int
-ahc_aha398XX_setup(ahc_dev_softc_t pci, struct ahc_probe_config *probe_config)
+ahc_aha398XX_setup(struct ahc_softc *ahc)
 {
+	ahc_dev_softc_t pci;
+
+	pci = ahc->dev_softc;
 	switch (ahc_get_pci_slot(pci)) {
 	case AHC_398X_SLOT_CHANNEL_A:
-		probe_config->channel = 'A';
+		ahc->channel = 'A';
 		break;
 	case AHC_398X_SLOT_CHANNEL_B:
-		probe_config->channel = 'B';
+		ahc->channel = 'B';
 		break;
 	case AHC_398X_SLOT_CHANNEL_C:
-		probe_config->channel = 'C';
+		ahc->channel = 'C';
 		break;
 	default:
 		printf("adapter at unexpected slot %d\n"
 		       "unable to map to a channel\n",
 		       ahc_get_pci_slot(pci));
-		probe_config->channel = 'A';
+		ahc->channel = 'A';
 		break;
 	}
-	probe_config->flags |= AHC_LARGE_SEEPROM;
+	ahc->flags |= AHC_LARGE_SEEPROM;
 	return (0);
 }
 
 static int
-ahc_aha494XX_setup(ahc_dev_softc_t pci, struct ahc_probe_config *probe_config)
+ahc_aha494XX_setup(struct ahc_softc *ahc)
 {
+	ahc_dev_softc_t pci;
+
+	pci = ahc->dev_softc;
 	switch (ahc_get_pci_slot(pci)) {
 	case AHC_494X_SLOT_CHANNEL_A:
-		probe_config->channel = 'A';
+		ahc->channel = 'A';
 		break;
 	case AHC_494X_SLOT_CHANNEL_B:
-		probe_config->channel = 'B';
+		ahc->channel = 'B';
 		break;
 	case AHC_494X_SLOT_CHANNEL_C:
-		probe_config->channel = 'C';
+		ahc->channel = 'C';
 		break;
 	case AHC_494X_SLOT_CHANNEL_D:
-		probe_config->channel = 'D';
+		ahc->channel = 'D';
 		break;
 	default:
 		printf("adapter at unexpected slot %d\n"
 		       "unable to map to a channel\n",
 		       ahc_get_pci_slot(pci));
-		probe_config->channel = 'A';
+		ahc->channel = 'A';
 	}
-	probe_config->flags |= AHC_LARGE_SEEPROM;
+	ahc->flags |= AHC_LARGE_SEEPROM;
 	return (0);
 }
diff -u --recursive --new-file v2.4.8/linux/drivers/scsi/aic7xxx/aic7xxx_proc.c linux/drivers/scsi/aic7xxx/aic7xxx_proc.c
--- v2.4.8/linux/drivers/scsi/aic7xxx/aic7xxx_proc.c	Fri May  4 15:16:28 2001
+++ linux/drivers/scsi/aic7xxx/aic7xxx_proc.c	Sun Aug 12 17:37:53 2001
@@ -12,7 +12,7 @@
  *    derived from this software without specific prior written permission.
  *
  * Alternatively, this software may be distributed under the terms of the
- * GNU Public License ("GPL").
+ * GNU General Public License ("GPL").
  *
  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
diff -u --recursive --new-file v2.4.8/linux/drivers/scsi/aic7xxx/aic7xxx_reg.h linux/drivers/scsi/aic7xxx/aic7xxx_reg.h
--- v2.4.8/linux/drivers/scsi/aic7xxx/aic7xxx_reg.h	Fri May  4 15:16:28 2001
+++ linux/drivers/scsi/aic7xxx/aic7xxx_reg.h	Sun Aug 12 10:51:42 2001
@@ -1,6 +1,10 @@
 /*
-  * DO NOT EDIT - This file is automatically generated.
-  */
+ * DO NOT EDIT - This file is automatically generated
+ *		 from the following source files:
+ *
+ * $Id: //depot/src/aic7xxx/aic7xxx.seq#33 $
+ * $Id: //depot/src/aic7xxx/aic7xxx.reg#19 $
+ */
 
 #define	SCSISEQ         		0x00
 #define		TEMODE          	0x80
@@ -408,6 +412,11 @@
 #define		BOFF            	0xf0
 #define		BON             	0x0f
 
+#define	DSCOMMAND1      		0x85
+#define		DSLATT          	0xfc
+#define		HADDLDSEL1      	0x02
+#define		HADDLDSEL0      	0x01
+
 #define	BUSSPD          		0x86
 #define		DFTHRSH         	0xc0
 #define		DFTHRSH_75      	0x80
@@ -448,7 +457,7 @@
 #define		PERR_DETECTED   	0x81
 #define		BAD_STATUS      	0x71
 #define		HOST_MSG_LOOP   	0x61
-#define		RESIDUAL        	0x51
+#define		PDATA_REINIT    	0x51
 #define		IGN_WIDE_RES    	0x41
 #define		NO_MATCH        	0x31
 #define		NO_IDENT        	0x21
diff -u --recursive --new-file v2.4.8/linux/drivers/scsi/aic7xxx/aic7xxx_seq.h linux/drivers/scsi/aic7xxx/aic7xxx_seq.h
--- v2.4.8/linux/drivers/scsi/aic7xxx/aic7xxx_seq.h	Fri May  4 15:16:28 2001
+++ linux/drivers/scsi/aic7xxx/aic7xxx_seq.h	Sun Aug 12 10:51:42 2001
@@ -1,10 +1,14 @@
 /*
-  * DO NOT EDIT - This file is automatically generated.
-  */
+ * DO NOT EDIT - This file is automatically generated
+ *		 from the following source files:
+ *
+ * $Id: //depot/src/aic7xxx/aic7xxx.seq#33 $
+ * $Id: //depot/src/aic7xxx/aic7xxx.reg#19 $
+ */
 static uint8_t seqprog[] = {
 	0xb2, 0x00, 0x00, 0x08,
 	0xf7, 0x11, 0x22, 0x08,
-	0x00, 0x65, 0xe4, 0x59,
+	0x00, 0x65, 0xde, 0x59,
 	0xf7, 0x01, 0x02, 0x08,
 	0xff, 0x6a, 0x24, 0x08,
 	0x40, 0x00, 0x40, 0x68,
@@ -17,15 +21,15 @@
 	0x01, 0x4d, 0xc8, 0x30,
 	0x00, 0x4c, 0x12, 0x70,
 	0x01, 0x39, 0xa2, 0x30,
-	0x00, 0x6a, 0x92, 0x5e,
+	0x00, 0x6a, 0xa6, 0x5e,
 	0x01, 0x51, 0x20, 0x31,
 	0x01, 0x57, 0xae, 0x00,
 	0x0d, 0x6a, 0x76, 0x00,
-	0x00, 0x51, 0xec, 0x5d,
+	0x00, 0x51, 0xf8, 0x5d,
 	0x01, 0x51, 0xc8, 0x30,
-	0x00, 0x39, 0xde, 0x60,
+	0x00, 0x39, 0xd8, 0x60,
 	0x00, 0xbb, 0x30, 0x70,
-	0xc1, 0x6a, 0xaa, 0x5e,
+	0xc1, 0x6a, 0xbe, 0x5e,
 	0x01, 0xbf, 0x72, 0x30,
 	0x01, 0x40, 0x7e, 0x31,
 	0x01, 0x90, 0x80, 0x30,
@@ -33,110 +37,107 @@
 	0x01, 0x4d, 0x9a, 0x18,
 	0xfe, 0x57, 0xae, 0x08,
 	0x01, 0x40, 0x20, 0x31,
-	0x00, 0x65, 0xe2, 0x58,
+	0x00, 0x65, 0xdc, 0x58,
 	0x60, 0x0b, 0x40, 0x78,
 	0x08, 0x6a, 0x18, 0x00,
 	0x08, 0x11, 0x22, 0x00,
 	0x60, 0x0b, 0x00, 0x78,
-	0x40, 0x0b, 0x12, 0x69,
-	0x80, 0x0b, 0xcc, 0x78,
+	0x40, 0x0b, 0x0c, 0x69,
+	0x80, 0x0b, 0xc6, 0x78,
 	0x20, 0x6a, 0x16, 0x00,
-	0x20, 0x11, 0x54, 0x68,
-	0x20, 0x6a, 0x18, 0x00,
-	0x20, 0x11, 0x22, 0x00,
 	0xa4, 0x6a, 0x06, 0x00,
 	0x08, 0x3c, 0x78, 0x00,
 	0x01, 0x50, 0xc8, 0x30,
 	0xe0, 0x6a, 0xcc, 0x00,
-	0x48, 0x6a, 0xd6, 0x5d,
+	0x48, 0x6a, 0xe2, 0x5d,
 	0x01, 0x6a, 0xdc, 0x01,
 	0x88, 0x6a, 0xcc, 0x00,
-	0x48, 0x6a, 0xd6, 0x5d,
+	0x48, 0x6a, 0xe2, 0x5d,
 	0x01, 0x6a, 0x26, 0x01,
 	0xf0, 0x19, 0x7a, 0x08,
 	0x0f, 0x18, 0xc8, 0x08,
 	0x0f, 0x0f, 0xc8, 0x08,
 	0x0f, 0x05, 0xc8, 0x08,
 	0x00, 0x3d, 0x7a, 0x00,
-	0x08, 0x1f, 0x74, 0x78,
+	0x08, 0x1f, 0x6e, 0x78,
 	0x80, 0x3d, 0x7a, 0x00,
 	0x01, 0x3d, 0xd8, 0x31,
 	0x01, 0x3d, 0x32, 0x31,
-	0x10, 0x03, 0x5c, 0x79,
-	0x00, 0x65, 0x0a, 0x59,
-	0x80, 0x66, 0xa8, 0x78,
+	0x10, 0x03, 0x56, 0x79,
+	0x00, 0x65, 0x04, 0x59,
+	0x80, 0x66, 0xa2, 0x78,
 	0x01, 0x66, 0xd8, 0x31,
 	0x01, 0x66, 0x32, 0x31,
-	0x40, 0x66, 0x86, 0x68,
+	0x40, 0x66, 0x80, 0x68,
 	0x01, 0x3c, 0x78, 0x00,
-	0x10, 0x03, 0xb0, 0x78,
-	0x00, 0x65, 0x0a, 0x59,
+	0x10, 0x03, 0xaa, 0x78,
+	0x00, 0x65, 0x04, 0x59,
 	0xe0, 0x66, 0xc8, 0x18,
-	0x00, 0x65, 0xb0, 0x50,
+	0x00, 0x65, 0xaa, 0x50,
 	0xdd, 0x66, 0xc8, 0x18,
-	0x00, 0x65, 0xb0, 0x48,
+	0x00, 0x65, 0xaa, 0x48,
 	0x01, 0x66, 0xd8, 0x31,
 	0x01, 0x66, 0x32, 0x31,
-	0x10, 0x03, 0x5c, 0x79,
-	0x00, 0x65, 0x0a, 0x59,
+	0x10, 0x03, 0x56, 0x79,
+	0x00, 0x65, 0x04, 0x59,
 	0x01, 0x66, 0xd8, 0x31,
 	0x01, 0x66, 0x32, 0x31,
 	0x01, 0x66, 0xac, 0x30,
 	0x40, 0x3c, 0x78, 0x00,
-	0x10, 0x03, 0xa6, 0x78,
-	0x00, 0x65, 0x0a, 0x59,
-	0x00, 0x65, 0xb0, 0x40,
-	0x61, 0x6a, 0xaa, 0x5e,
-	0x08, 0x51, 0x34, 0x71,
-	0x02, 0x0b, 0xac, 0x78,
-	0x00, 0x65, 0xa8, 0x40,
+	0x10, 0x03, 0xa0, 0x78,
+	0x00, 0x65, 0x04, 0x59,
+	0x00, 0x65, 0xaa, 0x40,
+	0x61, 0x6a, 0xbe, 0x5e,
+	0x08, 0x51, 0x2e, 0x71,
+	0x02, 0x0b, 0xa6, 0x78,
+	0x00, 0x65, 0xa2, 0x40,
 	0x80, 0x86, 0xc8, 0x08,
 	0x01, 0x4f, 0xc8, 0x30,
-	0x00, 0x50, 0xc2, 0x60,
-	0xc4, 0x6a, 0x44, 0x5d,
-	0x40, 0x3c, 0xbe, 0x78,
-	0x28, 0x6a, 0x5a, 0x5d,
-	0x00, 0x65, 0x5a, 0x41,
-	0x08, 0x6a, 0x5a, 0x5d,
-	0x00, 0x65, 0x5a, 0x41,
+	0x00, 0x50, 0xbc, 0x60,
+	0xc4, 0x6a, 0x54, 0x5d,
+	0x40, 0x3c, 0xb8, 0x78,
+	0x28, 0x6a, 0x6a, 0x5d,
+	0x00, 0x65, 0x54, 0x41,
+	0x08, 0x6a, 0x6a, 0x5d,
+	0x00, 0x65, 0x54, 0x41,
 	0xff, 0x6a, 0xd8, 0x01,
 	0xff, 0x6a, 0x32, 0x01,
 	0x90, 0x3c, 0x78, 0x00,
-	0x10, 0x03, 0x50, 0x69,
-	0x00, 0x65, 0x34, 0x41,
+	0x10, 0x03, 0x4a, 0x69,
+	0x00, 0x65, 0x2e, 0x41,
 	0x1a, 0x01, 0x02, 0x00,
 	0xf0, 0x19, 0x7a, 0x08,
 	0x0f, 0x0f, 0xc8, 0x08,
 	0x0f, 0x05, 0xc8, 0x08,
 	0x00, 0x3d, 0x7a, 0x00,
-	0x08, 0x1f, 0xda, 0x78,
+	0x08, 0x1f, 0xd4, 0x78,
 	0x80, 0x3d, 0x7a, 0x00,
 	0x20, 0x6a, 0x16, 0x00,
-	0x00, 0x65, 0xc4, 0x41,
-	0x00, 0x65, 0x8a, 0x5e,
+	0x00, 0x65, 0xbe, 0x41,
+	0x00, 0x65, 0x98, 0x5e,
 	0x00, 0x65, 0x12, 0x40,
-	0x20, 0x11, 0xe8, 0x68,
+	0x20, 0x11, 0xe2, 0x68,
 	0x20, 0x6a, 0x18, 0x00,
 	0x20, 0x11, 0x22, 0x00,
 	0xf7, 0x1f, 0xca, 0x08,
-	0x80, 0xb9, 0xee, 0x78,
+	0x80, 0xb9, 0xe8, 0x78,
 	0x08, 0x65, 0xca, 0x00,
 	0x01, 0x65, 0x3e, 0x30,
 	0x01, 0xb9, 0x1e, 0x30,
 	0x7f, 0xb9, 0x0a, 0x08,
 	0x01, 0xb9, 0x0a, 0x30,
 	0x01, 0x54, 0xca, 0x30,
-	0x80, 0xb8, 0xfc, 0x78,
+	0x80, 0xb8, 0xf6, 0x78,
 	0x80, 0x65, 0xca, 0x00,
 	0x01, 0x65, 0x00, 0x34,
 	0x01, 0x54, 0x00, 0x34,
 	0x1a, 0x01, 0x02, 0x00,
-	0x08, 0xb8, 0x06, 0x79,
+	0x08, 0xb8, 0x00, 0x79,
 	0x20, 0x01, 0x02, 0x00,
 	0x02, 0xbd, 0x08, 0x34,
 	0x01, 0xbd, 0x08, 0x34,
 	0x08, 0x01, 0x02, 0x00,
-	0x02, 0x0b, 0x0c, 0x79,
+	0x02, 0x0b, 0x06, 0x79,
 	0xf7, 0x01, 0x02, 0x08,
 	0x01, 0x06, 0xcc, 0x34,
 	0xb2, 0x00, 0x00, 0x08,
@@ -145,105 +146,105 @@
 	0x01, 0xbf, 0x80, 0x30,
 	0x01, 0xb9, 0x7a, 0x30,
 	0x01, 0xba, 0x7c, 0x30,
-	0x00, 0x65, 0x00, 0x59,
-	0x80, 0x0b, 0xc0, 0x79,
-	0xe4, 0x6a, 0x44, 0x5d,
-	0x80, 0xba, 0x5a, 0x5d,
-	0x20, 0xb8, 0x2c, 0x79,
-	0x20, 0x6a, 0x5a, 0x5d,
-	0x00, 0xa3, 0x5a, 0x5d,
+	0x00, 0x65, 0xfa, 0x58,
+	0x80, 0x0b, 0xba, 0x79,
+	0xe4, 0x6a, 0x54, 0x5d,
+	0x80, 0xba, 0x6a, 0x5d,
+	0x20, 0xb8, 0x26, 0x79,
+	0x20, 0x6a, 0x6a, 0x5d,
+	0x00, 0xa3, 0x6a, 0x5d,
 	0x01, 0xa0, 0x78, 0x30,
-	0x10, 0xb8, 0x34, 0x79,
-	0xe4, 0x6a, 0x44, 0x5d,
-	0x00, 0x65, 0xa8, 0x40,
-	0x10, 0x03, 0x4c, 0x69,
-	0x08, 0x3c, 0x68, 0x69,
-	0x04, 0x3c, 0x8e, 0x69,
-	0x02, 0x3c, 0x94, 0x69,
-	0x01, 0x3c, 0x52, 0x79,
+	0x10, 0xb8, 0x2e, 0x79,
+	0xe4, 0x6a, 0x54, 0x5d,
+	0x00, 0x65, 0xa2, 0x40,
+	0x10, 0x03, 0x46, 0x69,
+	0x08, 0x3c, 0x62, 0x69,
+	0x04, 0x3c, 0x88, 0x69,
+	0x02, 0x3c, 0x8e, 0x69,
+	0x01, 0x3c, 0x4c, 0x79,
 	0x01, 0x6a, 0xa2, 0x30,
-	0x00, 0x65, 0xa0, 0x59,
-	0x04, 0x51, 0x42, 0x61,
-	0x00, 0x6a, 0x92, 0x5e,
+	0x00, 0x65, 0x9a, 0x59,
+	0x04, 0x51, 0x3c, 0x61,
+	0x00, 0x6a, 0xa6, 0x5e,
 	0x0d, 0x6a, 0x76, 0x00,
-	0x00, 0xbb, 0xec, 0x5d,
-	0x00, 0x65, 0x2c, 0x41,
+	0x00, 0xbb, 0xf8, 0x5d,
+	0x00, 0x65, 0x26, 0x41,
 	0xa4, 0x6a, 0x06, 0x00,
-	0x00, 0x65, 0x0a, 0x59,
-	0x00, 0x65, 0xa8, 0x40,
-	0xe4, 0x6a, 0x44, 0x5d,
-	0x20, 0x3c, 0x58, 0x79,
-	0x02, 0x6a, 0x5a, 0x5d,
-	0x04, 0x6a, 0x5a, 0x5d,
-	0x01, 0x03, 0x5a, 0x69,
+	0x00, 0x65, 0x04, 0x59,
+	0x00, 0x65, 0xa2, 0x40,
+	0xe4, 0x6a, 0x54, 0x5d,
+	0x20, 0x3c, 0x52, 0x79,
+	0x02, 0x6a, 0x6a, 0x5d,
+	0x04, 0x6a, 0x6a, 0x5d,
+	0x01, 0x03, 0x54, 0x69,
 	0xf7, 0x11, 0x22, 0x08,
 	0xff, 0x6a, 0x24, 0x08,
 	0xff, 0x6a, 0x06, 0x08,
 	0x01, 0x6a, 0x7e, 0x00,
-	0x00, 0x65, 0xa0, 0x59,
+	0x00, 0x65, 0x9a, 0x59,
 	0x00, 0x65, 0x04, 0x40,
-	0x84, 0x6a, 0x44, 0x5d,
-	0x00, 0x65, 0x0a, 0x59,
+	0x84, 0x6a, 0x54, 0x5d,
+	0x00, 0x65, 0x04, 0x59,
 	0x01, 0x66, 0xc8, 0x30,
 	0x01, 0x64, 0xd8, 0x31,
 	0x01, 0x64, 0x32, 0x31,
 	0x5b, 0x64, 0xc8, 0x28,
 	0x30, 0x64, 0xca, 0x18,
 	0x01, 0x6c, 0xc8, 0x30,
-	0xff, 0x64, 0x8a, 0x79,
+	0xff, 0x64, 0x84, 0x79,
 	0x08, 0x01, 0x02, 0x00,
-	0x02, 0x0b, 0x7c, 0x79,
-	0x01, 0x64, 0x82, 0x61,
+	0x02, 0x0b, 0x76, 0x79,
+	0x01, 0x64, 0x7c, 0x61,
 	0xf7, 0x01, 0x02, 0x08,
 	0x01, 0x06, 0xd8, 0x31,
 	0x01, 0x06, 0x32, 0x31,
 	0xff, 0x64, 0xc8, 0x18,
-	0xff, 0x64, 0x7c, 0x69,
+	0xff, 0x64, 0x76, 0x69,
 	0xf7, 0x3c, 0x78, 0x08,
-	0x00, 0x65, 0x34, 0x41,
+	0x00, 0x65, 0x2e, 0x41,
 	0x40, 0xa1, 0x7e, 0x10,
-	0x04, 0xa1, 0x44, 0x5d,
-	0x00, 0x65, 0x68, 0x42,
-	0xc4, 0x6a, 0x44, 0x5d,
+	0x04, 0xa1, 0x54, 0x5d,
+	0x00, 0x65, 0x50, 0x42,
+	0xc4, 0x6a, 0x54, 0x5d,
 	0xc0, 0x6a, 0x7e, 0x00,
-	0x00, 0xa2, 0x5a, 0x5d,
+	0x00, 0xa2, 0x6a, 0x5d,
 	0xe4, 0x6a, 0x06, 0x00,
-	0x00, 0x6a, 0x5a, 0x5d,
-	0x00, 0x65, 0x5a, 0x41,
-	0x10, 0x3c, 0xa4, 0x69,
-	0x00, 0xbb, 0x6c, 0x44,
+	0x00, 0x6a, 0x6a, 0x5d,
+	0x00, 0x65, 0x54, 0x41,
+	0x10, 0x3c, 0x9e, 0x69,
+	0x00, 0xbb, 0x74, 0x44,
 	0x18, 0x6a, 0xda, 0x01,
 	0x01, 0x69, 0xd8, 0x31,
 	0x1c, 0x6a, 0xd0, 0x01,
 	0x09, 0xee, 0xdc, 0x01,
-	0x80, 0xee, 0xac, 0x79,
+	0x80, 0xee, 0xa6, 0x79,
 	0xff, 0x6a, 0xdc, 0x09,
 	0x01, 0x93, 0x26, 0x01,
 	0x03, 0x6a, 0x2a, 0x01,
 	0x01, 0x69, 0x32, 0x31,
-	0x1c, 0x6a, 0xba, 0x5d,
+	0x1c, 0x6a, 0xc6, 0x5d,
 	0x0a, 0x93, 0x26, 0x01,
-	0x00, 0x65, 0x80, 0x5e,
+	0x00, 0x65, 0x8e, 0x5e,
 	0x01, 0x50, 0xa0, 0x18,
 	0x02, 0x6a, 0x22, 0x05,
 	0x80, 0x6a, 0x74, 0x00,
 	0x80, 0x3c, 0x78, 0x00,
-	0x00, 0x65, 0xb2, 0x5d,
+	0x00, 0x65, 0xbe, 0x5d,
 	0x01, 0x3f, 0xc8, 0x30,
-	0xbf, 0x64, 0x68, 0x7a,
-	0x80, 0x64, 0x96, 0x73,
-	0xa0, 0x64, 0xf0, 0x73,
-	0xc0, 0x64, 0xe6, 0x73,
-	0xe0, 0x64, 0x20, 0x74,
-	0x01, 0x6a, 0xaa, 0x5e,
-	0x00, 0x65, 0xc4, 0x41,
+	0xbf, 0x64, 0x50, 0x7a,
+	0x80, 0x64, 0x9a, 0x73,
+	0xa0, 0x64, 0xf8, 0x73,
+	0xc0, 0x64, 0xec, 0x73,
+	0xe0, 0x64, 0x28, 0x74,
+	0x01, 0x6a, 0xbe, 0x5e,
+	0x00, 0x65, 0xbe, 0x41,
 	0xf7, 0x11, 0x22, 0x08,
 	0x01, 0x06, 0xd4, 0x30,
 	0xff, 0x6a, 0x24, 0x08,
 	0xf7, 0x01, 0x02, 0x08,
-	0x09, 0x0c, 0xde, 0x79,
+	0x09, 0x0c, 0xd8, 0x79,
 	0x08, 0x0c, 0x04, 0x68,
-	0xb1, 0x6a, 0xaa, 0x5e,
+	0xb1, 0x6a, 0xbe, 0x5e,
 	0xff, 0x6a, 0x26, 0x09,
 	0x12, 0x01, 0x02, 0x00,
 	0x02, 0x6a, 0x08, 0x30,
@@ -256,35 +257,33 @@
 	0x00, 0xa5, 0x4a, 0x21,
 	0x00, 0xa6, 0x4c, 0x21,
 	0x00, 0xa7, 0x4e, 0x25,
-	0x08, 0xeb, 0xae, 0x7e,
-	0x80, 0xeb, 0xfe, 0x79,
+	0x08, 0xeb, 0xc2, 0x7e,
+	0x80, 0xeb, 0xf8, 0x79,
 	0xff, 0x6a, 0xd6, 0x09,
-	0x08, 0xeb, 0x02, 0x6a,
+	0x08, 0xeb, 0xfc, 0x69,
 	0xff, 0x6a, 0xd4, 0x0c,
-	0x80, 0xa3, 0xae, 0x6e,
-	0x88, 0xeb, 0x18, 0x72,
-	0x08, 0xeb, 0xae, 0x6e,
-	0x04, 0xea, 0x1c, 0xe2,
-	0x08, 0xee, 0xae, 0x6e,
+	0x80, 0xa3, 0xc2, 0x6e,
+	0x88, 0xeb, 0x12, 0x72,
+	0x08, 0xeb, 0xc2, 0x6e,
+	0x04, 0xea, 0x16, 0xe2,
+	0x08, 0xee, 0xc2, 0x6e,
 	0x04, 0x6a, 0xd0, 0x81,
 	0x05, 0xa4, 0xc0, 0x89,
 	0x03, 0xa5, 0xc2, 0x31,
 	0x09, 0x6a, 0xd6, 0x05,
-	0x00, 0x65, 0x00, 0x5a,
+	0x00, 0x65, 0xfa, 0x59,
 	0x06, 0xa4, 0xd4, 0x89,
-	0x80, 0x94, 0xae, 0x7e,
-	0x04, 0xe9, 0x10, 0x31,
-	0x01, 0xe9, 0xca, 0x30,
-	0x01, 0x65, 0x26, 0x7a,
+	0x80, 0x94, 0xc2, 0x7e,
+	0x07, 0xe9, 0x10, 0x31,
+	0x01, 0x8c, 0x1e, 0x7a,
 	0x01, 0x55, 0xaa, 0x10,
-	0x01, 0x65, 0x18, 0x31,
-	0x02, 0xe9, 0x1a, 0x31,
 	0x01, 0xe9, 0x46, 0x31,
-	0x00, 0x65, 0xf2, 0x59,
+	0x00, 0xa3, 0xa0, 0x5e,
+	0x00, 0x65, 0xec, 0x59,
 	0x01, 0xa4, 0xca, 0x30,
-	0x01, 0x55, 0x34, 0x7a,
+	0x01, 0x55, 0x2a, 0x7a,
 	0x04, 0x65, 0xca, 0x00,
-	0x80, 0xa3, 0x38, 0x7a,
+	0x80, 0xa3, 0x2e, 0x7a,
 	0x02, 0x65, 0xca, 0x00,
 	0x01, 0x65, 0xf8, 0x31,
 	0x80, 0x93, 0x26, 0x01,
@@ -292,161 +291,168 @@
 	0x01, 0x8c, 0xc8, 0x30,
 	0x00, 0x88, 0xc8, 0x18,
 	0x02, 0x64, 0xc8, 0x88,
-	0xff, 0x64, 0xae, 0x7e,
-	0xff, 0x8d, 0x4e, 0x6a,
-	0xff, 0x8e, 0x4e, 0x6a,
+	0xff, 0x64, 0xc2, 0x7e,
+	0xff, 0x8d, 0x44, 0x6a,
+	0xff, 0x8e, 0x44, 0x6a,
 	0x03, 0x8c, 0xd4, 0x98,
-	0x00, 0x65, 0xae, 0x56,
+	0x00, 0x65, 0xc2, 0x56,
 	0x01, 0x64, 0x70, 0x30,
 	0xff, 0x64, 0xc8, 0x10,
 	0x01, 0x64, 0xc8, 0x18,
 	0x00, 0x8c, 0x18, 0x19,
 	0xff, 0x8d, 0x1a, 0x21,
 	0xff, 0x8e, 0x1c, 0x25,
-	0x04, 0x14, 0x10, 0x31,
-	0x03, 0xa0, 0x18, 0x31,
-	0x03, 0xa0, 0x10, 0x30,
-	0x08, 0x6a, 0xcc, 0x00,
-	0xa0, 0x6a, 0xd0, 0x5d,
-	0x01, 0xa0, 0xaa, 0x08,
-	0x00, 0x65, 0x8e, 0x42,
+	0x80, 0x3c, 0x54, 0x6a,
+	0x21, 0x6a, 0xbe, 0x46,
 	0xa8, 0x6a, 0x76, 0x00,
 	0x79, 0x6a, 0x76, 0x00,
-	0x40, 0x3f, 0x70, 0x6a,
+	0x40, 0x3f, 0x5c, 0x6a,
 	0x04, 0x3b, 0x76, 0x00,
-	0x00, 0x65, 0x64, 0x5d,
 	0x04, 0x6a, 0xd4, 0x81,
-	0x20, 0x3c, 0x5a, 0x6a,
+	0x20, 0x3c, 0x64, 0x7a,
+	0x51, 0x6a, 0xbe, 0x5e,
+	0x00, 0x65, 0x7e, 0x42,
 	0x20, 0x3c, 0x78, 0x00,
+	0x00, 0xb3, 0xa0, 0x5e,
 	0x07, 0xac, 0x10, 0x31,
 	0x05, 0xb3, 0x46, 0x31,
 	0x88, 0x6a, 0xcc, 0x00,
-	0xac, 0x6a, 0xc8, 0x5d,
+	0xac, 0x6a, 0xd4, 0x5d,
 	0xa3, 0x6a, 0xcc, 0x00,
-	0xb3, 0x6a, 0xcc, 0x5d,
-	0x00, 0x65, 0x3e, 0x5a,
+	0xb3, 0x6a, 0xd8, 0x5d,
+	0x00, 0x65, 0x34, 0x5a,
 	0xfd, 0xa4, 0x48, 0x09,
 	0x01, 0x8c, 0xaa, 0x08,
 	0x03, 0x8c, 0x10, 0x30,
-	0x00, 0x65, 0xc0, 0x5d,
-	0x01, 0xa4, 0xa0, 0x7a,
+	0x00, 0x65, 0xcc, 0x5d,
+	0x01, 0xa4, 0x90, 0x7a,
 	0x04, 0x3b, 0x76, 0x08,
 	0x01, 0x3b, 0x26, 0x31,
 	0x80, 0x02, 0x04, 0x00,
-	0x10, 0x0c, 0x96, 0x7a,
-	0x03, 0x9e, 0x98, 0x6a,
+	0x10, 0x0c, 0x86, 0x7a,
+	0x03, 0x9e, 0x88, 0x6a,
 	0x7f, 0x02, 0x04, 0x08,
-	0x91, 0x6a, 0xaa, 0x5e,
-	0x00, 0x65, 0xc4, 0x41,
+	0x91, 0x6a, 0xbe, 0x5e,
+	0x00, 0x65, 0xbe, 0x41,
 	0x01, 0xa4, 0xca, 0x30,
-	0x80, 0xa3, 0xa6, 0x7a,
+	0x80, 0xa3, 0x96, 0x7a,
 	0x02, 0x65, 0xca, 0x00,
-	0x01, 0x55, 0xaa, 0x7a,
+	0x01, 0x55, 0x9a, 0x7a,
 	0x04, 0x65, 0xca, 0x00,
 	0x01, 0x65, 0xf8, 0x31,
 	0x01, 0x3b, 0x26, 0x31,
-	0x00, 0x65, 0x06, 0x5a,
-	0x01, 0xfc, 0xb8, 0x6a,
-	0x80, 0x0b, 0xae, 0x6a,
-	0x10, 0x0c, 0xae, 0x7a,
-	0x20, 0x93, 0xae, 0x6a,
+	0x00, 0x65, 0x00, 0x5a,
+	0x01, 0xfc, 0xa8, 0x6a,
+	0x80, 0x0b, 0x9e, 0x6a,
+	0x10, 0x0c, 0x9e, 0x7a,
+	0x20, 0x93, 0x9e, 0x6a,
 	0x02, 0x93, 0x26, 0x01,
-	0x02, 0xfc, 0xc2, 0x7a,
-	0x40, 0x0d, 0xdc, 0x6a,
+	0x02, 0xfc, 0xb2, 0x7a,
+	0x40, 0x0d, 0xcc, 0x6a,
 	0x01, 0xa4, 0x48, 0x01,
-	0x00, 0x65, 0xdc, 0x42,
-	0x40, 0x0d, 0xc8, 0x6a,
-	0x00, 0x65, 0x06, 0x5a,
-	0x00, 0x65, 0xba, 0x42,
-	0x80, 0xfc, 0xd2, 0x7a,
-	0x80, 0xa4, 0xd2, 0x6a,
+	0x00, 0x65, 0xcc, 0x42,
+	0x40, 0x0d, 0xb8, 0x6a,
+	0x00, 0x65, 0x00, 0x5a,
+	0x00, 0x65, 0xaa, 0x42,
+	0x80, 0xfc, 0xc2, 0x7a,
+	0x80, 0xa4, 0xc2, 0x6a,
 	0xff, 0xa5, 0x4a, 0x19,
 	0xff, 0xa6, 0x4c, 0x21,
 	0xff, 0xa7, 0x4e, 0x21,
 	0xf8, 0xfc, 0x48, 0x09,
 	0xff, 0x6a, 0xaa, 0x08,
-	0x04, 0xfc, 0xda, 0x7a,
+	0x04, 0xfc, 0xca, 0x7a,
 	0x01, 0x55, 0xaa, 0x00,
 	0xff, 0x6a, 0x46, 0x09,
-	0x04, 0x3b, 0xf4, 0x6a,
+	0x04, 0x3b, 0xe4, 0x6a,
 	0x02, 0x93, 0x26, 0x01,
-	0x01, 0x94, 0xde, 0x7a,
-	0x01, 0x94, 0xde, 0x7a,
-	0x01, 0x94, 0xde, 0x7a,
-	0x01, 0x94, 0xde, 0x7a,
-	0x01, 0x94, 0xde, 0x7a,
-	0x01, 0xa4, 0xf2, 0x7a,
-	0x01, 0xfc, 0xec, 0x7a,
-	0x01, 0x94, 0xf4, 0x6a,
-	0x00, 0x65, 0x8e, 0x42,
-	0x01, 0x94, 0xf2, 0x7a,
-	0x10, 0x94, 0xf4, 0x6a,
+	0x01, 0x94, 0xce, 0x7a,
+	0x01, 0x94, 0xce, 0x7a,
+	0x01, 0x94, 0xce, 0x7a,
+	0x01, 0x94, 0xce, 0x7a,
+	0x01, 0x94, 0xce, 0x7a,
+	0x01, 0xa4, 0xe2, 0x7a,
+	0x01, 0xfc, 0xdc, 0x7a,
+	0x01, 0x94, 0xe4, 0x6a,
+	0x00, 0x65, 0x7e, 0x42,
+	0x01, 0x94, 0xe2, 0x7a,
+	0x10, 0x94, 0xe4, 0x6a,
 	0xd7, 0x93, 0x26, 0x09,
-	0x28, 0x93, 0xf8, 0x6a,
-	0xff, 0x38, 0x04, 0x6b,
-	0x80, 0xa3, 0x04, 0x7b,
-	0x80, 0x0b, 0x02, 0x7b,
-	0x04, 0x3b, 0x04, 0x7b,
+	0x28, 0x93, 0xe8, 0x6a,
+	0x01, 0x85, 0x0a, 0x01,
+	0x02, 0xfc, 0xf0, 0x6a,
+	0x01, 0x14, 0x46, 0x31,
+	0xff, 0x6a, 0x10, 0x09,
+	0xfe, 0x85, 0x0a, 0x09,
+	0xff, 0x38, 0xfe, 0x6a,
+	0x80, 0xa3, 0xfe, 0x7a,
+	0x80, 0x0b, 0xfc, 0x7a,
+	0x04, 0x3b, 0xfe, 0x7a,
 	0xbf, 0x3b, 0x76, 0x08,
 	0x01, 0x3b, 0x26, 0x31,
-	0x00, 0x65, 0x06, 0x5a,
-	0x01, 0x0b, 0x12, 0x6b,
-	0x10, 0x0c, 0x06, 0x7b,
-	0x04, 0x93, 0x10, 0x6b,
-	0x01, 0x94, 0x0e, 0x7b,
-	0x10, 0x94, 0x10, 0x6b,
+	0x00, 0x65, 0x00, 0x5a,
+	0x01, 0x0b, 0x0c, 0x6b,
+	0x10, 0x0c, 0x00, 0x7b,
+	0x04, 0x93, 0x0a, 0x6b,
+	0x01, 0x94, 0x08, 0x7b,
+	0x10, 0x94, 0x0a, 0x6b,
 	0xc7, 0x93, 0x26, 0x09,
 	0x01, 0x99, 0xd4, 0x30,
-	0x38, 0x93, 0x14, 0x6b,
+	0x38, 0x93, 0x0e, 0x6b,
 	0xff, 0x08, 0x60, 0x6b,
 	0xff, 0x09, 0x60, 0x6b,
 	0xff, 0x0a, 0x60, 0x6b,
-	0xff, 0x38, 0x30, 0x7b,
+	0xff, 0x38, 0x2a, 0x7b,
 	0x04, 0x14, 0x10, 0x31,
 	0x01, 0x38, 0x18, 0x31,
 	0x02, 0x6a, 0x1a, 0x31,
 	0x88, 0x6a, 0xcc, 0x00,
-	0x14, 0x6a, 0xce, 0x5d,
-	0x00, 0x38, 0xba, 0x5d,
+	0x14, 0x6a, 0xda, 0x5d,
+	0x00, 0x38, 0xc6, 0x5d,
 	0xff, 0x6a, 0x70, 0x08,
 	0x00, 0x65, 0x56, 0x43,
-	0x80, 0xa3, 0x36, 0x7b,
+	0x80, 0xa3, 0x30, 0x7b,
 	0x01, 0xa4, 0x48, 0x01,
 	0x00, 0x65, 0x60, 0x43,
-	0x08, 0xeb, 0x3c, 0x7b,
-	0x00, 0x65, 0x06, 0x5a,
-	0x08, 0xeb, 0x38, 0x6b,
+	0x08, 0xeb, 0x36, 0x7b,
+	0x00, 0x65, 0x00, 0x5a,
+	0x08, 0xeb, 0x32, 0x6b,
 	0x07, 0xe9, 0x10, 0x31,
-	0x80, 0xe9, 0x42, 0x7b,
-	0x80, 0xa3, 0x46, 0x01,
+	0x01, 0xe9, 0xca, 0x30,
+	0x01, 0x65, 0x46, 0x31,
+	0x00, 0x6a, 0xa0, 0x5e,
 	0x88, 0x6a, 0xcc, 0x00,
-	0xa4, 0x6a, 0xce, 0x5d,
-	0x08, 0x6a, 0xba, 0x5d,
+	0xa4, 0x6a, 0xda, 0x5d,
+	0x08, 0x6a, 0xc6, 0x5d,
 	0x0d, 0x93, 0x26, 0x01,
-	0x00, 0x65, 0x80, 0x5e,
+	0x00, 0x65, 0x8e, 0x5e,
 	0x88, 0x6a, 0xcc, 0x00,
-	0x00, 0x65, 0x62, 0x5e,
+	0x00, 0x65, 0x70, 0x5e,
 	0x01, 0x99, 0x46, 0x31,
-	0x00, 0x65, 0x3e, 0x5a,
-	0x00, 0x65, 0xf2, 0x59,
+	0x00, 0xa3, 0xa0, 0x5e,
+	0x01, 0x88, 0x10, 0x31,
+	0x00, 0x65, 0x34, 0x5a,
+	0x00, 0x65, 0xec, 0x59,
 	0x03, 0x8c, 0x10, 0x30,
-	0x00, 0x65, 0xc0, 0x5d,
+	0x00, 0x65, 0xcc, 0x5d,
 	0x01, 0x8c, 0x5e, 0x7b,
 	0x01, 0x55, 0xaa, 0x10,
-	0x80, 0x0b, 0x8e, 0x6a,
+	0x80, 0x0b, 0x7e, 0x6a,
 	0x80, 0x0b, 0x68, 0x6b,
 	0x01, 0x0c, 0x62, 0x7b,
-	0x10, 0x0c, 0x8e, 0x7a,
-	0x03, 0x9e, 0x8e, 0x6a,
-	0x00, 0x65, 0xfc, 0x59,
-	0xff, 0x38, 0x7a, 0x7b,
+	0x10, 0x0c, 0x7e, 0x7a,
+	0x03, 0x9e, 0x7e, 0x6a,
+	0x00, 0x65, 0xf6, 0x59,
+	0x00, 0x6a, 0xa0, 0x5e,
+	0x01, 0xa4, 0x88, 0x6b,
+	0xff, 0x38, 0x7e, 0x7b,
 	0x01, 0x38, 0xc8, 0x30,
 	0x00, 0x08, 0x40, 0x19,
 	0xff, 0x6a, 0xc8, 0x08,
 	0x00, 0x09, 0x42, 0x21,
 	0x00, 0x0a, 0x44, 0x21,
 	0xff, 0x6a, 0x70, 0x08,
-	0x00, 0x65, 0x7c, 0x43,
+	0x00, 0x65, 0x80, 0x43,
 	0x03, 0x08, 0x40, 0x31,
 	0x03, 0x08, 0x40, 0x31,
 	0x01, 0x08, 0x40, 0x31,
@@ -455,13 +461,14 @@
 	0xfd, 0xb4, 0x68, 0x09,
 	0x12, 0x01, 0x02, 0x00,
 	0x12, 0x01, 0x02, 0x00,
-	0x04, 0x3c, 0xc4, 0x79,
+	0x04, 0x3c, 0xbe, 0x79,
 	0xfb, 0x3c, 0x78, 0x08,
-	0x04, 0x93, 0x34, 0x79,
-	0x01, 0x0c, 0x90, 0x6b,
-	0x00, 0x65, 0x34, 0x41,
-	0x00, 0x65, 0xc4, 0x41,
-	0x00, 0x65, 0x64, 0x5d,
+	0x04, 0x93, 0x2e, 0x79,
+	0x01, 0x0c, 0x94, 0x6b,
+	0x00, 0x65, 0x2e, 0x41,
+	0x00, 0x65, 0xbe, 0x41,
+	0x80, 0x3c, 0x9e, 0x6b,
+	0x21, 0x6a, 0xbe, 0x46,
 	0x01, 0xbc, 0x18, 0x31,
 	0x02, 0x6a, 0x1a, 0x31,
 	0x02, 0x6a, 0xf8, 0x01,
@@ -471,16 +478,16 @@
 	0xff, 0x6a, 0x12, 0x08,
 	0xff, 0x6a, 0x14, 0x08,
 	0xf3, 0xbc, 0xd4, 0x18,
-	0xa0, 0x6a, 0xbe, 0x53,
+	0xa0, 0x6a, 0xc4, 0x53,
 	0x04, 0xa0, 0x10, 0x31,
 	0xac, 0x6a, 0x26, 0x01,
 	0x04, 0xa0, 0x10, 0x31,
 	0x03, 0x08, 0x18, 0x31,
 	0x88, 0x6a, 0xcc, 0x00,
-	0xa0, 0x6a, 0xce, 0x5d,
-	0x00, 0xbc, 0xba, 0x5d,
+	0xa0, 0x6a, 0xda, 0x5d,
+	0x00, 0xbc, 0xc6, 0x5d,
 	0x3d, 0x6a, 0x26, 0x01,
-	0x00, 0x65, 0xd6, 0x43,
+	0x00, 0x65, 0xdc, 0x43,
 	0xff, 0x6a, 0x10, 0x09,
 	0xa4, 0x6a, 0x26, 0x01,
 	0x0c, 0xa0, 0x32, 0x31,
@@ -490,112 +497,117 @@
 	0x36, 0x6a, 0x26, 0x01,
 	0x02, 0x93, 0x26, 0x01,
 	0x35, 0x6a, 0x26, 0x01,
-	0x00, 0x65, 0x74, 0x5e,
-	0x00, 0x65, 0x74, 0x5e,
+	0x00, 0x65, 0x82, 0x5e,
+	0x00, 0x65, 0x82, 0x5e,
 	0x02, 0x93, 0x26, 0x01,
-	0x04, 0x0b, 0xda, 0x6b,
-	0x10, 0x0c, 0xd6, 0x7b,
-	0x01, 0x03, 0xda, 0x6b,
-	0x20, 0x93, 0xd6, 0x6b,
+	0x04, 0x0b, 0xe0, 0x6b,
+	0x10, 0x0c, 0xdc, 0x7b,
+	0x01, 0x03, 0xe0, 0x6b,
+	0x20, 0x93, 0xdc, 0x6b,
 	0xc7, 0x93, 0x26, 0x09,
-	0x38, 0x93, 0xe0, 0x6b,
+	0x38, 0x93, 0xe6, 0x6b,
 	0x10, 0x01, 0x02, 0x00,
-	0x00, 0x65, 0xc4, 0x41,
-	0x00, 0x65, 0x64, 0x5d,
+	0x00, 0x65, 0xbe, 0x41,
+	0x80, 0x3c, 0xf0, 0x6b,
+	0x21, 0x6a, 0xbe, 0x46,
 	0x01, 0x06, 0x50, 0x31,
-	0x00, 0x65, 0xc4, 0x41,
+	0x00, 0x65, 0xbe, 0x41,
 	0x10, 0x3f, 0x06, 0x00,
 	0x10, 0x6a, 0x06, 0x00,
 	0x01, 0x3a, 0xca, 0x30,
-	0x80, 0x65, 0x0c, 0x64,
-	0x10, 0xb8, 0x30, 0x6c,
+	0x80, 0x65, 0x14, 0x64,
+	0x10, 0xb8, 0x38, 0x6c,
 	0xc0, 0xba, 0xca, 0x00,
-	0x40, 0xb8, 0xfc, 0x6b,
+	0x40, 0xb8, 0x04, 0x6c,
 	0xbf, 0x65, 0xca, 0x08,
-	0x20, 0xb8, 0x10, 0x7c,
+	0x20, 0xb8, 0x18, 0x7c,
 	0x01, 0x65, 0x0c, 0x30,
-	0x00, 0x65, 0xb2, 0x5d,
-	0xa0, 0x3f, 0x18, 0x64,
+	0x00, 0x65, 0xbe, 0x5d,
+	0xa0, 0x3f, 0x20, 0x64,
 	0x23, 0xb8, 0x0c, 0x08,
-	0x00, 0x65, 0xb2, 0x5d,
-	0xa0, 0x3f, 0x18, 0x64,
-	0x00, 0xbb, 0x10, 0x44,
-	0xff, 0x65, 0x10, 0x64,
-	0x00, 0x65, 0x30, 0x44,
+	0x00, 0x65, 0xbe, 0x5d,
+	0xa0, 0x3f, 0x20, 0x64,
+	0x00, 0xbb, 0x18, 0x44,
+	0xff, 0x65, 0x18, 0x64,
+	0x00, 0x65, 0x38, 0x44,
 	0x40, 0x6a, 0x18, 0x00,
 	0x01, 0x65, 0x0c, 0x30,
-	0x00, 0x65, 0xb2, 0x5d,
-	0xa0, 0x3f, 0xec, 0x73,
+	0x00, 0x65, 0xbe, 0x5d,
+	0xa0, 0x3f, 0xf4, 0x73,
 	0x40, 0x6a, 0x18, 0x00,
 	0x01, 0x3a, 0xa6, 0x30,
 	0x08, 0x6a, 0x74, 0x00,
-	0x00, 0x65, 0xc4, 0x41,
-	0x64, 0x6a, 0x3e, 0x5d,
-	0x80, 0x64, 0xae, 0x6c,
-	0x04, 0x64, 0x7c, 0x74,
-	0x02, 0x64, 0x8a, 0x74,
-	0x00, 0x6a, 0x4c, 0x74,
-	0x03, 0x64, 0xa0, 0x74,
-	0x23, 0x64, 0x38, 0x74,
-	0x08, 0x64, 0x48, 0x74,
-	0x61, 0x6a, 0xaa, 0x5e,
-	0x00, 0x65, 0xb2, 0x5d,
-	0x08, 0x51, 0xc6, 0x71,
-	0x00, 0x65, 0x30, 0x44,
-	0x80, 0x04, 0x46, 0x7c,
-	0x51, 0x6a, 0x34, 0x5d,
-	0x01, 0x51, 0x46, 0x64,
-	0x01, 0xa4, 0x42, 0x7c,
-	0x01, 0x55, 0x48, 0x7c,
-	0x41, 0x6a, 0xaa, 0x5e,
-	0x00, 0x65, 0x48, 0x44,
-	0x07, 0x6a, 0x2a, 0x5d,
+	0x00, 0x65, 0xbe, 0x41,
+	0x64, 0x6a, 0x4e, 0x5d,
+	0x80, 0x64, 0xbe, 0x6c,
+	0x04, 0x64, 0x84, 0x74,
+	0x02, 0x64, 0x92, 0x74,
+	0x00, 0x6a, 0x54, 0x74,
+	0x03, 0x64, 0xb0, 0x74,
+	0x23, 0x64, 0x40, 0x74,
+	0x08, 0x64, 0x50, 0x74,
+	0x61, 0x6a, 0xbe, 0x5e,
+	0x00, 0x65, 0xbe, 0x5d,
+	0x08, 0x51, 0xc0, 0x71,
+	0x00, 0x65, 0x38, 0x44,
+	0x80, 0x04, 0x4e, 0x7c,
+	0x51, 0x6a, 0x44, 0x5d,
+	0x01, 0x51, 0x4e, 0x64,
+	0x01, 0xa4, 0x4a, 0x7c,
+	0x01, 0x55, 0x50, 0x7c,
+	0x41, 0x6a, 0xbe, 0x5e,
+	0x00, 0x65, 0x50, 0x44,
+	0x07, 0x6a, 0x3a, 0x5d,
 	0x01, 0x06, 0xd4, 0x30,
-	0x00, 0x65, 0xc4, 0x41,
-	0x10, 0xb8, 0x50, 0x7c,
-	0xa1, 0x6a, 0xaa, 0x5e,
-	0x01, 0xb4, 0x56, 0x6c,
-	0x02, 0xb4, 0x58, 0x6c,
-	0x01, 0xa4, 0x58, 0x7c,
-	0xff, 0xa8, 0x68, 0x7c,
+	0x00, 0x65, 0xbe, 0x41,
+	0x10, 0xb8, 0x58, 0x7c,
+	0xa1, 0x6a, 0xbe, 0x5e,
+	0x01, 0xb4, 0x5e, 0x6c,
+	0x02, 0xb4, 0x60, 0x6c,
+	0x01, 0xa4, 0x60, 0x7c,
+	0xff, 0xa8, 0x70, 0x7c,
 	0x04, 0xb4, 0x68, 0x01,
 	0x01, 0x6a, 0x76, 0x00,
-	0x00, 0xbb, 0xec, 0x5d,
-	0xff, 0xa8, 0x68, 0x7c,
-	0x71, 0x6a, 0xaa, 0x5e,
-	0x40, 0x51, 0x68, 0x64,
-	0x00, 0x65, 0x8a, 0x5e,
-	0x00, 0x65, 0xd6, 0x41,
-	0x00, 0xbb, 0x6c, 0x5c,
-	0x00, 0x65, 0xd6, 0x41,
-	0x00, 0x65, 0x8a, 0x5e,
+	0x00, 0xbb, 0xf8, 0x5d,
+	0xff, 0xa8, 0x70, 0x7c,
+	0x71, 0x6a, 0xbe, 0x5e,
+	0x40, 0x51, 0x70, 0x64,
+	0x00, 0x65, 0x98, 0x5e,
+	0x00, 0x65, 0xd0, 0x41,
+	0x00, 0xbb, 0x74, 0x5c,
+	0x00, 0x65, 0xd0, 0x41,
+	0x00, 0x65, 0x98, 0x5e,
 	0x01, 0x65, 0xa2, 0x30,
 	0x01, 0xf8, 0xc8, 0x30,
 	0x01, 0x4e, 0xc8, 0x30,
-	0x00, 0x6a, 0x90, 0xdd,
-	0x00, 0x51, 0xa2, 0x5d,
+	0x00, 0x6a, 0x9c, 0xdd,
+	0x00, 0x51, 0xae, 0x5d,
 	0x01, 0x4e, 0x9c, 0x18,
 	0x02, 0x6a, 0x22, 0x05,
 	0x04, 0xb8, 0x70, 0x01,
-	0x00, 0x65, 0xa6, 0x5e,
-	0x20, 0xb8, 0xd6, 0x69,
+	0x00, 0x65, 0xba, 0x5e,
+	0x20, 0xb8, 0xd0, 0x69,
 	0x01, 0xbb, 0xa2, 0x30,
 	0x01, 0xba, 0x7c, 0x30,
-	0x00, 0xb9, 0xa4, 0x5c,
-	0x00, 0x65, 0xd6, 0x41,
+	0x00, 0xb9, 0xb4, 0x5c,
+	0x00, 0x65, 0xd0, 0x41,
 	0x01, 0x06, 0xd4, 0x30,
-	0x20, 0x3c, 0xc4, 0x79,
-	0x20, 0x3c, 0x48, 0x7c,
+	0x20, 0x3c, 0xbe, 0x79,
+	0x20, 0x3c, 0x50, 0x7c,
+	0x01, 0xa4, 0xa0, 0x7c,
+	0x01, 0xb4, 0x68, 0x01,
+	0x00, 0x65, 0xbe, 0x41,
+	0x00, 0x65, 0x50, 0x44,
 	0x04, 0x14, 0x58, 0x31,
 	0x01, 0x06, 0xd4, 0x30,
 	0x08, 0xa0, 0x60, 0x31,
 	0xac, 0x6a, 0xcc, 0x00,
-	0x14, 0x6a, 0xce, 0x5d,
+	0x14, 0x6a, 0xda, 0x5d,
 	0x01, 0x06, 0xd4, 0x30,
-	0xa0, 0x6a, 0xc6, 0x5d,
-	0x00, 0x65, 0xc4, 0x41,
+	0xa0, 0x6a, 0xd2, 0x5d,
+	0x00, 0x65, 0xbe, 0x41,
 	0xdf, 0x3c, 0x78, 0x08,
-	0x00, 0x65, 0x48, 0x44,
+	0x00, 0x65, 0x50, 0x44,
 	0x4c, 0x65, 0xcc, 0x28,
 	0x01, 0x3e, 0x20, 0x31,
 	0xd0, 0x66, 0xcc, 0x18,
@@ -606,104 +618,102 @@
 	0xd0, 0x65, 0xca, 0x18,
 	0x01, 0x3e, 0x20, 0x31,
 	0x30, 0x65, 0xd4, 0x18,
-	0x00, 0x65, 0xbc, 0x4c,
+	0x00, 0x65, 0xcc, 0x4c,
 	0xe1, 0x6a, 0x22, 0x01,
 	0xff, 0x6a, 0xd4, 0x08,
 	0x20, 0x65, 0xd4, 0x18,
-	0x00, 0x65, 0xc4, 0x54,
+	0x00, 0x65, 0xd4, 0x54,
 	0xe1, 0x6a, 0x22, 0x01,
 	0xff, 0x6a, 0xd4, 0x08,
 	0x20, 0x65, 0xca, 0x18,
 	0xe0, 0x65, 0xd4, 0x18,
-	0x00, 0x65, 0xce, 0x4c,
+	0x00, 0x65, 0xde, 0x4c,
 	0xe1, 0x6a, 0x22, 0x01,
 	0xff, 0x6a, 0xd4, 0x08,
 	0xd0, 0x65, 0xd4, 0x18,
-	0x00, 0x65, 0xd6, 0x54,
+	0x00, 0x65, 0xe6, 0x54,
 	0xe1, 0x6a, 0x22, 0x01,
 	0xff, 0x6a, 0xd4, 0x08,
 	0x01, 0x6c, 0xa2, 0x30,
-	0xff, 0x51, 0xe8, 0x74,
-	0x00, 0x51, 0x68, 0x5d,
+	0xff, 0x51, 0xf8, 0x74,
+	0x00, 0x51, 0x74, 0x5d,
 	0x01, 0x51, 0x20, 0x31,
-	0x00, 0x65, 0x0a, 0x45,
+	0x00, 0x65, 0x1a, 0x45,
 	0x01, 0xba, 0xc8, 0x30,
-	0x00, 0x3e, 0x0a, 0x75,
-	0x00, 0x65, 0x88, 0x5e,
+	0x00, 0x3e, 0x1a, 0x75,
+	0x00, 0x65, 0x96, 0x5e,
 	0x80, 0x3c, 0x78, 0x00,
 	0x01, 0x06, 0xd4, 0x30,
-	0x00, 0x65, 0xb2, 0x5d,
+	0x00, 0x65, 0xbe, 0x5d,
 	0x01, 0x3c, 0x78, 0x00,
-	0xe0, 0x3f, 0x26, 0x65,
+	0xe0, 0x3f, 0x36, 0x65,
 	0x02, 0x3c, 0x78, 0x00,
-	0x20, 0x12, 0x26, 0x65,
-	0x51, 0x6a, 0x34, 0x5d,
-	0x00, 0x51, 0x68, 0x5d,
-	0x51, 0x6a, 0x34, 0x5d,
+	0x20, 0x12, 0x36, 0x65,
+	0x51, 0x6a, 0x44, 0x5d,
+	0x00, 0x51, 0x74, 0x5d,
+	0x51, 0x6a, 0x44, 0x5d,
 	0x01, 0x51, 0x20, 0x31,
 	0x04, 0x3c, 0x78, 0x00,
 	0x01, 0xb9, 0xc8, 0x30,
-	0x00, 0x3d, 0x24, 0x65,
+	0x00, 0x3d, 0x34, 0x65,
 	0x08, 0x3c, 0x78, 0x00,
 	0x01, 0xba, 0xc8, 0x30,
-	0x00, 0x3e, 0x24, 0x65,
+	0x00, 0x3e, 0x34, 0x65,
 	0x10, 0x3c, 0x78, 0x00,
-	0x04, 0xb8, 0x24, 0x7d,
+	0x04, 0xb8, 0x34, 0x7d,
 	0xfb, 0xb8, 0x70, 0x09,
-	0x20, 0xb8, 0x1a, 0x6d,
+	0x20, 0xb8, 0x2a, 0x6d,
 	0x01, 0x90, 0xc8, 0x30,
 	0xff, 0x6a, 0xa2, 0x00,
-	0x00, 0x3d, 0xa4, 0x5c,
+	0x00, 0x3d, 0xb4, 0x5c,
 	0x01, 0x64, 0x20, 0x31,
 	0x80, 0x6a, 0x78, 0x00,
-	0x00, 0x65, 0x02, 0x59,
-	0x10, 0xb8, 0x48, 0x7c,
-	0xff, 0x6a, 0x2a, 0x5d,
-	0x00, 0x65, 0x48, 0x44,
-	0x00, 0x65, 0x88, 0x5e,
-	0x31, 0x6a, 0xaa, 0x5e,
-	0x00, 0x65, 0x48, 0x44,
+	0x00, 0x65, 0xfc, 0x58,
+	0x10, 0xb8, 0x50, 0x7c,
+	0xff, 0x6a, 0x3a, 0x5d,
+	0x00, 0x65, 0x50, 0x44,
+	0x00, 0x65, 0x96, 0x5e,
+	0x31, 0x6a, 0xbe, 0x5e,
+	0x00, 0x65, 0x50, 0x44,
 	0x10, 0x3f, 0x06, 0x00,
 	0x10, 0x6a, 0x06, 0x00,
 	0x01, 0x65, 0x74, 0x34,
-	0x81, 0x6a, 0xaa, 0x5e,
-	0x00, 0x65, 0x36, 0x45,
+	0x81, 0x6a, 0xbe, 0x5e,
+	0x00, 0x65, 0x46, 0x45,
 	0x01, 0x06, 0xd4, 0x30,
-	0x01, 0x0c, 0x36, 0x7d,
-	0x04, 0x0c, 0x30, 0x6d,
+	0x01, 0x0c, 0x46, 0x7d,
+	0x04, 0x0c, 0x40, 0x6d,
 	0xe0, 0x03, 0x7e, 0x08,
-	0xe0, 0x3f, 0xc4, 0x61,
+	0xe0, 0x3f, 0xbe, 0x61,
 	0x01, 0x65, 0xcc, 0x30,
 	0x01, 0x12, 0xda, 0x34,
 	0x01, 0x06, 0xd4, 0x34,
-	0x01, 0x03, 0x44, 0x6d,
+	0x01, 0x03, 0x54, 0x6d,
 	0x40, 0x03, 0xcc, 0x08,
 	0x01, 0x65, 0x06, 0x30,
 	0x40, 0x65, 0xc8, 0x08,
-	0x00, 0x66, 0x52, 0x75,
-	0x40, 0x65, 0x52, 0x7d,
-	0x00, 0x65, 0x52, 0x5d,
+	0x00, 0x66, 0x62, 0x75,
+	0x40, 0x65, 0x62, 0x7d,
+	0x00, 0x65, 0x62, 0x5d,
 	0xff, 0x6a, 0xd4, 0x08,
 	0xff, 0x6a, 0xd4, 0x08,
 	0xff, 0x6a, 0xd4, 0x08,
 	0xff, 0x6a, 0xd4, 0x0c,
 	0x08, 0x01, 0x02, 0x00,
-	0x02, 0x0b, 0x5c, 0x7d,
+	0x02, 0x0b, 0x6c, 0x7d,
 	0x01, 0x65, 0x0c, 0x30,
-	0x02, 0x0b, 0x60, 0x7d,
+	0x02, 0x0b, 0x70, 0x7d,
 	0xf7, 0x01, 0x02, 0x0c,
-	0x80, 0x3c, 0xae, 0x6e,
-	0x21, 0x6a, 0xaa, 0x46,
 	0x01, 0x65, 0xc8, 0x30,
-	0xff, 0x41, 0x88, 0x75,
+	0xff, 0x41, 0x94, 0x75,
 	0x01, 0x41, 0x20, 0x31,
 	0xff, 0x6a, 0xa4, 0x00,
-	0x00, 0x65, 0x78, 0x45,
-	0xff, 0xbf, 0x88, 0x75,
+	0x00, 0x65, 0x84, 0x45,
+	0xff, 0xbf, 0x94, 0x75,
 	0x01, 0x90, 0xa4, 0x30,
 	0x01, 0xbf, 0x20, 0x31,
-	0x00, 0xbb, 0x72, 0x65,
-	0xff, 0x52, 0x86, 0x75,
+	0x00, 0xbb, 0x7e, 0x65,
+	0xff, 0x52, 0x92, 0x75,
 	0x01, 0xbf, 0xcc, 0x30,
 	0x01, 0x90, 0xca, 0x30,
 	0x01, 0x52, 0x20, 0x31,
@@ -711,28 +721,28 @@
 	0x01, 0x65, 0x20, 0x35,
 	0x01, 0xbf, 0x82, 0x34,
 	0x01, 0x64, 0xa2, 0x30,
-	0x00, 0x6a, 0x92, 0x5e,
+	0x00, 0x6a, 0xa6, 0x5e,
 	0x0d, 0x6a, 0x76, 0x00,
-	0x00, 0x51, 0xec, 0x45,
+	0x00, 0x51, 0xf8, 0x45,
 	0x01, 0x65, 0xa4, 0x30,
 	0xe0, 0x6a, 0xcc, 0x00,
-	0x48, 0x6a, 0xe0, 0x5d,
+	0x48, 0x6a, 0xec, 0x5d,
 	0x01, 0x6a, 0xd0, 0x01,
 	0x01, 0x6a, 0xdc, 0x05,
 	0x88, 0x6a, 0xcc, 0x00,
-	0x48, 0x6a, 0xe0, 0x5d,
-	0x01, 0x6a, 0xba, 0x5d,
+	0x48, 0x6a, 0xec, 0x5d,
+	0x01, 0x6a, 0xc6, 0x5d,
 	0x01, 0x6a, 0x26, 0x05,
 	0x01, 0x65, 0xd8, 0x31,
 	0x09, 0xee, 0xdc, 0x01,
-	0x80, 0xee, 0xa6, 0x7d,
+	0x80, 0xee, 0xb2, 0x7d,
 	0xff, 0x6a, 0xdc, 0x0d,
 	0x01, 0x65, 0x32, 0x31,
 	0x0a, 0x93, 0x26, 0x01,
-	0x00, 0x65, 0x80, 0x46,
-	0x81, 0x6a, 0xaa, 0x5e,
-	0x01, 0x0c, 0xb2, 0x7d,
-	0x04, 0x0c, 0xb0, 0x6d,
+	0x00, 0x65, 0x8e, 0x46,
+	0x81, 0x6a, 0xbe, 0x5e,
+	0x01, 0x0c, 0xbe, 0x7d,
+	0x04, 0x0c, 0xbc, 0x6d,
 	0xe0, 0x03, 0x06, 0x08,
 	0xe0, 0x03, 0x7e, 0x0c,
 	0x01, 0x65, 0x18, 0x31,
@@ -751,7 +761,7 @@
 	0x01, 0x6c, 0xda, 0x34,
 	0x3d, 0x64, 0xa4, 0x28,
 	0x55, 0x64, 0xc8, 0x28,
-	0x00, 0x65, 0xe0, 0x45,
+	0x00, 0x65, 0xec, 0x45,
 	0x2e, 0x64, 0xa4, 0x28,
 	0x66, 0x64, 0xc8, 0x28,
 	0x00, 0x6c, 0xda, 0x18,
@@ -762,62 +772,63 @@
 	0x00, 0x6c, 0xda, 0x24,
 	0x01, 0x65, 0xc8, 0x30,
 	0xe0, 0x6a, 0xcc, 0x00,
-	0x44, 0x6a, 0xdc, 0x5d,
+	0x44, 0x6a, 0xe8, 0x5d,
 	0x01, 0x90, 0xe2, 0x31,
-	0x04, 0x3b, 0x00, 0x7e,
+	0x04, 0x3b, 0x0c, 0x7e,
 	0x30, 0x6a, 0xd0, 0x01,
 	0x20, 0x6a, 0xd0, 0x01,
 	0x1d, 0x6a, 0xdc, 0x01,
-	0xdc, 0xee, 0xfc, 0x65,
-	0x00, 0x65, 0x18, 0x46,
+	0xdc, 0xee, 0x08, 0x66,
+	0x00, 0x65, 0x24, 0x46,
 	0x20, 0x6a, 0xd0, 0x01,
 	0x01, 0x6a, 0xdc, 0x01,
 	0x20, 0xa0, 0xd8, 0x31,
 	0x09, 0xee, 0xdc, 0x01,
-	0x80, 0xee, 0x08, 0x7e,
+	0x80, 0xee, 0x14, 0x7e,
 	0x11, 0x6a, 0xdc, 0x01,
-	0x50, 0xee, 0x0c, 0x66,
+	0x50, 0xee, 0x18, 0x66,
 	0x20, 0x6a, 0xd0, 0x01,
 	0x09, 0x6a, 0xdc, 0x01,
-	0x88, 0xee, 0x12, 0x66,
+	0x88, 0xee, 0x1e, 0x66,
 	0x19, 0x6a, 0xdc, 0x01,
-	0xd8, 0xee, 0x16, 0x66,
+	0xd8, 0xee, 0x22, 0x66,
 	0xff, 0x6a, 0xdc, 0x09,
-	0x18, 0xee, 0x1a, 0x6e,
+	0x18, 0xee, 0x26, 0x6e,
 	0xff, 0x6a, 0xd4, 0x0c,
 	0x88, 0x6a, 0xcc, 0x00,
-	0x44, 0x6a, 0xdc, 0x5d,
-	0x20, 0x6a, 0xba, 0x5d,
+	0x44, 0x6a, 0xe8, 0x5d,
+	0x20, 0x6a, 0xc6, 0x5d,
 	0x01, 0x3b, 0x26, 0x31,
-	0x04, 0x3b, 0x34, 0x6e,
+	0x04, 0x3b, 0x40, 0x6e,
 	0xa0, 0x6a, 0xca, 0x00,
 	0x20, 0x65, 0xc8, 0x18,
-	0x00, 0x65, 0x70, 0x5e,
-	0x00, 0x65, 0x2c, 0x66,
+	0x00, 0x65, 0x7e, 0x5e,
+	0x00, 0x65, 0x38, 0x66,
 	0x0a, 0x93, 0x26, 0x01,
-	0x00, 0x65, 0x80, 0x46,
+	0x00, 0x65, 0x8e, 0x46,
 	0xa0, 0x6a, 0xcc, 0x00,
 	0xff, 0x6a, 0xc8, 0x08,
-	0x20, 0x94, 0x38, 0x6e,
-	0x10, 0x94, 0x3a, 0x6e,
-	0x08, 0x94, 0x52, 0x6e,
-	0x08, 0x94, 0x52, 0x6e,
-	0x08, 0x94, 0x52, 0x6e,
-	0x07, 0x8c, 0xca, 0x18,
-	0x3d, 0x65, 0xca, 0x28,
-	0x00, 0x65, 0xc8, 0x18,
-	0x00, 0x65, 0x56, 0x5e,
-	0xff, 0x65, 0xca, 0x10,
-	0x05, 0x65, 0xc8, 0x18,
-	0x04, 0x64, 0x82, 0x76,
-	0x00, 0x65, 0x38, 0x46,
+	0x20, 0x94, 0x44, 0x6e,
+	0x10, 0x94, 0x46, 0x6e,
+	0x08, 0x94, 0x60, 0x6e,
+	0x08, 0x94, 0x60, 0x6e,
+	0x08, 0x94, 0x60, 0x6e,
+	0xff, 0x8c, 0xc8, 0x10,
+	0xc1, 0x64, 0xc8, 0x18,
+	0xf8, 0x64, 0xc8, 0x08,
+	0x01, 0x99, 0xda, 0x30,
+	0x00, 0x66, 0x54, 0x66,
+	0xc0, 0x66, 0x90, 0x76,
+	0x60, 0x66, 0xc8, 0x18,
+	0x3d, 0x64, 0xc8, 0x28,
+	0x00, 0x65, 0x44, 0x46,
 	0xf7, 0x93, 0x26, 0x09,
-	0x08, 0x93, 0x54, 0x6e,
+	0x08, 0x93, 0x62, 0x6e,
 	0x00, 0x62, 0xc4, 0x18,
-	0x00, 0x65, 0x80, 0x5e,
-	0x00, 0x65, 0x60, 0x5e,
-	0x00, 0x65, 0x60, 0x5e,
-	0x00, 0x65, 0x60, 0x5e,
+	0x00, 0x65, 0x8e, 0x5e,
+	0x00, 0x65, 0x6e, 0x5e,
+	0x00, 0x65, 0x6e, 0x5e,
+	0x00, 0x65, 0x6e, 0x5e,
 	0x01, 0x99, 0xda, 0x30,
 	0x01, 0x99, 0xda, 0x30,
 	0x01, 0x99, 0xda, 0x30,
@@ -834,23 +845,26 @@
 	0x01, 0x6c, 0x32, 0x31,
 	0x01, 0x6c, 0x32, 0x31,
 	0x01, 0x6c, 0x32, 0x35,
-	0x08, 0x94, 0x80, 0x7e,
+	0x08, 0x94, 0x8e, 0x7e,
 	0xf7, 0x93, 0x26, 0x09,
-	0x08, 0x93, 0x84, 0x6e,
+	0x08, 0x93, 0x92, 0x6e,
 	0xff, 0x6a, 0xd4, 0x0c,
-	0x04, 0xb8, 0xa6, 0x6e,
+	0x04, 0xb8, 0xba, 0x6e,
 	0x01, 0x42, 0x7e, 0x31,
 	0xff, 0x6a, 0x76, 0x01,
 	0x01, 0x90, 0x84, 0x34,
 	0xff, 0x6a, 0x76, 0x05,
-	0xff, 0x42, 0xa2, 0x66,
-	0xff, 0x41, 0x9a, 0x66,
-	0xd1, 0x6a, 0xaa, 0x5e,
+	0x01, 0x85, 0x0a, 0x01,
+	0x7f, 0x65, 0x10, 0x09,
+	0xfe, 0x85, 0x0a, 0x0d,
+	0xff, 0x42, 0xb6, 0x66,
+	0xff, 0x41, 0xae, 0x66,
+	0xd1, 0x6a, 0xbe, 0x5e,
 	0xff, 0x6a, 0xca, 0x04,
 	0x01, 0x41, 0x20, 0x31,
 	0x01, 0xbf, 0x82, 0x30,
 	0x01, 0x6a, 0x76, 0x00,
-	0x00, 0xbb, 0xec, 0x45,
+	0x00, 0xbb, 0xf8, 0x45,
 	0x01, 0x42, 0x20, 0x31,
 	0x01, 0xbf, 0x84, 0x34,
 	0x01, 0x41, 0x7e, 0x31,
@@ -860,12 +874,20 @@
 	0xff, 0x6a, 0xd4, 0x0c
 };
 
+static int ahc_patch23_func(struct ahc_softc *ahc);
+
+static int
+ahc_patch23_func(struct ahc_softc *ahc)
+{
+	return ((ahc->bugs & AHC_SCBCHAN_UPLOAD_BUG) != 0);
+}
+
 static int ahc_patch22_func(struct ahc_softc *ahc);
 
 static int
 ahc_patch22_func(struct ahc_softc *ahc)
 {
-	return ((ahc->bugs & AHC_SCBCHAN_UPLOAD_BUG) != 0);
+	return ((ahc->features & AHC_CMD_CHAN) == 0);
 }
 
 static int ahc_patch21_func(struct ahc_softc *ahc);
@@ -873,7 +895,7 @@
 static int
 ahc_patch21_func(struct ahc_softc *ahc)
 {
-	return ((ahc->features & AHC_CMD_CHAN) == 0);
+	return ((ahc->features & AHC_QUEUE_REGS) == 0);
 }
 
 static int ahc_patch20_func(struct ahc_softc *ahc);
@@ -881,7 +903,7 @@
 static int
 ahc_patch20_func(struct ahc_softc *ahc)
 {
-	return ((ahc->features & AHC_QUEUE_REGS) == 0);
+	return ((ahc->features & AHC_WIDE) != 0);
 }
 
 static int ahc_patch19_func(struct ahc_softc *ahc);
@@ -889,7 +911,7 @@
 static int
 ahc_patch19_func(struct ahc_softc *ahc)
 {
-	return ((ahc->features & AHC_WIDE) != 0);
+	return ((ahc->flags & AHC_SCB_BTT) != 0);
 }
 
 static int ahc_patch18_func(struct ahc_softc *ahc);
@@ -897,7 +919,7 @@
 static int
 ahc_patch18_func(struct ahc_softc *ahc)
 {
-	return ((ahc->flags & AHC_SCB_BTT) != 0);
+	return ((ahc->bugs & AHC_PCI_2_1_RETRY_BUG) != 0);
 }
 
 static int ahc_patch17_func(struct ahc_softc *ahc);
@@ -905,7 +927,7 @@
 static int
 ahc_patch17_func(struct ahc_softc *ahc)
 {
-	return ((ahc->bugs & AHC_PCI_2_1_RETRY_BUG) != 0);
+	return ((ahc->flags & AHC_TMODE_WIDEODD_BUG) != 0);
 }
 
 static int ahc_patch16_func(struct ahc_softc *ahc);
@@ -913,7 +935,7 @@
 static int
 ahc_patch16_func(struct ahc_softc *ahc)
 {
-	return ((ahc->flags & AHC_TMODE_WIDEODD_BUG) != 0);
+	return ((ahc->bugs & AHC_AUTOFLUSH_BUG) != 0);
 }
 
 static int ahc_patch15_func(struct ahc_softc *ahc);
@@ -921,7 +943,7 @@
 static int
 ahc_patch15_func(struct ahc_softc *ahc)
 {
-	return ((ahc->bugs & AHC_AUTOFLUSH_BUG) != 0);
+	return ((ahc->features & AHC_ULTRA2) == 0);
 }
 
 static int ahc_patch14_func(struct ahc_softc *ahc);
@@ -929,7 +951,7 @@
 static int
 ahc_patch14_func(struct ahc_softc *ahc)
 {
-	return ((ahc->features & AHC_ULTRA2) == 0);
+	return ((ahc->bugs & AHC_PCI_MWI_BUG) != 0 && ahc->pci_cachesize != 0);
 }
 
 static int ahc_patch13_func(struct ahc_softc *ahc);
@@ -937,7 +959,7 @@
 static int
 ahc_patch13_func(struct ahc_softc *ahc)
 {
-	return ((ahc->bugs & AHC_PCI_MWI_BUG) != 0 && ahc->pci_cachesize != 0);
+	return ((ahc->flags & AHC_39BIT_ADDRESSING) != 0);
 }
 
 static int ahc_patch12_func(struct ahc_softc *ahc);
@@ -1062,95 +1084,96 @@
 	{ ahc_patch3_func, 27, 1, 2 },
 	{ ahc_patch0_func, 28, 1, 1 },
 	{ ahc_patch6_func, 34, 1, 1 },
-	{ ahc_patch7_func, 37, 65, 21 },
+	{ ahc_patch7_func, 37, 62, 21 },
 	{ ahc_patch8_func, 37, 1, 1 },
-	{ ahc_patch9_func, 45, 3, 2 },
-	{ ahc_patch0_func, 48, 3, 1 },
-	{ ahc_patch10_func, 52, 1, 2 },
-	{ ahc_patch0_func, 53, 2, 3 },
-	{ ahc_patch1_func, 53, 1, 2 },
-	{ ahc_patch0_func, 54, 1, 1 },
-	{ ahc_patch2_func, 56, 2, 1 },
-	{ ahc_patch9_func, 58, 1, 2 },
-	{ ahc_patch0_func, 59, 1, 1 },
-	{ ahc_patch9_func, 63, 1, 2 },
-	{ ahc_patch0_func, 64, 1, 1 },
-	{ ahc_patch9_func, 73, 1, 2 },
-	{ ahc_patch0_func, 74, 1, 1 },
-	{ ahc_patch9_func, 77, 1, 2 },
-	{ ahc_patch0_func, 78, 1, 1 },
-	{ ahc_patch11_func, 88, 1, 2 },
-	{ ahc_patch0_func, 89, 1, 1 },
-	{ ahc_patch9_func, 97, 1, 2 },
-	{ ahc_patch0_func, 98, 1, 1 },
-	{ ahc_patch8_func, 102, 9, 4 },
-	{ ahc_patch1_func, 104, 1, 2 },
-	{ ahc_patch0_func, 105, 1, 1 },
-	{ ahc_patch2_func, 107, 2, 1 },
-	{ ahc_patch2_func, 116, 4, 1 },
-	{ ahc_patch1_func, 120, 1, 2 },
-	{ ahc_patch0_func, 121, 2, 3 },
-	{ ahc_patch2_func, 121, 1, 2 },
-	{ ahc_patch0_func, 122, 1, 1 },
-	{ ahc_patch7_func, 123, 4, 2 },
-	{ ahc_patch0_func, 127, 1, 1 },
-	{ ahc_patch12_func, 129, 2, 1 },
-	{ ahc_patch1_func, 131, 1, 2 },
-	{ ahc_patch0_func, 132, 1, 1 },
-	{ ahc_patch7_func, 133, 4, 1 },
-	{ ahc_patch7_func, 144, 80, 9 },
-	{ ahc_patch4_func, 162, 1, 1 },
-	{ ahc_patch1_func, 175, 1, 1 },
-	{ ahc_patch9_func, 183, 1, 2 },
-	{ ahc_patch0_func, 184, 1, 1 },
-	{ ahc_patch9_func, 193, 1, 2 },
-	{ ahc_patch0_func, 194, 1, 1 },
-	{ ahc_patch9_func, 210, 6, 2 },
-	{ ahc_patch0_func, 216, 6, 1 },
-	{ ahc_patch8_func, 224, 18, 2 },
-	{ ahc_patch1_func, 237, 1, 1 },
-	{ ahc_patch1_func, 244, 1, 2 },
-	{ ahc_patch0_func, 245, 2, 2 },
-	{ ahc_patch12_func, 246, 1, 1 },
-	{ ahc_patch9_func, 254, 33, 2 },
-	{ ahc_patch1_func, 270, 16, 1 },
-	{ ahc_patch13_func, 287, 14, 1 },
-	{ ahc_patch1_func, 301, 2, 2 },
-	{ ahc_patch0_func, 303, 3, 3 },
-	{ ahc_patch9_func, 303, 1, 2 },
-	{ ahc_patch0_func, 304, 2, 1 },
-	{ ahc_patch1_func, 308, 1, 2 },
-	{ ahc_patch0_func, 309, 1, 1 },
-	{ ahc_patch9_func, 313, 1, 1 },
-	{ ahc_patch9_func, 316, 2, 2 },
-	{ ahc_patch0_func, 318, 4, 1 },
-	{ ahc_patch13_func, 322, 1, 1 },
-	{ ahc_patch14_func, 325, 2, 3 },
-	{ ahc_patch9_func, 325, 1, 2 },
-	{ ahc_patch0_func, 326, 1, 1 },
-	{ ahc_patch6_func, 331, 1, 2 },
-	{ ahc_patch0_func, 332, 1, 1 },
-	{ ahc_patch1_func, 336, 45, 10 },
-	{ ahc_patch6_func, 345, 2, 4 },
-	{ ahc_patch7_func, 345, 1, 1 },
-	{ ahc_patch8_func, 346, 1, 1 },
-	{ ahc_patch0_func, 347, 1, 1 },
-	{ ahc_patch15_func, 348, 1, 1 },
-	{ ahc_patch6_func, 367, 6, 3 },
-	{ ahc_patch15_func, 367, 5, 1 },
-	{ ahc_patch0_func, 373, 5, 1 },
-	{ ahc_patch0_func, 381, 51, 15 },
-	{ ahc_patch13_func, 381, 1, 1 },
-	{ ahc_patch7_func, 383, 2, 2 },
-	{ ahc_patch16_func, 384, 1, 1 },
-	{ ahc_patch9_func, 387, 1, 1 },
-	{ ahc_patch17_func, 394, 1, 1 },
-	{ ahc_patch13_func, 399, 9, 3 },
-	{ ahc_patch9_func, 400, 3, 2 },
-	{ ahc_patch0_func, 403, 3, 1 },
-	{ ahc_patch9_func, 411, 6, 2 },
-	{ ahc_patch0_func, 417, 8, 1 },
-	{ ahc_patch13_func, 425, 1, 1 },
+	{ ahc_patch9_func, 42, 3, 2 },
+	{ ahc_patch0_func, 45, 3, 1 },
+	{ ahc_patch10_func, 49, 1, 2 },
+	{ ahc_patch0_func, 50, 2, 3 },
+	{ ahc_patch1_func, 50, 1, 2 },
+	{ ahc_patch0_func, 51, 1, 1 },
+	{ ahc_patch2_func, 53, 2, 1 },
+	{ ahc_patch9_func, 55, 1, 2 },
+	{ ahc_patch0_func, 56, 1, 1 },
+	{ ahc_patch9_func, 60, 1, 2 },
+	{ ahc_patch0_func, 61, 1, 1 },
+	{ ahc_patch9_func, 70, 1, 2 },
+	{ ahc_patch0_func, 71, 1, 1 },
+	{ ahc_patch9_func, 74, 1, 2 },
+	{ ahc_patch0_func, 75, 1, 1 },
+	{ ahc_patch11_func, 85, 1, 2 },
+	{ ahc_patch0_func, 86, 1, 1 },
+	{ ahc_patch9_func, 94, 1, 2 },
+	{ ahc_patch0_func, 95, 1, 1 },
+	{ ahc_patch8_func, 99, 9, 4 },
+	{ ahc_patch1_func, 101, 1, 2 },
+	{ ahc_patch0_func, 102, 1, 1 },
+	{ ahc_patch2_func, 104, 2, 1 },
+	{ ahc_patch2_func, 113, 4, 1 },
+	{ ahc_patch1_func, 117, 1, 2 },
+	{ ahc_patch0_func, 118, 2, 3 },
+	{ ahc_patch2_func, 118, 1, 2 },
+	{ ahc_patch0_func, 119, 1, 1 },
+	{ ahc_patch7_func, 120, 4, 2 },
+	{ ahc_patch0_func, 124, 1, 1 },
+	{ ahc_patch12_func, 126, 2, 1 },
+	{ ahc_patch1_func, 128, 1, 2 },
+	{ ahc_patch0_func, 129, 1, 1 },
+	{ ahc_patch7_func, 130, 4, 1 },
+	{ ahc_patch7_func, 141, 80, 9 },
+	{ ahc_patch4_func, 159, 1, 1 },
+	{ ahc_patch1_func, 172, 1, 1 },
+	{ ahc_patch9_func, 180, 1, 2 },
+	{ ahc_patch0_func, 181, 1, 1 },
+	{ ahc_patch9_func, 190, 1, 2 },
+	{ ahc_patch0_func, 191, 1, 1 },
+	{ ahc_patch9_func, 207, 6, 2 },
+	{ ahc_patch0_func, 213, 6, 1 },
+	{ ahc_patch8_func, 221, 18, 2 },
+	{ ahc_patch1_func, 234, 1, 1 },
+	{ ahc_patch1_func, 241, 1, 2 },
+	{ ahc_patch0_func, 242, 2, 2 },
+	{ ahc_patch12_func, 243, 1, 1 },
+	{ ahc_patch9_func, 251, 31, 3 },
+	{ ahc_patch1_func, 267, 14, 2 },
+	{ ahc_patch13_func, 272, 1, 1 },
+	{ ahc_patch14_func, 282, 14, 1 },
+	{ ahc_patch1_func, 298, 1, 2 },
+	{ ahc_patch0_func, 299, 1, 1 },
+	{ ahc_patch9_func, 302, 1, 1 },
+	{ ahc_patch13_func, 307, 1, 1 },
+	{ ahc_patch9_func, 308, 2, 2 },
+	{ ahc_patch0_func, 310, 4, 1 },
+	{ ahc_patch14_func, 314, 1, 1 },
+	{ ahc_patch15_func, 317, 2, 3 },
+	{ ahc_patch9_func, 317, 1, 2 },
+	{ ahc_patch0_func, 318, 1, 1 },
+	{ ahc_patch6_func, 323, 1, 2 },
+	{ ahc_patch0_func, 324, 1, 1 },
+	{ ahc_patch1_func, 328, 50, 11 },
+	{ ahc_patch6_func, 337, 2, 4 },
+	{ ahc_patch7_func, 337, 1, 1 },
+	{ ahc_patch8_func, 338, 1, 1 },
+	{ ahc_patch0_func, 339, 1, 1 },
+	{ ahc_patch16_func, 340, 1, 1 },
+	{ ahc_patch6_func, 359, 6, 3 },
+	{ ahc_patch16_func, 359, 5, 1 },
+	{ ahc_patch0_func, 365, 5, 1 },
+	{ ahc_patch13_func, 373, 5, 1 },
+	{ ahc_patch0_func, 378, 54, 17 },
+	{ ahc_patch14_func, 378, 1, 1 },
+	{ ahc_patch7_func, 380, 2, 2 },
+	{ ahc_patch17_func, 381, 1, 1 },
+	{ ahc_patch9_func, 384, 1, 1 },
+	{ ahc_patch18_func, 391, 1, 1 },
+	{ ahc_patch14_func, 396, 9, 3 },
+	{ ahc_patch9_func, 397, 3, 2 },
+	{ ahc_patch0_func, 400, 3, 1 },
+	{ ahc_patch9_func, 408, 6, 2 },
+	{ ahc_patch0_func, 414, 9, 2 },
+	{ ahc_patch13_func, 414, 1, 1 },
+	{ ahc_patch13_func, 423, 2, 1 },
+	{ ahc_patch14_func, 425, 1, 1 },
 	{ ahc_patch9_func, 427, 1, 2 },
 	{ ahc_patch0_func, 428, 1, 1 },
 	{ ahc_patch7_func, 431, 1, 1 },
@@ -1159,95 +1182,100 @@
 	{ ahc_patch6_func, 434, 1, 2 },
 	{ ahc_patch0_func, 435, 1, 1 },
 	{ ahc_patch9_func, 436, 1, 1 },
-	{ ahc_patch13_func, 437, 9, 4 },
-	{ ahc_patch9_func, 437, 1, 1 },
-	{ ahc_patch9_func, 444, 2, 1 },
-	{ ahc_patch0_func, 446, 4, 3 },
-	{ ahc_patch9_func, 446, 1, 2 },
-	{ ahc_patch0_func, 447, 3, 1 },
-	{ ahc_patch1_func, 451, 2, 1 },
-	{ ahc_patch7_func, 453, 5, 2 },
-	{ ahc_patch0_func, 458, 1, 1 },
-	{ ahc_patch8_func, 459, 107, 23 },
-	{ ahc_patch1_func, 460, 3, 2 },
-	{ ahc_patch0_func, 463, 5, 3 },
-	{ ahc_patch9_func, 463, 2, 2 },
-	{ ahc_patch0_func, 465, 3, 1 },
-	{ ahc_patch1_func, 470, 2, 2 },
-	{ ahc_patch0_func, 472, 6, 3 },
-	{ ahc_patch9_func, 472, 2, 2 },
-	{ ahc_patch0_func, 474, 3, 1 },
-	{ ahc_patch1_func, 480, 2, 2 },
-	{ ahc_patch0_func, 482, 9, 7 },
-	{ ahc_patch9_func, 482, 5, 6 },
-	{ ahc_patch18_func, 482, 1, 2 },
-	{ ahc_patch0_func, 483, 1, 1 },
-	{ ahc_patch18_func, 485, 1, 2 },
+	{ ahc_patch15_func, 437, 1, 2 },
+	{ ahc_patch13_func, 437, 1, 1 },
+	{ ahc_patch14_func, 439, 9, 4 },
+	{ ahc_patch9_func, 439, 1, 1 },
+	{ ahc_patch9_func, 446, 2, 1 },
+	{ ahc_patch0_func, 448, 4, 3 },
+	{ ahc_patch9_func, 448, 1, 2 },
+	{ ahc_patch0_func, 449, 3, 1 },
+	{ ahc_patch1_func, 453, 2, 1 },
+	{ ahc_patch7_func, 455, 5, 2 },
+	{ ahc_patch0_func, 460, 1, 1 },
+	{ ahc_patch8_func, 461, 109, 23 },
+	{ ahc_patch1_func, 463, 3, 2 },
+	{ ahc_patch0_func, 466, 5, 3 },
+	{ ahc_patch9_func, 466, 2, 2 },
+	{ ahc_patch0_func, 468, 3, 1 },
+	{ ahc_patch1_func, 473, 2, 2 },
+	{ ahc_patch0_func, 475, 6, 3 },
+	{ ahc_patch9_func, 475, 2, 2 },
+	{ ahc_patch0_func, 477, 3, 1 },
+	{ ahc_patch1_func, 483, 2, 2 },
+	{ ahc_patch0_func, 485, 9, 7 },
+	{ ahc_patch9_func, 485, 5, 6 },
+	{ ahc_patch19_func, 485, 1, 2 },
 	{ ahc_patch0_func, 486, 1, 1 },
-	{ ahc_patch0_func, 487, 4, 1 },
-	{ ahc_patch6_func, 491, 3, 2 },
-	{ ahc_patch0_func, 494, 1, 1 },
-	{ ahc_patch1_func, 497, 1, 1 },
-	{ ahc_patch6_func, 502, 1, 2 },
-	{ ahc_patch0_func, 503, 1, 1 },
-	{ ahc_patch19_func, 540, 7, 1 },
-	{ ahc_patch3_func, 568, 1, 2 },
-	{ ahc_patch0_func, 569, 1, 1 },
-	{ ahc_patch20_func, 572, 1, 1 },
-	{ ahc_patch8_func, 574, 100, 31 },
-	{ ahc_patch4_func, 575, 1, 1 },
-	{ ahc_patch1_func, 581, 2, 2 },
-	{ ahc_patch0_func, 583, 1, 1 },
-	{ ahc_patch9_func, 584, 3, 3 },
-	{ ahc_patch14_func, 585, 1, 1 },
-	{ ahc_patch0_func, 587, 4, 1 },
-	{ ahc_patch18_func, 595, 2, 2 },
-	{ ahc_patch0_func, 597, 1, 1 },
-	{ ahc_patch18_func, 601, 10, 3 },
-	{ ahc_patch5_func, 603, 8, 1 },
-	{ ahc_patch0_func, 611, 9, 2 },
-	{ ahc_patch5_func, 612, 8, 1 },
-	{ ahc_patch4_func, 622, 1, 2 },
-	{ ahc_patch0_func, 623, 1, 1 },
-	{ ahc_patch18_func, 624, 1, 2 },
-	{ ahc_patch0_func, 625, 3, 2 },
-	{ ahc_patch4_func, 627, 1, 1 },
-	{ ahc_patch5_func, 628, 1, 1 },
-	{ ahc_patch5_func, 631, 1, 1 },
-	{ ahc_patch5_func, 633, 1, 1 },
-	{ ahc_patch4_func, 635, 2, 2 },
-	{ ahc_patch0_func, 637, 2, 1 },
+	{ ahc_patch19_func, 488, 1, 2 },
+	{ ahc_patch0_func, 489, 1, 1 },
+	{ ahc_patch0_func, 490, 4, 1 },
+	{ ahc_patch6_func, 494, 3, 2 },
+	{ ahc_patch0_func, 497, 1, 1 },
+	{ ahc_patch1_func, 500, 1, 1 },
+	{ ahc_patch6_func, 506, 1, 2 },
+	{ ahc_patch0_func, 507, 1, 1 },
+	{ ahc_patch20_func, 544, 7, 1 },
+	{ ahc_patch3_func, 572, 1, 2 },
+	{ ahc_patch0_func, 573, 1, 1 },
+	{ ahc_patch21_func, 576, 1, 1 },
+	{ ahc_patch8_func, 578, 104, 33 },
+	{ ahc_patch4_func, 579, 1, 1 },
+	{ ahc_patch1_func, 585, 2, 2 },
+	{ ahc_patch0_func, 587, 1, 1 },
+	{ ahc_patch1_func, 590, 1, 2 },
+	{ ahc_patch0_func, 591, 1, 1 },
+	{ ahc_patch9_func, 592, 3, 3 },
+	{ ahc_patch15_func, 593, 1, 1 },
+	{ ahc_patch0_func, 595, 4, 1 },
+	{ ahc_patch19_func, 603, 2, 2 },
+	{ ahc_patch0_func, 605, 1, 1 },
+	{ ahc_patch19_func, 609, 10, 3 },
+	{ ahc_patch5_func, 611, 8, 1 },
+	{ ahc_patch0_func, 619, 9, 2 },
+	{ ahc_patch5_func, 620, 8, 1 },
+	{ ahc_patch4_func, 630, 1, 2 },
+	{ ahc_patch0_func, 631, 1, 1 },
+	{ ahc_patch19_func, 632, 1, 2 },
+	{ ahc_patch0_func, 633, 3, 2 },
+	{ ahc_patch4_func, 635, 1, 1 },
+	{ ahc_patch5_func, 636, 1, 1 },
 	{ ahc_patch5_func, 639, 1, 1 },
-	{ ahc_patch5_func, 642, 1, 1 },
-	{ ahc_patch5_func, 645, 1, 1 },
-	{ ahc_patch18_func, 649, 1, 1 },
-	{ ahc_patch18_func, 652, 1, 1 },
-	{ ahc_patch4_func, 658, 1, 1 },
-	{ ahc_patch6_func, 661, 1, 2 },
-	{ ahc_patch0_func, 662, 1, 1 },
-	{ ahc_patch7_func, 674, 16, 1 },
-	{ ahc_patch4_func, 692, 20, 1 },
-	{ ahc_patch9_func, 713, 4, 2 },
-	{ ahc_patch0_func, 717, 4, 1 },
-	{ ahc_patch9_func, 721, 4, 2 },
-	{ ahc_patch0_func, 725, 3, 1 },
-	{ ahc_patch6_func, 731, 1, 1 },
-	{ ahc_patch21_func, 733, 14, 1 },
-	{ ahc_patch7_func, 747, 3, 1 },
-	{ ahc_patch9_func, 759, 24, 8 },
-	{ ahc_patch18_func, 763, 1, 2 },
-	{ ahc_patch0_func, 764, 1, 1 },
-	{ ahc_patch14_func, 769, 4, 2 },
-	{ ahc_patch0_func, 773, 7, 3 },
-	{ ahc_patch22_func, 773, 5, 2 },
-	{ ahc_patch0_func, 778, 2, 1 },
-	{ ahc_patch0_func, 783, 41, 3 },
-	{ ahc_patch17_func, 795, 17, 2 },
-	{ ahc_patch0_func, 812, 1, 1 },
-	{ ahc_patch4_func, 836, 1, 1 },
-	{ ahc_patch4_func, 837, 3, 2 },
-	{ ahc_patch0_func, 840, 1, 1 },
-	{ ahc_patch4_func, 841, 12, 1 }
+	{ ahc_patch5_func, 641, 1, 1 },
+	{ ahc_patch4_func, 643, 2, 2 },
+	{ ahc_patch0_func, 645, 2, 1 },
+	{ ahc_patch5_func, 647, 1, 1 },
+	{ ahc_patch5_func, 650, 1, 1 },
+	{ ahc_patch5_func, 653, 1, 1 },
+	{ ahc_patch19_func, 657, 1, 1 },
+	{ ahc_patch19_func, 660, 1, 1 },
+	{ ahc_patch4_func, 666, 1, 1 },
+	{ ahc_patch6_func, 669, 1, 2 },
+	{ ahc_patch0_func, 670, 1, 1 },
+	{ ahc_patch7_func, 682, 16, 1 },
+	{ ahc_patch4_func, 698, 20, 1 },
+	{ ahc_patch9_func, 719, 4, 2 },
+	{ ahc_patch0_func, 723, 4, 1 },
+	{ ahc_patch9_func, 727, 4, 2 },
+	{ ahc_patch0_func, 731, 3, 1 },
+	{ ahc_patch6_func, 737, 1, 1 },
+	{ ahc_patch22_func, 739, 14, 1 },
+	{ ahc_patch7_func, 753, 3, 1 },
+	{ ahc_patch9_func, 765, 24, 8 },
+	{ ahc_patch19_func, 769, 1, 2 },
+	{ ahc_patch0_func, 770, 1, 1 },
+	{ ahc_patch15_func, 775, 4, 2 },
+	{ ahc_patch0_func, 779, 7, 3 },
+	{ ahc_patch23_func, 779, 5, 2 },
+	{ ahc_patch0_func, 784, 2, 1 },
+	{ ahc_patch0_func, 789, 42, 3 },
+	{ ahc_patch18_func, 801, 18, 2 },
+	{ ahc_patch0_func, 819, 1, 1 },
+	{ ahc_patch4_func, 843, 1, 1 },
+	{ ahc_patch4_func, 844, 3, 2 },
+	{ ahc_patch0_func, 847, 1, 1 },
+	{ ahc_patch13_func, 848, 3, 1 },
+	{ ahc_patch4_func, 851, 12, 1 }
 };
 struct cs {
 	u_int16_t	begin;
@@ -1255,11 +1283,11 @@
 } critical_sections[] = {
 	{ 11, 18 },
 	{ 21, 30 },
-	{ 692, 708 },
-	{ 837, 840 },
-	{ 841, 847 },
-	{ 849, 851 },
-	{ 851, 853 }
+	{ 698, 714 },
+	{ 844, 847 },
+	{ 851, 857 },
+	{ 859, 861 },
+	{ 861, 863 }
 };
 const int num_critical_sections = sizeof(critical_sections)
 				 / sizeof(*critical_sections);
diff -u --recursive --new-file v2.4.8/linux/drivers/scsi/aic7xxx/aicasm/aicasm.c linux/drivers/scsi/aic7xxx/aicasm/aicasm.c
--- v2.4.8/linux/drivers/scsi/aic7xxx/aicasm/aicasm.c	Sun Mar  4 14:30:18 2001
+++ linux/drivers/scsi/aic7xxx/aicasm/aicasm.c	Sun Aug 12 17:37:53 2001
@@ -14,7 +14,7 @@
  *    derived from this software without specific prior written permission.
  *
  * Alternatively, this software may be distributed under the terms of the
- * GNU Public License ("GPL").
+ * GNU General Public License ("GPL").
  *
  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
@@ -28,7 +28,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $Id: //depot/src/aic7xxx/aicasm/aicasm.c#6 $
+ * $Id: //depot/src/aic7xxx/aicasm/aicasm.c#8 $
  *
  * $FreeBSD: src/sys/dev/aic7xxx/aicasm/aicasm.c,v 1.29 2000/10/05 04:25:42 gibbs Exp $
  */
@@ -178,9 +178,10 @@
 							"times\n", appname);
 				}
 				includes_search_curdir = 0;
-				for (include_dir = search_path.slh_first;
+				for (include_dir = SLIST_FIRST(&search_path);
 				     include_dir != NULL;
-				     include_dir = include_dir->links.sle_next)
+				     include_dir = SLIST_NEXT(include_dir,
+							      links))
 					/*
 					 * All entries before a '-I-' only
 					 * apply to includes specified with
@@ -276,9 +277,9 @@
 {
 	struct instruction *cur_instr;
 
-	for(cur_instr = seq_program.stqh_first;
-	    cur_instr != NULL;
-	    cur_instr = cur_instr->links.stqe_next) {
+	for (cur_instr = STAILQ_FIRST(&seq_program);
+	     cur_instr != NULL;
+	     cur_instr = STAILQ_NEXT(cur_instr, links)) {
 		if (cur_instr->patch_label != NULL) {
 			struct ins_format3 *f3_instr;
 			u_int address;
@@ -312,16 +313,18 @@
 	instrcount = 0;
 	fprintf(ofile,
 "/*
-  * DO NOT EDIT - This file is automatically generated.
-  */\n");
+ * DO NOT EDIT - This file is automatically generated
+ *		 from the following source files:
+ *
+%s */\n", versions);
 
 	fprintf(ofile, "static uint8_t seqprog[] = {\n");
-	for(cur_instr = seq_program.stqh_first;
-	    cur_instr != NULL;
-	    cur_instr = cur_instr->links.stqe_next) {
+	for (cur_instr = STAILQ_FIRST(&seq_program);
+	     cur_instr != NULL;
+	     cur_instr = STAILQ_NEXT(cur_instr, links)) {
 
 		fprintf(ofile, "%s\t0x%02x, 0x%02x, 0x%02x, 0x%02x",
-			cur_instr == seq_program.stqh_first ? "" : ",\n",
+			cur_instr == STAILQ_FIRST(&seq_program) ? "" : ",\n",
 #if BYTE_ORDER == LITTLE_ENDIAN
 			cur_instr->format.bytes[0],
 			cur_instr->format.bytes[1],
@@ -340,9 +343,9 @@
 	/*
 	 *  Output patch information.  Patch functions first.
 	 */
-	for(cur_node = SLIST_FIRST(&patch_functions);
-	    cur_node != NULL;
-	    cur_node = SLIST_NEXT(cur_node,links)) {
+	for (cur_node = SLIST_FIRST(&patch_functions);
+	     cur_node != NULL;
+	     cur_node = SLIST_NEXT(cur_node,links)) {
 		fprintf(ofile,
 "static int ahc_patch%d_func(struct ahc_softc *ahc);
 
diff -u --recursive --new-file v2.4.8/linux/drivers/scsi/aic7xxx/aicasm/aicasm.h linux/drivers/scsi/aic7xxx/aicasm/aicasm.h
--- v2.4.8/linux/drivers/scsi/aic7xxx/aicasm/aicasm.h	Sun Mar  4 14:30:18 2001
+++ linux/drivers/scsi/aic7xxx/aicasm/aicasm.h	Sun Aug 12 10:51:42 2001
@@ -28,7 +28,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $Id: //depot/src/aic7xxx/aicasm/aicasm.h#4 $
+ * $Id: //depot/src/aic7xxx/aicasm/aicasm.h#5 $
  *
  * $FreeBSD: src/sys/dev/aic7xxx/aicasm/aicasm.h,v 1.11 2000/09/22 22:19:54 gibbs Exp $
  */
@@ -69,6 +69,7 @@
 extern char *appname;
 extern int yylineno;
 extern char *yyfilename;
+extern char *versions;
 
 void stop(const char *errstring, int err_code);
 void include_file(char *file_name, include_type type);
diff -u --recursive --new-file v2.4.8/linux/drivers/scsi/aic7xxx/aicasm/aicasm_gram.y linux/drivers/scsi/aic7xxx/aicasm/aicasm_gram.y
--- v2.4.8/linux/drivers/scsi/aic7xxx/aicasm/aicasm_gram.y	Sun Mar  4 14:30:18 2001
+++ linux/drivers/scsi/aic7xxx/aicasm/aicasm_gram.y	Sun Aug 12 10:51:42 2001
@@ -29,7 +29,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $Id: //depot/src/aic7xxx/aicasm/aicasm_gram.y#6 $
+ * $Id: //depot/src/aic7xxx/aicasm/aicasm_gram.y#7 $
  *
  * $FreeBSD: src/sys/dev/aic7xxx/aicasm/aicasm_gram.y,v 1.12 2000/10/31 18:44:32 gibbs Exp $
  */
@@ -53,6 +53,7 @@
 
 int yylineno;
 char *yyfilename;
+char *versions;
 static symbol_t *cur_symbol;
 static symtype cur_symtype;
 static symbol_t *accumulator;
@@ -79,6 +80,7 @@
 static void type_check(symbol_t *symbol, expression_t *expression, int and_op);
 static void make_expression(expression_t *immed, int value);
 static void add_conditional(symbol_t *symbol);
+static void add_version(const char *verstring);
 static int  is_download_const(expression_t *immed);
 
 #define YYDEBUG 1
@@ -124,11 +126,11 @@
 
 %token <value> T_NUMBER
 
-%token <str> T_PATH
+%token <str> T_PATH T_STRING
 
 %token <sym> T_CEXPR
 
-%token T_EOF T_INCLUDE 
+%token T_EOF T_INCLUDE T_VERSION
 
 %token <value> T_SHR T_SHL T_ROR T_ROL
 
@@ -180,6 +182,8 @@
 program:
 	include
 |	program include
+|	version
+|	program version
 |	register
 |	program register
 |	constant
@@ -202,9 +206,18 @@
 
 include:
 	T_INCLUDE '<' T_PATH '>'
-	{ include_file($3, BRACKETED_INCLUDE); }
+	{
+		include_file($3, BRACKETED_INCLUDE);
+	}
 |	T_INCLUDE '"' T_PATH '"'
-	{ include_file($3, QUOTED_INCLUDE); }
+	{
+		include_file($3, QUOTED_INCLUDE);
+	}
+;
+
+version:
+	T_VERSION '=' T_STRING
+	{ add_version($3); }
 ;
 
 register:
@@ -1436,6 +1449,26 @@
 	initialize_symbol(symbol);
 	symbol->info.condinfo->func_num = numfuncs++;
 	symlist_add(&patch_functions, symbol, SYMLIST_INSERT_HEAD);
+}
+
+static void
+add_version(const char *verstring)
+{
+	const char prefix[] = " * ";
+	int newlen;
+	int oldlen;
+
+	newlen = strlen(verstring) + strlen(prefix);
+	oldlen = 0;
+	if (versions != NULL)
+		oldlen = strlen(versions);
+	versions = realloc(versions, newlen + oldlen + 2);
+	if (versions == NULL)
+		stop("Can't allocate version string", EX_SOFTWARE);
+	strcpy(&versions[oldlen], prefix);
+	strcpy(&versions[oldlen + strlen(prefix)], verstring);
+	versions[newlen + oldlen] = '\n';
+	versions[newlen + oldlen + 1] = '\0';
 }
 
 void
diff -u --recursive --new-file v2.4.8/linux/drivers/scsi/aic7xxx/aicasm/aicasm_scan.l linux/drivers/scsi/aic7xxx/aicasm/aicasm_scan.l
--- v2.4.8/linux/drivers/scsi/aic7xxx/aicasm/aicasm_scan.l	Sun Mar  4 14:30:18 2001
+++ linux/drivers/scsi/aic7xxx/aicasm/aicasm_scan.l	Sun Aug 12 10:51:42 2001
@@ -29,7 +29,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $Id: //depot/src/aic7xxx/aicasm/aicasm_scan.l#4 $
+ * $Id: //depot/src/aic7xxx/aicasm/aicasm_scan.l#5 $
  *
  * $FreeBSD: src/sys/dev/aic7xxx/aicasm/aicasm_scan.l,v 1.13 2000/09/22 22:19:54 gibbs Exp $
  */
@@ -54,6 +54,7 @@
 char string_buf[MAX_STR_CONST];
 char *string_buf_ptr;
 int  parren_count;
+int  quote_count;
 %}
 
 PATH		[-/A-Za-z0-9_.]*[./][-/A-Za-z0-9_.]*
@@ -63,6 +64,7 @@
 %x COMMENT
 %x CEXPR
 %x INCLUDE
+%x STRING
 
 %%
 \n			{ ++yylineno; }
@@ -94,8 +96,9 @@
 			}
 <CEXPR>\n		{ ++yylineno; }
 <CEXPR>[^()\n]+	{
-				char *yptr = yytext;
+				char *yptr;
 
+				yptr = yytext;
 				while (*yptr != '\0') {
 					/* Remove duplicate spaces */
 					if (*yptr == '\t')
@@ -109,6 +112,25 @@
 				}
 			}
 
+VERSION			{ return T_VERSION; }
+\"			{
+				string_buf_ptr = string_buf;
+				BEGIN STRING;
+			}
+<STRING>[^"]+		{
+				char *yptr;
+
+				yptr = yytext;
+				while (*yptr)
+					*string_buf_ptr++ = *yptr++;
+			}
+<STRING>\"		{
+				/* All done */
+				BEGIN INITIAL;
+				*string_buf_ptr = '\0';
+				yylval.str = string_buf;
+				return T_STRING;
+			}
 {SPACE}			;
 
 	/* Register/SCB/SRAM definition keywords */
@@ -175,7 +197,7 @@
 else			{ return T_ELSE; }
 
 	/* Allowed Symbols */
-[-+,:()~|&."{};<>[\]!]	{ return yytext[0]; }
+[-+,:()~|&."{};<>[\]!=]	{ return yytext[0]; }
 
 	/* Number processing */
 0[0-7]*			{
@@ -194,17 +216,36 @@
 			}
 
 	/* Include Files */
-#include		{ return T_INCLUDE; BEGIN INCLUDE;}
-<INCLUDE>[<>\"]		{ return yytext[0]; }
-<INCLUDE>{PATH}		{ yylval.str = strdup(yytext); return T_PATH; }
-<INCLUDE>;		{ BEGIN INITIAL; return yytext[0]; }
+#include{SPACE}		{
+				BEGIN INCLUDE;
+				quote_count = 0;
+				return T_INCLUDE;
+			}
+<INCLUDE>[<]		{ return yytext[0]; }
+<INCLUDE>[>]		{ BEGIN INITIAL; return yytext[0]; }
+<INCLUDE>[\"]		{
+				if (quote_count != 0)
+					BEGIN INITIAL;
+				quote_count++;
+				return yytext[0];
+			}
 <INCLUDE>.		{ stop("Invalid include line", EX_DATAERR); }
 
 	/* For parsing C include files with #define foo */
 #define			{ yylval.value = TRUE; return T_CONST; }
 	/* Throw away macros */
 #define[^\n]*[()]+[^\n]* ;
-{PATH}			{ yylval.str = strdup(yytext); return T_PATH; }
+<INITIAL,INCLUDE>{PATH}	{
+				char *yptr;
+
+				yptr = yytext;
+				string_buf_ptr = string_buf;
+				while (*yptr)
+					*string_buf_ptr++ = *yptr++;
+				yylval.str = string_buf;
+				*string_buf_ptr = '\0';
+				return T_PATH;
+			}
 
 {WORD}			{ yylval.sym = symtable_get(yytext);  return T_SYMBOL; }
 
diff -u --recursive --new-file v2.4.8/linux/drivers/scsi/aic7xxx/aicasm/aicasm_symbol.c linux/drivers/scsi/aic7xxx/aicasm/aicasm_symbol.c
--- v2.4.8/linux/drivers/scsi/aic7xxx/aicasm/aicasm_symbol.c	Fri May  4 15:16:28 2001
+++ linux/drivers/scsi/aic7xxx/aicasm/aicasm_symbol.c	Sun Aug 12 17:37:53 2001
@@ -14,7 +14,7 @@
  *    derived from this software without specific prior written permission.
  *
  * Alternatively, this software may be distributed under the terms of the
- * GNU Public License ("GPL").
+ * GNU General Public License ("GPL").
  *
  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
@@ -28,7 +28,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $Id: //depot/src/aic7xxx/aicasm/aicasm_symbol.c#5 $
+ * $Id: //depot/src/aic7xxx/aicasm/aicasm_symbol.c#7 $
  *
  * $FreeBSD: src/sys/dev/aic7xxx/aicasm/aicasm_symbol.c,v 1.11 2000/09/22 22:19:54 gibbs Exp $
  */
@@ -191,11 +191,11 @@
 {
 	symbol_node_t *curnode;
 
-	curnode = symlist->slh_first;
+	curnode = SLIST_FIRST(symlist);
 	while(curnode != NULL) {
 		if (strcmp(symname, curnode->symbol->name) == 0)
 			break;
-		curnode = curnode->links.sle_next;
+		curnode = SLIST_NEXT(curnode, links);
 	}
 	return (curnode);
 }
@@ -231,7 +231,7 @@
 			/* NOTREACHED */
 		}
 
-		curnode = symlist->slh_first;
+		curnode = SLIST_FIRST(symlist);
 		if (curnode == NULL
 		 || (mask && (curnode->symbol->info.minfo->mask >
 		              newnode->symbol->info.minfo->mask))
@@ -242,14 +242,14 @@
 		}
 
 		while (1) {
-			if (curnode->links.sle_next == NULL) {
+			if (SLIST_NEXT(curnode, links) == NULL) {
 				SLIST_INSERT_AFTER(curnode, newnode,
 						   links);
 				break;
 			} else {
 				symbol_t *cursymbol;
 
-				cursymbol = curnode->links.sle_next->symbol;
+				cursymbol = SLIST_NEXT(curnode, links)->symbol;
 				if ((mask && (cursymbol->info.minfo->mask >
 				              symbol->info.minfo->mask))
 				 || (!mask &&(cursymbol->info.rinfo->address >
@@ -259,7 +259,7 @@
 					break;
 				}
 			}
-			curnode = curnode->links.sle_next;
+			curnode = SLIST_NEXT(curnode, links);
 		}
 	} else {
 		SLIST_INSERT_HEAD(symlist, newnode, links);
@@ -271,9 +271,9 @@
 {
 	symbol_node_t *node1, *node2;
 
-	node1 = symlist->slh_first;
+	node1 = SLIST_FIRST(symlist);
 	while (node1 != NULL) {
-		node2 = node1->links.sle_next;
+		node2 = SLIST_NEXT(node1, links);
 		free(node1);
 		node1 = node2;
 	}
@@ -287,7 +287,7 @@
 	symbol_node_t *node;
 
 	*symlist_dest = *symlist_src1;
-	while((node = symlist_src2->slh_first) != NULL) {
+	while((node = SLIST_FIRST(symlist_src2)) != NULL) {
 		SLIST_REMOVE_HEAD(symlist_src2, links);
 		SLIST_INSERT_HEAD(symlist_dest, node, links);
 	}
@@ -357,28 +357,28 @@
 		}
 
 		/* Put in the masks and bits */
-		while (masks.slh_first != NULL) {
+		while (SLIST_FIRST(&masks) != NULL) {
 			symbol_node_t *curnode;
 			symbol_node_t *regnode;
 			char *regname;
 
-			curnode = masks.slh_first;
+			curnode = SLIST_FIRST(&masks);
 			SLIST_REMOVE_HEAD(&masks, links);
 
 			regnode =
-			    curnode->symbol->info.minfo->symrefs.slh_first;
+			    SLIST_FIRST(&curnode->symbol->info.minfo->symrefs);
 			regname = regnode->symbol->name;
 			regnode = symlist_search(&registers, regname);
 			SLIST_INSERT_AFTER(regnode, curnode, links);
 		}
 
 		/* Add the aliases */
-		while (aliases.slh_first != NULL) {
+		while (SLIST_FIRST(&aliases) != NULL) {
 			symbol_node_t *curnode;
 			symbol_node_t *regnode;
 			char *regname;
 
-			curnode = aliases.slh_first;
+			curnode = SLIST_FIRST(&aliases);
 			SLIST_REMOVE_HEAD(&aliases, links);
 
 			regname = curnode->symbol->info.ainfo->parent->name;
@@ -389,15 +389,17 @@
 		/* Output what we have */
 		fprintf(ofile,
 "/*
-  * DO NOT EDIT - This file is automatically generated.
-  */\n");
-		while (registers.slh_first != NULL) {
+ * DO NOT EDIT - This file is automatically generated
+ *		 from the following source files:
+ *
+%s */\n", versions);
+		while (SLIST_FIRST(&registers) != NULL) {
 			symbol_node_t *curnode;
 			u_int8_t value;
 			char *tab_str;
 			char *tab_str2;
 
-			curnode = registers.slh_first;
+			curnode = SLIST_FIRST(&registers);
 			SLIST_REMOVE_HEAD(&registers, links);
 			switch(curnode->symbol->type) {
 			case REGISTER:
@@ -439,10 +441,10 @@
 		}
 		fprintf(ofile, "\n\n");
 
-		while (constants.slh_first != NULL) {
+		while (SLIST_FIRST(&constants) != NULL) {
 			symbol_node_t *curnode;
 
-			curnode = constants.slh_first;
+			curnode = SLIST_FIRST(&constants);
 			SLIST_REMOVE_HEAD(&constants, links);
 			fprintf(ofile, "#define\t%-8s\t0x%02x\n",
 				curnode->symbol->name,
@@ -453,10 +455,10 @@
 		
 		fprintf(ofile, "\n\n/* Downloaded Constant Definitions */\n");
 
-		while (download_constants.slh_first != NULL) {
+		while (SLIST_FIRST(&download_constants) != NULL) {
 			symbol_node_t *curnode;
 
-			curnode = download_constants.slh_first;
+			curnode = SLIST_FIRST(&download_constants);
 			SLIST_REMOVE_HEAD(&download_constants, links);
 			fprintf(ofile, "#define\t%-8s\t0x%02x\n",
 				curnode->symbol->name,
diff -u --recursive --new-file v2.4.8/linux/drivers/scsi/aic7xxx/cam.h linux/drivers/scsi/aic7xxx/cam.h
--- v2.4.8/linux/drivers/scsi/aic7xxx/cam.h	Sun Mar  4 14:30:18 2001
+++ linux/drivers/scsi/aic7xxx/cam.h	Sun Aug 12 10:51:42 2001
@@ -29,7 +29,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $Id: //depot/src/linux/drivers/scsi/aic7xxx/cam.h#9 $
+ * $Id: //depot/src/linux/drivers/scsi/aic7xxx/cam.h#10 $
  */
 
 #ifndef _AIC7XXX_CAM_H
@@ -102,10 +102,6 @@
 	 * back into the XPT queue.
 	 */
 	CAM_REQUEUE_REQ		= DID_BUS_BUSY,
-	/*
-	 * The transaction has made it through our queue routine.
-	 */
-	CAM_SIM_QUEUED		= 0x200,
 
 	CAM_STATUS_MASK		= 0x3F
 } cam_status;
diff -u --recursive --new-file v2.4.8/linux/drivers/scsi/atp870u.c linux/drivers/scsi/atp870u.c
--- v2.4.8/linux/drivers/scsi/atp870u.c	Sun Aug 12 13:28:00 2001
+++ linux/drivers/scsi/atp870u.c	Sun Aug 12 10:51:41 2001
@@ -2730,7 +2730,7 @@
 		{
 		    printk(" %2x ",workrequ->cmnd[k]);
 		}
-		printk(" last_lenu= %x ",dev->id[j].last_lenu);
+		printk(" last_lenu= %lx ",dev->id[j].last_lenu);
 	   }
 	}
 	return (SCSI_ABORT_SNOOZE);
diff -u --recursive --new-file v2.4.8/linux/drivers/scsi/cpqfc.Readme linux/drivers/scsi/cpqfc.Readme
--- v2.4.8/linux/drivers/scsi/cpqfc.Readme	Sun Aug 12 13:28:00 2001
+++ linux/drivers/scsi/cpqfc.Readme	Sun Aug 12 10:51:41 2001
@@ -7,6 +7,19 @@
 SEST size 512 Exchanges (simultaneous I/Os) limited by module kmalloc() 
 	max of 128k bytes contiguous.
 
+Ver 2.0.5  Aug 06, 2001
+   * Reject non-existent luns in the driver rather than letting the 
+     hardware do it.  (some HW behaves differently than others in this area.)
+   * Changed Makefile to rely on "make dep" instead of explicit dependencies
+   * ifdef'ed out fibre channel analyzer triggering debug code
+   * fixed a jiffies wrapping issue
+
+Ver 2.0.4  Aug 01, 2001
+   * Incorporated fix for target device reset from Steeleye
+   * Fixed passthrough ioctl so it doesn't hang.
+   * Fixed hang in launch_FCworker_thread() that occurred on some machines.
+   * Avoid problem when number of volumes in a single cabinet > 8
+
 Ver 2.0.2  July 23, 2001
    Changed the semiphore changes so the driver would compile in 2.4.7. 
    This version is for 2.4.7 and beyond. 
diff -u --recursive --new-file v2.4.8/linux/drivers/scsi/cpqfcTSinit.c linux/drivers/scsi/cpqfcTSinit.c
--- v2.4.8/linux/drivers/scsi/cpqfcTSinit.c	Sun Aug 12 13:28:00 2001
+++ linux/drivers/scsi/cpqfcTSinit.c	Sun Aug 12 10:51:41 2001
@@ -41,7 +41,9 @@
 #include <linux/timer.h>
 #include <linux/ioport.h>  // request_region() prototype
 #include <linux/vmalloc.h> // ioremap()
+#if LINUX_VERSION_CODE >= LinuxVersionCode(2,4,7)
 #include <linux/completion.h>
+#endif
 #ifdef __alpha__
 #define __KERNEL_SYSCALLS__
 #endif
@@ -55,6 +57,7 @@
 #include "hosts.h"
 #include "cpqfcTSchip.h"
 #include "cpqfcTSstructs.h"
+#include "cpqfcTStrigger.h"
 
 #include "cpqfcTS.h"
 
@@ -88,7 +91,17 @@
 
 #endif
 
-
+#if LINUX_VERSION_CODE >= LinuxVersionCode(2,4,7)
+#  define CPQFC_DECLARE_COMPLETION(x) DECLARE_COMPLETION(x)
+#  define CPQFC_WAITING waiting
+#  define CPQFC_COMPLETE(x) complete(x)
+#  define CPQFC_WAIT_FOR_COMPLETION(x) wait_for_completion(x);
+#else
+#  define CPQFC_DECLARE_COMPLETION(x) DECLARE_MUTEX_LOCKED(x)
+#  define CPQFC_WAITING sem
+#  define CPQFC_COMPLETE(x) up(x)
+#  define CPQFC_WAIT_FOR_COMPLETION(x) down(x)
+#endif
 
 /* local function to load our per-HBA (local) data for chip
    registers, FC link state, all FC exchanges, etc.
@@ -227,6 +240,8 @@
              
   cpqfcHBAdata->notify_wt = &sem;
 
+  /* must unlock before kernel_thread(), for it may cause a reschedule. */
+  spin_unlock_irq(&io_request_lock);
   kernel_thread((int (*)(void *))cpqfcTSWorkerThread, 
                           (void *) HostAdapter, 0);
   /*
@@ -234,6 +249,7 @@
 
    */
   down (&sem);
+  spin_lock_irq(&io_request_lock);
   cpqfcHBAdata->notify_wt = NULL;
 
   LEAVE("launch_FC_worker_thread");
@@ -417,13 +433,14 @@
 	// 3.028     LILP received, link up, FLOGI starts
 	// slowest(worst) case, measured on 1Gb Finisar GT analyzer
 	
-	int wait_time;
-	unsigned long flags=0;
- 
-        spin_unlock_irqrestore(&io_request_lock, flags);
-        for( wait_time = jiffies + 4*HZ; wait_time > jiffies; )
-	  schedule();  // (our worker task needs to run)
-	spin_lock_irqsave(&io_request_lock, flags);
+	unsigned long stop_time;
+
+        spin_unlock_irq(&io_request_lock);
+	stop_time = jiffies + 4*HZ;
+        while ( time_before(jiffies, stop_time) ) 
+	  	schedule();  // (our worker task needs to run)
+
+	spin_lock_irq(&io_request_lock);
       }
       
       NumberOfAdapters++; 
@@ -435,7 +452,6 @@
   return NumberOfAdapters;
 }
 
-
 static void my_ioctl_done (Scsi_Cmnd * SCpnt)
 {
     struct request * req;
@@ -443,9 +459,8 @@
     req = &SCpnt->request;
     req->rq_status = RQ_SCSI_DONE; /* Busy, but indicate request done */
   
-    if (req->waiting != NULL) {
-	complete(req->waiting);
-    }
+    if (req->CPQFC_WAITING != NULL)
+	CPQFC_COMPLETE(req->CPQFC_WAITING);
 }   
 
 
@@ -463,7 +478,6 @@
   cpqfc_passthru_t *vendor_cmd;
   Scsi_Device *SDpnt;
   Scsi_Cmnd *ScsiPassThruCmnd;
-  unsigned long flags;
 
   ENTER("cpqfcTS_ioctl ");
   
@@ -560,30 +574,25 @@
         ScsiPassThruCmnd->SCp.phase = vendor_cmd->bus;
 	ScsiPassThruCmnd->SCp.have_data_in = vendor_cmd->pdrive;
 
-
-
         // We copy the scheme used by scsi.c to submit commands
 	// to our own HBA.  We do this in order to stall the
 	// thread calling the IOCTL until it completes, and use
 	// the same "_quecommand" function for synchronizing
 	// FC Link events with our "worker thread".
-	
-        spin_lock_irqsave(&io_request_lock, flags);
+
         {
-          DECLARE_COMPLETION(wait);
-          ScsiPassThruCmnd->request.waiting = &wait;
+          CPQFC_DECLARE_COMPLETION(wait);
+          ScsiPassThruCmnd->request.CPQFC_WAITING = &wait;
           // eventually gets us to our own _quecommand routine
           scsi_do_cmd( ScsiPassThruCmnd, &vendor_cmd->cdb[0], 
 	       buf, 
 	       vendor_cmd->len, 
 	       my_ioctl_done, 
 	       10*HZ, 1);// timeout,retries
-          spin_unlock_irqrestore(&io_request_lock, flags);
           // Other I/Os can now resume; we wait for our ioctl
 	  // command to complete
-	  wait_for_completion(&wait);
-          spin_lock_irqsave(&io_request_lock, flags);
-          ScsiPassThruCmnd->request.waiting = NULL;
+	  CPQFC_WAIT_FOR_COMPLETION(&wait);
+          ScsiPassThruCmnd->request.CPQFC_WAITING = NULL;
         }
 	
         result = ScsiPassThruCmnd->result;
@@ -603,7 +612,6 @@
         //  (*SDpnt->scsi_request_fn)();
 
         wake_up(&SDpnt->scpnt_wait);
-        spin_unlock_irqrestore(&io_request_lock, flags);
 
 	// need to pass data back to user (space)?
 	if( (vendor_cmd->rw_flag == VENDOR_READ_OPCODE) &&
@@ -613,7 +621,7 @@
 
         if( buf) 
 	  kfree( buf);
-	
+
         return result;
       }
       
@@ -1262,6 +1270,11 @@
 //    printk(" @Q bad targ cmnd %p@ ", Cmnd);
       QueBadTargetCmnd( cpqfcHBAdata, Cmnd);
     }
+    else if (Cmnd->lun >= CPQFCTS_MAX_LUN)
+    {
+      printk(KERN_WARNING "cpqfc: Invalid LUN: %d\n", Cmnd->lun);
+      QueBadTargetCmnd( cpqfcHBAdata, Cmnd);
+    } 
 
     else  // we know what FC device to send to...
     {
@@ -1486,7 +1499,6 @@
   int timeout = 10*HZ;
   int retries = 1;
   char scsi_cdb[12];
-  unsigned long flags;
   int result;
   Scsi_Cmnd * SCpnt;
   Scsi_Device * SDpnt;
@@ -1500,21 +1512,17 @@
 
   scsi_cdb[0] = RELEASE;
 
-  spin_lock_irqsave(&io_request_lock, flags);
-
   // allocate with wait = true, interruptible = false 
   SCpnt = scsi_allocate_device(ScsiDev, 1, 0);
   {
-    DECLARE_COMPLETION(wait);
+    CPQFC_DECLARE_COMPLETION(wait);
         
     SCpnt->SCp.buffers_residual = FCP_TARGET_RESET;
 
-	SCpnt->request.waiting = &wait;
+	SCpnt->request.CPQFC_WAITING = &wait;
 	scsi_do_cmd(SCpnt,  scsi_cdb, NULL,  0, my_ioctl_done,  timeout, retries);
-	spin_unlock_irqrestore(&io_request_lock, flags);
-	wait_for_completion(&wait);
-    spin_lock_irqsave(&io_request_lock, flags);
-    SCpnt->request.waiting = NULL;
+	CPQFC_WAIT_FOR_COMPLETION(&wait);
+	SCpnt->request.CPQFC_WAITING = NULL;
   }
     
 /*
@@ -1560,7 +1568,6 @@
   // 	(*SDpnt->scsi_request_fn)();
 
   wake_up(&SDpnt->scpnt_wait);
-  spin_unlock_irqrestore(&io_request_lock, flags);
   // printk("   LEAVING cpqfcTS_TargetDeviceReset() - return SUCCESS \n");
   return SUCCESS;
 }
@@ -1568,9 +1575,13 @@
 
 int cpqfcTS_eh_device_reset(Scsi_Cmnd *Cmnd)
 {
+  int retval;
   Scsi_Device *SDpnt = Cmnd->device;
   // printk("   ENTERING cpqfcTS_eh_device_reset() \n");
-  return cpqfcTS_TargetDeviceReset( SDpnt, 0);
+  spin_unlock_irq(&io_request_lock);
+  retval = cpqfcTS_TargetDeviceReset( SDpnt, 0);
+  spin_lock_irq(&io_request_lock);
+  return retval;
 }
 
 	
diff -u --recursive --new-file v2.4.8/linux/drivers/scsi/cpqfcTSstructs.h linux/drivers/scsi/cpqfcTSstructs.h
--- v2.4.8/linux/drivers/scsi/cpqfcTSstructs.h	Sun Aug 12 13:28:00 2001
+++ linux/drivers/scsi/cpqfcTSstructs.h	Sun Aug 12 10:51:41 2001
@@ -31,7 +31,7 @@
 #define CPQFCTS_DRIVER_VER(maj,min,submin) ((maj<<16)|(min<<8)|(submin))
 #define VER_MAJOR 2
 #define VER_MINOR 0
-#define VER_SUBMINOR 2
+#define VER_SUBMINOR 5
 
 // Macros for kernel (esp. SMP) tracing using a PCI analyzer
 // (e.g. x86).
@@ -77,7 +77,10 @@
 // PDA is Peripheral Device Address, VSA is Volume Set Addressing
 // Linux SCSI parameters
 #define CPQFCTS_MAX_TARGET_ID 64
-#define CPQFCTS_MAX_LUN 8    // The RA-4x00 supports 32 (Linux SCSI supports 8)
+
+// Note, changing CPQFCTS_MAX_LUN to less than 32 (e.g, 8) will result in
+// strange behavior if a box with more than, e.g. 8, is on the loop.
+#define CPQFCTS_MAX_LUN 32    // The RA-4x00 supports 32 (Linux SCSI supports 8)
 #define CPQFCTS_MAX_CHANNEL 0 // One FC port on cpqfcTS HBA
 
 #define CPQFCTS_CMD_PER_LUN 15 // power of 2 -1, must be >0 
@@ -972,12 +975,6 @@
   UCHAR wwn[8],    // search linked list for WWN, or...
   PFC_LOGGEDIN_PORT *pLastLoggedInPort
 );
-
-// don't do this unless you have the right hardware!
-#define TRIGGERABLE_HBA 1
-#ifdef TRIGGERABLE_HBA
-void TriggerHBA( void*, int);
-#endif
 
 void cpqfcTSPutLinkQue( 
   CPQFCHBA *cpqfcHBAdata, 
diff -u --recursive --new-file v2.4.8/linux/drivers/scsi/cpqfcTStrigger.c linux/drivers/scsi/cpqfcTStrigger.c
--- v2.4.8/linux/drivers/scsi/cpqfcTStrigger.c	Tue Sep 19 08:01:34 2000
+++ linux/drivers/scsi/cpqfcTStrigger.c	Sun Aug 12 10:51:41 2001
@@ -3,13 +3,15 @@
 // since it writes directly to the Tachyon board.  This function
 // developed for Compaq HBA Tachyon TS v1.2 (Rev X5 PCB)
 
+#include "cpqfcTStrigger.h"
+#if TRIGGERABLE_HBA
+
 #include <linux/kernel.h>
 #include <linux/ioport.h>
 #include <linux/types.h>
 #include <linux/pci.h>
 #include <asm/io.h>
 
-
 void TriggerHBA( void* IOBaseUpper, int Print)
 {
   __u32 long value;
@@ -28,3 +30,4 @@
     printk( " -GPIO0 set- ");
 }
 
+#endif
diff -u --recursive --new-file v2.4.8/linux/drivers/scsi/cpqfcTStrigger.h linux/drivers/scsi/cpqfcTStrigger.h
--- v2.4.8/linux/drivers/scsi/cpqfcTStrigger.h	Wed Dec 31 16:00:00 1969
+++ linux/drivers/scsi/cpqfcTStrigger.h	Sun Aug 12 10:51:41 2001
@@ -0,0 +1,8 @@
+// don't do this unless you have the right hardware!
+#define TRIGGERABLE_HBA 0
+#if TRIGGERABLE_HBA
+void TriggerHBA( void*, int);
+#else
+#define TriggerHBA(x, y)
+#endif
+
diff -u --recursive --new-file v2.4.8/linux/drivers/scsi/cpqfcTSworker.c linux/drivers/scsi/cpqfcTSworker.c
--- v2.4.8/linux/drivers/scsi/cpqfcTSworker.c	Sun Aug 12 13:28:00 2001
+++ linux/drivers/scsi/cpqfcTSworker.c	Sun Aug 12 10:51:41 2001
@@ -47,6 +47,7 @@
 #include "hosts.h"   // struct Scsi_Host definition for T handler
 #include "cpqfcTSchip.h"
 #include "cpqfcTSstructs.h"
+#include "cpqfcTStrigger.h"
 
 //#define LOGIN_DBG 1
 
@@ -3337,9 +3338,9 @@
 
   else
   {
-    for( i=0; i<8; i++)  // valid WWN passed?  NULL WWN invalid
+    if( wwn ) // non-null arg? (OK to pass NULL when not searching WWN)
     {
-      if( wwn ) // non-null arg? (OK to pass NULL when not searching WWN)
+      for( i=0; i<8; i++)  // valid WWN passed?  NULL WWN invalid
       {
         if( wwn[i] != 0 )
           wwn_valid = TRUE;  // any non-zero byte makes (presumably) valid
@@ -3392,6 +3393,10 @@
 	  {
             // we KNOW all the valid LUNs... 0xFF is invalid!
             Cmnd->SCp.have_data_in = pLoggedInPort->ScsiNexus.lun[Cmnd->lun];
+	    if (pLoggedInPort->ScsiNexus.lun[Cmnd->lun] == 0xFF)
+		return NULL;
+	    // printk("xlating lun %d to 0x%02x\n", Cmnd->lun, 
+            //	pLoggedInPort->ScsiNexus.lun[Cmnd->lun]);
 	  }
 	  else
 	    Cmnd->SCp.have_data_in = Cmnd->lun; // Linux & target luns match
diff -u --recursive --new-file v2.4.8/linux/drivers/scsi/i91uscsi.c linux/drivers/scsi/i91uscsi.c
--- v2.4.8/linux/drivers/scsi/i91uscsi.c	Fri Mar  2 18:38:38 2001
+++ linux/drivers/scsi/i91uscsi.c	Sun Aug 12 10:51:41 2001
@@ -590,7 +590,7 @@
 int init_tulip(HCS * pCurHcb, SCB * scbp, int tul_num_scb, BYTE * pbBiosAdr, int seconds)
 {
 	int i;
-	WORD *pwFlags;
+	BYTE *pwFlags;
 	BYTE *pbHeads;
 	SCB *pTmpScb, *pPrevScb = NULL;
 
@@ -674,7 +674,7 @@
 	       ((pCurHcb->HCS_Config & HCC_AUTO_TERM) >> 4) | (TUL_RD(pCurHcb->HCS_Base, TUL_GCTRL1) & 0xFE));
 
 	for (i = 0,
-	     pwFlags = (WORD *) & (i91unvramp->NVM_SCSIInfo[0].NVM_Targ0Config),
+	     pwFlags = & (i91unvramp->NVM_SCSIInfo[0].NVM_Targ0Config),
 	     pbHeads = pbBiosAdr + 0x180;
 	     i < pCurHcb->HCS_MaxTar;
 	     i++, pwFlags++) {
diff -u --recursive --new-file v2.4.8/linux/drivers/scsi/imm.c linux/drivers/scsi/imm.c
--- v2.4.8/linux/drivers/scsi/imm.c	Fri Mar  2 18:38:38 2001
+++ linux/drivers/scsi/imm.c	Sun Aug 12 12:31:28 2001
@@ -162,6 +162,7 @@
 		    printk(KERN_ERR "imm%d: failed to claim parport because a "
 		      "pardevice is owning the port for too longtime!\n",
 			   i);
+		    parport_unregister_device (imm_hosts[i].dev);
 		    spin_lock_irq(&io_request_lock);
 		    return 0;
 		}
diff -u --recursive --new-file v2.4.8/linux/drivers/scsi/in2000.c linux/drivers/scsi/in2000.c
--- v2.4.8/linux/drivers/scsi/in2000.c	Fri Mar  2 18:38:38 2001
+++ linux/drivers/scsi/in2000.c	Sun Aug 12 10:51:41 2001
@@ -1909,10 +1909,10 @@
  * special macros declared in 'asm/io.h'. We use readb() and readl()
  * when reading from the card's BIOS area in in2000_detect().
  */
-static const unsigned int *bios_tab[] in2000__INITDATA = {
-   (unsigned int *)0xc8000,
-   (unsigned int *)0xd0000,
-   (unsigned int *)0xd8000,
+static u32 bios_tab[] in2000__INITDATA = {
+   0xc8000,
+   0xd0000,
+   0xd8000,
    0
    };
 
@@ -1973,13 +1973,13 @@
  * for the obvious ID strings. We look for the 2 most common ones and
  * hope that they cover all the cases...
  */
-      else if (readl(bios_tab[bios]+0x04) == 0x41564f4e ||
-               readl(bios_tab[bios]+0x0c) == 0x61776c41) {
+      else if (isa_readl(bios_tab[bios]+0x10) == 0x41564f4e ||
+               isa_readl(bios_tab[bios]+0x30) == 0x61776c41) {
          printk("Found IN2000 BIOS at 0x%x ",(unsigned int)bios_tab[bios]);
 
 /* Read the switch image that's mapped into EPROM space */
 
-         switches = ~((readb(bios_tab[bios]+0x08) & 0xff));
+         switches = ~((isa_readb(bios_tab[bios]+0x20) & 0xff));
 
 /* Find out where the IO space is */
 
@@ -2073,7 +2073,7 @@
 
 /* Older BIOS's had a 'sync on/off' switch - use its setting */
 
-      if (readl(bios_tab[bios]+0x04) == 0x41564f4e && (switches & SW_SYNC_DOS5))
+      if (isa_readl(bios_tab[bios]+0x10) == 0x41564f4e && (switches & SW_SYNC_DOS5))
          hostdata->sync_off = 0x00;    /* sync defaults to on */
       else
          hostdata->sync_off = 0xff;    /* sync defaults to off */
diff -u --recursive --new-file v2.4.8/linux/drivers/scsi/megaraid.c linux/drivers/scsi/megaraid.c
--- v2.4.8/linux/drivers/scsi/megaraid.c	Sun Aug 12 13:28:00 2001
+++ linux/drivers/scsi/megaraid.c	Sun Aug 12 10:51:41 2001
@@ -427,6 +427,12 @@
  * our current formula working to calculate logical drive number, return
  * failure for LUN > 7
  *
+ * Version 1.17a-ac
+ * Mon Aug 6 14:59:29 BST 2001 - "Michael Johnson" <johnsom@home.com>
+ *
+ * Make the HP print formatting and check for buggy firmware runtime not
+ * ifdef dependant.
+ *
  * BUGS:
  *     Some older 2.1 kernels (eg. 2.1.90) have a bug in pci.c that
  *     fails to detect the controller as a pci device on the system.
@@ -465,7 +471,7 @@
 
 #include <linux/sched.h>
 #include <linux/stat.h>
-#include <linux/malloc.h>	/* for kmalloc() */
+#include <linux/slab.h>	/* for kmalloc() */
 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,0)	/* 0x20100 */
 #include <linux/bios32.h>
 #else
@@ -2662,7 +2668,8 @@
 	}
 #endif
 
-#ifdef MEGA_HP_FIX		/* use HP firmware and bios version encoding */
+ /* use HP firmware and bios version encoding */
+if (megaCfg->productInfo.subSystemVendorID == HP_SUBSYS_ID) {
 	sprintf (megaCfg->fwVer, "%c%d%d.%d%d",
 		 megaCfg->productInfo.FwVer[2],
 		 megaCfg->productInfo.FwVer[1] >> 8,
@@ -2675,13 +2682,13 @@
 		 megaCfg->productInfo.BiosVer[1] & 0x0f,
 		 megaCfg->productInfo.BiosVer[2] >> 8,
 		 megaCfg->productInfo.BiosVer[2] & 0x0f);
-#else
+} else {
 	memcpy (megaCfg->fwVer, (char *) megaCfg->productInfo.FwVer, 4);
 	megaCfg->fwVer[4] = 0;
 
 	memcpy (megaCfg->biosVer, (char *) megaCfg->productInfo.BiosVer, 4);
 	megaCfg->biosVer[4] = 0;
-#endif
+}
 	megaCfg->support_ext_cdb = mega_support_ext_cdb(megaCfg);
 
 	printk (KERN_NOTICE "megaraid: [%s:%s] detected %d logical drives" M_RD_CRLFSTR,
@@ -2957,7 +2964,6 @@
 			}
 		}
 
-#ifdef MEGA_HP_FIX
 		/*
 		 * If we have a HP 1M(0x60E7)/2M(0x60E8) controller with
 		 * firmware H.01.07 or H.01.08, disable 64 bit support,
@@ -2980,7 +2986,6 @@
 				megaCfg->flag &= ~BOARD_64BIT;
 			}
 		}
-#endif
 
 		if (mega_is_bios_enabled (megaCfg)) {
 			mega_hbas[numCtlrs].is_bios_enabled = 1;
diff -u --recursive --new-file v2.4.8/linux/drivers/scsi/ppa.c linux/drivers/scsi/ppa.c
--- v2.4.8/linux/drivers/scsi/ppa.c	Fri Mar  2 18:38:39 2001
+++ linux/drivers/scsi/ppa.c	Sun Aug 12 12:31:28 2001
@@ -153,6 +153,7 @@
 		    printk(KERN_ERR "ppa%d: failed to claim parport because a "
 		      "pardevice is owning the port for too longtime!\n",
 			   i);
+		    parport_unregister_device(ppa_hosts[i].dev);
 		    spin_lock_irq(&io_request_lock);
 		    return 0;
 		}
diff -u --recursive --new-file v2.4.8/linux/drivers/scsi/qlogicfc.c linux/drivers/scsi/qlogicfc.c
--- v2.4.8/linux/drivers/scsi/qlogicfc.c	Sun Aug 12 13:28:00 2001
+++ linux/drivers/scsi/qlogicfc.c	Sun Aug 12 10:51:41 2001
@@ -98,7 +98,7 @@
    isp2200's firmware. 
 */
 
-#define RELOAD_FIRMWARE		1
+#define RELOAD_FIRMWARE		0
 
 #define USE_NVRAM_DEFAULTS      1
 
@@ -440,7 +440,7 @@
 #define MBOX_SEND_CHANGE_REQUEST        0x0070
 #define MBOX_PORT_LOGOUT                0x0071
 
-#include "qlogicfc_asm.c"
+//#include "qlogicfc_asm.c"
 
 /* Each element in mbox_param is an 8 bit bitmap where each bit indicates
    if that mbox should be copied as input.  For example 0x2 would mean
@@ -1847,13 +1847,13 @@
 	return 0;
 }
 
-
 static int isp2x00_reset_hardware(struct Scsi_Host *host)
 {
 	u_short param[8];
 	struct isp2x00_hostdata *hostdata;
 	int loop_count;
 	dma64_addr_t busaddr;
+	unsigned short risc_code_addr01 = 0x1000 ;
 
 	ENTER("isp2x00_reset_hardware");
 
diff -u --recursive --new-file v2.4.8/linux/drivers/scsi/qlogicfc_asm.c linux/drivers/scsi/qlogicfc_asm.c
--- v2.4.8/linux/drivers/scsi/qlogicfc_asm.c	Wed Jan 26 13:29:39 2000
+++ linux/drivers/scsi/qlogicfc_asm.c	Wed Dec 31 16:00:00 1969
@@ -1,7804 +0,0 @@
-/************************************************************************
- *									*
- * 	 --- ISP2100 Fabric Initiator/Target Firmware ---               *
- *                   with expanded LUN addressing.                      *
- *									*
- ************************************************************************
- * Copyright (C) 1999 Qlogic, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted provided
- * that the following conditions are met:
- * 1. Redistribution of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistribution in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *									*
- ************************************************************************
- */
-/*
- *     W     W     A     RRRR    N   N   IIIII   N   N    GGG
- *     W     W    A A    R   R   N   N     I     N   N   G   G
- *     W     W   A   A   R  R    NN  N     I     NN  N   G  
- *     W  W  W   AAAAA   RRR     N N N     I     N N N   G  GG
- *     W  W  W   A   A   R R     N  NN     I     N  NN   G   G
- *     W W W W   A   A   R  R    N   N     I     N   N   G   G
- *      W   W    A   A   R   R   N   N   IIIII   N   N    GGGG
- *
- *         This version of firmware is a release candidate,
- *     design verification testing (DVT) has not been completed.
- */
-/*
- *	Firmware Version 1.17.30 (14:05 Sep 30, 1999)
- */
-
-unsigned short risc_code_addr01 = 0x1000 ;
-unsigned short risc_code_length2100 = 0x77a0;
-unsigned short risc_code_length2200 = 0x7a68;
-
-unsigned short risc_code2100[] = {
-	0x0078, 0x1029, 0x0000, 0x77a0, 0x0000, 0x2043, 0x4f50, 0x5952,
-	0x4947, 0x4854, 0x2031, 0x3939, 0x3920, 0x514c, 0x4f47, 0x4943,
-	0x2043, 0x4f52, 0x504f, 0x5241, 0x5449, 0x4f4e, 0x2049, 0x5350,
-	0x3231, 0x3030, 0x2046, 0x6972, 0x6d77, 0x6172, 0x6520, 0x2056,
-	0x6572, 0x7369, 0x6f6e, 0x2030, 0x312e, 0x3137, 0x2020, 0x2020,
-	0x2400, 0x2091, 0x2000, 0x20c1, 0x0021, 0x2039, 0xffff, 0x2019,
-	0xaaaa, 0x2760, 0x2069, 0x7fff, 0x20c1, 0x0020, 0x2c2c, 0x2d34,
-	0x2762, 0x236a, 0x2c24, 0x2d04, 0x266a, 0x2562, 0xa406, 0x00c0,
-	0x104e, 0x20c1, 0x0021, 0x2c2c, 0x2362, 0x2c04, 0x2562, 0xa306,
-	0x0040, 0x104e, 0x20c1, 0x0020, 0x2039, 0x8fff, 0x20a1, 0x8f00,
-	0x2708, 0x810d, 0x810d, 0x810d, 0x810d, 0xa18c, 0x000f, 0x2001,
-	0x0008, 0xa112, 0xa00e, 0x21a8, 0x41a4, 0x3400, 0x8211, 0x00c0,
-	0x105b, 0x2708, 0x3400, 0xa102, 0x0040, 0x106b, 0x0048, 0x106b,
-	0x20a8, 0xa00e, 0x41a4, 0x20a1, 0x87a0, 0x2009, 0x0000, 0x20a9,
-	0x0760, 0x41a4, 0x3400, 0x20c9, 0x8cff, 0x2059, 0x0000, 0x2b78,
-	0x7823, 0x0004, 0x2089, 0x226f, 0x2051, 0x8800, 0x2a70, 0x775e,
-	0xa786, 0x8fff, 0x0040, 0x108e, 0x705b, 0xa700, 0x7057, 0xa6f5,
-	0x7063, 0x0200, 0x7067, 0x0200, 0x0078, 0x1096, 0x7057, 0x9b01,
-	0x7063, 0x0100, 0x7067, 0x0100, 0x705b, 0x9b00, 0x1078, 0x128f,
-	0x1078, 0x136a, 0x1078, 0x1513, 0x1078, 0x1b00, 0x1078, 0x3d25,
-	0x1078, 0x68a0, 0x1078, 0x12f5, 0x1078, 0x26b2, 0x1078, 0x4778,
-	0x1078, 0x42aa, 0x1078, 0x5004, 0x1078, 0x1fc3, 0x1078, 0x5260,
-	0x1078, 0x4cb7, 0x1078, 0x1ee5, 0x1078, 0x1fa0, 0x2091, 0x3009,
-	0x7823, 0x0000, 0x0090, 0x10cb, 0x7820, 0xa086, 0x0002, 0x00c0,
-	0x10cb, 0x7823, 0x4000, 0x0068, 0x10c3, 0x781b, 0x0001, 0x2091,
-	0x5000, 0x2091, 0x4080, 0x2a70, 0x7003, 0x0000, 0x2001, 0x017f,
-	0x2003, 0x0000, 0x2a70, 0x7000, 0xa08e, 0x0003, 0x00c0, 0x10eb,
-	0x1078, 0x31bd, 0x1078, 0x26da, 0x1078, 0x47c8, 0x1078, 0x4469,
-	0x2009, 0x0100, 0x2104, 0xa082, 0x0002, 0x0048, 0x10ef, 0x1078,
-	0x5020, 0x0078, 0x10d2, 0x1079, 0x10f3, 0x0078, 0x10d8, 0x1078,
-	0x6565, 0x0078, 0x10e7, 0x10fd, 0x10fe, 0x1189, 0x10fb, 0x1208,
-	0x128c, 0x128d, 0x128e, 0x1078, 0x12d2, 0x007c, 0x127e, 0x0f7e,
-	0x2091, 0x8000, 0x1078, 0x3541, 0x2079, 0x0100, 0x7844, 0xa005,
-	0x00c0, 0x117a, 0x2011, 0x3c35, 0x1078, 0x50f2, 0x780f, 0x00ff,
-	0x7840, 0xa084, 0xfffb, 0x7842, 0x2011, 0x8010, 0x73bc, 0x1078,
-	0x317a, 0x7238, 0xc284, 0x723a, 0x2001, 0x880c, 0x2014, 0xc2ac,
-	0x2202, 0x1078, 0x6376, 0x2011, 0x0004, 0x1078, 0x7802, 0x1078,
-	0x4236, 0x1078, 0x3d0d, 0x0040, 0x1135, 0x7083, 0x0001, 0x70b7,
-	0x0000, 0x1078, 0x36ef, 0x0078, 0x117a, 0x70cb, 0x0000, 0x70c7,
-	0x0000, 0x706b, 0x0000, 0x706f, 0x0000, 0x1078, 0x117d, 0x72c0,
-	0x2079, 0x8851, 0x7804, 0xd0ac, 0x0040, 0x1147, 0xc295, 0x72c2,
-	0xa296, 0x0004, 0x0040, 0x1168, 0x2011, 0x0001, 0x1078, 0x7802,
-	0x708f, 0x0000, 0x7093, 0xffff, 0x7003, 0x0002, 0x0f7f, 0x1078,
-	0x231f, 0x2011, 0x0005, 0x1078, 0x64ae, 0x1078, 0x5888, 0x0c7e,
-	0x2061, 0x0100, 0x60e3, 0x0008, 0x0c7f, 0x127f, 0x0078, 0x117c,
-	0x708f, 0x0000, 0x7093, 0xffff, 0x7003, 0x0002, 0x2011, 0x0005,
-	0x1078, 0x64ae, 0x1078, 0x5888, 0x0c7e, 0x2061, 0x0100, 0x60e3,
-	0x0008, 0x0c7f, 0x0f7f, 0x127f, 0x007c, 0x0c7e, 0x20a9, 0x0082,
-	0x2009, 0x007e, 0x1078, 0x3f76, 0x8108, 0x00f0, 0x1182, 0x0c7f,
-	0x007c, 0x127e, 0x2091, 0x8000, 0x7090, 0xa086, 0xffff, 0x0040,
-	0x1197, 0x1078, 0x231f, 0x1078, 0x5888, 0x0078, 0x1206, 0x70c0,
-	0xd09c, 0x0040, 0x11c3, 0xd084, 0x0040, 0x11c3, 0x0f7e, 0x2079,
-	0x0100, 0x790c, 0xc1b5, 0x790e, 0x0f7f, 0xd08c, 0x0040, 0x11c3,
-	0x70c4, 0xa086, 0xffff, 0x0040, 0x11bf, 0x1078, 0x2449, 0x1078,
-	0x5888, 0x70c0, 0xd094, 0x00c0, 0x1206, 0x2011, 0x0001, 0x2019,
-	0x0000, 0x1078, 0x2481, 0x1078, 0x5888, 0x0078, 0x1206, 0x70c8,
-	0xa005, 0x00c0, 0x1206, 0x708c, 0xa005, 0x00c0, 0x1206, 0x2001,
-	0x8852, 0x2004, 0xd0ac, 0x0040, 0x11e9, 0x157e, 0x0c7e, 0x20a9,
-	0x007f, 0x2009, 0x0000, 0x017e, 0x1078, 0x3f8e, 0x00c0, 0x11dc,
-	0x6000, 0xd0ec, 0x00c0, 0x11e4, 0x017f, 0x8108, 0x00f0, 0x11d3,
-	0x0c7f, 0x157f, 0x0078, 0x11e9, 0x017f, 0x0c7f, 0x157f, 0x0078,
-	0x1206, 0x7003, 0x0003, 0x7093, 0xffff, 0x2001, 0x0000, 0x1078,
-	0x21f3, 0x1078, 0x31f8, 0x2001, 0x8aa3, 0x2004, 0xa086, 0x0005,
-	0x00c0, 0x11fe, 0x2011, 0x0000, 0x1078, 0x64ae, 0x2011, 0x0000,
-	0x1078, 0x64b8, 0x1078, 0x5888, 0x1078, 0x5948, 0x127f, 0x007c,
-	0x017e, 0x0f7e, 0x127e, 0x2091, 0x8000, 0x2079, 0x0100, 0x2009,
-	0x00f7, 0x1078, 0x3cdc, 0x7940, 0xa18c, 0x0010, 0x7942, 0x7924,
-	0xd1b4, 0x0040, 0x121d, 0x7827, 0x0040, 0xd19c, 0x0040, 0x1222,
-	0x7827, 0x0008, 0x007e, 0x037e, 0x157e, 0x7900, 0xa18a, 0x0003,
-	0x0050, 0x1248, 0x7954, 0xd1ac, 0x00c0, 0x1248, 0x2009, 0x00f8,
-	0x1078, 0x3cdc, 0x7843, 0x0090, 0x7843, 0x0010, 0x20a9, 0x09c4,
-	0x7820, 0xd09c, 0x00c0, 0x1240, 0x7824, 0xd0ac, 0x00c0, 0x127c,
-	0x00f0, 0x1238, 0x2001, 0x0001, 0x1078, 0x21f3, 0x0078, 0x1285,
-	0x7853, 0x0000, 0x782f, 0x0020, 0x20a9, 0x0050, 0x00e0, 0x124e,
-	0x2091, 0x6000, 0x00f0, 0x124e, 0x7853, 0x0400, 0x782f, 0x0000,
-	0x2009, 0x00f8, 0x1078, 0x3cdc, 0x20a9, 0x000e, 0x0005, 0x00f0,
-	0x125e, 0x7853, 0x1400, 0x7843, 0x0090, 0x7843, 0x0010, 0x2019,
-	0x61a8, 0x7854, 0x0005, 0x0005, 0xd08c, 0x0040, 0x1273, 0x7824,
-	0xd0ac, 0x00c0, 0x127c, 0x8319, 0x00c0, 0x1269, 0x2001, 0x0001,
-	0x1078, 0x21f3, 0x0078, 0x1283, 0x7828, 0xc09d, 0x782a, 0x7827,
-	0x0008, 0x7827, 0x0040, 0x7853, 0x0400, 0x157f, 0x037f, 0x007f,
-	0x127f, 0x0f7f, 0x017f, 0x007c, 0x007c, 0x007c, 0x007c, 0x2a70,
-	0x2009, 0x0100, 0x2104, 0xa082, 0x0002, 0x0048, 0x129b, 0x704f,
-	0xffff, 0x0078, 0x129d, 0x704f, 0x0000, 0x7053, 0xffff, 0x706b,
-	0x0000, 0x706f, 0x0000, 0x2061, 0x8a8c, 0x6003, 0x0909, 0x6007,
-	0x0000, 0x600b, 0x8800, 0x600f, 0x0200, 0x6013, 0x00ff, 0x6017,
-	0x0003, 0x601b, 0x0000, 0x601f, 0x07d0, 0x2061, 0x8a94, 0x6003,
-	0x8000, 0x6007, 0x0000, 0x600b, 0x0000, 0x600f, 0x0200, 0x6013,
-	0x00ff, 0x6017, 0x0000, 0x601b, 0x0001, 0x601f, 0x0000, 0x2061,
-	0x8a9c, 0x6003, 0x514c, 0x6007, 0x4f47, 0x600b, 0x4943, 0x600f,
-	0x2020, 0x007c, 0x2091, 0x8000, 0x0068, 0x12d4, 0x007e, 0x017e,
-	0x2079, 0x0000, 0x7818, 0xd084, 0x00c0, 0x12da, 0x017f, 0x792e,
-	0x007f, 0x782a, 0x007f, 0x7826, 0x3900, 0x783a, 0x7823, 0x8002,
-	0x781b, 0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x2079, 0x8800,
-	0x7803, 0x0005, 0x0078, 0x12f2, 0x007c, 0x2071, 0x8800, 0x7158,
-	0x712e, 0x2021, 0x0001, 0xa190, 0x002d, 0xa298, 0x002d, 0x0048,
-	0x130b, 0x705c, 0xa302, 0x00c8, 0x130b, 0x220a, 0x2208, 0x2310,
-	0x8420, 0x0078, 0x12fd, 0x200b, 0x0000, 0x74a2, 0x74a6, 0x007c,
-	0x0e7e, 0x127e, 0x2091, 0x8000, 0x2071, 0x8800, 0x70a4, 0xa0ea,
-	0x0010, 0x00c8, 0x131e, 0xa06e, 0x0078, 0x1328, 0x8001, 0x70a6,
-	0x702c, 0x2068, 0x2d04, 0x702e, 0x206b, 0x0000, 0x6807, 0x0000,
-	0x127f, 0x0e7f, 0x007c, 0x0e7e, 0x2071, 0x8800, 0x127e, 0x2091,
-	0x8000, 0x70a4, 0x8001, 0x00c8, 0x1338, 0xa06e, 0x0078, 0x1341,
-	0x70a6, 0x702c, 0x2068, 0x2d04, 0x702e, 0x206b, 0x0000, 0x6807,
-	0x0000, 0x127f, 0x0e7f, 0x007c, 0x0e7e, 0x127e, 0x2091, 0x8000,
-	0x2071, 0x8800, 0x702c, 0x206a, 0x2d00, 0x702e, 0x70a4, 0x8000,
-	0x70a6, 0x127f, 0x0e7f, 0x007c, 0x8dff, 0x0040, 0x1360, 0x6804,
-	0x6807, 0x0000, 0x007e, 0x1078, 0x1344, 0x0d7f, 0x0078, 0x1354,
-	0x007c, 0x0e7e, 0x2071, 0x8800, 0x70a4, 0xa08a, 0x0010, 0xa00d,
-	0x0e7f, 0x007c, 0x0e7e, 0x2071, 0x8ac7, 0x7007, 0x0000, 0x701b,
-	0x0000, 0x701f, 0x0000, 0x2071, 0x0000, 0x7010, 0xa085, 0x8004,
-	0x7012, 0x0e7f, 0x007c, 0x0e7e, 0x2270, 0x700b, 0x0000, 0x2071,
-	0x8ac7, 0x7018, 0xa088, 0x8ad0, 0x220a, 0x8000, 0xa084, 0x0007,
-	0x701a, 0x7004, 0xa005, 0x00c0, 0x1393, 0x0f7e, 0x2079, 0x0010,
-	0x1078, 0x13a4, 0x0f7f, 0x0e7f, 0x007c, 0x0e7e, 0x2071, 0x8ac7,
-	0x7004, 0xa005, 0x00c0, 0x13a2, 0x0f7e, 0x2079, 0x0010, 0x1078,
-	0x13a4, 0x0f7f, 0x0e7f, 0x007c, 0x7000, 0x0079, 0x13a7, 0x13ab,
-	0x1415, 0x1432, 0x1432, 0x7018, 0x711c, 0xa106, 0x00c0, 0x13b3,
-	0x7007, 0x0000, 0x007c, 0x0d7e, 0xa180, 0x8ad0, 0x2004, 0x700a,
-	0x2068, 0x8108, 0xa18c, 0x0007, 0x711e, 0x7803, 0x0026, 0x6824,
-	0x7832, 0x6828, 0x7836, 0x682c, 0x783a, 0x6830, 0x783e, 0x6810,
-	0x700e, 0x680c, 0x7016, 0x6804, 0x0d7f, 0xd084, 0x0040, 0x13d5,
-	0x7007, 0x0001, 0x1078, 0x13da, 0x007c, 0x7007, 0x0002, 0x1078,
-	0x13f0, 0x007c, 0x017e, 0x027e, 0x710c, 0x2011, 0x0040, 0xa182,
-	0x0040, 0x00c8, 0x13e5, 0x2110, 0xa006, 0x700e, 0x7212, 0x8203,
-	0x7822, 0x7803, 0x0020, 0x7803, 0x0041, 0x027f, 0x017f, 0x007c,
-	0x017e, 0x027e, 0x137e, 0x147e, 0x157e, 0x7014, 0x2098, 0x20a1,
-	0x0014, 0x7803, 0x0026, 0x710c, 0x2011, 0x0040, 0xa182, 0x0040,
-	0x00c8, 0x1404, 0x2110, 0xa006, 0x700e, 0x22a8, 0x53a6, 0x8203,
-	0x7822, 0x7803, 0x0020, 0x3300, 0x7016, 0x7803, 0x0001, 0x157f,
-	0x147f, 0x137f, 0x027f, 0x017f, 0x007c, 0x137e, 0x147e, 0x157e,
-	0x2099, 0x88f9, 0x20a1, 0x0018, 0x20a9, 0x0008, 0x53a3, 0x7803,
-	0x0020, 0x127e, 0x2091, 0x8000, 0x7803, 0x0041, 0x7007, 0x0003,
-	0x7000, 0xc084, 0x7002, 0x700b, 0x88f4, 0x127f, 0x157f, 0x147f,
-	0x137f, 0x007c, 0x137e, 0x147e, 0x157e, 0x2001, 0x8928, 0x209c,
-	0x20a1, 0x0014, 0x7803, 0x0026, 0x2001, 0x8929, 0x20ac, 0x53a6,
-	0x2099, 0x892a, 0x20a1, 0x0018, 0x20a9, 0x0008, 0x53a3, 0x7803,
-	0x0020, 0x127e, 0x2091, 0x8000, 0x7803, 0x0001, 0x7007, 0x0004,
-	0x7000, 0xc08c, 0x7002, 0x700b, 0x8925, 0x127f, 0x157f, 0x147f,
-	0x137f, 0x007c, 0x017e, 0x0e7e, 0x2071, 0x8ac7, 0x0f7e, 0x2079,
-	0x0010, 0x7904, 0x7803, 0x0002, 0xd1fc, 0x0040, 0x146c, 0xa18c,
-	0x0700, 0x7004, 0x1079, 0x1470, 0x0f7f, 0x0e7f, 0x017f, 0x007c,
-	0x13a4, 0x1478, 0x14a5, 0x14cd, 0x1500, 0x1476, 0x0078, 0x1476,
-	0xa18c, 0x0700, 0x00c0, 0x149e, 0x137e, 0x147e, 0x157e, 0x7014,
-	0x20a0, 0x2099, 0x0014, 0x7803, 0x0040, 0x7010, 0x20a8, 0x53a5,
-	0x3400, 0x7016, 0x157f, 0x147f, 0x137f, 0x700c, 0xa005, 0x0040,
-	0x14ba, 0x1078, 0x13da, 0x007c, 0x7008, 0xa080, 0x0002, 0x2003,
-	0x0100, 0x7007, 0x0000, 0x1078, 0x13a4, 0x007c, 0x7008, 0xa080,
-	0x0002, 0x2003, 0x0200, 0x0078, 0x1499, 0xa18c, 0x0700, 0x00c0,
-	0x14b0, 0x700c, 0xa005, 0x0040, 0x14ba, 0x1078, 0x13f0, 0x007c,
-	0x7008, 0xa080, 0x0002, 0x2003, 0x0200, 0x7007, 0x0000, 0x1078,
-	0x13a4, 0x007c, 0x0d7e, 0x7008, 0x2068, 0x7830, 0x6826, 0x7834,
-	0x682a, 0x7838, 0x682e, 0x783c, 0x6832, 0x680b, 0x0100, 0x0d7f,
-	0x7007, 0x0000, 0x1078, 0x13a4, 0x007c, 0xa18c, 0x0700, 0x00c0,
-	0x14fa, 0x137e, 0x147e, 0x157e, 0x2001, 0x88f7, 0x2004, 0xa080,
-	0x000d, 0x20a0, 0x2099, 0x0014, 0x7803, 0x0040, 0x20a9, 0x0020,
-	0x53a5, 0x2001, 0x88f9, 0x2004, 0xd0bc, 0x0040, 0x14f0, 0x2001,
-	0x8902, 0x2004, 0xa080, 0x000d, 0x20a0, 0x20a9, 0x0020, 0x53a5,
-	0x157f, 0x147f, 0x137f, 0x7007, 0x0000, 0x1078, 0x4871, 0x1078,
-	0x13a4, 0x007c, 0x2011, 0x8003, 0x1078, 0x317a, 0x0078, 0x14fe,
-	0xa18c, 0x0700, 0x00c0, 0x150d, 0x2001, 0x8927, 0x2003, 0x0100,
-	0x7007, 0x0000, 0x1078, 0x13a4, 0x007c, 0x2011, 0x8004, 0x1078,
-	0x317a, 0x0078, 0x1511, 0x127e, 0x2091, 0x2100, 0x2079, 0x0030,
-	0x2071, 0x8ad8, 0x7803, 0x0004, 0x7003, 0x0000, 0x700f, 0x8ade,
-	0x7013, 0x8ade, 0x780f, 0x0076, 0x127f, 0x007c, 0x6934, 0xa184,
-	0x0007, 0x0079, 0x152b, 0x1533, 0x1579, 0x1533, 0x1533, 0x1533,
-	0x155e, 0x1542, 0x1537, 0xa085, 0x0001, 0x0078, 0x1593, 0x684c,
-	0xd0bc, 0x0040, 0x1533, 0x6860, 0x682e, 0x685c, 0x682a, 0x6858,
-	0x0078, 0x1581, 0xa18c, 0x00ff, 0xa186, 0x001e, 0x00c0, 0x1533,
-	0x684c, 0xd0bc, 0x0040, 0x1533, 0x6860, 0x682e, 0x685c, 0x682a,
-	0x6804, 0x681a, 0xa080, 0x000d, 0x2004, 0xa084, 0x000f, 0xa080,
-	0x1def, 0x2004, 0x6832, 0x6858, 0x0078, 0x1589, 0xa18c, 0x00ff,
-	0xa186, 0x0015, 0x00c0, 0x1533, 0x684c, 0xd0ac, 0x0040, 0x1533,
-	0x6804, 0x681a, 0xa080, 0x000d, 0x2004, 0xa084, 0x000f, 0xa080,
-	0x1def, 0x2004, 0x6832, 0xa006, 0x682e, 0x682a, 0x6858, 0x0078,
-	0x1589, 0x684c, 0xd0ac, 0x0040, 0x1533, 0xa006, 0x682e, 0x682a,
-	0x6858, 0xa18c, 0x000f, 0xa188, 0x1def, 0x210c, 0x6932, 0x2d08,
-	0x691a, 0x6826, 0x684c, 0xc0dd, 0x684e, 0xa006, 0x680a, 0x697c,
-	0x6912, 0x6980, 0x6916, 0x007c, 0x20e1, 0x0007, 0x20e1, 0x2000,
-	0x2001, 0x020a, 0x2004, 0x82ff, 0x0040, 0x15ae, 0xa280, 0x0004,
-	0x0d7e, 0x206c, 0x684c, 0xd0dc, 0x00c0, 0x15aa, 0x1078, 0x1526,
-	0x10c0, 0x12d2, 0x6808, 0x8000, 0x680a, 0x0d7f, 0x127e, 0x047e,
-	0x037e, 0x027e, 0x2091, 0x2100, 0x027f, 0x037f, 0x047f, 0x7000,
-	0xa005, 0x00c0, 0x15c2, 0x7206, 0x2001, 0x15e3, 0x007e, 0x2260,
-	0x0078, 0x1724, 0x710c, 0x220a, 0x8108, 0x230a, 0x8108, 0x240a,
-	0x8108, 0xa182, 0x8af9, 0x0048, 0x15cf, 0x2009, 0x8ade, 0x710e,
-	0x7010, 0xa102, 0xa082, 0x0009, 0x0040, 0x15da, 0xa080, 0x001b,
-	0x00c0, 0x15dd, 0x2009, 0x0138, 0x200a, 0x7000, 0xa005, 0x00c0,
-	0x15e3, 0x1078, 0x1705, 0x127f, 0x007c, 0x127e, 0x027e, 0x037e,
-	0x0c7e, 0x007e, 0x2091, 0x2100, 0x007f, 0x047f, 0x037f, 0x027f,
-	0x0d7e, 0x0c7e, 0x2460, 0x6110, 0x2168, 0x6a62, 0x6b5e, 0xa005,
-	0x0040, 0x163c, 0x6808, 0xa005, 0x0040, 0x16a2, 0x7000, 0xa005,
-	0x00c0, 0x1604, 0x0078, 0x1631, 0x700c, 0x7110, 0xa106, 0x00c0,
-	0x16ab, 0x7004, 0xa406, 0x00c0, 0x1631, 0x2001, 0x0005, 0x2004,
-	0xd08c, 0x0040, 0x161a, 0x047e, 0x1078, 0x1816, 0x047f, 0x2460,
-	0x0078, 0x15fa, 0x2001, 0x0207, 0x2004, 0xd09c, 0x00c0, 0x160d,
-	0x7804, 0xa084, 0x6000, 0x0040, 0x162b, 0xa086, 0x6000, 0x0040,
-	0x162b, 0x0078, 0x160d, 0x7803, 0x0004, 0x7003, 0x0000, 0x7004,
-	0x2060, 0x6100, 0xa18e, 0x0004, 0x00c0, 0x16ab, 0x2009, 0x0048,
-	0x1078, 0x6939, 0x0078, 0x16ab, 0x6808, 0xa005, 0x0040, 0x16a2,
-	0x7000, 0xa005, 0x00c0, 0x1646, 0x0078, 0x16a2, 0x700c, 0x7110,
-	0xa106, 0x00c0, 0x164f, 0x7004, 0xa406, 0x00c0, 0x16a2, 0x2001,
-	0x0005, 0x2004, 0xd08c, 0x0040, 0x165c, 0x047e, 0x1078, 0x1816,
-	0x047f, 0x2460, 0x0078, 0x163c, 0x2001, 0x0207, 0x2004, 0xd09c,
-	0x00c0, 0x164f, 0x2001, 0x0005, 0x2004, 0xd08c, 0x00c0, 0x1655,
-	0x7804, 0xa084, 0x6000, 0x0040, 0x1673, 0xa086, 0x6000, 0x0040,
-	0x1673, 0x0078, 0x164f, 0x7007, 0x0000, 0xa016, 0x2218, 0x7000,
-	0xa08e, 0x0001, 0x0040, 0x1694, 0xa08e, 0x0002, 0x00c0, 0x16a2,
-	0x0c7e, 0x0e7e, 0x6818, 0x2060, 0x1078, 0x1dc4, 0x2804, 0xac70,
-	0x6034, 0xd09c, 0x00c0, 0x1690, 0x7308, 0x720c, 0x0078, 0x1692,
-	0x7310, 0x7214, 0x0e7f, 0x0c7f, 0x7820, 0xa318, 0x7824, 0xa211,
-	0x6810, 0xa300, 0x6812, 0x6814, 0xa201, 0x6816, 0x7803, 0x0004,
-	0x7003, 0x0000, 0x6100, 0xa18e, 0x0004, 0x00c0, 0x16ab, 0x2009,
-	0x0048, 0x1078, 0x6939, 0x0c7f, 0x0d7f, 0x127f, 0x007c, 0x0f7e,
-	0x0e7e, 0x027e, 0x037e, 0x047e, 0x1078, 0x19e5, 0x027e, 0x2071,
-	0x8ad8, 0x7000, 0xa086, 0x0000, 0x0040, 0x16f6, 0x7004, 0xac06,
-	0x00c0, 0x16e7, 0x2079, 0x0030, 0x7000, 0xa086, 0x0003, 0x0040,
-	0x16e7, 0x7804, 0xd0fc, 0x00c0, 0x16e3, 0x2001, 0x0207, 0x2004,
-	0xd09c, 0x00c0, 0x16c9, 0x7803, 0x0004, 0x7804, 0xd0ac, 0x00c0,
-	0x16d5, 0x7803, 0x0002, 0x7803, 0x0009, 0x7003, 0x0003, 0x7007,
-	0x0000, 0x0078, 0x16e7, 0x1078, 0x1816, 0x0078, 0x16b9, 0x157e,
-	0x20a9, 0x0009, 0x2009, 0x8ade, 0x2104, 0xac06, 0x00c0, 0x16f1,
-	0x200a, 0xa188, 0x0003, 0x00f0, 0x16ec, 0x157f, 0x027f, 0x2001,
-	0x015d, 0x201c, 0x831a, 0x2302, 0x2001, 0x0138, 0x2202, 0x047f,
-	0x037f, 0x027f, 0x0e7f, 0x0f7f, 0x007c, 0x700c, 0x7110, 0xa106,
-	0x00c0, 0x170d, 0x7003, 0x0000, 0x007c, 0x2104, 0x7006, 0x2060,
-	0x8108, 0x211c, 0x8108, 0x2124, 0x8108, 0xa182, 0x8af9, 0x0048,
-	0x171b, 0x2009, 0x8ade, 0x7112, 0x700c, 0xa106, 0x00c0, 0x1724,
-	0x2001, 0x0138, 0x2003, 0x0008, 0x8cff, 0x00c0, 0x172b, 0x1078,
-	0x1a10, 0x0078, 0x1757, 0x6010, 0x2068, 0x2d58, 0x6828, 0xa406,
-	0x00c0, 0x1736, 0x682c, 0xa306, 0x0040, 0x173f, 0x601c, 0xa086,
-	0x0008, 0x0040, 0x173f, 0x1078, 0x1e0f, 0x00c0, 0x1727, 0x684c,
-	0xd0f4, 0x00c0, 0x1727, 0x6824, 0x2050, 0x6818, 0x2060, 0x6830,
-	0x2040, 0x6034, 0xa0cc, 0x000f, 0x2009, 0x0011, 0x1078, 0x1758,
-	0x0040, 0x1756, 0x2009, 0x0001, 0x1078, 0x1758, 0x2d58, 0x007c,
-	0x8aff, 0x0040, 0x17ef, 0xa03e, 0x2730, 0x6850, 0xd0fc, 0x00c0,
-	0x177a, 0xd0f4, 0x00c0, 0x178a, 0x0d7e, 0x2804, 0xac68, 0x2900,
-	0x0079, 0x176a, 0x17d1, 0x1791, 0x1791, 0x17d1, 0x17d1, 0x17c9,
-	0x17d1, 0x1791, 0x17d1, 0x1797, 0x1797, 0x17d1, 0x17d1, 0x17d1,
-	0x17c0, 0x1797, 0xc0fc, 0x6852, 0x6b6c, 0x6a70, 0x6d1c, 0x6c20,
-	0x0d7e, 0xd99c, 0x0040, 0x17d4, 0x2804, 0xac68, 0x6f08, 0x6e0c,
-	0x0078, 0x17d4, 0xc0f4, 0x6852, 0x6b6c, 0x6a70, 0x0d7e, 0x0078,
-	0x17db, 0x6b08, 0x6a0c, 0x6d00, 0x6c04, 0x0078, 0x17d4, 0x7b0c,
-	0xd3bc, 0x0040, 0x17b8, 0x7004, 0x0e7e, 0x2070, 0x701c, 0x0e7f,
-	0xa086, 0x0008, 0x00c0, 0x17b8, 0x7b08, 0xa39c, 0x0fff, 0x2d20,
-	0x0d7f, 0x0d7e, 0x6a14, 0x82ff, 0x00c0, 0x17b3, 0x6810, 0xa302,
-	0x0048, 0x17b3, 0x6b10, 0x2011, 0x0000, 0x2468, 0x0078, 0x17ba,
-	0x6b10, 0x6a14, 0x6d00, 0x6c04, 0x6f08, 0x6e0c, 0x0078, 0x17d4,
-	0x0d7f, 0x0d7e, 0x6834, 0xa084, 0x00ff, 0xa086, 0x001e, 0x00c0,
-	0x17d1, 0x0d7f, 0x1078, 0x1dab, 0x00c0, 0x1758, 0xa00e, 0x0078,
-	0x17ef, 0x0d7f, 0x1078, 0x12d2, 0x7b22, 0x7a26, 0x7d32, 0x7c36,
-	0x7f3a, 0x7e3e, 0x7902, 0x7000, 0x8000, 0x7002, 0x0d7f, 0x6828,
-	0xa300, 0x682a, 0x682c, 0xa201, 0x682e, 0x2300, 0x6b10, 0xa302,
-	0x6812, 0x2200, 0x6a14, 0xa203, 0x6816, 0x1078, 0x1dab, 0x007c,
-	0x1078, 0x12d2, 0x7803, 0x0004, 0x7004, 0x2060, 0x0d7e, 0x6010,
-	0x2068, 0x7003, 0x0000, 0x1078, 0x19b4, 0x1078, 0x77ed, 0x0040,
-	0x180f, 0x6808, 0x8001, 0x680a, 0x697c, 0x6912, 0x6980, 0x6916,
-	0x682b, 0xffff, 0x682f, 0xffff, 0x6850, 0xc0bd, 0x6852, 0x0d7f,
-	0x1078, 0x759a, 0x0078, 0x19b0, 0x1078, 0x12d2, 0x127e, 0x2091,
-	0x2100, 0x007e, 0x017e, 0x2b68, 0x6818, 0x2060, 0x7904, 0x7803,
-	0x0002, 0xa184, 0x0700, 0x00c0, 0x17f2, 0xa184, 0x0003, 0xa086,
-	0x0003, 0x0040, 0x1814, 0x7000, 0x0079, 0x182e, 0x1836, 0x1838,
-	0x1914, 0x1987, 0x199e, 0x1836, 0x1836, 0x1836, 0x1078, 0x12d2,
-	0x8001, 0x7002, 0xa184, 0x0880, 0x00c0, 0x184d, 0x8aff, 0x0040,
-	0x18b6, 0x2009, 0x0001, 0x1078, 0x1758, 0x0040, 0x19b0, 0x2009,
-	0x0001, 0x1078, 0x1758, 0x0078, 0x19b0, 0x7803, 0x0004, 0x7003,
-	0x0000, 0xd1bc, 0x00c0, 0x189f, 0x027e, 0x037e, 0x7808, 0xd0ec,
-	0x00c0, 0x1860, 0x7803, 0x0009, 0x7003, 0x0004, 0x0078, 0x1862,
-	0x1078, 0x1a80, 0x6b28, 0x6a2c, 0x2400, 0x686e, 0xa31a, 0x2500,
-	0x6872, 0xa213, 0x6b2a, 0x6a2e, 0x2400, 0x6910, 0xa100, 0x6812,
-	0x2500, 0x6914, 0xa101, 0x6816, 0x037f, 0x027f, 0x2600, 0x681e,
-	0x2700, 0x6822, 0x1078, 0x1dc4, 0x2a00, 0x6826, 0x2c00, 0x681a,
-	0x2800, 0x6832, 0x6850, 0xc0fd, 0x6852, 0x6808, 0x8001, 0x680a,
-	0x00c0, 0x1894, 0x684c, 0xd0e4, 0x0040, 0x1894, 0x7004, 0x2060,
-	0x2009, 0x0048, 0x1078, 0x6939, 0x7000, 0xa086, 0x0004, 0x0040,
-	0x19b0, 0x7003, 0x0000, 0x1078, 0x1705, 0x0078, 0x19b0, 0x057e,
-	0x7d0c, 0xd5bc, 0x00c0, 0x18a6, 0x1078, 0x874c, 0x057f, 0x1078,
-	0x19b4, 0x682b, 0xffff, 0x682f, 0xffff, 0x6808, 0x8001, 0x680a,
-	0x697c, 0x6912, 0x6980, 0x6916, 0x0078, 0x19b0, 0x684c, 0xc0f5,
-	0x684e, 0x7814, 0xa005, 0x00c0, 0x18ce, 0x7003, 0x0000, 0x6808,
-	0x8001, 0x680a, 0x00c0, 0x18ca, 0x7004, 0x2060, 0x2009, 0x0048,
-	0x1078, 0x6939, 0x1078, 0x1705, 0x0078, 0x19b0, 0x7814, 0x6910,
-	0xa102, 0x6812, 0x6914, 0xa183, 0x0000, 0x6816, 0x7814, 0x7908,
-	0xa18c, 0x0fff, 0xa188, 0x0007, 0x8114, 0x8214, 0x8214, 0xa10a,
-	0x8104, 0x8004, 0x8004, 0xa20a, 0x810b, 0x810b, 0x810b, 0x1078,
-	0x1a3b, 0x7803, 0x0004, 0x780f, 0xffff, 0x7803, 0x0001, 0x7804,
-	0xd0fc, 0x0040, 0x18ef, 0x7803, 0x0002, 0x7803, 0x0004, 0x780f,
-	0x0076, 0x7004, 0x7007, 0x0000, 0x2060, 0x2009, 0x0048, 0x1078,
-	0x6939, 0x1078, 0x1a5e, 0x0040, 0x18ca, 0x7908, 0xd1ec, 0x00c0,
-	0x190d, 0x2009, 0x0009, 0x0078, 0x190f, 0x2009, 0x0019, 0x7902,
-	0x7003, 0x0003, 0x0078, 0x19b0, 0x8001, 0x7002, 0xd194, 0x0040,
-	0x1926, 0x7804, 0xd0fc, 0x00c0, 0x181e, 0x8aff, 0x0040, 0x19b0,
-	0x2009, 0x0001, 0x1078, 0x1758, 0x0078, 0x19b0, 0xa184, 0x0880,
-	0x00c0, 0x1933, 0x8aff, 0x0040, 0x19b0, 0x2009, 0x0001, 0x1078,
-	0x1758, 0x0078, 0x19b0, 0x7803, 0x0004, 0x7003, 0x0000, 0xd1bc,
-	0x00c0, 0x1973, 0x027e, 0x037e, 0x7808, 0xd0ec, 0x00c0, 0x1946,
-	0x7803, 0x0009, 0x7003, 0x0004, 0x0078, 0x1948, 0x1078, 0x1a80,
-	0x6b28, 0x6a2c, 0x1078, 0x1dc4, 0x0d7e, 0x0f7e, 0x2d78, 0x2804,
-	0xac68, 0x6034, 0xd09c, 0x00c0, 0x1963, 0x6808, 0x2008, 0xa31a,
-	0x680c, 0xa213, 0x7810, 0xa100, 0x7812, 0x690c, 0x7814, 0xa101,
-	0x7816, 0x0078, 0x196f, 0x6810, 0x2008, 0xa31a, 0x6814, 0xa213,
-	0x7810, 0xa100, 0x7812, 0x6914, 0x7814, 0xa101, 0x7816, 0x0f7f,
-	0x0d7f, 0x0078, 0x1864, 0x057e, 0x7d0c, 0x1078, 0x874c, 0x057f,
-	0x1078, 0x19b4, 0x682b, 0xffff, 0x682f, 0xffff, 0x6808, 0x8001,
-	0x680a, 0x697c, 0x6912, 0x6980, 0x6916, 0x0078, 0x19b0, 0x7803,
-	0x0004, 0x7003, 0x0000, 0x7004, 0xa00d, 0x0040, 0x199a, 0x6808,
-	0x8001, 0x680a, 0x00c0, 0x199a, 0x7004, 0x2060, 0x2009, 0x0048,
-	0x1078, 0x6939, 0x1078, 0x1705, 0x0078, 0x19b0, 0x7803, 0x0004,
-	0x7003, 0x0000, 0x7004, 0x2060, 0x6010, 0xa005, 0x0040, 0x199a,
-	0x2068, 0x6808, 0x8000, 0x680a, 0x6c28, 0x6b2c, 0x1078, 0x1724,
-	0x017f, 0x007f, 0x127f, 0x007c, 0x0c7e, 0x1078, 0x19e5, 0x20e1,
-	0x9028, 0x700c, 0x7110, 0xa106, 0x0040, 0x19db, 0x2104, 0xa005,
-	0x0040, 0x19c8, 0x2060, 0x6010, 0x2060, 0x6008, 0x8001, 0x600a,
-	0xa188, 0x0003, 0xa182, 0x8af9, 0x0048, 0x19d0, 0x2009, 0x8ade,
-	0x7112, 0x700c, 0xa106, 0x00c0, 0x19b9, 0x2001, 0x0138, 0x2003,
-	0x0008, 0x0078, 0x19b9, 0x2001, 0x015d, 0x200c, 0x810a, 0x2102,
-	0x2001, 0x0138, 0x2202, 0x0c7f, 0x007c, 0x2001, 0x0138, 0x2014,
-	0x2003, 0x0000, 0x2021, 0xb015, 0x2001, 0x0141, 0x201c, 0xd3dc,
-	0x00c0, 0x1a02, 0x2001, 0x0109, 0x201c, 0xa39c, 0x0048, 0x00c0,
-	0x1a02, 0x2001, 0x0111, 0x201c, 0x83ff, 0x00c0, 0x1a02, 0x8421,
-	0x00c0, 0x19ec, 0x007c, 0x2011, 0x0201, 0x2009, 0x003c, 0x2204,
-	0xa005, 0x00c0, 0x1a0f, 0x8109, 0x00c0, 0x1a07, 0x007c, 0x007c,
-	0x1078, 0x1a03, 0x0040, 0x1a38, 0x7908, 0xd1ec, 0x00c0, 0x1a28,
-	0x1078, 0x1a5e, 0x0040, 0x1a28, 0x7803, 0x0009, 0x7904, 0xd1fc,
-	0x0040, 0x1a1e, 0x7803, 0x0006, 0x1078, 0x1a03, 0x0040, 0x1a38,
-	0x780c, 0xd0a4, 0x00c0, 0x1a38, 0x7007, 0x0000, 0x1078, 0x1a5e,
-	0x0040, 0x1a3a, 0x7803, 0x0019, 0x7003, 0x0003, 0x0078, 0x1a3a,
-	0x1078, 0x19b4, 0x007c, 0x3c00, 0x007e, 0x0e7e, 0x2071, 0x0200,
-	0x7808, 0xa084, 0xf000, 0xa10d, 0x1078, 0x19e5, 0x20e1, 0x7000,
-	0x7324, 0x7420, 0x7028, 0x7028, 0x7426, 0x7037, 0x0001, 0x810f,
-	0x712e, 0x702f, 0x0100, 0x7037, 0x0008, 0x7326, 0x7422, 0x2001,
-	0x0138, 0x2202, 0x0e7f, 0x007f, 0x20e0, 0x007c, 0x3c00, 0x007e,
-	0x7908, 0xa18c, 0x0fff, 0xa182, 0x0009, 0x0048, 0x1a6b, 0xa085,
-	0x0001, 0x0078, 0x1a7d, 0x2001, 0x020a, 0x81ff, 0x0040, 0x1a76,
-	0x20e1, 0x6000, 0x200c, 0x200c, 0x200c, 0x200c, 0x20e1, 0x7000,
-	0x200c, 0x200c, 0x7003, 0x0000, 0xa006, 0x007f, 0x20e0, 0x007c,
-	0x7c20, 0x7d24, 0x7e30, 0x7f34, 0x700c, 0x7110, 0xa106, 0x0040,
-	0x1aff, 0x7004, 0x017e, 0x210c, 0xa106, 0x017f, 0x0040, 0x1aff,
-	0x0d7e, 0x0c7e, 0x216c, 0x2d00, 0xa005, 0x0040, 0x1afd, 0x6810,
-	0x2068, 0x6850, 0xd0fc, 0x0040, 0x1ac9, 0x8108, 0x2104, 0x6b2c,
-	0xa306, 0x00c0, 0x1afd, 0x8108, 0x2104, 0x6a28, 0xa206, 0x00c0,
-	0x1afd, 0x6850, 0xc0fc, 0xc0f5, 0x6852, 0x686c, 0x7822, 0x6870,
-	0x7826, 0x681c, 0x7832, 0x6820, 0x7836, 0x6818, 0x2060, 0x6034,
-	0xd09c, 0x0040, 0x1ac4, 0x6830, 0x2004, 0xac68, 0x6808, 0x783a,
-	0x680c, 0x783e, 0x0078, 0x1afb, 0xa006, 0x783a, 0x783e, 0x0078,
-	0x1afb, 0x8108, 0x2104, 0xa005, 0x00c0, 0x1afd, 0x8108, 0x2104,
-	0xa005, 0x00c0, 0x1afd, 0x6850, 0xc0f5, 0x6852, 0x6830, 0x2004,
-	0x6918, 0xa160, 0x6834, 0xd09c, 0x00c0, 0x1aed, 0x6008, 0x7822,
-	0x686e, 0x600c, 0x7826, 0x6872, 0x6000, 0x7832, 0x6004, 0x7836,
-	0xa006, 0x783a, 0x783e, 0x0078, 0x1afb, 0x6010, 0x7822, 0x686e,
-	0x6014, 0x7826, 0x6872, 0x6000, 0x7832, 0x6004, 0x7836, 0x6008,
-	0x783a, 0x600c, 0x783e, 0x7803, 0x0011, 0x0c7f, 0x0d7f, 0x007c,
-	0x0e7e, 0x2071, 0x8af9, 0x7003, 0x0000, 0x0e7f, 0x007c, 0x0d7e,
-	0xa280, 0x0004, 0x206c, 0x694c, 0xd1dc, 0x00c0, 0x1b82, 0x6934,
-	0xa184, 0x0007, 0x0079, 0x1b14, 0x1b1c, 0x1b6d, 0x1b1c, 0x1b1c,
-	0x1b1c, 0x1b52, 0x1b2f, 0x1b1e, 0x1078, 0x12d2, 0x684c, 0xd0b4,
-	0x0040, 0x1c90, 0x6860, 0x682e, 0x6816, 0x685c, 0x682a, 0x6812,
-	0x687c, 0x680a, 0x6880, 0x680e, 0x6958, 0x0078, 0x1b75, 0x6834,
-	0xa084, 0x00ff, 0xa086, 0x001e, 0x00c0, 0x1b1c, 0x684c, 0xd0b4,
-	0x0040, 0x1c90, 0x6860, 0x682e, 0x6816, 0x685c, 0x682a, 0x6812,
-	0x687c, 0x680a, 0x6880, 0x680e, 0x6804, 0x681a, 0xa080, 0x000d,
-	0x2004, 0xa084, 0x000f, 0xa080, 0x1def, 0x2004, 0x6832, 0x6958,
-	0x0078, 0x1b7e, 0xa18c, 0x00ff, 0xa186, 0x0015, 0x00c0, 0x1b82,
-	0x684c, 0xd0b4, 0x0040, 0x1c90, 0x6804, 0x681a, 0xa080, 0x000d,
-	0x2004, 0xa084, 0x000f, 0xa080, 0x1def, 0x2004, 0x6832, 0x6958,
-	0xa006, 0x682e, 0x682a, 0x0078, 0x1b7e, 0x684c, 0xd0b4, 0x0040,
-	0x17f0, 0x6958, 0xa006, 0x682e, 0x682a, 0x2d00, 0x681a, 0x6834,
-	0xa084, 0x000f, 0xa080, 0x1def, 0x2004, 0x6832, 0x6926, 0x684c,
-	0xc0dd, 0x684e, 0x0d7f, 0x007c, 0x0f7e, 0x2079, 0x0020, 0x7804,
-	0xd0fc, 0x10c0, 0x1cb7, 0x0e7e, 0x0d7e, 0x2071, 0x8af9, 0x7000,
-	0xa005, 0x00c0, 0x1c07, 0x0c7e, 0x7206, 0xa280, 0x0004, 0x205c,
-	0x7004, 0x2068, 0x7803, 0x0004, 0x6818, 0x0d7e, 0x2068, 0x686c,
-	0x7812, 0x6890, 0x0f7e, 0x20e1, 0x9040, 0x2079, 0x0200, 0x781a,
-	0x2079, 0x0100, 0x8004, 0x78d6, 0x0f7f, 0x0d7f, 0x2b68, 0x6824,
-	0x2050, 0x6818, 0x2060, 0x6830, 0x2040, 0x6034, 0xa0cc, 0x000f,
-	0x6908, 0x2001, 0x04fd, 0x2004, 0xa086, 0x0007, 0x0040, 0x1bc9,
-	0xa184, 0x0007, 0x0040, 0x1bc9, 0x017e, 0x2009, 0x0008, 0xa102,
-	0x017f, 0xa108, 0x791a, 0x7116, 0x701e, 0x680c, 0xa081, 0x0000,
-	0x781e, 0x701a, 0xa006, 0x700e, 0x7012, 0x7004, 0x692c, 0x6814,
-	0xa106, 0x00c0, 0x1be0, 0x6928, 0x6810, 0xa106, 0x0040, 0x1bed,
-	0x037e, 0x047e, 0x6b14, 0x6c10, 0x1078, 0x1e0f, 0x047f, 0x037f,
-	0x0040, 0x1bed, 0x0c7f, 0x0078, 0x1c07, 0x8aff, 0x00c0, 0x1bf5,
-	0x0c7f, 0xa085, 0x0001, 0x0078, 0x1c07, 0x127e, 0x2091, 0x8000,
-	0x2079, 0x0020, 0x2009, 0x0001, 0x1078, 0x1c0b, 0x0040, 0x1c04,
-	0x2009, 0x0001, 0x1078, 0x1c0b, 0x127f, 0x0c7f, 0xa006, 0x0d7f,
-	0x0e7f, 0x0f7f, 0x007c, 0x077e, 0x067e, 0x057e, 0x047e, 0x037e,
-	0x027e, 0x8aff, 0x0040, 0x1c89, 0x700c, 0x7214, 0xa23a, 0x7010,
-	0x7218, 0xa203, 0x0048, 0x1c88, 0xa705, 0x0040, 0x1c88, 0xa03e,
-	0x2730, 0x6850, 0xd0fc, 0x00c0, 0x1c3b, 0x0d7e, 0x2804, 0xac68,
-	0x2900, 0x0079, 0x1c2b, 0x1c6a, 0x1c4b, 0x1c4b, 0x1c6a, 0x1c6a,
-	0x1c62, 0x1c6a, 0x1c4b, 0x1c6a, 0x1c51, 0x1c51, 0x1c6a, 0x1c6a,
-	0x1c6a, 0x1c59, 0x1c51, 0xc0fc, 0x6852, 0x6b6c, 0x6a70, 0x6d1c,
-	0x6c20, 0xd99c, 0x0040, 0x1c6e, 0x0d7e, 0x2804, 0xac68, 0x6f08,
-	0x6e0c, 0x0078, 0x1c6d, 0x6b08, 0x6a0c, 0x6d00, 0x6c04, 0x0078,
-	0x1c6d, 0x6b10, 0x6a14, 0x6d00, 0x6c04, 0x6f08, 0x6e0c, 0x0078,
-	0x1c6d, 0x0d7f, 0x0d7e, 0x6834, 0xa084, 0x00ff, 0xa086, 0x001e,
-	0x00c0, 0x1c6a, 0x0d7f, 0x1078, 0x1dab, 0x00c0, 0x1c11, 0xa00e,
-	0x0078, 0x1c89, 0x0d7f, 0x1078, 0x12d2, 0x0d7f, 0x7b22, 0x7a26,
-	0x7d32, 0x7c36, 0x7f3a, 0x7e3e, 0x7902, 0x7000, 0x8000, 0x7002,
-	0x6828, 0xa300, 0x682a, 0x682c, 0xa201, 0x682e, 0x700c, 0xa300,
-	0x700e, 0x7010, 0xa201, 0x7012, 0x1078, 0x1dab, 0x0078, 0x1c89,
-	0xa006, 0x027f, 0x037f, 0x047f, 0x057f, 0x067f, 0x077f, 0x007c,
-	0x1078, 0x12d2, 0x2001, 0x0105, 0x2003, 0x0010, 0x20e1, 0x9040,
-	0x7803, 0x0004, 0x7003, 0x0000, 0x7004, 0x2060, 0x0d7e, 0x6010,
-	0x2068, 0x1078, 0x77ed, 0x0040, 0x1ca8, 0x6850, 0xc0bd, 0x6852,
-	0x0d7f, 0x1078, 0x759a, 0x20e1, 0x9040, 0x1078, 0x6753, 0x2011,
-	0x0000, 0x1078, 0x64b8, 0x1078, 0x5948, 0x0078, 0x1d7c, 0x127e,
-	0x2091, 0x2200, 0x007e, 0x017e, 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e,
-	0x2079, 0x0020, 0x2071, 0x8af9, 0x2b68, 0x6818, 0x2060, 0x7904,
-	0x7803, 0x0002, 0xa184, 0x0700, 0x00c0, 0x1c92, 0x7000, 0x0079,
-	0x1cd1, 0x1d7c, 0x1cd5, 0x1d49, 0x1d7a, 0x8001, 0x7002, 0xd19c,
-	0x00c0, 0x1ce9, 0x8aff, 0x0040, 0x1d08, 0x2009, 0x0001, 0x1078,
-	0x1c0b, 0x0040, 0x1d7c, 0x2009, 0x0001, 0x1078, 0x1c0b, 0x0078,
-	0x1d7c, 0x7803, 0x0004, 0xd194, 0x0040, 0x1cf9, 0x6850, 0xc0fc,
-	0x6852, 0x8aff, 0x00c0, 0x1cfe, 0x684c, 0xc0f5, 0x684e, 0x0078,
-	0x1cfe, 0x1078, 0x1dc4, 0x6850, 0xc0fd, 0x6852, 0x2a00, 0x6826,
-	0x2c00, 0x681a, 0x2800, 0x6832, 0x7003, 0x0000, 0x0078, 0x1d7c,
-	0x711c, 0x81ff, 0x0040, 0x1d1e, 0x7918, 0x7922, 0x7827, 0x0000,
-	0x7803, 0x0001, 0x7000, 0x8000, 0x7002, 0x700c, 0xa100, 0x700e,
-	0x7010, 0xa081, 0x0000, 0x7012, 0x0078, 0x1d7c, 0x0f7e, 0x027e,
-	0x781c, 0x007e, 0x7818, 0x007e, 0x2079, 0x0100, 0x7a14, 0xa284,
-	0x0004, 0xa085, 0x0012, 0x7816, 0x7820, 0xd0bc, 0x00c0, 0x1d2c,
-	0x79c8, 0x007f, 0xa102, 0x017f, 0x007e, 0x017e, 0x79c4, 0x007f,
-	0xa102, 0x78c6, 0x007f, 0x78ca, 0xa284, 0x0004, 0xa085, 0x0012,
-	0x7816, 0x027f, 0x0f7f, 0x7803, 0x0008, 0x7003, 0x0000, 0x0078,
-	0x1d7c, 0x8001, 0x7002, 0xd194, 0x0040, 0x1d5e, 0x7804, 0xd0fc,
-	0x00c0, 0x1cc7, 0xd19c, 0x00c0, 0x1d78, 0x8aff, 0x0040, 0x1d7c,
-	0x2009, 0x0001, 0x1078, 0x1c0b, 0x0078, 0x1d7c, 0x027e, 0x037e,
-	0x6b28, 0x6a2c, 0x1078, 0x1dc4, 0x0d7e, 0x2804, 0xac68, 0x6034,
-	0xd09c, 0x00c0, 0x1d71, 0x6808, 0xa31a, 0x680c, 0xa213, 0x0078,
-	0x1d75, 0x6810, 0xa31a, 0x6814, 0xa213, 0x0d7f, 0x0078, 0x1cf9,
-	0x0078, 0x1cf9, 0x1078, 0x12d2, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f,
-	0x017f, 0x007f, 0x127f, 0x007c, 0x0f7e, 0x0e7e, 0x2071, 0x8af9,
-	0x7000, 0xa086, 0x0000, 0x0040, 0x1da8, 0x2079, 0x0020, 0x20e1,
-	0x9040, 0x7804, 0xd0fc, 0x0040, 0x1d8f, 0x1078, 0x1cb7, 0x7000,
-	0xa086, 0x0000, 0x00c0, 0x1d8f, 0x7803, 0x0004, 0x7804, 0xd0ac,
-	0x00c0, 0x1d9e, 0x20e1, 0x9040, 0x7803, 0x0002, 0x7003, 0x0000,
-	0x0e7f, 0x0f7f, 0x007c, 0x8840, 0x2804, 0xa005, 0x00c0, 0x1dbf,
-	0x6004, 0xa005, 0x0040, 0x1dc1, 0x681a, 0x2060, 0x6034, 0xa084,
-	0x000f, 0xa080, 0x1def, 0x2044, 0x88ff, 0x1040, 0x12d2, 0x8a51,
-	0x007c, 0x2051, 0x0000, 0x007c, 0x8a50, 0x8841, 0x2804, 0xa005,
-	0x00c0, 0x1dde, 0x2c00, 0xad06, 0x0040, 0x1dd3, 0x6000, 0xa005,
-	0x00c0, 0x1dd3, 0x2d00, 0x2060, 0x681a, 0x6034, 0xa084, 0x000f,
-	0xa080, 0x1dff, 0x2044, 0x88ff, 0x1040, 0x12d2, 0x007c, 0x0000,
-	0x0011, 0x0015, 0x0019, 0x001d, 0x0021, 0x0025, 0x0029, 0x0000,
-	0x000f, 0x0015, 0x001b, 0x0021, 0x0027, 0x0000, 0x0000, 0x0000,
-	0x1de4, 0x1de0, 0x0000, 0x0000, 0x1dee, 0x0000, 0x1de4, 0x0000,
-	0x1deb, 0x1de8, 0x0000, 0x0000, 0x0000, 0x1dee, 0x1deb, 0x0000,
-	0x1de6, 0x1de6, 0x0000, 0x0000, 0x1dee, 0x0000, 0x1de6, 0x0000,
-	0x1dec, 0x1dec, 0x0000, 0x0000, 0x0000, 0x1dee, 0x1dec, 0x0a7e,
-	0x097e, 0x087e, 0x6858, 0xa055, 0x0040, 0x1eb0, 0x2d60, 0x6034,
-	0xa0cc, 0x000f, 0xa9c0, 0x1def, 0xa986, 0x0007, 0x0040, 0x1e28,
-	0xa986, 0x000e, 0x0040, 0x1e28, 0xa986, 0x000f, 0x00c0, 0x1e2c,
-	0x605c, 0xa422, 0x6060, 0xa31a, 0x2804, 0xa045, 0x00c0, 0x1e3a,
-	0x0050, 0x1e34, 0x0078, 0x1eb0, 0x6004, 0xa065, 0x0040, 0x1eb0,
-	0x0078, 0x1e17, 0x2804, 0xa005, 0x0040, 0x1e58, 0xac68, 0xd99c,
-	0x00c0, 0x1e48, 0x6808, 0xa422, 0x680c, 0xa31b, 0x0078, 0x1e4c,
-	0x6810, 0xa422, 0x6814, 0xa31b, 0x0048, 0x1e77, 0x2300, 0xa405,
-	0x0040, 0x1e5e, 0x8a51, 0x0040, 0x1eb0, 0x8840, 0x0078, 0x1e3a,
-	0x6004, 0xa065, 0x0040, 0x1eb0, 0x0078, 0x1e17, 0x8a51, 0x0040,
-	0x1eb0, 0x8840, 0x2804, 0xa005, 0x00c0, 0x1e71, 0x6004, 0xa065,
-	0x0040, 0x1eb0, 0x6034, 0xa0cc, 0x000f, 0xa9c0, 0x1def, 0x2804,
-	0x2040, 0x2b68, 0x6850, 0xc0fc, 0x6852, 0x0078, 0x1ea4, 0x8422,
-	0x8420, 0x831a, 0xa399, 0x0000, 0x0d7e, 0x2b68, 0x6c6e, 0x6b72,
-	0x0d7f, 0xd99c, 0x00c0, 0x1e92, 0x6908, 0x2400, 0xa122, 0x690c,
-	0x2300, 0xa11b, 0x1048, 0x12d2, 0x6800, 0xa420, 0x6804, 0xa319,
-	0x0078, 0x1e9e, 0x6910, 0x2400, 0xa122, 0x6914, 0x2300, 0xa11b,
-	0x1048, 0x12d2, 0x6800, 0xa420, 0x6804, 0xa319, 0x2b68, 0x6c1e,
-	0x6b22, 0x6850, 0xc0fd, 0x6852, 0x2c00, 0x681a, 0x2800, 0x6832,
-	0x2a00, 0x6826, 0x007f, 0x007f, 0x007f, 0xa006, 0x0078, 0x1eb5,
-	0x087f, 0x097f, 0x0a7f, 0xa085, 0x0001, 0x007c, 0x2001, 0x0005,
-	0x2004, 0xa084, 0x0007, 0x0079, 0x1ebd, 0x1ec5, 0x1ec6, 0x1ec9,
-	0x1ecc, 0x1ed1, 0x1ed4, 0x1ed9, 0x1ede, 0x007c, 0x1078, 0x1cb7,
-	0x007c, 0x1078, 0x1816, 0x007c, 0x1078, 0x1816, 0x1078, 0x1cb7,
-	0x007c, 0x1078, 0x145a, 0x007c, 0x1078, 0x1cb7, 0x1078, 0x145a,
-	0x007c, 0x1078, 0x1816, 0x1078, 0x145a, 0x007c, 0x1078, 0x1816,
-	0x1078, 0x1cb7, 0x1078, 0x145a, 0x007c, 0x127e, 0x2091, 0x2300,
-	0x2079, 0x0200, 0x2071, 0x8d80, 0x2069, 0x8800, 0x2009, 0x0004,
-	0x7912, 0x7817, 0x0004, 0x1078, 0x2220, 0x781b, 0x0002, 0x20e1,
-	0x8700, 0x127f, 0x007c, 0x127e, 0x2091, 0x2300, 0x781c, 0xa084,
-	0x0007, 0x0079, 0x1f03, 0x1f27, 0x1f0b, 0x1f0f, 0x1f13, 0x1f19,
-	0x1f1d, 0x1f21, 0x1f25, 0x1078, 0x4cc0, 0x0078, 0x1f27, 0x1078,
-	0x4cef, 0x0078, 0x1f27, 0x1078, 0x4cc0, 0x1078, 0x4cef, 0x0078,
-	0x1f27, 0x1078, 0x1f29, 0x0078, 0x1f27, 0x1078, 0x1f29, 0x0078,
-	0x1f27, 0x1078, 0x1f29, 0x0078, 0x1f27, 0x1078, 0x1f29, 0x127f,
-	0x007c, 0x007e, 0x017e, 0x027e, 0x7930, 0xa184, 0x0003, 0x0040,
-	0x1f35, 0x20e1, 0x9040, 0x0078, 0x1f52, 0xa184, 0x0030, 0x0040,
-	0x1f46, 0x6a00, 0xa286, 0x0003, 0x00c0, 0x1f40, 0x0078, 0x1f42,
-	0x1078, 0x3c73, 0x20e1, 0x9010, 0x0078, 0x1f52, 0xa184, 0x00c0,
-	0x0040, 0x1f4c, 0x1078, 0x12d2, 0xa184, 0x0300, 0x0040, 0x1f52,
-	0x20e1, 0x9020, 0x7932, 0x027f, 0x017f, 0x007f, 0x007c, 0x017e,
-	0x0e7e, 0x0f7e, 0x2071, 0x8800, 0x7128, 0x2001, 0x8a8f, 0x2102,
-	0x2001, 0x8a97, 0x2102, 0xa182, 0x0211, 0x00c8, 0x1f6b, 0x2009,
-	0x0008, 0x0078, 0x1f95, 0xa182, 0x0259, 0x00c8, 0x1f73, 0x2009,
-	0x0007, 0x0078, 0x1f95, 0xa182, 0x02c1, 0x00c8, 0x1f7b, 0x2009,
-	0x0006, 0x0078, 0x1f95, 0xa182, 0x0349, 0x00c8, 0x1f83, 0x2009,
-	0x0005, 0x0078, 0x1f95, 0xa182, 0x0421, 0x00c8, 0x1f8b, 0x2009,
-	0x0004, 0x0078, 0x1f95, 0xa182, 0x0581, 0x00c8, 0x1f93, 0x2009,
-	0x0003, 0x0078, 0x1f95, 0x2009, 0x0002, 0x2079, 0x0200, 0x7912,
-	0x7817, 0x0004, 0x1078, 0x2220, 0x0f7f, 0x0e7f, 0x017f, 0x007c,
-	0x127e, 0x2091, 0x2200, 0x2061, 0x0100, 0x2071, 0x8800, 0x6024,
-	0x6026, 0x6053, 0x0030, 0x6033, 0x00ef, 0x60e7, 0x0000, 0x60eb,
-	0x00ef, 0x60e3, 0x0008, 0x604b, 0xf7f7, 0x6043, 0x0000, 0x602f,
-	0x0080, 0x602f, 0x0000, 0x6007, 0x0eaf, 0x600f, 0x00ff, 0x602b,
-	0x002f, 0x127f, 0x007c, 0x2001, 0x882e, 0x2003, 0x0000, 0x2001,
-	0x882d, 0x2003, 0x0001, 0x007c, 0x127e, 0x2091, 0x2200, 0x007e,
-	0x017e, 0x027e, 0x6124, 0xa184, 0x002c, 0x00c0, 0x1fdb, 0xa184,
-	0x0007, 0x0079, 0x1fe1, 0xa195, 0x0004, 0xa284, 0x0007, 0x0079,
-	0x1fe1, 0x200d, 0x1fe9, 0x1fed, 0x1ff1, 0x1ff7, 0x1ffb, 0x2001,
-	0x2007, 0x1078, 0x5273, 0x0078, 0x200d, 0x1078, 0x5362, 0x0078,
-	0x200d, 0x1078, 0x5362, 0x1078, 0x5273, 0x0078, 0x200d, 0x1078,
-	0x2012, 0x0078, 0x200d, 0x1078, 0x5273, 0x1078, 0x2012, 0x0078,
-	0x200d, 0x1078, 0x5362, 0x1078, 0x2012, 0x0078, 0x200d, 0x1078,
-	0x5362, 0x1078, 0x5273, 0x1078, 0x2012, 0x027f, 0x017f, 0x007f,
-	0x127f, 0x007c, 0xd1ac, 0x0040, 0x20ec, 0x017e, 0x047e, 0x0c7e,
-	0x644c, 0xa486, 0xf0f0, 0x00c0, 0x2024, 0x2061, 0x0100, 0x644a,
-	0x6043, 0x0090, 0x6043, 0x0010, 0x74be, 0xa48c, 0xff00, 0x7034,
-	0xd084, 0x0040, 0x203c, 0xa186, 0xf800, 0x00c0, 0x203c, 0x7038,
-	0xd084, 0x00c0, 0x203c, 0xc085, 0x703a, 0x037e, 0x2418, 0x2011,
-	0x8016, 0x1078, 0x317a, 0x037f, 0xa196, 0xff00, 0x0040, 0x2061,
-	0x6030, 0xa084, 0x00ff, 0x810f, 0xa116, 0x0040, 0x2061, 0x7130,
-	0xd18c, 0x00c0, 0x2061, 0x2011, 0x8852, 0x2214, 0xd2ec, 0x0040,
-	0x2055, 0xc18d, 0x7132, 0x0078, 0x2061, 0x6240, 0xa294, 0x0010,
-	0x0040, 0x20af, 0x6248, 0xa294, 0xff00, 0xa296, 0xff00, 0x00c0,
-	0x20af, 0x7034, 0xd08c, 0x00c0, 0x206d, 0x2001, 0x880c, 0x200c,
-	0xd1ac, 0x00c0, 0x20af, 0xc1ad, 0x2102, 0x037e, 0x73bc, 0x2011,
-	0x8013, 0x1078, 0x317a, 0x037f, 0x7130, 0xc185, 0x7132, 0x2011,
-	0x8852, 0x220c, 0xd1a4, 0x0040, 0x2097, 0x017e, 0x2009, 0x0001,
-	0x2011, 0x0100, 0x1078, 0x5243, 0x2019, 0x000e, 0x1078, 0x8683,
-	0xa484, 0x00ff, 0xa080, 0x25b2, 0x200c, 0xa18c, 0xff00, 0x810f,
-	0x8127, 0xa006, 0x2009, 0x000e, 0x1078, 0x86f5, 0x017f, 0xd1ac,
-	0x00c0, 0x20a0, 0x2019, 0x0004, 0x1078, 0x249d, 0x0078, 0x20af,
-	0x157e, 0x20a9, 0x007f, 0x2009, 0x0000, 0x1078, 0x3f8e, 0x00c0,
-	0x20ab, 0x1078, 0x3d31, 0x8108, 0x00f0, 0x20a5, 0x157f, 0x0c7f,
-	0x047f, 0x0f7e, 0x2079, 0x8ab5, 0x783c, 0xa086, 0x0000, 0x0040,
-	0x20c1, 0x6027, 0x0004, 0x783f, 0x0000, 0x2079, 0x0140, 0x7803,
-	0x0000, 0x0f7f, 0x2011, 0x0003, 0x1078, 0x64ae, 0x2011, 0x0002,
-	0x1078, 0x64b8, 0x1078, 0x639b, 0x1078, 0x516f, 0x037e, 0x2019,
-	0x0000, 0x1078, 0x642d, 0x037f, 0x60e3, 0x0000, 0x017f, 0x2001,
-	0x8800, 0x2014, 0xa296, 0x0004, 0x00c0, 0x20e4, 0xd19c, 0x00c0,
-	0x20e4, 0x6228, 0xc29d, 0x622a, 0x2003, 0x0001, 0x2001, 0x8821,
-	0x2003, 0x0000, 0x6027, 0x0020, 0xd194, 0x0040, 0x21c7, 0x0f7e,
-	0x2079, 0x8ab5, 0x783c, 0xa086, 0x0001, 0x00c0, 0x2110, 0x017e,
-	0x6027, 0x0004, 0x783f, 0x0000, 0x2079, 0x0140, 0x7803, 0x1000,
-	0x7803, 0x0000, 0x2079, 0x8aa2, 0x7807, 0x0000, 0x7833, 0x0000,
-	0x1078, 0x5888, 0x1078, 0x5948, 0x017f, 0x0f7f, 0x0078, 0x21c7,
-	0x0f7f, 0x017e, 0x6220, 0xd2b4, 0x0040, 0x217d, 0x1078, 0x516f,
-	0x1078, 0x6232, 0x6027, 0x0004, 0x0f7e, 0x2019, 0x8aab, 0x2304,
-	0xa07d, 0x0040, 0x2153, 0x7804, 0xa086, 0x0032, 0x00c0, 0x2153,
-	0x0d7e, 0x0c7e, 0x0e7e, 0x2069, 0x0140, 0x618c, 0x6288, 0x7818,
-	0x608e, 0x7808, 0x608a, 0x6043, 0x0002, 0x2001, 0x0003, 0x8001,
-	0x00c0, 0x2137, 0x6043, 0x0000, 0x6803, 0x1000, 0x6803, 0x0000,
-	0x618e, 0x628a, 0x1078, 0x578f, 0x1078, 0x5888, 0x7810, 0x2070,
-	0x7037, 0x0103, 0x2f60, 0x1078, 0x690e, 0x0e7f, 0x0c7f, 0x0d7f,
-	0x0f7f, 0x017f, 0x007c, 0x0f7f, 0x0d7e, 0x2069, 0x0140, 0x6804,
-	0xa084, 0x4000, 0x0040, 0x2160, 0x6803, 0x1000, 0x6803, 0x0000,
-	0x0d7f, 0x0c7e, 0x2061, 0x8aa2, 0x6028, 0xa09a, 0x0002, 0x00c8,
-	0x2170, 0x8000, 0x602a, 0x0c7f, 0x1078, 0x6224, 0x0078, 0x21c6,
-	0x2019, 0x8aab, 0x2304, 0xa065, 0x0040, 0x217a, 0x2009, 0x0027,
-	0x1078, 0x6939, 0x0c7f, 0x0078, 0x21c6, 0xd2bc, 0x0040, 0x21c6,
-	0x1078, 0x517c, 0x6017, 0x0010, 0x6027, 0x0004, 0x0d7e, 0x2069,
-	0x0140, 0x6804, 0xa084, 0x4000, 0x0040, 0x2192, 0x6803, 0x1000,
-	0x6803, 0x0000, 0x0d7f, 0x0c7e, 0x2061, 0x8aa2, 0x6044, 0xa09a,
-	0x0002, 0x00c8, 0x21b5, 0x8000, 0x6046, 0x603c, 0x0c7f, 0xa005,
-	0x0040, 0x21c6, 0x2009, 0x07d0, 0x1078, 0x5174, 0xa080, 0x0007,
-	0x2004, 0xa086, 0x0006, 0x00c0, 0x21b1, 0x6017, 0x0012, 0x0078,
-	0x21c6, 0x6017, 0x0016, 0x0078, 0x21c6, 0x037e, 0x2019, 0x0001,
-	0x1078, 0x642d, 0x037f, 0x2019, 0x8ab1, 0x2304, 0xa065, 0x0040,
-	0x21c5, 0x2009, 0x004f, 0x1078, 0x6939, 0x0c7f, 0x017f, 0xd19c,
-	0x0040, 0x21ef, 0x017e, 0x6028, 0xc09c, 0x602a, 0x2011, 0x0003,
-	0x1078, 0x64ae, 0x2011, 0x0002, 0x1078, 0x64b8, 0x1078, 0x639b,
-	0x1078, 0x516f, 0x037e, 0x2019, 0x0000, 0x1078, 0x642d, 0x037f,
-	0x60e3, 0x0000, 0x1078, 0x876a, 0x1078, 0x8788, 0x2001, 0x8800,
-	0x2003, 0x0004, 0x6027, 0x0008, 0x1078, 0x1208, 0x017f, 0xa18c,
-	0xffd0, 0x6126, 0x007c, 0x007e, 0x017e, 0x027e, 0x0e7e, 0x0f7e,
-	0x127e, 0x2091, 0x8000, 0x2071, 0x8800, 0x71b4, 0x70b6, 0xa116,
-	0x0040, 0x2219, 0x81ff, 0x0040, 0x220b, 0x2011, 0x8011, 0x1078,
-	0x317a, 0x0078, 0x2219, 0x2011, 0x8012, 0x1078, 0x317a, 0x037e,
-	0x0c7e, 0x2061, 0x0100, 0x2019, 0x0028, 0x1078, 0x249d, 0x0c7f,
-	0x037f, 0x127f, 0x0f7f, 0x0e7f, 0x027f, 0x017f, 0x007f, 0x007c,
-	0x0c7e, 0x0f7e, 0x007e, 0x027e, 0x2061, 0x0100, 0xa190, 0x2233,
-	0x2204, 0x60f2, 0x2011, 0x2240, 0x2204, 0x60ee, 0x027f, 0x007f,
-	0x0f7f, 0x0c7f, 0x007c, 0x0840, 0x0840, 0x0840, 0x0580, 0x0420,
-	0x0348, 0x02c0, 0x0258, 0x0210, 0x01a8, 0x01a8, 0x01a8, 0x01a8,
-	0x0140, 0x00f8, 0x00d0, 0x00b0, 0x00a0, 0x2028, 0xa18c, 0x00ff,
-	0x2130, 0xa094, 0xff00, 0x00c0, 0x2250, 0x81ff, 0x0040, 0x2254,
-	0x1078, 0x4e98, 0x0078, 0x225b, 0xa080, 0x25b2, 0x200c, 0xa18c,
-	0xff00, 0x810f, 0xa006, 0x007c, 0xa080, 0x25b2, 0x200c, 0xa18c,
-	0x00ff, 0x007c, 0x0c7e, 0x2061, 0x8800, 0x6030, 0x0040, 0x226b,
-	0xc09d, 0x0078, 0x226c, 0xc09c, 0x6032, 0x0c7f, 0x007c, 0x228f,
-	0x2293, 0x2297, 0x229d, 0x22a3, 0x22a9, 0x22af, 0x22b7, 0x22bf,
-	0x22c5, 0x22cb, 0x22d3, 0x22db, 0x22e3, 0x22eb, 0x22f5, 0x22ff,
-	0x22ff, 0x22ff, 0x22ff, 0x22ff, 0x22ff, 0x22ff, 0x22ff, 0x22ff,
-	0x22ff, 0x22ff, 0x22ff, 0x22ff, 0x22ff, 0x22ff, 0x22ff, 0x107e,
-	0x007e, 0x0078, 0x2318, 0x107e, 0x007e, 0x0078, 0x2318, 0x107e,
-	0x007e, 0x1078, 0x1fcc, 0x0078, 0x2318, 0x107e, 0x007e, 0x1078,
-	0x1fcc, 0x0078, 0x2318, 0x107e, 0x007e, 0x1078, 0x1eb6, 0x0078,
-	0x2318, 0x107e, 0x007e, 0x1078, 0x1eb6, 0x0078, 0x2318, 0x107e,
-	0x007e, 0x1078, 0x1fcc, 0x1078, 0x1eb6, 0x0078, 0x2318, 0x107e,
-	0x007e, 0x1078, 0x1fcc, 0x1078, 0x1eb6, 0x0078, 0x2318, 0x107e,
-	0x007e, 0x1078, 0x1efb, 0x0078, 0x2318, 0x107e, 0x007e, 0x1078,
-	0x1efb, 0x0078, 0x2318, 0x107e, 0x007e, 0x1078, 0x1fcc, 0x1078,
-	0x1efb, 0x0078, 0x2318, 0x107e, 0x007e, 0x1078, 0x1fcc, 0x1078,
-	0x1efb, 0x0078, 0x2318, 0x107e, 0x007e, 0x1078, 0x1eb6, 0x1078,
-	0x1efb, 0x0078, 0x2318, 0x107e, 0x007e, 0x1078, 0x1eb6, 0x1078,
-	0x1efb, 0x0078, 0x2318, 0x107e, 0x007e, 0x1078, 0x1fcc, 0x1078,
-	0x1eb6, 0x1078, 0x1efb, 0x0078, 0x2318, 0x107e, 0x007e, 0x1078,
-	0x1fcc, 0x1078, 0x1eb6, 0x1078, 0x1efb, 0x0078, 0x2318, 0x0005,
-	0x0078, 0x22ff, 0xb084, 0x003c, 0x8004, 0x8004, 0x0079, 0x2308,
-	0x2318, 0x2295, 0x2299, 0x229f, 0x22a5, 0x22ab, 0x22b1, 0x22b9,
-	0x22c1, 0x22c7, 0x22cd, 0x22d5, 0x22dd, 0x22e5, 0x22ed, 0x22f7,
-	0x0008, 0x2302, 0x007f, 0x107f, 0x2091, 0x8001, 0x007c, 0x0c7e,
-	0x027e, 0x2041, 0x007e, 0x70c0, 0xd09c, 0x0040, 0x2329, 0x2041,
-	0x007f, 0xd094, 0x2001, 0x010c, 0x203c, 0x00c0, 0x2388, 0x7280,
-	0xd284, 0x0040, 0x2388, 0xd28c, 0x00c0, 0x2388, 0x037e, 0x7390,
-	0xa38e, 0xffff, 0x00c0, 0x233e, 0x2019, 0x0001, 0x8314, 0xa2e0,
-	0x8ec0, 0x2c04, 0xa38c, 0x0001, 0x0040, 0x234b, 0xa084, 0xff00,
-	0x8007, 0x0078, 0x234d, 0xa084, 0x00ff, 0xa70e, 0x0040, 0x237d,
-	0xa08e, 0x00ff, 0x00c0, 0x2362, 0x2011, 0x8852, 0x2214, 0xd2ec,
-	0x00c0, 0x2383, 0x7280, 0xc28d, 0x7282, 0x7093, 0xffff, 0x037f,
-	0x0078, 0x2388, 0x2009, 0x0000, 0x1078, 0x2245, 0x1078, 0x3f53,
-	0x00c0, 0x2380, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0,
-	0x2377, 0x1078, 0x23ef, 0x0040, 0x2380, 0x0078, 0x237d, 0x1078,
-	0x2503, 0x1078, 0x241c, 0x0040, 0x2380, 0x8318, 0x0078, 0x233e,
-	0x7392, 0x0078, 0x2385, 0x7093, 0xffff, 0x037f, 0x0078, 0x23ec,
-	0xa780, 0x25b2, 0x203c, 0xa7bc, 0xff00, 0x873f, 0x7090, 0xa096,
-	0xffff, 0x0040, 0x239a, 0xa812, 0x00c8, 0x23aa, 0x7093, 0xffff,
-	0x0078, 0x23e9, 0x2009, 0x0000, 0x70c0, 0xd09c, 0x0040, 0x23a5,
-	0xd094, 0x0040, 0x23a5, 0x2009, 0x007e, 0x2100, 0xa802, 0x20a8,
-	0x0078, 0x23ae, 0x2008, 0x2810, 0xa202, 0x20a8, 0x2700, 0x157e,
-	0x017e, 0xa106, 0x0040, 0x23e0, 0x1078, 0x3f53, 0x00c0, 0x23e9,
-	0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x23c5, 0x1078,
-	0x257d, 0x0040, 0x23e0, 0x0078, 0x23d4, 0x7280, 0xd28c, 0x0040,
-	0x23da, 0x6004, 0xa084, 0x00ff, 0xa082, 0x0006, 0x0048, 0x23e0,
-	0x1078, 0x3f76, 0x0078, 0x23e0, 0x1078, 0x23ef, 0x0040, 0x23e9,
-	0x0078, 0x23e0, 0x1078, 0x2503, 0x1078, 0x241c, 0x0040, 0x23e9,
-	0x017f, 0x8108, 0x157f, 0x00f0, 0x23ae, 0x7093, 0xffff, 0x0078,
-	0x23ec, 0x017f, 0x157f, 0x7192, 0x027f, 0x0c7f, 0x007c, 0x017e,
-	0x077e, 0x0d7e, 0x0c7e, 0x2c68, 0x2001, 0x8856, 0x2004, 0xa084,
-	0x00ff, 0x6842, 0x1078, 0x68a8, 0x0040, 0x2417, 0x2d00, 0x601a,
-	0x601f, 0x0001, 0x2001, 0x0000, 0x1078, 0x3ef1, 0x2001, 0x0000,
-	0x1078, 0x3f05, 0x127e, 0x2091, 0x8000, 0x708c, 0x8000, 0x708e,
-	0x127f, 0x2009, 0x0004, 0x1078, 0x6939, 0xa085, 0x0001, 0x0c7f,
-	0x0d7f, 0x077f, 0x017f, 0x007c, 0x017e, 0x077e, 0x0d7e, 0x0c7e,
-	0x2c68, 0x2001, 0x8856, 0x2004, 0xa084, 0x00ff, 0x6842, 0x1078,
-	0x68a8, 0x0040, 0x2444, 0x2d00, 0x601a, 0x601f, 0x0001, 0x2001,
-	0x0000, 0x1078, 0x3ef1, 0x2001, 0x0002, 0x1078, 0x3f05, 0x127e,
-	0x2091, 0x8000, 0x708c, 0x8000, 0x708e, 0x127f, 0x2009, 0x0002,
-	0x1078, 0x6939, 0xa085, 0x0001, 0x0c7f, 0x0d7f, 0x077f, 0x017f,
-	0x007c, 0x0c7e, 0x027e, 0x2009, 0x0080, 0x1078, 0x3f53, 0x00c0,
-	0x2457, 0x1078, 0x245a, 0x0040, 0x2457, 0x70c7, 0xffff, 0x027f,
-	0x0c7f, 0x007c, 0x017e, 0x077e, 0x0d7e, 0x0c7e, 0x2c68, 0x1078,
-	0x68a8, 0x0040, 0x247c, 0x2d00, 0x601a, 0x601f, 0x0001, 0x2001,
-	0x0000, 0x1078, 0x3ef1, 0x2001, 0x0002, 0x1078, 0x3f05, 0x127e,
-	0x2091, 0x8000, 0x70c8, 0x8000, 0x70ca, 0x127f, 0x2009, 0x0002,
-	0x1078, 0x6939, 0xa085, 0x0001, 0x0c7f, 0x0d7f, 0x077f, 0x017f,
-	0x007c, 0x0c7e, 0x0d7e, 0x2009, 0x007f, 0x1078, 0x3f53, 0x00c0,
-	0x249a, 0x2c68, 0x1078, 0x68a8, 0x0040, 0x249a, 0x2d00, 0x601a,
-	0x6312, 0x601f, 0x0001, 0x620a, 0x2009, 0x0022, 0x1078, 0x6939,
-	0xa085, 0x0001, 0x0d7f, 0x0c7f, 0x007c, 0x0e7e, 0x0c7e, 0x067e,
-	0x037e, 0x027e, 0x1078, 0x54fd, 0x1078, 0x549f, 0x1078, 0x6ea5,
-	0x20a9, 0x007f, 0x2009, 0x0000, 0x017e, 0x1078, 0x3f8e, 0x00c0,
-	0x24b5, 0x1078, 0x418b, 0x1078, 0x3d31, 0x017f, 0x8108, 0x00f0,
-	0x24ac, 0x027f, 0x037f, 0x067f, 0x0c7f, 0x0e7f, 0x007c, 0x0e7e,
-	0x0c7e, 0x037e, 0x027e, 0x017e, 0x6218, 0x2270, 0x72a0, 0x027e,
-	0x2019, 0x0029, 0x1078, 0x54f0, 0x087e, 0x2041, 0x0000, 0x1078,
-	0x5419, 0x2c08, 0x1078, 0x84d2, 0x087f, 0x017f, 0x2e60, 0x1078,
-	0x418b, 0x6210, 0x6314, 0x1078, 0x3d31, 0x6212, 0x6316, 0x017f,
-	0x027f, 0x037f, 0x0c7f, 0x0e7f, 0x007c, 0x0e7e, 0x007e, 0x6018,
-	0xa080, 0x0028, 0x2004, 0xd0bc, 0x00c0, 0x24f9, 0x2071, 0x8800,
-	0x708c, 0xa005, 0x0040, 0x24f6, 0x8001, 0x708e, 0x007f, 0x0e7f,
-	0x007c, 0x2071, 0x8800, 0x70c8, 0xa005, 0x0040, 0x24f6, 0x8001,
-	0x70ca, 0x0078, 0x24f6, 0x6000, 0xc08c, 0x6002, 0x007c, 0x0f7e,
-	0x0e7e, 0x0c7e, 0x037e, 0x027e, 0x017e, 0x157e, 0x2178, 0x81ff,
-	0x00c0, 0x2516, 0x20a9, 0x0001, 0x0078, 0x2531, 0x2001, 0x8852,
-	0x2004, 0xd0c4, 0x0040, 0x252d, 0xd0a4, 0x0040, 0x252d, 0x047e,
-	0x6018, 0xa080, 0x0028, 0x2024, 0xa4a4, 0x00ff, 0x8427, 0xa006,
-	0x2009, 0x002d, 0x1078, 0x86f5, 0x047f, 0x20a9, 0x00ff, 0x2011,
-	0x0000, 0x027e, 0xa288, 0x8934, 0x210c, 0x81ff, 0x0040, 0x255a,
-	0x8fff, 0x1040, 0x2566, 0x2019, 0x0029, 0x1078, 0x54f0, 0x087e,
-	0x2041, 0x0000, 0x1078, 0x5419, 0x0c7e, 0x027e, 0x2160, 0x6204,
-	0xa294, 0x00ff, 0x2001, 0x0004, 0x8007, 0xa215, 0x6206, 0x027f,
-	0x0c7f, 0x017e, 0x2c08, 0x1078, 0x84d2, 0x017f, 0x087f, 0x2160,
-	0x1078, 0x418b, 0x027f, 0x8210, 0x00f0, 0x2531, 0x157f, 0x017f,
-	0x027f, 0x037f, 0x0c7f, 0x0e7f, 0x0f7f, 0x007c, 0x047e, 0x027e,
-	0x017e, 0x2001, 0x8852, 0x2004, 0xd0c4, 0x0040, 0x2579, 0xd0a4,
-	0x0040, 0x2579, 0xa006, 0x2220, 0x8427, 0x2009, 0x0029, 0x1078,
-	0x86f5, 0x017f, 0x027f, 0x047f, 0x007c, 0x017e, 0x027e, 0x037e,
-	0x0c7e, 0x7280, 0x82ff, 0x0040, 0x25ab, 0xa290, 0x8852, 0x2214,
-	0xd2ac, 0x00c0, 0x25ab, 0x2100, 0x1078, 0x225c, 0x81ff, 0x0040,
-	0x25ad, 0x2019, 0x0001, 0x8314, 0xa2e0, 0x8ec0, 0x2c04, 0xd384,
-	0x0040, 0x259f, 0xa084, 0xff00, 0x8007, 0x0078, 0x25a1, 0xa084,
-	0x00ff, 0xa116, 0x0040, 0x25ad, 0xa096, 0x00ff, 0x0040, 0x25ab,
-	0x8318, 0x0078, 0x2593, 0xa085, 0x0001, 0x0c7f, 0x037f, 0x027f,
-	0x017f, 0x007c, 0x7eef, 0x7de8, 0x7ce4, 0x80e2, 0x7be1, 0x80e0,
-	0x80dc, 0x80da, 0x7ad9, 0x80d6, 0x80d5, 0x80d4, 0x80d3, 0x80d2,
-	0x80d1, 0x79ce, 0x78cd, 0x80cc, 0x80cb, 0x80ca, 0x80c9, 0x80c7,
-	0x80c6, 0x77c5, 0x76c3, 0x80bc, 0x80ba, 0x75b9, 0x80b6, 0x74b5,
-	0x73b4, 0x72b3, 0x80b2, 0x80b1, 0x80ae, 0x71ad, 0x80ac, 0x70ab,
-	0x6faa, 0x6ea9, 0x80a7, 0x6da6, 0x6ca5, 0x6ba3, 0x6a9f, 0x699e,
-	0x689d, 0x809b, 0x8098, 0x6797, 0x6690, 0x658f, 0x6488, 0x6384,
-	0x6282, 0x8081, 0x8080, 0x617c, 0x607a, 0x8079, 0x5f76, 0x8075,
-	0x8074, 0x8073, 0x8072, 0x8071, 0x806e, 0x5e6d, 0x806c, 0x5d6b,
-	0x5c6a, 0x5b69, 0x8067, 0x5a66, 0x5965, 0x5863, 0x575c, 0x565a,
-	0x5559, 0x8056, 0x8055, 0x5454, 0x5353, 0x5252, 0x5151, 0x504e,
-	0x4f4d, 0x804c, 0x804b, 0x4e4a, 0x4d49, 0x8047, 0x4c46, 0x8045,
-	0x8043, 0x803c, 0x803a, 0x8039, 0x8036, 0x4b35, 0x8034, 0x4a33,
-	0x4932, 0x4831, 0x802e, 0x472d, 0x462c, 0x452b, 0x442a, 0x4329,
-	0x4227, 0x8026, 0x8025, 0x4123, 0x401f, 0x3f1e, 0x3e1d, 0x3d1b,
-	0x3c18, 0x8017, 0x8010, 0x3b0f, 0x3a08, 0x8004, 0x3902, 0x8001,
-	0x8000, 0x8000, 0x3800, 0x3700, 0x3600, 0x8000, 0x3500, 0x8000,
-	0x8000, 0x8000, 0x3400, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
-	0x8000, 0x3300, 0x3200, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
-	0x8000, 0x3100, 0x3000, 0x8000, 0x8000, 0x2f00, 0x8000, 0x2e00,
-	0x2d00, 0x2c00, 0x8000, 0x8000, 0x8000, 0x2b00, 0x8000, 0x2a00,
-	0x2900, 0x2800, 0x8000, 0x2700, 0x2600, 0x2500, 0x2400, 0x2300,
-	0x2200, 0x8000, 0x8000, 0x2100, 0x2000, 0x1f00, 0x1e00, 0x1d00,
-	0x1c00, 0x8000, 0x8000, 0x1b00, 0x1a00, 0x8000, 0x1900, 0x8000,
-	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x1800, 0x8000, 0x1700,
-	0x1600, 0x1500, 0x8000, 0x1400, 0x1300, 0x1200, 0x1100, 0x1000,
-	0x0f00, 0x8000, 0x8000, 0x0e00, 0x0d00, 0x0c00, 0x0b00, 0x0a00,
-	0x0900, 0x8000, 0x8000, 0x0800, 0x0700, 0x8000, 0x0600, 0x8000,
-	0x8000, 0x8000, 0x0500, 0x0400, 0x0300, 0x8000, 0x0200, 0x8000,
-	0x8000, 0x8000, 0x0100, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
-	0x8000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
-	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
-	0x8000, 0x8000, 0x2071, 0x8881, 0x7003, 0x0002, 0xa006, 0x7012,
-	0x7016, 0x703a, 0x703e, 0x7033, 0x8891, 0x7037, 0x8891, 0x7007,
-	0x0001, 0x2061, 0x88d1, 0x6003, 0x0002, 0x007c, 0x0090, 0x26d9,
-	0x0068, 0x26d9, 0x2071, 0x8881, 0x2b78, 0x7818, 0xd084, 0x00c0,
-	0x26d9, 0x2a60, 0x7820, 0xa08e, 0x0069, 0x00c0, 0x27c9, 0x0079,
-	0x275d, 0x007c, 0x2071, 0x8881, 0x7004, 0x0079, 0x26df, 0x26e3,
-	0x26e4, 0x26ee, 0x2700, 0x007c, 0x0090, 0x26ed, 0x0068, 0x26ed,
-	0x2b78, 0x7818, 0xd084, 0x0040, 0x270c, 0x007c, 0x2b78, 0x2061,
-	0x88d1, 0x6008, 0xa08e, 0x0100, 0x0040, 0x26fb, 0xa086, 0x0200,
-	0x0040, 0x27c1, 0x007c, 0x7014, 0x2068, 0x2a60, 0x7018, 0x007a,
-	0x7010, 0x2068, 0x6834, 0xa086, 0x0103, 0x0040, 0x2708, 0x007c,
-	0x2a60, 0x2b78, 0x7018, 0x007a, 0x2a60, 0x7820, 0xa08a, 0x0040,
-	0x00c8, 0x2715, 0x61b4, 0x0079, 0x271d, 0x2100, 0xa08a, 0x003f,
-	0x00c8, 0x27bd, 0x61b4, 0x0079, 0x275d, 0x279f, 0x27d1, 0x27d9,
-	0x27dd, 0x27e5, 0x27eb, 0x27ef, 0x27f8, 0x27fc, 0x2804, 0x2808,
-	0x27bd, 0x27bd, 0x27bd, 0x280c, 0x27bd, 0x281c, 0x2833, 0x284a,
-	0x28c6, 0x28cb, 0x28f8, 0x2952, 0x2963, 0x2981, 0x29c2, 0x29cc,
-	0x29d9, 0x29ec, 0x2a0a, 0x2a13, 0x2a50, 0x2a56, 0x27bd, 0x2a66,
-	0x27bd, 0x27bd, 0x27bd, 0x27bd, 0x27bd, 0x2a6a, 0x2a74, 0x27bd,
-	0x27bd, 0x27bd, 0x27bd, 0x27bd, 0x27bd, 0x27bd, 0x27bd, 0x2a7c,
-	0x27bd, 0x27bd, 0x27bd, 0x27bd, 0x27bd, 0x2a89, 0x2a91, 0x27bd,
-	0x27bd, 0x27bd, 0x27bd, 0x27bd, 0x27bd, 0x2aa3, 0x2af4, 0x2b45,
-	0x2b56, 0x27bd, 0x27bd, 0x27bd, 0x34bd, 0x27bd, 0x27bd, 0x27bd,
-	0x27bd, 0x27bd, 0x27bd, 0x27bd, 0x27bd, 0x2804, 0x2808, 0x27bd,
-	0x27bd, 0x2b6d, 0x27bd, 0x27bd, 0x27bd, 0x27bd, 0x27bd, 0x27bd,
-	0x27bd, 0x27bd, 0x27bd, 0x27bd, 0x27bd, 0x2bba, 0x2ce1, 0x2cf5,
-	0x2d01, 0x2d64, 0x2dbd, 0x2dc8, 0x2e07, 0x2e16, 0x2e25, 0x2e28,
-	0x2b71, 0x2e51, 0x2e9d, 0x2eaa, 0x2fb9, 0x30d1, 0x30f8, 0x3205,
-	0x3214, 0x3221, 0x325b, 0x32f8, 0x27bd, 0x27bd, 0x27bd, 0x27bd,
-	0x3360, 0x337c, 0x33f6, 0x34ae, 0x713c, 0x0078, 0x279f, 0x2021,
-	0x4000, 0x1078, 0x3154, 0x127e, 0x2091, 0x8000, 0x0068, 0x27ac,
-	0x7818, 0xd084, 0x0040, 0x27af, 0x127f, 0x0078, 0x27a3, 0x7c22,
-	0x7926, 0x7a2a, 0x7b2e, 0x781b, 0x0001, 0x2091, 0x4080, 0x7007,
-	0x0001, 0x2091, 0x5000, 0x127f, 0x007c, 0x2021, 0x4001, 0x0078,
-	0x27a1, 0x2021, 0x4002, 0x0078, 0x27a1, 0x2021, 0x4003, 0x0078,
-	0x27a1, 0x2021, 0x4005, 0x0078, 0x27a1, 0x2021, 0x4006, 0x0078,
-	0x27a1, 0xa02e, 0x2520, 0x7b28, 0x7a2c, 0x7824, 0x7930, 0x0078,
-	0x3163, 0x7823, 0x0004, 0x7824, 0x007a, 0xa02e, 0x2520, 0x7b28,
-	0x7a2c, 0x7824, 0x7930, 0x0078, 0x3167, 0x7924, 0x7828, 0x2114,
-	0x200a, 0x0078, 0x279f, 0x7924, 0x2114, 0x0078, 0x279f, 0x2099,
-	0x0009, 0x20a1, 0x0009, 0x20a9, 0x0007, 0x53a3, 0x0078, 0x279f,
-	0x7824, 0x2060, 0x0078, 0x280e, 0x2009, 0x0001, 0x2011, 0x0011,
-	0x2019, 0x001e, 0x0078, 0x279f, 0x7d38, 0x7c3c, 0x0078, 0x27d3,
-	0x7d38, 0x7c3c, 0x0078, 0x27df, 0x2061, 0x1000, 0x610c, 0xa006,
-	0x2c14, 0xa200, 0x8c60, 0x8109, 0x00c0, 0x2810, 0x2010, 0xa005,
-	0x0040, 0x279f, 0x0078, 0x27c5, 0x2069, 0x8851, 0x7824, 0x7930,
-	0xa11a, 0x00c8, 0x27cd, 0x8019, 0x0040, 0x27cd, 0x684a, 0x6942,
-	0x782c, 0x6852, 0x7828, 0x6856, 0xa006, 0x685a, 0x685e, 0x1078,
-	0x4793, 0x0078, 0x279f, 0x2069, 0x8851, 0x7824, 0x7934, 0xa11a,
-	0x00c8, 0x27cd, 0x8019, 0x0040, 0x27cd, 0x684e, 0x6946, 0x782c,
-	0x6862, 0x7828, 0x6866, 0xa006, 0x686a, 0x686e, 0x1078, 0x4343,
-	0x0078, 0x279f, 0xa02e, 0x2520, 0x81ff, 0x00c0, 0x27c9, 0x7924,
-	0x7b28, 0x7a2c, 0x20a9, 0x0005, 0x20a1, 0x8888, 0x41a1, 0x1078,
-	0x3119, 0x0040, 0x27c9, 0x2009, 0x0020, 0x1078, 0x3163, 0x701b,
-	0x2862, 0x007c, 0x6834, 0x2008, 0xa084, 0x00ff, 0xa096, 0x0011,
-	0x0040, 0x286e, 0xa096, 0x0019, 0x00c0, 0x27c9, 0x810f, 0xa18c,
-	0x00ff, 0x0040, 0x27c9, 0x710e, 0x700c, 0x8001, 0x0040, 0x289f,
-	0x700e, 0x1078, 0x3119, 0x0040, 0x27c9, 0x2009, 0x0020, 0x2061,
-	0x88d1, 0x6224, 0x6328, 0x642c, 0x6530, 0xa290, 0x0040, 0xa399,
-	0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x1078, 0x3163, 0x701b,
-	0x2892, 0x007c, 0x6834, 0xa084, 0x00ff, 0xa096, 0x0002, 0x0040,
-	0x289d, 0xa096, 0x000a, 0x00c0, 0x27c9, 0x0078, 0x2874, 0x7010,
-	0x2068, 0x6838, 0xc0fd, 0x683a, 0x1078, 0x3e3e, 0x00c0, 0x28ad,
-	0x7007, 0x0003, 0x701b, 0x28af, 0x007c, 0x1078, 0x4454, 0x127e,
-	0x2091, 0x8000, 0x20a9, 0x0005, 0x2099, 0x8888, 0x530a, 0x2100,
-	0xa210, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0xad80,
-	0x000d, 0x2009, 0x0020, 0x127f, 0x0078, 0x3167, 0x619c, 0x7824,
-	0x609e, 0x0078, 0x279f, 0x2091, 0x8000, 0x7823, 0x4000, 0x7827,
-	0x4953, 0x782b, 0x5020, 0x782f, 0x2020, 0x2009, 0x017f, 0x2104,
-	0x7832, 0x3f00, 0x7836, 0x2061, 0x0100, 0x6200, 0x2061, 0x0200,
-	0x603c, 0x8007, 0xa205, 0x783a, 0x2009, 0x04fd, 0x2104, 0x783e,
-	0x781b, 0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x2071, 0x0010,
-	0x20c1, 0x00f0, 0xa08a, 0x0003, 0x00c8, 0x0427, 0x0078, 0x0423,
-	0x81ff, 0x00c0, 0x27c9, 0x7924, 0x810f, 0xa18c, 0x00ff, 0x1078,
-	0x3f8e, 0x00c0, 0x27cd, 0x7e38, 0xa684, 0x3fff, 0xa082, 0x4000,
-	0x0048, 0x290c, 0x0078, 0x27cd, 0x7c28, 0x7d2c, 0x1078, 0x4146,
-	0xd28c, 0x00c0, 0x2917, 0x1078, 0x40da, 0x0078, 0x2919, 0x1078,
-	0x4114, 0x00c0, 0x2943, 0x2061, 0x8f00, 0x127e, 0x2091, 0x8000,
-	0x6000, 0xa086, 0x0000, 0x0040, 0x2931, 0x6010, 0xa06d, 0x0040,
-	0x2931, 0x683c, 0xa406, 0x00c0, 0x2931, 0x6840, 0xa506, 0x0040,
-	0x293c, 0x127f, 0xace0, 0x000c, 0x2001, 0x8815, 0x2004, 0xac02,
-	0x00c8, 0x27c9, 0x0078, 0x291d, 0x1078, 0x759a, 0x127f, 0x0040,
-	0x27c9, 0x0078, 0x279f, 0xa00e, 0x2001, 0x0005, 0x1078, 0x4454,
-	0x127e, 0x2091, 0x8000, 0x1078, 0x7a4e, 0x1078, 0x4376, 0x127f,
-	0x0078, 0x279f, 0x81ff, 0x00c0, 0x27c9, 0x1078, 0x3131, 0x0040,
-	0x27cd, 0x1078, 0x4017, 0x0040, 0x27c9, 0x1078, 0x4154, 0x0040,
-	0x27c9, 0x0078, 0x279f, 0x81ff, 0x00c0, 0x27c9, 0x1078, 0x3143,
-	0x0040, 0x27cd, 0x1078, 0x41c7, 0x0040, 0x27c9, 0x2019, 0x0005,
-	0x1078, 0x4175, 0x0040, 0x27c9, 0x7828, 0xa08a, 0x1000, 0x00c8,
-	0x27cd, 0x8003, 0x800b, 0x810b, 0xa108, 0x1078, 0x50ff, 0x0078,
-	0x279f, 0x127e, 0x2091, 0x8000, 0x81ff, 0x0040, 0x298b, 0x2009,
-	0x0001, 0x0078, 0x29bc, 0x2029, 0x00ff, 0x644c, 0x2400, 0xa506,
-	0x0040, 0x29b6, 0x2508, 0x1078, 0x3f8e, 0x00c0, 0x29b6, 0x1078,
-	0x41c7, 0x00c0, 0x29a1, 0x2009, 0x0002, 0x62a4, 0x2518, 0x0078,
-	0x29bc, 0x2019, 0x0004, 0x1078, 0x4175, 0x00c0, 0x29ab, 0x2009,
-	0x0006, 0x0078, 0x29bc, 0x7824, 0xa08a, 0x1000, 0x00c8, 0x29bf,
-	0x8003, 0x800b, 0x810b, 0xa108, 0x1078, 0x50ff, 0x8529, 0x00c8,
-	0x298e, 0x127f, 0x0078, 0x279f, 0x127f, 0x0078, 0x27c9, 0x127f,
-	0x0078, 0x27cd, 0x1078, 0x3131, 0x0040, 0x27cd, 0x1078, 0x408b,
-	0x1078, 0x4146, 0x0078, 0x279f, 0x81ff, 0x00c0, 0x27c9, 0x1078,
-	0x3131, 0x0040, 0x27cd, 0x1078, 0x407a, 0x1078, 0x4146, 0x0078,
-	0x279f, 0x81ff, 0x00c0, 0x27c9, 0x1078, 0x3131, 0x0040, 0x27cd,
-	0x1078, 0x4117, 0x0040, 0x27c9, 0x1078, 0x3e87, 0x1078, 0x40d3,
-	0x1078, 0x4146, 0x0078, 0x279f, 0x1078, 0x3131, 0x0040, 0x27cd,
-	0x1078, 0x4017, 0x0040, 0x27c9, 0x62a0, 0x2019, 0x0005, 0x0c7e,
-	0x1078, 0x418b, 0x0c7f, 0x1078, 0x54f0, 0x087e, 0x2041, 0x0000,
-	0x1078, 0x5419, 0x2c08, 0x1078, 0x84d2, 0x087f, 0x1078, 0x4146,
-	0x0078, 0x279f, 0x1078, 0x3131, 0x0040, 0x27cd, 0x1078, 0x4146,
-	0x2208, 0x0078, 0x279f, 0x157e, 0x0d7e, 0x0e7e, 0x2069, 0x8913,
-	0x6810, 0x6914, 0xa10a, 0x00c8, 0x2a1f, 0x2009, 0x0000, 0x6816,
-	0x2011, 0x0000, 0x2019, 0x0000, 0x20a9, 0x00ff, 0x2069, 0x8934,
-	0x2d04, 0xa075, 0x0040, 0x2a34, 0x704c, 0x1078, 0x2a3e, 0xa210,
-	0x7080, 0x1078, 0x2a3e, 0xa318, 0x8d68, 0x00f0, 0x2a28, 0x2300,
-	0xa218, 0x0e7f, 0x0d7f, 0x157f, 0x0078, 0x279f, 0x0f7e, 0x017e,
-	0xa07d, 0x0040, 0x2a4d, 0x2001, 0x0000, 0x8000, 0x2f0c, 0x81ff,
-	0x0040, 0x2a4d, 0x2178, 0x0078, 0x2a45, 0x017f, 0x0f7f, 0x007c,
-	0x2069, 0x8913, 0x6910, 0x62a0, 0x0078, 0x279f, 0x81ff, 0x00c0,
-	0x27c9, 0x614c, 0xa190, 0x25b2, 0x2214, 0xa294, 0x00ff, 0x606c,
-	0xa084, 0xff00, 0xa215, 0x6368, 0x0078, 0x279f, 0x613c, 0x6240,
-	0x0078, 0x279f, 0x127e, 0x2091, 0x8000, 0x6134, 0xa006, 0x2010,
-	0x2018, 0x127f, 0x0078, 0x279f, 0x1078, 0x3143, 0x0040, 0x27cd,
-	0x6244, 0x6338, 0x0078, 0x279f, 0x613c, 0x6240, 0x7824, 0x603e,
-	0x7b28, 0x6342, 0x2069, 0x8851, 0x831f, 0xa305, 0x6816, 0x0078,
-	0x279f, 0x127e, 0x2091, 0x8000, 0x7824, 0x6036, 0x127f, 0x0078,
-	0x279f, 0x1078, 0x3143, 0x0040, 0x27cd, 0x7828, 0xa00d, 0x0040,
-	0x27cd, 0x782c, 0xa005, 0x0040, 0x27cd, 0x6244, 0x6146, 0x6338,
-	0x603a, 0x0078, 0x279f, 0x2001, 0x8800, 0x2004, 0xa086, 0x0003,
-	0x00c0, 0x27c9, 0x0c7e, 0x2061, 0x0100, 0x7924, 0x810f, 0xa18c,
-	0x00ff, 0xa196, 0x00ff, 0x00c0, 0x2aba, 0x6030, 0xa085, 0xff00,
-	0x0078, 0x2ac9, 0xa182, 0x007f, 0x00c8, 0x2aed, 0xa188, 0x25b2,
-	0x210c, 0xa18c, 0x00ff, 0x6030, 0xa116, 0x0040, 0x2aed, 0x810f,
-	0xa105, 0x127e, 0x2091, 0x8000, 0x007e, 0x1078, 0x68a8, 0x007f,
-	0x0040, 0x2aea, 0x601a, 0x600b, 0xbc09, 0x601f, 0x0001, 0x1078,
-	0x3119, 0x0040, 0x2af0, 0x6837, 0x0000, 0x7007, 0x0003, 0x701b,
-	0x279f, 0x2d00, 0x6012, 0x2009, 0x0032, 0x1078, 0x6939, 0x127f,
-	0x0c7f, 0x007c, 0x0c7f, 0x0078, 0x27c9, 0x0c7f, 0x0078, 0x27cd,
-	0x1078, 0x690e, 0x0078, 0x2aea, 0x2001, 0x8800, 0x2004, 0xa086,
-	0x0003, 0x00c0, 0x27c9, 0x0c7e, 0x2061, 0x0100, 0x7924, 0x810f,
-	0xa18c, 0x00ff, 0xa196, 0x00ff, 0x00c0, 0x2b0b, 0x6030, 0xa085,
-	0xff00, 0x0078, 0x2b1a, 0xa182, 0x007f, 0x00c8, 0x2b3e, 0xa188,
-	0x25b2, 0x210c, 0xa18c, 0x00ff, 0x6030, 0xa116, 0x0040, 0x2b3e,
-	0x810f, 0xa105, 0x127e, 0x2091, 0x8000, 0x007e, 0x1078, 0x68a8,
-	0x007f, 0x0040, 0x2b3b, 0x601a, 0x600b, 0xbc05, 0x601f, 0x0001,
-	0x1078, 0x3119, 0x0040, 0x2b41, 0x6837, 0x0000, 0x7007, 0x0003,
-	0x701b, 0x279f, 0x2d00, 0x6012, 0x2009, 0x0032, 0x1078, 0x6939,
-	0x127f, 0x0c7f, 0x007c, 0x0c7f, 0x0078, 0x27c9, 0x0c7f, 0x0078,
-	0x27cd, 0x1078, 0x690e, 0x0078, 0x2b3b, 0x2061, 0x8b24, 0x127e,
-	0x2091, 0x8000, 0x6000, 0xd084, 0x0040, 0x2b53, 0x6104, 0x6208,
-	0x127f, 0x0078, 0x279f, 0x127f, 0x0078, 0x27cd, 0x81ff, 0x00c0,
-	0x27c9, 0x127e, 0x2091, 0x8000, 0x6244, 0x6060, 0xa202, 0x0048,
-	0x2b6a, 0xa085, 0x0001, 0x1078, 0x2262, 0x1078, 0x36ef, 0x127f,
-	0x0078, 0x279f, 0x127f, 0x0078, 0x27cd, 0x7d38, 0x7c3c, 0x0078,
-	0x284c, 0x7824, 0xa09c, 0x00ff, 0xa39a, 0x0003, 0x00c8, 0x27c9,
-	0x624c, 0xa084, 0xff00, 0x8007, 0xa206, 0x00c0, 0x2b89, 0x2001,
-	0x8840, 0x2009, 0x000c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0078,
-	0x3167, 0x81ff, 0x00c0, 0x27c9, 0x1078, 0x3143, 0x0040, 0x27cd,
-	0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x27c9, 0x0c7e,
-	0x1078, 0x3119, 0x0c7f, 0x0040, 0x27c9, 0x6837, 0x0000, 0x6838,
-	0xc0fd, 0x683a, 0x1078, 0x792c, 0x0040, 0x27c9, 0x7007, 0x0003,
-	0x701b, 0x2bab, 0x007c, 0x6830, 0xa086, 0x0100, 0x0040, 0x27c9,
-	0xad80, 0x000e, 0x2009, 0x000c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38,
-	0x0078, 0x3167, 0x1078, 0x3119, 0x0040, 0x27c9, 0x1078, 0x3d16,
-	0x2009, 0x001c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x1078, 0x3163,
-	0x701b, 0x2bcb, 0x007c, 0xade8, 0x000d, 0x6800, 0xa005, 0x0040,
-	0x27cd, 0x6804, 0xd0ac, 0x0040, 0x2bd8, 0xd0a4, 0x0040, 0x27cd,
-	0xd094, 0x0040, 0x2be3, 0x0c7e, 0x2061, 0x0100, 0x6104, 0xa18c,
-	0xffdf, 0x6106, 0x0c7f, 0xd08c, 0x0040, 0x2bee, 0x0c7e, 0x2061,
-	0x0100, 0x6104, 0xa18d, 0x0010, 0x6106, 0x0c7f, 0x2009, 0x0100,
-	0x210c, 0xa18a, 0x0002, 0x0048, 0x2c03, 0xd084, 0x0040, 0x2c03,
-	0x6a28, 0xa28a, 0x007f, 0x00c8, 0x27cd, 0xa288, 0x25b2, 0x210c,
-	0xa18c, 0x00ff, 0x6152, 0xd0dc, 0x0040, 0x2c0c, 0x6828, 0xa08a,
-	0x007f, 0x00c8, 0x27cd, 0x604e, 0x6808, 0xa08a, 0x0100, 0x0048,
-	0x27cd, 0xa08a, 0x0841, 0x00c8, 0x27cd, 0xa084, 0x0007, 0x00c0,
-	0x27cd, 0x680c, 0xa005, 0x0040, 0x27cd, 0x6810, 0xa005, 0x0040,
-	0x27cd, 0x6848, 0x6940, 0xa10a, 0x00c8, 0x27cd, 0x8001, 0x0040,
-	0x27cd, 0x684c, 0x6944, 0xa10a, 0x00c8, 0x27cd, 0x8001, 0x0040,
-	0x27cd, 0x6804, 0xd0fc, 0x0040, 0x2c54, 0x1078, 0x3119, 0x0040,
-	0x27c9, 0x2009, 0x0014, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0xa290,
-	0x0038, 0xa399, 0x0000, 0x1078, 0x3163, 0x701b, 0x2c48, 0x007c,
-	0xade8, 0x000d, 0x20a9, 0x0014, 0x2d98, 0x2069, 0x886d, 0x2da0,
-	0x53a3, 0x7010, 0xa0e8, 0x000d, 0x20a9, 0x001c, 0x2d98, 0x2069,
-	0x8851, 0x2da0, 0x53a3, 0x6814, 0xa08c, 0x00ff, 0x613e, 0x8007,
-	0xa084, 0x00ff, 0x6042, 0x1078, 0x4793, 0x1078, 0x42d3, 0x1078,
-	0x4343, 0x6000, 0xa086, 0x0000, 0x00c0, 0x2cdf, 0x6808, 0x602a,
-	0x1078, 0x1f57, 0x6818, 0x691c, 0x6a20, 0x6b24, 0x8007, 0x810f,
-	0x8217, 0x831f, 0x6016, 0x611a, 0x621e, 0x6322, 0x6c04, 0xd4f4,
-	0x0040, 0x2c8c, 0x6830, 0x6934, 0x6a38, 0x6b3c, 0x8007, 0x810f,
-	0x8217, 0x831f, 0x0078, 0x2c8e, 0xa084, 0xf0ff, 0x6006, 0x610a,
-	0x620e, 0x6312, 0x1078, 0x518a, 0x6904, 0xd1fc, 0x0040, 0x2cc1,
-	0x0c7e, 0x2009, 0x0000, 0x20a9, 0x0001, 0x6b70, 0xd384, 0x0040,
-	0x2cbe, 0x0078, 0x2ca8, 0x839d, 0x00c8, 0x2cbe, 0x3508, 0x8109,
-	0x1078, 0x4cb2, 0x6878, 0x6016, 0x6874, 0x2008, 0xa084, 0xff00,
-	0x8007, 0x600a, 0xa184, 0x00ff, 0x6006, 0x8108, 0x00c0, 0x2cbc,
-	0x6003, 0x0003, 0x0078, 0x2cbe, 0x6003, 0x0001, 0x00f0, 0x2ca3,
-	0x0c7f, 0x0c7e, 0x2061, 0x0100, 0x602f, 0x0040, 0x602f, 0x0000,
-	0x0c7f, 0x1078, 0x3352, 0x0040, 0x2ccf, 0x1078, 0x2262, 0x60b8,
-	0xa005, 0x0040, 0x2cdb, 0x6003, 0x0001, 0x2091, 0x301d, 0x1078,
-	0x3c73, 0x0078, 0x2cdf, 0x6003, 0x0004, 0x2091, 0x301d, 0x0078,
-	0x279f, 0x6000, 0xa086, 0x0000, 0x0040, 0x27c9, 0x2069, 0x8851,
-	0x7830, 0x6842, 0x7834, 0x6846, 0x2d00, 0x2009, 0x001c, 0x7a2c,
-	0x7b28, 0x7c3c, 0x7d38, 0x0078, 0x3167, 0x81ff, 0x00c0, 0x27c9,
-	0xa006, 0x1078, 0x2262, 0x1078, 0x3d16, 0x1078, 0x3c73, 0x0078,
-	0x279f, 0x81ff, 0x00c0, 0x27c9, 0x6180, 0x81ff, 0x0040, 0x2d1b,
-	0x703f, 0x0000, 0x2001, 0x8ec0, 0x2009, 0x0040, 0x7a2c, 0x7b28,
-	0x7c3c, 0x7d38, 0x127e, 0x2091, 0x8000, 0x1078, 0x3167, 0x701b,
-	0x279c, 0x127f, 0x007c, 0x703f, 0x0001, 0x0d7e, 0x2069, 0x8ec0,
-	0x20a9, 0x0040, 0x20a1, 0x8ec0, 0x2019, 0xffff, 0x43a4, 0x654c,
-	0xa588, 0x25b2, 0x210c, 0xa18c, 0x00ff, 0x216a, 0xa00e, 0x2011,
-	0x0002, 0x2100, 0xa506, 0x0040, 0x2d4d, 0x1078, 0x3f8e, 0x00c0,
-	0x2d4d, 0x6014, 0x821c, 0x0048, 0x2d45, 0xa398, 0x8ec0, 0xa085,
-	0xff00, 0x8007, 0x201a, 0x0078, 0x2d4c, 0xa398, 0x8ec0, 0x2324,
-	0xa4a4, 0xff00, 0xa405, 0x201a, 0x8210, 0x8108, 0xa182, 0x0080,
-	0x00c8, 0x2d54, 0x0078, 0x2d31, 0x8201, 0x8007, 0x2d0c, 0xa105,
-	0x206a, 0x0d7f, 0x20a9, 0x0040, 0x20a1, 0x8ec0, 0x2099, 0x8ec0,
-	0x1078, 0x3cbc, 0x0078, 0x2d0a, 0x1078, 0x3143, 0x0040, 0x27cd,
-	0x0c7e, 0x1078, 0x3119, 0x0c7f, 0x00c0, 0x2d72, 0x2009, 0x0002,
-	0x0078, 0x27c9, 0x2001, 0x8852, 0x2004, 0xd0b4, 0x0040, 0x2d99,
-	0x6000, 0xd08c, 0x00c0, 0x2d99, 0x6004, 0xa084, 0x00ff, 0xa086,
-	0x0006, 0x00c0, 0x2d99, 0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a,
-	0x1078, 0x7980, 0x00c0, 0x2d90, 0x2009, 0x0003, 0x0078, 0x27c9,
-	0x7007, 0x0003, 0x701b, 0x2d95, 0x007c, 0x1078, 0x3143, 0x0040,
-	0x27cd, 0x20a9, 0x002b, 0x2c98, 0xade8, 0x0002, 0x2da0, 0x53a3,
-	0x20a9, 0x0004, 0xac80, 0x0006, 0x2098, 0xad80, 0x0006, 0x20a0,
-	0x1078, 0x3cbc, 0x20a9, 0x0004, 0xac80, 0x000a, 0x2098, 0xad80,
-	0x000a, 0x20a0, 0x1078, 0x3cbc, 0x2d00, 0x2009, 0x002b, 0x7a2c,
-	0x7b28, 0x7c3c, 0x7d38, 0x0078, 0x3167, 0x81ff, 0x00c0, 0x27c9,
-	0x1078, 0x3131, 0x0040, 0x27cd, 0x1078, 0x415f, 0x0078, 0x279f,
-	0x81ff, 0x00c0, 0x27c9, 0x7828, 0xa08a, 0x1000, 0x00c8, 0x27cd,
-	0x1078, 0x3143, 0x0040, 0x27cd, 0x1078, 0x41c7, 0x0040, 0x27c9,
-	0x2019, 0x0004, 0x1078, 0x4175, 0x7924, 0x810f, 0x7a28, 0x1078,
-	0x2de3, 0x0078, 0x279f, 0xa186, 0x00ff, 0x0040, 0x2deb, 0x1078,
-	0x2dfb, 0x0078, 0x2dfa, 0x2029, 0x007e, 0x2061, 0x8800, 0x644c,
-	0x2400, 0xa506, 0x0040, 0x2df7, 0x2508, 0x1078, 0x2dfb, 0x8529,
-	0x00c8, 0x2df0, 0x007c, 0x1078, 0x3f8e, 0x00c0, 0x2e06, 0x2200,
-	0x8003, 0x800b, 0x810b, 0xa108, 0x1078, 0x50ff, 0x007c, 0x81ff,
-	0x00c0, 0x27c9, 0x1078, 0x3131, 0x0040, 0x27cd, 0x1078, 0x4017,
-	0x0040, 0x27c9, 0x1078, 0x416a, 0x0078, 0x279f, 0x81ff, 0x00c0,
-	0x27c9, 0x1078, 0x3131, 0x0040, 0x27cd, 0x1078, 0x4017, 0x0040,
-	0x27c9, 0x1078, 0x4154, 0x0078, 0x279f, 0x6100, 0x0078, 0x279f,
-	0x1078, 0x3143, 0x0040, 0x27cd, 0x6004, 0xa086, 0x0707, 0x0040,
-	0x27cd, 0x2001, 0x8800, 0x2004, 0xa086, 0x0003, 0x00c0, 0x27c9,
-	0x0d7e, 0xace8, 0x000a, 0x7924, 0xd184, 0x0040, 0x2e41, 0xace8,
-	0x0006, 0x680c, 0x8007, 0x783e, 0x6808, 0x8007, 0x783a, 0x6b04,
-	0x831f, 0x6a00, 0x8217, 0x0d7f, 0x6100, 0xa18c, 0x0200, 0x0078,
-	0x279f, 0x7824, 0xa084, 0x00ff, 0xa086, 0x00ff, 0x0040, 0x2e5b,
-	0x81ff, 0x00c0, 0x27c9, 0xa006, 0x1078, 0x2262, 0x1078, 0x3d16,
-	0x7828, 0xa08a, 0x1000, 0x00c8, 0x27cd, 0x7924, 0xa18c, 0xff00,
-	0x810f, 0xa186, 0x00ff, 0x0040, 0x2e74, 0xa182, 0x007f, 0x00c8,
-	0x27cd, 0x2100, 0x1078, 0x225c, 0x027e, 0x0c7e, 0x127e, 0x2091,
-	0x8000, 0x2061, 0x8ab5, 0x601b, 0x0000, 0x601f, 0x0000, 0x2061,
-	0x0100, 0x6030, 0xa084, 0x00ff, 0x810f, 0xa105, 0x604a, 0x6043,
-	0x0090, 0x6043, 0x0010, 0x2009, 0x001e, 0x2011, 0x3c98, 0x1078,
-	0x5181, 0x7924, 0xa18c, 0xff00, 0x810f, 0x7a28, 0x1078, 0x2de3,
-	0x127f, 0x0c7f, 0x027f, 0x0078, 0x279f, 0x7924, 0xa18c, 0xff00,
-	0x810f, 0x0c7e, 0x1078, 0x3f53, 0x2c08, 0x0c7f, 0x00c0, 0x27cd,
-	0x0078, 0x279f, 0x81ff, 0x0040, 0x2eb1, 0x2009, 0x0001, 0x0078,
-	0x27c9, 0x60c0, 0xd09c, 0x00c0, 0x2eb9, 0x2009, 0x0005, 0x0078,
-	0x27c9, 0x1078, 0x3119, 0x00c0, 0x2ec1, 0x2009, 0x0002, 0x0078,
-	0x27c9, 0x7924, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x1078, 0x3163,
-	0x701b, 0x2ecb, 0x007c, 0x2009, 0x0080, 0x1078, 0x3f8e, 0x00c0,
-	0x2ed8, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x0040, 0x2edc,
-	0x2021, 0x400a, 0x0078, 0x27a1, 0x0d7e, 0xade8, 0x000d, 0x6900,
-	0x6a08, 0x6b0c, 0x6c10, 0x6d14, 0x6e18, 0x6820, 0xa0be, 0x0100,
-	0x0040, 0x2f4f, 0xa0be, 0x0112, 0x0040, 0x2f4f, 0xa0be, 0x0113,
-	0x0040, 0x2f4f, 0xa0be, 0x0114, 0x0040, 0x2f4f, 0xa0be, 0x0117,
-	0x0040, 0x2f4f, 0xa0be, 0x011a, 0x0040, 0x2f4f, 0xa0be, 0x0121,
-	0x0040, 0x2f45, 0xa0be, 0x0131, 0x0040, 0x2f45, 0xa0be, 0x0171,
-	0x0040, 0x2f4f, 0xa0be, 0x0173, 0x0040, 0x2f4f, 0xa0be, 0x01a1,
-	0x00c0, 0x2f17, 0x6830, 0x8007, 0x6832, 0x0078, 0x2f55, 0xa0be,
-	0x0212, 0x0040, 0x2f4b, 0xa0be, 0x0213, 0x0040, 0x2f4b, 0xa0be,
-	0x0214, 0x0040, 0x2f3d, 0xa0be, 0x0217, 0x0040, 0x2f37, 0xa0be,
-	0x021a, 0x00c0, 0x2f30, 0x6838, 0x8007, 0x683a, 0x0078, 0x2f4f,
-	0xa0be, 0x0300, 0x0040, 0x2f4f, 0x0d7f, 0x0078, 0x27cd, 0xad80,
-	0x0010, 0x20a9, 0x0007, 0x1078, 0x2f95, 0xad80, 0x000e, 0x20a9,
-	0x0001, 0x1078, 0x2f95, 0x0078, 0x2f4f, 0xad80, 0x000c, 0x1078,
-	0x2fa3, 0x0078, 0x2f55, 0xad80, 0x000e, 0x1078, 0x2fa3, 0xad80,
-	0x000c, 0x20a9, 0x0001, 0x1078, 0x2f95, 0x0c7e, 0x1078, 0x3119,
-	0x0040, 0x2f86, 0x6838, 0xc0fd, 0x683a, 0x6837, 0x0119, 0x6853,
-	0x0000, 0x684f, 0x0020, 0x685b, 0x0001, 0x810b, 0x697e, 0x6883,
-	0x0000, 0x6a86, 0x6b8a, 0x6c8e, 0x6d92, 0x6996, 0x689b, 0x0000,
-	0x0c7f, 0x0d7f, 0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x6823,
-	0x0000, 0x1078, 0x7948, 0x00c0, 0x2f81, 0x2009, 0x0003, 0x0078,
-	0x27c9, 0x7007, 0x0003, 0x701b, 0x2f8c, 0x007c, 0x0c7f, 0x0d7f,
-	0x2009, 0x0002, 0x0078, 0x27c9, 0x6820, 0xa086, 0x8001, 0x00c0,
-	0x279f, 0x2009, 0x0004, 0x0078, 0x27c9, 0x017e, 0x2008, 0x2044,
-	0x8000, 0x204c, 0x8000, 0x290a, 0x8108, 0x280a, 0x8108, 0x00f0,
-	0x2f97, 0x017f, 0x007c, 0x017e, 0x0a7e, 0x0b7e, 0x2008, 0x2044,
-	0x8000, 0x204c, 0x8000, 0x2054, 0x8000, 0x205c, 0x2b0a, 0x8108,
-	0x2a0a, 0x8108, 0x290a, 0x8108, 0x280a, 0x0b7f, 0x0a7f, 0x017f,
-	0x007c, 0x81ff, 0x0040, 0x2fc0, 0x2009, 0x0001, 0x0078, 0x27c9,
-	0x7924, 0x2140, 0xa18c, 0xff00, 0x810f, 0xa182, 0x0080, 0x0048,
-	0x27cd, 0xa182, 0x00ff, 0x00c8, 0x27cd, 0x7a2c, 0x7b28, 0x6068,
-	0xa306, 0x00c0, 0x2fdb, 0x606c, 0xa24e, 0x0040, 0x27cd, 0xa9cc,
-	0xff00, 0x0040, 0x27cd, 0x0c7e, 0x1078, 0x3071, 0x2c68, 0x0c7f,
-	0x0040, 0x3002, 0xa0c6, 0x4000, 0x00c0, 0x2fe8, 0x0078, 0x2fff,
-	0xa0c6, 0x4007, 0x00c0, 0x2fef, 0x2408, 0x0078, 0x2fff, 0xa0c6,
-	0x4008, 0x00c0, 0x2ff7, 0x2708, 0x2610, 0x0078, 0x2fff, 0xa0c6,
-	0x4009, 0x00c0, 0x2ffd, 0x0078, 0x2fff, 0x2001, 0x4006, 0x2020,
-	0x0078, 0x27a1, 0x2d00, 0x7022, 0x017e, 0x0b7e, 0x0c7e, 0x0e7e,
-	0x2c70, 0x1078, 0x68a8, 0x0040, 0x304f, 0x2d00, 0x601a, 0x2001,
-	0x8856, 0x2004, 0xa084, 0x00ff, 0x6842, 0x2e58, 0x0e7f, 0x0e7e,
-	0x0c7e, 0x1078, 0x3119, 0x0c7f, 0x2b70, 0x00c0, 0x3029, 0x1078,
-	0x690e, 0x0e7f, 0x0c7f, 0x0b7f, 0x017f, 0x2009, 0x0002, 0x0078,
-	0x27c9, 0x6837, 0x0000, 0x2d00, 0x6012, 0x6833, 0x0000, 0x6838,
-	0xc0fd, 0x683a, 0x127e, 0x2091, 0x8000, 0x1078, 0x24bf, 0x127f,
-	0x601f, 0x0001, 0x2001, 0x0000, 0x1078, 0x3ef1, 0x2001, 0x0002,
-	0x1078, 0x3f05, 0x127e, 0x2091, 0x8000, 0x708c, 0x8000, 0x708e,
-	0x127f, 0x2009, 0x0002, 0x1078, 0x6939, 0xa085, 0x0001, 0x0e7f,
-	0x0c7f, 0x0b7f, 0x017f, 0x00c0, 0x3059, 0x2009, 0x0003, 0x0078,
-	0x27c9, 0x7007, 0x0003, 0x701b, 0x305e, 0x007c, 0x6830, 0xa086,
-	0x0100, 0x2009, 0x0004, 0x0040, 0x27c9, 0x7020, 0x2060, 0x2009,
-	0x0000, 0x1078, 0x4233, 0x00c0, 0x306f, 0x2009, 0x0001, 0x0078,
-	0x279f, 0x0e7e, 0x0d7e, 0x2029, 0x0000, 0x2021, 0x0080, 0x20a9,
-	0x007f, 0x2071, 0x89b4, 0x2e04, 0xa005, 0x00c0, 0x3086, 0x2100,
-	0xa406, 0x00c0, 0x30b7, 0x2428, 0x0078, 0x30b7, 0x2068, 0x6f10,
-	0x2700, 0xa306, 0x00c0, 0x30a8, 0x6e14, 0x2600, 0xa206, 0x00c0,
-	0x30a8, 0x2400, 0xa106, 0x00c0, 0x30a4, 0x2d60, 0xd884, 0x0040,
-	0x30cc, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x30cc,
-	0x2001, 0x4000, 0x0078, 0x30cd, 0x2001, 0x4007, 0x0078, 0x30cd,
-	0x2400, 0xa106, 0x00c0, 0x30b7, 0x6e14, 0x87ff, 0x00c0, 0x30b3,
-	0x86ff, 0x0040, 0x3083, 0x2001, 0x4008, 0x0078, 0x30cd, 0x8420,
-	0x8e70, 0x00f0, 0x307b, 0x85ff, 0x00c0, 0x30c6, 0x2001, 0x4009,
-	0x0078, 0x30cd, 0x2001, 0x0001, 0x0078, 0x30cd, 0x1078, 0x3f53,
-	0x00c0, 0x30c2, 0x6312, 0x6216, 0xa006, 0xa005, 0x0d7f, 0x0e7f,
-	0x007c, 0x81ff, 0x00c0, 0x27c9, 0x1078, 0x3119, 0x0040, 0x27c9,
-	0x6837, 0x0000, 0x7824, 0xa005, 0x0040, 0x27cd, 0xa096, 0x00ff,
-	0x0040, 0x30e6, 0xa092, 0x0004, 0x00c8, 0x27cd, 0x2010, 0x2d18,
-	0x1078, 0x2481, 0x0040, 0x27c9, 0x7007, 0x0003, 0x701b, 0x30f1,
-	0x007c, 0x6830, 0xa086, 0x0100, 0x0040, 0x27c9, 0x0078, 0x279f,
-	0x7924, 0xa18c, 0xff00, 0x810f, 0xa182, 0x0080, 0x0048, 0x27cd,
-	0xa182, 0x00ff, 0x00c8, 0x27cd, 0x127e, 0x2091, 0x8000, 0x1078,
-	0x782e, 0x00c0, 0x3116, 0xa190, 0x8934, 0x2204, 0xa065, 0x0040,
-	0x3116, 0x1078, 0x3d31, 0x127f, 0x0078, 0x279f, 0x127f, 0x0078,
-	0x27c9, 0x1078, 0x132b, 0x0040, 0x3130, 0xa006, 0x6802, 0x7010,
-	0xa005, 0x00c0, 0x3128, 0x2d00, 0x7012, 0x7016, 0x0078, 0x312e,
-	0x7014, 0x6802, 0x2060, 0x2d00, 0x6006, 0x7016, 0xad80, 0x000d,
-	0x007c, 0x7924, 0x810f, 0xa18c, 0x00ff, 0x1078, 0x3f8e, 0x00c0,
-	0x3140, 0x7e28, 0xa684, 0x3fff, 0xa082, 0x4000, 0x0048, 0x3141,
-	0xa066, 0x8cff, 0x007c, 0x7e24, 0x860f, 0xa18c, 0x00ff, 0x1078,
-	0x3f8e, 0x00c0, 0x3151, 0xa6b4, 0x00ff, 0xa682, 0x4000, 0x0048,
-	0x3152, 0xa066, 0x8cff, 0x007c, 0x017e, 0x7110, 0x81ff, 0x0040,
-	0x315f, 0x2168, 0x6904, 0x1078, 0x1344, 0x0078, 0x3156, 0x7112,
-	0x7116, 0x017f, 0x007c, 0x2031, 0x0001, 0x0078, 0x3169, 0x2031,
-	0x0000, 0x2061, 0x88d1, 0x6606, 0x6112, 0x600e, 0x6226, 0x632a,
-	0x642e, 0x6532, 0x2c10, 0x1078, 0x137b, 0x7007, 0x0002, 0x701b,
-	0x279f, 0x007c, 0x0f7e, 0x127e, 0x2091, 0x8000, 0x2079, 0x0000,
-	0x2001, 0x888f, 0x2004, 0xa005, 0x00c0, 0x3195, 0x0068, 0x3195,
-	0x7818, 0xd084, 0x00c0, 0x3195, 0x7a22, 0x7b26, 0x7c2a, 0x781b,
-	0x0001, 0x2091, 0x4080, 0x0078, 0x31ba, 0x017e, 0x0c7e, 0x0e7e,
-	0x2071, 0x8881, 0x7138, 0xa182, 0x0008, 0x0048, 0x31a3, 0x7030,
-	0x2060, 0x0078, 0x31b4, 0x7030, 0xa0e0, 0x0008, 0xac82, 0x88d1,
-	0x0048, 0x31ac, 0x2061, 0x8891, 0x2c00, 0x7032, 0x81ff, 0x00c0,
-	0x31b2, 0x7036, 0x8108, 0x713a, 0x2262, 0x6306, 0x640a, 0x0e7f,
-	0x0c7f, 0x017f, 0x127f, 0x0f7f, 0x007c, 0x0e7e, 0x2071, 0x8881,
-	0x7038, 0xa005, 0x0040, 0x31f6, 0x127e, 0x2091, 0x8000, 0x0068,
-	0x31f5, 0x0f7e, 0x2079, 0x0000, 0x7818, 0xd084, 0x00c0, 0x31f4,
-	0x0c7e, 0x7034, 0x2060, 0x2c04, 0x7822, 0x6004, 0x7826, 0x6008,
-	0x782a, 0x781b, 0x0001, 0x2091, 0x4080, 0x7038, 0x8001, 0x703a,
-	0xa005, 0x00c0, 0x31ea, 0x7033, 0x8891, 0x7037, 0x8891, 0x0c7f,
-	0x0078, 0x31f4, 0xac80, 0x0008, 0xa0fa, 0x88d1, 0x0048, 0x31f2,
-	0x2001, 0x8891, 0x7036, 0x0c7f, 0x0f7f, 0x127f, 0x0e7f, 0x007c,
-	0x027e, 0x2001, 0x8852, 0x2004, 0xd0c4, 0x0040, 0x3203, 0x2011,
-	0x8014, 0x1078, 0x317a, 0x027f, 0x007c, 0x81ff, 0x00c0, 0x27c9,
-	0x127e, 0x2091, 0x8000, 0x6030, 0xc08d, 0xc0ac, 0x6032, 0x1078,
-	0x3c73, 0x127f, 0x0078, 0x279f, 0x7824, 0x2008, 0xa18c, 0xfffd,
-	0x00c0, 0x321f, 0x61cc, 0xa10d, 0x61ce, 0x0078, 0x279f, 0x0078,
-	0x27cd, 0x81ff, 0x00c0, 0x27c9, 0x6000, 0xa086, 0x0003, 0x00c0,
-	0x27c9, 0x2001, 0x8852, 0x2004, 0xd0a4, 0x00c0, 0x27c9, 0x1078,
-	0x3143, 0x0040, 0x27cd, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006,
-	0x00c0, 0x323e, 0x7828, 0xa005, 0x0040, 0x279f, 0x0c7e, 0x1078,
-	0x3119, 0x0c7f, 0x0040, 0x27c9, 0x6837, 0x0000, 0x6833, 0x0000,
-	0x6838, 0xc0fd, 0x683a, 0x1078, 0x79ed, 0x0040, 0x27c9, 0x7007,
-	0x0003, 0x701b, 0x3254, 0x007c, 0x6830, 0xa086, 0x0100, 0x0040,
-	0x27c9, 0x0078, 0x279f, 0x2001, 0x8800, 0x2004, 0xa086, 0x0003,
-	0x00c0, 0x27c9, 0x7f24, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x1078,
-	0x3119, 0x0040, 0x27c9, 0x2009, 0x0000, 0x2031, 0x0000, 0x7023,
-	0x0000, 0x702f, 0x0000, 0xad80, 0x0005, 0x7026, 0x20a0, 0x1078,
-	0x3f8e, 0x00c0, 0x32ad, 0x6004, 0xa0c4, 0x00ff, 0xa8c6, 0x0006,
-	0x0040, 0x3288, 0xa0c4, 0xff00, 0xa8c6, 0x0600, 0x00c0, 0x32ad,
-	0x2001, 0x8852, 0x2004, 0xd0ac, 0x00c0, 0x3292, 0x1078, 0x4233,
-	0x0040, 0x32ad, 0xd784, 0x0040, 0x32a0, 0xac80, 0x0006, 0x2098,
-	0x3400, 0x20a9, 0x0004, 0x53a3, 0x1078, 0x2fa3, 0x0078, 0x32a9,
-	0xac80, 0x000a, 0x2098, 0x3400, 0x20a9, 0x0004, 0x53a3, 0x1078,
-	0x2fa3, 0x21a2, 0x94a0, 0xa6b0, 0x0005, 0x8108, 0xd78c, 0x0040,
-	0x32b7, 0xa186, 0x0100, 0x0040, 0x32c1, 0x0078, 0x32bb, 0xa186,
-	0x007e, 0x0040, 0x32c1, 0xa686, 0x0028, 0x0040, 0x32ca, 0x0078,
-	0x3277, 0x86ff, 0x00c0, 0x32c8, 0x7120, 0x810b, 0x0078, 0x279f,
-	0x702f, 0x0001, 0x711e, 0x7020, 0xa600, 0x7022, 0x772a, 0x2061,
-	0x88d1, 0x6007, 0x0000, 0x6612, 0x7024, 0x600e, 0x6226, 0x632a,
-	0x642e, 0x6532, 0x2c10, 0x1078, 0x137b, 0x7007, 0x0002, 0x701b,
-	0x32e2, 0x007c, 0x702c, 0xa005, 0x00c0, 0x32f4, 0x711c, 0x7024,
-	0x20a0, 0x7728, 0x2031, 0x0000, 0x2061, 0x88d1, 0x6224, 0x6328,
-	0x642c, 0x6530, 0x0078, 0x3277, 0x7120, 0x810b, 0x0078, 0x279f,
-	0x2029, 0x007e, 0x7924, 0x7a28, 0x7b2c, 0x7c38, 0xa184, 0xff00,
-	0x8007, 0xa0e2, 0x0020, 0x0048, 0x27cd, 0xa502, 0x0048, 0x27cd,
-	0xa184, 0x00ff, 0xa0e2, 0x0020, 0x0048, 0x27cd, 0xa502, 0x0048,
-	0x27cd, 0xa284, 0xff00, 0x8007, 0xa0e2, 0x0020, 0x0048, 0x27cd,
-	0xa502, 0x0048, 0x27cd, 0xa284, 0x00ff, 0xa0e2, 0x0020, 0x0048,
-	0x27cd, 0xa502, 0x0048, 0x27cd, 0xa384, 0xff00, 0x8007, 0xa0e2,
-	0x0020, 0x0048, 0x27cd, 0xa502, 0x0048, 0x27cd, 0xa384, 0x00ff,
-	0xa0e2, 0x0020, 0x0048, 0x27cd, 0xa502, 0x0048, 0x27cd, 0xa484,
-	0xff00, 0x8007, 0xa0e2, 0x0020, 0x0048, 0x27cd, 0xa502, 0x0048,
-	0x27cd, 0xa484, 0x00ff, 0xa0e2, 0x0020, 0x0048, 0x27cd, 0xa502,
-	0x0048, 0x27cd, 0x2061, 0x8a9c, 0x6102, 0x6206, 0x630a, 0x640e,
-	0x0078, 0x279f, 0x007e, 0x2001, 0x8852, 0x2004, 0xd0cc, 0x007f,
-	0x007c, 0x007e, 0x2001, 0x8871, 0x2004, 0xd0bc, 0x007f, 0x007c,
-	0x6160, 0x7a24, 0x6300, 0x82ff, 0x00c0, 0x3369, 0x7926, 0x0078,
-	0x279f, 0x83ff, 0x00c0, 0x27cd, 0x2001, 0xfff0, 0xa200, 0x00c8,
-	0x27cd, 0x2019, 0xffff, 0x6064, 0xa302, 0xa200, 0x0048, 0x27cd,
-	0x7926, 0x6262, 0x0078, 0x279f, 0x2001, 0x8800, 0x2004, 0xa086,
-	0x0003, 0x00c0, 0x27c9, 0x7c28, 0x7d24, 0x7e38, 0x7f2c, 0x1078,
-	0x3119, 0x0040, 0x27c9, 0x2009, 0x0000, 0x2019, 0x0000, 0x7023,
-	0x0000, 0x702f, 0x0000, 0xad80, 0x0003, 0x7026, 0x20a0, 0xa1e0,
-	0x8934, 0x2c64, 0x8cff, 0x0040, 0x33b6, 0x6004, 0xa084, 0x00ff,
-	0xa086, 0x0006, 0x0040, 0x33ab, 0x6004, 0xa084, 0xff00, 0xa086,
-	0x0600, 0x00c0, 0x33b6, 0x6014, 0x20a2, 0x94a0, 0x6010, 0x8007,
-	0xa105, 0x8007, 0x20a2, 0x94a0, 0xa398, 0x0002, 0x8108, 0xa182,
-	0x00ff, 0x0040, 0x33c1, 0xa386, 0x002a, 0x0040, 0x33ca, 0x0078,
-	0x3397, 0x83ff, 0x00c0, 0x33c8, 0x7120, 0x810c, 0x0078, 0x279f,
-	0x702f, 0x0001, 0x711e, 0x7020, 0xa300, 0x7022, 0x2061, 0x88d1,
-	0x6007, 0x0000, 0x6312, 0x7024, 0x600e, 0x6426, 0x652a, 0x662e,
-	0x6732, 0x2c10, 0x1078, 0x137b, 0x7007, 0x0002, 0x701b, 0x33e1,
-	0x007c, 0x702c, 0xa005, 0x00c0, 0x33f2, 0x711c, 0x7024, 0x20a0,
-	0x2019, 0x0000, 0x2061, 0x88d1, 0x6424, 0x6528, 0x662c, 0x6730,
-	0x0078, 0x3397, 0x7120, 0x810c, 0x0078, 0x279f, 0x81ff, 0x00c0,
-	0x27c9, 0x60c0, 0xd09c, 0x0040, 0x27c9, 0x1078, 0x3119, 0x0040,
-	0x27c9, 0x7924, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x1078, 0x3163,
-	0x701b, 0x340b, 0x007c, 0x0d7e, 0xade8, 0x000d, 0x6828, 0xa0be,
-	0x7000, 0x0040, 0x341e, 0xa0be, 0x7100, 0x0040, 0x341e, 0xa0be,
-	0x7200, 0x0040, 0x341e, 0x0d7f, 0x0078, 0x27cd, 0x6820, 0x6924,
-	0x1078, 0x2245, 0x00c0, 0x3447, 0x1078, 0x3f53, 0x00c0, 0x3447,
-	0x7122, 0x6612, 0x6516, 0x6e18, 0x0c7e, 0x1078, 0x3119, 0x0040,
-	0x3447, 0x1078, 0x3119, 0x0040, 0x3447, 0x0c7f, 0x0d7f, 0x6837,
-	0x0000, 0x6838, 0xc0fd, 0x683a, 0x6823, 0x0000, 0x1078, 0x7964,
-	0x0040, 0x27c9, 0x7007, 0x0003, 0x701b, 0x344a, 0x007c, 0x0d7f,
-	0x0078, 0x27c9, 0x7120, 0x1078, 0x3f76, 0x6820, 0xa086, 0x8001,
-	0x0040, 0x27c9, 0x2d00, 0x701e, 0x6804, 0xa080, 0x0002, 0x007e,
-	0x20a9, 0x002a, 0x2098, 0x20a0, 0x1078, 0x3cbc, 0x007f, 0xade8,
-	0x000d, 0x6a08, 0x6b0c, 0x6c10, 0x6d14, 0x2061, 0x88d1, 0x6007,
-	0x0000, 0x6e00, 0x6f28, 0xa7c6, 0x7000, 0x00c0, 0x3471, 0x0078,
-	0x3475, 0xa7c6, 0x7100, 0x00c0, 0x347d, 0xa6c2, 0x0004, 0x0048,
-	0x27cd, 0x2009, 0x0004, 0x0078, 0x3167, 0xa7c6, 0x7200, 0x00c0,
-	0x27cd, 0xa6c2, 0x0054, 0x0048, 0x27cd, 0x600e, 0x6013, 0x002a,
-	0x6226, 0x632a, 0x642e, 0x6532, 0x2c10, 0x1078, 0x137b, 0x7007,
-	0x0002, 0x701b, 0x3494, 0x007c, 0x701c, 0x2068, 0x6804, 0xa080,
-	0x0001, 0x2004, 0xa080, 0x0002, 0x007e, 0x20a9, 0x002a, 0x2098,
-	0x20a0, 0x1078, 0x3cbc, 0x007f, 0x2009, 0x002a, 0x2061, 0x88d1,
-	0x6224, 0x6328, 0x642c, 0x6530, 0x0078, 0x3167, 0x81ff, 0x00c0,
-	0x27c9, 0x1078, 0x3131, 0x0040, 0x27cd, 0x1078, 0x4017, 0x0040,
-	0x27c9, 0x1078, 0x4180, 0x0078, 0x279f, 0x7824, 0xd084, 0x0040,
-	0x2d64, 0x1078, 0x3143, 0x0040, 0x27cd, 0x0c7e, 0x1078, 0x3119,
-	0x0c7f, 0x00c0, 0x34cf, 0x2009, 0x0002, 0x0078, 0x27c9, 0x6004,
-	0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x34f8, 0x2001, 0x8852,
-	0x2004, 0xd0b4, 0x0040, 0x2d99, 0x6000, 0xd08c, 0x00c0, 0x2d99,
-	0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x1078, 0x7980, 0x00c0,
-	0x34ed, 0x2009, 0x0003, 0x0078, 0x27c9, 0x7007, 0x0003, 0x701b,
-	0x34f2, 0x007c, 0x1078, 0x3143, 0x0040, 0x27cd, 0x0078, 0x2d99,
-	0x2009, 0x882d, 0x210c, 0x81ff, 0x0040, 0x3502, 0x2009, 0x0001,
-	0x0078, 0x27c9, 0x2001, 0x8800, 0x2004, 0xa086, 0x0003, 0x0040,
-	0x350d, 0x2009, 0x0007, 0x0078, 0x27c9, 0x2001, 0x8852, 0x2004,
-	0xd0ac, 0x0040, 0x3517, 0x2009, 0x0008, 0x0078, 0x27c9, 0x609c,
-	0xd0a4, 0x00c0, 0x351e, 0xd0ac, 0x00c0, 0x2d99, 0x6837, 0x0000,
-	0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x1078, 0x79ed, 0x00c0,
-	0x352d, 0x2009, 0x0003, 0x0078, 0x27c9, 0x7007, 0x0003, 0x701b,
-	0x3532, 0x007c, 0x6830, 0xa086, 0x0100, 0x00c0, 0x353b, 0x2009,
-	0x0004, 0x0078, 0x27c9, 0x1078, 0x3143, 0x0040, 0x27cd, 0x0078,
-	0x34d6, 0x127e, 0x0c7e, 0x0e7e, 0x2061, 0x0100, 0x2071, 0x8800,
-	0x6044, 0xd0a4, 0x00c0, 0x356a, 0xd084, 0x0040, 0x3553, 0x1078,
-	0x36c6, 0x0078, 0x3566, 0xd08c, 0x0040, 0x355a, 0x1078, 0x35dd,
-	0x0078, 0x3566, 0xd094, 0x0040, 0x3561, 0x1078, 0x35b1, 0x0078,
-	0x3566, 0xd09c, 0x0040, 0x3566, 0x1078, 0x3574, 0x0e7f, 0x0c7f,
-	0x127f, 0x007c, 0x017e, 0x6128, 0xd19c, 0x00c0, 0x3571, 0xc19d,
-	0x612a, 0x017f, 0x0078, 0x3566, 0x624c, 0xa286, 0xf0f0, 0x00c0,
-	0x3585, 0x6048, 0xa086, 0xf0f0, 0x0040, 0x3585, 0x624a, 0x6043,
-	0x0090, 0x6043, 0x0010, 0x0078, 0x35b0, 0xa294, 0xff00, 0xa296,
-	0xf700, 0x0040, 0x3596, 0x6240, 0xa294, 0x0010, 0x0040, 0x3596,
-	0x2009, 0x00f7, 0x1078, 0x3cdc, 0x0078, 0x35b0, 0x6043, 0x0040,
-	0x6043, 0x0000, 0x7073, 0x0000, 0x708b, 0x0001, 0x70ab, 0x0000,
-	0x70c3, 0x0000, 0x2009, 0x8ec0, 0x200b, 0x0000, 0x7083, 0x0000,
-	0x7077, 0x000f, 0x2009, 0x000f, 0x2011, 0x3c2e, 0x1078, 0x5181,
-	0x007c, 0x157e, 0x7074, 0xa005, 0x00c0, 0x35db, 0x2011, 0x3c2e,
-	0x1078, 0x50f2, 0x6040, 0xa094, 0x0010, 0xa285, 0x0020, 0x6042,
-	0x20a9, 0x00c8, 0x6044, 0xd08c, 0x00c0, 0x35d4, 0x00f0, 0x35c2,
-	0x6242, 0x7087, 0x0000, 0x6040, 0xa094, 0x0010, 0xa285, 0x0080,
-	0x6042, 0x6242, 0x0078, 0x35db, 0x6242, 0x7087, 0x0000, 0x707b,
-	0x0000, 0x0078, 0x35db, 0x157f, 0x007c, 0x7078, 0xa08a, 0x0003,
-	0x00c8, 0x35e6, 0x1079, 0x35e9, 0x0078, 0x35e8, 0x1078, 0x12d2,
-	0x007c, 0x35ec, 0x363b, 0x36c5, 0x0f7e, 0x707b, 0x0001, 0x20e1,
-	0xa000, 0x20e1, 0x8700, 0x1078, 0x1f57, 0x20e1, 0x9080, 0x20e1,
-	0x4000, 0x2079, 0x8d00, 0x207b, 0x2200, 0x7807, 0x00ef, 0x780b,
-	0x0000, 0x780f, 0x00ef, 0x7813, 0x0138, 0x7817, 0x0000, 0x781b,
-	0x0000, 0x781f, 0x0000, 0x7823, 0xffff, 0x7827, 0xffff, 0x782b,
-	0x0000, 0x782f, 0x0000, 0x2079, 0x8d0c, 0x207b, 0x1101, 0x7807,
-	0x0000, 0x2099, 0x8805, 0x20a1, 0x8d0e, 0x20a9, 0x0004, 0x53a3,
-	0x2079, 0x8d12, 0x207b, 0x0000, 0x7807, 0x0000, 0x2099, 0x8d00,
-	0x20a1, 0x020b, 0x20a9, 0x0014, 0x53a6, 0x60c3, 0x000c, 0x600f,
-	0x0000, 0x1078, 0x3c5a, 0x0f7f, 0x707f, 0x0000, 0x6043, 0x0008,
-	0x6043, 0x0000, 0x007c, 0x0d7e, 0x707c, 0x707f, 0x0000, 0xa025,
-	0x0040, 0x36af, 0x6020, 0xd0b4, 0x00c0, 0x36ad, 0x7188, 0x81ff,
-	0x0040, 0x3696, 0xa486, 0x000c, 0x00c0, 0x36a1, 0xa480, 0x0018,
-	0x8004, 0x20a8, 0x2011, 0x8d80, 0x2019, 0x8d00, 0x220c, 0x2304,
-	0xa106, 0x00c0, 0x366d, 0x8210, 0x8318, 0x00f0, 0x3656, 0x6043,
-	0x0004, 0x608b, 0xbc94, 0x608f, 0xf0f0, 0x6043, 0x0006, 0x707b,
-	0x0002, 0x7087, 0x0002, 0x0078, 0x36ad, 0x2069, 0x8d80, 0x6930,
-	0xa18e, 0x1101, 0x00c0, 0x36a1, 0x6834, 0xa005, 0x00c0, 0x36a1,
-	0x6900, 0xa18c, 0x00ff, 0x00c0, 0x3681, 0x6804, 0xa005, 0x0040,
-	0x3696, 0x2011, 0x8d8e, 0x2019, 0x8805, 0x20a9, 0x0004, 0x220c,
-	0x2304, 0xa102, 0x0048, 0x3694, 0x00c0, 0x36a1, 0x8210, 0x8318,
-	0x00f0, 0x3687, 0x0078, 0x36a1, 0x708b, 0x0000, 0x20e1, 0x9080,
-	0x20e1, 0x4000, 0x2099, 0x8d80, 0x20a1, 0x020b, 0x20a9, 0x0014,
-	0x53a6, 0x6043, 0x0008, 0x6043, 0x0000, 0x6020, 0xd0b4, 0x00c0,
-	0x36ad, 0x60c3, 0x000c, 0x1078, 0x3c5a, 0x0d7f, 0x007c, 0x6020,
-	0xd0b4, 0x00c0, 0x36ad, 0x60c3, 0x000c, 0x2011, 0x8aac, 0x2013,
-	0x0000, 0x707f, 0x0000, 0x20e1, 0x9080, 0x60a3, 0x0056, 0x60a7,
-	0x9575, 0x1078, 0x6229, 0x0078, 0x36ad, 0x007c, 0x7084, 0xa08a,
-	0x001d, 0x00c8, 0x36cf, 0x1079, 0x36d2, 0x0078, 0x36d1, 0x1078,
-	0x12d2, 0x007c, 0x36fc, 0x370b, 0x373c, 0x3751, 0x3781, 0x37ad,
-	0x37dd, 0x3813, 0x3843, 0x386b, 0x38b4, 0x38de, 0x3902, 0x3918,
-	0x3940, 0x3953, 0x395c, 0x3988, 0x39b6, 0x39e2, 0x3a10, 0x3a46,
-	0x3a8f, 0x3abe, 0x3ae0, 0x3b22, 0x3b48, 0x3b61, 0x3b62, 0x0c7e,
-	0x2061, 0x8800, 0x6003, 0x0007, 0x2061, 0x0100, 0x6004, 0xa084,
-	0xfff9, 0x6006, 0x0c7f, 0x007c, 0x608b, 0xbc94, 0x608f, 0xf0f0,
-	0x6043, 0x0002, 0x7087, 0x0001, 0x2009, 0x07d0, 0x2011, 0x3c35,
-	0x1078, 0x50e5, 0x007c, 0x0f7e, 0x707c, 0xa086, 0x0014, 0x00c0,
-	0x373a, 0x6043, 0x0000, 0x6020, 0xd0b4, 0x00c0, 0x373a, 0x2079,
-	0x8d80, 0x7a30, 0xa296, 0x1102, 0x00c0, 0x3738, 0x7834, 0xa005,
-	0x00c0, 0x3738, 0x7a38, 0xd2fc, 0x0040, 0x372e, 0x70a8, 0xa005,
-	0x00c0, 0x372e, 0x1078, 0x3cf3, 0x70ab, 0x0001, 0x2011, 0x3c35,
-	0x1078, 0x50f2, 0x7087, 0x0010, 0x1078, 0x395c, 0x0078, 0x373a,
-	0x707f, 0x0000, 0x0f7f, 0x007c, 0x7087, 0x0003, 0x6043, 0x0004,
-	0x1078, 0x3cc4, 0x20a3, 0x1102, 0x20a3, 0x0000, 0x20a9, 0x000a,
-	0x20a3, 0x0000, 0x00f0, 0x3748, 0x60c3, 0x0014, 0x1078, 0x3c5a,
-	0x007c, 0x0f7e, 0x707c, 0xa005, 0x0040, 0x377f, 0x2011, 0x3c35,
-	0x1078, 0x50f2, 0xa086, 0x0014, 0x00c0, 0x377b, 0x2079, 0x8d80,
-	0x7a30, 0xa296, 0x1102, 0x00c0, 0x377b, 0x7834, 0xa005, 0x00c0,
-	0x377b, 0x7a38, 0xd2fc, 0x0040, 0x3775, 0x70a8, 0xa005, 0x00c0,
-	0x3775, 0x1078, 0x3cf3, 0x70ab, 0x0001, 0x7087, 0x0004, 0x1078,
-	0x3781, 0x0078, 0x377f, 0x7087, 0x0002, 0x707f, 0x0000, 0x0f7f,
-	0x007c, 0x7087, 0x0005, 0x1078, 0x3cc4, 0x20a3, 0x1103, 0x20a3,
-	0x0000, 0x3430, 0x2011, 0x8d8e, 0x1078, 0x3d0d, 0x00c0, 0x379f,
-	0x7070, 0xa005, 0x00c0, 0x379f, 0x714c, 0xa186, 0xffff, 0x0040,
-	0x379f, 0x1078, 0x3bf9, 0x0040, 0x379f, 0x1078, 0x3cf3, 0x20a9,
-	0x0008, 0x2298, 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000,
-	0x60c3, 0x0014, 0x1078, 0x3c5a, 0x007c, 0x0f7e, 0x707c, 0xa005,
-	0x0040, 0x37db, 0x2011, 0x3c35, 0x1078, 0x50f2, 0xa086, 0x0014,
-	0x00c0, 0x37d7, 0x2079, 0x8d80, 0x7a30, 0xa296, 0x1103, 0x00c0,
-	0x37d7, 0x7834, 0xa005, 0x00c0, 0x37d7, 0x7a38, 0xd2fc, 0x0040,
-	0x37d1, 0x70a8, 0xa005, 0x00c0, 0x37d1, 0x1078, 0x3cf3, 0x70ab,
-	0x0001, 0x7087, 0x0006, 0x1078, 0x37dd, 0x0078, 0x37db, 0x7087,
-	0x0002, 0x707f, 0x0000, 0x0f7f, 0x007c, 0x7087, 0x0007, 0x1078,
-	0x3cc4, 0x20a3, 0x1104, 0x20a3, 0x0000, 0x3430, 0x2011, 0x8d8e,
-	0x1078, 0x3d0d, 0x00c0, 0x3805, 0x7070, 0xa005, 0x00c0, 0x3805,
-	0x7150, 0xa186, 0xffff, 0x0040, 0x3805, 0xa180, 0x25b2, 0x200c,
-	0xa18c, 0xff00, 0x810f, 0x1078, 0x3bf9, 0x0040, 0x3805, 0x1078,
-	0x3359, 0x0040, 0x3805, 0x1078, 0x2262, 0x20a9, 0x0008, 0x2298,
-	0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014,
-	0x1078, 0x3c5a, 0x007c, 0x0f7e, 0x707c, 0xa005, 0x0040, 0x3841,
-	0x2011, 0x3c35, 0x1078, 0x50f2, 0xa086, 0x0014, 0x00c0, 0x383d,
-	0x2079, 0x8d80, 0x7a30, 0xa296, 0x1104, 0x00c0, 0x383d, 0x7834,
-	0xa005, 0x00c0, 0x383d, 0x7a38, 0xd2fc, 0x0040, 0x3837, 0x70a8,
-	0xa005, 0x00c0, 0x3837, 0x1078, 0x3cf3, 0x70ab, 0x0001, 0x7087,
-	0x0008, 0x1078, 0x3843, 0x0078, 0x3841, 0x7087, 0x0002, 0x707f,
-	0x0000, 0x0f7f, 0x007c, 0x7087, 0x0009, 0x1078, 0x3cc4, 0x20a3,
-	0x1105, 0x20a3, 0x0100, 0x3430, 0x1078, 0x3d0d, 0x00c0, 0x385c,
-	0x7070, 0xa005, 0x00c0, 0x385c, 0x1078, 0x3b63, 0x00c0, 0x3866,
-	0xa085, 0x0001, 0x1078, 0x2262, 0x20a9, 0x0008, 0x2099, 0x8d8e,
-	0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014,
-	0x1078, 0x3c5a, 0x007c, 0x0f7e, 0x707c, 0xa005, 0x0040, 0x38b2,
-	0x2011, 0x3c35, 0x1078, 0x50f2, 0xa086, 0x0014, 0x00c0, 0x38ae,
-	0x2079, 0x8d80, 0x7a30, 0xa296, 0x1105, 0x00c0, 0x38ae, 0x7834,
-	0x2011, 0x0100, 0xa21e, 0x00c0, 0x3897, 0x7a38, 0xd2fc, 0x0040,
-	0x3891, 0x70a8, 0xa005, 0x00c0, 0x3891, 0x1078, 0x3cf3, 0x70ab,
-	0x0001, 0x7087, 0x000a, 0x1078, 0x38b4, 0x0078, 0x38b2, 0xa005,
-	0x00c0, 0x38ae, 0x7a38, 0xd2fc, 0x0040, 0x38a6, 0x70a8, 0xa005,
-	0x00c0, 0x38a6, 0x1078, 0x3cf3, 0x70ab, 0x0001, 0x7083, 0x0000,
-	0x7087, 0x000e, 0x1078, 0x3940, 0x0078, 0x38b2, 0x7087, 0x0002,
-	0x707f, 0x0000, 0x0f7f, 0x007c, 0x7087, 0x000b, 0x2011, 0x8d0e,
-	0x22a0, 0x20a9, 0x0040, 0x2019, 0xffff, 0x43a4, 0x20a9, 0x0002,
-	0x2009, 0x0000, 0x41a4, 0x1078, 0x3cc4, 0x20a3, 0x1106, 0x20a3,
-	0x0000, 0x1078, 0x3d0d, 0x0040, 0x38d1, 0x2013, 0x0000, 0x0078,
-	0x38d5, 0x6030, 0xa085, 0x0100, 0x2012, 0x2298, 0x20a9, 0x0042,
-	0x53a6, 0x60c3, 0x0084, 0x1078, 0x3c5a, 0x007c, 0x0f7e, 0x707c,
-	0xa005, 0x0040, 0x3900, 0x2011, 0x3c35, 0x1078, 0x50f2, 0xa086,
-	0x0084, 0x00c0, 0x38fc, 0x2079, 0x8d80, 0x7a30, 0xa296, 0x1106,
-	0x00c0, 0x38fc, 0x7834, 0xa005, 0x00c0, 0x38fc, 0x7087, 0x000c,
-	0x1078, 0x3902, 0x0078, 0x3900, 0x7087, 0x0002, 0x707f, 0x0000,
-	0x0f7f, 0x007c, 0x7087, 0x000d, 0x1078, 0x3cc4, 0x20a3, 0x1107,
-	0x20a3, 0x0000, 0x2099, 0x8d8e, 0x20a9, 0x0040, 0x53a6, 0x20a3,
-	0x0000, 0x20a3, 0x0000, 0x60c3, 0x0084, 0x1078, 0x3c5a, 0x007c,
-	0x0f7e, 0x707c, 0xa005, 0x0040, 0x393e, 0x2011, 0x3c35, 0x1078,
-	0x50f2, 0xa086, 0x0084, 0x00c0, 0x393a, 0x2079, 0x8d80, 0x7a30,
-	0xa296, 0x1107, 0x00c0, 0x393a, 0x7834, 0xa005, 0x00c0, 0x393a,
-	0x7083, 0x0001, 0x1078, 0x3cb6, 0x7087, 0x000e, 0x1078, 0x3940,
-	0x0078, 0x393e, 0x7087, 0x0002, 0x707f, 0x0000, 0x0f7f, 0x007c,
-	0x7087, 0x000f, 0x707f, 0x0000, 0x608b, 0xbc85, 0x608f, 0xb5b5,
-	0x6043, 0x0005, 0x6043, 0x0004, 0x2009, 0x07d0, 0x2011, 0x3c35,
-	0x1078, 0x50e5, 0x007c, 0x707c, 0xa005, 0x0040, 0x395b, 0x2011,
-	0x3c35, 0x1078, 0x50f2, 0x007c, 0x7087, 0x0011, 0x7168, 0x81ff,
-	0x0040, 0x3971, 0x2009, 0x0000, 0x706c, 0xa084, 0x00ff, 0x1078,
-	0x2245, 0xa186, 0x0080, 0x0040, 0x3971, 0x2011, 0x8d8e, 0x1078,
-	0x3bf9, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, 0x8d80, 0x20a1,
-	0x020b, 0x747c, 0xa480, 0x0018, 0xa080, 0x0007, 0xa084, 0x03f8,
-	0x8004, 0x20a8, 0x53a6, 0x60c3, 0x0014, 0x1078, 0x3c5a, 0x007c,
-	0x0f7e, 0x707c, 0xa005, 0x0040, 0x39b4, 0x2011, 0x3c35, 0x1078,
-	0x50f2, 0xa086, 0x0014, 0x00c0, 0x39b2, 0x2079, 0x8d80, 0x7a30,
-	0xa296, 0x1103, 0x00c0, 0x39b2, 0x7834, 0xa005, 0x00c0, 0x39b2,
-	0x7a38, 0xd2fc, 0x0040, 0x39ac, 0x70a8, 0xa005, 0x00c0, 0x39ac,
-	0x1078, 0x3cf3, 0x70ab, 0x0001, 0x7087, 0x0012, 0x1078, 0x39b6,
-	0x0078, 0x39b4, 0x707f, 0x0000, 0x0f7f, 0x007c, 0x7087, 0x0013,
-	0x1078, 0x3cd0, 0x20a3, 0x1103, 0x20a3, 0x0000, 0x3430, 0x2011,
-	0x8d8e, 0x1078, 0x3d0d, 0x00c0, 0x39d4, 0x7070, 0xa005, 0x00c0,
-	0x39d4, 0x714c, 0xa186, 0xffff, 0x0040, 0x39d4, 0x1078, 0x3bf9,
-	0x0040, 0x39d4, 0x1078, 0x3cf3, 0x20a9, 0x0008, 0x2298, 0x26a0,
-	0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078,
-	0x3c5a, 0x007c, 0x0f7e, 0x707c, 0xa005, 0x0040, 0x3a0e, 0x2011,
-	0x3c35, 0x1078, 0x50f2, 0xa086, 0x0014, 0x00c0, 0x3a0c, 0x2079,
-	0x8d80, 0x7a30, 0xa296, 0x1104, 0x00c0, 0x3a0c, 0x7834, 0xa005,
-	0x00c0, 0x3a0c, 0x7a38, 0xd2fc, 0x0040, 0x3a06, 0x70a8, 0xa005,
-	0x00c0, 0x3a06, 0x1078, 0x3cf3, 0x70ab, 0x0001, 0x7087, 0x0014,
-	0x1078, 0x3a10, 0x0078, 0x3a0e, 0x707f, 0x0000, 0x0f7f, 0x007c,
-	0x7087, 0x0015, 0x1078, 0x3cd0, 0x20a3, 0x1104, 0x20a3, 0x0000,
-	0x3430, 0x2011, 0x8d8e, 0x1078, 0x3d0d, 0x00c0, 0x3a38, 0x7070,
-	0xa005, 0x00c0, 0x3a38, 0x7150, 0xa186, 0xffff, 0x0040, 0x3a38,
-	0xa180, 0x25b2, 0x200c, 0xa18c, 0xff00, 0x810f, 0x1078, 0x3bf9,
-	0x0040, 0x3a38, 0x1078, 0x3359, 0x0040, 0x3a38, 0x1078, 0x2262,
-	0x20a9, 0x0008, 0x2298, 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3,
-	0x0000, 0x60c3, 0x0014, 0x1078, 0x3c5a, 0x007c, 0x0f7e, 0x707c,
-	0xa005, 0x0040, 0x3a8d, 0x2011, 0x3c35, 0x1078, 0x50f2, 0xa086,
-	0x0014, 0x00c0, 0x3a8b, 0x2079, 0x8d80, 0x7a30, 0xa296, 0x1105,
-	0x00c0, 0x3a8b, 0x7834, 0x2011, 0x0100, 0xa21e, 0x00c0, 0x3a6e,
-	0x7a38, 0xd2fc, 0x0040, 0x3a6c, 0x70a8, 0xa005, 0x00c0, 0x3a6c,
-	0x1078, 0x3cf3, 0x70ab, 0x0001, 0x0078, 0x3a7f, 0xa005, 0x00c0,
-	0x3a8b, 0x7a38, 0xd2fc, 0x0040, 0x3a7d, 0x70a8, 0xa005, 0x00c0,
-	0x3a7d, 0x1078, 0x3cf3, 0x70ab, 0x0001, 0x7083, 0x0000, 0x7a38,
-	0xd2f4, 0x0040, 0x3a85, 0x70c3, 0x0008, 0x7087, 0x0016, 0x1078,
-	0x3a8f, 0x0078, 0x3a8d, 0x707f, 0x0000, 0x0f7f, 0x007c, 0x20e1,
-	0x9080, 0x20e1, 0x4000, 0x2099, 0x8d80, 0x20a1, 0x020b, 0x20a9,
-	0x000e, 0x53a6, 0x3430, 0x2011, 0x8d8e, 0x7087, 0x0017, 0x1078,
-	0x3d0d, 0x00c0, 0x3aaf, 0x7070, 0xa005, 0x00c0, 0x3aaf, 0x1078,
-	0x3b63, 0x00c0, 0x3ab9, 0xa085, 0x0001, 0x1078, 0x2262, 0x20a9,
-	0x0008, 0x2099, 0x8d8e, 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3,
-	0x0000, 0x60c3, 0x0014, 0x1078, 0x3c5a, 0x007c, 0x0f7e, 0x707c,
-	0xa005, 0x0040, 0x3ade, 0x2011, 0x3c35, 0x1078, 0x50f2, 0xa086,
-	0x0084, 0x00c0, 0x3adc, 0x2079, 0x8d80, 0x7a30, 0xa296, 0x1106,
-	0x00c0, 0x3adc, 0x7834, 0xa005, 0x00c0, 0x3adc, 0x7087, 0x0018,
-	0x1078, 0x3ae0, 0x0078, 0x3ade, 0x707f, 0x0000, 0x0f7f, 0x007c,
-	0x7087, 0x0019, 0x1078, 0x3cd0, 0x20a3, 0x1106, 0x20a3, 0x0000,
-	0x3430, 0x2099, 0x8d8e, 0x2039, 0x8d0e, 0x27a0, 0x20a9, 0x0040,
-	0x53a3, 0x1078, 0x3d0d, 0x00c0, 0x3b14, 0x2728, 0x2514, 0x8207,
-	0xa084, 0x00ff, 0x8000, 0x2018, 0xa294, 0x00ff, 0x8007, 0xa205,
-	0x202a, 0x6030, 0x2310, 0x8214, 0xa2a0, 0x8d0e, 0x2414, 0xa38c,
-	0x0001, 0x0040, 0x3b0f, 0xa294, 0xff00, 0x0078, 0x3b12, 0xa294,
-	0x00ff, 0x8007, 0xa215, 0x2222, 0x2798, 0x26a0, 0x20a9, 0x0040,
-	0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0084, 0x1078,
-	0x3c5a, 0x007c, 0x0f7e, 0x707c, 0xa005, 0x0040, 0x3b46, 0x2011,
-	0x3c35, 0x1078, 0x50f2, 0xa086, 0x0084, 0x00c0, 0x3b44, 0x2079,
-	0x8d80, 0x7a30, 0xa296, 0x1107, 0x00c0, 0x3b44, 0x7834, 0xa005,
-	0x00c0, 0x3b44, 0x7083, 0x0001, 0x1078, 0x3cb6, 0x7087, 0x001a,
-	0x1078, 0x3b48, 0x0078, 0x3b46, 0x707f, 0x0000, 0x0f7f, 0x007c,
-	0x7087, 0x001b, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, 0x8d80,
-	0x20a1, 0x020b, 0x747c, 0xa480, 0x0018, 0xa080, 0x0007, 0xa084,
-	0x03f8, 0x8004, 0x20a8, 0x53a6, 0x60c3, 0x0084, 0x1078, 0x3c5a,
-	0x007c, 0x007c, 0x007c, 0x087e, 0x097e, 0x2029, 0x8852, 0x252c,
-	0x20a9, 0x0008, 0x2041, 0x8d0e, 0x28a0, 0x2099, 0x8d8e, 0x53a3,
-	0x20a9, 0x0008, 0x2011, 0x0007, 0xd5d4, 0x0040, 0x3b79, 0x2011,
-	0x0000, 0x2800, 0xa200, 0x200c, 0xa1a6, 0xffff, 0x00c0, 0x3b8b,
-	0xd5d4, 0x0040, 0x3b86, 0x8210, 0x0078, 0x3b87, 0x8211, 0x00f0,
-	0x3b79, 0x0078, 0x3bf0, 0x82ff, 0x00c0, 0x3b9d, 0xd5d4, 0x0040,
-	0x3b97, 0xa1a6, 0x3fff, 0x0040, 0x3b83, 0x0078, 0x3b9b, 0xa1a6,
-	0x3fff, 0x0040, 0x3bf0, 0xa18d, 0xc000, 0x20a9, 0x0010, 0x2019,
-	0x0001, 0xd5d4, 0x0040, 0x3ba6, 0x2019, 0x0010, 0x2120, 0xd5d4,
-	0x0040, 0x3bad, 0x8423, 0x0078, 0x3bae, 0x8424, 0x00c8, 0x3bbb,
-	0xd5d4, 0x0040, 0x3bb6, 0x8319, 0x0078, 0x3bb7, 0x8318, 0x00f0,
-	0x3ba7, 0x0078, 0x3bf0, 0x23a8, 0x2021, 0x0001, 0x8426, 0x8425,
-	0x00f0, 0x3bbf, 0x2328, 0x8529, 0xa2be, 0x0007, 0x0040, 0x3bd3,
-	0x007e, 0x2039, 0x0007, 0x2200, 0xa73a, 0x007f, 0x27a8, 0xa5a8,
-	0x0010, 0x00f0, 0x3bcf, 0x754e, 0xa5c8, 0x25b2, 0x292c, 0xa5ac,
-	0x00ff, 0x6532, 0x60e7, 0x0000, 0x65ea, 0x2018, 0x2304, 0xa405,
-	0x201a, 0x7073, 0x0001, 0x26a0, 0x2898, 0x20a9, 0x0008, 0x53a6,
-	0x20a3, 0x0000, 0x20a3, 0x0000, 0xa085, 0x0001, 0x0078, 0x3bf6,
-	0xa006, 0x0078, 0x3bf6, 0xa006, 0x1078, 0x12d2, 0x097f, 0x087f,
-	0x007c, 0x2118, 0x2021, 0x0000, 0x2001, 0x0007, 0xa39a, 0x0010,
-	0x0048, 0x3c06, 0x8420, 0x8001, 0x0078, 0x3bfe, 0x2118, 0x84ff,
-	0x0040, 0x3c0f, 0xa39a, 0x0010, 0x8421, 0x00c0, 0x3c0a, 0x2021,
-	0x0001, 0x83ff, 0x0040, 0x3c18, 0x8423, 0x8319, 0x00c0, 0x3c14,
-	0xa238, 0x2704, 0xa42c, 0x00c0, 0x3c2d, 0xa405, 0x203a, 0x714e,
-	0xa1a0, 0x25b2, 0x242c, 0xa5ac, 0x00ff, 0x6532, 0x60e7, 0x0000,
-	0x65ea, 0x7073, 0x0001, 0xa084, 0x0000, 0x007c, 0x0e7e, 0x2071,
-	0x8800, 0x7077, 0x0000, 0x0e7f, 0x007c, 0x0e7e, 0x0f7e, 0x2079,
-	0x0100, 0x2071, 0x0140, 0x1078, 0x6232, 0x7004, 0xa084, 0x4000,
-	0x0040, 0x3c46, 0x7003, 0x1000, 0x7003, 0x0000, 0x127e, 0x2091,
-	0x8000, 0x2071, 0x8821, 0x2073, 0x0000, 0x7840, 0x027e, 0xa094,
-	0x0010, 0xa285, 0x0080, 0x7842, 0x7a42, 0x027f, 0x127f, 0x0f7f,
-	0x0e7f, 0x007c, 0x127e, 0x2091, 0x8000, 0x2011, 0x8aac, 0x2013,
-	0x0000, 0x707f, 0x0000, 0x127f, 0x20e1, 0x9080, 0x60a3, 0x0056,
-	0x60a7, 0x9575, 0x1078, 0x6229, 0x2009, 0x07d0, 0x2011, 0x3c35,
-	0x1078, 0x5181, 0x007c, 0x017e, 0x027e, 0x0c7e, 0x127e, 0x2091,
-	0x8000, 0x2009, 0x00f7, 0x1078, 0x3cdc, 0x2061, 0x8ab5, 0x601b,
-	0x0000, 0x601f, 0x0000, 0x2061, 0x8800, 0x6003, 0x0001, 0x2061,
-	0x0100, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x001e, 0x2011,
-	0x3c98, 0x1078, 0x50e5, 0x127f, 0x0c7f, 0x027f, 0x017f, 0x007c,
-	0x0e7e, 0x007e, 0x127e, 0x2091, 0x8000, 0x2071, 0x0100, 0x1078,
-	0x6232, 0x2071, 0x0140, 0x7004, 0xa084, 0x4000, 0x0040, 0x3cac,
-	0x7003, 0x1000, 0x7003, 0x0000, 0x2001, 0x0001, 0x1078, 0x21f3,
-	0x1078, 0x3c73, 0x127f, 0x007f, 0x0e7f, 0x007c, 0x20a9, 0x0040,
-	0x20a1, 0x8ec0, 0x2099, 0x8d8e, 0x3304, 0x8007, 0x20a2, 0x9398,
-	0x94a0, 0x00f0, 0x3cbc, 0x007c, 0x20e1, 0x9080, 0x20e1, 0x4000,
-	0x2099, 0x8d00, 0x20a1, 0x020b, 0x20a9, 0x000c, 0x53a6, 0x007c,
-	0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, 0x8d80, 0x20a1, 0x020b,
-	0x20a9, 0x000c, 0x53a6, 0x007c, 0x0c7e, 0x007e, 0x2061, 0x0100,
-	0x810f, 0x2001, 0x882d, 0x2004, 0xa005, 0x00c0, 0x3ced, 0x6030,
-	0xa084, 0x00ff, 0xa105, 0x0078, 0x3cef, 0xa185, 0x00f7, 0x604a,
-	0x007f, 0x0c7f, 0x007c, 0x017e, 0x047e, 0x2001, 0x8852, 0x2004,
-	0xd0a4, 0x0040, 0x3d06, 0xa006, 0x2020, 0x2009, 0x002a, 0x1078,
-	0x86f5, 0x2001, 0x880c, 0x200c, 0xc195, 0x2102, 0x2019, 0x002a,
-	0x1078, 0x249d, 0x047f, 0x017f, 0x007c, 0x007e, 0x2001, 0x880c,
-	0x2004, 0xd09c, 0x0040, 0x3d14, 0x007f, 0x007c, 0x007e, 0x017e,
-	0x127e, 0x2091, 0x8000, 0x2001, 0x0101, 0x200c, 0xa18d, 0x0006,
-	0x2102, 0x127f, 0x017f, 0x007f, 0x007c, 0x157e, 0x20a9, 0x00ff,
-	0x2009, 0x8934, 0xa006, 0x200a, 0x8108, 0x00f0, 0x3d2b, 0x157f,
-	0x007c, 0x0d7e, 0x037e, 0x157e, 0x137e, 0x147e, 0x2069, 0x8851,
-	0xa006, 0x6002, 0x6007, 0x0707, 0x600a, 0x600e, 0x6012, 0xa198,
-	0x25b2, 0x231c, 0xa39c, 0x00ff, 0x6316, 0x20a9, 0x0004, 0xac98,
-	0x0006, 0x23a0, 0x40a4, 0x20a9, 0x0004, 0xac98, 0x000a, 0x23a0,
-	0x40a4, 0x603e, 0x6042, 0x604e, 0x6052, 0x6056, 0x605a, 0x605e,
-	0x6062, 0x6066, 0x606a, 0x606e, 0x6072, 0x6076, 0x607a, 0x607e,
-	0x6082, 0x6086, 0x608a, 0x608e, 0x6092, 0x6096, 0x609a, 0x609e,
-	0x61a2, 0x0d7e, 0x60a4, 0xa06d, 0x0040, 0x3d70, 0x1078, 0x1344,
-	0x60a7, 0x0000, 0x60a8, 0xa06d, 0x0040, 0x3d78, 0x1078, 0x1344,
-	0x60ab, 0x0000, 0x0d7f, 0xa006, 0x604a, 0x6810, 0x603a, 0x680c,
-	0x6046, 0x6814, 0xa084, 0x00ff, 0x6042, 0x147f, 0x137f, 0x157f,
-	0x037f, 0x0d7f, 0x007c, 0x127e, 0x2091, 0x8000, 0x6944, 0x6e48,
-	0xa684, 0x3fff, 0xa082, 0x4000, 0x00c8, 0x3e31, 0xa18c, 0xff00,
-	0x810f, 0xa182, 0x00ff, 0x00c8, 0x3e37, 0x2001, 0x880c, 0x2004,
-	0xa084, 0x0003, 0x00c0, 0x3e1a, 0xa188, 0x8934, 0x2104, 0xa065,
-	0x0040, 0x3e08, 0x6004, 0xa084, 0x00ff, 0xa08e, 0x0006, 0x00c0,
-	0x3e0e, 0x60a4, 0xa00d, 0x0040, 0x3db9, 0x1078, 0x41b1, 0x0040,
-	0x3e02, 0x60a8, 0xa00d, 0x0040, 0x3dd3, 0x1078, 0x4202, 0x00c0,
-	0x3dd3, 0x694c, 0xd1fc, 0x00c0, 0x3dc9, 0x1078, 0x3ee2, 0x0078,
-	0x3dfd, 0x1078, 0x3e9c, 0x694c, 0xd1ec, 0x00c0, 0x3dfd, 0x1078,
-	0x407a, 0x0078, 0x3dfd, 0x694c, 0xa184, 0xa000, 0x0040, 0x3ded,
-	0xd1ec, 0x0040, 0x3de6, 0xd1fc, 0x0040, 0x3de2, 0x1078, 0x408b,
-	0x0078, 0x3de9, 0x1078, 0x408b, 0x0078, 0x3ded, 0xd1fc, 0x0040,
-	0x3ded, 0x1078, 0x3e9c, 0x0078, 0x3dfd, 0x6050, 0xa00d, 0x0040,
-	0x3df8, 0x2d00, 0x200a, 0x6803, 0x0000, 0x6052, 0x0078, 0x3dfd,
-	0x2d00, 0x6052, 0x604e, 0x6803, 0x0000, 0x1078, 0x53b8, 0xa006,
-	0x127f, 0x007c, 0x2001, 0x0005, 0x2009, 0x0000, 0x0078, 0x3e3b,
-	0x2001, 0x0028, 0x2009, 0x0000, 0x0078, 0x3e3b, 0xa082, 0x0006,
-	0x00c8, 0x3e1a, 0x60a0, 0xd0bc, 0x0040, 0x3db1, 0x2001, 0x0028,
-	0x0078, 0x3e2d, 0x2009, 0x880c, 0x210c, 0xd18c, 0x0040, 0x3e24,
-	0x2001, 0x0004, 0x0078, 0x3e2d, 0xd184, 0x0040, 0x3e2b, 0x2001,
-	0x0004, 0x0078, 0x3e2d, 0x2001, 0x0029, 0x2009, 0x0000, 0x0078,
-	0x3e3b, 0x2001, 0x0029, 0x2009, 0x0000, 0x0078, 0x3e3b, 0x2001,
-	0x0029, 0x2009, 0x0000, 0xa005, 0x127f, 0x007c, 0x6944, 0x6e48,
-	0xa684, 0x3fff, 0xa082, 0x4000, 0x00c8, 0x3e81, 0xa18c, 0xff00,
-	0x810f, 0xa182, 0x00ff, 0x00c8, 0x3e71, 0xa188, 0x8934, 0x2104,
-	0xa065, 0x0040, 0x3e71, 0x6004, 0xa084, 0x00ff, 0xa08e, 0x0006,
-	0x00c0, 0x3e77, 0x684c, 0xd0ec, 0x0040, 0x3e64, 0x1078, 0x408b,
-	0x1078, 0x3e9c, 0x0078, 0x3e6c, 0x1078, 0x3e9c, 0x684c, 0xd0fc,
-	0x0040, 0x3e6c, 0x1078, 0x407a, 0x1078, 0x40d3, 0xa006, 0x0078,
-	0x3e85, 0x2001, 0x0028, 0x2009, 0x0000, 0x0078, 0x3e85, 0xa082,
-	0x0006, 0x0048, 0x3e5a, 0x2001, 0x0029, 0x2009, 0x0000, 0x0078,
-	0x3e85, 0x2001, 0x0029, 0x2009, 0x0000, 0xa005, 0x007c, 0x127e,
-	0x2091, 0x8000, 0x6050, 0xa00d, 0x0040, 0x3e95, 0x2d00, 0x200a,
-	0x6803, 0x0000, 0x6052, 0x127f, 0x007c, 0x2d00, 0x6052, 0x604e,
-	0x6803, 0x0000, 0x0078, 0x3e93, 0x127e, 0x2091, 0x8000, 0x604c,
-	0xa005, 0x0040, 0x3eb2, 0x0e7e, 0x2071, 0x8aa2, 0x7004, 0xa086,
-	0x0002, 0x0040, 0x3eb9, 0x0e7f, 0x604c, 0x6802, 0x2d00, 0x604e,
-	0x127f, 0x007c, 0x2d00, 0x6052, 0x604e, 0x6803, 0x0000, 0x0078,
-	0x3eb0, 0x701c, 0xac06, 0x00c0, 0x3eab, 0x604c, 0x2070, 0x7000,
-	0x6802, 0x2d00, 0x7002, 0x0e7f, 0x127f, 0x007c, 0x127e, 0x2091,
-	0x8000, 0x604c, 0xa06d, 0x0040, 0x3ed4, 0x6800, 0xa005, 0x00c0,
-	0x3ed2, 0x6052, 0x604e, 0xad05, 0x127f, 0x007c, 0x604c, 0xa06d,
-	0x0040, 0x3ee1, 0x6800, 0xa005, 0x00c0, 0x3edf, 0x6052, 0x604e,
-	0xad05, 0x007c, 0x6803, 0x0000, 0x6084, 0xa00d, 0x0040, 0x3eec,
-	0x2d00, 0x200a, 0x6086, 0x007c, 0x2d00, 0x6086, 0x6082, 0x0078,
-	0x3eeb, 0x127e, 0x0c7e, 0x027e, 0x2091, 0x8000, 0x6218, 0x2260,
-	0x6200, 0xa005, 0x0040, 0x3eff, 0xc285, 0x0078, 0x3f00, 0xc284,
-	0x6202, 0x027f, 0x0c7f, 0x127f, 0x007c, 0x127e, 0x0c7e, 0x2091,
-	0x8000, 0x6218, 0x2260, 0x6204, 0x007e, 0xa086, 0x0006, 0x00c0,
-	0x3f24, 0x609c, 0xd0ac, 0x0040, 0x3f24, 0x2001, 0x8852, 0x2004,
-	0xd0a4, 0x0040, 0x3f24, 0xa284, 0xff00, 0x8007, 0xa086, 0x0007,
-	0x00c0, 0x3f24, 0x6007, 0x0600, 0x007f, 0xa294, 0xff00, 0xa215,
-	0x6206, 0x0c7f, 0x127f, 0x007c, 0x127e, 0x0c7e, 0x2091, 0x8000,
-	0x6218, 0x2260, 0x6204, 0x007e, 0xa086, 0x0006, 0x00c0, 0x3f4a,
-	0x609c, 0xd0a4, 0x0040, 0x3f4a, 0x2001, 0x8852, 0x2004, 0xd0ac,
-	0x00c0, 0x3f4a, 0xa284, 0x00ff, 0xa086, 0x0007, 0x00c0, 0x3f4a,
-	0x6007, 0x0006, 0x007f, 0xa294, 0x00ff, 0x8007, 0xa215, 0x6206,
-	0x0c7f, 0x127f, 0x007c, 0x027e, 0xa182, 0x00ff, 0x0048, 0x3f5c,
-	0xa085, 0x0001, 0x0078, 0x3f74, 0xa190, 0x8934, 0x2204, 0xa065,
-	0x00c0, 0x3f73, 0x017e, 0x0d7e, 0x1078, 0x1310, 0x2d60, 0x0d7f,
-	0x017f, 0x0040, 0x3f58, 0x2c00, 0x2012, 0x60a7, 0x0000, 0x60ab,
-	0x0000, 0x1078, 0x3d31, 0xa006, 0x027f, 0x007c, 0x027e, 0xa182,
-	0x00ff, 0x0048, 0x3f7f, 0xa085, 0x0001, 0x0078, 0x3f8c, 0x0d7e,
-	0xa190, 0x8934, 0x2204, 0xa06d, 0x0040, 0x3f8a, 0x2013, 0x0000,
-	0x1078, 0x1344, 0x0d7f, 0xa006, 0x027f, 0x007c, 0x017e, 0xa182,
-	0x00ff, 0x0048, 0x3f97, 0xa085, 0x0001, 0x0078, 0x3f9e, 0xa188,
-	0x8934, 0x2104, 0xa065, 0x0040, 0x3f93, 0xa006, 0x017f, 0x007c,
-	0x0d7e, 0x157e, 0x137e, 0x147e, 0x600b, 0x0000, 0x600f, 0x0000,
-	0x6000, 0xc08c, 0x6002, 0x2069, 0x8d8e, 0x6808, 0x605e, 0x6810,
-	0x6062, 0x6138, 0xa10a, 0x0048, 0x3fb6, 0x603a, 0x6814, 0x6066,
-	0x2099, 0x8d96, 0xac88, 0x000a, 0x21a0, 0x20a9, 0x0004, 0x53a3,
-	0x2099, 0x8d9a, 0xac88, 0x0006, 0x21a0, 0x20a9, 0x0004, 0x53a3,
-	0x2069, 0x8dae, 0x6808, 0x606a, 0x690c, 0x616e, 0x6810, 0x6072,
-	0x6818, 0x6076, 0xa182, 0x0211, 0x00c8, 0x3fda, 0x2009, 0x0008,
-	0x0078, 0x4004, 0xa182, 0x0259, 0x00c8, 0x3fe2, 0x2009, 0x0007,
-	0x0078, 0x4004, 0xa182, 0x02c1, 0x00c8, 0x3fea, 0x2009, 0x0006,
-	0x0078, 0x4004, 0xa182, 0x0349, 0x00c8, 0x3ff2, 0x2009, 0x0005,
-	0x0078, 0x4004, 0xa182, 0x0421, 0x00c8, 0x3ffa, 0x2009, 0x0004,
-	0x0078, 0x4004, 0xa182, 0x0581, 0x00c8, 0x4002, 0x2009, 0x0003,
-	0x0078, 0x4004, 0x2009, 0x0002, 0x6192, 0x147f, 0x137f, 0x157f,
-	0x0d7f, 0x007c, 0x0e7e, 0x2071, 0x8d8d, 0x2e04, 0x6896, 0x2071,
-	0x8d8e, 0x7004, 0x689a, 0x701c, 0x689e, 0x0e7f, 0x007c, 0x0d7e,
-	0x127e, 0x2091, 0x8000, 0x60a4, 0xa06d, 0x0040, 0x403b, 0x6900,
-	0x81ff, 0x00c0, 0x404f, 0x6a04, 0xa282, 0x0010, 0x00c8, 0x4054,
-	0xad88, 0x0004, 0x20a9, 0x0010, 0x2104, 0xa086, 0xffff, 0x0040,
-	0x4036, 0x8108, 0x00f0, 0x402c, 0x1078, 0x12d2, 0x260a, 0x8210,
-	0x6a06, 0x0078, 0x404f, 0x1078, 0x132b, 0x0040, 0x4054, 0x2d00,
-	0x60a6, 0x6803, 0x0000, 0xad88, 0x0004, 0x20a9, 0x0010, 0x200b,
-	0xffff, 0x8108, 0x00f0, 0x4047, 0x6807, 0x0001, 0x6e12, 0xa085,
-	0x0001, 0x127f, 0x0d7f, 0x007c, 0xa006, 0x0078, 0x4051, 0x127e,
-	0x2091, 0x8000, 0x0d7e, 0x60a4, 0xa00d, 0x0040, 0x4077, 0x2168,
-	0x6800, 0xa005, 0x00c0, 0x4073, 0x1078, 0x41b1, 0x00c0, 0x4077,
-	0x200b, 0xffff, 0x6804, 0xa08a, 0x0002, 0x0048, 0x4073, 0x8001,
-	0x6806, 0x0078, 0x4077, 0x1078, 0x1344, 0x60a7, 0x0000, 0x0d7f,
-	0x127f, 0x007c, 0x127e, 0x2091, 0x8000, 0x1078, 0x4217, 0x0078,
-	0x4083, 0x1078, 0x3e87, 0x1078, 0x4117, 0x00c0, 0x4081, 0x1078,
-	0x40d3, 0x127f, 0x007c, 0x0d7e, 0x127e, 0x2091, 0x8000, 0x60a8,
-	0xa06d, 0x0040, 0x40af, 0x6950, 0x81ff, 0x00c0, 0x40c3, 0x6a54,
-	0xa282, 0x0010, 0x00c8, 0x40d0, 0xad88, 0x0018, 0x20a9, 0x0010,
-	0x2104, 0xa086, 0xffff, 0x0040, 0x40aa, 0x8108, 0x00f0, 0x40a0,
-	0x1078, 0x12d2, 0x260a, 0x8210, 0x6a56, 0x0078, 0x40c3, 0x1078,
-	0x132b, 0x0040, 0x40d0, 0x2d00, 0x60aa, 0x6853, 0x0000, 0xad88,
-	0x0018, 0x20a9, 0x0010, 0x200b, 0xffff, 0x8108, 0x00f0, 0x40bb,
-	0x6857, 0x0001, 0x6e62, 0x0078, 0x40c7, 0x1078, 0x3ee2, 0x1078,
-	0x40dd, 0x00c0, 0x40c5, 0xa085, 0x0001, 0x127f, 0x0d7f, 0x007c,
-	0xa006, 0x0078, 0x40cd, 0x127e, 0x2091, 0x8000, 0x1078, 0x53b8,
-	0x127f, 0x007c, 0xa01e, 0x0078, 0x40df, 0x2019, 0x0001, 0xa00e,
-	0x127e, 0x2091, 0x8000, 0x604c, 0x2068, 0x6000, 0xd0dc, 0x00c0,
-	0x40fd, 0x8dff, 0x0040, 0x4112, 0x83ff, 0x0040, 0x40f5, 0x6848,
-	0xa606, 0x0040, 0x4102, 0x0078, 0x40fd, 0x683c, 0xa406, 0x00c0,
-	0x40fd, 0x6840, 0xa506, 0x0040, 0x4102, 0x2d08, 0x6800, 0x2068,
-	0x0078, 0x40e9, 0x6a00, 0x604c, 0xad06, 0x00c0, 0x410a, 0x624e,
-	0x0078, 0x410d, 0xa180, 0x0000, 0x2202, 0x82ff, 0x00c0, 0x4112,
-	0x6152, 0x8dff, 0x127f, 0x007c, 0xa01e, 0x0078, 0x4119, 0x2019,
-	0x0001, 0xa00e, 0x6080, 0x2068, 0x8dff, 0x0040, 0x4145, 0x83ff,
-	0x0040, 0x4128, 0x6848, 0xa606, 0x0040, 0x4135, 0x0078, 0x4130,
-	0x683c, 0xa406, 0x00c0, 0x4130, 0x6840, 0xa506, 0x0040, 0x4135,
-	0x2d08, 0x6800, 0x2068, 0x0078, 0x411c, 0x6a00, 0x6080, 0xad06,
-	0x00c0, 0x413d, 0x6282, 0x0078, 0x4140, 0xa180, 0x0000, 0x2202,
-	0x82ff, 0x00c0, 0x4145, 0x6186, 0x8dff, 0x007c, 0xa016, 0x1078,
-	0x41aa, 0x00c0, 0x414d, 0x2011, 0x0001, 0x1078, 0x41fb, 0x00c0,
-	0x4153, 0xa295, 0x0002, 0x007c, 0x1078, 0x4233, 0x0040, 0x415c,
-	0x1078, 0x78b9, 0x0078, 0x415e, 0xa085, 0x0001, 0x007c, 0x1078,
-	0x4233, 0x0040, 0x4167, 0x1078, 0x784f, 0x0078, 0x4169, 0xa085,
-	0x0001, 0x007c, 0x1078, 0x4233, 0x0040, 0x4172, 0x1078, 0x7899,
-	0x0078, 0x4174, 0xa085, 0x0001, 0x007c, 0x1078, 0x4233, 0x0040,
-	0x417d, 0x1078, 0x786b, 0x0078, 0x417f, 0xa085, 0x0001, 0x007c,
-	0x1078, 0x4233, 0x0040, 0x4188, 0x1078, 0x78d9, 0x0078, 0x418a,
-	0xa085, 0x0001, 0x007c, 0x127e, 0x007e, 0x0d7e, 0x2091, 0x8000,
-	0x6080, 0xa06d, 0x0040, 0x41a2, 0x6800, 0x007e, 0x6837, 0x0103,
-	0x6b4a, 0x6847, 0x0000, 0x1078, 0x7a46, 0x1078, 0x4376, 0x007f,
-	0x0078, 0x4191, 0x6083, 0x0000, 0x6087, 0x0000, 0x0d7f, 0x007f,
-	0x127f, 0x007c, 0x60a4, 0xa00d, 0x00c0, 0x41b1, 0xa085, 0x0001,
-	0x007c, 0x0e7e, 0x2170, 0x7000, 0xa005, 0x00c0, 0x41c4, 0x20a9,
-	0x0010, 0xae88, 0x0004, 0x2104, 0xa606, 0x0040, 0x41c4, 0x8108,
-	0x00f0, 0x41bb, 0xa085, 0x0001, 0xa006, 0x0e7f, 0x007c, 0x0d7e,
-	0x127e, 0x2091, 0x8000, 0x60a4, 0xa06d, 0x00c0, 0x41d5, 0x1078,
-	0x132b, 0x0040, 0x41e7, 0x2d00, 0x60a6, 0x6803, 0x0001, 0x6807,
-	0x0000, 0xad88, 0x0004, 0x20a9, 0x0010, 0x200b, 0xffff, 0x8108,
-	0x00f0, 0x41dd, 0xa085, 0x0001, 0x127f, 0x0d7f, 0x007c, 0xa006,
-	0x0078, 0x41e4, 0x0d7e, 0x127e, 0x2091, 0x8000, 0x60a4, 0xa06d,
-	0x0040, 0x41f8, 0x60a7, 0x0000, 0x1078, 0x1344, 0xa085, 0x0001,
-	0x127f, 0x0d7f, 0x007c, 0x60a8, 0xa00d, 0x00c0, 0x4202, 0xa085,
-	0x0001, 0x007c, 0x0e7e, 0x2170, 0x7050, 0xa005, 0x00c0, 0x4215,
-	0x20a9, 0x0010, 0xae88, 0x0018, 0x2104, 0xa606, 0x0040, 0x4215,
-	0x8108, 0x00f0, 0x420c, 0xa085, 0x0001, 0x0e7f, 0x007c, 0x127e,
-	0x2091, 0x8000, 0x1078, 0x41fb, 0x00c0, 0x4231, 0x200b, 0xffff,
-	0x0d7e, 0x60a8, 0x2068, 0x6854, 0xa08a, 0x0002, 0x0048, 0x422c,
-	0x8001, 0x6856, 0x0078, 0x4230, 0x1078, 0x1344, 0x60ab, 0x0000,
-	0x0d7f, 0x127f, 0x007c, 0x609c, 0xd0a4, 0x007c, 0x0f7e, 0x2079,
-	0x8851, 0x7804, 0xd0a4, 0x0040, 0x4263, 0x157e, 0x0c7e, 0x20a9,
-	0x007f, 0x2009, 0x0000, 0x017e, 0x1078, 0x3f8e, 0x00c0, 0x4257,
-	0x6004, 0xa084, 0xff00, 0x8007, 0xa096, 0x0004, 0x0040, 0x4254,
-	0xa086, 0x0006, 0x00c0, 0x4257, 0x6000, 0xc0ed, 0x6002, 0x017f,
-	0x8108, 0x00f0, 0x4243, 0x0c7f, 0x157f, 0x2009, 0x07d0, 0x2011,
-	0x4265, 0x1078, 0x5181, 0x0f7f, 0x007c, 0x2011, 0x4265, 0x1078,
-	0x50f2, 0x157e, 0x0c7e, 0x20a9, 0x007f, 0x2009, 0x0000, 0x017e,
-	0x1078, 0x3f8e, 0x00c0, 0x429b, 0x6000, 0xd0ec, 0x0040, 0x429b,
-	0x047e, 0x62a0, 0xa294, 0x00ff, 0x8227, 0xa006, 0x2009, 0x0029,
-	0x1078, 0x86f5, 0x6000, 0xc0e5, 0xc0ec, 0x6002, 0x6004, 0xa084,
-	0x00ff, 0xa085, 0x0700, 0x6006, 0x2019, 0x0029, 0x1078, 0x54f0,
-	0x087e, 0x2041, 0x0000, 0x1078, 0x5419, 0x2009, 0x0000, 0x1078,
-	0x84d2, 0x087f, 0x047f, 0x017f, 0x8108, 0x00f0, 0x426f, 0x0c7f,
-	0x157f, 0x007c, 0x0c7e, 0x6018, 0x2060, 0x6000, 0xc0ec, 0x6002,
-	0x0c7f, 0x007c, 0x2071, 0x8913, 0x7003, 0x0001, 0x7007, 0x0000,
-	0x7013, 0x0000, 0x7017, 0x0000, 0x701b, 0x0000, 0x701f, 0x0000,
-	0x704b, 0x0001, 0x704f, 0x0000, 0x705b, 0x0020, 0x705f, 0x0040,
-	0x707f, 0x0000, 0x2071, 0x8a7c, 0x7003, 0x8913, 0x7007, 0x0000,
-	0x700b, 0x0000, 0x700f, 0x8a5c, 0x7013, 0x0020, 0x7017, 0x0040,
-	0x7037, 0x0000, 0x007c, 0x017e, 0x0e7e, 0x2071, 0x8a34, 0xa00e,
-	0x7186, 0x718a, 0x7097, 0x0001, 0x2001, 0x8852, 0x2004, 0xd0fc,
-	0x00c0, 0x42ed, 0x2001, 0x8852, 0x2004, 0xa00e, 0xd09c, 0x0040,
-	0x42ea, 0x8108, 0x7102, 0x0078, 0x4340, 0x2001, 0x8871, 0x200c,
-	0xa184, 0x000f, 0x2009, 0x8872, 0x210c, 0x0079, 0x42f7, 0x42e2,
-	0x4318, 0x4320, 0x432b, 0x4331, 0x42e2, 0x42e2, 0x42e2, 0x4307,
-	0x42e2, 0x42e2, 0x42e2, 0x42e2, 0x42e2, 0x42e2, 0x42e2, 0x7003,
-	0x0004, 0x137e, 0x147e, 0x157e, 0x2099, 0x8875, 0x20a1, 0x8a85,
-	0x20a9, 0x0004, 0x53a3, 0x157f, 0x147f, 0x137f, 0x0078, 0x4340,
-	0x708f, 0x0005, 0x7007, 0x0122, 0x2001, 0x0002, 0x0078, 0x4326,
-	0x708f, 0x0002, 0x7007, 0x0121, 0x2001, 0x0003, 0x7002, 0x7097,
-	0x0001, 0x0078, 0x433d, 0x7007, 0x0122, 0x2001, 0x0002, 0x0078,
-	0x4335, 0x7007, 0x0121, 0x2001, 0x0003, 0x7002, 0xa006, 0x7096,
-	0x708e, 0xa184, 0xff00, 0x8007, 0x709a, 0xa184, 0x00ff, 0x7092,
-	0x0e7f, 0x017f, 0x007c, 0x0e7e, 0x2071, 0x8913, 0x684c, 0xa005,
-	0x00c0, 0x4351, 0x7028, 0xc085, 0x702a, 0xa085, 0x0001, 0x0078,
-	0x4374, 0x6a60, 0x7236, 0x6b64, 0x733a, 0x6868, 0x703e, 0x7076,
-	0x686c, 0x7042, 0x707a, 0x684c, 0x702e, 0x6844, 0x7032, 0x2009,
-	0x000d, 0x200a, 0x8007, 0x8006, 0x8006, 0xa08c, 0x003f, 0xa084,
-	0xffc0, 0xa210, 0x2100, 0xa319, 0x726e, 0x7372, 0x7028, 0xc084,
-	0x702a, 0x7007, 0x0001, 0xa006, 0x0e7f, 0x007c, 0x0e7e, 0x027e,
-	0x6838, 0xd0fc, 0x00c0, 0x43cc, 0x6804, 0xa00d, 0x0040, 0x4392,
-	0x0d7e, 0x2071, 0x8800, 0xa016, 0x702c, 0x2168, 0x6904, 0x206a,
-	0x8210, 0x2d00, 0x81ff, 0x00c0, 0x4385, 0x702e, 0x70a4, 0xa200,
-	0x70a6, 0x0d7f, 0x2071, 0x8913, 0x701c, 0xa005, 0x00c0, 0x43de,
-	0x0068, 0x43dc, 0x2071, 0x8a34, 0x7200, 0x82ff, 0x0040, 0x43dc,
-	0x6934, 0xa186, 0x0103, 0x00c0, 0x43ef, 0x6948, 0x6844, 0xa105,
-	0x00c0, 0x43cf, 0x2009, 0x8020, 0x2200, 0x0079, 0x43af, 0x43dc,
-	0x43b4, 0x440c, 0x441a, 0x43dc, 0x2071, 0x0000, 0x7018, 0xd084,
-	0x00c0, 0x43dc, 0x7122, 0x683c, 0x7026, 0x6840, 0x702a, 0x701b,
-	0x0001, 0x2091, 0x4080, 0x2071, 0x8800, 0x702c, 0x206a, 0x2d00,
-	0x702e, 0x70a4, 0x8000, 0x70a6, 0x027f, 0x0e7f, 0x007c, 0x6844,
-	0xa086, 0x0100, 0x00c0, 0x43dc, 0x6868, 0xa005, 0x00c0, 0x43dc,
-	0x2009, 0x8020, 0x0078, 0x43ac, 0x2071, 0x8913, 0x2d08, 0x206b,
-	0x0000, 0x7010, 0x8000, 0x7012, 0x7018, 0xa06d, 0x711a, 0x0040,
-	0x43ec, 0x6902, 0x0078, 0x43ed, 0x711e, 0x0078, 0x43cc, 0xa18c,
-	0x00ff, 0xa186, 0x0017, 0x0040, 0x43fd, 0xa186, 0x001e, 0x0040,
-	0x43fd, 0xa18e, 0x001f, 0x00c0, 0x43dc, 0x684c, 0xd0cc, 0x0040,
-	0x43dc, 0x6850, 0xa084, 0x00ff, 0xa086, 0x0001, 0x00c0, 0x43dc,
-	0x2009, 0x8021, 0x0078, 0x43ac, 0x7084, 0x8008, 0xa092, 0x001e,
-	0x00c8, 0x43dc, 0x7186, 0xae90, 0x0003, 0xa210, 0x683c, 0x2012,
-	0x0078, 0x442a, 0x7084, 0x8008, 0xa092, 0x000f, 0x00c8, 0x43dc,
-	0x7186, 0xae90, 0x0003, 0x8003, 0xa210, 0x683c, 0x2012, 0x8210,
-	0x6840, 0x2012, 0x7088, 0xa10a, 0x0048, 0x43c3, 0x718c, 0x7084,
-	0xa10a, 0x0048, 0x43c3, 0x2071, 0x0000, 0x7018, 0xd084, 0x00c0,
-	0x43c3, 0x2071, 0x8a34, 0x7000, 0xa086, 0x0002, 0x00c0, 0x444a,
-	0x1078, 0x46a6, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080,
-	0x0078, 0x43c3, 0x1078, 0x46d1, 0x2071, 0x0000, 0x701b, 0x0001,
-	0x2091, 0x4080, 0x0078, 0x43c3, 0x007e, 0x684c, 0x007e, 0x6837,
-	0x0103, 0x20a9, 0x001c, 0xad80, 0x0011, 0x20a0, 0x2001, 0x0000,
-	0x40a4, 0x007f, 0xa084, 0x00ff, 0x684e, 0x007f, 0x684a, 0x6952,
-	0x007c, 0x2071, 0x8913, 0x7004, 0x0079, 0x446e, 0x4478, 0x4487,
-	0x4677, 0x4678, 0x469f, 0x46a5, 0x4479, 0x4665, 0x4608, 0x4688,
-	0x007c, 0x127e, 0x2091, 0x8000, 0x0068, 0x4486, 0x2009, 0x000d,
-	0x7030, 0x200a, 0x2091, 0x4080, 0x7007, 0x0001, 0x127f, 0x2069,
-	0x8ab5, 0x6844, 0xa005, 0x0050, 0x44af, 0x00c0, 0x44af, 0x127e,
-	0x2091, 0x8000, 0x2069, 0x0000, 0x6934, 0x2001, 0x891f, 0x2004,
-	0xa10a, 0x0040, 0x44aa, 0x0068, 0x44af, 0x2069, 0x0000, 0x6818,
-	0xd084, 0x00c0, 0x44ae, 0x2009, 0x8040, 0x6922, 0x681b, 0x0001,
-	0x2091, 0x4080, 0x2069, 0x8ab5, 0x6847, 0xffff, 0x127f, 0x2069,
-	0x8800, 0x6844, 0x6960, 0xa102, 0x2069, 0x8a34, 0x688a, 0x6984,
-	0x701c, 0xa06d, 0x0040, 0x44c1, 0x81ff, 0x0040, 0x4509, 0x0078,
-	0x44d7, 0x81ff, 0x0040, 0x45db, 0x2071, 0x8a34, 0x7184, 0x7088,
-	0xa10a, 0x00c8, 0x44d7, 0x7190, 0x2071, 0x8ab5, 0x7040, 0xa005,
-	0x0040, 0x44d7, 0x00d0, 0x45db, 0x7142, 0x0078, 0x45db, 0x2071,
-	0x8a34, 0x718c, 0x127e, 0x2091, 0x8000, 0x7084, 0xa10a, 0x0048,
-	0x45dc, 0x0068, 0x458d, 0x2071, 0x0000, 0x7018, 0xd084, 0x00c0,
-	0x458d, 0x2001, 0xffff, 0x2071, 0x8ab5, 0x7042, 0x2071, 0x8a34,
-	0x7000, 0xa086, 0x0002, 0x00c0, 0x44ff, 0x1078, 0x46a6, 0x2071,
-	0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x0078, 0x458d, 0x1078,
-	0x46d1, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x0078,
-	0x458d, 0x2071, 0x8a34, 0x7000, 0xa005, 0x0040, 0x45ba, 0x6934,
-	0xa186, 0x0103, 0x00c0, 0x4590, 0x684c, 0xd0bc, 0x00c0, 0x45ba,
-	0x6948, 0x6844, 0xa105, 0x00c0, 0x45ad, 0x2071, 0x8a34, 0x7000,
-	0x0079, 0x4522, 0x45ba, 0x4570, 0x4548, 0x455a, 0x4527, 0x137e,
-	0x147e, 0x157e, 0x2099, 0x8875, 0x20a1, 0x8a85, 0x20a9, 0x0004,
-	0x53a3, 0x157f, 0x147f, 0x137f, 0x2071, 0x8a7c, 0xad80, 0x000f,
-	0x700e, 0x7013, 0x0002, 0x7007, 0x0002, 0x700b, 0x0000, 0x2e10,
-	0x1078, 0x137b, 0x2071, 0x8913, 0x7007, 0x0009, 0x0078, 0x45db,
-	0x7084, 0x8008, 0xa092, 0x001e, 0x00c8, 0x45db, 0xae90, 0x0003,
-	0xa210, 0x683c, 0x2012, 0x7186, 0x2071, 0x8913, 0x1078, 0x4731,
-	0x0078, 0x45db, 0x7084, 0x8008, 0xa092, 0x000f, 0x00c8, 0x45db,
-	0xae90, 0x0003, 0x8003, 0xa210, 0x683c, 0x2012, 0x8210, 0x6840,
-	0x2012, 0x7186, 0x2071, 0x8913, 0x1078, 0x4731, 0x0078, 0x45db,
-	0x2009, 0x8020, 0x127e, 0x2091, 0x8000, 0x0068, 0x458d, 0x2071,
-	0x0000, 0x7018, 0xd084, 0x00c0, 0x458d, 0x7122, 0x683c, 0x7026,
-	0x6840, 0x702a, 0x701b, 0x0001, 0x2091, 0x4080, 0x127f, 0x2071,
-	0x8913, 0x1078, 0x4731, 0x0078, 0x45db, 0x127f, 0x0078, 0x45db,
-	0xa18c, 0x00ff, 0xa186, 0x0017, 0x0040, 0x459e, 0xa186, 0x001e,
-	0x0040, 0x459e, 0xa18e, 0x001f, 0x00c0, 0x45ba, 0x684c, 0xd0cc,
-	0x0040, 0x45ba, 0x6850, 0xa084, 0x00ff, 0xa086, 0x0001, 0x00c0,
-	0x45ba, 0x2009, 0x8021, 0x0078, 0x4572, 0x6844, 0xa086, 0x0100,
-	0x00c0, 0x45ba, 0x6868, 0xa005, 0x00c0, 0x45ba, 0x2009, 0x8020,
-	0x0078, 0x4572, 0x2071, 0x8913, 0x1078, 0x4745, 0x0040, 0x45db,
-	0x2071, 0x8913, 0x700f, 0x0001, 0x6934, 0xa184, 0x00ff, 0xa086,
-	0x0003, 0x00c0, 0x45d2, 0x810f, 0xa18c, 0x00ff, 0x8101, 0x0040,
-	0x45d2, 0x710e, 0x7007, 0x0003, 0x1078, 0x4765, 0x7050, 0xa086,
-	0x0100, 0x0040, 0x4678, 0x007c, 0x2071, 0x8913, 0x1078, 0x4745,
-	0x0040, 0x4605, 0x2071, 0x8a34, 0x7084, 0x700a, 0x20a9, 0x0020,
-	0x2099, 0x8a35, 0x20a1, 0x8a5c, 0x53a3, 0x7087, 0x0000, 0x2071,
-	0x8913, 0x2069, 0x8a7c, 0x706c, 0x6826, 0x7070, 0x682a, 0x7074,
-	0x682e, 0x7078, 0x6832, 0x2d10, 0x1078, 0x137b, 0x7007, 0x0008,
-	0x2001, 0xffff, 0x2071, 0x8ab5, 0x7042, 0x127f, 0x0078, 0x45db,
-	0x2069, 0x8a7c, 0x6808, 0xa08e, 0x0000, 0x0040, 0x4664, 0xa08e,
-	0x0200, 0x0040, 0x4662, 0xa08e, 0x0100, 0x00c0, 0x4664, 0x127e,
-	0x2091, 0x8000, 0x0068, 0x465f, 0x2069, 0x0000, 0x6818, 0xd084,
-	0x00c0, 0x465f, 0x702c, 0x7130, 0x8108, 0xa102, 0x0048, 0x462f,
-	0xa00e, 0x7034, 0x706e, 0x7038, 0x7072, 0x0078, 0x4639, 0x706c,
-	0xa080, 0x0040, 0x706e, 0x00c8, 0x4639, 0x7070, 0xa081, 0x0000,
-	0x7072, 0x7132, 0x6936, 0x2001, 0x8a59, 0x2004, 0xa005, 0x00c0,
-	0x4656, 0x6934, 0x2069, 0x8a34, 0x689c, 0x699e, 0x2069, 0x8ab5,
-	0xa102, 0x00c0, 0x464f, 0x6844, 0xa005, 0x00d0, 0x465d, 0x2001,
-	0x8a5a, 0x200c, 0x810d, 0x6946, 0x0078, 0x465d, 0x2009, 0x8040,
-	0x6922, 0x681b, 0x0001, 0x2091, 0x4080, 0x7007, 0x0001, 0x127f,
-	0x0078, 0x4664, 0x7007, 0x0005, 0x007c, 0x701c, 0xa06d, 0x0040,
-	0x4676, 0x1078, 0x4745, 0x0040, 0x4676, 0x7007, 0x0003, 0x1078,
-	0x4765, 0x7050, 0xa086, 0x0100, 0x0040, 0x4678, 0x007c, 0x007c,
-	0x7050, 0xa09e, 0x0100, 0x00c0, 0x4681, 0x7007, 0x0004, 0x0078,
-	0x469f, 0xa086, 0x0200, 0x00c0, 0x4687, 0x7007, 0x0005, 0x007c,
-	0x2001, 0x8a7e, 0x2004, 0xa08e, 0x0100, 0x00c0, 0x4694, 0x7007,
-	0x0001, 0x1078, 0x4731, 0x007c, 0xa08e, 0x0000, 0x0040, 0x4693,
-	0xa08e, 0x0200, 0x00c0, 0x4693, 0x7007, 0x0005, 0x007c, 0x1078,
-	0x46f9, 0x7006, 0x1078, 0x4731, 0x007c, 0x007c, 0x0e7e, 0x157e,
-	0x2071, 0x8a34, 0x7184, 0x81ff, 0x0040, 0x46ce, 0xa006, 0x7086,
-	0xae80, 0x0003, 0x2071, 0x0000, 0x21a8, 0x2014, 0x7226, 0x8000,
-	0x0070, 0x46cb, 0x2014, 0x722a, 0x8000, 0x0070, 0x46cb, 0x2014,
-	0x722e, 0x8000, 0x0070, 0x46cb, 0x2014, 0x723a, 0x8000, 0x0070,
-	0x46cb, 0x2014, 0x723e, 0xa180, 0x8030, 0x7022, 0x157f, 0x0e7f,
-	0x007c, 0x0e7e, 0x157e, 0x2071, 0x8a34, 0x7184, 0x81ff, 0x0040,
-	0x46f6, 0xa006, 0x7086, 0xae80, 0x0003, 0x2071, 0x0000, 0x21a8,
-	0x2014, 0x7226, 0x8000, 0x2014, 0x722a, 0x8000, 0x0070, 0x46ef,
-	0x2014, 0x723a, 0x8000, 0x2014, 0x723e, 0x0078, 0x46f3, 0x2001,
-	0x8020, 0x0078, 0x46f5, 0xa180, 0x8042, 0x7022, 0x157f, 0x0e7f,
-	0x007c, 0x702c, 0x7130, 0x8108, 0xa102, 0x0048, 0x4706, 0xa00e,
-	0x7034, 0x706e, 0x7038, 0x7072, 0x0078, 0x4710, 0x706c, 0xa080,
-	0x0040, 0x706e, 0x00c8, 0x4710, 0x7070, 0xa081, 0x0000, 0x7072,
-	0x7132, 0x700c, 0x8001, 0x700e, 0x00c0, 0x472a, 0x127e, 0x2091,
-	0x8000, 0x0068, 0x472d, 0x2001, 0x000d, 0x2102, 0x2091, 0x4080,
-	0x2001, 0x0001, 0x127f, 0x007c, 0x2001, 0x000d, 0x2102, 0x2001,
-	0x0001, 0x007c, 0x2001, 0x0007, 0x007c, 0x2001, 0x0006, 0x127f,
-	0x007c, 0x701c, 0xa06d, 0x0040, 0x4744, 0x127e, 0x2091, 0x8000,
-	0x7010, 0x8001, 0x7012, 0x2d04, 0x701e, 0xa005, 0x00c0, 0x4741,
-	0x701a, 0x127f, 0x1078, 0x1344, 0x007c, 0x2019, 0x000d, 0x2304,
-	0x230c, 0xa10e, 0x0040, 0x4754, 0x2304, 0x230c, 0xa10e, 0x0040,
-	0x4754, 0xa006, 0x0078, 0x4764, 0x732c, 0x8319, 0x7130, 0xa102,
-	0x00c0, 0x475e, 0x2300, 0xa005, 0x0078, 0x4764, 0x0048, 0x4763,
-	0xa302, 0x0078, 0x4764, 0x8002, 0x007c, 0x2d00, 0x7026, 0xa080,
-	0x000d, 0x7056, 0x7053, 0x0000, 0x127e, 0x2091, 0x8000, 0x2009,
-	0x8ac7, 0x2104, 0xc08d, 0x200a, 0x127f, 0x1078, 0x1395, 0x007c,
-	0x2071, 0x88e1, 0x7003, 0x0000, 0x7007, 0x0000, 0x700f, 0x0000,
-	0x702b, 0x0001, 0x704f, 0x0000, 0x7053, 0x0001, 0x705f, 0x0020,
-	0x7063, 0x0040, 0x7083, 0x0000, 0x708b, 0x0000, 0x708f, 0x0001,
-	0x70bf, 0x0000, 0x007c, 0x0e7e, 0x2071, 0x88e1, 0x6848, 0xa005,
-	0x00c0, 0x47a1, 0x7028, 0xc085, 0x702a, 0xa085, 0x0001, 0x0078,
-	0x47c6, 0x6a50, 0x7236, 0x6b54, 0x733a, 0x6858, 0x703e, 0x707a,
-	0x685c, 0x7042, 0x707e, 0x6848, 0x702e, 0x6840, 0x7032, 0x2009,
-	0x000c, 0x200a, 0x8007, 0x8006, 0x8006, 0xa08c, 0x003f, 0xa084,
-	0xffc0, 0xa210, 0x2100, 0xa319, 0x7272, 0x7376, 0x7028, 0xc084,
-	0x702a, 0x7007, 0x0001, 0x700f, 0x0000, 0xa006, 0x0e7f, 0x007c,
-	0x2b78, 0x2071, 0x88e1, 0x7004, 0x1079, 0x4826, 0x700c, 0x0079,
-	0x47d1, 0x47d6, 0x47cb, 0x47cb, 0x47cb, 0x47cb, 0x007c, 0x700c,
-	0x0079, 0x47da, 0x47df, 0x4824, 0x4824, 0x4825, 0x4825, 0x7830,
-	0x7930, 0xa106, 0x0040, 0x47e9, 0x7830, 0x7930, 0xa106, 0x00c0,
-	0x480f, 0x7030, 0xa10a, 0x0040, 0x480f, 0x00c8, 0x47f1, 0x712c,
-	0xa10a, 0xa18a, 0x0002, 0x00c8, 0x4810, 0x1078, 0x1310, 0x0040,
-	0x480f, 0x2d00, 0x705a, 0x7063, 0x0040, 0x2001, 0x0003, 0x7057,
-	0x0000, 0x127e, 0x007e, 0x2091, 0x8000, 0x2009, 0x8ac7, 0x2104,
-	0xc085, 0x200a, 0x007f, 0x700e, 0x127f, 0x1078, 0x1395, 0x007c,
-	0x1078, 0x1310, 0x0040, 0x480f, 0x2d00, 0x705a, 0x1078, 0x1310,
-	0x00c0, 0x481c, 0x0078, 0x47fb, 0x2d00, 0x7086, 0x7063, 0x0080,
-	0x2001, 0x0004, 0x0078, 0x47ff, 0x007c, 0x007c, 0x4837, 0x4838,
-	0x486f, 0x4870, 0x4824, 0x48a6, 0x48ab, 0x48e2, 0x48e3, 0x48fe,
-	0x48ff, 0x4900, 0x4901, 0x4902, 0x4903, 0x496c, 0x4996, 0x007c,
-	0x700c, 0x0079, 0x483b, 0x4840, 0x4843, 0x4853, 0x486e, 0x486e,
-	0x1078, 0x47d7, 0x007c, 0x127e, 0x8001, 0x700e, 0x7058, 0x007e,
-	0x1078, 0x4c96, 0x0040, 0x4850, 0x2091, 0x8000, 0x1078, 0x47d7,
-	0x0d7f, 0x0078, 0x485c, 0x127e, 0x8001, 0x700e, 0x1078, 0x4c96,
-	0x7058, 0x2068, 0x7084, 0x705a, 0x6803, 0x0000, 0x6807, 0x0000,
-	0x6834, 0xa084, 0x00ff, 0xa08a, 0x0020, 0x00c8, 0x486b, 0x1079,
-	0x4886, 0x127f, 0x007c, 0x127f, 0x1078, 0x4904, 0x007c, 0x007c,
-	0x007c, 0x0e7e, 0x2071, 0x88e1, 0x700c, 0x0079, 0x4877, 0x487c,
-	0x487c, 0x487c, 0x487e, 0x4882, 0x0e7f, 0x007c, 0x700f, 0x0001,
-	0x0078, 0x4884, 0x700f, 0x0002, 0x0e7f, 0x007c, 0x4904, 0x4904,
-	0x4920, 0x4904, 0x4a0b, 0x4904, 0x4904, 0x4904, 0x4904, 0x4904,
-	0x4920, 0x4a55, 0x4aa2, 0x4afb, 0x4b11, 0x4904, 0x4904, 0x493c,
-	0x4920, 0x4904, 0x4904, 0x4952, 0x4bac, 0x4bca, 0x4904, 0x493c,
-	0x4904, 0x4904, 0x4904, 0x4904, 0x4952, 0x4bca, 0x7020, 0x2068,
-	0x1078, 0x1344, 0x007c, 0x700c, 0x0079, 0x48ae, 0x48b3, 0x48b6,
-	0x48c6, 0x48e1, 0x48e1, 0x1078, 0x47d7, 0x007c, 0x127e, 0x8001,
-	0x700e, 0x7058, 0x007e, 0x1078, 0x4c96, 0x0040, 0x48c3, 0x2091,
-	0x8000, 0x1078, 0x47d7, 0x0d7f, 0x0078, 0x48cf, 0x127e, 0x8001,
-	0x700e, 0x1078, 0x4c96, 0x7058, 0x2068, 0x7084, 0x705a, 0x6803,
-	0x0000, 0x6807, 0x0000, 0x6834, 0xa084, 0x00ff, 0xa08a, 0x001a,
-	0x00c8, 0x48de, 0x1079, 0x48e4, 0x127f, 0x007c, 0x127f, 0x1078,
-	0x4904, 0x007c, 0x007c, 0x007c, 0x4904, 0x4920, 0x49f5, 0x4904,
-	0x4920, 0x4904, 0x4920, 0x4920, 0x4904, 0x4920, 0x49f5, 0x4920,
-	0x4920, 0x4920, 0x4920, 0x4920, 0x4904, 0x4920, 0x49f5, 0x4904,
-	0x4904, 0x4920, 0x4904, 0x4904, 0x4904, 0x4920, 0x007c, 0x007c,
-	0x007c, 0x007c, 0x007c, 0x007c, 0x7007, 0x0001, 0x6838, 0xa084,
-	0x00ff, 0xc0d5, 0x683a, 0x127e, 0x2091, 0x8000, 0x1078, 0x4376,
-	0x127f, 0x007c, 0x7007, 0x0001, 0x6838, 0xa084, 0x00ff, 0xc0e5,
-	0x683a, 0x127e, 0x2091, 0x8000, 0x1078, 0x4376, 0x127f, 0x007c,
-	0x7007, 0x0001, 0x6838, 0xa084, 0x00ff, 0xc0ed, 0x683a, 0x127e,
-	0x2091, 0x8000, 0x1078, 0x4376, 0x127f, 0x007c, 0x7007, 0x0001,
-	0x6838, 0xa084, 0x00ff, 0xc0dd, 0x683a, 0x127e, 0x2091, 0x8000,
-	0x1078, 0x4376, 0x127f, 0x007c, 0x6834, 0x8007, 0xa084, 0x00ff,
-	0x0040, 0x4912, 0x8001, 0x00c0, 0x4949, 0x7007, 0x0001, 0x0078,
-	0x49d2, 0x7007, 0x0006, 0x7012, 0x2d00, 0x7016, 0x701a, 0x704b,
-	0x49d2, 0x007c, 0x2d00, 0x7016, 0x701a, 0x20a9, 0x0004, 0xa080,
-	0x0024, 0x2098, 0x20a1, 0x890c, 0x53a3, 0x6858, 0x7012, 0xa082,
-	0x0401, 0x00c8, 0x492e, 0x6884, 0xa08a, 0x0003, 0x00c8, 0x492e,
-	0xa080, 0x49c3, 0x2004, 0x70c6, 0x7010, 0xa015, 0x0040, 0x49b6,
-	0x1078, 0x1310, 0x00c0, 0x4977, 0x7007, 0x000f, 0x007c, 0x2d00,
-	0x7022, 0x70c4, 0x2060, 0x6000, 0x6836, 0x6004, 0xad00, 0x7096,
-	0x6008, 0xa20a, 0x00c8, 0x4986, 0xa00e, 0x2200, 0x7112, 0x620c,
-	0x8003, 0x800b, 0xa296, 0x0004, 0x0040, 0x498f, 0xa108, 0x719a,
-	0x810b, 0x719e, 0xae90, 0x0022, 0x1078, 0x137b, 0x7090, 0xa08e,
-	0x0100, 0x0040, 0x49aa, 0xa086, 0x0200, 0x0040, 0x49a2, 0x7007,
-	0x0010, 0x007c, 0x7020, 0x2068, 0x1078, 0x1344, 0x7014, 0x2068,
-	0x0078, 0x492e, 0x7020, 0x2068, 0x7018, 0x6802, 0x6807, 0x0000,
-	0x2d08, 0x2068, 0x6906, 0x711a, 0x0078, 0x496c, 0x7014, 0x2068,
-	0x7007, 0x0001, 0x6834, 0xa084, 0x00ff, 0xa086, 0x001e, 0x0040,
-	0x4be7, 0x0078, 0x49d2, 0x49c6, 0x49ca, 0x49ce, 0x0002, 0x0011,
-	0x0007, 0x0004, 0x000a, 0x000f, 0x0005, 0x0006, 0x0012, 0x000f,
-	0x0005, 0x0006, 0x2009, 0x882d, 0x210c, 0x81ff, 0x00c0, 0x49ef,
-	0x6838, 0xa084, 0x00ff, 0x683a, 0x6853, 0x0000, 0x1078, 0x3d8b,
-	0x00c0, 0x49e3, 0x007c, 0x1078, 0x4454, 0x127e, 0x2091, 0x8000,
-	0x1078, 0x7a46, 0x1078, 0x4376, 0x127f, 0x0078, 0x49e2, 0x2001,
-	0x0028, 0x2009, 0x0000, 0x0078, 0x49e3, 0x7018, 0x6802, 0x2d08,
-	0x2068, 0x6906, 0x711a, 0x7010, 0x8001, 0x7012, 0x0040, 0x4a04,
-	0x7007, 0x0006, 0x0078, 0x4a0a, 0x7014, 0x2068, 0x7007, 0x0001,
-	0x7048, 0x107a, 0x007c, 0x7007, 0x0001, 0x6944, 0x810f, 0xa18c,
-	0x00ff, 0x6848, 0xa084, 0x00ff, 0x20a9, 0x0001, 0xa096, 0x0001,
-	0x0040, 0x4a34, 0x2009, 0x0000, 0x20a9, 0x007e, 0xa096, 0x0002,
-	0x0040, 0x4a34, 0xa005, 0x00c0, 0x4a47, 0x6944, 0x810f, 0xa18c,
-	0x00ff, 0x1078, 0x3f8e, 0x00c0, 0x4a47, 0x067e, 0x6e50, 0x1078,
-	0x4057, 0x067f, 0x0078, 0x4a47, 0x047e, 0x2011, 0x880c, 0x2224,
-	0xc484, 0xc48c, 0x2412, 0x047f, 0x0c7e, 0x1078, 0x3f8e, 0x00c0,
-	0x4a43, 0x1078, 0x41ea, 0x8108, 0x00f0, 0x4a3d, 0x0c7f, 0x684c,
-	0xd084, 0x00c0, 0x4a4e, 0x1078, 0x1344, 0x007c, 0x127e, 0x2091,
-	0x8000, 0x1078, 0x4376, 0x127f, 0x007c, 0x127e, 0x2091, 0x8000,
-	0x7007, 0x0001, 0x2001, 0x8852, 0x2004, 0xd0a4, 0x0040, 0x4a99,
-	0x2061, 0x8b24, 0x6100, 0xd184, 0x0040, 0x4a79, 0x6858, 0xa084,
-	0x00ff, 0x00c0, 0x4a9c, 0x6000, 0xd084, 0x0040, 0x4a99, 0x6004,
-	0xa005, 0x00c0, 0x4a9f, 0x6003, 0x0000, 0x600b, 0x0000, 0x0078,
-	0x4a96, 0x2011, 0x0001, 0x6860, 0xa005, 0x00c0, 0x4a81, 0x2001,
-	0x001e, 0x8000, 0x6016, 0x6858, 0xa084, 0x00ff, 0x0040, 0x4a99,
-	0x6006, 0x6858, 0x8007, 0xa084, 0x00ff, 0x0040, 0x4a99, 0x600a,
-	0x6858, 0x8000, 0x00c0, 0x4a95, 0xc28d, 0x6202, 0x127f, 0x0078,
-	0x4c85, 0x127f, 0x0078, 0x4c7d, 0x127f, 0x0078, 0x4c75, 0x127f,
-	0x0078, 0x4c79, 0x127e, 0x2091, 0x8000, 0x7007, 0x0001, 0x2001,
-	0x8852, 0x2004, 0xd0a4, 0x0040, 0x4af8, 0x2061, 0x8b24, 0x6000,
-	0xd084, 0x0040, 0x4af8, 0x6204, 0x6308, 0xd08c, 0x00c0, 0x4aea,
-	0x6c48, 0xa484, 0x0003, 0x0040, 0x4ad0, 0x6958, 0xa18c, 0x00ff,
-	0x8001, 0x00c0, 0x4ac9, 0x2100, 0xa210, 0x0048, 0x4af5, 0x0078,
-	0x4ad0, 0x8001, 0x00c0, 0x4af5, 0x2100, 0xa212, 0x0048, 0x4af5,
-	0xa484, 0x000c, 0x0040, 0x4aea, 0x6958, 0x810f, 0xa18c, 0x00ff,
-	0xa082, 0x0004, 0x00c0, 0x4ae2, 0x2100, 0xa318, 0x0048, 0x4af5,
-	0x0078, 0x4aea, 0xa082, 0x0004, 0x00c0, 0x4af5, 0x2100, 0xa31a,
-	0x0048, 0x4af5, 0x6860, 0xa005, 0x0040, 0x4af0, 0x8000, 0x6016,
-	0x6206, 0x630a, 0x127f, 0x0078, 0x4c85, 0x127f, 0x0078, 0x4c81,
-	0x127f, 0x0078, 0x4c7d, 0x127e, 0x2091, 0x8000, 0x7007, 0x0001,
-	0x2061, 0x8b24, 0x6300, 0xd38c, 0x00c0, 0x4b0b, 0x6308, 0x8318,
-	0x0048, 0x4b0e, 0x630a, 0x127f, 0x0078, 0x4c93, 0x127f, 0x0078,
-	0x4c81, 0x127e, 0x0c7e, 0x2091, 0x8000, 0x7007, 0x0001, 0x684c,
-	0xd0ac, 0x0040, 0x4b25, 0x0c7e, 0x2061, 0x8b24, 0x6000, 0xa084,
-	0xfcff, 0x6002, 0x0c7f, 0x0078, 0x4b68, 0x6858, 0xa005, 0x0040,
-	0x4b7f, 0x685c, 0xa065, 0x0040, 0x4b7b, 0x2001, 0x882d, 0x2004,
-	0xa005, 0x0040, 0x4b37, 0x1078, 0x79a8, 0x0078, 0x4b45, 0x6013,
-	0x0400, 0x6027, 0x0000, 0x694c, 0xd1a4, 0x0040, 0x4b41, 0x6950,
-	0x6126, 0x2009, 0x0041, 0x1078, 0x6939, 0x6958, 0xa18c, 0xff00,
-	0xa186, 0x2000, 0x0040, 0x4b60, 0xa186, 0x0400, 0x0040, 0x4b60,
-	0xa186, 0x1000, 0x0040, 0x4b56, 0x0078, 0x4b68, 0x0c7e, 0x2061,
-	0x8b24, 0x6000, 0xa084, 0xfdff, 0x6002, 0x0c7f, 0x0078, 0x4b68,
-	0x027e, 0x2009, 0x0000, 0x2011, 0xfdff, 0x1078, 0x5243, 0x027f,
-	0x684c, 0xd0c4, 0x0040, 0x4b77, 0x2061, 0x8b24, 0x6000, 0xd08c,
-	0x00c0, 0x4b77, 0x6008, 0x8000, 0x0048, 0x4b7b, 0x600a, 0x0c7f,
-	0x127f, 0x0078, 0x4c85, 0x0c7f, 0x127f, 0x0078, 0x4c7d, 0x6954,
-	0xa186, 0x002a, 0x00c0, 0x4b8b, 0x2001, 0x880c, 0x200c, 0xc194,
-	0x2102, 0x0078, 0x4b68, 0xa186, 0x0020, 0x0040, 0x4ba4, 0xa186,
-	0x0029, 0x0040, 0x4b97, 0xa186, 0x002d, 0x00c0, 0x4b7b, 0x6944,
-	0xa18c, 0xff00, 0x810f, 0x1078, 0x3f8e, 0x00c0, 0x4b68, 0x6000,
-	0xc0e4, 0x6002, 0x0078, 0x4b68, 0x685c, 0xa065, 0x0040, 0x4b7b,
-	0x6017, 0x0014, 0x0078, 0x4b68, 0x2061, 0x8b24, 0x6000, 0xd084,
-	0x0040, 0x4bc6, 0xd08c, 0x00c0, 0x4c93, 0x2091, 0x8000, 0x6204,
-	0x8210, 0x0048, 0x4bc0, 0x6206, 0x2091, 0x8001, 0x0078, 0x4c93,
-	0x2091, 0x8001, 0x6853, 0x0016, 0x0078, 0x4c8c, 0x6853, 0x0007,
-	0x0078, 0x4c8c, 0x6834, 0x8007, 0xa084, 0x00ff, 0x00c0, 0x4bd4,
-	0x1078, 0x4912, 0x0078, 0x4be6, 0x2030, 0x8001, 0x00c0, 0x4bde,
-	0x7007, 0x0001, 0x1078, 0x4be7, 0x0078, 0x4be6, 0x7007, 0x0006,
-	0x7012, 0x2d00, 0x7016, 0x701a, 0x704b, 0x4be7, 0x007c, 0x0e7e,
-	0x127e, 0x2091, 0x8000, 0x2009, 0x882d, 0x210c, 0x81ff, 0x00c0,
-	0x4c67, 0x2009, 0x880c, 0x210c, 0xd194, 0x00c0, 0x4c71, 0x6848,
-	0x2070, 0xae82, 0x8f00, 0x0048, 0x4c57, 0x2001, 0x8815, 0x2004,
-	0xae02, 0x00c8, 0x4c57, 0x2061, 0x8b24, 0x6100, 0xa184, 0x0001,
-	0x0040, 0x4c3c, 0xa184, 0x0100, 0x00c0, 0x4c5b, 0xa184, 0x0200,
-	0x00c0, 0x4c5f, 0x601c, 0xa005, 0x00c0, 0x4c63, 0x711c, 0xa186,
-	0x0006, 0x00c0, 0x4c42, 0x7018, 0xa005, 0x0040, 0x4c67, 0x2004,
-	0xd0e4, 0x00c0, 0x4c6b, 0x6853, 0x0000, 0x6803, 0x0000, 0x2d08,
-	0x7010, 0xa005, 0x00c0, 0x4c33, 0x7112, 0x2e60, 0x1078, 0x5198,
-	0x127f, 0x0e7f, 0x007c, 0x2068, 0x6800, 0xa005, 0x00c0, 0x4c33,
-	0x6902, 0x127f, 0x0e7f, 0x007c, 0x127f, 0x0e7f, 0x6853, 0x0006,
-	0x0078, 0x4c8c, 0x6944, 0xa18c, 0xff00, 0x810f, 0x1078, 0x3f8e,
-	0x00c0, 0x4c6b, 0x6000, 0xd0e4, 0x00c0, 0x4c6b, 0x711c, 0xa186,
-	0x0007, 0x00c0, 0x4c57, 0x6853, 0x0002, 0x0078, 0x4c6d, 0x6853,
-	0x0008, 0x0078, 0x4c6d, 0x6853, 0x000e, 0x0078, 0x4c6d, 0x6853,
-	0x0017, 0x0078, 0x4c6d, 0x6853, 0x0035, 0x0078, 0x4c6d, 0x6853,
-	0x0028, 0x0078, 0x4c6d, 0x6853, 0x0029, 0x127f, 0x0e7f, 0x0078,
-	0x4c8c, 0x6853, 0x002a, 0x0078, 0x4c6d, 0x2009, 0x003e, 0x0078,
-	0x4c87, 0x2009, 0x0004, 0x0078, 0x4c87, 0x2009, 0x0006, 0x0078,
-	0x4c87, 0x2009, 0x0016, 0x0078, 0x4c87, 0x2009, 0x0001, 0x6854,
-	0xa084, 0xff00, 0xa105, 0x6856, 0x2091, 0x8000, 0x1078, 0x4376,
-	0x2091, 0x8001, 0x007c, 0x1078, 0x1344, 0x007c, 0x702c, 0x7130,
-	0x8108, 0xa102, 0x0048, 0x4ca3, 0xa00e, 0x7034, 0x7072, 0x7038,
-	0x7076, 0x0078, 0x4caf, 0x7070, 0xa080, 0x0040, 0x7072, 0x00c8,
-	0x4caf, 0x7074, 0xa081, 0x0000, 0x7076, 0xa085, 0x0001, 0x7932,
-	0x7132, 0x007c, 0x0d7e, 0x1078, 0x518f, 0x0d7f, 0x007c, 0x0d7e,
-	0x2011, 0x0004, 0x2204, 0xa085, 0x8002, 0x2012, 0x0d7f, 0x007c,
-	0x20e1, 0x0002, 0x3d08, 0x20e1, 0x2000, 0x3d00, 0xa084, 0x7000,
-	0x0040, 0x4cce, 0xa086, 0x1000, 0x00c0, 0x4cea, 0x20e1, 0x0004,
-	0x3d60, 0xd1bc, 0x00c0, 0x4cd5, 0x3e60, 0xac84, 0x0003, 0x00c0,
-	0x4cea, 0xac82, 0x8f00, 0x0048, 0x4cea, 0x6854, 0xac02, 0x00c8,
-	0x4cea, 0x2009, 0x0047, 0x1078, 0x6939, 0x7a1c, 0xd284, 0x00c0,
-	0x4cc0, 0x007c, 0xa016, 0x1078, 0x1594, 0x0078, 0x4ce5, 0x157e,
-	0x137e, 0x147e, 0x20e1, 0x3000, 0x3d20, 0x3e28, 0xa584, 0x0070,
-	0x00c0, 0x4d31, 0xa484, 0x7000, 0xa086, 0x1000, 0x00c0, 0x4d20,
-	0xa584, 0x0007, 0xd094, 0x00c0, 0x4d31, 0xd09c, 0x00c0, 0x4d31,
-	0x1078, 0x4d4a, 0x0040, 0x4d31, 0x20e1, 0x3000, 0x7828, 0x7828,
-	0x1078, 0x4d68, 0x147f, 0x137f, 0x157f, 0x2009, 0x8aaa, 0x2104,
-	0xa005, 0x00c0, 0x4d1c, 0x007c, 0x1078, 0x5888, 0x0078, 0x4d1b,
-	0xa484, 0x7000, 0x00c0, 0x4d31, 0x1078, 0x4d4a, 0x0040, 0x4d41,
-	0x7000, 0xa084, 0xff00, 0xa086, 0x8100, 0x0040, 0x4d0c, 0x0078,
-	0x4d41, 0x1078, 0x872e, 0xd5a4, 0x0040, 0x4d3f, 0x1078, 0x19e5,
-	0x20e1, 0x9010, 0x2001, 0x0138, 0x2202, 0x0078, 0x4d45, 0x1078,
-	0x4d4a, 0x20e1, 0x3000, 0x7828, 0x7828, 0x147f, 0x137f, 0x157f,
-	0x0078, 0x4d1b, 0xa484, 0x01ff, 0x687e, 0xa005, 0x0040, 0x4d5c,
-	0xa080, 0x001f, 0xa084, 0x03f8, 0x80ac, 0x20e1, 0x1000, 0x2ea0,
-	0x2099, 0x020a, 0x53a5, 0x007c, 0x20a9, 0x000c, 0x20e1, 0x1000,
-	0x2ea0, 0x2099, 0x020a, 0x53a5, 0xa085, 0x0001, 0x0078, 0x4d5b,
-	0x7000, 0xa084, 0xff00, 0xa08c, 0xf000, 0x8007, 0xa196, 0x0000,
-	0x00c0, 0x4d75, 0x0078, 0x4eef, 0x007c, 0xa196, 0x2000, 0x00c0,
-	0x4d86, 0x6900, 0xa18e, 0x0001, 0x00c0, 0x4d82, 0x1078, 0x3541,
-	0x0078, 0x4d74, 0x1078, 0x4d8e, 0x0078, 0x4d74, 0xa196, 0x8000,
-	0x00c0, 0x4d74, 0x1078, 0x4f7b, 0x0078, 0x4d74, 0x0c7e, 0x7110,
-	0xa18c, 0xff00, 0x810f, 0xa196, 0x0001, 0x0040, 0x4d9b, 0xa196,
-	0x0023, 0x00c0, 0x4e90, 0xa08e, 0x0023, 0x00c0, 0x4dcc, 0x1078,
-	0x4fee, 0x0040, 0x4e90, 0x7124, 0x610a, 0x7030, 0xa08e, 0x0200,
-	0x00c0, 0x4db4, 0x7034, 0xa005, 0x00c0, 0x4e90, 0x2009, 0x0015,
-	0x1078, 0x6939, 0x0078, 0x4e90, 0xa08e, 0x0210, 0x00c0, 0x4dbe,
-	0x2009, 0x0015, 0x1078, 0x6939, 0x0078, 0x4e90, 0xa08e, 0x0100,
-	0x00c0, 0x4e90, 0x7034, 0xa005, 0x00c0, 0x4e90, 0x2009, 0x0016,
-	0x1078, 0x6939, 0x0078, 0x4e90, 0xa08e, 0x0022, 0x00c0, 0x4e90,
-	0x7030, 0xa08e, 0x0300, 0x00c0, 0x4ddd, 0x7034, 0xa005, 0x00c0,
-	0x4e90, 0x2009, 0x0017, 0x0078, 0x4e5c, 0xa08e, 0x0500, 0x00c0,
-	0x4de9, 0x7034, 0xa005, 0x00c0, 0x4e90, 0x2009, 0x0018, 0x0078,
-	0x4e5c, 0xa08e, 0x2010, 0x00c0, 0x4df1, 0x2009, 0x0019, 0x0078,
-	0x4e5c, 0xa08e, 0x2110, 0x00c0, 0x4df9, 0x2009, 0x001a, 0x0078,
-	0x4e5c, 0xa08e, 0x5200, 0x00c0, 0x4e05, 0x7034, 0xa005, 0x00c0,
-	0x4e90, 0x2009, 0x001b, 0x0078, 0x4e5c, 0xa08e, 0x5000, 0x00c0,
-	0x4e11, 0x7034, 0xa005, 0x00c0, 0x4e90, 0x2009, 0x001c, 0x0078,
-	0x4e5c, 0xa08e, 0x1200, 0x00c0, 0x4e1d, 0x7034, 0xa005, 0x00c0,
-	0x4e90, 0x2009, 0x0024, 0x0078, 0x4e5c, 0xa08c, 0xff00, 0xa18e,
-	0x2400, 0x00c0, 0x4e27, 0x2009, 0x002d, 0x0078, 0x4e5c, 0xa08c,
-	0xff00, 0xa18e, 0x5300, 0x00c0, 0x4e31, 0x2009, 0x002a, 0x0078,
-	0x4e5c, 0xa08e, 0x0f00, 0x00c0, 0x4e39, 0x2009, 0x0020, 0x0078,
-	0x4e5c, 0xa08e, 0x5300, 0x00c0, 0x4e3f, 0x0078, 0x4e5a, 0xa08e,
-	0x6104, 0x00c0, 0x4e5a, 0x2011, 0x8d8d, 0x8208, 0x2204, 0xa082,
-	0x0004, 0x20a8, 0x95ac, 0x95ac, 0x2011, 0x8015, 0x211c, 0x8108,
-	0x2124, 0x1078, 0x317a, 0x8108, 0x00f0, 0x4e4c, 0x2009, 0x0023,
-	0x0078, 0x4e5c, 0x2009, 0x001d, 0x017e, 0x2011, 0x8d83, 0x2204,
-	0x8211, 0x220c, 0x1078, 0x2245, 0x00c0, 0x4e92, 0x1078, 0x3f53,
-	0x00c0, 0x4e92, 0x6612, 0x6516, 0x86ff, 0x0040, 0x4e82, 0x017f,
-	0x017e, 0xa186, 0x0017, 0x00c0, 0x4e82, 0x6868, 0xa606, 0x00c0,
-	0x4e82, 0x686c, 0xa506, 0xa084, 0xff00, 0x00c0, 0x4e82, 0x6000,
-	0xc0f5, 0x6002, 0x0c7e, 0x1078, 0x68a8, 0x0040, 0x4e95, 0x017f,
-	0x611a, 0x601f, 0x0004, 0x7120, 0x610a, 0x017f, 0x1078, 0x6939,
-	0x0c7f, 0x007c, 0x017f, 0x0078, 0x4e90, 0x0c7f, 0x0078, 0x4e92,
-	0x0e7e, 0x0d7e, 0x2028, 0x2130, 0xa696, 0x00ff, 0x00c0, 0x4eb8,
-	0xa596, 0xfffd, 0x00c0, 0x4ea8, 0x2009, 0x007f, 0x0078, 0x4eeb,
-	0xa596, 0xfffe, 0x00c0, 0x4eb0, 0x2009, 0x007e, 0x0078, 0x4eeb,
-	0xa596, 0xfffc, 0x00c0, 0x4eb8, 0x2009, 0x0080, 0x0078, 0x4eeb,
-	0x2011, 0x0000, 0x2021, 0x0081, 0x20a9, 0x007e, 0x2071, 0x89b5,
-	0x2e1c, 0x83ff, 0x00c0, 0x4eca, 0x82ff, 0x00c0, 0x4edf, 0x2410,
-	0x0078, 0x4edf, 0x2368, 0x6f10, 0x007e, 0x2100, 0xa706, 0x007f,
-	0x6b14, 0x00c0, 0x4ed9, 0xa346, 0x00c0, 0x4ed9, 0x2408, 0x0078,
-	0x4eeb, 0x87ff, 0x00c0, 0x4edf, 0x83ff, 0x0040, 0x4ec4, 0x8420,
-	0x8e70, 0x00f0, 0x4ec0, 0x82ff, 0x00c0, 0x4eea, 0xa085, 0x0001,
-	0x0078, 0x4eec, 0x2208, 0xa006, 0x0d7f, 0x0e7f, 0x007c, 0xa084,
-	0x0007, 0x0079, 0x4ef4, 0x007c, 0x4efc, 0x4efc, 0x4efc, 0x4efc,
-	0x4efc, 0x4efd, 0x4f16, 0x4f64, 0x007c, 0x7110, 0xd1bc, 0x0040,
-	0x4f15, 0x7120, 0x2160, 0xac8c, 0x0003, 0x00c0, 0x4f15, 0xac8a,
-	0x8f00, 0x0048, 0x4f15, 0x6854, 0xac02, 0x00c8, 0x4f15, 0x7124,
-	0x610a, 0x2009, 0x0046, 0x1078, 0x6939, 0x007c, 0x0c7e, 0x7110,
-	0xd1bc, 0x00c0, 0x4f62, 0x2011, 0x8d83, 0x2204, 0x8211, 0x220c,
-	0x1078, 0x2245, 0x00c0, 0x4f62, 0x1078, 0x3f8e, 0x00c0, 0x4f62,
-	0x6000, 0xd0ec, 0x00c0, 0x4f62, 0x6204, 0xa294, 0xff00, 0x8217,
-	0xa286, 0x0006, 0x00c0, 0x4f47, 0x0c7e, 0x1078, 0x68a8, 0x017f,
-	0x0040, 0x4f62, 0x611a, 0x601f, 0x0006, 0x7120, 0x610a, 0x7130,
-	0x6122, 0x2009, 0x0044, 0x1078, 0x6939, 0x0078, 0x4f62, 0x0c7e,
-	0x1078, 0x68a8, 0x017f, 0x0040, 0x4f62, 0x611a, 0x601f, 0x0004,
-	0x7120, 0x610a, 0xa286, 0x0004, 0x00c0, 0x4f5a, 0x6007, 0x0005,
-	0x0078, 0x4f5c, 0x6007, 0x0001, 0x6003, 0x0001, 0x1078, 0x53e6,
-	0x1078, 0x5888, 0x0c7f, 0x007c, 0x7110, 0xd1bc, 0x0040, 0x4f7a,
-	0x7020, 0x2060, 0xac84, 0x0003, 0x00c0, 0x4f7a, 0xac82, 0x8f00,
-	0x0048, 0x4f7a, 0x6854, 0xac02, 0x00c8, 0x4f7a, 0x2009, 0x0045,
-	0x1078, 0x6939, 0x007c, 0x7110, 0xa18c, 0xff00, 0x810f, 0xa18e,
-	0x0000, 0x00c0, 0x4f8b, 0xa084, 0x000f, 0xa08a, 0x0006, 0x10c8,
-	0x12d2, 0x1079, 0x4f8c, 0x007c, 0x4f92, 0x4f93, 0x4f92, 0x4f92,
-	0x4fd0, 0x4fdf, 0x007c, 0x7110, 0xd1bc, 0x00c0, 0x4fcf, 0x700c,
-	0x7108, 0x1078, 0x2245, 0x00c0, 0x4fcf, 0x1078, 0x3f53, 0x00c0,
-	0x4fcf, 0x6612, 0x6516, 0x6204, 0xa294, 0xff00, 0x8217, 0xa286,
-	0x0004, 0x0040, 0x4faf, 0xa286, 0x0006, 0x00c0, 0x4fc0, 0x0c7e,
-	0x1078, 0x68a8, 0x017f, 0x0040, 0x4fcf, 0x611a, 0x601f, 0x0005,
-	0x7120, 0x610a, 0x2009, 0x0088, 0x1078, 0x6939, 0x0078, 0x4fcf,
-	0x0c7e, 0x1078, 0x68a8, 0x017f, 0x0040, 0x4fcf, 0x611a, 0x601f,
-	0x0004, 0x7120, 0x610a, 0x2009, 0x0001, 0x1078, 0x6939, 0x007c,
-	0x7110, 0xd1bc, 0x0040, 0x4fde, 0x1078, 0x4fee, 0x0040, 0x4fde,
-	0x7124, 0x610a, 0x2009, 0x0089, 0x1078, 0x6939, 0x007c, 0x7110,
-	0xd1bc, 0x0040, 0x4fed, 0x1078, 0x4fee, 0x0040, 0x4fed, 0x7124,
-	0x610a, 0x2009, 0x008a, 0x1078, 0x6939, 0x007c, 0x7020, 0x2060,
-	0xac84, 0x0003, 0x00c0, 0x5001, 0xac82, 0x8f00, 0x0048, 0x5001,
-	0x2001, 0x8815, 0x2004, 0xac02, 0x00c8, 0x5001, 0xa085, 0x0001,
-	0x007c, 0xa006, 0x0078, 0x5000, 0x2071, 0x8ab5, 0x7003, 0x0003,
-	0x700f, 0x0361, 0xa006, 0x701a, 0x7012, 0x7017, 0x8f00, 0x7007,
-	0x0000, 0x7026, 0x702b, 0x623f, 0x7032, 0x7037, 0x6280, 0x703b,
-	0x0002, 0x703f, 0x0000, 0x7043, 0xffff, 0x7047, 0xffff, 0x007c,
-	0x2071, 0x8ab5, 0x00e0, 0x50df, 0x2091, 0x6000, 0x700c, 0x8001,
-	0x700e, 0x00c0, 0x5098, 0x700f, 0x0361, 0x7007, 0x0001, 0x127e,
-	0x2091, 0x8000, 0x7138, 0x8109, 0x713a, 0x00c0, 0x5096, 0x703b,
-	0x0002, 0x2009, 0x0100, 0x2104, 0xa082, 0x0003, 0x00c8, 0x5096,
-	0x703c, 0xa086, 0x0001, 0x00c0, 0x5073, 0x0d7e, 0x2069, 0x0140,
-	0x6804, 0xa084, 0x4000, 0x0040, 0x5051, 0x6803, 0x1000, 0x0078,
-	0x5058, 0x6804, 0xa084, 0x1000, 0x0040, 0x5058, 0x6803, 0x0100,
-	0x6803, 0x0000, 0x703f, 0x0000, 0x2069, 0x8aa2, 0x6804, 0xa082,
-	0x0006, 0x00c0, 0x5065, 0x6807, 0x0000, 0x6830, 0xa082, 0x0003,
-	0x00c0, 0x506c, 0x6833, 0x0000, 0x1078, 0x5888, 0x1078, 0x5948,
-	0x0d7f, 0x0078, 0x5096, 0x0d7e, 0x2069, 0x8800, 0x6944, 0x6860,
-	0xa102, 0x00c8, 0x5095, 0x2069, 0x8aa2, 0x6804, 0xa086, 0x0000,
-	0x00c0, 0x5095, 0x6830, 0xa086, 0x0000, 0x00c0, 0x5095, 0x703f,
-	0x0001, 0x6807, 0x0006, 0x6833, 0x0003, 0x2069, 0x0100, 0x6830,
-	0x689e, 0x2069, 0x0140, 0x6803, 0x0600, 0x0d7f, 0x0078, 0x509b,
-	0x127e, 0x2091, 0x8000, 0x7024, 0xa00d, 0x0040, 0x50ac, 0x7020,
-	0x8001, 0x7022, 0x00c0, 0x50ac, 0x7023, 0x0009, 0x8109, 0x7126,
-	0x00c0, 0x50ac, 0x7028, 0x107a, 0x7030, 0xa00d, 0x0040, 0x50bd,
-	0x702c, 0x8001, 0x702e, 0x00c0, 0x50bd, 0x702f, 0x0009, 0x8109,
-	0x7132, 0x00c0, 0x50bd, 0x7034, 0x107a, 0x7040, 0xa005, 0x0040,
-	0x50c5, 0x0050, 0x50c5, 0x8001, 0x7042, 0x7044, 0xa005, 0x0040,
-	0x50cd, 0x0050, 0x50cd, 0x8001, 0x7046, 0x7018, 0xa00d, 0x0040,
-	0x50de, 0x7008, 0x8001, 0x700a, 0x00c0, 0x50de, 0x700b, 0x0009,
-	0x8109, 0x711a, 0x00c0, 0x50de, 0x701c, 0x107a, 0x127f, 0x7004,
-	0x0079, 0x50e2, 0x5109, 0x510a, 0x5126, 0x0e7e, 0x2071, 0x8ab5,
-	0x7018, 0xa005, 0x00c0, 0x50f0, 0x711a, 0x721e, 0x700b, 0x0009,
-	0x0e7f, 0x007c, 0x0e7e, 0x007e, 0x2071, 0x8ab5, 0x701c, 0xa206,
-	0x00c0, 0x50fc, 0x701a, 0x701e, 0x007f, 0x0e7f, 0x007c, 0x0e7e,
-	0x2071, 0x8ab5, 0x6088, 0xa102, 0x0048, 0x5107, 0x618a, 0x0e7f,
-	0x007c, 0x007c, 0x7110, 0x1078, 0x3f8e, 0x00c0, 0x511c, 0x6088,
-	0x8001, 0x0048, 0x511c, 0x608a, 0x00c0, 0x511c, 0x127e, 0x2091,
-	0x8000, 0x1078, 0x5888, 0x127f, 0x8108, 0xa182, 0x00ff, 0x0048,
-	0x5124, 0xa00e, 0x7007, 0x0002, 0x7112, 0x007c, 0x7014, 0x2060,
-	0x127e, 0x2091, 0x8000, 0x6014, 0xa005, 0x0040, 0x5155, 0x8001,
-	0x6016, 0x00c0, 0x5155, 0x611c, 0xa186, 0x0003, 0x0040, 0x513c,
-	0xa186, 0x0006, 0x00c0, 0x5153, 0x6010, 0x2068, 0x6854, 0xa08a,
-	0x199a, 0x0048, 0x5153, 0xa082, 0x1999, 0x6856, 0xa08a, 0x199a,
-	0x0048, 0x514c, 0x2001, 0x1999, 0x8003, 0x800b, 0x810b, 0xa108,
-	0x6116, 0x0078, 0x5155, 0x1078, 0x7632, 0x127f, 0xac88, 0x000c,
-	0x7116, 0x2001, 0x8816, 0x2004, 0xa102, 0x0048, 0x5163, 0x7017,
-	0x8f00, 0x7007, 0x0000, 0x007c, 0x0e7e, 0x2071, 0x8ab5, 0x7027,
-	0x07d0, 0x7023, 0x0009, 0x703b, 0x0002, 0x0e7f, 0x007c, 0x2001,
-	0x8abe, 0x2003, 0x0000, 0x007c, 0x0e7e, 0x2071, 0x8ab5, 0x7132,
-	0x702f, 0x0009, 0x0e7f, 0x007c, 0x2011, 0x8ac1, 0x2013, 0x0000,
-	0x007c, 0x0e7e, 0x2071, 0x8ab5, 0x711a, 0x721e, 0x700b, 0x0009,
-	0x0e7f, 0x007c, 0x0c7e, 0x2061, 0x8b24, 0x0c7f, 0x007c, 0xa184,
-	0x000f, 0x8003, 0x8003, 0x8003, 0xa080, 0x8b24, 0x2060, 0x007c,
-	0x6854, 0xa08a, 0x199a, 0x0048, 0x519f, 0x2001, 0x1999, 0xa005,
-	0x00c0, 0x51ae, 0x0c7e, 0x2061, 0x8b24, 0x6014, 0x0c7f, 0xa005,
-	0x00c0, 0x51b3, 0x2001, 0x001e, 0x0078, 0x51b3, 0xa08e, 0xffff,
-	0x00c0, 0x51b3, 0xa006, 0x8003, 0x800b, 0x810b, 0xa108, 0x6116,
-	0x684c, 0xa08c, 0x00c0, 0xa18e, 0x00c0, 0x0040, 0x51fc, 0xd0b4,
-	0x00c0, 0x51ca, 0xd0bc, 0x00c0, 0x51ec, 0x2009, 0x0006, 0x1078,
-	0x521b, 0x007c, 0xd0fc, 0x0040, 0x51d5, 0xa084, 0x0003, 0x0040,
-	0x51d5, 0xa086, 0x0003, 0x00c0, 0x5214, 0x2009, 0x8873, 0x2104,
-	0xd084, 0x0040, 0x51e7, 0x6118, 0xa188, 0x0027, 0x2104, 0xd08c,
-	0x00c0, 0x51e7, 0x2009, 0x0042, 0x1078, 0x6939, 0x007c, 0x2009,
-	0x0043, 0x1078, 0x6939, 0x007c, 0xd0fc, 0x0040, 0x51f7, 0xa084,
-	0x0003, 0x0040, 0x51f7, 0xa086, 0x0003, 0x00c0, 0x5214, 0x2009,
-	0x0042, 0x1078, 0x6939, 0x007c, 0xd0fc, 0x0040, 0x520a, 0xa084,
-	0x0003, 0xa08e, 0x0002, 0x0040, 0x520e, 0x2009, 0x0041, 0x1078,
-	0x6939, 0x007c, 0x1078, 0x5219, 0x0078, 0x5209, 0x2009, 0x0043,
-	0x1078, 0x6939, 0x0078, 0x5209, 0x2009, 0x0004, 0x1078, 0x521b,
-	0x007c, 0x2009, 0x0001, 0x6010, 0xa0ec, 0xf000, 0x0040, 0x5242,
-	0x2068, 0x6952, 0x6800, 0x6012, 0xa186, 0x0001, 0x00c0, 0x523c,
-	0x694c, 0xa18c, 0x8100, 0xa18e, 0x8100, 0x00c0, 0x523c, 0x0c7e,
-	0x2061, 0x8b24, 0x6200, 0xd28c, 0x00c0, 0x523b, 0x6204, 0x8210,
-	0x0048, 0x523b, 0x6206, 0x0c7f, 0x1078, 0x4376, 0x6010, 0xa06d,
-	0x10c0, 0x5198, 0x007c, 0x157e, 0x0c7e, 0x2061, 0x8b24, 0x6000,
-	0x81ff, 0x0040, 0x524e, 0xa205, 0x0078, 0x524f, 0xa204, 0x6002,
-	0x0c7f, 0x157f, 0x007c, 0x6800, 0xd08c, 0x00c0, 0x525f, 0x6808,
-	0xa005, 0x0040, 0x525f, 0x8001, 0x680a, 0xa085, 0x0001, 0x007c,
-	0x127e, 0x2091, 0x2200, 0x2079, 0x8aa2, 0x127f, 0x0d7e, 0x2069,
-	0x8aa2, 0x6803, 0x0005, 0x2069, 0x0004, 0x2d04, 0xa085, 0x8001,
-	0x206a, 0x0d7f, 0x007c, 0x0c7e, 0x6027, 0x0001, 0x7804, 0xa084,
-	0x0007, 0x0079, 0x527b, 0x5285, 0x52aa, 0x5305, 0x528b, 0x52aa,
-	0x5285, 0x5283, 0x5283, 0x1078, 0x12d2, 0x1078, 0x516f, 0x1078,
-	0x5888, 0x0c7f, 0x007c, 0x62c0, 0x82ff, 0x00c0, 0x5291, 0x0c7f,
-	0x007c, 0x2011, 0x3c35, 0x1078, 0x50f2, 0x7828, 0xa092, 0x0002,
-	0x00c8, 0x52a0, 0x8000, 0x782a, 0x1078, 0x3c6a, 0x0078, 0x528f,
-	0x1078, 0x3c35, 0x7807, 0x0003, 0x7827, 0x0000, 0x782b, 0x0000,
-	0x0078, 0x528f, 0x1078, 0x516f, 0x3c00, 0x007e, 0x2011, 0x0209,
-	0x20e1, 0x4000, 0x2214, 0x007f, 0x20e0, 0x82ff, 0x0040, 0x52c8,
-	0x62c0, 0x82ff, 0x00c0, 0x52c8, 0x782b, 0x0000, 0x7824, 0xa065,
-	0x1040, 0x12d2, 0x2009, 0x0013, 0x1078, 0x6939, 0x0c7f, 0x007c,
-	0x3900, 0xa082, 0x8bc4, 0x00c8, 0x52cf, 0x1078, 0x683b, 0x0c7e,
-	0x7824, 0xa065, 0x1040, 0x12d2, 0x7804, 0xa086, 0x0004, 0x0040,
-	0x534a, 0x7828, 0xa092, 0x2710, 0x00c8, 0x52e5, 0x8000, 0x782a,
-	0x0c7f, 0x1078, 0x6224, 0x0078, 0x52c6, 0x6104, 0xa186, 0x0003,
-	0x00c0, 0x52fc, 0x0e7e, 0x2071, 0x8800, 0x70cc, 0x0e7f, 0xd08c,
-	0x0040, 0x52fc, 0x0c7e, 0x0e7e, 0x2061, 0x0100, 0x2071, 0x8800,
-	0x1078, 0x3c73, 0x0e7f, 0x0c7f, 0x1078, 0x8781, 0x2009, 0x0014,
-	0x1078, 0x6939, 0x0c7f, 0x0078, 0x52c6, 0x2001, 0x8abe, 0x2003,
-	0x0000, 0x62c0, 0x82ff, 0x00c0, 0x5319, 0x782b, 0x0000, 0x7824,
-	0xa065, 0x1040, 0x12d2, 0x2009, 0x0013, 0x1078, 0x6990, 0x0c7f,
-	0x007c, 0x0c7e, 0x0d7e, 0x3900, 0xa082, 0x8bc4, 0x00c8, 0x5322,
-	0x1078, 0x683b, 0x7824, 0xa005, 0x1040, 0x12d2, 0x781c, 0xa06d,
-	0x1040, 0x12d2, 0x6800, 0xc0dc, 0x6802, 0x7924, 0x2160, 0x1078,
-	0x690e, 0x693c, 0x81ff, 0x1040, 0x12d2, 0x8109, 0x693e, 0x6854,
-	0xa015, 0x0040, 0x533e, 0x7a1e, 0x0078, 0x5340, 0x7918, 0x791e,
-	0x7807, 0x0000, 0x7827, 0x0000, 0x0d7f, 0x0c7f, 0x1078, 0x5888,
-	0x0078, 0x5317, 0x6104, 0xa186, 0x0002, 0x0040, 0x5355, 0xa186,
-	0x0004, 0x0040, 0x5355, 0x0078, 0x52d9, 0x7808, 0xac06, 0x0040,
-	0x52d9, 0x1078, 0x578f, 0x1078, 0x53e6, 0x0c7f, 0x1078, 0x5888,
-	0x0078, 0x52c6, 0x0c7e, 0x6027, 0x0002, 0x62c8, 0x82ff, 0x00c0,
-	0x537c, 0x62c4, 0x82ff, 0x00c0, 0x537c, 0x793c, 0xa1e5, 0x0000,
-	0x0040, 0x5376, 0x2009, 0x0049, 0x1078, 0x6939, 0x2011, 0x8ac1,
-	0x2013, 0x0000, 0x0c7f, 0x007c, 0x3908, 0xa192, 0x8bc4, 0x00c8,
-	0x5383, 0x1078, 0x683b, 0x6017, 0x0010, 0x793c, 0x81ff, 0x0040,
-	0x5376, 0x793c, 0xa188, 0x0007, 0x210c, 0xa18e, 0x0006, 0x00c0,
-	0x5395, 0x6017, 0x0012, 0x0078, 0x537a, 0x6017, 0x0016, 0x0078,
-	0x537a, 0x007e, 0x017e, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x600f,
-	0x0000, 0x2c08, 0x2061, 0x8aa2, 0x6020, 0x8000, 0x6022, 0x6010,
-	0xa005, 0x0040, 0x53b4, 0xa080, 0x0003, 0x2102, 0x6112, 0x127f,
-	0x0c7f, 0x017f, 0x007f, 0x007c, 0x6116, 0x6112, 0x0078, 0x53af,
-	0x0d7e, 0x2069, 0x8aa2, 0x6000, 0xd0d4, 0x0040, 0x53cd, 0x6820,
-	0x8000, 0x6822, 0xa086, 0x0001, 0x00c0, 0x53c8, 0x2c00, 0x681e,
-	0x6804, 0xa084, 0x0007, 0x0079, 0x5890, 0xc0d5, 0x6002, 0x6818,
-	0xa005, 0x0040, 0x53df, 0x6056, 0x605b, 0x0000, 0x007e, 0x2c00,
-	0x681a, 0x0d7f, 0x685a, 0x2069, 0x8aa2, 0x0078, 0x53bf, 0x6056,
-	0x605a, 0x2c00, 0x681a, 0x681e, 0x0078, 0x53bf, 0x007e, 0x017e,
-	0x0c7e, 0x127e, 0x2091, 0x8000, 0x600f, 0x0000, 0x2c08, 0x2061,
-	0x8aa2, 0x6020, 0x8000, 0x6022, 0x6008, 0xa005, 0x0040, 0x5401,
-	0xa080, 0x0003, 0x2102, 0x610a, 0x127f, 0x0c7f, 0x017f, 0x007f,
-	0x007c, 0x610e, 0x610a, 0x0078, 0x53fc, 0x0c7e, 0x600f, 0x0000,
-	0x2c08, 0x2061, 0x8aa2, 0x6034, 0xa005, 0x0040, 0x5415, 0xa080,
-	0x0003, 0x2102, 0x6136, 0x0c7f, 0x007c, 0x613a, 0x6136, 0x0078,
-	0x5413, 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x067e, 0x027e, 0x017e,
-	0x007e, 0x127e, 0x2071, 0x8aa2, 0x7638, 0x2660, 0x2678, 0x2091,
-	0x8000, 0x8cff, 0x0040, 0x548c, 0x6018, 0xa080, 0x0028, 0x2004,
-	0xa206, 0x00c0, 0x5487, 0x88ff, 0x0040, 0x543a, 0x6020, 0xa106,
-	0x00c0, 0x5487, 0x703c, 0xac06, 0x00c0, 0x544c, 0x037e, 0x2019,
-	0x0001, 0x1078, 0x642d, 0x7033, 0x0000, 0x703f, 0x0000, 0x7043,
-	0x0000, 0x7047, 0x0000, 0x037f, 0x7038, 0xac36, 0x00c0, 0x5452,
-	0x660c, 0x763a, 0x7034, 0xac36, 0x00c0, 0x5460, 0x2c00, 0xaf36,
-	0x0040, 0x545e, 0x2f00, 0x7036, 0x0078, 0x5460, 0x7037, 0x0000,
-	0x660c, 0x067e, 0x2c00, 0xaf06, 0x0040, 0x5469, 0x7e0e, 0x0078,
-	0x546a, 0x2678, 0x600f, 0x0000, 0x1078, 0x77ed, 0x0040, 0x5482,
-	0x6010, 0x2068, 0x601c, 0xa086, 0x0003, 0x00c0, 0x5496, 0x6837,
-	0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x7a46, 0x1078, 0x4376,
-	0x1078, 0x799b, 0x1078, 0x79a8, 0x0c7f, 0x0078, 0x5429, 0x2c78,
-	0x600c, 0x2060, 0x0078, 0x5429, 0x127f, 0x007f, 0x017f, 0x027f,
-	0x067f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x601c, 0xa086,
-	0x0006, 0x00c0, 0x5477, 0x1078, 0x86aa, 0x0078, 0x5482, 0x007e,
-	0x067e, 0x0c7e, 0x0d7e, 0x0f7e, 0x2031, 0x0000, 0x127e, 0x2091,
-	0x8000, 0x2079, 0x8aa2, 0x7838, 0xa065, 0x0040, 0x54de, 0x600c,
-	0x007e, 0x600f, 0x0000, 0x783c, 0xac06, 0x00c0, 0x54c5, 0x037e,
-	0x2019, 0x0001, 0x1078, 0x642d, 0x7833, 0x0000, 0x783f, 0x0000,
-	0x7843, 0x0000, 0x7847, 0x0000, 0x037f, 0x1078, 0x77ed, 0x0040,
-	0x54d9, 0x6010, 0x2068, 0x601c, 0xa086, 0x0003, 0x00c0, 0x54e7,
-	0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x4376, 0x1078,
-	0x799b, 0x1078, 0x79a8, 0x007f, 0x0078, 0x54ac, 0x7e3a, 0x7e36,
-	0x127f, 0x0f7f, 0x0d7f, 0x0c7f, 0x067f, 0x007f, 0x007c, 0x601c,
-	0xa086, 0x0006, 0x00c0, 0x54d0, 0x1078, 0x86aa, 0x0078, 0x54d9,
-	0x017e, 0x027e, 0x087e, 0x2041, 0x0000, 0x1078, 0x550a, 0x1078,
-	0x55ae, 0x087f, 0x027f, 0x017f, 0x007c, 0x0f7e, 0x127e, 0x2079,
-	0x8aa2, 0x2091, 0x8000, 0x1078, 0x5647, 0x1078, 0x56b1, 0x127f,
-	0x0f7f, 0x007c, 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x067e, 0x017e,
-	0x007e, 0x127e, 0x2091, 0x8000, 0x2071, 0x8aa2, 0x7614, 0x2660,
-	0x2678, 0x8cff, 0x0040, 0x559c, 0x6018, 0xa080, 0x0028, 0x2004,
-	0xa206, 0x00c0, 0x5597, 0x88ff, 0x0040, 0x552a, 0x6020, 0xa106,
-	0x00c0, 0x5597, 0x7024, 0xac06, 0x00c0, 0x555a, 0x2069, 0x0100,
-	0x68c0, 0xa005, 0x0040, 0x5555, 0x1078, 0x516f, 0x1078, 0x6232,
-	0x68c3, 0x0000, 0x1078, 0x6741, 0x7027, 0x0000, 0x037e, 0x2069,
-	0x0140, 0x6b04, 0xa384, 0x1000, 0x0040, 0x554a, 0x6803, 0x0100,
-	0x6803, 0x0000, 0x2069, 0x0100, 0x6824, 0xd084, 0x0040, 0x5552,
-	0x6827, 0x0001, 0x037f, 0x0078, 0x555a, 0x6003, 0x0009, 0x630a,
-	0x0078, 0x5597, 0x7014, 0xac36, 0x00c0, 0x5560, 0x660c, 0x7616,
-	0x7010, 0xac36, 0x00c0, 0x556e, 0x2c00, 0xaf36, 0x0040, 0x556c,
-	0x2f00, 0x7012, 0x0078, 0x556e, 0x7013, 0x0000, 0x660c, 0x067e,
-	0x2c00, 0xaf06, 0x0040, 0x5577, 0x7e0e, 0x0078, 0x5578, 0x2678,
-	0x600f, 0x0000, 0x6010, 0x2068, 0x1078, 0x77ed, 0x0040, 0x5590,
-	0x601c, 0xa086, 0x0003, 0x00c0, 0x55a5, 0x6837, 0x0103, 0x6b4a,
-	0x6847, 0x0000, 0x1078, 0x7a46, 0x1078, 0x4376, 0x1078, 0x799b,
-	0x1078, 0x79a8, 0x1078, 0x6601, 0x0c7f, 0x0078, 0x5519, 0x2c78,
-	0x600c, 0x2060, 0x0078, 0x5519, 0x127f, 0x007f, 0x017f, 0x067f,
-	0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x601c, 0xa086, 0x0006,
-	0x00c0, 0x5585, 0x1078, 0x86aa, 0x0078, 0x5590, 0x0c7e, 0x007e,
-	0x127e, 0x2091, 0x8000, 0xa280, 0x8934, 0x2004, 0xa065, 0x0040,
-	0x5643, 0x0f7e, 0x0e7e, 0x0d7e, 0x067e, 0x2071, 0x8aa2, 0x6654,
-	0x7018, 0xac06, 0x00c0, 0x55c5, 0x761a, 0x701c, 0xac06, 0x00c0,
-	0x55d1, 0x86ff, 0x00c0, 0x55d0, 0x7018, 0x701e, 0x0078, 0x55d1,
-	0x761e, 0x6058, 0xa07d, 0x0040, 0x55d6, 0x7e56, 0xa6ed, 0x0000,
-	0x0040, 0x55dc, 0x2f00, 0x685a, 0x6057, 0x0000, 0x605b, 0x0000,
-	0x6000, 0xc0d4, 0xc0dc, 0x6002, 0x1078, 0x3ed6, 0x0040, 0x563f,
-	0x7624, 0x86ff, 0x0040, 0x562f, 0xa680, 0x0004, 0x2004, 0xad06,
-	0x00c0, 0x562f, 0x0d7e, 0x2069, 0x0100, 0x68c0, 0xa005, 0x0040,
-	0x5626, 0x1078, 0x516f, 0x1078, 0x6232, 0x68c3, 0x0000, 0x1078,
-	0x6741, 0x7027, 0x0000, 0x037e, 0x2069, 0x0140, 0x6b04, 0xa384,
-	0x1000, 0x0040, 0x560f, 0x6803, 0x0100, 0x6803, 0x0000, 0x2069,
-	0x0100, 0x6824, 0xd084, 0x0040, 0x5617, 0x6827, 0x0001, 0x037f,
-	0x0d7f, 0x0c7e, 0x603c, 0xa005, 0x0040, 0x5620, 0x8001, 0x603e,
-	0x2660, 0x1078, 0x79a8, 0x0c7f, 0x0078, 0x562f, 0x0d7f, 0x0c7e,
-	0x2660, 0x6003, 0x0009, 0x630a, 0x0c7f, 0x0078, 0x55e4, 0x8dff,
-	0x0040, 0x563b, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078,
-	0x7a46, 0x1078, 0x4376, 0x1078, 0x6601, 0x0078, 0x55e4, 0x067f,
-	0x0d7f, 0x0e7f, 0x0f7f, 0x127f, 0x007f, 0x0c7f, 0x007c, 0x007e,
-	0x067e, 0x0c7e, 0x0d7e, 0x2031, 0x0000, 0x7814, 0xa065, 0x0040,
-	0x56a1, 0x600c, 0x007e, 0x600f, 0x0000, 0x7824, 0xac06, 0x00c0,
-	0x5686, 0x2069, 0x0100, 0x68c0, 0xa005, 0x0040, 0x5680, 0x1078,
-	0x516f, 0x1078, 0x6232, 0x68c3, 0x0000, 0x1078, 0x6741, 0x7827,
-	0x0000, 0x037e, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, 0x0040,
-	0x5675, 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100, 0x6824,
-	0xd084, 0x0040, 0x567d, 0x6827, 0x0001, 0x037f, 0x0078, 0x5686,
-	0x6003, 0x0009, 0x630a, 0x2c30, 0x0078, 0x569e, 0x6010, 0x2068,
-	0x1078, 0x77ed, 0x0040, 0x569a, 0x601c, 0xa086, 0x0003, 0x00c0,
-	0x56a8, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x4376,
-	0x1078, 0x799b, 0x1078, 0x79a8, 0x1078, 0x6601, 0x007f, 0x0078,
-	0x564e, 0x7e16, 0x7e12, 0x0d7f, 0x0c7f, 0x067f, 0x007f, 0x007c,
-	0x601c, 0xa086, 0x0006, 0x00c0, 0x5691, 0x1078, 0x86aa, 0x0078,
-	0x569a, 0x007e, 0x067e, 0x0c7e, 0x0d7e, 0x7818, 0xa065, 0x0040,
-	0x571f, 0x6054, 0x007e, 0x6057, 0x0000, 0x605b, 0x0000, 0x6000,
-	0xc0d4, 0xc0dc, 0x6002, 0x1078, 0x3ed6, 0x0040, 0x571c, 0x7e24,
-	0x86ff, 0x0040, 0x570e, 0xa680, 0x0004, 0x2004, 0xad06, 0x00c0,
-	0x570e, 0x0d7e, 0x2069, 0x0100, 0x68c0, 0xa005, 0x0040, 0x5705,
-	0x1078, 0x516f, 0x1078, 0x6232, 0x68c3, 0x0000, 0x1078, 0x6741,
-	0x7827, 0x0000, 0x037e, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000,
-	0x0040, 0x56ee, 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100,
-	0x6824, 0xd084, 0x0040, 0x56f6, 0x6827, 0x0001, 0x037f, 0x0d7f,
-	0x0c7e, 0x603c, 0xa005, 0x0040, 0x56ff, 0x8001, 0x603e, 0x2660,
-	0x1078, 0x79a8, 0x0c7f, 0x0078, 0x570e, 0x0d7f, 0x0c7e, 0x2660,
-	0x6003, 0x0009, 0x630a, 0x0c7f, 0x0078, 0x56c3, 0x8dff, 0x0040,
-	0x5718, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x4376,
-	0x1078, 0x6601, 0x0078, 0x56c3, 0x007f, 0x0078, 0x56b6, 0x781e,
-	0x781a, 0x0d7f, 0x0c7f, 0x067f, 0x007f, 0x007c, 0x0e7e, 0x0d7e,
-	0x067e, 0x6000, 0xd0dc, 0x0040, 0x5743, 0x604c, 0xa06d, 0x0040,
-	0x5743, 0x6848, 0xa606, 0x00c0, 0x5743, 0x2071, 0x8aa2, 0x7024,
-	0xa035, 0x0040, 0x5743, 0xa080, 0x0004, 0x2004, 0xad06, 0x00c0,
-	0x5743, 0x1078, 0x5747, 0x067f, 0x0d7f, 0x0e7f, 0x007c, 0x0f7e,
-	0x2079, 0x0100, 0x78c0, 0xa005, 0x00c0, 0x5756, 0x0c7e, 0x2660,
-	0x6003, 0x0009, 0x630a, 0x0c7f, 0x0078, 0x578d, 0x1078, 0x6232,
-	0x78c3, 0x0000, 0x1078, 0x6741, 0x7027, 0x0000, 0x037e, 0x2079,
-	0x0140, 0x7b04, 0xa384, 0x1000, 0x0040, 0x576a, 0x7803, 0x0100,
-	0x7803, 0x0000, 0x2079, 0x0100, 0x7824, 0xd084, 0x0040, 0x5772,
-	0x7827, 0x0001, 0x1078, 0x6741, 0x037f, 0x1078, 0x3ed6, 0x0c7e,
-	0x603c, 0xa005, 0x0040, 0x577e, 0x8001, 0x603e, 0x2660, 0x1078,
-	0x690e, 0x0c7f, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078,
-	0x7a46, 0x1078, 0x4376, 0x1078, 0x6601, 0x0f7f, 0x007c, 0x0e7e,
-	0x0c7e, 0x2071, 0x8aa2, 0x7004, 0xa084, 0x0007, 0x0079, 0x5798,
-	0x57a2, 0x57a5, 0x57be, 0x57da, 0x581f, 0x57a2, 0x57a2, 0x57a0,
-	0x1078, 0x12d2, 0x0c7f, 0x0e7f, 0x007c, 0x7024, 0xa065, 0x0040,
-	0x57b3, 0x7020, 0x8001, 0x7022, 0x600c, 0xa015, 0x0040, 0x57ba,
-	0x7216, 0x600f, 0x0000, 0x7007, 0x0000, 0x7027, 0x0000, 0x0c7f,
-	0x0e7f, 0x007c, 0x7216, 0x7212, 0x0078, 0x57b3, 0x6018, 0x2060,
-	0x1078, 0x3ed6, 0x6000, 0xc0dc, 0x6002, 0x7020, 0x8001, 0x7022,
-	0x0040, 0x57cf, 0x6054, 0xa015, 0x0040, 0x57d6, 0x721e, 0x7007,
-	0x0000, 0x7027, 0x0000, 0x0c7f, 0x0e7f, 0x007c, 0x7218, 0x721e,
-	0x0078, 0x57cf, 0x7024, 0xa065, 0x0040, 0x581c, 0x700c, 0xac06,
-	0x00c0, 0x57f1, 0x1078, 0x6601, 0x600c, 0xa015, 0x0040, 0x57ed,
-	0x720e, 0x600f, 0x0000, 0x0078, 0x581a, 0x720e, 0x720a, 0x0078,
-	0x581a, 0x7014, 0xac06, 0x00c0, 0x5804, 0x1078, 0x6601, 0x600c,
-	0xa015, 0x0040, 0x5800, 0x7216, 0x600f, 0x0000, 0x0078, 0x581a,
-	0x7216, 0x7212, 0x0078, 0x581a, 0x6018, 0x2060, 0x1078, 0x3ed6,
-	0x6000, 0xc0dc, 0x6002, 0x1078, 0x6601, 0x701c, 0xa065, 0x0040,
-	0x581a, 0x6054, 0xa015, 0x0040, 0x5818, 0x721e, 0x0078, 0x581a,
-	0x7218, 0x721e, 0x7027, 0x0000, 0x0c7f, 0x0e7f, 0x007c, 0x7024,
-	0xa065, 0x0040, 0x582c, 0x1078, 0x6601, 0x600c, 0xa015, 0x0040,
-	0x5833, 0x720e, 0x600f, 0x0000, 0x1078, 0x6741, 0x7027, 0x0000,
-	0x0c7f, 0x0e7f, 0x007c, 0x720e, 0x720a, 0x0078, 0x582c, 0x0d7e,
-	0x2069, 0x8aa2, 0x6830, 0xa084, 0x0003, 0x0079, 0x583f, 0x5845,
-	0x5847, 0x586d, 0x5845, 0x1078, 0x12d2, 0x0d7f, 0x007c, 0x0c7e,
-	0x6840, 0xa086, 0x0001, 0x0040, 0x5863, 0x683c, 0xa065, 0x0040,
-	0x5858, 0x600c, 0xa015, 0x0040, 0x585f, 0x6a3a, 0x600f, 0x0000,
-	0x6833, 0x0000, 0x683f, 0x0000, 0x0c7f, 0x0d7f, 0x007c, 0x683a,
-	0x6836, 0x0078, 0x5858, 0x6843, 0x0000, 0x6838, 0xa065, 0x0040,
-	0x5858, 0x6003, 0x0003, 0x0078, 0x5858, 0x0c7e, 0x6843, 0x0000,
-	0x6847, 0x0000, 0x683c, 0xa065, 0x0040, 0x5885, 0x600c, 0xa015,
-	0x0040, 0x5881, 0x6a3a, 0x600f, 0x0000, 0x683f, 0x0000, 0x0078,
-	0x5885, 0x683f, 0x0000, 0x683a, 0x6836, 0x0c7f, 0x0d7f, 0x007c,
-	0x0d7e, 0x2069, 0x8aa2, 0x6804, 0xa084, 0x0007, 0x0079, 0x5890,
-	0x589a, 0x5937, 0x5937, 0x5937, 0x5937, 0x5939, 0x5937, 0x5898,
-	0x1078, 0x12d2, 0x6820, 0xa005, 0x00c0, 0x58a0, 0x0d7f, 0x007c,
-	0x0c7e, 0x680c, 0xa065, 0x0040, 0x58af, 0x6807, 0x0004, 0x6826,
-	0x682b, 0x0000, 0x1078, 0x597f, 0x0c7f, 0x0d7f, 0x007c, 0x6814,
-	0xa065, 0x0040, 0x58bd, 0x6807, 0x0001, 0x6826, 0x682b, 0x0000,
-	0x1078, 0x597f, 0x0c7f, 0x0d7f, 0x007c, 0x0e7e, 0x037e, 0x6a1c,
-	0xa2f5, 0x0000, 0x0040, 0x5932, 0x704c, 0xa00d, 0x0040, 0x58cc,
-	0x7088, 0xa005, 0x0040, 0x58e4, 0x7054, 0xa075, 0x0040, 0x58d5,
-	0xa20e, 0x0040, 0x5932, 0x0078, 0x58da, 0x6818, 0xa20e, 0x0040,
-	0x5932, 0x2070, 0x704c, 0xa00d, 0x0040, 0x58cc, 0x7088, 0xa005,
-	0x00c0, 0x58cc, 0x2e00, 0x681e, 0x733c, 0x7038, 0xa302, 0x00c8,
-	0x58cc, 0x1078, 0x68dd, 0x0040, 0x5932, 0x8318, 0x733e, 0x6112,
-	0x2e10, 0x621a, 0xa180, 0x0015, 0x2004, 0xa08a, 0x199a, 0x0048,
-	0x58fb, 0x2001, 0x1999, 0x8003, 0x801b, 0x831b, 0xa318, 0x6316,
-	0x037f, 0x0f7e, 0x2c78, 0x71a0, 0xd1bc, 0x0040, 0x5914, 0x7100,
-	0xd1f4, 0x0040, 0x5910, 0x7114, 0xa18c, 0x00ff, 0x0078, 0x5919,
-	0x2009, 0x0000, 0x0078, 0x5919, 0xa1e0, 0x25b2, 0x2c0c, 0xa18c,
-	0x00ff, 0x2061, 0x0100, 0x619a, 0x1078, 0x5e16, 0x7300, 0xc3dd,
-	0x7302, 0x6807, 0x0002, 0x2f18, 0x6b26, 0x682b, 0x0000, 0x781f,
-	0x0003, 0x7803, 0x0001, 0x7807, 0x0040, 0x0f7f, 0x0e7f, 0x0c7f,
-	0x0d7f, 0x007c, 0x037f, 0x0e7f, 0x0c7f, 0x0078, 0x5930, 0x0d7f,
-	0x007c, 0x0c7e, 0x680c, 0xa065, 0x0040, 0x5945, 0x6807, 0x0004,
-	0x6826, 0x682b, 0x0000, 0x1078, 0x597f, 0x0c7f, 0x0d7f, 0x007c,
-	0x0f7e, 0x0d7e, 0x2069, 0x8aa2, 0x6830, 0xa086, 0x0000, 0x00c0,
-	0x5966, 0x6838, 0xa07d, 0x0040, 0x5966, 0x6833, 0x0001, 0x683e,
-	0x6847, 0x0000, 0x127e, 0x0f7e, 0x2091, 0x2200, 0x027f, 0x1078,
-	0x1b84, 0x00c0, 0x5969, 0x127f, 0x1078, 0x60fc, 0x0d7f, 0x0f7f,
-	0x007c, 0x127f, 0x6843, 0x0000, 0x7803, 0x0002, 0x780c, 0xa015,
-	0x0040, 0x597b, 0x6a3a, 0x780f, 0x0000, 0x6833, 0x0000, 0x683f,
-	0x0000, 0x0078, 0x5966, 0x683a, 0x6836, 0x0078, 0x5975, 0x601c,
-	0xa084, 0x000f, 0x1079, 0x5985, 0x007c, 0x598e, 0x5993, 0x5cc7,
-	0x5dd3, 0x5993, 0x5cc7, 0x5dd3, 0x598e, 0x5993, 0x1078, 0x578f,
-	0x1078, 0x5888, 0x007c, 0x157e, 0x137e, 0x147e, 0x0c7e, 0x0f7e,
-	0x6004, 0xa08a, 0x0040, 0x10c8, 0x12d2, 0x6118, 0x2178, 0x79a0,
-	0xd1bc, 0x0040, 0x59b0, 0x7900, 0xd1f4, 0x0040, 0x59ac, 0x7914,
-	0xa18c, 0x00ff, 0x0078, 0x59b5, 0x2009, 0x0000, 0x0078, 0x59b5,
-	0xa1f8, 0x25b2, 0x2f0c, 0xa18c, 0x00ff, 0x2c78, 0x2061, 0x0100,
-	0x619a, 0x1079, 0x59c1, 0x0f7f, 0x0c7f, 0x147f, 0x137f, 0x157f,
-	0x007c, 0x5a08, 0x5a40, 0x5a58, 0x5ad7, 0x5b04, 0x5b0c, 0x5b2d,
-	0x5b3e, 0x5b4f, 0x5b57, 0x5b68, 0x5b57, 0x5bba, 0x5b3e, 0x5bdb,
-	0x5be3, 0x5b4f, 0x5be3, 0x5bf4, 0x5a01, 0x5a01, 0x5a01, 0x5a01,
-	0x5a01, 0x5a01, 0x5a01, 0x5a01, 0x5a01, 0x5a01, 0x5a01, 0x5a01,
-	0x62e5, 0x62fa, 0x631d, 0x6341, 0x5b2d, 0x5a01, 0x5b2d, 0x5b57,
-	0x5a01, 0x5a58, 0x5ad7, 0x5a01, 0x685b, 0x5b57, 0x5a01, 0x687b,
-	0x5b57, 0x5a01, 0x5a01, 0x5a03, 0x5a01, 0x5a01, 0x5a01, 0x5a01,
-	0x5a01, 0x5a01, 0x5a01, 0x5a01, 0x5a01, 0x5a01, 0x6356, 0x5a01,
-	0x5a01, 0x1078, 0x12d2, 0x6030, 0x609a, 0x1078, 0x621e, 0x007c,
-	0x20a1, 0x020b, 0x1078, 0x5c09, 0x20a3, 0x5200, 0x20a3, 0x0000,
-	0x0d7e, 0x2069, 0x8851, 0x6804, 0xd084, 0x0040, 0x5a22, 0x6828,
-	0x20a3, 0x0000, 0x017e, 0x1078, 0x225c, 0x21a2, 0x017f, 0x0d7f,
-	0x0078, 0x5a27, 0x0d7f, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a9,
-	0x0004, 0x2099, 0x8805, 0x53a6, 0x20a9, 0x0004, 0x2099, 0x8801,
-	0x53a6, 0x20a3, 0x0000, 0x6030, 0xa084, 0x00ff, 0x20a2, 0x20a3,
-	0x0000, 0x20a3, 0x0000, 0x60c3, 0x001c, 0x1078, 0x621e, 0x007c,
-	0x20a1, 0x020b, 0x1078, 0x5c09, 0x20a3, 0x0500, 0x20a3, 0x0000,
-	0x20a3, 0x0000, 0x6030, 0xa084, 0x00ff, 0x20a2, 0x20a9, 0x0004,
-	0x2099, 0x8805, 0x53a6, 0x60c3, 0x0010, 0x1078, 0x621e, 0x007c,
-	0x20a1, 0x020b, 0x1078, 0x5c09, 0x7818, 0xa080, 0x0028, 0x2004,
-	0xa086, 0x007e, 0x00c0, 0x5a6b, 0x20a3, 0x0400, 0x620c, 0xc2b4,
-	0x620e, 0x0078, 0x5a6d, 0x20a3, 0x0300, 0x20a3, 0x0000, 0x7818,
-	0xa080, 0x0028, 0x2004, 0xa086, 0x007e, 0x00c0, 0x5aa6, 0x2099,
-	0x8a8c, 0x33a6, 0x9398, 0x33a6, 0x9398, 0x3304, 0xa084, 0x3fff,
-	0x20a2, 0x9398, 0x33a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3,
-	0x0000, 0x20a3, 0x0000, 0x20a9, 0x0004, 0x2099, 0x8805, 0x53a6,
-	0x20a9, 0x0004, 0x2099, 0x8801, 0x53a6, 0x20a9, 0x0010, 0x20a3,
-	0x0000, 0x00f0, 0x5a97, 0x2099, 0x8a94, 0x33a6, 0x20a9, 0x0007,
-	0x20a3, 0x0000, 0x00f0, 0x5aa0, 0x0078, 0x5ac6, 0x2099, 0x8a8c,
-	0x20a9, 0x0008, 0x53a6, 0x20a9, 0x0004, 0x2099, 0x8805, 0x53a6,
-	0x20a9, 0x0004, 0x2099, 0x8801, 0x53a6, 0x20a9, 0x0008, 0x20a3,
-	0x0000, 0x00f0, 0x5ab7, 0x20a9, 0x0008, 0x20a3, 0x0000, 0x00f0,
-	0x5abd, 0x2099, 0x8a94, 0x20a9, 0x0008, 0x53a6, 0x20a9, 0x0008,
-	0x20a3, 0x0000, 0x00f0, 0x5ac8, 0x20a9, 0x000a, 0x20a3, 0x0000,
-	0x00f0, 0x5ace, 0x60c3, 0x0074, 0x1078, 0x621e, 0x007c, 0x20a1,
-	0x020b, 0x1078, 0x5c09, 0x20a3, 0x2010, 0x20a3, 0x0014, 0x20a3,
-	0x0800, 0x20a3, 0x2000, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2,
-	0x20a2, 0x0f7e, 0x2079, 0x8851, 0x7904, 0x0f7f, 0xd1ac, 0x00c0,
-	0x5af3, 0xa085, 0x0020, 0xd1a4, 0x0040, 0x5af8, 0xa085, 0x0010,
-	0xa085, 0x0002, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3,
-	0x0014, 0x1078, 0x621e, 0x007c, 0x20a1, 0x020b, 0x1078, 0x5c09,
-	0x20a3, 0x5000, 0x0078, 0x5a6d, 0x20a1, 0x020b, 0x1078, 0x5c09,
-	0x20a3, 0x2110, 0x20a3, 0x0014, 0x20a3, 0x0000, 0x20a3, 0x0000,
-	0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000,
-	0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000,
-	0x60c3, 0x0014, 0x1078, 0x621e, 0x007c, 0x20a1, 0x020b, 0x1078,
-	0x5c87, 0x20a3, 0x0200, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3,
-	0x0000, 0x60c3, 0x0004, 0x1078, 0x621e, 0x007c, 0x20a1, 0x020b,
-	0x1078, 0x5c87, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, 0x0003,
-	0x20a3, 0x2a00, 0x60c3, 0x0008, 0x1078, 0x621e, 0x007c, 0x20a1,
-	0x020b, 0x1078, 0x5c87, 0x20a3, 0x0200, 0x0078, 0x5a6d, 0x20a1,
-	0x020b, 0x1078, 0x5c87, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3,
-	0x0003, 0x7810, 0x20a2, 0x60c3, 0x0008, 0x1078, 0x621e, 0x007c,
-	0x0d7e, 0x20a1, 0x020b, 0x1078, 0x5c87, 0x20a3, 0x0210, 0x20a3,
-	0x0014, 0x20a3, 0x0800, 0x7818, 0x2068, 0x6894, 0xa086, 0x0014,
-	0x00c0, 0x5b8e, 0x6998, 0xa184, 0xc000, 0x00c0, 0x5b8a, 0xd1ec,
-	0x0040, 0x5b86, 0x20a3, 0x2100, 0x0078, 0x5b90, 0x20a3, 0x0100,
-	0x0078, 0x5b90, 0x20a3, 0x0400, 0x0078, 0x5b90, 0x20a3, 0x0700,
-	0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x0f7e, 0x2079,
-	0x8851, 0x7904, 0x0f7f, 0xd1ac, 0x00c0, 0x5ba0, 0xa085, 0x0020,
-	0xd1a4, 0x0040, 0x5ba5, 0xa085, 0x0010, 0x2009, 0x8873, 0x210c,
-	0xd184, 0x0040, 0x5baf, 0x699c, 0xd18c, 0x0040, 0x5bb1, 0xa085,
-	0x0002, 0x20a2, 0x20a2, 0x20a2, 0x60c3, 0x0014, 0x1078, 0x621e,
-	0x0d7f, 0x007c, 0x20a1, 0x020b, 0x1078, 0x5c87, 0x20a3, 0x0210,
-	0x20a3, 0x0014, 0x20a3, 0x0000, 0x20a3, 0x0100, 0x20a3, 0x0000,
-	0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000,
-	0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014,
-	0x1078, 0x621e, 0x007c, 0x20a1, 0x020b, 0x1078, 0x5c87, 0x20a3,
-	0x0200, 0x0078, 0x5a0e, 0x20a1, 0x020b, 0x1078, 0x5c87, 0x20a3,
-	0x0100, 0x20a3, 0x0000, 0x20a3, 0x0003, 0x20a3, 0x2a00, 0x60c3,
-	0x0008, 0x1078, 0x621e, 0x007c, 0x20e1, 0x9080, 0x20e1, 0x4000,
-	0x20a1, 0x020b, 0x1078, 0x5c87, 0x20a3, 0x0100, 0x20a3, 0x0000,
-	0x20a3, 0x000b, 0x20a3, 0x0000, 0x60c3, 0x0008, 0x1078, 0x621e,
-	0x007c, 0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080,
-	0x0028, 0x2014, 0xa286, 0x007e, 0x00c0, 0x5c1c, 0x20a3, 0x22ff,
-	0x20a3, 0xfffe, 0x0078, 0x5c51, 0xa286, 0x007f, 0x00c0, 0x5c27,
-	0x0d7e, 0x20a3, 0x22ff, 0x20a3, 0xfffd, 0x0078, 0x5c3e, 0xd2bc,
-	0x0040, 0x5c46, 0xa286, 0x0080, 0x0d7e, 0x00c0, 0x5c35, 0x20a3,
-	0x22ff, 0x20a3, 0xfffc, 0x0078, 0x5c3e, 0xa2e8, 0x8934, 0x2d6c,
-	0x6810, 0xa085, 0x2200, 0x20a2, 0x6814, 0x20a2, 0x2069, 0x881a,
-	0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x5c55, 0x0d7e, 0xa2e8,
-	0x8934, 0x2d6c, 0x6810, 0xa085, 0x2200, 0x20a2, 0x6814, 0x20a2,
-	0x0d7f, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3, 0x0129, 0x20a3,
-	0x0000, 0x1078, 0x620d, 0x22a2, 0x20a3, 0x0000, 0x2fa2, 0x20a3,
-	0xffff, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x027f, 0x007c, 0x027e,
-	0x20e1, 0x9080, 0x20e1, 0x4000, 0x20a3, 0x02ff, 0x2011, 0xfffc,
-	0x22a2, 0x0d7e, 0x2069, 0x881a, 0x2da6, 0x8d68, 0x2da6, 0x0d7f,
-	0x20a3, 0x2029, 0x20a3, 0x0000, 0x0078, 0x5c59, 0x20a3, 0x0100,
-	0x20a3, 0x0000, 0x20a3, 0xfc02, 0x20a3, 0x0000, 0x007c, 0x027e,
-	0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004,
-	0xa092, 0x007e, 0x0048, 0x5ca6, 0x0d7e, 0xa0e8, 0x8934, 0x2d6c,
-	0x6810, 0xa085, 0x2300, 0x20a2, 0x6814, 0x20a2, 0x2069, 0x881a,
-	0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x5cb5, 0x0d7e, 0xa0e8,
-	0x8934, 0x2d6c, 0x6810, 0xa085, 0x2300, 0x20a2, 0x6814, 0x20a2,
-	0x0d7f, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3, 0x0198, 0x20a3,
-	0x0000, 0x1078, 0x620d, 0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2,
-	0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x027f, 0x007c, 0x0c7e,
-	0x0f7e, 0x6004, 0xa08a, 0x0085, 0x1048, 0x12d2, 0xa08a, 0x008c,
-	0x10c8, 0x12d2, 0x6118, 0x2178, 0x79a0, 0xd1bc, 0x0040, 0x5ce5,
-	0x7900, 0xd1f4, 0x0040, 0x5ce1, 0x7914, 0xa18c, 0x00ff, 0x0078,
-	0x5cea, 0x2009, 0x0000, 0x0078, 0x5cea, 0xa1f8, 0x25b2, 0x2f0c,
-	0xa18c, 0x00ff, 0x2c78, 0x2061, 0x0100, 0x619a, 0xa082, 0x0085,
-	0x1079, 0x5cf5, 0x0f7f, 0x0c7f, 0x007c, 0x5cfe, 0x5d09, 0x5d24,
-	0x5cfc, 0x5cfc, 0x5cfc, 0x5cfe, 0x1078, 0x12d2, 0x147e, 0x20a1,
-	0x020b, 0x1078, 0x5d37, 0x60c3, 0x0000, 0x1078, 0x621e, 0x147f,
-	0x007c, 0x147e, 0x20a1, 0x020b, 0x1078, 0x5d6b, 0x20a3, 0x0000,
-	0x20a3, 0x0000, 0x7808, 0x20a2, 0x7810, 0x20a2, 0x20a3, 0x0000,
-	0x20a3, 0xffff, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x000c,
-	0x1078, 0x621e, 0x147f, 0x007c, 0x147e, 0x20a1, 0x020b, 0x1078,
-	0x5d9f, 0x20a3, 0x0003, 0x20a3, 0x0300, 0x20a3, 0x0000, 0x20a3,
-	0x0000, 0x60c3, 0x0004, 0x1078, 0x621e, 0x147f, 0x007c, 0x027e,
-	0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004,
-	0xa092, 0x007e, 0x0048, 0x5d56, 0x0d7e, 0xa0e8, 0x8934, 0x2d6c,
-	0x6810, 0xa085, 0x8100, 0x20a2, 0x6814, 0x20a2, 0x2069, 0x881a,
-	0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x5d65, 0x0d7e, 0xa0e8,
-	0x8934, 0x2d6c, 0x6810, 0xa085, 0x8100, 0x20a2, 0x6814, 0x20a2,
-	0x0d7f, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3, 0x0009, 0x20a3,
-	0x0000, 0x0078, 0x5c59, 0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000,
-	0x7818, 0xa080, 0x0028, 0x2004, 0xa092, 0x007e, 0x0048, 0x5d8a,
-	0x0d7e, 0xa0e8, 0x8934, 0x2d6c, 0x6810, 0xa085, 0x8400, 0x20a2,
-	0x6814, 0x20a2, 0x2069, 0x881a, 0x2da6, 0x8d68, 0x2da6, 0x0d7f,
-	0x0078, 0x5d99, 0x0d7e, 0xa0e8, 0x8934, 0x2d6c, 0x6810, 0xa085,
-	0x8400, 0x20a2, 0x6814, 0x20a2, 0x0d7f, 0x20a3, 0x0000, 0x6230,
-	0x22a2, 0x20a3, 0x00d1, 0x20a3, 0x0000, 0x0078, 0x5cb9, 0x027e,
-	0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004,
-	0xa092, 0x007e, 0x0048, 0x5dbe, 0x0d7e, 0xa0e8, 0x8934, 0x2d6c,
-	0x6810, 0xa085, 0x8500, 0x20a2, 0x6814, 0x20a2, 0x2069, 0x881a,
-	0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x5dcd, 0x0d7e, 0xa0e8,
-	0x8934, 0x2d6c, 0x6810, 0xa085, 0x8500, 0x20a2, 0x6814, 0x20a2,
-	0x0d7f, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3, 0x00d1, 0x20a3,
-	0x0000, 0x0078, 0x5cb9, 0x0c7e, 0x0f7e, 0x2c78, 0x7804, 0xa08a,
-	0x0040, 0x1048, 0x12d2, 0xa08a, 0x0053, 0x10c8, 0x12d2, 0x7918,
-	0x2160, 0x61a0, 0xd1bc, 0x0040, 0x5df2, 0x6100, 0xd1f4, 0x0040,
-	0x5dee, 0x6114, 0xa18c, 0x00ff, 0x0078, 0x5df7, 0x2009, 0x0000,
-	0x0078, 0x5df7, 0xa1e0, 0x25b2, 0x2c0c, 0xa18c, 0x00ff, 0x2061,
-	0x0100, 0x619a, 0xa082, 0x0040, 0x1079, 0x5e01, 0x0f7f, 0x0c7f,
-	0x007c, 0x5e16, 0x5f1a, 0x5ebb, 0x6070, 0x5e14, 0x5e14, 0x5e14,
-	0x5e14, 0x5e14, 0x5e14, 0x5e14, 0x651a, 0x652b, 0x653c, 0x654d,
-	0x5e14, 0x5e14, 0x5e14, 0x6509, 0x1078, 0x12d2, 0x0d7e, 0x157e,
-	0x147e, 0x20a1, 0x020b, 0x1078, 0x5e77, 0x7910, 0x2168, 0x6948,
-	0x7922, 0x21a2, 0xa016, 0x22a2, 0x22a2, 0x22a2, 0x694c, 0xa184,
-	0x000f, 0x00c0, 0x5e2f, 0x2001, 0x0005, 0x0078, 0x5e39, 0xd184,
-	0x0040, 0x5e36, 0x2001, 0x0004, 0x0078, 0x5e39, 0xa084, 0x0006,
-	0x8004, 0x20a2, 0xd1ac, 0x0040, 0x5e41, 0x20a3, 0x0002, 0x0078,
-	0x5e4d, 0xd1b4, 0x0040, 0x5e48, 0x20a3, 0x0001, 0x0078, 0x5e4d,
-	0x20a3, 0x0000, 0x2230, 0x0078, 0x5e4f, 0x6a80, 0x6e7c, 0x20a9,
-	0x0008, 0xad80, 0x0017, 0x200c, 0x810f, 0x21a2, 0x8000, 0x00f0,
-	0x5e53, 0x22a2, 0x26a2, 0x60c3, 0x0020, 0x20e1, 0x9080, 0x6014,
-	0xa084, 0x0004, 0xa085, 0x0009, 0x6016, 0x2001, 0x8abe, 0x2003,
-	0x07d0, 0x2001, 0x8abd, 0x2003, 0x0009, 0x2001, 0x8ac3, 0x2003,
-	0x0002, 0x1078, 0x1526, 0x147f, 0x157f, 0x0d7f, 0x007c, 0x20e1,
-	0x9080, 0x20e1, 0x4000, 0x7a18, 0xa280, 0x0023, 0x2014, 0x8210,
-	0xa294, 0x00ff, 0x2202, 0x8217, 0x7818, 0xa080, 0x0028, 0x2004,
-	0xd0bc, 0x0040, 0x5e9d, 0x0d7e, 0xa0e8, 0x8934, 0x2d6c, 0x6810,
-	0xa085, 0x0600, 0x20a2, 0x6814, 0x20a2, 0x2069, 0x881a, 0x2da6,
-	0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x5eac, 0x0d7e, 0xa0e8, 0x8934,
-	0x2d6c, 0x6810, 0xa085, 0x0600, 0x20a2, 0x6814, 0x20a2, 0x0d7f,
-	0x20a3, 0x0000, 0x6130, 0x21a2, 0x20a3, 0x0829, 0x20a3, 0x0000,
-	0x22a2, 0x20a3, 0x0000, 0x2fa2, 0x20a3, 0xffff, 0x20a3, 0x0000,
-	0x20a3, 0x0000, 0x007c, 0x0d7e, 0x157e, 0x137e, 0x147e, 0x20a1,
-	0x020b, 0x1078, 0x5edb, 0x7810, 0x2068, 0x6860, 0x20a2, 0x685c,
-	0x20a2, 0x6880, 0x20a2, 0x687c, 0x20a2, 0xa006, 0x20a2, 0x20a2,
-	0x20a2, 0x20a2, 0x60c3, 0x000c, 0x1078, 0x621e, 0x147f, 0x137f,
-	0x157f, 0x0d7f, 0x007c, 0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000,
-	0x7818, 0xa080, 0x0028, 0x2004, 0xd0bc, 0x0040, 0x5ef9, 0x0d7e,
-	0xa0e8, 0x8934, 0x2d6c, 0x6810, 0xa085, 0x0500, 0x20a2, 0x6814,
-	0x20a2, 0x2069, 0x881a, 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078,
-	0x5f08, 0x0d7e, 0xa0e8, 0x8934, 0x2d6c, 0x6810, 0xa085, 0x0500,
-	0x20a2, 0x6814, 0x20a2, 0x0d7f, 0x20a3, 0x0000, 0x6230, 0x22a2,
-	0x20a3, 0x0889, 0x20a3, 0x0000, 0x1078, 0x620d, 0x22a2, 0x20a3,
-	0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000,
-	0x027f, 0x007c, 0x0d7e, 0x157e, 0x137e, 0x147e, 0x20a1, 0x020b,
-	0x1078, 0x6031, 0x7810, 0x2068, 0xa016, 0x22a2, 0x22a2, 0x22a2,
-	0x22a2, 0x22a2, 0x7810, 0xa084, 0xf000, 0x00c0, 0x5f37, 0x7810,
-	0xa084, 0x0700, 0x8007, 0x1079, 0x5f3f, 0x0078, 0x5f3a, 0xa006,
-	0x1079, 0x5f3f, 0x147f, 0x137f, 0x157f, 0x0d7f, 0x007c, 0x5f49,
-	0x5fcf, 0x5fd3, 0x5ff6, 0x6003, 0x6018, 0x601c, 0x5f47, 0x1078,
-	0x12d2, 0x017e, 0x037e, 0x694c, 0xa18c, 0x0003, 0x0040, 0x5f54,
-	0xa186, 0x0003, 0x00c0, 0x5f5e, 0x6b78, 0x23a2, 0x6868, 0x20a2,
-	0x6864, 0x20a2, 0x037f, 0x017f, 0x0078, 0x5ffa, 0xa186, 0x0001,
-	0x10c0, 0x12d2, 0x6b78, 0x23a2, 0x6868, 0x20a2, 0x6864, 0x20a2,
-	0x22a2, 0x6874, 0x20a2, 0x22a2, 0x687c, 0x20a2, 0x2009, 0x0018,
-	0xa384, 0x0300, 0x0040, 0x5fc9, 0xd3c4, 0x0040, 0x5f79, 0x687c,
-	0xa108, 0xd3cc, 0x0040, 0x5f7e, 0x6874, 0xa108, 0x157e, 0x20a9,
-	0x000d, 0xad80, 0x0020, 0x201c, 0x831f, 0x23a2, 0x8000, 0x00f0,
-	0x5f83, 0x157f, 0x22a2, 0x22a2, 0x22a2, 0xa184, 0x0003, 0x0040,
-	0x5fc9, 0x20a1, 0x020b, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x007e,
-	0x7818, 0xa080, 0x0028, 0x2004, 0xd0bc, 0x0040, 0x5fb1, 0x0d7e,
-	0xa0e8, 0x8934, 0x2d6c, 0x6810, 0xa085, 0x0700, 0x20a2, 0x6814,
-	0x20a2, 0x2069, 0x881a, 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078,
-	0x5fc0, 0x0d7e, 0xa0e8, 0x8934, 0x2d6c, 0x6810, 0xa085, 0x0700,
-	0x20a2, 0x6814, 0x20a2, 0x0d7f, 0x20a3, 0x0000, 0x6230, 0x22a2,
-	0x007f, 0x20a3, 0x0898, 0x20a2, 0x1078, 0x620d, 0x22a2, 0x20a3,
-	0x0000, 0x61c2, 0x037f, 0x017f, 0x1078, 0x621e, 0x007c, 0x20a3,
-	0x0008, 0x0078, 0x5ff8, 0x20a3, 0x0302, 0x22a2, 0x22a2, 0x22a2,
-	0x20a3, 0x0012, 0x22a2, 0x20a3, 0x0008, 0x22a2, 0x22a2, 0x22a2,
-	0x22a2, 0x20a3, 0x7000, 0x20a3, 0x0500, 0x22a2, 0x20a3, 0x000a,
-	0x22a2, 0x22a2, 0x20a3, 0x2500, 0x22a2, 0x22a2, 0x22a2, 0x22a2,
-	0x22a2, 0x60c3, 0x0032, 0x1078, 0x621e, 0x007c, 0x20a3, 0x0028,
-	0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x60c3, 0x0018,
-	0x1078, 0x621e, 0x007c, 0x20a3, 0x0100, 0x22a2, 0x22a2, 0x22a2,
-	0x22a2, 0x22a2, 0x20a3, 0x0008, 0x22a2, 0x7824, 0xa084, 0x00ff,
-	0x20a2, 0x22a2, 0x22a2, 0x60c3, 0x0020, 0x1078, 0x621e, 0x007c,
-	0x20a3, 0x0008, 0x0078, 0x5ff8, 0x037e, 0x7b10, 0xa384, 0xff00,
-	0x7812, 0xa384, 0x00ff, 0x8001, 0x00c0, 0x602a, 0x22a2, 0x037f,
-	0x0078, 0x5ff8, 0x20a3, 0x0800, 0x22a2, 0x20a2, 0x037f, 0x0078,
-	0x5ffa, 0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080,
-	0x0028, 0x2004, 0xd0bc, 0x0040, 0x604f, 0x0d7e, 0xa0e8, 0x8934,
-	0x2d6c, 0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, 0x20a2, 0x2069,
-	0x881a, 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x605e, 0x0d7e,
-	0xa0e8, 0x8934, 0x2d6c, 0x6810, 0xa085, 0x0700, 0x20a2, 0x6814,
-	0x20a2, 0x0d7f, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3, 0x0898,
-	0x20a3, 0x0000, 0x1078, 0x620d, 0x22a2, 0x20a3, 0x0000, 0x7a08,
-	0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x027f, 0x007c,
-	0x0d7e, 0x157e, 0x137e, 0x147e, 0x017e, 0x037e, 0x7810, 0xa084,
-	0x0700, 0x8007, 0x1079, 0x6083, 0x037f, 0x017f, 0x147f, 0x137f,
-	0x157f, 0x0d7f, 0x007c, 0x608b, 0x608b, 0x608d, 0x608b, 0x608b,
-	0x608b, 0x60b2, 0x608b, 0x1078, 0x12d2, 0x7910, 0xa18c, 0xf8ff,
-	0xa18d, 0x0600, 0x7912, 0x20a1, 0x020b, 0x2009, 0x0003, 0x1078,
-	0x60bc, 0x0d7e, 0x2069, 0x8851, 0x6804, 0xd0bc, 0x0040, 0x60a7,
-	0x682c, 0xa084, 0x00ff, 0x8007, 0x20a2, 0x0078, 0x60a9, 0x20a3,
-	0x3f00, 0x0d7f, 0x22a2, 0x22a2, 0x22a2, 0x60c3, 0x0001, 0x1078,
-	0x621e, 0x007c, 0x20a1, 0x020b, 0x2009, 0x0003, 0x1078, 0x60bc,
-	0x20a3, 0x7f00, 0x0078, 0x60aa, 0x027e, 0x20e1, 0x9080, 0x20e1,
-	0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0xd0bc, 0x0040, 0x60da,
-	0x0d7e, 0xa0e8, 0x8934, 0x2d6c, 0x6810, 0xa085, 0x0100, 0x20a2,
-	0x6814, 0x20a2, 0x2069, 0x881a, 0x2da6, 0x8d68, 0x2da6, 0x0d7f,
-	0x0078, 0x60e9, 0x0d7e, 0xa0e8, 0x8934, 0x2d6c, 0x6810, 0xa085,
-	0x0100, 0x20a2, 0x6814, 0x20a2, 0x0d7f, 0x20a3, 0x0000, 0x6230,
-	0x22a2, 0x20a3, 0x0888, 0xa18d, 0x0008, 0x21a2, 0x1078, 0x620d,
-	0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000,
-	0x20a3, 0x0000, 0x027f, 0x007c, 0x0e7e, 0x0d7e, 0x0c7e, 0x057e,
-	0x047e, 0x037e, 0x2061, 0x0100, 0x2071, 0x8800, 0x6130, 0x7818,
-	0x2068, 0x68a0, 0x2028, 0xd0bc, 0x00c0, 0x6113, 0x6910, 0x6a14,
-	0x6430, 0x0078, 0x6117, 0x6910, 0x6a14, 0x7368, 0x746c, 0x781c,
-	0xa086, 0x0006, 0x0040, 0x6176, 0xd5bc, 0x0040, 0x6127, 0xa185,
-	0x0100, 0x6062, 0x6266, 0x636a, 0x646e, 0x0078, 0x612e, 0xa185,
-	0x0100, 0x6062, 0x6266, 0x606b, 0x0000, 0x646e, 0x6073, 0x0809,
-	0x6077, 0x0008, 0x688c, 0x8000, 0xa084, 0x00ff, 0x688e, 0x8007,
-	0x607a, 0x607f, 0x0000, 0x2f00, 0x6082, 0x7808, 0x6086, 0x7810,
-	0x2070, 0x7014, 0x608a, 0x7010, 0x608e, 0x700c, 0x60c6, 0x7008,
-	0x60ca, 0x686c, 0x60ce, 0x60ab, 0x0036, 0x60af, 0x95d5, 0x60d7,
-	0x0000, 0xa582, 0x0080, 0x0048, 0x6160, 0x6a00, 0xd2f4, 0x0040,
-	0x615e, 0x6a14, 0xa294, 0x00ff, 0x0078, 0x6160, 0x2011, 0x0000,
-	0x629e, 0x6017, 0x0016, 0x2009, 0x07d0, 0x60c4, 0xa084, 0xfff0,
-	0xa005, 0x0040, 0x616d, 0x2009, 0x1b58, 0x1078, 0x5174, 0x037f,
-	0x047f, 0x057f, 0x0c7f, 0x0d7f, 0x0e7f, 0x007c, 0x7810, 0x2070,
-	0x704c, 0xa084, 0x0003, 0xa086, 0x0002, 0x0040, 0x61c6, 0xd5bc,
-	0x0040, 0x618a, 0xa185, 0x0100, 0x6062, 0x6266, 0x636a, 0x646e,
-	0x0078, 0x6191, 0xa185, 0x0100, 0x6062, 0x6266, 0x606b, 0x0000,
-	0x646e, 0x6073, 0x0880, 0x6077, 0x0008, 0x688c, 0x8000, 0xa084,
-	0x00ff, 0x688e, 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, 0x6086,
-	0x7808, 0x6082, 0x7060, 0x608a, 0x705c, 0x608e, 0x7080, 0x60c6,
-	0x707c, 0x60ca, 0x686c, 0x60ce, 0x60ab, 0x0036, 0x60af, 0x95d5,
-	0x60d7, 0x0000, 0xa582, 0x0080, 0x0048, 0x61c1, 0x6a00, 0xd2f4,
-	0x0040, 0x61bf, 0x6a14, 0xa294, 0x00ff, 0x0078, 0x61c1, 0x2011,
-	0x0000, 0x629e, 0x6017, 0x0012, 0x0078, 0x6163, 0xd5bc, 0x0040,
-	0x61d1, 0xa185, 0x0700, 0x6062, 0x6266, 0x636a, 0x646e, 0x0078,
-	0x61d8, 0xa185, 0x0700, 0x6062, 0x6266, 0x606b, 0x0000, 0x646e,
-	0x6073, 0x0898, 0x6077, 0x0000, 0x688c, 0x8000, 0xa084, 0x00ff,
-	0x688e, 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, 0x6086, 0x7808,
-	0x6082, 0x7014, 0x608a, 0x7010, 0x608e, 0x700c, 0x60c6, 0x7008,
-	0x60ca, 0x686c, 0x60ce, 0x60ab, 0x0036, 0x60af, 0x95d5, 0x60d7,
-	0x0000, 0xa582, 0x0080, 0x0048, 0x6208, 0x6a00, 0xd2f4, 0x0040,
-	0x6206, 0x6a14, 0xa294, 0x00ff, 0x0078, 0x6208, 0x2011, 0x0000,
-	0x629e, 0x6017, 0x0016, 0x0078, 0x6163, 0x7a18, 0xa280, 0x0023,
-	0x2014, 0x8210, 0xa294, 0x00ff, 0x2202, 0x8217, 0x007c, 0x0d7e,
-	0x2069, 0x8aa2, 0x6843, 0x0001, 0x0d7f, 0x007c, 0x20e1, 0x9080,
-	0x60a3, 0x0056, 0x60a7, 0x9575, 0x1078, 0x6229, 0x1078, 0x5164,
-	0x007c, 0x007e, 0x6014, 0xa084, 0x0004, 0xa085, 0x0009, 0x6016,
-	0x007f, 0x007c, 0x007e, 0x0c7e, 0x2061, 0x0100, 0x6014, 0xa084,
-	0x0004, 0xa085, 0x0008, 0x6016, 0x0c7f, 0x007f, 0x007c, 0x0c7e,
-	0x0d7e, 0x017e, 0x027e, 0x1078, 0x516f, 0x2061, 0x0100, 0x2069,
-	0x0140, 0x6904, 0xa194, 0x4000, 0x0040, 0x627c, 0x1078, 0x6232,
-	0x6803, 0x1000, 0x6803, 0x0000, 0x0c7e, 0x2061, 0x8aa2, 0x6128,
-	0xa192, 0x0002, 0x00c8, 0x6269, 0x8108, 0x612a, 0x6124, 0x0c7f,
-	0x81ff, 0x0040, 0x6277, 0x1078, 0x5164, 0x1078, 0x6229, 0x0078,
-	0x6277, 0x6124, 0xa1e5, 0x0000, 0x0040, 0x6274, 0x1078, 0x8781,
-	0x2009, 0x0014, 0x1078, 0x6939, 0x0c7f, 0x0078, 0x6277, 0x027f,
-	0x017f, 0x0d7f, 0x0c7f, 0x007c, 0x1078, 0x3c73, 0x0078, 0x6277,
-	0x0c7e, 0x0d7e, 0x0e7e, 0x017e, 0x027e, 0x1078, 0x517c, 0x2071,
-	0x8aa2, 0x713c, 0x81ff, 0x0040, 0x62aa, 0x2061, 0x0100, 0x2069,
-	0x0140, 0x6904, 0xa194, 0x4000, 0x0040, 0x62b0, 0x6803, 0x1000,
-	0x6803, 0x0000, 0x037e, 0x2019, 0x0001, 0x1078, 0x642d, 0x037f,
-	0x713c, 0x2160, 0x1078, 0x8781, 0x2009, 0x004a, 0x1078, 0x6939,
-	0x0078, 0x62aa, 0x027f, 0x017f, 0x0e7f, 0x0d7f, 0x0c7f, 0x007c,
-	0x0078, 0x629a, 0x0e7e, 0x0d7e, 0x0c7e, 0x067e, 0x057e, 0x047e,
-	0x007e, 0x127e, 0x2091, 0x8000, 0x6018, 0x2068, 0x6ca0, 0x2071,
-	0x8aa2, 0x7018, 0x2068, 0x8dff, 0x0040, 0x62dc, 0x68a0, 0xa406,
-	0x0040, 0x62ce, 0x6854, 0x2068, 0x0078, 0x62c3, 0x6010, 0x2060,
-	0x643c, 0x6540, 0x6e48, 0x2d60, 0x1078, 0x40da, 0x0040, 0x62dc,
-	0x1078, 0x6601, 0xa085, 0x0001, 0x127f, 0x007f, 0x047f, 0x057f,
-	0x067f, 0x0c7f, 0x0d7f, 0x0e7f, 0x007c, 0x157e, 0x147e, 0x20a1,
-	0x020b, 0x1078, 0x5c09, 0x20a3, 0x0f00, 0x20a3, 0x0000, 0x20a3,
-	0x0000, 0x7808, 0x20a2, 0x60c3, 0x0008, 0x1078, 0x621e, 0x147f,
-	0x157f, 0x007c, 0x157e, 0x147e, 0x20a1, 0x020b, 0x1078, 0x5c87,
-	0x20a3, 0x0200, 0x20a3, 0x0000, 0x20a9, 0x0006, 0x2011, 0x8840,
-	0x2019, 0x8841, 0x23a6, 0x22a6, 0xa398, 0x0002, 0xa290, 0x0002,
-	0x00f0, 0x630a, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x001c,
-	0x1078, 0x621e, 0x147f, 0x157f, 0x007c, 0x157e, 0x147e, 0x017e,
-	0x027e, 0x20a1, 0x020b, 0x1078, 0x5c67, 0x1078, 0x5c7e, 0x7810,
-	0x007e, 0xa080, 0x0015, 0x2098, 0x7808, 0xa088, 0x0002, 0x21a8,
-	0x53a6, 0xa080, 0x0004, 0x8003, 0x60c2, 0x007f, 0xa080, 0x0001,
-	0x2004, 0x7812, 0x1078, 0x621e, 0x027f, 0x017f, 0x147f, 0x157f,
-	0x007c, 0x157e, 0x147e, 0x20a1, 0x020b, 0x1078, 0x5c09, 0x20a3,
-	0x6200, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x7808, 0x20a2, 0x60c3,
-	0x0008, 0x1078, 0x621e, 0x147f, 0x157f, 0x007c, 0x157e, 0x147e,
-	0x017e, 0x027e, 0x20a1, 0x020b, 0x1078, 0x5c09, 0x7810, 0x007e,
-	0xa080, 0x0017, 0x2098, 0x7808, 0xa088, 0x0002, 0x21a8, 0x53a6,
-	0x8003, 0x60c2, 0x007f, 0xa080, 0x0001, 0x2004, 0x7812, 0x1078,
-	0x621e, 0x027f, 0x017f, 0x147f, 0x157f, 0x007c, 0x0e7e, 0x0c7e,
-	0x007e, 0x127e, 0x2091, 0x8000, 0x2071, 0x8aa2, 0x700c, 0x2060,
-	0x8cff, 0x0040, 0x6392, 0x1078, 0x79d5, 0x00c0, 0x6389, 0x1078,
-	0x6bc7, 0x600c, 0x007e, 0x1078, 0x690e, 0x1078, 0x6601, 0x0c7f,
-	0x0078, 0x6380, 0x700f, 0x0000, 0x700b, 0x0000, 0x127f, 0x007f,
-	0x0c7f, 0x0e7f, 0x007c, 0x127e, 0x157e, 0x0f7e, 0x0e7e, 0x0d7e,
-	0x0c7e, 0x027e, 0x017e, 0x007e, 0x2091, 0x8000, 0x2069, 0x0100,
-	0x2079, 0x0140, 0x2071, 0x8aa2, 0x7024, 0x2060, 0x8cff, 0x0040,
-	0x63eb, 0x1078, 0x6232, 0x68c3, 0x0000, 0x1078, 0x516f, 0x2009,
-	0x0013, 0x1078, 0x6939, 0x20a9, 0x01f4, 0x6824, 0xd094, 0x0040,
-	0x63ce, 0x6827, 0x0004, 0x7804, 0xa084, 0x4000, 0x0040, 0x63e0,
-	0x7803, 0x1000, 0x7803, 0x0000, 0x0078, 0x63e0, 0xd084, 0x0040,
-	0x63d5, 0x6827, 0x0001, 0x0078, 0x63d7, 0x00f0, 0x63bd, 0x7804,
-	0xa084, 0x1000, 0x0040, 0x63e0, 0x7803, 0x0100, 0x7803, 0x0000,
-	0x6824, 0x007f, 0x017f, 0x027f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f,
-	0x157f, 0x127f, 0x007c, 0x2001, 0x8800, 0x2004, 0xa096, 0x0001,
-	0x0040, 0x6423, 0xa096, 0x0004, 0x0040, 0x6423, 0x6817, 0x0008,
-	0x68c3, 0x0000, 0x2011, 0x3c35, 0x1078, 0x50f2, 0x20a9, 0x01f4,
-	0x6824, 0xd094, 0x0040, 0x6411, 0x6827, 0x0004, 0x7804, 0xa084,
-	0x4000, 0x0040, 0x6423, 0x7803, 0x1000, 0x7803, 0x0000, 0x0078,
-	0x6423, 0xd084, 0x0040, 0x6418, 0x6827, 0x0001, 0x0078, 0x641a,
-	0x00f0, 0x6400, 0x7804, 0xa084, 0x1000, 0x0040, 0x6423, 0x7803,
-	0x0100, 0x7803, 0x0000, 0x007f, 0x017f, 0x027f, 0x0c7f, 0x0d7f,
-	0x0e7f, 0x0f7f, 0x157f, 0x127f, 0x007c, 0x127e, 0x157e, 0x0f7e,
-	0x0e7e, 0x0d7e, 0x0c7e, 0x027e, 0x017e, 0x007e, 0x2091, 0x8000,
-	0x2069, 0x0100, 0x2079, 0x0140, 0x2071, 0x8aa2, 0x703c, 0x2060,
-	0x8cff, 0x0040, 0x64a4, 0x6817, 0x0010, 0x68c7, 0x0000, 0x68cb,
-	0x0000, 0x1078, 0x517c, 0x1078, 0x1d84, 0x047e, 0x057e, 0x2009,
-	0x017f, 0x212c, 0x200b, 0x00a5, 0x2021, 0x0169, 0x2404, 0xa084,
-	0x000f, 0xa086, 0x0004, 0x00c0, 0x6473, 0x68c7, 0x0000, 0x68cb,
-	0x0008, 0x0e7e, 0x0f7e, 0x2079, 0x0020, 0x2071, 0x8af9, 0x6814,
-	0xa084, 0x0004, 0xa085, 0x0012, 0x6816, 0x7803, 0x0008, 0x7003,
-	0x0000, 0x0f7f, 0x0e7f, 0x250a, 0x057f, 0x047f, 0xa39d, 0x0000,
-	0x00c0, 0x647e, 0x2009, 0x0049, 0x1078, 0x6939, 0x20a9, 0x03e8,
-	0x6824, 0xd094, 0x0040, 0x6491, 0x6827, 0x0004, 0x7804, 0xa084,
-	0x4000, 0x0040, 0x64a3, 0x7803, 0x1000, 0x7803, 0x0000, 0x0078,
-	0x64a3, 0xd094, 0x0040, 0x6498, 0x6827, 0x0002, 0x0078, 0x649a,
-	0x00f0, 0x6480, 0x7804, 0xa084, 0x1000, 0x0040, 0x64a3, 0x7803,
-	0x0100, 0x7803, 0x0000, 0x6824, 0x007f, 0x017f, 0x027f, 0x0c7f,
-	0x0d7f, 0x0e7f, 0x0f7f, 0x157f, 0x127f, 0x007c, 0x0d7e, 0x127e,
-	0x2091, 0x8000, 0x2069, 0x8aa2, 0x6a06, 0x127f, 0x0d7f, 0x007c,
-	0x0d7e, 0x127e, 0x2091, 0x8000, 0x2069, 0x8aa2, 0x6a32, 0x127f,
-	0x0d7f, 0x007c, 0x0f7e, 0x0e7e, 0x0c7e, 0x067e, 0x007e, 0x127e,
-	0x2071, 0x8aa2, 0x7614, 0x2660, 0x2678, 0x2091, 0x8000, 0x8cff,
-	0x0040, 0x6502, 0x601c, 0xa206, 0x00c0, 0x64fd, 0x7014, 0xac36,
-	0x00c0, 0x64dc, 0x660c, 0x7616, 0x7010, 0xac36, 0x00c0, 0x64ea,
-	0x2c00, 0xaf36, 0x0040, 0x64e8, 0x2f00, 0x7012, 0x0078, 0x64ea,
-	0x7013, 0x0000, 0x660c, 0x067e, 0x2c00, 0xaf06, 0x0040, 0x64f3,
-	0x7e0e, 0x0078, 0x64f4, 0x2678, 0x600f, 0x0000, 0x1078, 0x79a8,
-	0x1078, 0x6601, 0x0c7f, 0x0078, 0x64cf, 0x2c78, 0x600c, 0x2060,
-	0x0078, 0x64cf, 0x127f, 0x007f, 0x067f, 0x0c7f, 0x0e7f, 0x0f7f,
-	0x007c, 0x157e, 0x147e, 0x20a1, 0x020b, 0x1078, 0x5e77, 0x7810,
-	0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x1000,
-	0x0078, 0x655c, 0x157e, 0x147e, 0x20a1, 0x020b, 0x1078, 0x5e77,
-	0x7810, 0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3,
-	0x4000, 0x0078, 0x655c, 0x157e, 0x147e, 0x20a1, 0x020b, 0x1078,
-	0x5e77, 0x7810, 0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2,
-	0x20a3, 0x2000, 0x0078, 0x655c, 0x157e, 0x147e, 0x20a1, 0x020b,
-	0x1078, 0x5e77, 0x7810, 0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2,
-	0x20a2, 0x20a3, 0x0400, 0x0078, 0x655c, 0x157e, 0x147e, 0x20a1,
-	0x020b, 0x1078, 0x5e77, 0x7810, 0x20a2, 0xa006, 0x20a2, 0x20a2,
-	0x20a2, 0x20a2, 0x20a3, 0x0200, 0x1078, 0x660c, 0x60c3, 0x0020,
-	0x1078, 0x621e, 0x147f, 0x157f, 0x007c, 0x127e, 0x0c7e, 0x2091,
-	0x8000, 0x2061, 0x0100, 0x6120, 0xd1b4, 0x00c0, 0x6574, 0xd1bc,
-	0x00c0, 0x65be, 0x0078, 0x65fe, 0x2009, 0x017f, 0x200b, 0x00a1,
-	0x157e, 0x007e, 0x0d7e, 0x2069, 0x0140, 0x20a9, 0x001e, 0x2009,
-	0x0169, 0x6804, 0xa084, 0x4000, 0x0040, 0x65b5, 0x6020, 0xd0b4,
-	0x0040, 0x65b5, 0x6024, 0xd094, 0x00c0, 0x65b5, 0x2104, 0xa084,
-	0x000f, 0xa086, 0x0004, 0x00c0, 0x65b5, 0x00f0, 0x6581, 0x027e,
-	0x6198, 0xa18c, 0x00ff, 0x8107, 0x6130, 0xa18c, 0x00ff, 0xa10d,
-	0x6088, 0x628c, 0x618e, 0x608b, 0xbc91, 0x6043, 0x0001, 0x6043,
-	0x0000, 0x608a, 0x628e, 0x6024, 0xd094, 0x00c0, 0x65b4, 0x6a04,
-	0xa294, 0x4000, 0x00c0, 0x65ab, 0x027f, 0x0d7f, 0x007f, 0x157f,
-	0x2009, 0x017f, 0x200b, 0x0000, 0x0078, 0x65fe, 0x2009, 0x017f,
-	0x200b, 0x00a1, 0x157e, 0x007e, 0x0d7e, 0x2069, 0x0140, 0x20a9,
-	0x001e, 0x2009, 0x0169, 0x6804, 0xa084, 0x4000, 0x0040, 0x65f7,
-	0x6020, 0xd0bc, 0x0040, 0x65f7, 0x2104, 0xa084, 0x000f, 0xa086,
-	0x0004, 0x00c0, 0x65f7, 0x00f0, 0x65cb, 0x027e, 0x6164, 0xa18c,
-	0x00ff, 0x8107, 0x6130, 0xa18c, 0x00ff, 0xa10d, 0x6088, 0x628c,
-	0x608b, 0xbc91, 0x618e, 0x6043, 0x0001, 0x6043, 0x0000, 0x608a,
-	0x628e, 0x6a04, 0xa294, 0x4000, 0x00c0, 0x65f1, 0x027f, 0x0d7f,
-	0x007f, 0x157f, 0x2009, 0x017f, 0x200b, 0x0000, 0x0c7f, 0x127f,
-	0x007c, 0x0e7e, 0x2071, 0x8aa2, 0x7020, 0xa005, 0x0040, 0x660a,
-	0x8001, 0x7022, 0x0e7f, 0x007c, 0x20a9, 0x0008, 0x20a2, 0x00f0,
-	0x660e, 0x20a2, 0x20a2, 0x007c, 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e,
-	0x077e, 0x067e, 0x007e, 0x127e, 0x2091, 0x8000, 0x2071, 0x8aa2,
-	0x7614, 0x2660, 0x2678, 0x2039, 0x0001, 0x87ff, 0x0040, 0x66ad,
-	0x8cff, 0x0040, 0x66ad, 0x601c, 0xa086, 0x0006, 0x00c0, 0x66a8,
-	0x88ff, 0x0040, 0x663b, 0x2800, 0xac06, 0x00c0, 0x66a8, 0x2039,
-	0x0000, 0x0078, 0x6646, 0x6018, 0xa206, 0x00c0, 0x66a8, 0x85ff,
-	0x0040, 0x6646, 0x6020, 0xa106, 0x00c0, 0x66a8, 0x7024, 0xac06,
-	0x00c0, 0x6676, 0x2069, 0x0100, 0x68c0, 0xa005, 0x0040, 0x6671,
-	0x1078, 0x516f, 0x6817, 0x0008, 0x68c3, 0x0000, 0x1078, 0x6741,
-	0x7027, 0x0000, 0x037e, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000,
-	0x0040, 0x6666, 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100,
-	0x6824, 0xd084, 0x0040, 0x666e, 0x6827, 0x0001, 0x037f, 0x0078,
-	0x6676, 0x6003, 0x0009, 0x630a, 0x0078, 0x66a8, 0x7014, 0xac36,
-	0x00c0, 0x667c, 0x660c, 0x7616, 0x7010, 0xac36, 0x00c0, 0x668a,
-	0x2c00, 0xaf36, 0x0040, 0x6688, 0x2f00, 0x7012, 0x0078, 0x668a,
-	0x7013, 0x0000, 0x660c, 0x067e, 0x2c00, 0xaf06, 0x0040, 0x6693,
-	0x7e0e, 0x0078, 0x6694, 0x2678, 0x600f, 0x0000, 0x6010, 0x2068,
-	0x1078, 0x77ed, 0x0040, 0x669e, 0x1078, 0x86aa, 0x1078, 0x79a8,
-	0x1078, 0x6601, 0x88ff, 0x00c0, 0x66b7, 0x0c7f, 0x0078, 0x6625,
-	0x2c78, 0x600c, 0x2060, 0x0078, 0x6625, 0xa006, 0x127f, 0x007f,
-	0x067f, 0x077f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x6017,
-	0x0000, 0x0c7f, 0xa8c5, 0x0001, 0x0078, 0x66ae, 0x0f7e, 0x0e7e,
-	0x0d7e, 0x0c7e, 0x067e, 0x027e, 0x007e, 0x127e, 0x2091, 0x8000,
-	0x2071, 0x8aa2, 0x7638, 0x2660, 0x2678, 0x8cff, 0x0040, 0x6730,
-	0x601c, 0xa086, 0x0006, 0x00c0, 0x672b, 0x88ff, 0x0040, 0x66de,
-	0x2800, 0xac06, 0x00c0, 0x672b, 0x0078, 0x66e9, 0x6018, 0xa206,
-	0x00c0, 0x672b, 0x85ff, 0x0040, 0x66e9, 0x6020, 0xa106, 0x00c0,
-	0x672b, 0x703c, 0xac06, 0x00c0, 0x66fb, 0x037e, 0x2019, 0x0001,
-	0x1078, 0x642d, 0x7033, 0x0000, 0x703f, 0x0000, 0x7043, 0x0000,
-	0x7047, 0x0000, 0x037f, 0x7038, 0xac36, 0x00c0, 0x6701, 0x660c,
-	0x763a, 0x7034, 0xac36, 0x00c0, 0x670f, 0x2c00, 0xaf36, 0x0040,
-	0x670d, 0x2f00, 0x7036, 0x0078, 0x670f, 0x7037, 0x0000, 0x660c,
-	0x067e, 0x2c00, 0xaf06, 0x0040, 0x6718, 0x7e0e, 0x0078, 0x6719,
-	0x2678, 0x600f, 0x0000, 0x6010, 0x2068, 0x1078, 0x77ed, 0x0040,
-	0x6723, 0x1078, 0x86aa, 0x1078, 0x79a8, 0x88ff, 0x00c0, 0x673a,
-	0x0c7f, 0x0078, 0x66cd, 0x2c78, 0x600c, 0x2060, 0x0078, 0x66cd,
-	0xa006, 0x127f, 0x007f, 0x027f, 0x067f, 0x0c7f, 0x0d7f, 0x0e7f,
-	0x0f7f, 0x007c, 0x6017, 0x0000, 0x0c7f, 0xa8c5, 0x0001, 0x0078,
-	0x6731, 0x0e7e, 0x2071, 0x8aa2, 0x2001, 0x8800, 0x2004, 0xa086,
-	0x0002, 0x00c0, 0x674f, 0x7007, 0x0005, 0x0078, 0x6751, 0x7007,
-	0x0000, 0x0e7f, 0x007c, 0x0f7e, 0x0e7e, 0x0c7e, 0x067e, 0x027e,
-	0x007e, 0x127e, 0x2091, 0x8000, 0x2071, 0x8aa2, 0x2c10, 0x7638,
-	0x2660, 0x2678, 0x8cff, 0x0040, 0x6791, 0x2200, 0xac06, 0x00c0,
-	0x678c, 0x7038, 0xac36, 0x00c0, 0x676f, 0x660c, 0x763a, 0x7034,
-	0xac36, 0x00c0, 0x677d, 0x2c00, 0xaf36, 0x0040, 0x677b, 0x2f00,
-	0x7036, 0x0078, 0x677d, 0x7037, 0x0000, 0x660c, 0x2c00, 0xaf06,
-	0x0040, 0x6785, 0x7e0e, 0x0078, 0x6786, 0x2678, 0x600f, 0x0000,
-	0xa085, 0x0001, 0x0078, 0x6791, 0x2c78, 0x600c, 0x2060, 0x0078,
-	0x6762, 0x127f, 0x007f, 0x027f, 0x067f, 0x0c7f, 0x0e7f, 0x0f7f,
-	0x007c, 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x067e, 0x007e, 0x127e,
-	0x2091, 0x8000, 0x2071, 0x8aa2, 0x760c, 0x2660, 0x2678, 0x8cff,
-	0x0040, 0x682a, 0x6018, 0xa080, 0x0028, 0x2004, 0xa206, 0x00c0,
-	0x6825, 0x7024, 0xac06, 0x00c0, 0x67d8, 0x2069, 0x0100, 0x68c0,
-	0xa005, 0x0040, 0x67d8, 0x1078, 0x6232, 0x68c3, 0x0000, 0x1078,
-	0x6741, 0x7027, 0x0000, 0x037e, 0x2069, 0x0140, 0x6b04, 0xa384,
-	0x1000, 0x0040, 0x67cf, 0x6803, 0x0100, 0x6803, 0x0000, 0x2069,
-	0x0100, 0x6824, 0xd084, 0x0040, 0x67d7, 0x6827, 0x0001, 0x037f,
-	0x700c, 0xac36, 0x00c0, 0x67de, 0x660c, 0x760e, 0x7008, 0xac36,
-	0x00c0, 0x67ec, 0x2c00, 0xaf36, 0x0040, 0x67ea, 0x2f00, 0x700a,
-	0x0078, 0x67ec, 0x700b, 0x0000, 0x660c, 0x067e, 0x2c00, 0xaf06,
-	0x0040, 0x67f5, 0x7e0e, 0x0078, 0x67f6, 0x2678, 0x600f, 0x0000,
-	0x1078, 0x79c1, 0x00c0, 0x6800, 0x1078, 0x24e5, 0x0078, 0x681c,
-	0x1078, 0x79d5, 0x00c0, 0x6808, 0x1078, 0x6bc7, 0x0078, 0x681c,
-	0x6010, 0x2068, 0x1078, 0x77ed, 0x0040, 0x681c, 0x601c, 0xa086,
-	0x0003, 0x00c0, 0x6832, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000,
-	0x1078, 0x4376, 0x1078, 0x799b, 0x6003, 0x0000, 0x1078, 0x79a8,
-	0x1078, 0x6601, 0x0c7f, 0x0078, 0x67a7, 0x2c78, 0x600c, 0x2060,
-	0x0078, 0x67a7, 0x127f, 0x007f, 0x067f, 0x0c7f, 0x0d7f, 0x0e7f,
-	0x0f7f, 0x007c, 0x601c, 0xa086, 0x0006, 0x00c0, 0x6813, 0x1078,
-	0x86aa, 0x0078, 0x681c, 0x037e, 0x157e, 0x137e, 0x147e, 0x3908,
-	0xa006, 0xa190, 0x0020, 0x221c, 0xa39e, 0x231e, 0x00c0, 0x684c,
-	0x8210, 0x8000, 0x0078, 0x6843, 0xa005, 0x0040, 0x6856, 0x20a9,
-	0x0020, 0x2198, 0xa110, 0x22a0, 0x22c8, 0x53a3, 0x147f, 0x137f,
-	0x157f, 0x037f, 0x007c, 0x0d7e, 0x20a1, 0x020b, 0x1078, 0x5c87,
-	0x20a3, 0x0200, 0x20a3, 0x0014, 0x60c3, 0x0014, 0x20a3, 0x0000,
-	0x20a3, 0x0000, 0x2099, 0x8a9c, 0x20a9, 0x0004, 0x53a6, 0x20a3,
-	0x0004, 0x20a3, 0x7878, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x1078,
-	0x621e, 0x0d7f, 0x007c, 0x20a1, 0x020b, 0x1078, 0x5c87, 0x20a3,
-	0x0210, 0x20a3, 0x0018, 0x20a3, 0x0800, 0x7810, 0xa084, 0xff00,
-	0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3,
-	0x0000, 0x20a3, 0x0000, 0x7810, 0xa084, 0x00ff, 0x20a2, 0x20a3,
-	0x0000, 0x20a3, 0x0000, 0x60c3, 0x0018, 0x1078, 0x621e, 0x007c,
-	0x2061, 0x8f00, 0x2a70, 0x7060, 0x7046, 0x704b, 0x8f00, 0x007c,
-	0x0e7e, 0x127e, 0x2071, 0x8800, 0x2091, 0x8000, 0x7544, 0xa582,
-	0x0001, 0x0048, 0x68da, 0x7048, 0x2060, 0x6000, 0xa086, 0x0000,
-	0x0040, 0x68c6, 0xace0, 0x000c, 0x7054, 0xac02, 0x00c8, 0x68c2,
-	0x0078, 0x68b5, 0x2061, 0x8f00, 0x0078, 0x68b5, 0x6003, 0x0008,
-	0x8529, 0x7546, 0xaca8, 0x000c, 0x7054, 0xa502, 0x00c8, 0x68d6,
-	0x754a, 0xa085, 0x0001, 0x127f, 0x0e7f, 0x007c, 0x704b, 0x8f00,
-	0x0078, 0x68d1, 0xa006, 0x0078, 0x68d3, 0x0e7e, 0x2071, 0x8800,
-	0x7544, 0xa582, 0x0001, 0x0048, 0x690b, 0x7048, 0x2060, 0x6000,
-	0xa086, 0x0000, 0x0040, 0x68f8, 0xace0, 0x000c, 0x7054, 0xac02,
-	0x00c8, 0x68f4, 0x0078, 0x68e7, 0x2061, 0x8f00, 0x0078, 0x68e7,
-	0x6003, 0x0008, 0x8529, 0x7546, 0xaca8, 0x000c, 0x7054, 0xa502,
-	0x00c8, 0x6907, 0x754a, 0xa085, 0x0001, 0x0e7f, 0x007c, 0x704b,
-	0x8f00, 0x0078, 0x6903, 0xa006, 0x0078, 0x6905, 0xac82, 0x8f00,
-	0x1048, 0x12d2, 0x2001, 0x8815, 0x2004, 0xac02, 0x10c8, 0x12d2,
-	0xa006, 0x6006, 0x600a, 0x600e, 0x6012, 0x6016, 0x601a, 0x601f,
-	0x0000, 0x6003, 0x0000, 0x6022, 0x6026, 0x602a, 0x602e, 0x2061,
-	0x8800, 0x6044, 0x8000, 0x6046, 0xa086, 0x0001, 0x0040, 0x6931,
-	0x007c, 0x127e, 0x2091, 0x8000, 0x1078, 0x5888, 0x127f, 0x0078,
-	0x6930, 0x601c, 0xa084, 0x000f, 0x0079, 0x693e, 0x6947, 0x6958,
-	0x6974, 0x6990, 0x7a52, 0x7a6e, 0x7a8a, 0x6947, 0x6958, 0xa186,
-	0x0013, 0x00c0, 0x6950, 0x1078, 0x578f, 0x1078, 0x5888, 0x007c,
-	0xa18e, 0x0047, 0x00c0, 0x6957, 0xa016, 0x1078, 0x1594, 0x007c,
-	0x067e, 0x6000, 0xa0b2, 0x0010, 0x10c8, 0x12d2, 0x1079, 0x6962,
-	0x067f, 0x007c, 0x6972, 0x6a89, 0x6be6, 0x6972, 0x6c46, 0x6972,
-	0x6972, 0x6972, 0x6a28, 0x6f24, 0x6972, 0x6972, 0x6972, 0x6972,
-	0x6972, 0x6972, 0x1078, 0x12d2, 0x067e, 0x6000, 0xa0b2, 0x0010,
-	0x10c8, 0x12d2, 0x1079, 0x697e, 0x067f, 0x007c, 0x698e, 0x698e,
-	0x698e, 0x698e, 0x698e, 0x698e, 0x698e, 0x698e, 0x7419, 0x74f8,
-	0x698e, 0x7432, 0x7492, 0x7432, 0x7492, 0x698e, 0x1078, 0x12d2,
-	0x067e, 0x6000, 0xa0b2, 0x0010, 0x10c8, 0x12d2, 0x1079, 0x699a,
-	0x067f, 0x007c, 0x69aa, 0x6f65, 0x7020, 0x70fa, 0x7257, 0x69aa,
-	0x69aa, 0x69aa, 0x6f40, 0x73c7, 0x73cb, 0x69aa, 0x69aa, 0x69aa,
-	0x69aa, 0x73f5, 0x1078, 0x12d2, 0x20a9, 0x000e, 0x2e98, 0x6010,
-	0x20a0, 0x53a3, 0x20a9, 0x0006, 0x3310, 0x3420, 0x9398, 0x94a0,
-	0x3318, 0x3428, 0x222e, 0x2326, 0xa290, 0x0002, 0xa5a8, 0x0002,
-	0xa398, 0x0002, 0xa4a0, 0x0002, 0x00f0, 0x69ba, 0x0e7e, 0x1078,
-	0x77ed, 0x0040, 0x69d1, 0x6010, 0x2070, 0x7007, 0x0000, 0x7037,
-	0x0103, 0x0e7f, 0x1078, 0x690e, 0x007c, 0x0d7e, 0x037e, 0x7330,
-	0xa386, 0x0200, 0x00c0, 0x69e2, 0x6018, 0x2068, 0x6813, 0x00ff,
-	0x6817, 0xfffd, 0x6010, 0xa005, 0x0040, 0x69ec, 0x2068, 0x6807,
-	0x0000, 0x6837, 0x0103, 0x6b32, 0x1078, 0x690e, 0x037f, 0x0d7f,
-	0x007c, 0x017e, 0x20a9, 0x002a, 0xae80, 0x000c, 0x2098, 0x6010,
-	0xa080, 0x0002, 0x20a0, 0x53a3, 0x20a9, 0x002a, 0x6010, 0xa080,
-	0x0001, 0x2004, 0xa080, 0x0002, 0x20a0, 0x53a3, 0x0e7e, 0x6010,
-	0x2004, 0x2070, 0x7037, 0x0103, 0x0e7f, 0x1078, 0x690e, 0x017f,
-	0x007c, 0x0d7e, 0x20a9, 0x000e, 0x2e98, 0x6010, 0x20a0, 0x53a3,
-	0xa1b6, 0x0015, 0x00c0, 0x6a25, 0x6018, 0x2068, 0x7038, 0x680a,
-	0x703c, 0x680e, 0x6800, 0xc08d, 0x6802, 0x0d7f, 0x0078, 0x69c6,
-	0x2100, 0xa1b2, 0x0040, 0x10c8, 0x12d2, 0x0079, 0x6a2f, 0x6a71,
-	0x6a7d, 0x6a71, 0x6a71, 0x6a71, 0x6a71, 0x6a6f, 0x6a6f, 0x6a6f,
-	0x6a6f, 0x6a6f, 0x6a6f, 0x6a6f, 0x6a6f, 0x6a6f, 0x6a6f, 0x6a6f,
-	0x6a6f, 0x6a6f, 0x6a6f, 0x6a6f, 0x6a6f, 0x6a6f, 0x6a6f, 0x6a6f,
-	0x6a6f, 0x6a6f, 0x6a6f, 0x6a6f, 0x6a6f, 0x6a6f, 0x6a71, 0x6a6f,
-	0x6a71, 0x6a71, 0x6a6f, 0x6a6f, 0x6a6f, 0x6a6f, 0x6a6f, 0x6a71,
-	0x6a6f, 0x6a6f, 0x6a6f, 0x6a6f, 0x6a6f, 0x6a6f, 0x6a6f, 0x6a6f,
-	0x6a6f, 0x6a71, 0x6a6f, 0x6a6f, 0x6a6f, 0x6a6f, 0x6a6f, 0x6a6f,
-	0x6a6f, 0x6a6f, 0x6a6f, 0x6a6f, 0x6a71, 0x6a6f, 0x6a6f, 0x1078,
-	0x12d2, 0x6003, 0x0001, 0x6106, 0x1078, 0x53e6, 0x127e, 0x2091,
-	0x8000, 0x1078, 0x5888, 0x127f, 0x007c, 0x6003, 0x0001, 0x6106,
-	0x1078, 0x53e6, 0x127e, 0x2091, 0x8000, 0x1078, 0x5888, 0x127f,
-	0x007c, 0x6004, 0xa0b2, 0x0040, 0x10c8, 0x12d2, 0xa1b6, 0x0013,
-	0x00c0, 0x6a95, 0x2008, 0x0079, 0x6b35, 0xa1b6, 0x0027, 0x00c0,
-	0x6af2, 0x1078, 0x578f, 0x6004, 0x1078, 0x79c1, 0x0040, 0x6ab2,
-	0x1078, 0x79d5, 0x0040, 0x6aea, 0xa08e, 0x0021, 0x0040, 0x6aee,
-	0xa08e, 0x0022, 0x0040, 0x6aea, 0xa08e, 0x003d, 0x0040, 0x6aee,
-	0x0078, 0x6ae5, 0x1078, 0x24e5, 0x2001, 0x0007, 0x1078, 0x3f05,
-	0x6018, 0xa080, 0x0028, 0x200c, 0x1078, 0x6bc7, 0xa186, 0x007e,
-	0x00c0, 0x6ac7, 0x2001, 0x8830, 0x2014, 0xc285, 0x2202, 0x017e,
-	0x027e, 0x037e, 0x2110, 0x2019, 0x0028, 0x1078, 0x54f0, 0x087e,
-	0x2041, 0x0000, 0x1078, 0x5419, 0x0c7e, 0x6018, 0xa065, 0x0040,
-	0x6adb, 0x1078, 0x418b, 0x0c7f, 0x2c08, 0x1078, 0x84d2, 0x087f,
-	0x037f, 0x027f, 0x017f, 0x1078, 0x3f76, 0x1078, 0x690e, 0x1078,
-	0x5888, 0x007c, 0x1078, 0x6bc7, 0x0078, 0x6ae5, 0x1078, 0x6bda,
-	0x0078, 0x6ae5, 0xa186, 0x0014, 0x00c0, 0x6ae9, 0x1078, 0x578f,
-	0x1078, 0x24bf, 0x1078, 0x79c1, 0x00c0, 0x6b11, 0x1078, 0x24e5,
-	0x6018, 0xa080, 0x0028, 0x200c, 0x1078, 0x6bc7, 0xa186, 0x007e,
-	0x00c0, 0x6b0f, 0x2001, 0x8830, 0x200c, 0xc185, 0x2102, 0x0078,
-	0x6ae5, 0x1078, 0x79d5, 0x00c0, 0x6b19, 0x1078, 0x6bc7, 0x0078,
-	0x6ae5, 0x6004, 0xa08e, 0x0032, 0x00c0, 0x6b2a, 0x0e7e, 0x0f7e,
-	0x2071, 0x8881, 0x2079, 0x0000, 0x1078, 0x27c9, 0x0f7f, 0x0e7f,
-	0x0078, 0x6ae5, 0x6004, 0xa08e, 0x0021, 0x0040, 0x6b15, 0xa08e,
-	0x0022, 0x1040, 0x6bda, 0x0078, 0x6ae5, 0x6b77, 0x6b79, 0x6b7d,
-	0x6b81, 0x6b85, 0x6b89, 0x6b75, 0x6b75, 0x6b75, 0x6b75, 0x6b75,
-	0x6b75, 0x6b75, 0x6b75, 0x6b75, 0x6b75, 0x6b75, 0x6b75, 0x6b75,
-	0x6b75, 0x6b75, 0x6b75, 0x6b75, 0x6b75, 0x6b75, 0x6b75, 0x6b75,
-	0x6b75, 0x6b75, 0x6b75, 0x6b8d, 0x6b93, 0x6b75, 0x6b9d, 0x6b93,
-	0x6b75, 0x6b75, 0x6b75, 0x6b75, 0x6b75, 0x6b93, 0x6b93, 0x6b75,
-	0x6b75, 0x6b75, 0x6b75, 0x6b75, 0x6b75, 0x6b75, 0x6b75, 0x6b75,
-	0x6b75, 0x6b75, 0x6b75, 0x6b75, 0x6b75, 0x6b75, 0x6b75, 0x6b75,
-	0x6b75, 0x6b75, 0x6b93, 0x6b75, 0x6b75, 0x1078, 0x12d2, 0x0078,
-	0x6b93, 0x2001, 0x000b, 0x0078, 0x6ba6, 0x2001, 0x0003, 0x0078,
-	0x6ba6, 0x2001, 0x0005, 0x0078, 0x6ba6, 0x2001, 0x0001, 0x0078,
-	0x6ba6, 0x2001, 0x0009, 0x0078, 0x6ba6, 0x1078, 0x12d2, 0x0078,
-	0x6ba5, 0x1078, 0x3f05, 0x1078, 0x578f, 0x6003, 0x0002, 0x6017,
-	0x0028, 0x1078, 0x5888, 0x0078, 0x6ba5, 0x1078, 0x578f, 0x6003,
-	0x0004, 0x6017, 0x0028, 0x1078, 0x5888, 0x007c, 0x1078, 0x3f05,
-	0x1078, 0x578f, 0x6003, 0x0002, 0x037e, 0x2019, 0x885c, 0x2304,
-	0xa084, 0xff00, 0x00c0, 0x6bb8, 0x2019, 0x0028, 0x0078, 0x6bc1,
-	0x8007, 0xa09a, 0x0004, 0x0048, 0x6bb4, 0x8003, 0x801b, 0x831b,
-	0xa318, 0x6316, 0x037f, 0x1078, 0x5888, 0x0078, 0x6ba5, 0x0e7e,
-	0x1078, 0x77ed, 0x0040, 0x6bd8, 0x6010, 0x2070, 0x7038, 0xd0fc,
-	0x0040, 0x6bd8, 0x7007, 0x0000, 0x7037, 0x0103, 0x7033, 0x0100,
-	0x0e7f, 0x007c, 0x0e7e, 0xacf0, 0x0004, 0x2e74, 0x7000, 0x2070,
-	0x7037, 0x0103, 0x7023, 0x8001, 0x0e7f, 0x007c, 0x0d7e, 0x6618,
-	0x2668, 0x6804, 0xa084, 0x00ff, 0x0d7f, 0xa0b2, 0x000c, 0x10c8,
-	0x12d2, 0x6604, 0xa6b6, 0x0028, 0x00c0, 0x6bfa, 0x1078, 0x7a0a,
-	0x0078, 0x6c35, 0x6604, 0xa6b6, 0x0029, 0x00c0, 0x6c03, 0x1078,
-	0x7a24, 0x0078, 0x6c35, 0x6604, 0xa6b6, 0x001f, 0x00c0, 0x6c0c,
-	0x1078, 0x69ac, 0x0078, 0x6c35, 0x6604, 0xa6b6, 0x0000, 0x00c0,
-	0x6c15, 0x1078, 0x6a11, 0x0078, 0x6c35, 0x6604, 0xa6b6, 0x0022,
-	0x00c0, 0x6c1e, 0x1078, 0x69d5, 0x0078, 0x6c35, 0x6604, 0xa6b6,
-	0x003d, 0x00c0, 0x6c27, 0x1078, 0x69f1, 0x0078, 0x6c35, 0xa1b6,
-	0x0015, 0x00c0, 0x6c2f, 0x1079, 0x6c3a, 0x0078, 0x6c35, 0xa1b6,
-	0x0016, 0x00c0, 0x6c36, 0x1079, 0x6d93, 0x007c, 0x1078, 0x6950,
-	0x0078, 0x6c35, 0x6c5e, 0x6c61, 0x6c5e, 0x6ca2, 0x6c5e, 0x6d2f,
-	0x6c5e, 0x6c5e, 0x6c5e, 0x6d6b, 0x6c5e, 0x6d81, 0xa1b6, 0x0048,
-	0x0040, 0x6c52, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x1078,
-	0x1594, 0x007c, 0x0e7e, 0xacf0, 0x0004, 0x2e74, 0x7000, 0x2070,
-	0x7037, 0x0103, 0x0e7f, 0x1078, 0x690e, 0x007c, 0x0005, 0x0005,
-	0x007c, 0x0e7e, 0x2071, 0x8800, 0x707c, 0xa086, 0x0074, 0x00c0,
-	0x6c8b, 0x1078, 0x84a6, 0x00c0, 0x6c7d, 0x0d7e, 0x6018, 0x2068,
-	0x1078, 0x6c8f, 0x0d7f, 0x2001, 0x0006, 0x1078, 0x3f05, 0x1078,
-	0x24e5, 0x1078, 0x690e, 0x0078, 0x6c8d, 0x2001, 0x000a, 0x1078,
-	0x3f05, 0x1078, 0x24e5, 0x6003, 0x0001, 0x6007, 0x0001, 0x1078,
-	0x53e6, 0x0078, 0x6c8d, 0x1078, 0x6d1f, 0x0e7f, 0x007c, 0x6800,
-	0xd084, 0x0040, 0x6ca1, 0x2001, 0x0000, 0x1078, 0x3ef1, 0x2069,
-	0x8851, 0x6804, 0xd0a4, 0x0040, 0x6ca1, 0x2001, 0x0006, 0x1078,
-	0x3f2c, 0x007c, 0x0d7e, 0x2011, 0x881f, 0x2204, 0xa086, 0x0074,
-	0x00c0, 0x6d1b, 0x1078, 0x6e79, 0x6018, 0x2068, 0xa080, 0x0028,
-	0x2014, 0xa286, 0x007e, 0x0040, 0x6cca, 0xa286, 0x0080, 0x00c0,
-	0x6cf3, 0x6813, 0x00ff, 0x6817, 0xfffc, 0x6010, 0xa005, 0x0040,
-	0x6ce9, 0x2068, 0x6807, 0x0000, 0x6837, 0x0103, 0x6833, 0x0200,
-	0x0078, 0x6ce9, 0x0e7e, 0x0f7e, 0x6813, 0x00ff, 0x6817, 0xfffe,
-	0x2071, 0x8830, 0x2e04, 0xa085, 0x0003, 0x2072, 0x2071, 0x8d80,
-	0x2079, 0x0100, 0x2e04, 0xa084, 0x00ff, 0x2069, 0x881a, 0x206a,
-	0x78e6, 0x8e70, 0x2e04, 0x2069, 0x881b, 0x206a, 0x78ea, 0x0f7f,
-	0x0e7f, 0x2001, 0x0006, 0x1078, 0x3f05, 0x1078, 0x24e5, 0x1078,
-	0x690e, 0x0078, 0x6d1d, 0x0e7e, 0x2071, 0x8830, 0x2e04, 0xd09c,
-	0x0040, 0x6d0e, 0x2071, 0x8d80, 0x7108, 0x720c, 0xa18c, 0x00ff,
-	0x00c0, 0x6d06, 0xa284, 0xff00, 0x0040, 0x6d0e, 0x6018, 0x2070,
-	0x70a0, 0xd0bc, 0x00c0, 0x6d0e, 0x7112, 0x7216, 0x0e7f, 0x2001,
-	0x0004, 0x1078, 0x3f05, 0x6003, 0x0001, 0x6007, 0x0003, 0x1078,
-	0x53e6, 0x0078, 0x6d1d, 0x1078, 0x6d1f, 0x0d7f, 0x007c, 0x2001,
-	0x8800, 0x2004, 0xa086, 0x0003, 0x0040, 0x6d2a, 0x2001, 0x0007,
-	0x1078, 0x3f05, 0x1078, 0x24e5, 0x1078, 0x690e, 0x007c, 0x0e7e,
-	0x2071, 0x8800, 0x707c, 0xa086, 0x0014, 0x00c0, 0x6d65, 0x7000,
-	0xa086, 0x0003, 0x00c0, 0x6d42, 0x6010, 0xa005, 0x00c0, 0x6d42,
-	0x1078, 0x31f8, 0x0d7e, 0x6018, 0x2068, 0x1078, 0x400a, 0x1078,
-	0x6c8f, 0x0d7f, 0x1078, 0x6e83, 0x00c0, 0x6d65, 0x2001, 0x0006,
-	0x1078, 0x3f05, 0x0e7e, 0x6010, 0xa005, 0x0040, 0x6d5e, 0x2070,
-	0x7007, 0x0000, 0x7037, 0x0103, 0x7033, 0x0200, 0x0e7f, 0x1078,
-	0x24e5, 0x1078, 0x690e, 0x0078, 0x6d69, 0x1078, 0x6bc7, 0x1078,
-	0x6d1f, 0x0e7f, 0x007c, 0x2011, 0x881f, 0x2204, 0xa086, 0x0014,
-	0x00c0, 0x6d7e, 0x2001, 0x0002, 0x1078, 0x3f05, 0x6003, 0x0001,
-	0x6007, 0x0001, 0x1078, 0x53e6, 0x0078, 0x6d80, 0x1078, 0x6d1f,
-	0x007c, 0x2011, 0x881f, 0x2204, 0xa086, 0x0004, 0x00c0, 0x6d90,
-	0x2001, 0x0007, 0x1078, 0x3f05, 0x1078, 0x690e, 0x0078, 0x6d92,
-	0x1078, 0x6d1f, 0x007c, 0x6c5e, 0x6d9f, 0x6c5e, 0x6dc7, 0x6c5e,
-	0x6e2c, 0x6c5e, 0x6c5e, 0x6c5e, 0x6e41, 0x6c5e, 0x6e54, 0x0d7e,
-	0x0c7e, 0x1078, 0x6e67, 0x00c0, 0x6db5, 0x2001, 0x0000, 0x1078,
-	0x3ef1, 0x2001, 0x0002, 0x1078, 0x3f05, 0x6003, 0x0001, 0x6007,
-	0x0002, 0x1078, 0x53e6, 0x0078, 0x6dc4, 0x2009, 0x8d8f, 0x2104,
-	0xa084, 0xff00, 0xa086, 0x1900, 0x00c0, 0x6dc2, 0x1078, 0x690e,
-	0x0078, 0x6dc4, 0x1078, 0x6d1f, 0x0c7f, 0x0d7f, 0x007c, 0x1078,
-	0x6e76, 0x00c0, 0x6ddb, 0x2001, 0x0000, 0x1078, 0x3ef1, 0x2001,
-	0x0002, 0x1078, 0x3f05, 0x6003, 0x0001, 0x6007, 0x0002, 0x1078,
-	0x53e6, 0x0078, 0x6e07, 0x1078, 0x6bc7, 0x2009, 0x8d8e, 0x2134,
-	0xa6b4, 0x00ff, 0xa686, 0x0005, 0x0040, 0x6e08, 0xa686, 0x000b,
-	0x0040, 0x6e05, 0x2009, 0x8d8f, 0x2104, 0xa084, 0xff00, 0x00c0,
-	0x6df5, 0xa686, 0x0009, 0x0040, 0x6e08, 0xa086, 0x1900, 0x00c0,
-	0x6e05, 0xa686, 0x0009, 0x0040, 0x6e08, 0x2001, 0x0004, 0x1078,
-	0x3f05, 0x1078, 0x690e, 0x0078, 0x6e07, 0x1078, 0x6d1f, 0x007c,
-	0x0d7e, 0x6010, 0x2068, 0x1078, 0x77ed, 0x0040, 0x6e16, 0x6838,
-	0xd0fc, 0x0040, 0x6e16, 0x0d7f, 0x0078, 0x6e05, 0x6018, 0x2068,
-	0x6840, 0xa084, 0x00ff, 0xa005, 0x0040, 0x6e27, 0x8001, 0x6842,
-	0x6017, 0x000a, 0x6007, 0x0016, 0x0d7f, 0x0078, 0x6e07, 0x1078,
-	0x24bf, 0x0d7f, 0x0078, 0x6e05, 0x1078, 0x6e76, 0x00c0, 0x6e3c,
-	0x2001, 0x0004, 0x1078, 0x3f05, 0x6003, 0x0001, 0x6007, 0x0003,
-	0x1078, 0x53e6, 0x0078, 0x6e40, 0x1078, 0x6bc7, 0x1078, 0x6d1f,
-	0x007c, 0x1078, 0x6e76, 0x00c0, 0x6e51, 0x2001, 0x0008, 0x1078,
-	0x3f05, 0x6003, 0x0001, 0x6007, 0x0005, 0x1078, 0x53e6, 0x0078,
-	0x6e53, 0x1078, 0x6d1f, 0x007c, 0x1078, 0x6e76, 0x00c0, 0x6e64,
-	0x2001, 0x000a, 0x1078, 0x3f05, 0x6003, 0x0001, 0x6007, 0x0001,
-	0x1078, 0x53e6, 0x0078, 0x6e66, 0x1078, 0x6d1f, 0x007c, 0x2009,
-	0x8d8e, 0x2104, 0xa086, 0x0003, 0x00c0, 0x6e75, 0x2009, 0x8d8f,
-	0x2104, 0xa084, 0xff00, 0xa086, 0x2a00, 0x007c, 0xa085, 0x0001,
-	0x007c, 0x0c7e, 0x017e, 0xac88, 0x0006, 0x2164, 0x1078, 0x3fa0,
-	0x017f, 0x0c7f, 0x007c, 0x0e7e, 0x2071, 0x8d8c, 0x7004, 0xa086,
-	0x0014, 0x00c0, 0x6ea3, 0x7008, 0xa086, 0x0800, 0x00c0, 0x6ea3,
-	0x700c, 0xd0ec, 0x0040, 0x6ea1, 0xa084, 0x0f00, 0xa086, 0x0100,
-	0x00c0, 0x6ea1, 0x7024, 0xd0a4, 0x0040, 0x6ea1, 0xa006, 0x0078,
-	0x6ea3, 0xa085, 0x0001, 0x0e7f, 0x007c, 0x0e7e, 0x0d7e, 0x0c7e,
-	0x077e, 0x057e, 0x047e, 0x027e, 0x007e, 0x127e, 0x2091, 0x8000,
-	0x2029, 0x8aab, 0x252c, 0x2021, 0x8ab1, 0x2424, 0x2061, 0x8f00,
-	0x2071, 0x8800, 0x7244, 0x7060, 0xa202, 0x00c8, 0x6efa, 0x1078,
-	0x870c, 0x0040, 0x6ef2, 0x671c, 0xa786, 0x0001, 0x0040, 0x6ef2,
-	0xa786, 0x0007, 0x0040, 0x6ef2, 0x2500, 0xac06, 0x0040, 0x6ef2,
-	0x2400, 0xac06, 0x0040, 0x6ef2, 0x0c7e, 0x6000, 0xa086, 0x0004,
-	0x00c0, 0x6edc, 0x1078, 0x16af, 0x6010, 0x2068, 0x1078, 0x77ed,
-	0x0040, 0x6eef, 0xa786, 0x0003, 0x00c0, 0x6f04, 0x6837, 0x0103,
-	0x6b4a, 0x6847, 0x0000, 0x1078, 0x4376, 0x1078, 0x799b, 0x1078,
-	0x79a8, 0x0c7f, 0xace0, 0x000c, 0x7054, 0xac02, 0x00c8, 0x6efa,
-	0x0078, 0x6eba, 0x127f, 0x007f, 0x027f, 0x047f, 0x057f, 0x077f,
-	0x0c7f, 0x0d7f, 0x0e7f, 0x007c, 0xa786, 0x0006, 0x00c0, 0x6ee6,
-	0x1078, 0x86aa, 0x0078, 0x6eef, 0x220c, 0x2304, 0xa106, 0x00c0,
-	0x6f17, 0x8210, 0x8318, 0x00f0, 0x6f0c, 0xa006, 0x007c, 0x2304,
-	0xa102, 0x0048, 0x6f1f, 0x2001, 0x0001, 0x0078, 0x6f21, 0x2001,
-	0x0000, 0xa18d, 0x0001, 0x007c, 0x6004, 0xa08a, 0x0040, 0x10c8,
-	0x12d2, 0x1078, 0x79c1, 0x0040, 0x6f33, 0x1078, 0x79d5, 0x0040,
-	0x6f3c, 0x0078, 0x6f35, 0x1078, 0x24e5, 0x1078, 0x578f, 0x1078,
-	0x690e, 0x1078, 0x5888, 0x007c, 0x1078, 0x6bc7, 0x0078, 0x6f35,
-	0xa182, 0x0040, 0x0079, 0x6f44, 0x6f57, 0x6f57, 0x6f57, 0x6f57,
-	0x6f57, 0x6f57, 0x6f57, 0x6f57, 0x6f57, 0x6f57, 0x6f57, 0x6f59,
-	0x6f59, 0x6f59, 0x6f59, 0x6f57, 0x6f57, 0x6f57, 0x6f59, 0x1078,
-	0x12d2, 0x6003, 0x0001, 0x6106, 0x1078, 0x5399, 0x127e, 0x2091,
-	0x8000, 0x1078, 0x5888, 0x127f, 0x007c, 0xa186, 0x0013, 0x00c0,
-	0x6f6e, 0x6004, 0xa082, 0x0040, 0x0079, 0x6ff6, 0xa186, 0x0027,
-	0x00c0, 0x6f8d, 0x1078, 0x578f, 0x1078, 0x24bf, 0x0d7e, 0x6110,
-	0x2168, 0x1078, 0x77ed, 0x0040, 0x6f87, 0x6837, 0x0103, 0x684b,
-	0x0029, 0x6847, 0x0000, 0x1078, 0x4376, 0x1078, 0x799b, 0x0d7f,
-	0x1078, 0x690e, 0x1078, 0x5888, 0x007c, 0xa186, 0x0014, 0x00c0,
-	0x6f96, 0x6004, 0xa082, 0x0040, 0x0079, 0x6fbe, 0xa186, 0x0046,
-	0x0040, 0x6fa2, 0xa186, 0x0045, 0x0040, 0x6fa2, 0xa186, 0x0047,
-	0x10c0, 0x12d2, 0x2001, 0x0109, 0x2004, 0xd084, 0x0040, 0x6fbb,
-	0x127e, 0x2091, 0x2200, 0x007e, 0x017e, 0x027e, 0x1078, 0x5273,
-	0x027f, 0x017f, 0x007f, 0x127f, 0x6000, 0xa086, 0x0002, 0x00c0,
-	0x6fbb, 0x0078, 0x7020, 0x1078, 0x6950, 0x007c, 0x6fd3, 0x6fd1,
-	0x6fd1, 0x6fd1, 0x6fd1, 0x6fd1, 0x6fd1, 0x6fd1, 0x6fd1, 0x6fd1,
-	0x6fd1, 0x6fef, 0x6fef, 0x6fef, 0x6fef, 0x6fd1, 0x6fd1, 0x6fd1,
-	0x6fef, 0x1078, 0x12d2, 0x1078, 0x578f, 0x0d7e, 0x6110, 0x2168,
-	0x1078, 0x77ed, 0x0040, 0x6fe9, 0x6837, 0x0103, 0x684b, 0x0006,
-	0x6847, 0x0000, 0x6850, 0xc0ec, 0x6852, 0x1078, 0x4376, 0x1078,
-	0x799b, 0x0d7f, 0x1078, 0x690e, 0x1078, 0x5888, 0x007c, 0x1078,
-	0x578f, 0x1078, 0x690e, 0x1078, 0x5888, 0x007c, 0x700b, 0x7009,
-	0x7009, 0x7009, 0x7009, 0x7009, 0x7009, 0x7009, 0x7009, 0x7009,
-	0x7009, 0x7019, 0x7019, 0x7019, 0x7019, 0x7009, 0x7009, 0x7009,
-	0x7019, 0x1078, 0x12d2, 0x1078, 0x578f, 0x6003, 0x0002, 0x1078,
-	0x5888, 0x6010, 0xa088, 0x0013, 0x2104, 0xa085, 0x0400, 0x200a,
-	0x007c, 0x1078, 0x578f, 0x6003, 0x000f, 0x1078, 0x5888, 0x007c,
-	0xa182, 0x0040, 0x0079, 0x7024, 0x7037, 0x7037, 0x7037, 0x7037,
-	0x7037, 0x7039, 0x70cf, 0x70ef, 0x7037, 0x7037, 0x7037, 0x7037,
-	0x7037, 0x7037, 0x7037, 0x7037, 0x7037, 0x7037, 0x7037, 0x1078,
-	0x12d2, 0x0e7e, 0x0d7e, 0x2071, 0x8d8c, 0x6110, 0x2168, 0x7614,
-	0xa6b4, 0x0fff, 0x86ff, 0x0040, 0x70b3, 0xa68c, 0x0c00, 0x0040,
-	0x704d, 0x7318, 0x6b62, 0x731c, 0x6b5e, 0xa68c, 0x00ff, 0xa186,
-	0x0002, 0x0040, 0x706b, 0xa186, 0x0028, 0x00c0, 0x705d, 0x1078,
-	0x79af, 0x684b, 0x001c, 0x0078, 0x706d, 0xd6dc, 0x0040, 0x7064,
-	0x684b, 0x0015, 0x0078, 0x706d, 0xd6d4, 0x0040, 0x706b, 0x684b,
-	0x0007, 0x0078, 0x706d, 0x684b, 0x0000, 0x6837, 0x0103, 0x6e46,
-	0xa01e, 0xd6c4, 0x0040, 0x708d, 0xa686, 0x0100, 0x00c0, 0x7081,
-	0x2001, 0x8d99, 0x2004, 0xa005, 0x00c0, 0x7081, 0xc6c4, 0x0078,
-	0x7042, 0x7328, 0x732c, 0x6b56, 0x037e, 0x2308, 0x2019, 0x8d98,
-	0xad90, 0x0019, 0x1078, 0x7589, 0x037f, 0xd6cc, 0x0040, 0x70c3,
-	0x7124, 0x695a, 0xa192, 0x0021, 0x00c8, 0x70a1, 0x2071, 0x8d98,
-	0x831c, 0x2300, 0xae18, 0xad90, 0x001d, 0x1078, 0x7589, 0x0078,
-	0x70c3, 0x6838, 0xd0fc, 0x0040, 0x70aa, 0x2009, 0x0020, 0x695a,
-	0x0078, 0x7096, 0x0f7e, 0x2d78, 0x1078, 0x7521, 0x0f7f, 0x1078,
-	0x7576, 0x0078, 0x70c5, 0x684b, 0x0000, 0x6837, 0x0103, 0x6e46,
-	0x684c, 0xd0ac, 0x0040, 0x70c3, 0x6810, 0x6914, 0xa115, 0x0040,
-	0x70c3, 0x1078, 0x7248, 0x1078, 0x4376, 0x6218, 0x2268, 0x6a3c,
-	0x8211, 0x6a3e, 0x0d7f, 0x0e7f, 0x1078, 0x690e, 0x007c, 0x0f7e,
-	0x6003, 0x0003, 0x2079, 0x8d8c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08,
-	0x6010, 0x2078, 0x784c, 0xd0ac, 0x0040, 0x70e2, 0x6003, 0x0002,
-	0x0f7f, 0x007c, 0x7c12, 0x7b16, 0x7e0a, 0x7d0e, 0x0f7f, 0x2c10,
-	0x1078, 0x1b07, 0x1078, 0x5405, 0x1078, 0x5948, 0x007c, 0x6003,
-	0x0004, 0x6110, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x1078,
-	0x1594, 0x007c, 0xa182, 0x0040, 0x0079, 0x70fe, 0x7111, 0x7111,
-	0x7111, 0x7111, 0x7111, 0x7113, 0x71aa, 0x7111, 0x7111, 0x71c0,
-	0x7222, 0x7111, 0x7111, 0x7111, 0x7111, 0x722d, 0x7111, 0x7111,
-	0x7111, 0x1078, 0x12d2, 0x077e, 0x0f7e, 0x0e7e, 0x0d7e, 0x2071,
-	0x8d8c, 0x6110, 0x2178, 0x7614, 0xa6b4, 0x0fff, 0x7e46, 0x7f4c,
-	0xc7e5, 0x7f4e, 0x6218, 0x2268, 0x6a3c, 0x8211, 0x6a3e, 0x86ff,
-	0x0040, 0x71a5, 0xa694, 0xff00, 0xa284, 0x0c00, 0x0040, 0x7134,
-	0x7018, 0x7862, 0x701c, 0x785e, 0xa284, 0x0300, 0x0040, 0x71a5,
-	0x1078, 0x132b, 0x1040, 0x12d2, 0x2d00, 0x784a, 0x7f4c, 0xc7cd,
-	0x7f4e, 0x6837, 0x0103, 0x7838, 0x683a, 0x783c, 0x683e, 0x7840,
-	0x6842, 0x6e46, 0xa68c, 0x0c00, 0x0040, 0x7152, 0x7318, 0x6b62,
-	0x731c, 0x6b5e, 0xa68c, 0x00ff, 0xa186, 0x0002, 0x0040, 0x716e,
-	0xa186, 0x0028, 0x00c0, 0x7160, 0x684b, 0x001c, 0x0078, 0x7170,
-	0xd6dc, 0x0040, 0x7167, 0x684b, 0x0015, 0x0078, 0x7170, 0xd6d4,
-	0x0040, 0x716e, 0x684b, 0x0007, 0x0078, 0x7170, 0x684b, 0x0000,
-	0x6f4e, 0x7850, 0x6852, 0x7854, 0x6856, 0xa01e, 0xd6c4, 0x0040,
-	0x7185, 0x7328, 0x732c, 0x6b56, 0x037e, 0x2308, 0x2019, 0x8d98,
-	0xad90, 0x0019, 0x1078, 0x7589, 0x037f, 0xd6cc, 0x0040, 0x71a5,
-	0x7124, 0x695a, 0xa192, 0x0021, 0x00c8, 0x7199, 0x2071, 0x8d98,
-	0x831c, 0x2300, 0xae18, 0xad90, 0x001d, 0x1078, 0x7589, 0x0078,
-	0x71a5, 0x7838, 0xd0fc, 0x0040, 0x71a2, 0x2009, 0x0020, 0x695a,
-	0x0078, 0x718e, 0x2d78, 0x1078, 0x7521, 0x0d7f, 0x0e7f, 0x0f7f,
-	0x077f, 0x007c, 0x0f7e, 0x6003, 0x0003, 0x2079, 0x8d8c, 0x7c04,
-	0x7b00, 0x7e0c, 0x7d08, 0x6010, 0x2078, 0x7c12, 0x7b16, 0x7e0a,
-	0x7d0e, 0x0f7f, 0x2c10, 0x1078, 0x1b07, 0x1078, 0x6217, 0x007c,
-	0x0d7e, 0x6003, 0x0002, 0x1078, 0x5837, 0x1078, 0x5948, 0x6110,
-	0x2168, 0x694c, 0xd1e4, 0x0040, 0x7220, 0xd1cc, 0x0040, 0x71fb,
-	0x6948, 0x6838, 0xd0fc, 0x0040, 0x71f3, 0x017e, 0x684c, 0x007e,
-	0x6850, 0x007e, 0xad90, 0x000d, 0xa198, 0x000d, 0x2009, 0x0020,
-	0x157e, 0x21a8, 0x2304, 0x2012, 0x8318, 0x8210, 0x00f0, 0x71e2,
-	0x157f, 0x007f, 0x6852, 0x007f, 0x684e, 0x017f, 0x2168, 0x1078,
-	0x1354, 0x0078, 0x721e, 0x017e, 0x1078, 0x1354, 0x0d7f, 0x1078,
-	0x7576, 0x0078, 0x721e, 0x6837, 0x0103, 0x6944, 0xa184, 0x00ff,
-	0xa0b6, 0x0002, 0x0040, 0x721a, 0xa086, 0x0028, 0x00c0, 0x720c,
-	0x684b, 0x001c, 0x0078, 0x721c, 0xd1dc, 0x0040, 0x7213, 0x684b,
-	0x0015, 0x0078, 0x721c, 0xd1d4, 0x0040, 0x721a, 0x684b, 0x0007,
-	0x0078, 0x721c, 0x684b, 0x0000, 0x1078, 0x4376, 0x1078, 0x690e,
-	0x0d7f, 0x007c, 0x2019, 0x0001, 0x1078, 0x642d, 0x6003, 0x0002,
-	0x1078, 0x5837, 0x1078, 0x5948, 0x007c, 0x1078, 0x5837, 0x1078,
-	0x24bf, 0x0d7e, 0x6110, 0x2168, 0x1078, 0x77ed, 0x0040, 0x7242,
-	0x6837, 0x0103, 0x684b, 0x0029, 0x6847, 0x0000, 0x1078, 0x4376,
-	0x1078, 0x799b, 0x0d7f, 0x1078, 0x690e, 0x1078, 0x5948, 0x007c,
-	0x684b, 0x0015, 0xd1fc, 0x0040, 0x7254, 0x684b, 0x0007, 0x8002,
-	0x8000, 0x810a, 0xa189, 0x0000, 0x6962, 0x685e, 0x007c, 0xa182,
-	0x0040, 0x0079, 0x725b, 0x726e, 0x726e, 0x726e, 0x726e, 0x726e,
-	0x7270, 0x726e, 0x7324, 0x732c, 0x726e, 0x726e, 0x726e, 0x726e,
-	0x726e, 0x726e, 0x726e, 0x726e, 0x726e, 0x726e, 0x1078, 0x12d2,
-	0x077e, 0x0f7e, 0x0e7e, 0x0d7e, 0x2071, 0x8d8c, 0x6110, 0x2178,
-	0x7614, 0xa6b4, 0x0fff, 0x7e46, 0x7f4c, 0xc7e5, 0x7f4e, 0x6218,
-	0x2268, 0x6a3c, 0x8211, 0x6a3e, 0x86ff, 0x0040, 0x7314, 0xa694,
-	0xff00, 0xa284, 0x0c00, 0x0040, 0x7291, 0x7018, 0x7862, 0x701c,
-	0x785e, 0xa284, 0x0300, 0x0040, 0x7311, 0xa686, 0x0100, 0x00c0,
-	0x72a3, 0x2001, 0x8d99, 0x2004, 0xa005, 0x00c0, 0x72a3, 0xc6c4,
-	0x7e46, 0x0078, 0x7284, 0x1078, 0x132b, 0x1040, 0x12d2, 0x2d00,
-	0x784a, 0x7f4c, 0xa7bd, 0x0200, 0x7f4e, 0x6837, 0x0103, 0x7838,
-	0x683a, 0x783c, 0x683e, 0x7840, 0x6842, 0x6e46, 0xa68c, 0x0c00,
-	0x0040, 0x72be, 0x7318, 0x6b62, 0x731c, 0x6b5e, 0xa68c, 0x00ff,
-	0xa186, 0x0002, 0x0040, 0x72da, 0xa186, 0x0028, 0x00c0, 0x72cc,
-	0x684b, 0x001c, 0x0078, 0x72dc, 0xd6dc, 0x0040, 0x72d3, 0x684b,
-	0x0015, 0x0078, 0x72dc, 0xd6d4, 0x0040, 0x72da, 0x684b, 0x0007,
-	0x0078, 0x72dc, 0x684b, 0x0000, 0x6f4e, 0x7850, 0x6852, 0x7854,
-	0x6856, 0xa01e, 0xd6c4, 0x0040, 0x72f1, 0x7328, 0x732c, 0x6b56,
-	0x037e, 0x2308, 0x2019, 0x8d98, 0xad90, 0x0019, 0x1078, 0x7589,
-	0x037f, 0xd6cc, 0x0040, 0x7311, 0x7124, 0x695a, 0xa192, 0x0021,
-	0x00c8, 0x7305, 0x2071, 0x8d98, 0x831c, 0x2300, 0xae18, 0xad90,
-	0x001d, 0x1078, 0x7589, 0x0078, 0x7311, 0x7838, 0xd0fc, 0x0040,
-	0x730e, 0x2009, 0x0020, 0x695a, 0x0078, 0x72fa, 0x2d78, 0x1078,
-	0x7521, 0xd6dc, 0x00c0, 0x7317, 0xa006, 0x0078, 0x731d, 0x2001,
-	0x0001, 0x2071, 0x8d8c, 0x7218, 0x731c, 0x1078, 0x15e5, 0x0d7f,
-	0x0e7f, 0x0f7f, 0x077f, 0x007c, 0x20e1, 0x0005, 0x3d18, 0x3e20,
-	0x2c10, 0x1078, 0x1594, 0x007c, 0x0d7e, 0x6003, 0x0002, 0x6110,
-	0x2168, 0x694c, 0xd1e4, 0x0040, 0x73c5, 0xd1cc, 0x0040, 0x7395,
-	0x6948, 0x6838, 0xd0fc, 0x0040, 0x7371, 0x017e, 0x684c, 0x007e,
-	0x6850, 0x007e, 0x684c, 0xd0ac, 0x0040, 0x7357, 0x6810, 0x6914,
-	0xa115, 0x0040, 0x7357, 0x1078, 0x7248, 0x0f7e, 0x6948, 0x2178,
-	0x6848, 0x784a, 0x6860, 0x7862, 0x685c, 0x785e, 0x0f7f, 0x6948,
-	0xad90, 0x000d, 0xa198, 0x000d, 0x2009, 0x0020, 0x157e, 0x21a8,
-	0x2304, 0x2012, 0x8318, 0x8210, 0x00f0, 0x7360, 0x157f, 0x007f,
-	0x6852, 0x007f, 0x684e, 0x017f, 0x2168, 0x1078, 0x1354, 0x0078,
-	0x73c3, 0x017e, 0x684c, 0xd0ac, 0x0040, 0x7389, 0x6810, 0x6914,
-	0xa115, 0x0040, 0x7389, 0x1078, 0x7248, 0x0f7e, 0x6948, 0x2178,
-	0x6848, 0x784a, 0x6860, 0x7862, 0x685c, 0x785e, 0x684c, 0x784e,
-	0x0f7f, 0x6948, 0xa188, 0x0013, 0x684c, 0x200a, 0x1078, 0x1354,
-	0x0d7f, 0x1078, 0x7576, 0x0078, 0x73c3, 0x6837, 0x0103, 0x6944,
-	0xa184, 0x00ff, 0xa0b6, 0x0002, 0x0040, 0x73b4, 0xa086, 0x0028,
-	0x00c0, 0x73a6, 0x684b, 0x001c, 0x0078, 0x73c1, 0xd1dc, 0x0040,
-	0x73ad, 0x684b, 0x0015, 0x0078, 0x73c1, 0xd1d4, 0x0040, 0x73b4,
-	0x684b, 0x0007, 0x0078, 0x73c1, 0x684b, 0x0000, 0x684c, 0xd0ac,
-	0x0040, 0x73c1, 0x6810, 0x6914, 0xa115, 0x0040, 0x73c1, 0x1078,
-	0x7248, 0x1078, 0x4376, 0x1078, 0x690e, 0x0d7f, 0x007c, 0x1078,
-	0x578f, 0x0078, 0x73cd, 0x1078, 0x5837, 0x1078, 0x77ed, 0x0040,
-	0x73e6, 0x0d7e, 0x6110, 0x2168, 0x6837, 0x0103, 0x2009, 0x880c,
-	0x210c, 0xd18c, 0x00c0, 0x73f1, 0xd184, 0x00c0, 0x73ed, 0x6108,
-	0x694a, 0x6847, 0x0000, 0x1078, 0x4376, 0x0d7f, 0x1078, 0x690e,
-	0x1078, 0x5888, 0x1078, 0x5948, 0x007c, 0x684b, 0x0004, 0x0078,
-	0x73e1, 0x684b, 0x0004, 0x0078, 0x73e1, 0xa182, 0x0040, 0x0079,
-	0x73f9, 0x740c, 0x740c, 0x740c, 0x740c, 0x740c, 0x740e, 0x740c,
-	0x7411, 0x740c, 0x740c, 0x740c, 0x740c, 0x740c, 0x740c, 0x740c,
-	0x740c, 0x740c, 0x740c, 0x740c, 0x1078, 0x12d2, 0x1078, 0x690e,
-	0x007c, 0x007e, 0x027e, 0xa016, 0x1078, 0x1594, 0x027f, 0x007f,
-	0x007c, 0xa182, 0x0085, 0x0079, 0x741d, 0x7426, 0x7424, 0x7424,
-	0x7424, 0x7424, 0x7424, 0x7424, 0x1078, 0x12d2, 0x6003, 0x000b,
-	0x6106, 0x1078, 0x5399, 0x127e, 0x2091, 0x8000, 0x1078, 0x5888,
-	0x127f, 0x007c, 0xa186, 0x0013, 0x00c0, 0x743c, 0x6004, 0xa082,
-	0x0085, 0x2008, 0x0079, 0x7477, 0xa186, 0x0027, 0x00c0, 0x745f,
-	0x1078, 0x578f, 0x1078, 0x24bf, 0x0d7e, 0x6010, 0x2068, 0x1078,
-	0x77ed, 0x0040, 0x7455, 0x6837, 0x0103, 0x6847, 0x0000, 0x684b,
-	0x0029, 0x1078, 0x4376, 0x1078, 0x799b, 0x0d7f, 0x1078, 0x690e,
-	0x1078, 0x5888, 0x007c, 0x1078, 0x6950, 0x0078, 0x745a, 0xa186,
-	0x0014, 0x00c0, 0x745b, 0x1078, 0x578f, 0x0d7e, 0x6010, 0x2068,
-	0x1078, 0x77ed, 0x0040, 0x7455, 0x6837, 0x0103, 0x6847, 0x0000,
-	0x684b, 0x0006, 0x6850, 0xc0ec, 0x6852, 0x0078, 0x7451, 0x7480,
-	0x747e, 0x747e, 0x747e, 0x747e, 0x747e, 0x7489, 0x1078, 0x12d2,
-	0x1078, 0x578f, 0x6017, 0x0014, 0x6003, 0x000c, 0x1078, 0x5888,
-	0x007c, 0x1078, 0x578f, 0x6017, 0x0014, 0x6003, 0x000e, 0x1078,
-	0x5888, 0x007c, 0xa182, 0x008c, 0x00c8, 0x749c, 0xa182, 0x0085,
-	0x0048, 0x749c, 0x0079, 0x749f, 0x1078, 0x6950, 0x007c, 0x74a6,
-	0x74a6, 0x74a6, 0x74a6, 0x74a8, 0x74d0, 0x74a6, 0x1078, 0x12d2,
-	0x0d7e, 0x1078, 0x799b, 0x1078, 0x77ed, 0x0040, 0x74cc, 0x6010,
-	0x2068, 0x6837, 0x0103, 0x6850, 0xd0b4, 0x0040, 0x74bd, 0x684b,
-	0x0006, 0xc0ec, 0x6852, 0x0078, 0x74c8, 0xd0bc, 0x0040, 0x74c4,
-	0x684b, 0x0002, 0x0078, 0x74c8, 0x684b, 0x0005, 0x1078, 0x7a4e,
-	0x6847, 0x0000, 0x1078, 0x4376, 0x1078, 0x690e, 0x0d7f, 0x007c,
-	0x0d7e, 0x6010, 0x2068, 0x1078, 0x77ed, 0x0040, 0x74f4, 0x6837,
-	0x0103, 0x6850, 0xd0b4, 0x0040, 0x74e3, 0xc0ec, 0x6852, 0x684b,
-	0x0006, 0x0078, 0x74ee, 0xd0bc, 0x0040, 0x74ea, 0x684b, 0x0002,
-	0x0078, 0x74ee, 0x684b, 0x0005, 0x1078, 0x7a4e, 0x6847, 0x0000,
-	0x1078, 0x4376, 0x1078, 0x799b, 0x0d7f, 0x1078, 0x690e, 0x007c,
-	0x017e, 0x0d7e, 0x6010, 0x2068, 0x1078, 0x77ed, 0x0040, 0x7508,
-	0x6837, 0x0103, 0x684b, 0x0028, 0x6847, 0x0000, 0x1078, 0x4376,
-	0x0d7f, 0x017f, 0xa186, 0x0013, 0x0040, 0x751a, 0xa186, 0x0014,
-	0x0040, 0x751a, 0xa186, 0x0027, 0x0040, 0x751a, 0x1078, 0x6950,
-	0x0078, 0x7520, 0x1078, 0x578f, 0x1078, 0x79a8, 0x1078, 0x5888,
-	0x007c, 0x057e, 0x067e, 0x0d7e, 0x0f7e, 0x2029, 0x0001, 0xa182,
-	0x0101, 0x00c8, 0x752d, 0x0078, 0x752f, 0x2009, 0x0100, 0x2130,
-	0x2069, 0x8d98, 0x831c, 0x2300, 0xad18, 0x2009, 0x0020, 0xaf90,
-	0x001d, 0x1078, 0x7589, 0xa6b2, 0x0020, 0x7804, 0xa06d, 0x0040,
-	0x7543, 0x1078, 0x1354, 0x1078, 0x132b, 0x0040, 0x756d, 0x8528,
-	0x6837, 0x0110, 0x683b, 0x0000, 0x2d20, 0x7c06, 0xa68a, 0x003d,
-	0x00c8, 0x7559, 0x2608, 0xad90, 0x000f, 0x1078, 0x7589, 0x0078,
-	0x756d, 0xa6b2, 0x003c, 0x2009, 0x003c, 0x2d78, 0xad90, 0x000f,
-	0x1078, 0x7589, 0x0078, 0x7543, 0x0f7f, 0x852f, 0xa5ad, 0x0003,
-	0x7d36, 0xa5ac, 0x0000, 0x0078, 0x7572, 0x0f7f, 0x852f, 0xa5ad,
-	0x0003, 0x7d36, 0x0d7f, 0x067f, 0x057f, 0x007c, 0x0f7e, 0x8dff,
-	0x0040, 0x7587, 0x6804, 0xa07d, 0x0040, 0x7585, 0x6807, 0x0000,
-	0x1078, 0x4376, 0x2f68, 0x0078, 0x757a, 0x1078, 0x4376, 0x0f7f,
-	0x007c, 0x157e, 0xa184, 0x0001, 0x0040, 0x758f, 0x8108, 0x810c,
-	0x21a8, 0x2304, 0x8007, 0x2012, 0x8318, 0x8210, 0x00f0, 0x7591,
-	0x157f, 0x007c, 0x127e, 0x2091, 0x8000, 0x601c, 0xa084, 0x000f,
-	0x1079, 0x75a4, 0x127f, 0x007c, 0x75ba, 0x75ac, 0x75b5, 0x75d3,
-	0x75ac, 0x75b5, 0x75ae, 0x75b5, 0x1078, 0x12d2, 0x037e, 0x2019,
-	0x0010, 0x1078, 0x831c, 0x037f, 0x007c, 0xa006, 0x007c, 0xa085,
-	0x0001, 0x007c, 0x0d7e, 0x6010, 0x2068, 0x1078, 0x77ed, 0x0040,
-	0x75d0, 0xa00e, 0x2001, 0x0005, 0x1078, 0x4454, 0x1078, 0x7a4e,
-	0x1078, 0x4376, 0x1078, 0x690e, 0xa085, 0x0001, 0x0d7f, 0x007c,
-	0xa006, 0x0078, 0x75ce, 0x6000, 0xa08a, 0x0010, 0x10c8, 0x12d2,
-	0x1079, 0x75db, 0x007c, 0x75eb, 0x7608, 0x75ed, 0x7619, 0x7604,
-	0x75eb, 0x75b5, 0x75ba, 0x75ba, 0x75b5, 0x75b5, 0x75b5, 0x75b5,
-	0x75b5, 0x75b5, 0x75b5, 0x1078, 0x12d2, 0x0d7e, 0x6010, 0x2068,
-	0x1078, 0x77ed, 0x0040, 0x75f6, 0x1078, 0x7a4e, 0x0d7f, 0x6007,
-	0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x1078, 0x5399, 0x1078,
-	0x5888, 0xa085, 0x0001, 0x007c, 0x1078, 0x16af, 0x0078, 0x75ed,
-	0x0e7e, 0x2071, 0x8aa2, 0x7024, 0xac06, 0x00c0, 0x7611, 0x1078,
-	0x639b, 0x1078, 0x62b2, 0x0e7f, 0x00c0, 0x75ed, 0x1078, 0x75b5,
-	0x007c, 0x037e, 0x0e7e, 0x2071, 0x8aa2, 0x703c, 0xac06, 0x00c0,
-	0x7629, 0x2019, 0x0000, 0x1078, 0x642d, 0x0e7f, 0x037f, 0x0078,
-	0x75ed, 0x1078, 0x6753, 0x0e7f, 0x037f, 0x00c0, 0x75ed, 0x1078,
-	0x75b5, 0x007c, 0x0c7e, 0x601c, 0xa084, 0x000f, 0x1079, 0x763a,
-	0x0c7f, 0x007c, 0x7649, 0x76ae, 0x777b, 0x764d, 0x7649, 0x7649,
-	0x8311, 0x690e, 0x76ae, 0x1078, 0x79d5, 0x00c0, 0x7649, 0x1078,
-	0x6bc7, 0x007c, 0x6017, 0x0001, 0x007c, 0x6010, 0xa080, 0x0019,
-	0x2c02, 0x6000, 0xa08a, 0x0010, 0x10c8, 0x12d2, 0x1079, 0x7659,
-	0x007c, 0x7669, 0x766b, 0x768b, 0x769d, 0x76aa, 0x7669, 0x7649,
-	0x7649, 0x7649, 0x769d, 0x769d, 0x7669, 0x7669, 0x7669, 0x7669,
-	0x76a7, 0x1078, 0x12d2, 0x0e7e, 0x6010, 0x2070, 0x7050, 0xc0b5,
-	0x7052, 0x2071, 0x8aa2, 0x7024, 0xac06, 0x0040, 0x7687, 0x1078,
-	0x62b2, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x6017,
-	0x0014, 0x1078, 0x5399, 0x1078, 0x5888, 0x0e7f, 0x007c, 0x6017,
-	0x0001, 0x0078, 0x7685, 0x0d7e, 0x6010, 0x2068, 0x6850, 0xc0b5,
-	0x6852, 0x0d7f, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002,
-	0x1078, 0x5399, 0x1078, 0x5888, 0x007c, 0x0d7e, 0x6017, 0x0001,
-	0x6010, 0x2068, 0x6850, 0xc0b5, 0x6852, 0x0d7f, 0x007c, 0x1078,
-	0x690e, 0x007c, 0x1078, 0x16af, 0x0078, 0x768b, 0x6000, 0xa08a,
-	0x0010, 0x10c8, 0x12d2, 0x1079, 0x76b6, 0x007c, 0x76c6, 0x764a,
-	0x76c8, 0x76c6, 0x76c8, 0x76c6, 0x76c6, 0x76c6, 0x7643, 0x7643,
-	0x76c6, 0x76c6, 0x76c6, 0x76c6, 0x76c6, 0x76c6, 0x1078, 0x12d2,
-	0x0d7e, 0x6018, 0x2068, 0x6804, 0xa084, 0x00ff, 0x0d7f, 0xa08a,
-	0x000c, 0x10c8, 0x12d2, 0x1079, 0x76d6, 0x007c, 0x76e2, 0x7714,
-	0x76e2, 0x7714, 0x76e2, 0x7714, 0x76e4, 0x76ed, 0x76e2, 0x7714,
-	0x76e2, 0x76fe, 0x1078, 0x12d2, 0x6004, 0xa08e, 0x0004, 0x0040,
-	0x770f, 0xa08e, 0x0002, 0x0040, 0x770f, 0x6004, 0x1078, 0x79d5,
-	0x0040, 0x775e, 0xa08e, 0x0021, 0x0040, 0x7762, 0xa08e, 0x0022,
-	0x0040, 0x775e, 0xa08e, 0x003d, 0x0040, 0x7762, 0xa08e, 0x0001,
-	0x00c0, 0x770d, 0x0d7e, 0x6018, 0x2068, 0x6804, 0xa084, 0x00ff,
-	0x0d7f, 0xa086, 0x0006, 0x0040, 0x770f, 0x1078, 0x24bf, 0x1078,
-	0x6bc7, 0x1078, 0x79a8, 0x007c, 0x0c7e, 0x0d7e, 0x6104, 0xa186,
-	0x0016, 0x0040, 0x774e, 0xa186, 0x0002, 0x00c0, 0x773d, 0x6018,
-	0x2068, 0x68a0, 0xd0bc, 0x00c0, 0x7766, 0x6840, 0xa084, 0x00ff,
-	0xa005, 0x0040, 0x773d, 0x8001, 0x6842, 0x6013, 0x0000, 0x601f,
-	0x0007, 0x6017, 0x0398, 0x1078, 0x68a8, 0x0040, 0x773d, 0x2d00,
-	0x601a, 0x601f, 0x0001, 0x0078, 0x774e, 0x0d7f, 0x0c7f, 0x1078,
-	0x6bc7, 0x1078, 0x24bf, 0x0e7e, 0x127e, 0x2091, 0x8000, 0x1078,
-	0x24e5, 0x127f, 0x0e7f, 0x1078, 0x79a8, 0x007c, 0x2001, 0x0002,
-	0x1078, 0x3f05, 0x6003, 0x0001, 0x6007, 0x0002, 0x1078, 0x53e6,
-	0x1078, 0x5888, 0x0d7f, 0x0c7f, 0x0078, 0x774d, 0x1078, 0x6bc7,
-	0x0078, 0x7711, 0x1078, 0x6bda, 0x0078, 0x7711, 0x0d7f, 0x0c7f,
-	0x1078, 0x6bc7, 0x1078, 0x24bf, 0x0e7e, 0x127e, 0x2091, 0x8000,
-	0x1078, 0x24e5, 0x6013, 0x0000, 0x601f, 0x0007, 0x6017, 0x0398,
-	0x127f, 0x0e7f, 0x007c, 0x6000, 0xa08a, 0x0010, 0x10c8, 0x12d2,
-	0x1079, 0x7783, 0x007c, 0x7793, 0x7793, 0x7793, 0x7793, 0x7793,
-	0x7793, 0x7793, 0x7793, 0x7793, 0x7649, 0x7793, 0x764a, 0x7795,
-	0x764a, 0x779e, 0x7793, 0x1078, 0x12d2, 0x6007, 0x008b, 0x6003,
-	0x000d, 0x1078, 0x5399, 0x1078, 0x5888, 0x007c, 0x1078, 0x799b,
-	0x1078, 0x77ed, 0x0040, 0x77d6, 0x1078, 0x24bf, 0x0d7e, 0x1078,
-	0x77ed, 0x0040, 0x77b8, 0x6010, 0x2068, 0x6837, 0x0103, 0x684b,
-	0x0006, 0x6847, 0x0000, 0x6850, 0xc0ed, 0x6852, 0x1078, 0x4376,
-	0x2c68, 0x1078, 0x68a8, 0x0040, 0x77c6, 0x6818, 0x601a, 0x0c7e,
-	0x2d60, 0x1078, 0x79a8, 0x0c7f, 0x0078, 0x77c7, 0x2d60, 0x0d7f,
-	0x6013, 0x0000, 0x601f, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001,
-	0x1078, 0x53e6, 0x1078, 0x5888, 0x0078, 0x77d8, 0x1078, 0x79a8,
-	0x007c, 0xa284, 0x0003, 0x00c0, 0x77ea, 0xa282, 0x8f00, 0x0048,
-	0x77ea, 0x2001, 0x8815, 0x2004, 0xa202, 0x00c8, 0x77ea, 0xa085,
-	0x0001, 0x007c, 0xa006, 0x0078, 0x77e9, 0x027e, 0x0e7e, 0x2071,
-	0x8800, 0x6210, 0x7058, 0xa202, 0x0048, 0x77ff, 0x705c, 0xa202,
-	0x00c8, 0x77ff, 0xa085, 0x0001, 0x0e7f, 0x027f, 0x007c, 0xa006,
-	0x0078, 0x77fc, 0x0e7e, 0x0c7e, 0x037e, 0x007e, 0x127e, 0x2091,
-	0x8000, 0x2061, 0x8f00, 0x2071, 0x8800, 0x7344, 0x7060, 0xa302,
-	0x00c8, 0x7828, 0x601c, 0xa206, 0x00c0, 0x7820, 0x1078, 0x79d5,
-	0x00c0, 0x781c, 0x1078, 0x6bc7, 0x0c7e, 0x1078, 0x690e, 0x0c7f,
-	0xace0, 0x000c, 0x7054, 0xac02, 0x00c8, 0x7828, 0x0078, 0x780d,
-	0x127f, 0x007f, 0x037f, 0x0c7f, 0x0e7f, 0x007c, 0x0e7e, 0x0c7e,
-	0x017e, 0xa188, 0x8934, 0x210c, 0x81ff, 0x0040, 0x7846, 0x2061,
-	0x8f00, 0x2071, 0x8800, 0x017e, 0x1078, 0x68a8, 0x017f, 0x0040,
-	0x7849, 0x611a, 0x1078, 0x24bf, 0x1078, 0x690e, 0xa006, 0x0078,
-	0x784b, 0xa085, 0x0001, 0x017f, 0x0c7f, 0x0e7f, 0x007c, 0x0c7e,
-	0x057e, 0x127e, 0x2091, 0x8000, 0x0c7e, 0x1078, 0x68a8, 0x057f,
-	0x0040, 0x7868, 0x6612, 0x651a, 0x601f, 0x0003, 0x2009, 0x004b,
-	0x1078, 0x6939, 0xa085, 0x0001, 0x127f, 0x057f, 0x0c7f, 0x007c,
-	0xa006, 0x0078, 0x7864, 0x0c7e, 0x057e, 0x127e, 0x2091, 0x8000,
-	0x62a0, 0x0c7e, 0x1078, 0x68a8, 0x057f, 0x0040, 0x7896, 0x6013,
-	0x0000, 0x651a, 0x601f, 0x0003, 0x0c7e, 0x2560, 0x1078, 0x418b,
-	0x0c7f, 0x1078, 0x54f0, 0x087e, 0x2041, 0x0000, 0x1078, 0x5419,
-	0x2c08, 0x1078, 0x84d2, 0x087f, 0x2009, 0x004c, 0x1078, 0x6939,
-	0xa085, 0x0001, 0x127f, 0x057f, 0x0c7f, 0x007c, 0xa006, 0x0078,
-	0x7892, 0x0f7e, 0x0c7e, 0x047e, 0x0c7e, 0x1078, 0x68a8, 0x2c78,
-	0x0c7f, 0x0040, 0x78b5, 0x7e12, 0x2c00, 0x781a, 0x781f, 0x0003,
-	0x2021, 0x0005, 0x1078, 0x78f9, 0x0040, 0x78b5, 0x2f60, 0x2009,
-	0x004d, 0x1078, 0x6939, 0xa085, 0x0001, 0x047f, 0x0c7f, 0x0f7f,
-	0x007c, 0x0f7e, 0x0c7e, 0x047e, 0x0c7e, 0x1078, 0x68a8, 0x2c78,
-	0x0c7f, 0x0040, 0x78d5, 0x7e12, 0x2c00, 0x781a, 0x781f, 0x0003,
-	0x2021, 0x0005, 0x1078, 0x78f9, 0x0040, 0x78d5, 0x2f60, 0x2009,
-	0x004e, 0x1078, 0x6939, 0xa085, 0x0001, 0x047f, 0x0c7f, 0x0f7f,
-	0x007c, 0x0f7e, 0x0c7e, 0x047e, 0x0c7e, 0x1078, 0x68a8, 0x2c78,
-	0x0c7f, 0x0040, 0x78f5, 0x7e12, 0x2c00, 0x781a, 0x781f, 0x0003,
-	0x2021, 0x0004, 0x1078, 0x78f9, 0x0040, 0x78f5, 0x2f60, 0x2009,
-	0x0052, 0x1078, 0x6939, 0xa085, 0x0001, 0x047f, 0x0c7f, 0x0f7f,
-	0x007c, 0x097e, 0x087e, 0x127e, 0x2091, 0x8000, 0x1078, 0x4117,
-	0x0040, 0x7906, 0x2001, 0x78fe, 0x0078, 0x790c, 0x1078, 0x40dd,
-	0x0040, 0x7915, 0x2001, 0x7906, 0x007e, 0xa00e, 0x2400, 0x1078,
-	0x4454, 0x1078, 0x4376, 0x007f, 0x007a, 0x2418, 0x1078, 0x5726,
-	0x62a0, 0x2041, 0x0001, 0x2608, 0x1078, 0x550a, 0x1078, 0x5419,
-	0x2f08, 0x2648, 0x1078, 0x84d2, 0x613c, 0x81ff, 0x1040, 0x55ae,
-	0x127f, 0x087f, 0x097f, 0x007c, 0x0c7e, 0x127e, 0x2091, 0x8000,
-	0x0c7e, 0x1078, 0x68a8, 0x017f, 0x0040, 0x7945, 0x660a, 0x611a,
-	0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, 0x001f, 0x1078, 0x6939,
-	0xa085, 0x0001, 0x127f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x7942,
-	0x0c7e, 0x127e, 0x2091, 0x8000, 0x0c7e, 0x1078, 0x68a8, 0x017f,
-	0x0040, 0x7961, 0x660a, 0x611a, 0x601f, 0x0008, 0x2d00, 0x6012,
-	0x2009, 0x0021, 0x1078, 0x6939, 0xa085, 0x0001, 0x127f, 0x0c7f,
-	0x007c, 0xa006, 0x0078, 0x795e, 0x0c7e, 0x127e, 0x2091, 0x8000,
-	0x0c7e, 0x1078, 0x68a8, 0x017f, 0x0040, 0x797d, 0x660a, 0x611a,
-	0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, 0x003d, 0x1078, 0x6939,
-	0xa085, 0x0001, 0x127f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x797a,
-	0x0c7e, 0x127e, 0x2091, 0x8000, 0x0c7e, 0x1078, 0x68a8, 0x017f,
-	0x0040, 0x7998, 0x611a, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009,
-	0x0000, 0x1078, 0x6939, 0xa085, 0x0001, 0x127f, 0x0c7f, 0x007c,
-	0xa006, 0x0078, 0x7995, 0x027e, 0x0d7e, 0x6218, 0x2268, 0x6a3c,
-	0x82ff, 0x0040, 0x79a5, 0x8211, 0x6a3e, 0x0d7f, 0x027f, 0x007c,
-	0x6013, 0x0000, 0x601f, 0x0007, 0x6017, 0x0014, 0x007c, 0x067e,
-	0x0c7e, 0x0d7e, 0x2031, 0x8852, 0x2634, 0xd6e4, 0x0040, 0x79bd,
-	0x6618, 0x2660, 0x6e48, 0x1078, 0x408b, 0x0d7f, 0x0c7f, 0x067f,
-	0x007c, 0x007e, 0x017e, 0x6004, 0xa08e, 0x0002, 0x0040, 0x79d2,
-	0xa08e, 0x0003, 0x0040, 0x79d2, 0xa08e, 0x0004, 0x0040, 0x79d2,
-	0xa085, 0x0001, 0x017f, 0x007f, 0x007c, 0x007e, 0x017e, 0x6004,
-	0xa08e, 0x0000, 0x0040, 0x79ea, 0xa08e, 0x001f, 0x0040, 0x79ea,
-	0xa08e, 0x0028, 0x0040, 0x79ea, 0xa08e, 0x0029, 0x0040, 0x79ea,
-	0xa085, 0x0001, 0x017f, 0x007f, 0x007c, 0x0c7e, 0x127e, 0x2091,
-	0x8000, 0x0c7e, 0x1078, 0x68a8, 0x017f, 0x0040, 0x7a07, 0x611a,
-	0x601f, 0x0001, 0x2d00, 0x6012, 0x1078, 0x24bf, 0x2009, 0x0028,
-	0x1078, 0x6939, 0xa085, 0x0001, 0x127f, 0x0c7f, 0x007c, 0xa006,
-	0x0078, 0x7a04, 0xa186, 0x0015, 0x00c0, 0x7a1f, 0x2011, 0x881f,
-	0x2204, 0xa086, 0x0074, 0x00c0, 0x7a1f, 0x1078, 0x6e79, 0x6003,
-	0x0001, 0x6007, 0x0029, 0x1078, 0x53e6, 0x0078, 0x7a23, 0x1078,
-	0x6bc7, 0x1078, 0x690e, 0x007c, 0xa186, 0x0015, 0x00c0, 0x7a41,
-	0x2011, 0x881f, 0x2204, 0xa086, 0x0014, 0x00c0, 0x7a41, 0x0d7e,
-	0x6018, 0x2068, 0x1078, 0x400a, 0x0d7f, 0x1078, 0x6e83, 0x00c0,
-	0x7a41, 0x2001, 0x0006, 0x1078, 0x3f05, 0x1078, 0x69c6, 0x0078,
-	0x7a45, 0x1078, 0x6bc7, 0x1078, 0x690e, 0x007c, 0x6848, 0xa086,
-	0x0005, 0x00c0, 0x7a4d, 0x1078, 0x7a4e, 0x007c, 0x6850, 0xc0ad,
-	0x6852, 0x007c, 0x067e, 0x6000, 0xa0b2, 0x0010, 0x10c8, 0x12d2,
-	0x1079, 0x7a5c, 0x067f, 0x007c, 0x7a6c, 0x7d34, 0x7e2d, 0x7a6c,
-	0x7a6c, 0x7a6c, 0x7a6c, 0x7a6c, 0x7aa6, 0x7ea4, 0x7a6c, 0x7a6c,
-	0x7a6c, 0x7a6c, 0x7a6c, 0x7a6c, 0x1078, 0x12d2, 0x067e, 0x6000,
-	0xa0b2, 0x0010, 0x10c8, 0x12d2, 0x1079, 0x7a78, 0x067f, 0x007c,
-	0x7a88, 0x82ac, 0x7a88, 0x7a88, 0x7a88, 0x7a88, 0x7a88, 0x7a88,
-	0x8276, 0x82fa, 0x7a88, 0x7a88, 0x7a88, 0x7a88, 0x7a88, 0x7a88,
-	0x1078, 0x12d2, 0x067e, 0x6000, 0xa0b2, 0x0010, 0x10c8, 0x12d2,
-	0x1079, 0x7a94, 0x067f, 0x007c, 0x7aa4, 0x7ff2, 0x80ac, 0x80d1,
-	0x8120, 0x7aa4, 0x81df, 0x819b, 0x7eb0, 0x824e, 0x8262, 0x7aa4,
-	0x7aa4, 0x7aa4, 0x7aa4, 0x7aa4, 0x1078, 0x12d2, 0xa1b2, 0x0040,
-	0x10c8, 0x12d2, 0x2100, 0x0079, 0x7aad, 0x7aed, 0x7c63, 0x7aed,
-	0x7aed, 0x7aed, 0x7c6b, 0x7aed, 0x7aed, 0x7aed, 0x7aed, 0x7aed,
-	0x7aed, 0x7aed, 0x7aed, 0x7aed, 0x7aed, 0x7aed, 0x7aed, 0x7aed,
-	0x7aed, 0x7aed, 0x7aed, 0x7aed, 0x7aef, 0x7b3d, 0x7b48, 0x7b82,
-	0x7b9d, 0x7bf4, 0x7c4f, 0x7aed, 0x7aed, 0x7c6f, 0x7aed, 0x7aed,
-	0x7c7e, 0x7c85, 0x7aed, 0x7aed, 0x7aed, 0x7aed, 0x7aed, 0x7cb3,
-	0x7aed, 0x7aed, 0x7cbe, 0x7aed, 0x7aed, 0x7aed, 0x7aed, 0x7aed,
-	0x7aed, 0x7aed, 0x7aed, 0x7aed, 0x7aed, 0x7aed, 0x7aed, 0x7aed,
-	0x7aed, 0x7aed, 0x7aed, 0x7aed, 0x7aed, 0x1078, 0x12d2, 0x1078,
-	0x42a2, 0x0e7e, 0x0c7e, 0x037e, 0x027e, 0x017e, 0x6218, 0x2270,
-	0x72a0, 0x027e, 0x2019, 0x0029, 0x1078, 0x54f0, 0x087e, 0x2041,
-	0x0000, 0x1078, 0x5419, 0x2c08, 0x1078, 0x84d2, 0x087f, 0x017f,
-	0x2e60, 0x1078, 0x418b, 0x017f, 0x027f, 0x037f, 0x0c7f, 0x0e7f,
-	0x6618, 0x0c7e, 0x2660, 0x1078, 0x3fa0, 0x0c7f, 0xa6b0, 0x0001,
-	0x2634, 0xa684, 0x00ff, 0xa082, 0x0006, 0x0048, 0x7b2f, 0x1078,
-	0x8406, 0x00c0, 0x7b7c, 0x1078, 0x83a4, 0x00c0, 0x7b2b, 0x6007,
-	0x0008, 0x0078, 0x7c5e, 0x6007, 0x0009, 0x0078, 0x7c5e, 0x1078,
-	0x85aa, 0x0040, 0x7b39, 0x1078, 0x8406, 0x0040, 0x7b23, 0x0078,
-	0x7b7c, 0x6013, 0x1900, 0x0078, 0x7b2b, 0x6106, 0x1078, 0x834f,
-	0x6007, 0x0006, 0x0078, 0x7c5e, 0x6007, 0x0007, 0x0078, 0x7c5e,
-	0x1078, 0x8727, 0x00c0, 0x7cd3, 0x0d7e, 0x6618, 0x2668, 0x6e04,
-	0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006, 0x0040, 0x7b5e, 0xa686,
-	0x0004, 0x0040, 0x7b5e, 0x0d7f, 0x0078, 0x7b7c, 0x1078, 0x846c,
-	0x00c0, 0x7b77, 0xa686, 0x0006, 0x00c0, 0x7b70, 0x027e, 0x6218,
-	0xa290, 0x0028, 0x2214, 0x2009, 0x0000, 0x1078, 0x2507, 0x027f,
-	0x1078, 0x400a, 0x6007, 0x000a, 0x0d7f, 0x0078, 0x7c5e, 0x6007,
-	0x000b, 0x0d7f, 0x0078, 0x7c5e, 0x1078, 0x24bf, 0x6007, 0x0001,
-	0x0078, 0x7c5e, 0x1078, 0x8727, 0x00c0, 0x7cd3, 0x6618, 0x0d7e,
-	0x2668, 0x6e04, 0x0d7f, 0xa686, 0x0707, 0x0040, 0x7b7c, 0x027e,
-	0x6218, 0xa290, 0x0028, 0x2214, 0x2009, 0x0000, 0x1078, 0x2507,
-	0x027f, 0x6007, 0x000c, 0x0078, 0x7c5e, 0x1078, 0x42a2, 0x6618,
-	0xa6b0, 0x0001, 0x2634, 0xa684, 0x00ff, 0xa082, 0x0006, 0x0048,
-	0x7be1, 0xa6b4, 0xff00, 0x8637, 0xa686, 0x0004, 0x0040, 0x7bb4,
-	0xa686, 0x0006, 0x00c0, 0x7b7c, 0x1078, 0x847b, 0x00c0, 0x7bbc,
-	0x6007, 0x000e, 0x0078, 0x7c5e, 0x047e, 0x6418, 0xa4a0, 0x0028,
-	0x2424, 0xa4a4, 0x00ff, 0x8427, 0x047e, 0x1078, 0x24bf, 0x047f,
-	0x017e, 0xa006, 0x2009, 0x8852, 0x210c, 0xd1a4, 0x0040, 0x7bdb,
-	0x2009, 0x0029, 0x1078, 0x86f5, 0x6018, 0x0d7e, 0x2068, 0x6800,
-	0xc0e5, 0x6802, 0x0d7f, 0x017f, 0x047f, 0x6007, 0x0001, 0x0078,
-	0x7c5e, 0x1078, 0x85aa, 0x0040, 0x7bee, 0xa6b4, 0xff00, 0x8637,
-	0xa686, 0x0006, 0x0040, 0x7bb4, 0x0078, 0x7b7c, 0x6013, 0x1900,
-	0x6007, 0x0009, 0x0078, 0x7c5e, 0x1078, 0x42a2, 0x6618, 0xa6b0,
-	0x0001, 0x2634, 0xa684, 0x00ff, 0xa082, 0x0006, 0x0048, 0x7c3c,
-	0xa6b4, 0xff00, 0x8637, 0xa686, 0x0004, 0x0040, 0x7c0b, 0xa686,
-	0x0006, 0x00c0, 0x7b7c, 0x1078, 0x84a6, 0x00c0, 0x7c17, 0x1078,
-	0x83a4, 0x00c0, 0x7c17, 0x6007, 0x0010, 0x0078, 0x7c5e, 0x047e,
-	0x6418, 0xa4a0, 0x0028, 0x2424, 0xa4a4, 0x00ff, 0x8427, 0x047e,
-	0x1078, 0x24bf, 0x047f, 0x017e, 0xa006, 0x2009, 0x8852, 0x210c,
-	0xd1a4, 0x0040, 0x7c36, 0x2009, 0x0029, 0x1078, 0x86f5, 0x6018,
-	0x0d7e, 0x2068, 0x6800, 0xc0e5, 0x6802, 0x0d7f, 0x017f, 0x047f,
-	0x6007, 0x0001, 0x0078, 0x7c5e, 0x1078, 0x85aa, 0x0040, 0x7c49,
-	0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006, 0x0040, 0x7c0b, 0x0078,
-	0x7b7c, 0x6013, 0x1900, 0x6007, 0x0009, 0x0078, 0x7c5e, 0x7030,
-	0xa086, 0x6000, 0x0040, 0x7c5c, 0x1078, 0x8727, 0x00c0, 0x7cd3,
-	0x1078, 0x7cd6, 0x00c0, 0x7b7c, 0x6007, 0x0012, 0x6003, 0x0001,
-	0x1078, 0x53e6, 0x007c, 0x6007, 0x0001, 0x6003, 0x0001, 0x1078,
-	0x53e6, 0x0078, 0x7c62, 0x6007, 0x0005, 0x0078, 0x7c65, 0x1078,
-	0x8727, 0x00c0, 0x7cd3, 0x1078, 0x7cd6, 0x00c0, 0x7b7c, 0x6007,
-	0x0020, 0x6003, 0x0001, 0x1078, 0x53e6, 0x007c, 0x6007, 0x0023,
-	0x6003, 0x0001, 0x1078, 0x53e6, 0x007c, 0x1078, 0x8727, 0x00c0,
-	0x7cd3, 0x1078, 0x7cd6, 0x00c0, 0x7b7c, 0x017e, 0x027e, 0x2011,
-	0x8d90, 0x2214, 0x2c08, 0x1078, 0x86c1, 0x00c0, 0x7ca7, 0x2160,
-	0x6007, 0x0026, 0x6013, 0x1700, 0x2011, 0x8d89, 0x2214, 0xa296,
-	0xffff, 0x00c0, 0x7cac, 0x6007, 0x0025, 0x0078, 0x7cac, 0x1078,
-	0x690e, 0x2160, 0x6007, 0x0025, 0x6003, 0x0001, 0x1078, 0x53e6,
-	0x027f, 0x017f, 0x007c, 0x6106, 0x1078, 0x7ce9, 0x6007, 0x002b,
-	0x0078, 0x7c5e, 0x6007, 0x002c, 0x0078, 0x7c5e, 0x1078, 0x8727,
-	0x00c0, 0x7cd3, 0x1078, 0x7cd6, 0x00c0, 0x7b7c, 0x6106, 0x1078,
-	0x7cee, 0x00c0, 0x7ccf, 0x6007, 0x002e, 0x0078, 0x7c5e, 0x6007,
-	0x002f, 0x0078, 0x7c5e, 0x1078, 0x690e, 0x007c, 0x0d7e, 0x6618,
-	0x2668, 0x6e04, 0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006, 0x0040,
-	0x7ce7, 0xa686, 0x0004, 0x0040, 0x7ce7, 0xa085, 0x0001, 0x0d7f,
-	0x007c, 0x0d7e, 0x1078, 0x7d1b, 0x0d7f, 0x007c, 0x0d7e, 0x1078,
-	0x7d2a, 0x00c0, 0x7d14, 0x680c, 0xa08c, 0xff00, 0x6824, 0xa084,
-	0x00ff, 0xa115, 0x6212, 0xd1e4, 0x0040, 0x7d02, 0x2009, 0x0001,
-	0x0078, 0x7d10, 0xd1ec, 0x0040, 0x7d14, 0x6920, 0xa18c, 0x00ff,
-	0x6824, 0x1078, 0x2245, 0x00c0, 0x7d14, 0x2110, 0x2009, 0x0000,
-	0x1078, 0x2507, 0x0078, 0x7d18, 0xa085, 0x0001, 0x0078, 0x7d19,
-	0xa006, 0x0d7f, 0x007c, 0x2069, 0x8d8d, 0x6800, 0xa082, 0x0010,
-	0x00c8, 0x7d28, 0x6013, 0x0000, 0xa085, 0x0001, 0x0078, 0x7d29,
-	0xa006, 0x007c, 0x6013, 0x0000, 0x2069, 0x8d8c, 0x6808, 0xa084,
-	0xff00, 0xa086, 0x0800, 0x007c, 0x6004, 0xa0b2, 0x0040, 0x10c8,
-	0x12d2, 0xa1b6, 0x0013, 0x00c0, 0x7d40, 0x2008, 0x0079, 0x7d53,
-	0xa1b6, 0x0027, 0x0040, 0x7d48, 0xa1b6, 0x0014, 0x10c0, 0x12d2,
-	0x2001, 0x0007, 0x1078, 0x3f2c, 0x1078, 0x578f, 0x1078, 0x79a8,
-	0x1078, 0x5888, 0x007c, 0x7d93, 0x7d95, 0x7d93, 0x7d93, 0x7d93,
-	0x7d95, 0x7d9d, 0x7e08, 0x7dcb, 0x7e08, 0x7ddf, 0x7e08, 0x7d9d,
-	0x7e08, 0x7e00, 0x7e08, 0x7e00, 0x7e08, 0x7e08, 0x7d93, 0x7d93,
-	0x7d93, 0x7d93, 0x7d93, 0x7d93, 0x7d93, 0x7d93, 0x7d93, 0x7d93,
-	0x7d93, 0x7d93, 0x7d93, 0x7e08, 0x7d93, 0x7d93, 0x7e08, 0x7d93,
-	0x7e08, 0x7e08, 0x7d93, 0x7d93, 0x7d93, 0x7d93, 0x7e08, 0x7e08,
-	0x7d93, 0x7e08, 0x7e08, 0x7d93, 0x7d93, 0x7d93, 0x7d93, 0x7d93,
-	0x7d93, 0x7d93, 0x7d93, 0x7d93, 0x7d93, 0x7d93, 0x7d93, 0x7d93,
-	0x7d93, 0x7d93, 0x7d93, 0x1078, 0x12d2, 0x1078, 0x578f, 0x6003,
-	0x0002, 0x1078, 0x5888, 0x0078, 0x7e0e, 0x0f7e, 0x2079, 0x8851,
-	0x7804, 0x0f7f, 0xd0ac, 0x00c0, 0x7e08, 0x2001, 0x0000, 0x1078,
-	0x3ef1, 0x6018, 0xa080, 0x0004, 0x2004, 0xa086, 0x00ff, 0x0040,
-	0x7e08, 0x2001, 0x0002, 0x1078, 0x3f05, 0x1078, 0x578f, 0x601f,
-	0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x1078, 0x53e6, 0x1078,
-	0x5888, 0x0c7e, 0x6118, 0x2160, 0x2009, 0x0001, 0x1078, 0x50ff,
-	0x0c7f, 0x0078, 0x7e0e, 0x6618, 0x0d7e, 0x2668, 0x6e04, 0x0d7f,
-	0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006, 0x0040, 0x7e08, 0xa686,
-	0x0004, 0x0040, 0x7e08, 0x2001, 0x0004, 0x0078, 0x7e06, 0x2001,
-	0x8800, 0x2004, 0xa086, 0x0003, 0x00c0, 0x7de8, 0x1078, 0x31f8,
-	0x2001, 0x0006, 0x1078, 0x7e0f, 0x6618, 0x0d7e, 0x2668, 0x6e04,
-	0x0d7f, 0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006, 0x0040, 0x7e08,
-	0x2001, 0x0006, 0x0078, 0x7e06, 0x2001, 0x0004, 0x0078, 0x7e06,
-	0x2001, 0x0006, 0x1078, 0x7e0f, 0x0078, 0x7e08, 0x1078, 0x3f2c,
-	0x1078, 0x578f, 0x1078, 0x690e, 0x1078, 0x5888, 0x007c, 0x017e,
-	0x0d7e, 0x6118, 0x2168, 0x6900, 0xd184, 0x0040, 0x7e2a, 0x6104,
-	0xa18e, 0x000a, 0x00c0, 0x7e22, 0x699c, 0xd1a4, 0x00c0, 0x7e22,
-	0x2001, 0x0007, 0x1078, 0x3f05, 0x2001, 0x0000, 0x1078, 0x3ef1,
-	0x1078, 0x24e5, 0x0d7f, 0x017f, 0x007c, 0x0d7e, 0x6618, 0x2668,
-	0x6804, 0xa084, 0xff00, 0x8007, 0x0d7f, 0xa0b2, 0x000c, 0x10c8,
-	0x12d2, 0xa1b6, 0x0015, 0x00c0, 0x7e41, 0x1079, 0x7e48, 0x0078,
-	0x7e47, 0xa1b6, 0x0016, 0x10c0, 0x12d2, 0x1079, 0x7e89, 0x007c,
-	0x6c5e, 0x6c5e, 0x6c5e, 0x6c5e, 0x6c5e, 0x6c5e, 0x6c5e, 0x7e54,
-	0x6c5e, 0x6c5e, 0x6c5e, 0x6c5e, 0x0f7e, 0x2079, 0x8851, 0x7804,
-	0x0f7f, 0xd0ac, 0x00c0, 0x7e70, 0x2001, 0x0000, 0x1078, 0x3ef1,
-	0x2001, 0x0002, 0x1078, 0x3f05, 0x601f, 0x0001, 0x6003, 0x0001,
-	0x6007, 0x0002, 0x1078, 0x53e6, 0x1078, 0x5888, 0x0078, 0x7e88,
-	0x2011, 0x8d83, 0x2204, 0x8211, 0x220c, 0x1078, 0x2245, 0x00c0,
-	0x7e88, 0x0c7e, 0x1078, 0x3f8e, 0x0040, 0x7e83, 0x0c7f, 0x1078,
-	0x690e, 0x0078, 0x7e88, 0x1078, 0x3d31, 0x0c7f, 0x1078, 0x690e,
-	0x007c, 0x6c5e, 0x6c5e, 0x6c5e, 0x6c5e, 0x6c5e, 0x6c5e, 0x6c5e,
-	0x7e95, 0x6c5e, 0x6c5e, 0x6c5e, 0x6c5e, 0x1078, 0x6e76, 0x00c0,
-	0x7ea1, 0x6003, 0x0001, 0x6007, 0x0001, 0x1078, 0x53e6, 0x0078,
-	0x7ea3, 0x1078, 0x690e, 0x007c, 0x6004, 0xa08a, 0x0040, 0x10c8,
-	0x12d2, 0x1078, 0x578f, 0x1078, 0x79a8, 0x1078, 0x5888, 0x007c,
-	0xa182, 0x0040, 0x0079, 0x7eb4, 0x7ec7, 0x7ec7, 0x7ec7, 0x7ec7,
-	0x7ec9, 0x7ec7, 0x7ec7, 0x7ec7, 0x7ec7, 0x7ec7, 0x7ec7, 0x7ec7,
-	0x7ec7, 0x7ec7, 0x7ec7, 0x7ec7, 0x7ec7, 0x7ec7, 0x7ec7, 0x1078,
-	0x12d2, 0x0d7e, 0x0e7e, 0x0f7e, 0x157e, 0x047e, 0x027e, 0x6106,
-	0x2071, 0x8d80, 0x7444, 0xa4a4, 0xff00, 0x0040, 0x7f3e, 0xa486,
-	0x2000, 0x0040, 0x7ef3, 0xa486, 0x0400, 0x0040, 0x7ef3, 0xa486,
-	0x1000, 0x0040, 0x7ee5, 0x0078, 0x7ef9, 0x2069, 0x8b24, 0x6a00,
-	0xd284, 0x0040, 0x7fab, 0x1078, 0x5253, 0x0040, 0x7fd6, 0xc2cd,
-	0x6a02, 0x0078, 0x7ef9, 0x2009, 0x0001, 0x2011, 0x0200, 0x1078,
-	0x5243, 0x1078, 0x132b, 0x1040, 0x12d2, 0x6003, 0x0007, 0x2d00,
-	0x6837, 0x010d, 0x6803, 0x0000, 0x683b, 0x0000, 0x6c5a, 0x2c00,
-	0x685e, 0x6008, 0x68b2, 0x6018, 0x2078, 0x78a0, 0x8007, 0x7130,
-	0x694a, 0x017e, 0xa084, 0xff00, 0x6846, 0x684f, 0x0000, 0x6857,
-	0x0036, 0x1078, 0x4376, 0x017f, 0xa486, 0x2000, 0x00c0, 0x7f26,
-	0x2019, 0x0017, 0x1078, 0x8683, 0x0078, 0x7f98, 0xa486, 0x0400,
-	0x00c0, 0x7f30, 0x2019, 0x0002, 0x1078, 0x8644, 0x0078, 0x7f98,
-	0xa486, 0x0200, 0x00c0, 0x7f36, 0x1078, 0x8631, 0xa486, 0x1000,
-	0x00c0, 0x7f3c, 0x1078, 0x8670, 0x0078, 0x7f98, 0x2069, 0x8b24,
-	0x6a00, 0xd284, 0x0040, 0x7fee, 0xa284, 0x0300, 0x00c0, 0x7fe6,
-	0x6804, 0xa005, 0x0040, 0x7fd6, 0x2d78, 0x6003, 0x0007, 0x1078,
-	0x1310, 0x0040, 0x7f9f, 0x7800, 0xd08c, 0x00c0, 0x7f5a, 0x7804,
-	0x8001, 0x7806, 0x6013, 0x0000, 0x6803, 0x0000, 0x6837, 0x0116,
-	0x683b, 0x0000, 0x6008, 0x68b2, 0x2c00, 0x684a, 0x6018, 0x2078,
-	0x78a0, 0x8007, 0x7130, 0x6986, 0x6846, 0x6853, 0x003d, 0x7244,
-	0xa294, 0x0003, 0xa286, 0x0002, 0x00c0, 0x7f7a, 0x684f, 0x0040,
-	0x0078, 0x7f84, 0xa286, 0x0001, 0x00c0, 0x7f82, 0x684f, 0x0080,
-	0x0078, 0x7f84, 0x684f, 0x0000, 0x20a9, 0x000a, 0x2001, 0x8d90,
-	0xad90, 0x0015, 0x200c, 0x810f, 0x2112, 0x8000, 0x8210, 0x00f0,
-	0x7f8a, 0x200c, 0x6982, 0x8000, 0x200c, 0x697e, 0x1078, 0x4376,
-	0x027f, 0x047f, 0x157f, 0x0f7f, 0x0e7f, 0x0d7f, 0x007c, 0x6013,
-	0x0100, 0x6003, 0x0001, 0x6007, 0x0041, 0x1078, 0x5399, 0x1078,
-	0x5888, 0x0078, 0x7f98, 0x2069, 0x8d92, 0x2d04, 0xa084, 0xff00,
-	0xa086, 0x1200, 0x00c0, 0x7fca, 0x2069, 0x8d80, 0x686c, 0xa084,
-	0x00ff, 0x017e, 0x6110, 0xa18c, 0x0700, 0xa10d, 0x6112, 0x017f,
-	0x6003, 0x0001, 0x6007, 0x0043, 0x1078, 0x5399, 0x1078, 0x5888,
-	0x0078, 0x7f98, 0x6013, 0x0200, 0x6003, 0x0001, 0x6007, 0x0041,
-	0x1078, 0x5399, 0x1078, 0x5888, 0x0078, 0x7f98, 0x6013, 0x0300,
-	0x0078, 0x7fdc, 0x6013, 0x0100, 0x6003, 0x0001, 0x6007, 0x0041,
-	0x1078, 0x5399, 0x1078, 0x5888, 0x0078, 0x7f98, 0x6013, 0x0500,
-	0x0078, 0x7fdc, 0x6013, 0x0600, 0x0078, 0x7fab, 0x6013, 0x0200,
-	0x0078, 0x7fab, 0xa186, 0x0013, 0x00c0, 0x8004, 0x6004, 0xa08a,
-	0x0040, 0x1048, 0x12d2, 0xa08a, 0x0053, 0x10c8, 0x12d2, 0xa082,
-	0x0040, 0x2008, 0x0079, 0x806b, 0xa186, 0x0047, 0x00c0, 0x8026,
-	0x6004, 0xa086, 0x0041, 0x0040, 0x8034, 0x2001, 0x0109, 0x2004,
-	0xd084, 0x0040, 0x8034, 0x127e, 0x2091, 0x2200, 0x007e, 0x017e,
-	0x027e, 0x1078, 0x5273, 0x027f, 0x017f, 0x007f, 0x127f, 0x6000,
-	0xa086, 0x0002, 0x00c0, 0x8034, 0x0078, 0x80ac, 0xa186, 0x0027,
-	0x0040, 0x802e, 0xa186, 0x0014, 0x10c0, 0x12d2, 0x6004, 0xa082,
-	0x0040, 0x2008, 0x0079, 0x8037, 0x1078, 0x6950, 0x007c, 0x804a,
-	0x804c, 0x804c, 0x804a, 0x804a, 0x804a, 0x804a, 0x804a, 0x804a,
-	0x804a, 0x804a, 0x804a, 0x804a, 0x804a, 0x804a, 0x804a, 0x804a,
-	0x804a, 0x804a, 0x1078, 0x12d2, 0x1078, 0x578f, 0x1078, 0x5888,
-	0x037e, 0x0d7e, 0x6010, 0xa06d, 0x0040, 0x8068, 0xad84, 0xf000,
-	0x0040, 0x8068, 0x2019, 0x0004, 0x1078, 0x86aa, 0x6013, 0x0000,
-	0x6014, 0xa005, 0x00c0, 0x8066, 0x6017, 0x0014, 0x6003, 0x0007,
-	0x0d7f, 0x037f, 0x007c, 0x807e, 0x809d, 0x8087, 0x80a6, 0x807e,
-	0x807e, 0x807e, 0x807e, 0x807e, 0x807e, 0x807e, 0x807e, 0x807e,
-	0x807e, 0x807e, 0x807e, 0x807e, 0x807e, 0x807e, 0x1078, 0x12d2,
-	0x6010, 0xa088, 0x0013, 0x2104, 0xa085, 0x0400, 0x200a, 0x1078,
-	0x578f, 0x6010, 0xa080, 0x0013, 0x2004, 0xd0b4, 0x0040, 0x8098,
-	0x6003, 0x0007, 0x2009, 0x0043, 0x1078, 0x6939, 0x0078, 0x809a,
-	0x6003, 0x0002, 0x1078, 0x5888, 0x007c, 0x1078, 0x578f, 0x1078,
-	0x5219, 0x1078, 0x690e, 0x1078, 0x5888, 0x007c, 0x1078, 0x578f,
-	0x2009, 0x0041, 0x0078, 0x819b, 0xa182, 0x0040, 0x0079, 0x80b0,
-	0x80c3, 0x80c5, 0x80c3, 0x80c3, 0x80c3, 0x80c3, 0x80c3, 0x80c6,
-	0x80c3, 0x80c3, 0x80c3, 0x80c3, 0x80c3, 0x80c3, 0x80c3, 0x80c3,
-	0x80c3, 0x80c3, 0x80c3, 0x1078, 0x12d2, 0x007c, 0x6003, 0x0004,
-	0x6110, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x1078, 0x1594,
-	0x007c, 0xa182, 0x0040, 0x0079, 0x80d5, 0x80e8, 0x80e8, 0x80e8,
-	0x80e8, 0x80e8, 0x80e8, 0x80e8, 0x80e8, 0x80e8, 0x80ea, 0x810d,
-	0x80e8, 0x80e8, 0x80e8, 0x80e8, 0x810d, 0x80e8, 0x80e8, 0x80e8,
-	0x1078, 0x12d2, 0x1078, 0x5837, 0x1078, 0x5948, 0x6010, 0x0d7e,
-	0x2068, 0x684c, 0xd0fc, 0x0040, 0x8100, 0xa08c, 0x0003, 0xa18e,
-	0x0002, 0x0040, 0x8106, 0x2009, 0x0041, 0x0d7f, 0x0078, 0x819b,
-	0x6003, 0x0007, 0x1078, 0x5219, 0x0d7f, 0x007c, 0x1078, 0x5219,
-	0x1078, 0x690e, 0x0d7f, 0x0078, 0x8105, 0x037e, 0x1078, 0x5837,
-	0x1078, 0x5948, 0x6010, 0x0d7e, 0x2068, 0x2019, 0x0004, 0x1078,
-	0x86aa, 0x1078, 0x79a8, 0x6017, 0x0028, 0x0d7f, 0x037f, 0x007c,
-	0xa186, 0x0013, 0x00c0, 0x812e, 0x6004, 0xa086, 0x0042, 0x10c0,
-	0x12d2, 0x1078, 0x578f, 0x1078, 0x5888, 0x007c, 0xa186, 0x0027,
-	0x0040, 0x8136, 0xa186, 0x0014, 0x00c0, 0x8146, 0x6004, 0xa086,
-	0x0042, 0x10c0, 0x12d2, 0x2001, 0x0007, 0x1078, 0x3f2c, 0x1078,
-	0x578f, 0x1078, 0x79a8, 0x1078, 0x5888, 0x007c, 0xa182, 0x0040,
-	0x0079, 0x814a, 0x815d, 0x815d, 0x815d, 0x815d, 0x815d, 0x815d,
-	0x815d, 0x815f, 0x816b, 0x815d, 0x815d, 0x815d, 0x815d, 0x815d,
-	0x815d, 0x815d, 0x815d, 0x815d, 0x815d, 0x1078, 0x12d2, 0x037e,
-	0x047e, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x1078, 0x1594,
-	0x047f, 0x037f, 0x007c, 0x6010, 0x0d7e, 0x2068, 0x6810, 0x6a14,
-	0xa20d, 0x00c0, 0x8182, 0x684c, 0xd0fc, 0x0040, 0x817c, 0x2009,
-	0x0041, 0x0d7f, 0x0078, 0x819b, 0x6003, 0x0007, 0x1078, 0x5219,
-	0x0d7f, 0x007c, 0x6003, 0x0006, 0x1078, 0x818a, 0x1078, 0x521b,
-	0x0d7f, 0x007c, 0xd2fc, 0x0040, 0x8196, 0x8002, 0x8000, 0x8212,
-	0xa291, 0x0000, 0x2009, 0x0009, 0x0078, 0x8198, 0x2009, 0x0015,
-	0x6a6a, 0x6866, 0x007c, 0xa182, 0x0040, 0x0079, 0x819f, 0x81b2,
-	0x81b4, 0x81c0, 0x81cc, 0x81b2, 0x81b2, 0x81b2, 0x81db, 0x81b2,
-	0x81b2, 0x81b2, 0x81b2, 0x81b2, 0x81b2, 0x81b2, 0x81b2, 0x81b2,
-	0x81b2, 0x81b2, 0x1078, 0x12d2, 0x6003, 0x0001, 0x6106, 0x1078,
-	0x5399, 0x127e, 0x2091, 0x8000, 0x1078, 0x5888, 0x127f, 0x007c,
-	0x6003, 0x0001, 0x6106, 0x1078, 0x5399, 0x127e, 0x2091, 0x8000,
-	0x1078, 0x5888, 0x127f, 0x007c, 0x6003, 0x0003, 0x6106, 0x2c10,
-	0x1078, 0x1b07, 0x127e, 0x2091, 0x8000, 0x1078, 0x5405, 0x1078,
-	0x5948, 0x127f, 0x007c, 0xa016, 0x1078, 0x1594, 0x007c, 0x127e,
-	0x2091, 0x8000, 0x037e, 0x0d7e, 0xa182, 0x0040, 0x1079, 0x81ec,
-	0x0d7f, 0x037f, 0x127f, 0x007c, 0x81fc, 0x81fe, 0x8213, 0x8232,
-	0x81fc, 0x81fc, 0x81fc, 0x824a, 0x81fc, 0x81fc, 0x81fc, 0x81fc,
-	0x81fc, 0x81fc, 0x81fc, 0x81fc, 0x1078, 0x12d2, 0x6010, 0x2068,
-	0x684c, 0xd0fc, 0x0040, 0x8228, 0xa09c, 0x0003, 0xa39e, 0x0003,
-	0x0040, 0x8228, 0x6003, 0x0001, 0x6106, 0x1078, 0x5399, 0x1078,
-	0x5888, 0x0078, 0x824d, 0x6010, 0x2068, 0x684c, 0xd0fc, 0x0040,
-	0x8228, 0xa09c, 0x0003, 0xa39e, 0x0003, 0x0040, 0x8228, 0x6003,
-	0x0001, 0x6106, 0x1078, 0x5399, 0x1078, 0x5888, 0x0078, 0x824d,
-	0x6013, 0x0000, 0x6017, 0x0000, 0x2019, 0x0004, 0x1078, 0x86aa,
-	0x0078, 0x824d, 0x6010, 0x2068, 0x684c, 0xd0fc, 0x0040, 0x8228,
-	0xa09c, 0x0003, 0xa39e, 0x0003, 0x0040, 0x8228, 0x6003, 0x0003,
-	0x6106, 0x2c10, 0x1078, 0x1b07, 0x1078, 0x5405, 0x1078, 0x5948,
-	0x0078, 0x824d, 0xa016, 0x1078, 0x1594, 0x007c, 0x1078, 0x578f,
-	0x6110, 0x81ff, 0x0040, 0x825d, 0x0d7e, 0x2168, 0x037e, 0x2019,
-	0x0029, 0x1078, 0x86aa, 0x037f, 0x0d7f, 0x1078, 0x79a8, 0x1078,
-	0x5888, 0x007c, 0x1078, 0x5837, 0x6110, 0x81ff, 0x0040, 0x8271,
-	0x0d7e, 0x2168, 0x037e, 0x2019, 0x0029, 0x1078, 0x86aa, 0x037f,
-	0x0d7f, 0x1078, 0x79a8, 0x1078, 0x5948, 0x007c, 0xa182, 0x0085,
-	0x0079, 0x827a, 0x8281, 0x8281, 0x8281, 0x8283, 0x8281, 0x8281,
-	0x8281, 0x1078, 0x12d2, 0x027e, 0x0e7e, 0x1078, 0x8727, 0x0040,
-	0x828d, 0x1078, 0x690e, 0x0078, 0x82a9, 0x2071, 0x8d80, 0x7224,
-	0x6212, 0x7220, 0x1078, 0x8575, 0x0040, 0x829a, 0x6007, 0x0086,
-	0x0078, 0x82a3, 0x6007, 0x0087, 0x7224, 0xa296, 0xffff, 0x00c0,
-	0x82a3, 0x6007, 0x0086, 0x6003, 0x0001, 0x1078, 0x5399, 0x1078,
-	0x5888, 0x0e7f, 0x027f, 0x007c, 0xa186, 0x0013, 0x00c0, 0x82bd,
-	0x6004, 0xa08a, 0x0085, 0x1048, 0x12d2, 0xa08a, 0x008c, 0x10c8,
-	0x12d2, 0xa082, 0x0085, 0x0079, 0x82d4, 0xa186, 0x0027, 0x0040,
-	0x82c9, 0xa186, 0x0014, 0x0040, 0x82c9, 0x1078, 0x6950, 0x0078,
-	0x82d3, 0x2001, 0x0007, 0x1078, 0x3f2c, 0x1078, 0x578f, 0x1078,
-	0x79a8, 0x1078, 0x5888, 0x007c, 0x82db, 0x82dd, 0x82dd, 0x82db,
-	0x82db, 0x82db, 0x82db, 0x1078, 0x12d2, 0x1078, 0x578f, 0x1078,
-	0x690e, 0x1078, 0x5888, 0x007c, 0xa182, 0x0085, 0x1048, 0x12d2,
-	0xa182, 0x008c, 0x10c8, 0x12d2, 0xa182, 0x0085, 0x0079, 0x82f0,
-	0x82f7, 0x82f7, 0x82f7, 0x82f9, 0x82f7, 0x82f7, 0x82f7, 0x1078,
-	0x12d2, 0x007c, 0xa186, 0x0013, 0x0040, 0x830a, 0xa186, 0x0014,
-	0x0040, 0x830a, 0xa186, 0x0027, 0x0040, 0x830a, 0x1078, 0x6950,
-	0x0078, 0x8310, 0x1078, 0x578f, 0x1078, 0x79a8, 0x1078, 0x5888,
-	0x007c, 0x037e, 0x2019, 0x000b, 0x1078, 0x831c, 0x601f, 0x0006,
-	0x6003, 0x0007, 0x037f, 0x007c, 0x127e, 0x037e, 0x087e, 0x2091,
-	0x8000, 0x2c40, 0x1078, 0x6614, 0x00c0, 0x834b, 0x1078, 0x66be,
-	0x00c0, 0x834b, 0x6000, 0xa086, 0x0000, 0x0040, 0x834b, 0x601c,
-	0xa086, 0x0007, 0x0040, 0x834b, 0x0d7e, 0x6000, 0xa086, 0x0004,
-	0x00c0, 0x833e, 0x601f, 0x0007, 0x1078, 0x16af, 0x6010, 0x2068,
-	0x1078, 0x77ed, 0x0040, 0x8346, 0x1078, 0x86aa, 0x0d7f, 0x6013,
-	0x0000, 0x601f, 0x0007, 0x087f, 0x037f, 0x127f, 0x007c, 0x0f7e,
-	0x0c7e, 0x037e, 0x157e, 0x2079, 0x8d80, 0x7938, 0x783c, 0x1078,
-	0x2245, 0x00c0, 0x839d, 0x017e, 0x0c7e, 0x1078, 0x3f8e, 0x00c0,
-	0x839d, 0x2011, 0x8d90, 0xac98, 0x000a, 0x20a9, 0x0004, 0x1078,
-	0x6f0c, 0x00c0, 0x839d, 0x017f, 0x027f, 0x027e, 0x017e, 0x2019,
-	0x0029, 0x1078, 0x6799, 0x1078, 0x54f0, 0x087e, 0x2041, 0x0000,
-	0x1078, 0x5419, 0x087f, 0x017f, 0x087e, 0x2041, 0x0000, 0x1078,
-	0x84d2, 0x087f, 0x1078, 0x418b, 0x027e, 0x6204, 0xa294, 0xff00,
-	0x8217, 0xa286, 0x0006, 0x0040, 0x8391, 0xa286, 0x0004, 0x00c0,
-	0x8394, 0x62a0, 0x1078, 0x2566, 0x027f, 0x017f, 0x1078, 0x3d31,
-	0x6612, 0x6516, 0xa006, 0x0078, 0x839f, 0x0c7f, 0x017f, 0x157f,
-	0x037f, 0x0c7f, 0x0f7f, 0x007c, 0x0c7e, 0x0d7e, 0x017e, 0x2009,
-	0x881f, 0x2104, 0xa086, 0x0074, 0x00c0, 0x83fb, 0x2069, 0x8d8e,
-	0x690c, 0xa182, 0x0100, 0x0048, 0x83eb, 0x6908, 0xa184, 0x8000,
-	0x0040, 0x83f7, 0xa184, 0x0800, 0x0040, 0x83f7, 0x6910, 0xa18a,
-	0x0001, 0x0048, 0x83ef, 0x6914, 0x2069, 0x8dae, 0x6904, 0x81ff,
-	0x00c0, 0x83e3, 0x690c, 0xa182, 0x0100, 0x0048, 0x83eb, 0x6908,
-	0x81ff, 0x00c0, 0x83e7, 0x6910, 0xa18a, 0x0001, 0x0048, 0x83ef,
-	0x6918, 0xa18a, 0x0001, 0x0048, 0x83f7, 0x0078, 0x8401, 0x6013,
-	0x0100, 0x0078, 0x83fd, 0x6013, 0x0300, 0x0078, 0x83fd, 0x6013,
-	0x0500, 0x0078, 0x83fd, 0x6013, 0x0700, 0x0078, 0x83fd, 0x6013,
-	0x0900, 0x0078, 0x83fd, 0x6013, 0x0b00, 0x0078, 0x83fd, 0x6013,
-	0x0f00, 0x0078, 0x83fd, 0x6013, 0x2d00, 0xa085, 0x0001, 0x0078,
-	0x8402, 0xa006, 0x017f, 0x0d7f, 0x0c7f, 0x007c, 0x0c7e, 0x0d7e,
-	0x027e, 0x037e, 0x157e, 0x6218, 0x2268, 0x6b04, 0xa394, 0x00ff,
-	0xa286, 0x0006, 0x0040, 0x842a, 0xa286, 0x0004, 0x0040, 0x842a,
-	0xa394, 0xff00, 0x8217, 0xa286, 0x0006, 0x0040, 0x842a, 0xa286,
-	0x0004, 0x0040, 0x842a, 0x0c7e, 0x2d60, 0x1078, 0x3fa0, 0x0c7f,
-	0x0078, 0x8465, 0x2011, 0x8d96, 0xad98, 0x000a, 0x20a9, 0x0004,
-	0x1078, 0x6f0c, 0x00c0, 0x8466, 0x2011, 0x8d9a, 0xad98, 0x0006,
-	0x20a9, 0x0004, 0x1078, 0x6f0c, 0x00c0, 0x8466, 0x047e, 0x017e,
-	0x6aa0, 0xa294, 0x00ff, 0x8227, 0xa006, 0x2009, 0x8852, 0x210c,
-	0xd1a4, 0x0040, 0x8452, 0x2009, 0x0029, 0x1078, 0x86f5, 0x6800,
-	0xc0e5, 0x6802, 0x2019, 0x0029, 0x1078, 0x54f0, 0x087e, 0x2041,
-	0x0000, 0x1078, 0x5419, 0x2c08, 0x1078, 0x84d2, 0x087f, 0x2001,
-	0x0007, 0x1078, 0x3f2c, 0x017f, 0x047f, 0xa006, 0x157f, 0x037f,
-	0x027f, 0x0d7f, 0x0c7f, 0x007c, 0x0d7e, 0x2069, 0x8d8e, 0x6800,
-	0xa086, 0x0800, 0x0040, 0x8478, 0x6013, 0x0000, 0x0078, 0x8479,
-	0xa006, 0x0d7f, 0x007c, 0x0c7e, 0x0f7e, 0x017e, 0x027e, 0x037e,
-	0x157e, 0x2079, 0x8d8c, 0x7930, 0x7834, 0x1078, 0x2245, 0x00c0,
-	0x849f, 0x1078, 0x3f8e, 0x00c0, 0x849f, 0x2011, 0x8d90, 0xac98,
-	0x000a, 0x20a9, 0x0004, 0x1078, 0x6f0c, 0x00c0, 0x849f, 0x2011,
-	0x8d94, 0xac98, 0x0006, 0x20a9, 0x0004, 0x1078, 0x6f0c, 0x157f,
-	0x037f, 0x027f, 0x017f, 0x0f7f, 0x0c7f, 0x007c, 0x0c7e, 0x007e,
-	0x017e, 0x027e, 0x037e, 0x157e, 0x2011, 0x8d83, 0x2204, 0x8211,
-	0x220c, 0x1078, 0x2245, 0x00c0, 0x84cb, 0x1078, 0x3f8e, 0x00c0,
-	0x84cb, 0x2011, 0x8d96, 0xac98, 0x000a, 0x20a9, 0x0004, 0x1078,
-	0x6f0c, 0x00c0, 0x84cb, 0x2011, 0x8d9a, 0xac98, 0x0006, 0x20a9,
-	0x0004, 0x1078, 0x6f0c, 0x157f, 0x037f, 0x027f, 0x017f, 0x007f,
-	0x0c7f, 0x007c, 0x0e7e, 0x0c7e, 0x077e, 0x067e, 0x057e, 0x047e,
-	0x027e, 0x127e, 0x2091, 0x8000, 0x2029, 0x8aab, 0x252c, 0x2021,
-	0x8ab1, 0x2424, 0x2061, 0x8f00, 0x2071, 0x8800, 0x7644, 0x7060,
-	0x8001, 0xa602, 0x00c8, 0x853e, 0x2100, 0xac06, 0x0040, 0x8534,
-	0x1078, 0x870c, 0x0040, 0x8534, 0x671c, 0xa786, 0x0001, 0x0040,
-	0x8553, 0xa786, 0x0007, 0x0040, 0x8534, 0x2500, 0xac06, 0x0040,
-	0x8534, 0x2400, 0xac06, 0x0040, 0x8534, 0x1078, 0x8720, 0x00c0,
-	0x8534, 0x88ff, 0x0040, 0x8510, 0x6020, 0xa906, 0x00c0, 0x8534,
-	0x0d7e, 0x6000, 0xa086, 0x0004, 0x00c0, 0x851a, 0x017e, 0x1078,
-	0x16af, 0x017f, 0x6010, 0x2068, 0x1078, 0x77ed, 0x0040, 0x8531,
-	0xa786, 0x0003, 0x00c0, 0x8547, 0x6837, 0x0103, 0x6b4a, 0x6847,
-	0x0000, 0x017e, 0x1078, 0x7a46, 0x1078, 0x4376, 0x017f, 0x1078,
-	0x799b, 0x0d7f, 0x1078, 0x79a8, 0xace0, 0x000c, 0x2001, 0x8815,
-	0x2004, 0xac02, 0x00c8, 0x853e, 0x0078, 0x84e4, 0x127f, 0x027f,
-	0x047f, 0x057f, 0x067f, 0x077f, 0x0c7f, 0x0e7f, 0x007c, 0xa786,
-	0x0006, 0x00c0, 0x8524, 0xa386, 0x0005, 0x0040, 0x8534, 0x1078,
-	0x86aa, 0x0078, 0x8531, 0x1078, 0x8720, 0x00c0, 0x8534, 0xa180,
-	0x0001, 0x2004, 0xa086, 0x0018, 0x00c0, 0x8534, 0x6000, 0xa086,
-	0x0002, 0x00c0, 0x8534, 0x1078, 0x79c1, 0x0040, 0x856f, 0x1078,
-	0x79d5, 0x00c0, 0x8534, 0x1078, 0x6bc7, 0x0078, 0x8571, 0x1078,
-	0x24e5, 0x1078, 0x79a8, 0x0078, 0x8534, 0x0c7e, 0x0e7e, 0x017e,
-	0x2c08, 0x2170, 0x1078, 0x86c1, 0x017f, 0x0040, 0x8584, 0x601c,
-	0xa084, 0x000f, 0x1079, 0x8587, 0x0e7f, 0x0c7f, 0x007c, 0x858f,
-	0x858f, 0x858f, 0x858f, 0x858f, 0x858f, 0x8591, 0x858f, 0xa006,
-	0x007c, 0x047e, 0x017e, 0x7018, 0xa080, 0x0028, 0x2024, 0xa4a4,
-	0x00ff, 0x8427, 0x2c00, 0x2009, 0x0020, 0x1078, 0x86f5, 0x017f,
-	0x047f, 0x037e, 0x2019, 0x0002, 0x1078, 0x831c, 0x037f, 0xa085,
-	0x0001, 0x007c, 0x2001, 0x0001, 0x1078, 0x3ef1, 0x157e, 0x017e,
-	0x027e, 0x037e, 0x20a9, 0x0004, 0x2019, 0x8805, 0x2011, 0x8d96,
-	0x1078, 0x6f0c, 0x037f, 0x027f, 0x017f, 0x157f, 0xa005, 0x007c,
-	0x0f7e, 0x0e7e, 0x0c7e, 0x077e, 0x067e, 0x027e, 0x127e, 0x2091,
-	0x8000, 0x2061, 0x8f00, 0x2079, 0x0001, 0x8fff, 0x0040, 0x8624,
-	0x2071, 0x8800, 0x7644, 0x7060, 0x8001, 0xa602, 0x00c8, 0x8624,
-	0x88ff, 0x0040, 0x85e1, 0x2800, 0xac06, 0x00c0, 0x861a, 0x2079,
-	0x0000, 0x1078, 0x870c, 0x0040, 0x861a, 0x2400, 0xac06, 0x0040,
-	0x861a, 0x671c, 0xa786, 0x0006, 0x00c0, 0x861a, 0xa786, 0x0007,
-	0x0040, 0x861a, 0x88ff, 0x00c0, 0x8600, 0x6018, 0xa206, 0x00c0,
-	0x861a, 0x85ff, 0x0040, 0x8600, 0x6020, 0xa106, 0x00c0, 0x861a,
-	0x0d7e, 0x6000, 0xa086, 0x0004, 0x00c0, 0x860a, 0x601f, 0x0007,
-	0x1078, 0x16af, 0x6010, 0x2068, 0x1078, 0x77ed, 0x0040, 0x8614,
-	0x047e, 0x1078, 0x86aa, 0x047f, 0x0d7f, 0x1078, 0x79a8, 0x88ff,
-	0x00c0, 0x862d, 0xace0, 0x000c, 0x2001, 0x8815, 0x2004, 0xac02,
-	0x00c8, 0x8624, 0x0078, 0x85cd, 0xa006, 0x127f, 0x027f, 0x067f,
-	0x077f, 0x0c7f, 0x0e7f, 0x0f7f, 0x007c, 0xa8c5, 0x0001, 0x0078,
-	0x8625, 0x087e, 0x057e, 0x2041, 0x0000, 0x2029, 0x0001, 0x2c20,
-	0x2019, 0x0002, 0x6218, 0x1078, 0x6614, 0x1078, 0x66be, 0x1078,
-	0x85c0, 0x057f, 0x087f, 0x007c, 0x027e, 0x047e, 0x057e, 0x087e,
-	0x0c7e, 0x157e, 0x2c20, 0x2128, 0x20a9, 0x007f, 0x2009, 0x0000,
-	0x017e, 0x037e, 0x1078, 0x3f8e, 0x00c0, 0x8664, 0x2c10, 0x2041,
-	0x0000, 0x2508, 0x057e, 0x2029, 0x0001, 0x1078, 0x6614, 0x1078,
-	0x66be, 0x1078, 0x85c0, 0x057f, 0x037f, 0x017f, 0x8108, 0x00f0,
-	0x8650, 0x157f, 0x0c7f, 0x087f, 0x057f, 0x047f, 0x027f, 0x007c,
-	0x087e, 0x057e, 0x6218, 0x2041, 0x0000, 0x2029, 0x0001, 0x2019,
-	0x0048, 0x1078, 0x6614, 0x1078, 0x66be, 0x2c20, 0x1078, 0x85c0,
-	0x057f, 0x087f, 0x007c, 0x027e, 0x047e, 0x057e, 0x087e, 0x0c7e,
-	0x157e, 0x2c20, 0x20a9, 0x007f, 0x2009, 0x0000, 0x017e, 0x037e,
-	0x1078, 0x3f8e, 0x00c0, 0x869e, 0x2c10, 0x2041, 0x0000, 0x2828,
-	0x1078, 0x6614, 0x1078, 0x66be, 0x1078, 0x85c0, 0x037f, 0x017f,
-	0x8108, 0x00f0, 0x868e, 0x157f, 0x0c7f, 0x087f, 0x057f, 0x047f,
-	0x027f, 0x007c, 0x017e, 0x0f7e, 0x8dff, 0x0040, 0x86be, 0x6800,
-	0xa07d, 0x0040, 0x86bb, 0x6803, 0x0000, 0x6b52, 0x1078, 0x4376,
-	0x2f68, 0x0078, 0x86af, 0x6b52, 0x1078, 0x4376, 0x0f7f, 0x017f,
-	0x007c, 0x0e7e, 0x047e, 0x037e, 0x2061, 0x8f00, 0x2071, 0x8800,
-	0x7444, 0x7060, 0x8001, 0xa402, 0x00c8, 0x86f0, 0x2100, 0xac06,
-	0x0040, 0x86e2, 0x6000, 0xa086, 0x0000, 0x0040, 0x86e2, 0x6008,
-	0xa206, 0x00c0, 0x86e2, 0x6018, 0xa1a0, 0x0006, 0x2424, 0xa406,
-	0x0040, 0x86ec, 0xace0, 0x000c, 0x2001, 0x8815, 0x2004, 0xac02,
-	0x00c8, 0x86f0, 0x0078, 0x86c6, 0xa085, 0x0001, 0x0078, 0x86f1,
-	0xa006, 0x037f, 0x047f, 0x0e7f, 0x007c, 0x0d7e, 0x007e, 0x1078,
-	0x132b, 0x007f, 0x1040, 0x12d2, 0x6837, 0x010d, 0x685e, 0x6956,
-	0x6c46, 0x684f, 0x0000, 0xa006, 0x68b2, 0x6802, 0x683a, 0x685a,
-	0x1078, 0x4376, 0x0d7f, 0x007c, 0x6700, 0xa786, 0x0000, 0x0040,
-	0x871f, 0xa786, 0x0001, 0x0040, 0x871f, 0xa786, 0x000a, 0x0040,
-	0x871f, 0xa786, 0x0009, 0x0040, 0x871f, 0xa085, 0x0001, 0x007c,
-	0x0e7e, 0x6018, 0x2070, 0x70a0, 0xa206, 0x0e7f, 0x007c, 0x0e7e,
-	0x6018, 0x2070, 0x7000, 0xd0ec, 0x0e7f, 0x007c, 0x127e, 0x007e,
-	0x0e7e, 0x2091, 0x8000, 0x2071, 0x8840, 0xd5a4, 0x0040, 0x873b,
-	0x7034, 0x8000, 0x7036, 0xd5b4, 0x0040, 0x8741, 0x7030, 0x8000,
-	0x7032, 0xd5ac, 0x0040, 0x8748, 0x2071, 0x884a, 0x1078, 0x8777,
-	0x0e7f, 0x007f, 0x127f, 0x007c, 0x127e, 0x007e, 0x0e7e, 0x2091,
-	0x8000, 0x2071, 0x8840, 0xd5a4, 0x0040, 0x8759, 0x7034, 0x8000,
-	0x7036, 0xd5b4, 0x0040, 0x875f, 0x7030, 0x8000, 0x7032, 0xd5ac,
-	0x0040, 0x8766, 0x2071, 0x884a, 0x1078, 0x8777, 0x0e7f, 0x007f,
-	0x127f, 0x007c, 0x127e, 0x007e, 0x0e7e, 0x2091, 0x8000, 0x2071,
-	0x8842, 0x1078, 0x8777, 0x0e7f, 0x007f, 0x127f, 0x007c, 0x2e04,
-	0x8000, 0x2072, 0x00c8, 0x8780, 0x8e70, 0x2e04, 0x8000, 0x2072,
-	0x007c, 0x0e7e, 0x2071, 0x8840, 0x1078, 0x8777, 0x0e7f, 0x007c,
-	0x0e7e, 0x2071, 0x8844, 0x1078, 0x8777, 0x0e7f, 0x007c, 0x0001,
-	0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100,
-	0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000, 0x6f37
-};
-
-
-unsigned short risc_code2200[] = { 
-	0x0470, 0x0000, 0x0000, 0x7a68, 0x0000, 0x0002, 0x0000, 0x0028,
-	0x0007, 0x2043, 0x4f50, 0x5952, 0x4947, 0x4854, 0x2031, 0x3939,
-	0x3920, 0x514c, 0x4f47, 0x4943, 0x2043, 0x4f52, 0x504f, 0x5241,
-	0x5449, 0x4f4e, 0x2049, 0x5350, 0x3232, 0x3030, 0x2046, 0x6972,
-	0x6d77, 0x6172, 0x6520, 0x2056, 0x6572, 0x7369, 0x6f6e, 0x2030,
-	0x322e, 0x3030, 0x2e34, 0x3020, 0x2020, 0x2020, 0x2400, 0x20c1,
-	0x0005, 0x2001, 0x017f, 0x2003, 0x0000, 0x20c9, 0x8fff, 0x2091,
-	0x2000, 0x2059, 0x0000, 0x2b78, 0x7823, 0x0004, 0x2089, 0x236e,
-	0x2051, 0x8b00, 0x2a70, 0x2029, 0xaa00, 0x2031, 0xffff, 0x2039,
-	0xa9f5, 0x2021, 0x0200, 0x0804, 0x137d, 0x20a1, 0x8a68, 0xa00e,
-	0x20a9, 0x0798, 0x41a4, 0x3400, 0x755e, 0x7662, 0x775a, 0x7466,
-	0x746a, 0x20a1, 0x9200, 0x7160, 0x810d, 0x810d, 0x810d, 0x810d,
-	0xa18c, 0x000f, 0x2001, 0x0009, 0xa112, 0xa00e, 0x21a8, 0x41a4,
-	0x3400, 0x8211, 0x1dd8, 0x7160, 0x3400, 0xa102, 0x0120, 0x0218,
-	0x20a8, 0xa00e, 0x41a4, 0x3800, 0xd08c, 0x01d8, 0x2009, 0x8b00,
-	0x810d, 0x810d, 0x810d, 0x810d, 0xa18c, 0x000f, 0x2001, 0x0001,
-	0xa112, 0x20a1, 0x1000, 0xa00e, 0x21a8, 0x41a4, 0x8211, 0x1de0,
-	0x2009, 0x8b00, 0x3400, 0xa102, 0x0120, 0x0218, 0x20a8, 0xa00e,
-	0x41a4, 0x080c, 0x1334, 0x080c, 0x14c2, 0x080c, 0x165b, 0x080c,
-	0x1bc1, 0x080c, 0x410c, 0x080c, 0x6cba, 0x080c, 0x144b, 0x080c,
-	0x273d, 0x080c, 0x4d5e, 0x080c, 0x45ef, 0x080c, 0x559c, 0x080c,
-	0x2029, 0x080c, 0x577b, 0x080c, 0x5212, 0x080c, 0x1f59, 0x080c,
-	0x1ffd, 0x2091, 0x3009, 0x7823, 0x0000, 0x1004, 0x10c5, 0x7820,
-	0xa086, 0x0002, 0x1150, 0x7823, 0x4000, 0x0e04, 0x10bd, 0x781b,
-	0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x2a70, 0x7003, 0x0000,
-	0x2a70, 0x7000, 0xa08e, 0x0003, 0x1158, 0x080c, 0x3653, 0x080c,
-	0x2764, 0x080c, 0x4dac, 0x080c, 0x4788, 0x080c, 0x55b4, 0x0c80,
-	0x000b, 0x0c98, 0x10e4, 0x10e5, 0x11c0, 0x10e2, 0x1251, 0x1331,
-	0x1332, 0x1333, 0x080c, 0x1410, 0x0005, 0x0126, 0x00f6, 0x2091,
-	0x8000, 0x080c, 0x4c42, 0x0150, 0x080c, 0x4c68, 0x1518, 0x2079,
-	0x0100, 0x7828, 0xa085, 0x1800, 0x782a, 0x00e0, 0x080c, 0x4b8b,
-	0x7088, 0xa086, 0x0027, 0x1904, 0x11a5, 0x2079, 0x0100, 0x7827,
-	0xffff, 0x782b, 0x1e2b, 0x2011, 0x4b5d, 0x080c, 0x560d, 0x2011,
-	0x3fe7, 0x080c, 0x560d, 0x2011, 0x8030, 0x2019, 0x0000, 0x7087,
-	0x0000, 0x00a8, 0x080c, 0x399f, 0x2079, 0x0100, 0x7844, 0xa005,
-	0x1904, 0x11a5, 0x2011, 0x3fe7, 0x080c, 0x560d, 0x780f, 0x00ff,
-	0x7840, 0xa084, 0xfffb, 0x7842, 0x2011, 0x8010, 0x73c4, 0x080c,
-	0x3617, 0x7238, 0xc284, 0x723a, 0x2001, 0x8b0c, 0x200c, 0xc1ac,
-	0x2102, 0x080c, 0x683e, 0x2011, 0x0004, 0x080c, 0x7b94, 0x080c,
-	0x4581, 0x080c, 0x4c42, 0x0158, 0x080c, 0x40f5, 0x0140, 0x7087,
-	0x0001, 0x70bf, 0x0000, 0x080c, 0x3b32, 0x0804, 0x11a5, 0x70d3,
-	0x0000, 0x70cf, 0x0000, 0x706f, 0x0000, 0x080c, 0x11a8, 0x72c8,
-	0x080c, 0x4c42, 0x1170, 0x2011, 0x0000, 0x2001, 0x0204, 0x2004,
-	0x2019, 0x8d8d, 0x201a, 0x704f, 0xffff, 0x7053, 0x00ef, 0x7073,
-	0x0000, 0x2079, 0x8b51, 0x7804, 0xd0ac, 0x0108, 0xc295, 0x72ca,
-	0x080c, 0x4c42, 0x0118, 0xa296, 0x0004, 0x0500, 0x2011, 0x0001,
-	0x080c, 0x7b94, 0x080c, 0x7deb, 0x7097, 0x0000, 0x709b, 0xffff,
-	0x7003, 0x0002, 0x00fe, 0x080c, 0x23fa, 0x2011, 0x0005, 0x080c,
-	0x695c, 0x080c, 0x5d10, 0x080c, 0x4c42, 0x0130, 0x00c6, 0x2061,
-	0x0100, 0x60e3, 0x0008, 0x00ce, 0x012e, 0x00c8, 0x080c, 0x7deb,
-	0x7097, 0x0000, 0x709b, 0xffff, 0x7003, 0x0002, 0x2011, 0x0005,
-	0x080c, 0x695c, 0x080c, 0x5d10, 0x080c, 0x4c42, 0x0130, 0x00c6,
-	0x2061, 0x0100, 0x60e3, 0x0008, 0x00ce, 0x00fe, 0x012e, 0x0005,
-	0x00c6, 0x080c, 0x4c42, 0x1118, 0x20a9, 0x0100, 0x0010, 0x20a9,
-	0x0082, 0x080c, 0x4c42, 0x1118, 0x2009, 0x0000, 0x0010, 0x2009,
-	0x007e, 0x080c, 0x42f5, 0x8108, 0x1f04, 0x11b9, 0x00ce, 0x0005,
-	0x0126, 0x2091, 0x8000, 0x7098, 0xa086, 0xffff, 0x0130, 0x080c,
-	0x23fa, 0x080c, 0x5d10, 0x0804, 0x124f, 0x70c8, 0xd0ac, 0x1110,
-	0xd09c, 0x0520, 0xd084, 0x0510, 0x0006, 0x2001, 0x0103, 0x2003,
-	0x00ff, 0x000e, 0xd08c, 0x01d0, 0x70cc, 0xa086, 0xffff, 0x0190,
-	0x080c, 0x24f4, 0x080c, 0x5d10, 0x70c8, 0xd094, 0x1904, 0x124f,
-	0x2011, 0x0001, 0x2019, 0x0000, 0x080c, 0x2528, 0x080c, 0x5d10,
-	0x0804, 0x124f, 0x70d0, 0xa005, 0x1904, 0x124f, 0x7094, 0xa005,
-	0x1904, 0x124f, 0x70c8, 0xd0a4, 0x0118, 0xd0b4, 0x0904, 0x124f,
-	0x2001, 0x8b52, 0x2004, 0xd0ac, 0x01c0, 0x0156, 0x00c6, 0x20a9,
-	0x007f, 0x2009, 0x0000, 0x0016, 0x080c, 0x430a, 0x1118, 0x6000,
-	0xd0ec, 0x1138, 0x001e, 0x8108, 0x1f04, 0x120b, 0x00ce, 0x015e,
-	0x0020, 0x001e, 0x00ce, 0x015e, 0x0490, 0x0006, 0x2001, 0x0103,
-	0x2003, 0x00ff, 0x000e, 0x7003, 0x0003, 0x709b, 0xffff, 0xa006,
-	0x080c, 0x2298, 0x080c, 0x3689, 0x00f6, 0x2079, 0x0100, 0x080c,
-	0x4c68, 0x0150, 0x080c, 0x4c42, 0x7828, 0x0118, 0xa084, 0xe1ff,
-	0x0010, 0xa084, 0xffdf, 0x782a, 0x00fe, 0x2001, 0x8dab, 0x2004,
-	0xa086, 0x0005, 0x1120, 0x2011, 0x0000, 0x080c, 0x695c, 0x2011,
-	0x0000, 0x080c, 0x6966, 0x080c, 0x5d10, 0x080c, 0x5dc2, 0x012e,
-	0x0005, 0x0016, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2079, 0x0100,
-	0x2009, 0x00f7, 0x080c, 0x40be, 0x7940, 0xa18c, 0x0010, 0x7942,
-	0x7924, 0xd1b4, 0x0110, 0x7827, 0x0040, 0xd19c, 0x0110, 0x7827,
-	0x0008, 0x0006, 0x0036, 0x0156, 0x7954, 0xd1ac, 0x1904, 0x12b7,
-	0x080c, 0x4c54, 0x0158, 0x080c, 0x4c68, 0x1128, 0x2001, 0x8d9c,
-	0x2003, 0x0000, 0x0070, 0x080c, 0x4c4a, 0x0dc0, 0x2001, 0x8d9c,
-	0x2003, 0xaaaa, 0x2001, 0x8d9d, 0x2003, 0x0001, 0x080c, 0x4b8b,
-	0x0058, 0x080c, 0x4c42, 0x0140, 0x2009, 0x00f8, 0x080c, 0x40be,
-	0x7843, 0x0090, 0x7843, 0x0010, 0x20a9, 0x09c4, 0x7820, 0xd09c,
-	0x1138, 0x080c, 0x4c42, 0x0138, 0x7824, 0xd0ac, 0x1904, 0x131f,
-	0x1f04, 0x1296, 0x0070, 0x7824, 0x080c, 0x4c5e, 0x0118, 0xd0ac,
-	0x1904, 0x131f, 0xa084, 0x1800, 0x0d98, 0x7003, 0x0001, 0x0804,
-	0x131f, 0x2001, 0x0001, 0x080c, 0x2298, 0x0804, 0x132a, 0x7850,
-	0xa084, 0x0180, 0x7852, 0x782f, 0x0020, 0x20a9, 0x0050, 0x1d04,
-	0x12bf, 0x2091, 0x6000, 0x1f04, 0x12bf, 0x7850, 0xa084, 0x0180,
-	0xa085, 0x0400, 0x7852, 0x782f, 0x0000, 0x080c, 0x4c54, 0x0158,
-	0x080c, 0x4c68, 0x1128, 0x2001, 0x8d9c, 0x2003, 0x0000, 0x0070,
-	0x080c, 0x4c4a, 0x0dc0, 0x2001, 0x8d9c, 0x2003, 0xaaaa, 0x2001,
-	0x8d9d, 0x2003, 0x0001, 0x080c, 0x4b8b, 0x0020, 0x2009, 0x00f8,
-	0x080c, 0x40be, 0x20a9, 0x000e, 0xe000, 0x1f04, 0x12ec, 0x7850,
-	0xa084, 0x0180, 0xa085, 0x1400, 0x7852, 0x080c, 0x4c42, 0x0120,
-	0x7843, 0x0090, 0x7843, 0x0010, 0x2019, 0x61a8, 0x7820, 0xd09c,
-	0x1130, 0x080c, 0x4c42, 0x0130, 0x7824, 0xd0ac, 0x11c0, 0x8319,
-	0x1da8, 0x0080, 0x7827, 0x1800, 0xe000, 0xe000, 0x7824, 0x080c,
-	0x4c5e, 0x0110, 0xd0ac, 0x1158, 0xa084, 0x1800, 0x0d80, 0x7003,
-	0x0001, 0x0028, 0x2001, 0x0001, 0x080c, 0x2298, 0x0028, 0x7827,
-	0x0048, 0x7828, 0xc09d, 0x782a, 0x7850, 0xa084, 0x0180, 0xa085,
-	0x0400, 0x7852, 0x015e, 0x003e, 0x000e, 0x012e, 0x00fe, 0x001e,
-	0x0005, 0x0005, 0x0005, 0x0005, 0x2a70, 0x2001, 0x8d9c, 0x2003,
-	0x0000, 0x7087, 0x0000, 0x2009, 0x0100, 0x2104, 0xa082, 0x0002,
-	0x0218, 0x704f, 0xffff, 0x0010, 0x704f, 0x0000, 0x7057, 0xffff,
-	0x706f, 0x0000, 0x7073, 0x0000, 0x080c, 0x7deb, 0x2061, 0x8d8c,
-	0x6003, 0x0909, 0x6007, 0x0000, 0x600b, 0x8800, 0x600f, 0x0200,
-	0x6013, 0x00ff, 0x6017, 0x0003, 0x601b, 0x0000, 0x601f, 0x07d0,
-	0x2061, 0x8d94, 0x6003, 0x8800, 0x6007, 0x0000, 0x600b, 0x0000,
-	0x600f, 0x0200, 0x6013, 0x00ff, 0x6017, 0x0000, 0x601b, 0x0001,
-	0x601f, 0x0000, 0x2061, 0x8da4, 0x6003, 0x514c, 0x6007, 0x4f47,
-	0x600b, 0x4943, 0x600f, 0x2020, 0x0005, 0x04a0, 0x2011, 0x0000,
-	0x81ff, 0x0570, 0xa186, 0x0001, 0x1148, 0x2031, 0x8fff, 0x2039,
-	0x9e01, 0x2021, 0x0100, 0x2029, 0x9e00, 0x00e8, 0xa186, 0x0002,
-	0x1118, 0x2011, 0x0000, 0x00b8, 0xa186, 0x0005, 0x1118, 0x2011,
-	0x0001, 0x0088, 0xa186, 0x0009, 0x1118, 0x2011, 0x0002, 0x0058,
-	0xa186, 0x000a, 0x1118, 0x2011, 0x0002, 0x0028, 0xa186, 0x0055,
-	0x1110, 0x2011, 0x0003, 0x3800, 0xa084, 0xfffc, 0xa205, 0x20c0,
-	0x0804, 0x104d, 0xa00e, 0x2011, 0x0003, 0x2019, 0x13b9, 0x0804,
-	0x140a, 0x2019, 0xaaaa, 0x2061, 0xffff, 0x2c14, 0x2362, 0xe000,
-	0xe000, 0x2c04, 0xa306, 0x2262, 0x1110, 0xc1b5, 0xc1a5, 0x2011,
-	0x0000, 0x2019, 0x13cc, 0x04f0, 0x2019, 0xaaaa, 0x2061, 0xffff,
-	0x2c14, 0x2362, 0xe000, 0xe000, 0x2c1c, 0x2061, 0x7fff, 0xe000,
-	0xe000, 0x2c04, 0x2061, 0xffff, 0x2262, 0xa306, 0x0110, 0xc18d,
-	0x0008, 0xc185, 0x2011, 0x0002, 0x2019, 0x13e7, 0x0418, 0x2061,
-	0xffff, 0x2019, 0xaaaa, 0x2c14, 0x2362, 0xe000, 0xe000, 0x2c04,
-	0x2262, 0xa306, 0x1180, 0x2c14, 0x2362, 0xe000, 0xe000, 0x2c1c,
-	0x2061, 0x7fff, 0x2c04, 0x2061, 0xffff, 0x2262, 0xa306, 0x1110,
-	0xc195, 0x0008, 0xc19d, 0x2011, 0x0001, 0x2019, 0x1408, 0x0010,
-	0x0804, 0x137e, 0x3800, 0xa084, 0xfffc, 0xa205, 0x20c0, 0x0837,
-	0x2091, 0x8000, 0x0e04, 0x1412, 0x0006, 0x0016, 0x2079, 0x0000,
-	0x7818, 0xd084, 0x1de8, 0x001e, 0x792e, 0x000e, 0x782a, 0x000e,
-	0x7826, 0x3900, 0x783a, 0x7823, 0x8002, 0x781b, 0x0001, 0x2091,
-	0x5000, 0x0156, 0x0146, 0x20a9, 0x0010, 0x20a1, 0x8eaa, 0x2091,
-	0x2000, 0x40a1, 0x20a9, 0x0010, 0x2091, 0x2200, 0x40a1, 0x20a9,
-	0x0010, 0x2091, 0x2400, 0x40a1, 0x20a9, 0x0010, 0x2091, 0x2600,
-	0x40a1, 0x014e, 0x015e, 0x2079, 0x8b00, 0x7803, 0x0005, 0x2091,
-	0x4080, 0x0cf8, 0x0005, 0x2071, 0x8b00, 0x715c, 0x712e, 0x2021,
-	0x0001, 0xa190, 0x0030, 0xa298, 0x0030, 0x0240, 0x7060, 0xa302,
-	0x1228, 0x220a, 0x2208, 0x2310, 0x8420, 0x0ca8, 0x3800, 0xd08c,
-	0x0148, 0x7060, 0xa086, 0x8b00, 0x0128, 0x7063, 0x8b00, 0x2011,
-	0x1000, 0x0c48, 0x200b, 0x0000, 0x74aa, 0x74ae, 0x0005, 0x00e6,
-	0x0126, 0x2091, 0x8000, 0x2071, 0x8b00, 0x70ac, 0xa0ea, 0x0010,
-	0x0268, 0x8001, 0x70ae, 0x702c, 0x2068, 0x2d04, 0x702e, 0x206b,
-	0x0000, 0x6807, 0x0000, 0x012e, 0x00ee, 0x0005, 0xa06e, 0x0cd8,
-	0x00e6, 0x2071, 0x8b00, 0x0126, 0x2091, 0x8000, 0x70ac, 0x8001,
-	0x0260, 0x70ae, 0x702c, 0x2068, 0x2d04, 0x702e, 0x206b, 0x0000,
-	0x6807, 0x0000, 0x012e, 0x00ee, 0x0005, 0xa06e, 0x0cd8, 0x00e6,
-	0x0126, 0x2091, 0x8000, 0x2071, 0x8b00, 0x702c, 0x206a, 0x2d00,
-	0x702e, 0x70ac, 0x8000, 0x70ae, 0x012e, 0x00ee, 0x0005, 0x8dff,
-	0x0138, 0x6804, 0x6807, 0x0000, 0x0006, 0x0c49, 0x00de, 0x0cb8,
-	0x0005, 0x00e6, 0x2071, 0x8b00, 0x70ac, 0xa08a, 0x0010, 0xa00d,
-	0x00ee, 0x0005, 0x00e6, 0x2071, 0x8dcd, 0x7007, 0x0000, 0x701b,
-	0x0000, 0x701f, 0x0000, 0x2071, 0x0000, 0x7010, 0xa085, 0x8004,
-	0x7012, 0x00ee, 0x0005, 0x00e6, 0x2270, 0x700b, 0x0000, 0x2071,
-	0x8dcd, 0x7018, 0xa088, 0x8dd6, 0x220a, 0x8000, 0xa084, 0x0007,
-	0x701a, 0x7004, 0xa005, 0x1128, 0x00f6, 0x2079, 0x0010, 0x0081,
-	0x00fe, 0x00ee, 0x0005, 0x00e6, 0x2071, 0x8dcd, 0x7004, 0xa005,
-	0x1128, 0x00f6, 0x2079, 0x0010, 0x0019, 0x00fe, 0x00ee, 0x0005,
-	0x7000, 0x0002, 0x14fe, 0x1562, 0x157f, 0x157f, 0x7018, 0x711c,
-	0xa106, 0x1118, 0x7007, 0x0000, 0x0005, 0x00d6, 0xa180, 0x8dd6,
-	0x2004, 0x700a, 0x2068, 0x8108, 0xa18c, 0x0007, 0x711e, 0x7803,
-	0x0026, 0x6824, 0x7832, 0x6828, 0x7836, 0x682c, 0x783a, 0x6830,
-	0x783e, 0x6810, 0x700e, 0x680c, 0x7016, 0x6804, 0x00de, 0xd084,
-	0x0120, 0x7007, 0x0001, 0x0029, 0x0005, 0x7007, 0x0002, 0x00b1,
-	0x0005, 0x0016, 0x0026, 0x710c, 0x2011, 0x0040, 0xa182, 0x0040,
-	0x1210, 0x2110, 0xa006, 0x700e, 0x7212, 0x8203, 0x7822, 0x7803,
-	0x0020, 0x7803, 0x0041, 0x002e, 0x001e, 0x0005, 0x0016, 0x0026,
-	0x0136, 0x0146, 0x0156, 0x7014, 0x2098, 0x20a1, 0x0014, 0x7803,
-	0x0026, 0x710c, 0x2011, 0x0040, 0xa182, 0x0040, 0x1210, 0x2110,
-	0xa006, 0x700e, 0x22a8, 0x53a6, 0x8203, 0x7822, 0x7803, 0x0020,
-	0x3300, 0x7016, 0x7803, 0x0001, 0x015e, 0x014e, 0x013e, 0x002e,
-	0x001e, 0x0005, 0x0136, 0x0146, 0x0156, 0x2099, 0x8bf9, 0x20a1,
-	0x0018, 0x20a9, 0x0008, 0x53a3, 0x7803, 0x0020, 0x0126, 0x2091,
-	0x8000, 0x7803, 0x0041, 0x7007, 0x0003, 0x7000, 0xc084, 0x7002,
-	0x700b, 0x8bf4, 0x012e, 0x015e, 0x014e, 0x013e, 0x0005, 0x0136,
-	0x0146, 0x0156, 0x2001, 0x8c28, 0x209c, 0x20a1, 0x0014, 0x7803,
-	0x0026, 0x2001, 0x8c29, 0x20ac, 0x53a6, 0x2099, 0x8c2a, 0x20a1,
-	0x0018, 0x20a9, 0x0008, 0x53a3, 0x7803, 0x0020, 0x0126, 0x2091,
-	0x8000, 0x7803, 0x0001, 0x7007, 0x0004, 0x7000, 0xc08c, 0x7002,
-	0x700b, 0x8c25, 0x012e, 0x015e, 0x014e, 0x013e, 0x0005, 0x0016,
-	0x00e6, 0x2071, 0x8dcd, 0x00f6, 0x2079, 0x0010, 0x7904, 0x7803,
-	0x0002, 0xd1fc, 0x0120, 0xa18c, 0x0700, 0x7004, 0x0023, 0x00fe,
-	0x00ee, 0x001e, 0x0005, 0x14f8, 0x15c2, 0x15f0, 0x161a, 0x164a,
-	0x15c1, 0x0cf8, 0xa18c, 0x0700, 0x1528, 0x0136, 0x0146, 0x0156,
-	0x7014, 0x20a0, 0x2099, 0x0014, 0x7803, 0x0040, 0x7010, 0x20a8,
-	0x53a5, 0x3400, 0x7016, 0x015e, 0x014e, 0x013e, 0x700c, 0xa005,
-	0x0570, 0x7830, 0x7832, 0x7834, 0x7836, 0x080c, 0x1529, 0x0005,
-	0x7008, 0xa080, 0x0002, 0x2003, 0x0100, 0x7007, 0x0000, 0x080c,
-	0x14f8, 0x0005, 0x7008, 0xa080, 0x0002, 0x2003, 0x0200, 0x0ca8,
-	0xa18c, 0x0700, 0x1150, 0x700c, 0xa005, 0x0188, 0x7830, 0x7832,
-	0x7834, 0x7836, 0x080c, 0x153e, 0x0005, 0x7008, 0xa080, 0x0002,
-	0x2003, 0x0200, 0x7007, 0x0000, 0x080c, 0x14f8, 0x0005, 0x00d6,
-	0x7008, 0x2068, 0x7830, 0x6826, 0x7834, 0x682a, 0x7838, 0x682e,
-	0x783c, 0x6832, 0x680b, 0x0100, 0x00de, 0x7007, 0x0000, 0x080c,
-	0x14f8, 0x0005, 0xa18c, 0x0700, 0x1540, 0x0136, 0x0146, 0x0156,
-	0x2001, 0x8bf7, 0x2004, 0xa080, 0x000d, 0x20a0, 0x2099, 0x0014,
-	0x7803, 0x0040, 0x20a9, 0x0020, 0x53a5, 0x2001, 0x8bf9, 0x2004,
-	0xd0bc, 0x0148, 0x2001, 0x8c02, 0x2004, 0xa080, 0x000d, 0x20a0,
-	0x20a9, 0x0020, 0x53a5, 0x015e, 0x014e, 0x013e, 0x7007, 0x0000,
-	0x080c, 0x4e43, 0x080c, 0x14f8, 0x0005, 0x2011, 0x8003, 0x080c,
-	0x3617, 0x0cf8, 0xa18c, 0x0700, 0x1148, 0x2001, 0x8c27, 0x2003,
-	0x0100, 0x7007, 0x0000, 0x080c, 0x14f8, 0x0005, 0x2011, 0x8004,
-	0x080c, 0x3617, 0x0cf8, 0x0126, 0x2091, 0x2200, 0x2079, 0x0030,
-	0x2071, 0x8dde, 0x7003, 0x0000, 0x700f, 0x8de4, 0x7013, 0x8de4,
-	0x780f, 0x00f6, 0x012e, 0x0005, 0x6934, 0xa184, 0x0007, 0x0002,
-	0x1678, 0x16b6, 0x1678, 0x1678, 0x1678, 0x169e, 0x1685, 0x167c,
-	0xa085, 0x0001, 0x0804, 0x16d0, 0x684c, 0xd0bc, 0x0dc8, 0x6860,
-	0x682e, 0x685c, 0x682a, 0x6858, 0x04c8, 0xa18c, 0x00ff, 0xa186,
-	0x001e, 0x1d70, 0x684c, 0xd0bc, 0x0d58, 0x6860, 0x682e, 0x685c,
-	0x682a, 0x6804, 0x681a, 0xa080, 0x000d, 0x2004, 0xa084, 0x000f,
-	0xa080, 0x1e76, 0x2005, 0x6832, 0x6858, 0x0440, 0xa18c, 0x00ff,
-	0xa186, 0x0015, 0x19a8, 0x684c, 0xd0ac, 0x0990, 0x6804, 0x681a,
-	0xa080, 0x000d, 0x2004, 0xa084, 0x000f, 0xa080, 0x1e76, 0x2005,
-	0x6832, 0xa006, 0x682e, 0x682a, 0x6858, 0x0080, 0x684c, 0xd0ac,
-	0x0904, 0x1678, 0xa006, 0x682e, 0x682a, 0x6858, 0xa18c, 0x000f,
-	0xa188, 0x1e76, 0x210d, 0x6932, 0x2d08, 0x691a, 0x6826, 0x684c,
-	0xc0dd, 0x684e, 0xa006, 0x680a, 0x697c, 0x6912, 0x6980, 0x6916,
-	0x0005, 0x20e1, 0x0007, 0x20e1, 0x2000, 0x2001, 0x020a, 0x2004,
-	0x82ff, 0x0178, 0xa280, 0x0004, 0x00d6, 0x206c, 0x684c, 0xd0dc,
-	0x1120, 0x080c, 0x166c, 0x190c, 0x1410, 0x6808, 0x8000, 0x680a,
-	0x00de, 0x0126, 0x0046, 0x0036, 0x0026, 0x2091, 0x2200, 0x002e,
-	0x003e, 0x004e, 0x7000, 0xa005, 0x01d0, 0x710c, 0x220a, 0x8108,
-	0x230a, 0x8108, 0x240a, 0x8108, 0xa182, 0x8dff, 0x0210, 0x2009,
-	0x8de4, 0x710e, 0x7010, 0xa102, 0xa082, 0x0009, 0x0118, 0xa080,
-	0x001b, 0x1118, 0x2009, 0x0138, 0x200a, 0x012e, 0x0005, 0x7206,
-	0x2001, 0x170d, 0x0006, 0x2260, 0x0804, 0x180c, 0x0126, 0x0026,
-	0x0036, 0x00c6, 0x0006, 0x2091, 0x2200, 0x000e, 0x004e, 0x003e,
-	0x002e, 0x00d6, 0x00c6, 0x2460, 0x6110, 0x2168, 0x6a62, 0x6b5e,
-	0xa005, 0x05b8, 0x6808, 0xa005, 0x0904, 0x1792, 0x7000, 0xa005,
-	0x1108, 0x0430, 0x700c, 0x7110, 0xa106, 0x1904, 0x179a, 0x7004,
-	0xa406, 0x11f0, 0x2001, 0x0005, 0x2004, 0xd08c, 0x0130, 0x0046,
-	0x080c, 0x18ee, 0x004e, 0x2460, 0x0c28, 0x2001, 0x0207, 0x2004,
-	0xd09c, 0x1d80, 0x7804, 0xa084, 0x6000, 0x0120, 0xa086, 0x6000,
-	0x0108, 0x0c40, 0x7803, 0x0004, 0x7003, 0x0000, 0x7004, 0x2060,
-	0x6100, 0xa18e, 0x0004, 0x15f0, 0x2009, 0x0048, 0x080c, 0x6d3f,
-	0x04c8, 0x6808, 0xa005, 0x0570, 0x7000, 0xa005, 0x0558, 0x700c,
-	0x7110, 0xa106, 0x1118, 0x7004, 0xa406, 0x1520, 0x2001, 0x0005,
-	0x2004, 0xd08c, 0x0130, 0x0046, 0x080c, 0x18ee, 0x004e, 0x2460,
-	0x0c40, 0x2001, 0x0207, 0x2004, 0xd09c, 0x1d80, 0x2001, 0x0005,
-	0x2004, 0xd08c, 0x1d80, 0x7804, 0xa084, 0x6000, 0x0118, 0xa086,
-	0x6000, 0x1d20, 0x7818, 0x6812, 0x781c, 0x6816, 0x7803, 0x0004,
-	0x7003, 0x0000, 0x6100, 0xa18e, 0x0004, 0x1120, 0x2009, 0x0048,
-	0x080c, 0x6d3f, 0x00ce, 0x00de, 0x012e, 0x0005, 0x00f6, 0x00e6,
-	0x0026, 0x0036, 0x0046, 0x0056, 0x080c, 0x1b5e, 0x0026, 0x0056,
-	0x2071, 0x8dde, 0x7000, 0xa086, 0x0000, 0x0580, 0x7004, 0xac06,
-	0x11f8, 0x2079, 0x0030, 0x7000, 0xa086, 0x0003, 0x01c8, 0x7804,
-	0xd0fc, 0x1198, 0x2001, 0x0207, 0x2004, 0xd09c, 0x1dc0, 0x7803,
-	0x0004, 0x7804, 0xd0ac, 0x1de8, 0x7803, 0x0002, 0x7803, 0x0009,
-	0x7003, 0x0003, 0x7007, 0x0000, 0x0018, 0x080c, 0x18ee, 0x08d0,
-	0x0156, 0x20a9, 0x0009, 0x2009, 0x8de4, 0x2104, 0xac06, 0x1108,
-	0x200a, 0xa188, 0x0003, 0x1f04, 0x17d5, 0x015e, 0x005e, 0x002e,
-	0x2001, 0x015d, 0x201c, 0x831a, 0x2302, 0x2001, 0x0160, 0x2502,
-	0x2001, 0x0138, 0x2202, 0x005e, 0x004e, 0x003e, 0x002e, 0x00ee,
-	0x00fe, 0x0005, 0x700c, 0x7110, 0xa106, 0x0904, 0x1841, 0x2104,
-	0x7006, 0x2060, 0x8108, 0x211c, 0x8108, 0x2124, 0x8108, 0xa182,
-	0x8dff, 0x0210, 0x2009, 0x8de4, 0x7112, 0x700c, 0xa106, 0x1120,
-	0x2001, 0x0138, 0x2003, 0x0008, 0x8cff, 0x0538, 0x6010, 0x2068,
-	0x2d58, 0x6828, 0xa406, 0x1520, 0x682c, 0xa306, 0x1508, 0x684c,
-	0xd0f4, 0x11d8, 0x6850, 0xd0f4, 0x1130, 0x7803, 0x0004, 0x6810,
-	0x781a, 0x6814, 0x781e, 0x6824, 0x2050, 0x6818, 0x2060, 0x6830,
-	0x2040, 0x6034, 0xa0cc, 0x000f, 0x2009, 0x0011, 0x00a9, 0x0118,
-	0x2009, 0x0001, 0x0089, 0x2d58, 0x0005, 0x080c, 0x1b10, 0x0ce0,
-	0x601c, 0xa086, 0x0008, 0x1108, 0x08d0, 0x080c, 0x1e96, 0x1da8,
-	0x08b0, 0x7003, 0x0000, 0x0005, 0x8aff, 0x0904, 0x18c8, 0xa03e,
-	0x2730, 0x6850, 0xd0fc, 0x11b8, 0xd0f4, 0x1538, 0x00d6, 0x2805,
-	0xac68, 0x2900, 0x0002, 0x18b2, 0x187c, 0x187c, 0x18b2, 0x18b2,
-	0x18ab, 0x18b2, 0x187c, 0x18b2, 0x1881, 0x1881, 0x18b2, 0x18b2,
-	0x18b2, 0x18a3, 0x1881, 0x7803, 0x0004, 0xc0fc, 0x6852, 0x6b6c,
-	0x6a70, 0x6d1c, 0x6c20, 0x00d6, 0xd99c, 0x0904, 0x18b5, 0x2805,
-	0xac68, 0x6f08, 0x6e0c, 0x0804, 0x18b5, 0xc0f4, 0x6852, 0x6b6c,
-	0x6a70, 0x00d6, 0x0804, 0x18bc, 0x6b08, 0x6a0c, 0x6d00, 0x6c04,
-	0x04a0, 0x7b0c, 0xd3bc, 0x01c0, 0x7004, 0x00e6, 0x2070, 0x701c,
-	0x00ee, 0xa086, 0x0008, 0x1180, 0x7b08, 0xa39c, 0x0fff, 0x2d20,
-	0x7a1c, 0x82ff, 0x1120, 0x7818, 0xa302, 0x0208, 0x7b18, 0xa016,
-	0x7a1e, 0x7b1a, 0x2468, 0x0010, 0x6b10, 0x6a14, 0x6d00, 0x6c04,
-	0x6f08, 0x6e0c, 0x0090, 0x00de, 0x00d6, 0x6834, 0xa084, 0x00ff,
-	0xa086, 0x001e, 0x1138, 0x00de, 0x080c, 0x1e38, 0x1904, 0x1844,
-	0xa00e, 0x00b0, 0x00de, 0x080c, 0x1410, 0x7b22, 0x7a26, 0x7d32,
-	0x7c36, 0x7f3a, 0x7e3e, 0x7902, 0x7000, 0x8000, 0x7002, 0x00de,
-	0x6828, 0xa300, 0x682a, 0x682c, 0xa201, 0x682e, 0x080c, 0x1e38,
-	0x0005, 0x080c, 0x1410, 0x7803, 0x0004, 0x7004, 0x2060, 0x00d6,
-	0x6010, 0x2068, 0x7003, 0x0000, 0x080c, 0x1b30, 0x080c, 0x7b8f,
-	0x0170, 0x6808, 0x8001, 0x680a, 0x697c, 0x6912, 0x6980, 0x6916,
-	0x682b, 0xffff, 0x682f, 0xffff, 0x6850, 0xc0bd, 0x6852, 0x00de,
-	0x080c, 0x795f, 0x0804, 0x1a87, 0x080c, 0x1410, 0x0126, 0x2091,
-	0x2200, 0x0006, 0x0016, 0x2b68, 0x6818, 0x2060, 0x7904, 0x7803,
-	0x0002, 0xa184, 0x0700, 0x1978, 0xa184, 0x0003, 0xa086, 0x0003,
-	0x0d58, 0x7000, 0x0002, 0x190b, 0x190d, 0x19e8, 0x1a62, 0x1a76,
-	0x190b, 0x190b, 0x190b, 0x080c, 0x1410, 0x8001, 0x7002, 0xa184,
-	0x0880, 0x1190, 0xd19c, 0x1904, 0x198b, 0x8aff, 0x0904, 0x198b,
-	0x2009, 0x0001, 0x080c, 0x1844, 0x0904, 0x1a87, 0x2009, 0x0001,
-	0x080c, 0x1844, 0x0804, 0x1a87, 0x7803, 0x0004, 0x7003, 0x0000,
-	0xd1bc, 0x1904, 0x1975, 0x0026, 0x0036, 0x7c20, 0x7d24, 0x7e30,
-	0x7f34, 0x7818, 0x6812, 0x781c, 0x6816, 0x2001, 0x0201, 0x2004,
-	0xa005, 0x0140, 0x7808, 0xd0ec, 0x1128, 0x7803, 0x0009, 0x7003,
-	0x0004, 0x0010, 0x080c, 0x1a8b, 0x6b28, 0x6a2c, 0x2400, 0x686e,
-	0xa31a, 0x2500, 0x6872, 0xa213, 0x6b2a, 0x6a2e, 0x003e, 0x002e,
-	0x6e1e, 0x6f22, 0x080c, 0x1e4e, 0x2a00, 0x6826, 0x2c00, 0x681a,
-	0x2800, 0x6832, 0x6850, 0xc0fd, 0x6852, 0x6808, 0x8001, 0x680a,
-	0x1148, 0x684c, 0xd0e4, 0x0130, 0x7004, 0x2060, 0x2009, 0x0048,
-	0x080c, 0x6d3f, 0x7000, 0xa086, 0x0004, 0x0904, 0x1a87, 0x7003,
-	0x0000, 0x080c, 0x17f2, 0x0804, 0x1a87, 0x0056, 0x7d0c, 0xd5bc,
-	0x1110, 0x080c, 0x8a1c, 0x005e, 0x080c, 0x1b30, 0x682b, 0xffff,
-	0x682f, 0xffff, 0x6808, 0x8001, 0x680a, 0x697c, 0x791a, 0x6980,
-	0x791e, 0x0804, 0x1a87, 0x7818, 0x6812, 0x7a1c, 0x6a16, 0xd19c,
-	0x0118, 0xa205, 0x1904, 0x1924, 0x684c, 0xc0f5, 0x684e, 0x7814,
-	0xa005, 0x1180, 0x7003, 0x0000, 0x6808, 0x8001, 0x680a, 0x1130,
-	0x7004, 0x2060, 0x2009, 0x0048, 0x080c, 0x6d3f, 0x080c, 0x17f2,
-	0x0804, 0x1a87, 0x7818, 0x6812, 0x781c, 0x6816, 0x7814, 0x7908,
-	0xa18c, 0x0fff, 0xa188, 0x0007, 0x8114, 0x8214, 0x8214, 0xa10a,
-	0x8104, 0x8004, 0x8004, 0xa20a, 0x810b, 0x810b, 0x810b, 0x080c,
-	0x1b7d, 0x7803, 0x0004, 0x780f, 0xffff, 0x7803, 0x0001, 0x7804,
-	0xd0fc, 0x0de8, 0x7803, 0x0002, 0x7803, 0x0004, 0x780f, 0x00f6,
-	0x7004, 0x7007, 0x0000, 0x2060, 0x2009, 0x0048, 0x080c, 0x6d3f,
-	0x080c, 0x1ba2, 0x0958, 0x7908, 0xd1ec, 0x1118, 0x2009, 0x0009,
-	0x0010, 0x2009, 0x0019, 0x7902, 0x7003, 0x0003, 0x0804, 0x1a87,
-	0x8001, 0x7002, 0xd194, 0x0178, 0x7804, 0xd0fc, 0x1904, 0x18f6,
-	0xd09c, 0x11a8, 0x8aff, 0x0904, 0x1a87, 0x2009, 0x0001, 0x080c,
-	0x1844, 0x0804, 0x1a87, 0xa184, 0x0888, 0x1148, 0x8aff, 0x0904,
-	0x1a87, 0x2009, 0x0001, 0x080c, 0x1844, 0x0804, 0x1a87, 0x7803,
-	0x0004, 0x7003, 0x0000, 0xd1bc, 0x1904, 0x1a4f, 0x0026, 0x0036,
-	0x7c20, 0x7d24, 0x7e30, 0x7f34, 0x7818, 0x6812, 0x781c, 0x6816,
-	0x2001, 0x0201, 0x2004, 0xa005, 0x0140, 0x7808, 0xd0ec, 0x1128,
-	0x7803, 0x0009, 0x7003, 0x0004, 0x0020, 0x0016, 0x080c, 0x1a8b,
-	0x001e, 0x6b28, 0x6a2c, 0x080c, 0x1e4e, 0x00d6, 0x2805, 0xac68,
-	0x6034, 0xd09c, 0x1128, 0x6808, 0xa31a, 0x680c, 0xa213, 0x0020,
-	0x6810, 0xa31a, 0x6814, 0xa213, 0x00de, 0xd194, 0x0904, 0x1946,
-	0x2a00, 0x6826, 0x2c00, 0x681a, 0x2800, 0x6832, 0x6808, 0x8001,
-	0x680a, 0x6b2a, 0x6a2e, 0x003e, 0x002e, 0x0804, 0x19a6, 0x0056,
-	0x7d0c, 0x080c, 0x8a1c, 0x005e, 0x080c, 0x1b30, 0x682b, 0xffff,
-	0x682f, 0xffff, 0x6808, 0x8001, 0x680a, 0x697c, 0x791a, 0x6980,
-	0x791e, 0x0428, 0x7803, 0x0004, 0x7003, 0x0000, 0x7004, 0xa00d,
-	0x0150, 0x6808, 0x8001, 0x680a, 0x1130, 0x7004, 0x2060, 0x2009,
-	0x0048, 0x080c, 0x6d3f, 0x080c, 0x17f2, 0x0088, 0x7803, 0x0004,
-	0x7003, 0x0000, 0x7004, 0x2060, 0x6010, 0xa005, 0x0da0, 0x2068,
-	0x6808, 0x8000, 0x680a, 0x6c28, 0x6b2c, 0x080c, 0x180c, 0x001e,
-	0x000e, 0x012e, 0x0005, 0x700c, 0x7110, 0xa106, 0x0904, 0x1b04,
-	0x7004, 0x0016, 0x210c, 0xa106, 0x001e, 0x0904, 0x1b04, 0x00d6,
-	0x00c6, 0x216c, 0x2d00, 0xa005, 0x0904, 0x1b02, 0x6810, 0x2068,
-	0x6850, 0xd0fc, 0x0558, 0x8108, 0x2104, 0x6b2c, 0xa306, 0x1904,
-	0x1b02, 0x8108, 0x2104, 0x6a28, 0xa206, 0x1904, 0x1b02, 0x6850,
-	0xc0fc, 0xc0f5, 0x6852, 0x686c, 0x7822, 0x6870, 0x7826, 0x681c,
-	0x7832, 0x6820, 0x7836, 0x6818, 0x2060, 0x6034, 0xd09c, 0x0150,
-	0x6830, 0x2005, 0x00d6, 0xac68, 0x6808, 0x783a, 0x680c, 0x783e,
-	0x00de, 0x0490, 0xa006, 0x783a, 0x783e, 0x0470, 0x8108, 0x2104,
-	0xa005, 0x1580, 0x8108, 0x2104, 0xa005, 0x1560, 0x6850, 0xc0f5,
-	0x6852, 0x6830, 0x2005, 0x6918, 0xa160, 0x6834, 0xd09c, 0x1170,
-	0x6008, 0x7822, 0x686e, 0x600c, 0x7826, 0x6872, 0x6000, 0x7832,
-	0x6004, 0x7836, 0xa006, 0x783a, 0x783e, 0x0070, 0x6010, 0x7822,
-	0x686e, 0x6014, 0x7826, 0x6872, 0x6000, 0x7832, 0x6004, 0x7836,
-	0x6008, 0x783a, 0x600c, 0x783e, 0x6810, 0x781a, 0x6814, 0x781e,
-	0x7803, 0x0011, 0x00ce, 0x00de, 0x0005, 0x2011, 0x0201, 0x2009,
-	0x003c, 0x2204, 0xa005, 0x1118, 0x8109, 0x1dd8, 0x0005, 0x0005,
-	0x0ca1, 0x01e0, 0x7908, 0xd1ec, 0x1160, 0x080c, 0x1ba2, 0x0148,
-	0x7803, 0x0009, 0x7904, 0xd1fc, 0x0de8, 0x7803, 0x0006, 0x0c29,
-	0x0168, 0x780c, 0xd0a4, 0x1150, 0x7007, 0x0000, 0x080c, 0x1ba2,
-	0x0130, 0x7803, 0x0019, 0x7003, 0x0003, 0x0008, 0x0009, 0x0005,
-	0x00c6, 0x0461, 0x20e1, 0x9028, 0x700c, 0x7110, 0xa106, 0x01c8,
-	0x2104, 0xa005, 0x0130, 0x2060, 0x6010, 0x2060, 0x6008, 0x8001,
-	0x600a, 0xa188, 0x0003, 0xa182, 0x8dff, 0x0210, 0x2009, 0x8de4,
-	0x7112, 0x700c, 0xa106, 0x1d40, 0x2001, 0x0138, 0x2003, 0x0008,
-	0x0c18, 0x2001, 0x015d, 0x200c, 0x810a, 0x2102, 0x2001, 0x0160,
-	0x2502, 0x2001, 0x0138, 0x2202, 0x00ce, 0x0005, 0x2001, 0x0138,
-	0x2014, 0x2003, 0x0000, 0x2001, 0x0160, 0x202c, 0x2003, 0x0000,
-	0x2021, 0xb015, 0x2001, 0x0141, 0x201c, 0xd3dc, 0x1168, 0x2001,
-	0x0109, 0x201c, 0xa39c, 0x0048, 0x1138, 0x2001, 0x0111, 0x201c,
-	0x83ff, 0x1110, 0x8421, 0x1d70, 0x0005, 0x3c00, 0x0006, 0x00e6,
-	0x2071, 0x0200, 0x7808, 0xa084, 0xf000, 0xa10d, 0x08b9, 0x20e1,
-	0x7000, 0x7324, 0x7420, 0x7028, 0x7028, 0x7426, 0x7037, 0x0001,
-	0x810f, 0x712e, 0x702f, 0x0100, 0x7037, 0x0008, 0x7326, 0x7422,
-	0x2001, 0x0160, 0x2502, 0x2001, 0x0138, 0x2202, 0x00ee, 0x000e,
-	0x20e0, 0x0005, 0x3c00, 0x0006, 0x7908, 0xa18c, 0x0fff, 0xa182,
-	0x0009, 0x0218, 0xa085, 0x0001, 0x0088, 0x2001, 0x020a, 0x81ff,
-	0x0130, 0x20e1, 0x6000, 0x200c, 0x200c, 0x200c, 0x200c, 0x20e1,
-	0x7000, 0x200c, 0x200c, 0x7003, 0x0000, 0xa006, 0x000e, 0x20e0,
-	0x0005, 0x00e6, 0x2071, 0x8dff, 0x7003, 0x0000, 0x00ee, 0x0005,
-	0x00d6, 0xa280, 0x0004, 0x206c, 0x694c, 0xd1dc, 0x1904, 0x1c3e,
-	0x6934, 0xa184, 0x0007, 0x0002, 0x1bdc, 0x1c29, 0x1bdc, 0x1bdc,
-	0x1bdc, 0x1c10, 0x1bef, 0x1bde, 0x080c, 0x1410, 0x684c, 0xd0b4,
-	0x0904, 0x1d32, 0x6860, 0x682e, 0x6816, 0x685c, 0x682a, 0x6812,
-	0x687c, 0x680a, 0x6880, 0x680e, 0x6958, 0x0804, 0x1c31, 0x6834,
-	0xa084, 0x00ff, 0xa086, 0x001e, 0x1d38, 0x684c, 0xd0b4, 0x0904,
-	0x1d32, 0x6860, 0x682e, 0x6816, 0x685c, 0x682a, 0x6812, 0x687c,
-	0x680a, 0x6880, 0x680e, 0x6804, 0x681a, 0xa080, 0x000d, 0x2004,
-	0xa084, 0x000f, 0xa080, 0x1e76, 0x2005, 0x6832, 0x6958, 0x0450,
-	0xa18c, 0x00ff, 0xa186, 0x0015, 0x1548, 0x684c, 0xd0b4, 0x0904,
-	0x1d32, 0x6804, 0x681a, 0xa080, 0x000d, 0x2004, 0xa084, 0x000f,
-	0xa080, 0x1e76, 0x2005, 0x6832, 0x6958, 0xa006, 0x682e, 0x682a,
-	0x0088, 0x684c, 0xd0b4, 0x0904, 0x18c9, 0x6958, 0xa006, 0x682e,
-	0x682a, 0x2d00, 0x681a, 0x6834, 0xa084, 0x000f, 0xa080, 0x1e76,
-	0x2005, 0x6832, 0x6926, 0x684c, 0xc0dd, 0x684e, 0x00de, 0x0005,
-	0x00f6, 0x2079, 0x0020, 0x7804, 0xd0fc, 0x190c, 0x1d58, 0x00e6,
-	0x00d6, 0x2071, 0x8dff, 0x7000, 0xa005, 0x1904, 0x1cb2, 0x00c6,
-	0x7206, 0xa280, 0x0004, 0x205c, 0x7004, 0x2068, 0x7803, 0x0004,
-	0x6818, 0x00d6, 0x2068, 0x686c, 0x7812, 0x6890, 0x00f6, 0x20e1,
-	0x9040, 0x2079, 0x0200, 0x781a, 0x2079, 0x0100, 0x8004, 0x78d6,
-	0x00fe, 0x00de, 0x2b68, 0x6824, 0x2050, 0x6818, 0x2060, 0x6830,
-	0x2040, 0x6034, 0xa0cc, 0x000f, 0x6908, 0xa184, 0x0007, 0x0128,
-	0x0016, 0x2009, 0x0008, 0xa102, 0x001e, 0xa108, 0x791a, 0x7116,
-	0x701e, 0x680c, 0xa081, 0x0000, 0x781e, 0x701a, 0xa006, 0x700e,
-	0x7012, 0x7004, 0x692c, 0x6814, 0xa106, 0x1120, 0x6928, 0x6810,
-	0xa106, 0x0158, 0x0036, 0x0046, 0x6b14, 0x6c10, 0x080c, 0x1e96,
-	0x004e, 0x003e, 0x0110, 0x00ce, 0x00a8, 0x8aff, 0x1120, 0x00ce,
-	0xa085, 0x0001, 0x0078, 0x0126, 0x2091, 0x8000, 0x2079, 0x0020,
-	0x2009, 0x0001, 0x0059, 0x0118, 0x2009, 0x0001, 0x0039, 0x012e,
-	0x00ce, 0xa006, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x0076, 0x0066,
-	0x0056, 0x0046, 0x0036, 0x0026, 0x8aff, 0x0904, 0x1d2b, 0x700c,
-	0x7214, 0xa23a, 0x7010, 0x7218, 0xa203, 0x0a04, 0x1d2a, 0xa705,
-	0x0904, 0x1d2a, 0xa03e, 0x2730, 0x6850, 0xd0fc, 0x11a8, 0x00d6,
-	0x2805, 0xac68, 0x2900, 0x0002, 0x1d0d, 0x1cf2, 0x1cf2, 0x1d0d,
-	0x1d0d, 0x1d06, 0x1d0d, 0x1cf2, 0x1d0d, 0x1cf7, 0x1cf7, 0x1d0d,
-	0x1d0d, 0x1d0d, 0x1cfe, 0x1cf7, 0xc0fc, 0x6852, 0x6b6c, 0x6a70,
-	0x6d1c, 0x6c20, 0xd99c, 0x0528, 0x00d6, 0x2805, 0xac68, 0x6f08,
-	0x6e0c, 0x00f0, 0x6b08, 0x6a0c, 0x6d00, 0x6c04, 0x00c8, 0x6b10,
-	0x6a14, 0x6d00, 0x6c04, 0x6f08, 0x6e0c, 0x0090, 0x00de, 0x00d6,
-	0x6834, 0xa084, 0x00ff, 0xa086, 0x001e, 0x1138, 0x00de, 0x080c,
-	0x1e38, 0x1904, 0x1cbc, 0xa00e, 0x00f0, 0x00de, 0x080c, 0x1410,
-	0x00de, 0x7b22, 0x7a26, 0x7d32, 0x7c36, 0x7f3a, 0x7e3e, 0x7902,
-	0x7000, 0x8000, 0x7002, 0x6828, 0xa300, 0x682a, 0x682c, 0xa201,
-	0x682e, 0x700c, 0xa300, 0x700e, 0x7010, 0xa201, 0x7012, 0x080c,
-	0x1e38, 0x0008, 0xa006, 0x002e, 0x003e, 0x004e, 0x005e, 0x006e,
-	0x007e, 0x0005, 0x080c, 0x1410, 0x2001, 0x0105, 0x2003, 0x0010,
-	0x20e1, 0x9040, 0x7803, 0x0004, 0x7003, 0x0000, 0x7004, 0x2060,
-	0x00d6, 0x6010, 0x2068, 0x080c, 0x7b8f, 0x0118, 0x6850, 0xc0bd,
-	0x6852, 0x00de, 0x080c, 0x795f, 0x20e1, 0x9040, 0x080c, 0x6b33,
-	0x2011, 0x0000, 0x080c, 0x6966, 0x080c, 0x5dc2, 0x0804, 0x1e0d,
-	0x0126, 0x2091, 0x2400, 0x0006, 0x0016, 0x00f6, 0x00e6, 0x00d6,
-	0x00c6, 0x2079, 0x0020, 0x2071, 0x8dff, 0x2b68, 0x6818, 0x2060,
-	0x7904, 0x7803, 0x0002, 0xa184, 0x0700, 0x1930, 0x7000, 0x0002,
-	0x1e0d, 0x1d74, 0x1de0, 0x1e0b, 0x8001, 0x7002, 0xd19c, 0x1170,
-	0x8aff, 0x0540, 0x2009, 0x0001, 0x080c, 0x1cb6, 0x0904, 0x1e0d,
-	0x2009, 0x0001, 0x080c, 0x1cb6, 0x0804, 0x1e0d, 0x7803, 0x0004,
-	0xd194, 0x0148, 0x6850, 0xc0fc, 0x6852, 0x8aff, 0x1148, 0x684c,
-	0xc0f5, 0x684e, 0x0028, 0x080c, 0x1e4e, 0x6850, 0xc0fd, 0x6852,
-	0x2a00, 0x6826, 0x2c00, 0x681a, 0x2800, 0x6832, 0x7003, 0x0000,
-	0x0804, 0x1e0d, 0x711c, 0x81ff, 0x0190, 0x7918, 0x7922, 0x7827,
-	0x0000, 0x7803, 0x0001, 0x7000, 0x8000, 0x7002, 0x700c, 0xa100,
-	0x700e, 0x7010, 0xa081, 0x0000, 0x7012, 0x0804, 0x1e0d, 0x00f6,
-	0x0026, 0x781c, 0x0006, 0x7818, 0x0006, 0x2079, 0x0100, 0x7a14,
-	0xa284, 0x0184, 0xa085, 0x0012, 0x7816, 0x7820, 0xd0bc, 0x1de8,
-	0x79c8, 0x000e, 0xa102, 0x001e, 0x0006, 0x0016, 0x79c4, 0x000e,
-	0xa102, 0x78c6, 0x000e, 0x78ca, 0xa284, 0x0184, 0xa085, 0x0012,
-	0x7816, 0x002e, 0x00fe, 0x7803, 0x0008, 0x7003, 0x0000, 0x0468,
-	0x8001, 0x7002, 0xd194, 0x0168, 0x7804, 0xd0fc, 0x1904, 0x1d68,
-	0xd19c, 0x11f8, 0x8aff, 0x0508, 0x2009, 0x0001, 0x080c, 0x1cb6,
-	0x00e0, 0x0026, 0x0036, 0x6b28, 0x6a2c, 0x080c, 0x1e4e, 0x00d6,
-	0x2805, 0xac68, 0x6034, 0xd09c, 0x1128, 0x6808, 0xa31a, 0x680c,
-	0xa213, 0x0020, 0x6810, 0xa31a, 0x6814, 0xa213, 0x00de, 0x0804,
-	0x1d93, 0x0804, 0x1d93, 0x080c, 0x1410, 0x00ce, 0x00de, 0x00ee,
-	0x00fe, 0x001e, 0x000e, 0x012e, 0x0005, 0x00f6, 0x00e6, 0x2071,
-	0x8dff, 0x7000, 0xa086, 0x0000, 0x01c0, 0x2079, 0x0020, 0x20e1,
-	0x9040, 0x7804, 0xd0fc, 0x0dd8, 0x080c, 0x1d58, 0x7000, 0xa086,
-	0x0000, 0x1da8, 0x7803, 0x0004, 0x7804, 0xd0ac, 0x1de8, 0x20e1,
-	0x9040, 0x7803, 0x0002, 0x7003, 0x0000, 0x00ee, 0x00fe, 0x0005,
-	0x8840, 0x2805, 0xa005, 0x1170, 0x6004, 0xa005, 0x0168, 0x681a,
-	0x2060, 0x6034, 0xa084, 0x000f, 0xa080, 0x1e76, 0x2045, 0x88ff,
-	0x090c, 0x1410, 0x8a51, 0x0005, 0x2050, 0x0005, 0x8a50, 0x8841,
-	0x2805, 0xa005, 0x1190, 0x2c00, 0xad06, 0x0120, 0x6000, 0xa005,
-	0x1108, 0x2d00, 0x2060, 0x681a, 0x6034, 0xa084, 0x000f, 0xa080,
-	0x1e86, 0x2045, 0x88ff, 0x090c, 0x1410, 0x0005, 0x0000, 0x0011,
-	0x0015, 0x0019, 0x001d, 0x0021, 0x0025, 0x0029, 0x0000, 0x000f,
-	0x0015, 0x001b, 0x0021, 0x0027, 0x0000, 0x0000, 0x0000, 0x1e6b,
-	0x1e67, 0x0000, 0x0000, 0x1e75, 0x0000, 0x1e6b, 0x0000, 0x1e72,
-	0x1e6f, 0x0000, 0x0000, 0x0000, 0x1e75, 0x1e72, 0x0000, 0x1e6d,
-	0x1e6d, 0x0000, 0x0000, 0x1e75, 0x0000, 0x1e6d, 0x0000, 0x1e73,
-	0x1e73, 0x0000, 0x0000, 0x0000, 0x1e75, 0x1e73, 0x00a6, 0x0096,
-	0x0086, 0x6858, 0xa055, 0x0904, 0x1f25, 0x2d60, 0x6034, 0xa0cc,
-	0x000f, 0xa9c0, 0x1e76, 0xa986, 0x0007, 0x0130, 0xa986, 0x000e,
-	0x0118, 0xa986, 0x000f, 0x1120, 0x605c, 0xa422, 0x6060, 0xa31a,
-	0x2805, 0xa045, 0x1140, 0x0310, 0x0804, 0x1f25, 0x6004, 0xa065,
-	0x0904, 0x1f25, 0x0c18, 0x2805, 0xa005, 0x01a8, 0xac68, 0xd99c,
-	0x1128, 0x6808, 0xa422, 0x680c, 0xa31b, 0x0020, 0x6810, 0xa422,
-	0x6814, 0xa31b, 0x0620, 0x2300, 0xa405, 0x0150, 0x8a51, 0x0904,
-	0x1f25, 0x8840, 0x0c40, 0x6004, 0xa065, 0x0904, 0x1f25, 0x0830,
-	0x8a51, 0x0904, 0x1f25, 0x8840, 0x2805, 0xa005, 0x1158, 0x6004,
-	0xa065, 0x0904, 0x1f25, 0x6034, 0xa0cc, 0x000f, 0xa9c0, 0x1e76,
-	0x2805, 0x2040, 0x2b68, 0x6850, 0xc0fc, 0x6852, 0x0458, 0x8422,
-	0x8420, 0x831a, 0xa399, 0x0000, 0x00d6, 0x2b68, 0x6c6e, 0x6b72,
-	0x00de, 0xd99c, 0x1168, 0x6908, 0x2400, 0xa122, 0x690c, 0x2300,
-	0xa11b, 0x0a0c, 0x1410, 0x6800, 0xa420, 0x6804, 0xa319, 0x0060,
-	0x6910, 0x2400, 0xa122, 0x6914, 0x2300, 0xa11b, 0x0a0c, 0x1410,
-	0x6800, 0xa420, 0x6804, 0xa319, 0x2b68, 0x6c1e, 0x6b22, 0x6850,
-	0xc0fd, 0x6852, 0x2c00, 0x681a, 0x2800, 0x6832, 0x2a00, 0x6826,
-	0x000e, 0x000e, 0x000e, 0xa006, 0x0028, 0x008e, 0x009e, 0x00ae,
-	0xa085, 0x0001, 0x0005, 0x2001, 0x0005, 0x2004, 0xa084, 0x0007,
-	0x0002, 0x1f39, 0x1f3a, 0x1f3d, 0x1f40, 0x1f45, 0x1f48, 0x1f4d,
-	0x1f52, 0x0005, 0x080c, 0x1d58, 0x0005, 0x080c, 0x18ee, 0x0005,
-	0x080c, 0x18ee, 0x080c, 0x1d58, 0x0005, 0x080c, 0x15a7, 0x0005,
-	0x080c, 0x1d58, 0x080c, 0x15a7, 0x0005, 0x080c, 0x18ee, 0x080c,
-	0x15a7, 0x0005, 0x080c, 0x18ee, 0x080c, 0x1d58, 0x080c, 0x15a7,
-	0x0005, 0x0126, 0x2091, 0x2600, 0x2079, 0x0200, 0x2071, 0x9080,
-	0x2069, 0x8b00, 0x2009, 0x0004, 0x7912, 0x7817, 0x0004, 0x080c,
-	0x22c4, 0x781b, 0x0002, 0x783b, 0x001f, 0x20e1, 0x8700, 0x012e,
-	0x0005, 0x0126, 0x2091, 0x2600, 0x781c, 0xd0a4, 0x190c, 0x1ffa,
-	0xa084, 0x0007, 0x0002, 0x1f95, 0x1f83, 0x1f86, 0x1f89, 0x1f8e,
-	0x1f90, 0x1f92, 0x1f94, 0x080c, 0x521b, 0x0078, 0x080c, 0x5242,
-	0x0060, 0x080c, 0x521b, 0x080c, 0x5242, 0x0038, 0x0041, 0x0028,
-	0x0031, 0x0018, 0x0021, 0x0008, 0x0011, 0x012e, 0x0005, 0x0006,
-	0x0016, 0x0026, 0x7930, 0xa184, 0x0003, 0x0118, 0x20e1, 0x9040,
-	0x00b8, 0xa184, 0x0030, 0x0150, 0x6a00, 0xa286, 0x0003, 0x1108,
-	0x0010, 0x080c, 0x403d, 0x20e1, 0x9010, 0x0050, 0xa184, 0x00c0,
-	0x0110, 0x080c, 0x1410, 0xa184, 0x0300, 0x0110, 0x20e1, 0x9020,
-	0x7932, 0x002e, 0x001e, 0x000e, 0x0005, 0x0016, 0x00e6, 0x00f6,
-	0x2071, 0x8b00, 0x7128, 0x2001, 0x8d8f, 0x2102, 0x2001, 0x8d97,
-	0x2102, 0xa182, 0x0211, 0x1218, 0x2009, 0x0008, 0x0400, 0xa182,
-	0x0259, 0x1218, 0x2009, 0x0007, 0x00d0, 0xa182, 0x02c1, 0x1218,
-	0x2009, 0x0006, 0x00a0, 0xa182, 0x0349, 0x1218, 0x2009, 0x0005,
-	0x0070, 0xa182, 0x0421, 0x1218, 0x2009, 0x0004, 0x0040, 0xa182,
-	0x0581, 0x1218, 0x2009, 0x0003, 0x0010, 0x2009, 0x0002, 0x2079,
-	0x0200, 0x7912, 0x7817, 0x0004, 0x080c, 0x22c4, 0x00fe, 0x00ee,
-	0x001e, 0x0005, 0x7938, 0x080c, 0x1410, 0x0126, 0x2091, 0x2400,
-	0x2061, 0x0100, 0x2071, 0x8b00, 0x6024, 0x6026, 0x6053, 0x0030,
-	0x080c, 0x2303, 0x6050, 0xa084, 0xfe7f, 0x6052, 0x2009, 0x00ef,
-	0x6132, 0x6136, 0x080c, 0x2313, 0x60e7, 0x0000, 0x61ea, 0x60e3,
-	0x0008, 0x604b, 0xf7f7, 0x6043, 0x0000, 0x602f, 0x0080, 0x602f,
-	0x0000, 0x6007, 0x0e9f, 0x600f, 0x00ff, 0x602b, 0x002f, 0x012e,
-	0x0005, 0x2001, 0x8b30, 0x2003, 0x0000, 0x2001, 0x8b2f, 0x2003,
-	0x0001, 0x0005, 0x0126, 0x2091, 0x2400, 0x0006, 0x0016, 0x0026,
-	0x6124, 0xa184, 0x1e2c, 0x1118, 0xa184, 0x0007, 0x002a, 0xa195,
-	0x0004, 0xa284, 0x0007, 0x0002, 0x2066, 0x204c, 0x204f, 0x2052,
-	0x2057, 0x2059, 0x205d, 0x2061, 0x080c, 0x578e, 0x00b8, 0x080c,
-	0x5869, 0x00a0, 0x080c, 0x5869, 0x080c, 0x578e, 0x0078, 0x0099,
-	0x0068, 0x080c, 0x578e, 0x0079, 0x0048, 0x080c, 0x5869, 0x0059,
-	0x0028, 0x080c, 0x5869, 0x080c, 0x578e, 0x0029, 0x002e, 0x001e,
-	0x000e, 0x012e, 0x0005, 0xd19c, 0x1904, 0x226d, 0x080c, 0x4c42,
-	0x0560, 0x7000, 0xa086, 0x0003, 0x0198, 0x6024, 0xa084, 0x1800,
-	0x0178, 0x080c, 0x4c68, 0x0118, 0x080c, 0x4c54, 0x1148, 0x6027,
-	0x0020, 0x6043, 0x0000, 0x2001, 0x8d9c, 0x2003, 0xaaaa, 0x0458,
-	0x080c, 0x4c68, 0x1904, 0x20cf, 0x6024, 0xa084, 0x1800, 0x1108,
-	0x04f0, 0x2001, 0x8d9c, 0x2003, 0xaaaa, 0x2001, 0x8d9d, 0x2003,
-	0x0001, 0x080c, 0x4b8b, 0x0804, 0x226d, 0xd1ac, 0x1580, 0x6024,
-	0xd0dc, 0x1188, 0xd0e4, 0x11a0, 0xd0d4, 0x11d8, 0xd0cc, 0x0148,
-	0x7088, 0xa086, 0x0027, 0x1128, 0x6028, 0xc0cc, 0x602a, 0x080c,
-	0x4b52, 0x0804, 0x226d, 0x2001, 0x8d9d, 0x2003, 0x0000, 0x0068,
-	0xa085, 0x0001, 0x080c, 0x4c82, 0x2001, 0x8d9d, 0x2003, 0x0002,
-	0x0020, 0x080c, 0x4d10, 0x0804, 0x226d, 0x0016, 0x2001, 0x8b00,
-	0x2003, 0x0001, 0x080c, 0x4b8b, 0x001e, 0x0804, 0x226d, 0xd1ac,
-	0x0904, 0x21b5, 0x080c, 0x4c42, 0x1550, 0x6027, 0x0020, 0x0006,
-	0x0026, 0x0036, 0x2001, 0x8d9d, 0x080c, 0x4c5e, 0x11d8, 0x2011,
-	0x8b25, 0x2204, 0xa005, 0x1140, 0x8000, 0x2012, 0x2011, 0x8036,
-	0x2019, 0x0001, 0x080c, 0x3617, 0x2001, 0x8d9d, 0x2003, 0x0001,
-	0x2001, 0x8b00, 0x2003, 0x0001, 0x080c, 0x4b8b, 0x003e, 0x002e,
-	0x000e, 0x0005, 0x003e, 0x002e, 0x000e, 0x080c, 0x4b06, 0x0016,
-	0x0046, 0x00c6, 0x644c, 0xa486, 0xf0f0, 0x1138, 0x2061, 0x0100,
-	0x644a, 0x6043, 0x0090, 0x6043, 0x0010, 0x74c6, 0xa48c, 0xff00,
-	0x7034, 0xd084, 0x0178, 0xa186, 0xf800, 0x1160, 0x7038, 0xd084,
-	0x1148, 0xc085, 0x703a, 0x0036, 0x2418, 0x2011, 0x8016, 0x080c,
-	0x3617, 0x003e, 0xa196, 0xff00, 0x01e8, 0x7050, 0xa084, 0x00ff,
-	0x810f, 0xa116, 0x01b8, 0x7130, 0xd18c, 0x11a0, 0x2011, 0x8b52,
-	0x2214, 0xd2ec, 0x0118, 0xc18d, 0x7132, 0x0060, 0x6240, 0xa294,
-	0x0010, 0x0904, 0x218b, 0x6248, 0xa294, 0xff00, 0xa296, 0xff00,
-	0x1904, 0x218b, 0x7034, 0xd08c, 0x1140, 0x2001, 0x8b0c, 0x200c,
-	0xd1ac, 0x1904, 0x218b, 0xc1ad, 0x2102, 0x0036, 0x73c4, 0x2011,
-	0x8013, 0x080c, 0x3617, 0x003e, 0x7130, 0xc185, 0x7132, 0x2011,
-	0x8b52, 0x220c, 0xd1a4, 0x01d0, 0x0016, 0x2009, 0x0001, 0x2011,
-	0x0100, 0x080c, 0x5734, 0x2019, 0x000e, 0x080c, 0x891c, 0xa484,
-	0x00ff, 0xa080, 0x263d, 0x200d, 0xa18c, 0xff00, 0x810f, 0x8127,
-	0xa006, 0x2009, 0x000e, 0x080c, 0x8982, 0x001e, 0xd1ac, 0x1128,
-	0x2019, 0x0004, 0x080c, 0x2542, 0x0070, 0x0156, 0x20a9, 0x007f,
-	0x2009, 0x0000, 0x080c, 0x430a, 0x1110, 0x080c, 0x4118, 0x8108,
-	0x1f04, 0x2182, 0x015e, 0x00ce, 0x004e, 0x2011, 0x0003, 0x080c,
-	0x695c, 0x2011, 0x0002, 0x080c, 0x6966, 0x080c, 0x6862, 0x080c,
-	0x567a, 0x0036, 0x2019, 0x0000, 0x080c, 0x68e5, 0x003e, 0x60e3,
-	0x0000, 0x001e, 0x2001, 0x8b00, 0x2014, 0xa296, 0x0004, 0x1128,
-	0xd19c, 0x1118, 0x6228, 0xc29d, 0x622a, 0x2003, 0x0001, 0x2001,
-	0x8b22, 0x2003, 0x0000, 0x6027, 0x0020, 0xd194, 0x0904, 0x226d,
-	0x0016, 0x6220, 0xd2b4, 0x0904, 0x221e, 0x080c, 0x567a, 0x080c,
-	0x66f7, 0x6027, 0x0004, 0x00f6, 0x2019, 0x8db3, 0x2304, 0xa07d,
-	0x0570, 0x7804, 0xa086, 0x0032, 0x1550, 0x00d6, 0x00c6, 0x00e6,
-	0x2069, 0x0140, 0x618c, 0x6288, 0x7818, 0x608e, 0x7808, 0x608a,
-	0x6043, 0x0002, 0x2001, 0x0003, 0x8001, 0x1df0, 0x6043, 0x0000,
-	0x6803, 0x1000, 0x6803, 0x0000, 0x618e, 0x628a, 0x080c, 0x5c37,
-	0x080c, 0x5d10, 0x7810, 0x2070, 0x7037, 0x0103, 0x2f60, 0x080c,
-	0x6d18, 0x00ee, 0x00ce, 0x00de, 0x00fe, 0x001e, 0x0005, 0x00fe,
-	0x00d6, 0x2069, 0x0140, 0x6804, 0xa084, 0x4000, 0x0120, 0x6803,
-	0x1000, 0x6803, 0x0000, 0x00de, 0x00c6, 0x2061, 0x8daa, 0x6028,
-	0xa09a, 0x0002, 0x1238, 0x8000, 0x602a, 0x00ce, 0x080c, 0x66ea,
-	0x0804, 0x226c, 0x2019, 0x8db3, 0x2304, 0xa065, 0x0120, 0x2009,
-	0x0027, 0x080c, 0x6d3f, 0x00ce, 0x0804, 0x226c, 0xd2bc, 0x0904,
-	0x226c, 0x080c, 0x5687, 0x6014, 0xa084, 0x0184, 0xa085, 0x0010,
-	0x6016, 0x6027, 0x0004, 0x00d6, 0x2069, 0x0140, 0x6804, 0xa084,
-	0x4000, 0x0120, 0x6803, 0x1000, 0x6803, 0x0000, 0x00de, 0x00c6,
-	0x2061, 0x8daa, 0x6044, 0xa09a, 0x0002, 0x12f0, 0x8000, 0x6046,
-	0x603c, 0x00ce, 0xa005, 0x0540, 0x2009, 0x07d0, 0x080c, 0x567f,
-	0xa080, 0x0007, 0x2004, 0xa086, 0x0006, 0x1138, 0x6114, 0xa18c,
-	0x0184, 0xa18d, 0x0012, 0x6116, 0x00b8, 0x6114, 0xa18c, 0x0184,
-	0xa18d, 0x0016, 0x6116, 0x0080, 0x0036, 0x2019, 0x0001, 0x080c,
-	0x68e5, 0x003e, 0x2019, 0x8db9, 0x2304, 0xa065, 0x0120, 0x2009,
-	0x004f, 0x080c, 0x6d3f, 0x00ce, 0x001e, 0xd19c, 0x0528, 0x0016,
-	0x6028, 0xc09c, 0x602a, 0x2011, 0x0003, 0x080c, 0x695c, 0x2011,
-	0x0002, 0x080c, 0x6966, 0x080c, 0x6862, 0x080c, 0x567a, 0x0036,
-	0x2019, 0x0000, 0x080c, 0x68e5, 0x003e, 0x60e3, 0x0000, 0x080c,
-	0x8a36, 0x080c, 0x8a51, 0x2001, 0x8b00, 0x2003, 0x0004, 0x6027,
-	0x0008, 0x080c, 0x1251, 0x001e, 0xa18c, 0xffd0, 0x6126, 0x0005,
-	0x0006, 0x0016, 0x0026, 0x00e6, 0x00f6, 0x0126, 0x2091, 0x8000,
-	0x2071, 0x8b00, 0x71bc, 0x70be, 0xa116, 0x01b8, 0x81ff, 0x0128,
-	0x2011, 0x8011, 0x080c, 0x3617, 0x0080, 0x2011, 0x8012, 0x080c,
-	0x3617, 0x0036, 0x00c6, 0x080c, 0x235e, 0x2061, 0x0100, 0x2019,
-	0x0028, 0x080c, 0x2542, 0x00ce, 0x003e, 0x012e, 0x00fe, 0x00ee,
-	0x002e, 0x001e, 0x000e, 0x0005, 0x00c6, 0x00f6, 0x0006, 0x0026,
-	0x2061, 0x0100, 0xa190, 0x22d7, 0x2205, 0x60f2, 0x2011, 0x22e4,
-	0x2205, 0x60ee, 0x002e, 0x000e, 0x00fe, 0x00ce, 0x0005, 0x0840,
-	0x0840, 0x0840, 0x0580, 0x0420, 0x0348, 0x02c0, 0x0258, 0x0210,
-	0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x0140, 0x00f8, 0x00d0, 0x00b0,
-	0x00a0, 0x2028, 0xa18c, 0x00ff, 0x2130, 0xa094, 0xff00, 0x1110,
-	0x81ff, 0x0118, 0x080c, 0x53f4, 0x0038, 0xa080, 0x263d, 0x200d,
-	0xa18c, 0xff00, 0x810f, 0xa006, 0x0005, 0xa080, 0x263d, 0x200d,
-	0xa18c, 0x00ff, 0x0005, 0x00d6, 0x2069, 0x0140, 0x2001, 0x8b14,
-	0x2003, 0x00ef, 0x20a9, 0x0010, 0xa006, 0x6852, 0x6856, 0x1f04,
-	0x230e, 0x00de, 0x0005, 0x0006, 0x00d6, 0x0026, 0x2069, 0x0140,
-	0x2001, 0x8b14, 0x2102, 0x8114, 0x8214, 0x8214, 0x8214, 0x20a9,
-	0x0010, 0x6853, 0x0000, 0xa006, 0x82ff, 0x1128, 0xa184, 0x000f,
-	0xa080, 0x8a57, 0x2005, 0x6856, 0x8211, 0x1f04, 0x2323, 0x002e,
-	0x00de, 0x000e, 0x0005, 0x00c6, 0x2061, 0x8b00, 0x6030, 0x0110,
-	0xc09d, 0x0008, 0xc09c, 0x6032, 0x00ce, 0x0005, 0x0156, 0x00d6,
-	0x0026, 0x0016, 0x0006, 0x2069, 0x0140, 0x6980, 0xa116, 0x0180,
-	0xa112, 0x1230, 0x8212, 0x8210, 0x22a8, 0x2001, 0x0402, 0x0018,
-	0x22a8, 0x2001, 0x0404, 0x680e, 0x1f04, 0x2353, 0x680f, 0x0000,
-	0x000e, 0x001e, 0x002e, 0x00de, 0x015e, 0x0005, 0x2001, 0x8b52,
-	0x2004, 0xd0c4, 0x0150, 0xd0a4, 0x0140, 0xa006, 0x0046, 0x2020,
-	0x2009, 0x002e, 0x080c, 0x8982, 0x004e, 0x0005, 0x238e, 0x2392,
-	0x2396, 0x239c, 0x23a2, 0x23a8, 0x23ae, 0x23b6, 0x23bd, 0x23c2,
-	0x23c7, 0x23ce, 0x23d5, 0x23dc, 0x23e3, 0x23ec, 0x23f5, 0x23f5,
-	0x23f5, 0x23f5, 0x23f5, 0x23f5, 0x23f5, 0x23f5, 0x23f5, 0x23f5,
-	0x23f5, 0x23f5, 0x23f5, 0x23f5, 0x23f5, 0x23f5, 0x0106, 0x0006,
-	0x0804, 0x23f7, 0x0106, 0x0006, 0x0804, 0x23f7, 0x0106, 0x0006,
-	0x080c, 0x2032, 0x0804, 0x23f7, 0x0106, 0x0006, 0x080c, 0x2032,
-	0x0804, 0x23f7, 0x0106, 0x0006, 0x080c, 0x1f2b, 0x0804, 0x23f7,
-	0x0106, 0x0006, 0x080c, 0x1f2b, 0x0804, 0x23f7, 0x0106, 0x0006,
-	0x080c, 0x2032, 0x080c, 0x1f2b, 0x0804, 0x23f7, 0x0106, 0x0006,
-	0x080c, 0x2032, 0x080c, 0x1f2b, 0x04d0, 0x0106, 0x0006, 0x080c,
-	0x1f71, 0x04a8, 0x0106, 0x0006, 0x080c, 0x1f71, 0x0480, 0x0106,
-	0x0006, 0x080c, 0x2032, 0x080c, 0x1f71, 0x0448, 0x0106, 0x0006,
-	0x080c, 0x2032, 0x080c, 0x1f71, 0x0410, 0x0106, 0x0006, 0x080c,
-	0x1f2b, 0x080c, 0x1f71, 0x00d8, 0x0106, 0x0006, 0x080c, 0x1f2b,
-	0x080c, 0x1f71, 0x00a0, 0x0106, 0x0006, 0x080c, 0x2032, 0x080c,
-	0x1f2b, 0x080c, 0x1f71, 0x0058, 0x0106, 0x0006, 0x080c, 0x2032,
-	0x080c, 0x1f2b, 0x080c, 0x1f71, 0x0010, 0xe000, 0x0cf0, 0x000e,
-	0x010e, 0x000d, 0x00c6, 0x0026, 0x2041, 0x007e, 0x70c8, 0xd09c,
-	0x0110, 0x2041, 0x007f, 0xd094, 0x2001, 0x8b14, 0x203c, 0x1904,
-	0x2454, 0x7284, 0xd284, 0x0904, 0x2454, 0xd28c, 0x1904, 0x2454,
-	0x0036, 0x7398, 0xa38e, 0xffff, 0x1110, 0x2019, 0x0001, 0x8314,
-	0xa2e0, 0x91c0, 0x2c04, 0xa38c, 0x0001, 0x0120, 0xa084, 0xff00,
-	0x8007, 0x0010, 0xa084, 0x00ff, 0xa70e, 0x0528, 0xa08e, 0x00ff,
-	0x1160, 0x2011, 0x8b52, 0x2214, 0xd2ec, 0x1508, 0x7284, 0xc28d,
-	0x7286, 0x709b, 0xffff, 0x003e, 0x00f8, 0x2009, 0x0000, 0x080c,
-	0x22e9, 0x080c, 0x42d6, 0x1188, 0x6004, 0xa084, 0x00ff, 0xa086,
-	0x0006, 0x1120, 0x080c, 0x24a8, 0x0140, 0x0028, 0x080c, 0x25a4,
-	0x080c, 0x24ce, 0x0110, 0x8318, 0x0850, 0x739a, 0x0010, 0x709b,
-	0xffff, 0x003e, 0x0804, 0x24a5, 0xa780, 0x263d, 0x203d, 0xa7bc,
-	0xff00, 0x873f, 0x7098, 0xa096, 0xffff, 0x0128, 0xa812, 0x12c8,
-	0x709b, 0xffff, 0x04f8, 0x2009, 0x0000, 0x70c8, 0xd09c, 0x0120,
-	0xd094, 0x0110, 0x2009, 0x007e, 0x2001, 0x8d9c, 0x2004, 0xa005,
-	0x0120, 0x2009, 0x007e, 0x2041, 0x007f, 0x2100, 0xa802, 0x20a8,
-	0x0020, 0x2008, 0x2810, 0xa202, 0x20a8, 0x2700, 0x0156, 0x0016,
-	0xa106, 0x01c0, 0x080c, 0x42d6, 0x11e8, 0x6004, 0xa084, 0x00ff,
-	0xa086, 0x0006, 0x1120, 0x080c, 0x2610, 0x0160, 0x0020, 0x7284,
-	0xd28c, 0x0120, 0x0038, 0x00a1, 0x0168, 0x0020, 0x080c, 0x25a4,
-	0x04a9, 0x0140, 0x001e, 0x8108, 0x015e, 0x1f04, 0x247d, 0x709b,
-	0xffff, 0x0018, 0x001e, 0x015e, 0x719a, 0x002e, 0x00ce, 0x0005,
-	0x0016, 0x0076, 0x00d6, 0x00c6, 0x2c68, 0x080c, 0x6cc2, 0x01c8,
-	0x2d00, 0x601a, 0x601f, 0x0001, 0x2001, 0x0000, 0x080c, 0x42a7,
-	0x2001, 0x0000, 0x080c, 0x42b9, 0x0126, 0x2091, 0x8000, 0x7094,
-	0x8000, 0x7096, 0x012e, 0x2009, 0x0004, 0x080c, 0x6d3f, 0xa085,
-	0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, 0x0005, 0x0016, 0x0076,
-	0x00d6, 0x00c6, 0x2c68, 0x080c, 0x6cc2, 0x01c8, 0x2d00, 0x601a,
-	0x601f, 0x0001, 0x2001, 0x0000, 0x080c, 0x42a7, 0x2001, 0x0002,
-	0x080c, 0x42b9, 0x0126, 0x2091, 0x8000, 0x7094, 0x8000, 0x7096,
-	0x012e, 0x2009, 0x0002, 0x080c, 0x6d3f, 0xa085, 0x0001, 0x00ce,
-	0x00de, 0x007e, 0x001e, 0x0005, 0x00c6, 0x0026, 0x2009, 0x0080,
-	0x080c, 0x42d6, 0x1120, 0x0031, 0x0110, 0x70cf, 0xffff, 0x002e,
-	0x00ce, 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, 0x2c68, 0x080c,
-	0x6cc2, 0x01c8, 0x2d00, 0x601a, 0x601f, 0x0001, 0x2001, 0x0000,
-	0x080c, 0x42a7, 0x2001, 0x0002, 0x080c, 0x42b9, 0x0126, 0x2091,
-	0x8000, 0x70d0, 0x8000, 0x70d2, 0x012e, 0x2009, 0x0002, 0x080c,
-	0x6d3f, 0xa085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, 0x0005,
-	0x00c6, 0x00d6, 0x2009, 0x007f, 0x080c, 0x42d6, 0x1180, 0x2c68,
-	0x080c, 0x6cc2, 0x0160, 0x2d00, 0x601a, 0x6312, 0x601f, 0x0001,
-	0x620a, 0x2009, 0x0022, 0x080c, 0x6d3f, 0xa085, 0x0001, 0x00de,
-	0x00ce, 0x0005, 0x00e6, 0x00c6, 0x0066, 0x0036, 0x0026, 0x080c,
-	0x59e1, 0x080c, 0x598b, 0x080c, 0x72cc, 0x20a9, 0x007f, 0x2009,
-	0x0000, 0x0016, 0x080c, 0x430a, 0x1120, 0x080c, 0x44e6, 0x080c,
-	0x4118, 0x001e, 0x8108, 0x1f04, 0x2551, 0x002e, 0x003e, 0x006e,
-	0x00ce, 0x00ee, 0x0005, 0x00e6, 0x00c6, 0x0036, 0x0026, 0x0016,
-	0x6218, 0x2270, 0x72a0, 0x0026, 0x2019, 0x0029, 0x080c, 0x59d5,
-	0x0086, 0x2041, 0x0000, 0x080c, 0x5911, 0x2c08, 0x080c, 0x878f,
-	0x008e, 0x001e, 0x2e60, 0x080c, 0x44e6, 0x6210, 0x6314, 0x080c,
-	0x4118, 0x6212, 0x6316, 0x001e, 0x002e, 0x003e, 0x00ce, 0x00ee,
-	0x0005, 0x00e6, 0x0006, 0x6018, 0xa080, 0x0028, 0x2004, 0xa086,
-	0x0080, 0x0150, 0x2071, 0x8b00, 0x7094, 0xa005, 0x0110, 0x8001,
-	0x7096, 0x000e, 0x00ee, 0x0005, 0x2071, 0x8b00, 0x70d0, 0xa005,
-	0x0dc0, 0x8001, 0x70d2, 0x0ca8, 0x6000, 0xc08c, 0x6002, 0x0005,
-	0x00f6, 0x00e6, 0x00c6, 0x0036, 0x0026, 0x0016, 0x0156, 0x2178,
-	0x81ff, 0x1118, 0x20a9, 0x0001, 0x0098, 0x2001, 0x8b52, 0x2004,
-	0xd0c4, 0x0150, 0xd0a4, 0x0140, 0xa006, 0x0046, 0x2020, 0x2009,
-	0x002d, 0x080c, 0x8982, 0x004e, 0x20a9, 0x00ff, 0x2011, 0x0000,
-	0x0026, 0xa288, 0x8c34, 0x210c, 0x81ff, 0x0508, 0x8fff, 0x0559,
-	0x2019, 0x0029, 0x080c, 0x59d5, 0x0086, 0x2041, 0x0000, 0x080c,
-	0x5911, 0x00c6, 0x0026, 0x2160, 0x6204, 0xa294, 0x00ff, 0x2001,
-	0x0004, 0x8007, 0xa215, 0x6206, 0x002e, 0x00ce, 0x0016, 0x2c08,
-	0x080c, 0x878f, 0x001e, 0x008e, 0x2160, 0x080c, 0x44e6, 0x002e,
-	0x8210, 0x1f04, 0x25c8, 0x015e, 0x001e, 0x002e, 0x003e, 0x00ce,
-	0x00ee, 0x00fe, 0x0005, 0x0046, 0x0026, 0x0016, 0x2001, 0x8b52,
-	0x2004, 0xd0c4, 0x0148, 0xd0a4, 0x0138, 0xa006, 0x2220, 0x8427,
-	0x2009, 0x0029, 0x080c, 0x8982, 0x001e, 0x002e, 0x004e, 0x0005,
-	0x0016, 0x0026, 0x0036, 0x00c6, 0x7284, 0x82ff, 0x01f8, 0xa290,
-	0x8b52, 0x2214, 0xd2ac, 0x11d0, 0x2100, 0x080c, 0x22fd, 0x81ff,
-	0x01b8, 0x2019, 0x0001, 0x8314, 0xa2e0, 0x91c0, 0x2c04, 0xd384,
-	0x0120, 0xa084, 0xff00, 0x8007, 0x0010, 0xa084, 0x00ff, 0xa116,
-	0x0138, 0xa096, 0x00ff, 0x0110, 0x8318, 0x0c68, 0xa085, 0x0001,
-	0x00ce, 0x003e, 0x002e, 0x001e, 0x0005, 0x7eef, 0x7de8, 0x7ce4,
-	0x80e2, 0x7be1, 0x80e0, 0x80dc, 0x80da, 0x7ad9, 0x80d6, 0x80d5,
-	0x80d4, 0x80d3, 0x80d2, 0x80d1, 0x79ce, 0x78cd, 0x80cc, 0x80cb,
-	0x80ca, 0x80c9, 0x80c7, 0x80c6, 0x77c5, 0x76c3, 0x80bc, 0x80ba,
-	0x75b9, 0x80b6, 0x74b5, 0x73b4, 0x72b3, 0x80b2, 0x80b1, 0x80ae,
-	0x71ad, 0x80ac, 0x70ab, 0x6faa, 0x6ea9, 0x80a7, 0x6da6, 0x6ca5,
-	0x6ba3, 0x6a9f, 0x699e, 0x689d, 0x809b, 0x8098, 0x6797, 0x6690,
-	0x658f, 0x6488, 0x6384, 0x6282, 0x8081, 0x8080, 0x617c, 0x607a,
-	0x8079, 0x5f76, 0x8075, 0x8074, 0x8073, 0x8072, 0x8071, 0x806e,
-	0x5e6d, 0x806c, 0x5d6b, 0x5c6a, 0x5b69, 0x8067, 0x5a66, 0x5965,
-	0x5863, 0x575c, 0x565a, 0x5559, 0x8056, 0x8055, 0x5454, 0x5353,
-	0x5252, 0x5151, 0x504e, 0x4f4d, 0x804c, 0x804b, 0x4e4a, 0x4d49,
-	0x8047, 0x4c46, 0x8045, 0x8043, 0x803c, 0x803a, 0x8039, 0x8036,
-	0x4b35, 0x8034, 0x4a33, 0x4932, 0x4831, 0x802e, 0x472d, 0x462c,
-	0x452b, 0x442a, 0x4329, 0x4227, 0x8026, 0x8025, 0x4123, 0x401f,
-	0x3f1e, 0x3e1d, 0x3d1b, 0x3c18, 0x8017, 0x8010, 0x3b0f, 0x3a08,
-	0x8004, 0x3902, 0x8001, 0x8000, 0x8000, 0x3800, 0x3700, 0x3600,
-	0x8000, 0x3500, 0x8000, 0x8000, 0x8000, 0x3400, 0x8000, 0x8000,
-	0x8000, 0x8000, 0x8000, 0x8000, 0x3300, 0x3200, 0x8000, 0x8000,
-	0x8000, 0x8000, 0x8000, 0x8000, 0x3100, 0x3000, 0x8000, 0x8000,
-	0x2f00, 0x8000, 0x2e00, 0x2d00, 0x2c00, 0x8000, 0x8000, 0x8000,
-	0x2b00, 0x8000, 0x2a00, 0x2900, 0x2800, 0x8000, 0x2700, 0x2600,
-	0x2500, 0x2400, 0x2300, 0x2200, 0x8000, 0x8000, 0x2100, 0x2000,
-	0x1f00, 0x1e00, 0x1d00, 0x1c00, 0x8000, 0x8000, 0x1b00, 0x1a00,
-	0x8000, 0x1900, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
-	0x1800, 0x8000, 0x1700, 0x1600, 0x1500, 0x8000, 0x1400, 0x1300,
-	0x1200, 0x1100, 0x1000, 0x0f00, 0x8000, 0x8000, 0x0e00, 0x0d00,
-	0x0c00, 0x0b00, 0x0a00, 0x0900, 0x8000, 0x8000, 0x0800, 0x0700,
-	0x8000, 0x0600, 0x8000, 0x8000, 0x8000, 0x0500, 0x0400, 0x0300,
-	0x8000, 0x0200, 0x8000, 0x8000, 0x8000, 0x0100, 0x8000, 0x8000,
-	0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x8000, 0x8000, 0x8000,
-	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
-	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x2071, 0x8b81, 0x7003,
-	0x0002, 0xa006, 0x7012, 0x7016, 0x703a, 0x703e, 0x7033, 0x8b91,
-	0x7037, 0x8b91, 0x7007, 0x0001, 0x2061, 0x8bd1, 0x6003, 0x0002,
-	0x0005, 0x1004, 0x2763, 0x0e04, 0x2763, 0x2071, 0x8b81, 0x2b78,
-	0x7818, 0xd084, 0x1140, 0x2a60, 0x7820, 0xa08e, 0x0069, 0x1904,
-	0x2848, 0x0804, 0x27e1, 0x0005, 0x2071, 0x8b81, 0x7004, 0x0002,
-	0x276c, 0x276d, 0x2776, 0x2787, 0x0005, 0x1004, 0x2775, 0x0e04,
-	0x2775, 0x2b78, 0x7818, 0xd084, 0x01e8, 0x0005, 0x2b78, 0x2061,
-	0x8bd1, 0x6008, 0xa08e, 0x0100, 0x0128, 0xa086, 0x0200, 0x0904,
-	0x2842, 0x0005, 0x7014, 0x2068, 0x2a60, 0x7018, 0x0807, 0x7010,
-	0x2068, 0x6834, 0xa086, 0x0103, 0x0108, 0x0005, 0x2a60, 0x2b78,
-	0x7018, 0x0807, 0x2a60, 0x7820, 0xa08a, 0x0040, 0x1210, 0x61bc,
-	0x0042, 0x2100, 0xa08a, 0x003f, 0x1a04, 0x283f, 0x61bc, 0x0804,
-	0x27e1, 0x2823, 0x284e, 0x2856, 0x285a, 0x2862, 0x2868, 0x286c,
-	0x2875, 0x2878, 0x2882, 0x2885, 0x283f, 0x283f, 0x283f, 0x2888,
-	0x283f, 0x2897, 0x28ae, 0x28c5, 0x293c, 0x2941, 0x296a, 0x29bb,
-	0x29cc, 0x29ea, 0x2a21, 0x2a2b, 0x2a38, 0x2a4b, 0x2a6b, 0x2a74,
-	0x2aaa, 0x2ab0, 0x283f, 0x2ad3, 0x283f, 0x283f, 0x283f, 0x283f,
-	0x283f, 0x2ad7, 0x2ae1, 0x283f, 0x283f, 0x283f, 0x283f, 0x283f,
-	0x283f, 0x283f, 0x283f, 0x2ae9, 0x283f, 0x283f, 0x283f, 0x283f,
-	0x283f, 0x2af6, 0x2afe, 0x283f, 0x283f, 0x283f, 0x283f, 0x283f,
-	0x283f, 0x0002, 0x2b10, 0x2b63, 0x2bbd, 0x2bcd, 0x283f, 0x2be7,
-	0x2ff7, 0x393f, 0x283f, 0x283f, 0x283f, 0x283f, 0x283f, 0x283f,
-	0x283f, 0x283f, 0x2882, 0x2885, 0x283f, 0x283f, 0x2ff9, 0x283f,
-	0x283f, 0x283f, 0x283f, 0x283f, 0x283f, 0x283f, 0x283f, 0x283f,
-	0x283f, 0x283f, 0x2ffd, 0x314a, 0x315e, 0x3178, 0x31d9, 0x322a,
-	0x3235, 0x326c, 0x327b, 0x328a, 0x3299, 0x32c1, 0x330b, 0x336d,
-	0x337a, 0x3474, 0x356e, 0x3597, 0x3695, 0x36b1, 0x36bd, 0x36f6,
-	0x378d, 0x283f, 0x283f, 0x283f, 0x283f, 0x37f5, 0x3810, 0x3880,
-	0x3930, 0x713c, 0x0000, 0x2021, 0x4000, 0x080c, 0x35f4, 0x0126,
-	0x2091, 0x8000, 0x0e04, 0x282f, 0x7818, 0xd084, 0x0110, 0x012e,
-	0x0cb0, 0x7c22, 0x7926, 0x7a2a, 0x7b2e, 0x781b, 0x0001, 0x2091,
-	0x4080, 0x7007, 0x0001, 0x2091, 0x5000, 0x012e, 0x0005, 0x2021,
-	0x4001, 0x0c18, 0x2021, 0x4002, 0x0c00, 0x2021, 0x4003, 0x08e8,
-	0x2021, 0x4005, 0x08d0, 0x2021, 0x4006, 0x08b8, 0xa02e, 0x2520,
-	0x7b28, 0x7a2c, 0x7824, 0x7930, 0x0804, 0x3601, 0x7823, 0x0004,
-	0x7824, 0x0807, 0xa02e, 0x2520, 0x7b28, 0x7a2c, 0x7824, 0x7930,
-	0x0804, 0x3604, 0x7924, 0x7828, 0x2114, 0x200a, 0x0804, 0x2823,
-	0x7924, 0x2114, 0x0804, 0x2823, 0x2099, 0x0009, 0x20a1, 0x0009,
-	0x20a9, 0x0007, 0x53a3, 0x0804, 0x2823, 0x7824, 0x2060, 0x0090,
-	0x2009, 0x0002, 0x2011, 0x0000, 0x2019, 0x0028, 0x783b, 0x0007,
-	0x0804, 0x2823, 0x7d38, 0x7c3c, 0x0858, 0x7d38, 0x7c3c, 0x08a0,
-	0x2061, 0x1000, 0xe10c, 0xa006, 0x2c15, 0xa200, 0x8c60, 0x8109,
-	0x1dd8, 0x2010, 0xa005, 0x0904, 0x2823, 0x0804, 0x2845, 0x2069,
-	0x8b51, 0x7824, 0x7930, 0xa11a, 0x1a04, 0x284b, 0x8019, 0x0904,
-	0x284b, 0x684a, 0x6942, 0x782c, 0x6852, 0x7828, 0x6856, 0xa006,
-	0x685a, 0x685e, 0x080c, 0x4d79, 0x0804, 0x2823, 0x2069, 0x8b51,
-	0x7824, 0x7934, 0xa11a, 0x1a04, 0x284b, 0x8019, 0x0904, 0x284b,
-	0x684e, 0x6946, 0x782c, 0x6862, 0x7828, 0x6866, 0xa006, 0x686a,
-	0x686e, 0x080c, 0x4670, 0x0804, 0x2823, 0xa02e, 0x2520, 0x81ff,
-	0x1904, 0x2848, 0x7924, 0x7b28, 0x7a2c, 0x20a9, 0x0005, 0x20a1,
-	0x8b88, 0x41a1, 0x080c, 0x35c0, 0x0904, 0x2848, 0x2009, 0x0023,
-	0x080c, 0x3601, 0x701b, 0x28dd, 0x0005, 0x6834, 0x2008, 0xa084,
-	0x00ff, 0xa096, 0x0011, 0x0120, 0xa096, 0x0019, 0x1904, 0x2848,
-	0x810f, 0xa18c, 0x00ff, 0x0904, 0x2848, 0x710e, 0x700c, 0x8001,
-	0x0528, 0x700e, 0x080c, 0x35c0, 0x0904, 0x2848, 0x2009, 0x0023,
-	0x2061, 0x8bd1, 0x6224, 0x6328, 0x642c, 0x6530, 0xa290, 0x0046,
-	0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x080c, 0x3601,
-	0x701b, 0x290b, 0x0005, 0x6834, 0xa084, 0x00ff, 0xa096, 0x0002,
-	0x0120, 0xa096, 0x000a, 0x1904, 0x2848, 0x08c0, 0x7010, 0x2068,
-	0x6838, 0xc0fd, 0x683a, 0x080c, 0x420d, 0x1128, 0x7007, 0x0003,
-	0x701b, 0x2925, 0x0005, 0x080c, 0x4773, 0x0126, 0x2091, 0x8000,
-	0x20a9, 0x0005, 0x2099, 0x8b88, 0x530a, 0x2100, 0xa210, 0xa399,
-	0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0xad80, 0x000d, 0x2009,
-	0x0023, 0x012e, 0x0804, 0x3604, 0x61a4, 0x7824, 0x60a6, 0x0804,
-	0x2823, 0x2091, 0x8000, 0x7823, 0x4000, 0x7827, 0x4953, 0x782b,
-	0x5020, 0x782f, 0x2020, 0x2009, 0x017f, 0x2104, 0x7832, 0x3f00,
-	0x7836, 0x2061, 0x0100, 0x6200, 0x2061, 0x0200, 0x603c, 0x8007,
-	0xa205, 0x783a, 0x2009, 0x04fd, 0x2104, 0x783e, 0x781b, 0x0001,
-	0x2091, 0x5000, 0x2091, 0x4080, 0x2071, 0x0010, 0x20c1, 0x00f0,
-	0x0804, 0x0427, 0x81ff, 0x1904, 0x2848, 0x7924, 0x810f, 0xa18c,
-	0x00ff, 0x080c, 0x430a, 0x1904, 0x284b, 0x7e38, 0xa684, 0x3fff,
-	0xa082, 0x4000, 0x0210, 0x0804, 0x284b, 0x7c28, 0x7d2c, 0x080c,
-	0x44ad, 0xd28c, 0x1118, 0x080c, 0x4458, 0x0010, 0x080c, 0x4486,
-	0x1518, 0x2061, 0x9200, 0x0126, 0x2091, 0x8000, 0x6000, 0xa086,
-	0x0000, 0x0148, 0x6010, 0xa06d, 0x0130, 0x683c, 0xa406, 0x1118,
-	0x6840, 0xa506, 0x0150, 0x012e, 0xace0, 0x000c, 0x2001, 0x8b16,
-	0x2004, 0xac02, 0x1a04, 0x2848, 0x0c30, 0x080c, 0x795f, 0x012e,
-	0x0904, 0x2848, 0x0804, 0x2823, 0xa00e, 0x2001, 0x0005, 0x080c,
-	0x4773, 0x0126, 0x2091, 0x8000, 0x080c, 0x7dce, 0x080c, 0x46a1,
-	0x012e, 0x0804, 0x2823, 0x81ff, 0x1904, 0x2848, 0x080c, 0x35d5,
-	0x0904, 0x284b, 0x080c, 0x43ad, 0x0904, 0x2848, 0x080c, 0x44b9,
-	0x0904, 0x2848, 0x0804, 0x2823, 0x81ff, 0x1904, 0x2848, 0x080c,
-	0x35e5, 0x0904, 0x284b, 0x080c, 0x451d, 0x0904, 0x2848, 0x2019,
-	0x0005, 0x080c, 0x44d4, 0x0904, 0x2848, 0x7828, 0xa08a, 0x1000,
-	0x1a04, 0x284b, 0x8003, 0x800b, 0x810b, 0xa108, 0x080c, 0x5619,
-	0x0804, 0x2823, 0x0126, 0x2091, 0x8000, 0x81ff, 0x0118, 0x2009,
-	0x0001, 0x0448, 0x2029, 0x00ff, 0x644c, 0x2400, 0xa506, 0x01f0,
-	0x2508, 0x080c, 0x430a, 0x11d0, 0x080c, 0x451d, 0x1128, 0x2009,
-	0x0002, 0x62ac, 0x2518, 0x00b8, 0x2019, 0x0004, 0x080c, 0x44d4,
-	0x1118, 0x2009, 0x0006, 0x0078, 0x7824, 0xa08a, 0x1000, 0x1270,
-	0x8003, 0x800b, 0x810b, 0xa108, 0x080c, 0x5619, 0x8529, 0x1ae8,
-	0x012e, 0x0804, 0x2823, 0x012e, 0x0804, 0x2848, 0x012e, 0x0804,
-	0x284b, 0x080c, 0x35d5, 0x0904, 0x284b, 0x080c, 0x4413, 0x080c,
-	0x44ad, 0x0804, 0x2823, 0x81ff, 0x1904, 0x2848, 0x080c, 0x35d5,
-	0x0904, 0x284b, 0x080c, 0x4404, 0x080c, 0x44ad, 0x0804, 0x2823,
-	0x81ff, 0x1904, 0x2848, 0x080c, 0x35d5, 0x0904, 0x284b, 0x080c,
-	0x4488, 0x0904, 0x2848, 0x080c, 0x4249, 0x080c, 0x4451, 0x080c,
-	0x44ad, 0x0804, 0x2823, 0x080c, 0x35d5, 0x0904, 0x284b, 0x080c,
-	0x43ad, 0x0904, 0x2848, 0x62a0, 0x2019, 0x0005, 0x00c6, 0x080c,
-	0x44e6, 0x2061, 0x0000, 0x080c, 0x59d5, 0x0086, 0x2041, 0x0000,
-	0x080c, 0x5911, 0x2c08, 0x080c, 0x878f, 0x008e, 0x00ce, 0x080c,
-	0x44ad, 0x0804, 0x2823, 0x080c, 0x35d5, 0x0904, 0x284b, 0x080c,
-	0x44ad, 0x2208, 0x0804, 0x2823, 0x0156, 0x00d6, 0x00e6, 0x2069,
-	0x8c13, 0x6810, 0x6914, 0xa10a, 0x1210, 0x2009, 0x0000, 0x6816,
-	0x2011, 0x0000, 0x2019, 0x0000, 0x20a9, 0x007e, 0x2069, 0x8c34,
-	0x2d04, 0xa075, 0x0130, 0x704c, 0x0071, 0xa210, 0x7080, 0x0059,
-	0xa318, 0x8d68, 0x1f04, 0x2a88, 0x2300, 0xa218, 0x00ee, 0x00de,
-	0x015e, 0x0804, 0x2823, 0x00f6, 0x0016, 0xa07d, 0x0140, 0x2001,
-	0x0000, 0x8000, 0x2f0c, 0x81ff, 0x0110, 0x2178, 0x0cd0, 0x001e,
-	0x00fe, 0x0005, 0x2069, 0x8c13, 0x6910, 0x62a8, 0x0804, 0x2823,
-	0x81ff, 0x1904, 0x2848, 0x614c, 0xa190, 0x263d, 0x2215, 0xa294,
-	0x00ff, 0x636c, 0x83ff, 0x0108, 0x6270, 0x67c8, 0xd79c, 0x0118,
-	0x2031, 0x0001, 0x0060, 0xd7ac, 0x0118, 0x2031, 0x0003, 0x0038,
-	0xd7a4, 0x0118, 0x2031, 0x0002, 0x0010, 0x2031, 0x0000, 0x7e3a,
-	0x7f3e, 0x0804, 0x2823, 0x613c, 0x6240, 0x0804, 0x2823, 0x0126,
-	0x2091, 0x8000, 0x6134, 0xa006, 0x2010, 0x2018, 0x012e, 0x0804,
-	0x2823, 0x080c, 0x35e5, 0x0904, 0x284b, 0x6244, 0x6338, 0x0804,
-	0x2823, 0x613c, 0x6240, 0x7824, 0x603e, 0x7b28, 0x6342, 0x2069,
-	0x8b51, 0x831f, 0xa305, 0x6816, 0x0804, 0x2823, 0x0126, 0x2091,
-	0x8000, 0x7824, 0x6036, 0x012e, 0x0804, 0x2823, 0x080c, 0x35e5,
-	0x0904, 0x284b, 0x7828, 0xa00d, 0x0904, 0x284b, 0x782c, 0xa005,
-	0x0904, 0x284b, 0x6244, 0x6146, 0x6338, 0x603a, 0x0804, 0x2823,
-	0x2001, 0x8b00, 0x2004, 0xa086, 0x0003, 0x1904, 0x2848, 0x00c6,
-	0x2061, 0x0100, 0x7924, 0x810f, 0xa18c, 0x00ff, 0xa196, 0x00ff,
-	0x1130, 0x2001, 0x8b14, 0x2004, 0xa085, 0xff00, 0x0078, 0xa182,
-	0x007f, 0x1698, 0xa188, 0x263d, 0x210d, 0xa18c, 0x00ff, 0x2001,
-	0x8b14, 0x2004, 0xa116, 0x0548, 0x810f, 0xa105, 0x0126, 0x2091,
-	0x8000, 0x0006, 0x080c, 0x6cc2, 0x000e, 0x01e0, 0x601a, 0x600b,
-	0xbc09, 0x601f, 0x0001, 0x080c, 0x35c0, 0x01d0, 0x6837, 0x0000,
-	0x7007, 0x0003, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x701b,
-	0x2bb6, 0x2d00, 0x6012, 0x2009, 0x0032, 0x080c, 0x6d3f, 0x012e,
-	0x00ce, 0x0005, 0x00ce, 0x0804, 0x2848, 0x00ce, 0x0804, 0x284b,
-	0x080c, 0x6d18, 0x0cb8, 0x2001, 0x8b00, 0x2004, 0xa086, 0x0003,
-	0x1904, 0x2848, 0x00c6, 0x2061, 0x0100, 0x7924, 0x810f, 0xa18c,
-	0x00ff, 0xa196, 0x00ff, 0x1130, 0x2001, 0x8b14, 0x2004, 0xa085,
-	0xff00, 0x0078, 0xa182, 0x007f, 0x1698, 0xa188, 0x263d, 0x210d,
-	0xa18c, 0x00ff, 0x2001, 0x8b14, 0x2004, 0xa116, 0x0548, 0x810f,
-	0xa105, 0x0126, 0x2091, 0x8000, 0x0006, 0x080c, 0x6cc2, 0x000e,
-	0x01e0, 0x601a, 0x600b, 0xbc05, 0x601f, 0x0001, 0x080c, 0x35c0,
-	0x01d0, 0x6837, 0x0000, 0x7007, 0x0003, 0x6833, 0x0000, 0x6838,
-	0xc0fd, 0x683a, 0x701b, 0x2bb6, 0x2d00, 0x6012, 0x2009, 0x0032,
-	0x080c, 0x6d3f, 0x012e, 0x00ce, 0x0005, 0x00ce, 0x0804, 0x2848,
-	0x00ce, 0x0804, 0x284b, 0x080c, 0x6d18, 0x0cb8, 0x6830, 0xa086,
-	0x0100, 0x0904, 0x2848, 0x0804, 0x2823, 0x2061, 0x8e2a, 0x0126,
-	0x2091, 0x8000, 0x6000, 0xd084, 0x0128, 0x6104, 0x6208, 0x012e,
-	0x0804, 0x2823, 0x012e, 0x0804, 0x284b, 0x81ff, 0x1904, 0x2848,
-	0x080c, 0x4c42, 0x0904, 0x2848, 0x0126, 0x2091, 0x8000, 0x6244,
-	0x6064, 0xa202, 0x0248, 0xa085, 0x0001, 0x080c, 0x2333, 0x080c,
-	0x3b32, 0x012e, 0x0804, 0x2823, 0x012e, 0x0804, 0x284b, 0x0126,
-	0x2091, 0x8000, 0x7824, 0xa084, 0x0007, 0x0002, 0x2bf9, 0x2c02,
-	0x2c09, 0x2bf6, 0x2bf6, 0x2bf6, 0x2bf6, 0x2bf6, 0x012e, 0x0804,
-	0x284b, 0x2009, 0x0114, 0x2104, 0xa085, 0x0800, 0x200a, 0x080c,
-	0x2d63, 0x0070, 0x2009, 0x010b, 0x200b, 0x0010, 0x080c, 0x2d63,
-	0x0038, 0x81ff, 0x0128, 0x012e, 0x2021, 0x400b, 0x0804, 0x2825,
-	0x0086, 0x0096, 0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6,
-	0x2009, 0x0101, 0x210c, 0x0016, 0x2001, 0x0138, 0x200c, 0x2003,
-	0x0001, 0x0016, 0x2001, 0x007a, 0x2034, 0x2001, 0x007b, 0x202c,
-	0xa006, 0x2048, 0x2050, 0x2058, 0x080c, 0x2f8a, 0x080c, 0x2ef4,
-	0xa03e, 0x2720, 0x00f6, 0x00e6, 0x00c6, 0x2d60, 0x2071, 0x8dff,
-	0x2079, 0x0020, 0x2011, 0x0001, 0x080c, 0x2ea0, 0x080c, 0x2ea0,
-	0x00ce, 0x00ee, 0x00fe, 0x080c, 0x2dfa, 0x080c, 0x2ec8, 0x080c,
-	0x2e45, 0x080c, 0x2db9, 0x080c, 0x2dea, 0x00f6, 0x2079, 0x0100,
-	0x7824, 0xd094, 0x0530, 0x7814, 0xa084, 0x0184, 0xa085, 0x0010,
-	0x7816, 0x2079, 0x0140, 0x080c, 0x2d41, 0x1110, 0x00fe, 0x0430,
-	0x7804, 0xd0dc, 0x0dc0, 0x2079, 0x0100, 0x7827, 0x0086, 0x7814,
-	0xa084, 0x0184, 0xa085, 0x0032, 0x7816, 0x080c, 0x2d41, 0x1110,
-	0x00fe, 0x00a0, 0x7824, 0xd0bc, 0x0dc0, 0x7827, 0x0080, 0xa026,
-	0x7c16, 0x7824, 0xd0ac, 0x0130, 0x8b58, 0x080c, 0x2d4b, 0x00fe,
-	0x0804, 0x2d0b, 0x00fe, 0x080c, 0x2d41, 0x1150, 0x8948, 0x2001,
-	0x007a, 0x2602, 0x2001, 0x007b, 0x2502, 0x080c, 0x2d4b, 0x0088,
-	0x87ff, 0x0140, 0x2001, 0x0201, 0x2004, 0xa005, 0x1904, 0x2c45,
-	0x8739, 0x0038, 0x2001, 0x8dde, 0x2004, 0xa086, 0x0000, 0x1904,
-	0x2c45, 0x2001, 0x0033, 0x2003, 0x00f6, 0x8631, 0x1208, 0x8529,
-	0x2500, 0xa605, 0x0904, 0x2d0b, 0x7824, 0xd0bc, 0x0128, 0x2900,
-	0xaa05, 0xab05, 0x1904, 0x2d0b, 0x6033, 0x000d, 0x2001, 0x0030,
-	0x2003, 0x0004, 0x7824, 0xd0ac, 0x1148, 0x2001, 0x8dde, 0x2003,
-	0x0003, 0x2001, 0x0030, 0x2003, 0x0009, 0x0040, 0x6027, 0x0001,
-	0x2001, 0x0075, 0x2004, 0xa005, 0x0108, 0x6026, 0x2c00, 0x601a,
-	0x20e1, 0x9040, 0x2d00, 0x681a, 0x6833, 0x000d, 0x7824, 0xd0a4,
-	0x1180, 0x6827, 0x0000, 0x00c6, 0x20a9, 0x0008, 0x2061, 0x0020,
-	0x6003, 0x0008, 0x2001, 0x0203, 0x2004, 0x1f04, 0x2ce0, 0x00ce,
-	0x0040, 0x6827, 0x0001, 0x2001, 0x0074, 0x2004, 0xa005, 0x0108,
-	0x6826, 0x00f6, 0x00c6, 0x2079, 0x0100, 0x2061, 0x0020, 0x7827,
-	0x0002, 0x2001, 0x0072, 0x2004, 0xa084, 0xfff8, 0x601a, 0x0006,
-	0x2001, 0x0073, 0x2004, 0x601e, 0x78c6, 0x000e, 0x78ca, 0x00ce,
-	0x00fe, 0x0804, 0x2c32, 0x2061, 0x0100, 0x6027, 0x0002, 0x001e,
-	0x61e2, 0x001e, 0x6106, 0x7824, 0xa084, 0x0003, 0xa086, 0x0002,
-	0x0188, 0x20e1, 0x9028, 0x6050, 0xa084, 0xf7ef, 0x6052, 0x602f,
-	0x0000, 0x602c, 0xc0ac, 0x602e, 0x604b, 0xf7f7, 0x6043, 0x0090,
-	0x6043, 0x0010, 0x2908, 0x2a10, 0x2b18, 0x2b00, 0xaa05, 0xa905,
-	0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e, 0x008e,
-	0x1118, 0x012e, 0x0804, 0x2823, 0x012e, 0x2021, 0x400c, 0x0804,
-	0x2825, 0xa085, 0x0001, 0x1d04, 0x2d4a, 0x2091, 0x6000, 0x8420,
-	0xa486, 0x0064, 0x0005, 0x2001, 0x0105, 0x2003, 0x0010, 0x2001,
-	0x0030, 0x2003, 0x0004, 0x2001, 0x0020, 0x2003, 0x0004, 0x2001,
-	0x8dde, 0x2003, 0x0000, 0x2001, 0x8dff, 0x2003, 0x0000, 0x20e1,
-	0xf000, 0xa026, 0x0005, 0x00f6, 0x2079, 0x0100, 0x7850, 0xa084,
-	0x0990, 0x7852, 0x782c, 0xa085, 0x0020, 0x782e, 0x20a9, 0x0008,
-	0x1d04, 0x2d70, 0x2091, 0x6000, 0x1f04, 0x2d70, 0x7850, 0xa085,
-	0x0400, 0x7852, 0x2001, 0x0009, 0x2004, 0xa084, 0x0003, 0xa086,
-	0x0001, 0x1118, 0x782c, 0xc0ac, 0x782e, 0x784b, 0xf7f7, 0x7843,
-	0x0090, 0x7843, 0x0010, 0x20a9, 0x000e, 0xe000, 0x1f04, 0x2d8d,
-	0x7850, 0xa085, 0x1400, 0x7852, 0x2019, 0x61a8, 0x7854, 0xe000,
-	0xe000, 0xd08c, 0x1110, 0x8319, 0x1dc8, 0x7827, 0x0048, 0x7850,
-	0xa085, 0x0400, 0x7852, 0x7843, 0x0040, 0x2019, 0x01f4, 0xe000,
-	0xe000, 0x8319, 0x1de0, 0x2001, 0x0140, 0x2003, 0x0100, 0x7827,
-	0x0020, 0x7843, 0x0000, 0x2003, 0x0000, 0x7827, 0x0048, 0x00fe,
-	0x0005, 0x7824, 0xd0ac, 0x11c8, 0x00f6, 0x00e6, 0x2071, 0x8dde,
-	0x2079, 0x0030, 0x2001, 0x0201, 0x2004, 0xa005, 0x0160, 0x7000,
-	0xa086, 0x0000, 0x1140, 0x0051, 0xd0bc, 0x0108, 0x8738, 0x7003,
-	0x0003, 0x7803, 0x0019, 0x00ee, 0x00fe, 0x0005, 0x780c, 0xa08c,
-	0x0070, 0x0178, 0x2009, 0x007a, 0x260a, 0x2009, 0x007b, 0x250a,
-	0xd0b4, 0x0108, 0x8a50, 0xd0ac, 0x0108, 0x8948, 0xd0a4, 0x0108,
-	0x8b58, 0x0005, 0x00f6, 0x2079, 0x0200, 0x781c, 0xd084, 0x0140,
-	0x20e1, 0x0007, 0x20e1, 0x2000, 0x2001, 0x020a, 0x2004, 0x0ca8,
-	0x00fe, 0x0005, 0x00e6, 0x2071, 0x0100, 0x2009, 0x8b14, 0x210c,
-	0x716e, 0x7063, 0x0100, 0x7166, 0x719e, 0x706b, 0x0000, 0x7073,
-	0x0809, 0x7077, 0x0008, 0x7078, 0xa080, 0x0100, 0x707a, 0x7080,
-	0x8000, 0x7082, 0x7087, 0xaaaa, 0xa006, 0x708a, 0x708e, 0x707e,
-	0x70d6, 0x70ab, 0x0036, 0x70af, 0x95d5, 0x7027, 0x0080, 0x7014,
-	0xa084, 0x0184, 0xa085, 0x0032, 0x7016, 0x080c, 0x2ec8, 0x080c,
-	0x2d41, 0x1110, 0x8421, 0x0028, 0x7024, 0xd0bc, 0x0db0, 0x7027,
-	0x0080, 0x00f6, 0x00e6, 0x2071, 0x8dde, 0x2079, 0x0030, 0x2011,
-	0x0011, 0x080c, 0x2ea0, 0x2011, 0x0001, 0x080c, 0x2ea0, 0x00ee,
-	0x00fe, 0x7017, 0x0000, 0x00ee, 0x0005, 0x00f6, 0x00e6, 0x2071,
-	0x8dde, 0x2079, 0x0030, 0x7904, 0xd1fc, 0x0904, 0x2e9d, 0x7803,
-	0x0002, 0xa026, 0xd19c, 0x1904, 0x2e99, 0x7000, 0x0002, 0x2e9d,
-	0x2e5b, 0x2e7f, 0x2e99, 0xd1bc, 0x1150, 0xd1dc, 0x1150, 0x8001,
-	0x7002, 0x2011, 0x0001, 0x04e1, 0x05c0, 0x04d1, 0x04b0, 0x780f,
-	0x0000, 0x7820, 0x7924, 0x7803, 0x0004, 0x7822, 0x7926, 0x2001,
-	0x0201, 0x200c, 0x81ff, 0x0de8, 0x080c, 0x2dd6, 0x2009, 0x0001,
-	0x7808, 0xd0ec, 0x0110, 0x2009, 0x0011, 0x7902, 0x00f0, 0x8001,
-	0x7002, 0xa184, 0x0880, 0x1138, 0x7804, 0xd0fc, 0x1940, 0x2011,
-	0x0001, 0x00b1, 0x0090, 0x6030, 0xa092, 0x0004, 0xa086, 0x0009,
-	0x1120, 0x6000, 0x601a, 0x2011, 0x0025, 0x6232, 0xd1dc, 0x1988,
-	0x0870, 0x7803, 0x0004, 0x7003, 0x0000, 0x00ee, 0x00fe, 0x0005,
-	0x6024, 0xa005, 0x0520, 0x8001, 0x6026, 0x6018, 0x6130, 0xa140,
-	0x2804, 0x7832, 0x8840, 0x2804, 0x7836, 0x8840, 0x2804, 0x7822,
-	0x8840, 0x2804, 0x7826, 0x8840, 0x7a02, 0x7000, 0x8000, 0x7002,
-	0x6018, 0xa802, 0xa08a, 0x0029, 0x1138, 0x6018, 0xa080, 0x0001,
-	0x2004, 0x601a, 0x2001, 0x000d, 0x6032, 0xa085, 0x0001, 0x0005,
-	0x00f6, 0x00e6, 0x00c6, 0x2071, 0x8dff, 0x2079, 0x0020, 0x7904,
-	0xd1fc, 0x01f0, 0x7803, 0x0002, 0x2d60, 0xa026, 0x7000, 0x0002,
-	0x2ef0, 0x2edb, 0x2ee7, 0x8001, 0x7002, 0xd19c, 0x1188, 0x2011,
-	0x0001, 0x080c, 0x2ea0, 0x0160, 0x080c, 0x2ea0, 0x0048, 0x8001,
-	0x7002, 0x7804, 0xd0fc, 0x1d30, 0x2011, 0x0001, 0x080c, 0x2ea0,
-	0x00ce, 0x00ee, 0x00fe, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x2061,
-	0x0200, 0x601b, 0x0004, 0x2061, 0x0100, 0x60cf, 0x0400, 0x6004,
-	0xc0ac, 0xa085, 0x0200, 0x6006, 0x2001, 0x0074, 0x2004, 0xa005,
-	0x01f8, 0x2038, 0x2001, 0x0076, 0x2024, 0x2001, 0x0077, 0x201c,
-	0x080c, 0x2fe4, 0x6833, 0x000d, 0x6f26, 0x2d00, 0x681a, 0xa78a,
-	0x0007, 0x0220, 0x2138, 0x2009, 0x0007, 0x0010, 0x2708, 0xa03e,
-	0x6818, 0xa080, 0x000d, 0x04a1, 0x1d90, 0x2d00, 0x681a, 0x0088,
-	0x080c, 0x2fe4, 0x6833, 0x000d, 0x2070, 0x6827, 0x0001, 0x2d00,
-	0x681a, 0x2001, 0x0076, 0x2004, 0x2072, 0x2001, 0x0077, 0x2004,
-	0x7006, 0x2061, 0x0020, 0x2079, 0x0100, 0x6013, 0x0400, 0x20e1,
-	0x9040, 0x2001, 0x0072, 0x2004, 0xa084, 0xfff8, 0x700a, 0x601a,
-	0x0006, 0x2001, 0x0073, 0x2004, 0x700e, 0x601e, 0x78c6, 0x000e,
-	0x78ca, 0xa006, 0x603a, 0x603e, 0x00ce, 0x00ee, 0x00fe, 0x0005,
-	0x00e6, 0x2071, 0x0010, 0x20a0, 0x2099, 0x0014, 0x7003, 0x0026,
-	0x7432, 0x7336, 0xa006, 0x703a, 0x703e, 0x810b, 0x810b, 0x21a8,
-	0x810b, 0x7122, 0x7003, 0x0041, 0x7004, 0xd0fc, 0x0de8, 0x7003,
-	0x0002, 0x7003, 0x0040, 0x53a5, 0x7430, 0x7334, 0x87ff, 0x0180,
-	0x00c6, 0x00d6, 0x2d60, 0x00c6, 0x080c, 0x35c0, 0x00ce, 0x6018,
-	0x2070, 0x2d00, 0x7006, 0x601a, 0x00de, 0x00ce, 0xa085, 0x0001,
-	0x00ee, 0x0005, 0x00e6, 0x2001, 0x0075, 0x2004, 0xa005, 0x0508,
-	0x2038, 0x2001, 0x0078, 0x2024, 0x2001, 0x0079, 0x201c, 0x080c,
-	0x2fe4, 0x2d60, 0x6833, 0x000d, 0x6f26, 0x2d00, 0x681a, 0xa78a,
-	0x0007, 0x0220, 0x2138, 0x2009, 0x0007, 0x0010, 0x2708, 0xa03e,
-	0x6818, 0xa080, 0x000d, 0x080c, 0x2f58, 0x1d88, 0x2d00, 0x681a,
-	0x00d8, 0x0491, 0x2d60, 0x6033, 0x000d, 0x2070, 0x6027, 0x0001,
-	0x2c00, 0x601a, 0x2001, 0x0078, 0x2004, 0x2072, 0x2001, 0x0079,
-	0x2004, 0x7006, 0x2001, 0x0072, 0x2004, 0xa084, 0xfff8, 0x700a,
-	0x2001, 0x0073, 0x2004, 0x700e, 0x2001, 0x0030, 0x2003, 0x0004,
-	0x7824, 0xd0ac, 0x1178, 0x2001, 0x0101, 0x200c, 0xc1ed, 0x2102,
-	0x6027, 0x0000, 0x2001, 0x8dde, 0x2003, 0x0003, 0x2001, 0x0030,
-	0x2003, 0x0009, 0x00ee, 0x0005, 0x080c, 0x1488, 0x0178, 0xa006,
-	0x6802, 0x7010, 0xa005, 0x1120, 0x2d00, 0x7012, 0x7016, 0x0020,
-	0x7014, 0x6802, 0x2d00, 0x7016, 0xad80, 0x000d, 0x0005, 0x0804,
-	0x2823, 0x7d38, 0x7c3c, 0x0804, 0x28c7, 0x080c, 0x35c0, 0x0904,
-	0x2848, 0x080c, 0x4c42, 0x0110, 0x080c, 0x40fd, 0x2009, 0x001c,
-	0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x080c, 0x3601, 0x701b, 0x3011,
-	0x0005, 0xade8, 0x000d, 0x6800, 0xa005, 0x0904, 0x284b, 0x6804,
-	0xd0ac, 0x0118, 0xd0a4, 0x0904, 0x284b, 0xd094, 0x00c6, 0x2061,
-	0x0100, 0x6104, 0x0138, 0x6200, 0xa292, 0x0005, 0x0218, 0xa18c,
-	0xffdf, 0x0010, 0xa18d, 0x0020, 0x6106, 0x00ce, 0xd08c, 0x00c6,
-	0x2061, 0x0100, 0x6104, 0x0118, 0xa18d, 0x0010, 0x0010, 0xa18c,
-	0xffef, 0x6106, 0x00ce, 0x2009, 0x0100, 0x210c, 0xa18a, 0x0002,
-	0x0268, 0xd084, 0x0158, 0x6a28, 0xa28a, 0x007f, 0x1a04, 0x284b,
-	0xa288, 0x263d, 0x210d, 0xa18c, 0x00ff, 0x6156, 0xd0dc, 0x0130,
-	0x6828, 0xa08a, 0x007f, 0x1a04, 0x284b, 0x604e, 0x6808, 0xa08a,
-	0x0100, 0x0a04, 0x284b, 0xa08a, 0x0841, 0x1a04, 0x284b, 0xa084,
-	0x0007, 0x1904, 0x284b, 0x680c, 0xa005, 0x0904, 0x284b, 0x6810,
-	0xa005, 0x0904, 0x284b, 0x6848, 0x6940, 0xa10a, 0x1a04, 0x284b,
-	0x8001, 0x0904, 0x284b, 0x684c, 0x6944, 0xa10a, 0x1a04, 0x284b,
-	0x8001, 0x0904, 0x284b, 0x6804, 0xd0fc, 0x01f8, 0x080c, 0x35c0,
-	0x0904, 0x2848, 0x2009, 0x0014, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38,
-	0xa290, 0x0038, 0xa399, 0x0000, 0x080c, 0x3601, 0x701b, 0x3091,
-	0x0005, 0xade8, 0x000d, 0x20a9, 0x0014, 0x2d98, 0x2069, 0x8b6d,
-	0x2da0, 0x53a3, 0x7010, 0xa0e8, 0x000d, 0x20a9, 0x001c, 0x2d98,
-	0x2069, 0x8b51, 0x2da0, 0x53a3, 0x6814, 0xa08c, 0x00ff, 0x613e,
-	0x8007, 0xa084, 0x00ff, 0x6042, 0x080c, 0x4d79, 0x080c, 0x4618,
-	0x080c, 0x4670, 0x6000, 0xa086, 0x0000, 0x1904, 0x3148, 0x6808,
-	0x602a, 0x080c, 0x1fbd, 0x6818, 0x691c, 0x6a20, 0x6b24, 0x8007,
-	0x810f, 0x8217, 0x831f, 0x6016, 0x611a, 0x621e, 0x6322, 0x6c04,
-	0xd4f4, 0x0148, 0x6830, 0x6934, 0x6a38, 0x6b3c, 0x8007, 0x810f,
-	0x8217, 0x831f, 0x0010, 0xa084, 0xf0ff, 0x6006, 0x610a, 0x620e,
-	0x6312, 0x080c, 0x5695, 0x6904, 0xd1fc, 0x0520, 0x00c6, 0x2009,
-	0x0000, 0x20a9, 0x0001, 0x6b70, 0xd384, 0x01c8, 0x0020, 0x839d,
-	0x12b0, 0x3508, 0x8109, 0x080c, 0x520d, 0x6878, 0x6016, 0x6874,
-	0x2008, 0xa084, 0xff00, 0x8007, 0x600a, 0xa184, 0x00ff, 0x6006,
-	0x8108, 0x1118, 0x6003, 0x0003, 0x0010, 0x6003, 0x0001, 0x1f04,
-	0x30e7, 0x00ce, 0x2069, 0x8b51, 0x2001, 0x8d9c, 0x6a80, 0xa294,
-	0x0030, 0xa28e, 0x0000, 0x0178, 0xa28e, 0x0010, 0x0118, 0xa28e,
-	0x0020, 0x0148, 0x2003, 0xaaaa, 0x2001, 0x0204, 0x2004, 0x2009,
-	0x8d8d, 0x200a, 0x0008, 0x2102, 0x00c6, 0x2061, 0x0100, 0x602f,
-	0x0040, 0x602f, 0x0000, 0x00ce, 0x080c, 0x4c42, 0x0128, 0x080c,
-	0x37e7, 0x0110, 0x080c, 0x2333, 0x60c0, 0xa005, 0x01a8, 0x6003,
-	0x0001, 0x2091, 0x301d, 0x080c, 0x4c42, 0x1158, 0x2011, 0x4b5d,
-	0x080c, 0x560d, 0x2001, 0x8d9d, 0x2003, 0x0000, 0x080c, 0x4b8b,
-	0x0038, 0x080c, 0x403d, 0x0020, 0x6003, 0x0004, 0x2091, 0x301d,
-	0x0804, 0x2823, 0x6000, 0xa086, 0x0000, 0x0904, 0x2848, 0x2069,
-	0x8b51, 0x7830, 0x6842, 0x7834, 0x6846, 0x2d00, 0x2009, 0x001c,
-	0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0804, 0x3604, 0x81ff, 0x1904,
-	0x2848, 0x080c, 0x4c42, 0x1158, 0x2001, 0x8d9d, 0x2003, 0x0001,
-	0x2001, 0x8b00, 0x2003, 0x0001, 0x080c, 0x4b8b, 0x0038, 0xa006,
-	0x080c, 0x2333, 0x080c, 0x40fd, 0x080c, 0x403d, 0x0804, 0x2823,
-	0x81ff, 0x1904, 0x2848, 0x080c, 0x4c42, 0x1110, 0x0804, 0x2848,
-	0x6184, 0x81ff, 0x0198, 0x703f, 0x0000, 0x2001, 0x91c0, 0x2009,
-	0x0040, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0126, 0x2091, 0x8000,
-	0x080c, 0x3604, 0x701b, 0x2821, 0x012e, 0x0005, 0x703f, 0x0001,
-	0x00d6, 0x2069, 0x91c0, 0x20a9, 0x0040, 0x20a1, 0x91c0, 0x2019,
-	0xffff, 0x43a4, 0x654c, 0xa588, 0x263d, 0x210d, 0xa18c, 0x00ff,
-	0x216a, 0xa00e, 0x2011, 0x0002, 0x2100, 0xa506, 0x01a8, 0x080c,
-	0x430a, 0x1190, 0x6014, 0x821c, 0x0238, 0xa398, 0x91c0, 0xa085,
-	0xff00, 0x8007, 0x201a, 0x0038, 0xa398, 0x91c0, 0x2324, 0xa4a4,
-	0xff00, 0xa405, 0x201a, 0x8210, 0x8108, 0xa182, 0x0080, 0x1208,
-	0x0c18, 0x8201, 0x8007, 0x2d0c, 0xa105, 0x206a, 0x00de, 0x20a9,
-	0x0040, 0x20a1, 0x91c0, 0x2099, 0x91c0, 0x080c, 0x409e, 0x0804,
-	0x3185, 0x080c, 0x35e5, 0x0904, 0x284b, 0x00c6, 0x080c, 0x35c0,
-	0x00ce, 0x0904, 0x2848, 0x080c, 0x4c42, 0x0500, 0x2001, 0x8b52,
-	0x2004, 0xd0b4, 0x01d8, 0x6000, 0xd08c, 0x11c0, 0x6004, 0xa084,
-	0x00ff, 0xa086, 0x0006, 0x1190, 0x6837, 0x0000, 0x6838, 0xc0fd,
-	0x683a, 0x080c, 0x7d17, 0x0904, 0x2848, 0x7007, 0x0003, 0x701b,
-	0x3202, 0x0005, 0x080c, 0x35e5, 0x0904, 0x284b, 0x20a9, 0x002b,
-	0x2c98, 0xade8, 0x0002, 0x2da0, 0x53a3, 0x20a9, 0x0004, 0xac80,
-	0x0006, 0x2098, 0xad80, 0x0006, 0x20a0, 0x080c, 0x409e, 0x20a9,
-	0x0004, 0xac80, 0x000a, 0x2098, 0xad80, 0x000a, 0x20a0, 0x080c,
-	0x409e, 0x2d00, 0x2009, 0x002b, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38,
-	0x0804, 0x3604, 0x81ff, 0x1904, 0x2848, 0x080c, 0x35d5, 0x0904,
-	0x284b, 0x080c, 0x44c2, 0x0804, 0x2823, 0x81ff, 0x1904, 0x2848,
-	0x7828, 0xa08a, 0x1000, 0x1a04, 0x284b, 0x080c, 0x35e5, 0x0904,
-	0x284b, 0x080c, 0x451d, 0x0904, 0x2848, 0x2019, 0x0004, 0x080c,
-	0x44d4, 0x7924, 0x810f, 0x7a28, 0x0011, 0x0804, 0x2823, 0xa186,
-	0x00ff, 0x0110, 0x0071, 0x0060, 0x2029, 0x007e, 0x2061, 0x8b00,
-	0x644c, 0x2400, 0xa506, 0x0110, 0x2508, 0x0019, 0x8529, 0x1ec8,
-	0x0005, 0x080c, 0x430a, 0x1138, 0x2200, 0x8003, 0x800b, 0x810b,
-	0xa108, 0x080c, 0x5619, 0x0005, 0x81ff, 0x1904, 0x2848, 0x080c,
-	0x35d5, 0x0904, 0x284b, 0x080c, 0x43ad, 0x0904, 0x2848, 0x080c,
-	0x44cb, 0x0804, 0x2823, 0x81ff, 0x1904, 0x2848, 0x080c, 0x35d5,
-	0x0904, 0x284b, 0x080c, 0x43ad, 0x0904, 0x2848, 0x080c, 0x44b9,
-	0x0804, 0x2823, 0x6100, 0x2001, 0x8d9d, 0x2014, 0xa282, 0x0003,
-	0x1210, 0x0804, 0x2823, 0x2011, 0x0000, 0x0804, 0x2823, 0x0804,
-	0x2823, 0x080c, 0x35e5, 0x0904, 0x284b, 0x6004, 0xa086, 0x0707,
-	0x0904, 0x284b, 0x2001, 0x8b00, 0x2004, 0xa086, 0x0003, 0x1904,
-	0x2848, 0x00d6, 0xace8, 0x000a, 0x7924, 0xd184, 0x0110, 0xace8,
-	0x0006, 0x680c, 0x8007, 0x783e, 0x6808, 0x8007, 0x783a, 0x6b04,
-	0x831f, 0x6a00, 0x8217, 0x00de, 0x6100, 0xa18c, 0x0200, 0x0804,
-	0x2823, 0x7824, 0xa09c, 0x00ff, 0xa39a, 0x0003, 0x1a04, 0x2848,
-	0x624c, 0xa294, 0x00ff, 0xa084, 0xff00, 0x8007, 0xa206, 0x1150,
-	0x2001, 0x8b40, 0x2009, 0x000c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38,
-	0x0804, 0x3604, 0x81ff, 0x1904, 0x2848, 0x080c, 0x35e5, 0x0904,
-	0x284b, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x1904, 0x2848,
-	0x00c6, 0x080c, 0x35c0, 0x00ce, 0x0904, 0x2848, 0x6837, 0x0000,
-	0x6838, 0xc0fd, 0x683a, 0x080c, 0x7cc9, 0x0904, 0x2848, 0x7007,
-	0x0003, 0x701b, 0x32fc, 0x0005, 0x6830, 0xa086, 0x0100, 0x0904,
-	0x2848, 0xad80, 0x000e, 0x2009, 0x000c, 0x7a2c, 0x7b28, 0x7c3c,
-	0x7d38, 0x0804, 0x3604, 0x7824, 0xa084, 0x00ff, 0xa086, 0x00ff,
-	0x0118, 0x81ff, 0x1904, 0x2848, 0x080c, 0x4c42, 0x0128, 0xa006,
-	0x080c, 0x2333, 0x080c, 0x40fd, 0x7828, 0xa08a, 0x1000, 0x1a04,
-	0x284b, 0x7924, 0xa18c, 0xff00, 0x810f, 0xa186, 0x00ff, 0x0138,
-	0xa182, 0x007f, 0x1a04, 0x284b, 0x2100, 0x080c, 0x22fd, 0x0026,
-	0x00c6, 0x0126, 0x2091, 0x8000, 0x2061, 0x8dbd, 0x601b, 0x0000,
-	0x601f, 0x0000, 0x080c, 0x4c42, 0x1158, 0x2001, 0x8d9d, 0x2003,
-	0x0001, 0x2001, 0x8b00, 0x2003, 0x0001, 0x080c, 0x4b8b, 0x00a0,
-	0x2061, 0x0100, 0x2001, 0x8b14, 0x2004, 0xa084, 0x00ff, 0x810f,
-	0xa105, 0x604a, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x001e,
-	0x2011, 0x4062, 0x080c, 0x568c, 0x7924, 0xa18c, 0xff00, 0x810f,
-	0x080c, 0x4c42, 0x1110, 0x2009, 0x00ff, 0x7a28, 0x080c, 0x324f,
-	0x012e, 0x00ce, 0x002e, 0x0804, 0x2823, 0x7924, 0xa18c, 0xff00,
-	0x810f, 0x00c6, 0x080c, 0x42d6, 0x2c08, 0x00ce, 0x1904, 0x284b,
-	0x0804, 0x2823, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x2848,
-	0x60c8, 0xd0ac, 0x1130, 0xd09c, 0x1120, 0x2009, 0x0005, 0x0804,
-	0x2848, 0x080c, 0x35c0, 0x1120, 0x2009, 0x0002, 0x0804, 0x2848,
-	0x7924, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x080c, 0x3601, 0x701b,
-	0x339a, 0x0005, 0x2009, 0x0080, 0x080c, 0x430a, 0x1130, 0x6004,
-	0xa084, 0x00ff, 0xa086, 0x0006, 0x0120, 0x2021, 0x400a, 0x0804,
-	0x2825, 0x00d6, 0xade8, 0x000d, 0x6900, 0x6a08, 0x6b0c, 0x6c10,
-	0x6d14, 0x6e18, 0x6820, 0xa0be, 0x0100, 0x0904, 0x340d, 0xa0be,
-	0x0112, 0x0904, 0x340d, 0xa0be, 0x0113, 0x0904, 0x340d, 0xa0be,
-	0x0114, 0x0904, 0x340d, 0xa0be, 0x0117, 0x0904, 0x340d, 0xa0be,
-	0x011a, 0x0904, 0x340d, 0xa0be, 0x0121, 0x05b0, 0xa0be, 0x0131,
-	0x0598, 0xa0be, 0x0171, 0x05c8, 0xa0be, 0x0173, 0x05b0, 0xa0be,
-	0x01a1, 0x1120, 0x6830, 0x8007, 0x6832, 0x04a0, 0xa0be, 0x0212,
-	0x0540, 0xa0be, 0x0213, 0x0528, 0xa0be, 0x0214, 0x01b0, 0xa0be,
-	0x0217, 0x0168, 0xa0be, 0x021a, 0x1120, 0x6838, 0x8007, 0x683a,
-	0x00e0, 0xa0be, 0x0300, 0x01c8, 0x00de, 0x0804, 0x284b, 0xad80,
-	0x0010, 0x20a9, 0x0007, 0x080c, 0x3450, 0xad80, 0x000e, 0x20a9,
-	0x0001, 0x080c, 0x3450, 0x0048, 0xad80, 0x000c, 0x080c, 0x345e,
-	0x0048, 0xad80, 0x000e, 0x080c, 0x345e, 0xad80, 0x000c, 0x20a9,
-	0x0001, 0x04f1, 0x00c6, 0x080c, 0x35c0, 0x0558, 0x6838, 0xc0fd,
-	0x683a, 0x6837, 0x0119, 0x6853, 0x0000, 0x684f, 0x0020, 0x685b,
-	0x0001, 0x810b, 0x697e, 0x6883, 0x0000, 0x6a86, 0x6b8a, 0x6c8e,
-	0x6d92, 0x6996, 0x689b, 0x0000, 0x00ce, 0x00de, 0x6837, 0x0000,
-	0x6838, 0xc0fd, 0x683a, 0x6823, 0x0000, 0x080c, 0x7ce3, 0x1120,
-	0x2009, 0x0003, 0x0804, 0x2848, 0x7007, 0x0003, 0x701b, 0x3447,
-	0x0005, 0x00ce, 0x00de, 0x2009, 0x0002, 0x0804, 0x2848, 0x6820,
-	0xa086, 0x8001, 0x1904, 0x2823, 0x2009, 0x0004, 0x0804, 0x2848,
-	0x0016, 0x2008, 0x2044, 0x8000, 0x204c, 0x8000, 0x290a, 0x8108,
-	0x280a, 0x8108, 0x1f04, 0x3452, 0x001e, 0x0005, 0x0016, 0x00a6,
-	0x00b6, 0x2008, 0x2044, 0x8000, 0x204c, 0x8000, 0x2054, 0x8000,
-	0x205c, 0x2b0a, 0x8108, 0x2a0a, 0x8108, 0x290a, 0x8108, 0x280a,
-	0x00be, 0x00ae, 0x001e, 0x0005, 0x81ff, 0x0120, 0x2009, 0x0001,
-	0x0804, 0x2848, 0x7924, 0x2140, 0xa18c, 0xff00, 0x810f, 0x60c8,
-	0xd0ac, 0x1120, 0xa182, 0x0080, 0x0a04, 0x284b, 0xa182, 0x00ff,
-	0x1a04, 0x284b, 0x7a2c, 0x7b28, 0x606c, 0xa306, 0x1140, 0x6070,
-	0xa24e, 0x0904, 0x284b, 0xa9cc, 0xff00, 0x0904, 0x284b, 0x00c6,
-	0x080c, 0x3513, 0x2c68, 0x00ce, 0x01c0, 0xa0c6, 0x4000, 0x1108,
-	0x0088, 0xa0c6, 0x4007, 0x1110, 0x2408, 0x0060, 0xa0c6, 0x4008,
-	0x1118, 0x2708, 0x2610, 0x0030, 0xa0c6, 0x4009, 0x1108, 0x0010,
-	0x2001, 0x4006, 0x2020, 0x0804, 0x2825, 0x2d00, 0x7022, 0x0016,
-	0x00b6, 0x00c6, 0x00e6, 0x2c70, 0x080c, 0x6cc2, 0x05a0, 0x2d00,
-	0x601a, 0x2e58, 0x00ee, 0x00e6, 0x00c6, 0x080c, 0x35c0, 0x00ce,
-	0x2b70, 0x1150, 0x080c, 0x6d18, 0x00ee, 0x00ce, 0x00be, 0x001e,
-	0x2009, 0x0002, 0x0804, 0x2848, 0x6837, 0x0000, 0x2d00, 0x6012,
-	0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x0126, 0x2091, 0x8000,
-	0x080c, 0x2563, 0x012e, 0x601f, 0x0001, 0x2001, 0x0000, 0x080c,
-	0x42a7, 0x2001, 0x0002, 0x080c, 0x42b9, 0x2009, 0x0002, 0x080c,
-	0x6d3f, 0xa085, 0x0001, 0x00ee, 0x00ce, 0x00be, 0x001e, 0x1120,
-	0x2009, 0x0003, 0x0804, 0x2848, 0x7007, 0x0003, 0x701b, 0x3501,
-	0x0005, 0x6830, 0xa086, 0x0100, 0x2009, 0x0004, 0x0904, 0x2848,
-	0x7020, 0x2060, 0x2009, 0x0000, 0x080c, 0x457e, 0x1110, 0x2009,
-	0x0001, 0x0804, 0x2823, 0x00e6, 0x00d6, 0x2029, 0x0000, 0x2001,
-	0x8b32, 0x2004, 0xd0ac, 0x0138, 0x2021, 0x0000, 0x20a9, 0x00ff,
-	0x2071, 0x8c34, 0x0030, 0x2021, 0x0080, 0x20a9, 0x007f, 0x2071,
-	0x8cb4, 0x2e04, 0xa005, 0x1130, 0x2100, 0xa406, 0x1548, 0x2428,
-	0xc5fd, 0x0430, 0x2068, 0x6f10, 0x2700, 0xa306, 0x11b0, 0x6e14,
-	0x2600, 0xa206, 0x1190, 0x2400, 0xa106, 0x1160, 0x2d60, 0xd884,
-	0x0540, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x1510, 0x2001,
-	0x4000, 0x0400, 0x2001, 0x4007, 0x00e8, 0x2400, 0xa106, 0x1140,
-	0x6e14, 0x87ff, 0x1110, 0x86ff, 0x09d0, 0x2001, 0x4008, 0x0090,
-	0x8420, 0x8e70, 0x1f04, 0x3529, 0x85ff, 0x1130, 0x2001, 0x4009,
-	0x0048, 0x2001, 0x0001, 0x0030, 0x080c, 0x42d6, 0x1dd0, 0x6312,
-	0x6216, 0xa006, 0xa005, 0x00de, 0x00ee, 0x0005, 0x81ff, 0x1904,
-	0x2848, 0x080c, 0x35c0, 0x0904, 0x2848, 0x6837, 0x0000, 0x6838,
-	0xc0fd, 0x683a, 0x7824, 0xa005, 0x0904, 0x284b, 0xa096, 0x00ff,
-	0x0120, 0xa092, 0x0004, 0x1a04, 0x284b, 0x2010, 0x2d18, 0x080c,
-	0x2528, 0x0904, 0x2848, 0x7007, 0x0003, 0x701b, 0x3590, 0x0005,
-	0x6830, 0xa086, 0x0100, 0x0904, 0x2848, 0x0804, 0x2823, 0x7924,
-	0xa18c, 0xff00, 0x810f, 0x60c8, 0xd0ac, 0x1120, 0xa182, 0x0080,
-	0x0a04, 0x284b, 0xa182, 0x00ff, 0x1a04, 0x284b, 0x0126, 0x2091,
-	0x8000, 0x080c, 0x7bbb, 0x1188, 0xa190, 0x8c34, 0x2204, 0xa065,
-	0x0160, 0x080c, 0x4118, 0x2001, 0x8b32, 0x2004, 0xd0ac, 0x0110,
-	0x6017, 0x0000, 0x012e, 0x0804, 0x2823, 0x012e, 0x0804, 0x2848,
-	0x080c, 0x1488, 0x0188, 0xa006, 0x6802, 0x7010, 0xa005, 0x1120,
-	0x2d00, 0x7012, 0x7016, 0x0030, 0x7014, 0x6802, 0x2060, 0x2d00,
-	0x6006, 0x7016, 0xad80, 0x000d, 0x0005, 0x7924, 0x810f, 0xa18c,
-	0x00ff, 0x080c, 0x430a, 0x1130, 0x7e28, 0xa684, 0x3fff, 0xa082,
-	0x4000, 0x0208, 0xa066, 0x8cff, 0x0005, 0x7e24, 0x860f, 0xa18c,
-	0x00ff, 0x080c, 0x430a, 0x1128, 0xa6b4, 0x00ff, 0xa682, 0x4000,
-	0x0208, 0xa066, 0x8cff, 0x0005, 0x0016, 0x7110, 0x81ff, 0x0128,
-	0x2168, 0x6904, 0x080c, 0x149f, 0x0cc8, 0x7112, 0x7116, 0x001e,
-	0x0005, 0x2031, 0x0001, 0x0010, 0x2031, 0x0000, 0x2061, 0x8bd1,
-	0x6606, 0x6112, 0x600e, 0x6226, 0x632a, 0x642e, 0x6532, 0x2c10,
-	0x080c, 0x14d3, 0x7007, 0x0002, 0x701b, 0x2823, 0x0005, 0x00f6,
-	0x0126, 0x2091, 0x8000, 0x2079, 0x0000, 0x2001, 0x8b8f, 0x2004,
-	0xa005, 0x1168, 0x0e04, 0x362f, 0x7818, 0xd084, 0x1140, 0x7a22,
-	0x7b26, 0x7c2a, 0x781b, 0x0001, 0x2091, 0x4080, 0x0408, 0x0016,
-	0x00c6, 0x00e6, 0x2071, 0x8b81, 0x7138, 0xa182, 0x0010, 0x0218,
-	0x7030, 0x2060, 0x0078, 0x7030, 0xa0e0, 0x0004, 0xac82, 0x8bd1,
-	0x0210, 0x2061, 0x8b91, 0x2c00, 0x7032, 0x81ff, 0x1108, 0x7036,
-	0x8108, 0x713a, 0x2262, 0x6306, 0x640a, 0x00ee, 0x00ce, 0x001e,
-	0x012e, 0x00fe, 0x0005, 0x00e6, 0x2071, 0x8b81, 0x7038, 0xa005,
-	0x0570, 0x0126, 0x2091, 0x8000, 0x0e04, 0x3686, 0x00f6, 0x2079,
-	0x0000, 0x7818, 0xd084, 0x1508, 0x00c6, 0x7034, 0x2060, 0x2c04,
-	0x7822, 0x6004, 0x7826, 0x6008, 0x782a, 0x781b, 0x0001, 0x2091,
-	0x4080, 0x7038, 0x8001, 0x703a, 0xa005, 0x1130, 0x7033, 0x8b91,
-	0x7037, 0x8b91, 0x00ce, 0x0048, 0xac80, 0x0004, 0xa0fa, 0x8bd1,
-	0x0210, 0x2001, 0x8b91, 0x7036, 0x00ce, 0x00fe, 0x012e, 0x00ee,
-	0x0005, 0x0026, 0x2001, 0x8b52, 0x2004, 0xd0c4, 0x0120, 0x2011,
-	0x8014, 0x080c, 0x3617, 0x002e, 0x0005, 0x81ff, 0x1904, 0x2848,
-	0x0126, 0x2091, 0x8000, 0x6030, 0xc08d, 0x6032, 0x080c, 0x4c42,
-	0x1158, 0x2001, 0x8d9d, 0x2003, 0x0001, 0x2001, 0x8b00, 0x2003,
-	0x0001, 0x080c, 0x4b8b, 0x0010, 0x080c, 0x403d, 0x012e, 0x0804,
-	0x2823, 0x7824, 0x2008, 0xa18c, 0xfffd, 0x1128, 0x61d4, 0xa10d,
-	0x61d6, 0x0804, 0x2823, 0x0804, 0x284b, 0x81ff, 0x1904, 0x2848,
-	0x6000, 0xa086, 0x0003, 0x1904, 0x2848, 0x2001, 0x8b52, 0x2004,
-	0xd0a4, 0x1904, 0x2848, 0x080c, 0x35e5, 0x0904, 0x284b, 0x6004,
-	0xa084, 0x00ff, 0xa086, 0x0006, 0x1120, 0x7828, 0xa005, 0x0904,
-	0x2823, 0x00c6, 0x080c, 0x35c0, 0x00ce, 0x0904, 0x2848, 0x6837,
-	0x0000, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x080c, 0x7d78,
-	0x0904, 0x2848, 0x7007, 0x0003, 0x701b, 0x36ef, 0x0005, 0x6830,
-	0xa086, 0x0100, 0x0904, 0x2848, 0x0804, 0x2823, 0x2001, 0x8b00,
-	0x2004, 0xa086, 0x0003, 0x1904, 0x2848, 0x7f24, 0x7a2c, 0x7b28,
-	0x7c3c, 0x7d38, 0x080c, 0x35c0, 0x0904, 0x2848, 0x2009, 0x0000,
-	0x2031, 0x0000, 0x7023, 0x0000, 0x702f, 0x0000, 0xad80, 0x0005,
-	0x7026, 0x20a0, 0x080c, 0x430a, 0x1560, 0x6004, 0xa0c4, 0x00ff,
-	0xa8c6, 0x0006, 0x0128, 0xa0c4, 0xff00, 0xa8c6, 0x0600, 0x1508,
-	0x2001, 0x8b52, 0x2004, 0xd0ac, 0x1118, 0x080c, 0x457e, 0x01c8,
-	0xd784, 0x0150, 0xac80, 0x0006, 0x2098, 0x3400, 0x20a9, 0x0004,
-	0x53a3, 0x080c, 0x345e, 0x0048, 0xac80, 0x000a, 0x2098, 0x3400,
-	0x20a9, 0x0004, 0x53a3, 0x080c, 0x345e, 0x21a2, 0x94a0, 0xa6b0,
-	0x0005, 0x8108, 0x2001, 0x8b32, 0x2004, 0xd0ac, 0x0118, 0xa186,
-	0x0100, 0x0040, 0xd78c, 0x0120, 0xa186, 0x0100, 0x0148, 0x0018,
-	0xa186, 0x007e, 0x0128, 0xa686, 0x0028, 0x0150, 0x0804, 0x3712,
-	0x86ff, 0x1120, 0x7120, 0x810b, 0x0804, 0x2823, 0x702f, 0x0001,
-	0x711e, 0x7020, 0xa600, 0x7022, 0x772a, 0x2061, 0x8bd1, 0x6007,
-	0x0000, 0x6612, 0x7024, 0x600e, 0x6226, 0x632a, 0x642e, 0x6532,
-	0x2c10, 0x080c, 0x14d3, 0x7007, 0x0002, 0x701b, 0x3778, 0x0005,
-	0x702c, 0xa005, 0x1170, 0x711c, 0x7024, 0x20a0, 0x7728, 0x2031,
-	0x0000, 0x2061, 0x8bd1, 0x6224, 0x6328, 0x642c, 0x6530, 0x0804,
-	0x3712, 0x7120, 0x810b, 0x0804, 0x2823, 0x2029, 0x007e, 0x7924,
-	0x7a28, 0x7b2c, 0x7c38, 0xa184, 0xff00, 0x8007, 0xa0e2, 0x0020,
-	0x0a04, 0x284b, 0xa502, 0x0a04, 0x284b, 0xa184, 0x00ff, 0xa0e2,
-	0x0020, 0x0a04, 0x284b, 0xa502, 0x0a04, 0x284b, 0xa284, 0xff00,
-	0x8007, 0xa0e2, 0x0020, 0x0a04, 0x284b, 0xa502, 0x0a04, 0x284b,
-	0xa284, 0x00ff, 0xa0e2, 0x0020, 0x0a04, 0x284b, 0xa502, 0x0a04,
-	0x284b, 0xa384, 0xff00, 0x8007, 0xa0e2, 0x0020, 0x0a04, 0x284b,
-	0xa502, 0x0a04, 0x284b, 0xa384, 0x00ff, 0xa0e2, 0x0020, 0x0a04,
-	0x284b, 0xa502, 0x0a04, 0x284b, 0xa484, 0xff00, 0x8007, 0xa0e2,
-	0x0020, 0x0a04, 0x284b, 0xa502, 0x0a04, 0x284b, 0xa484, 0x00ff,
-	0xa0e2, 0x0020, 0x0a04, 0x284b, 0xa502, 0x0a04, 0x284b, 0x2061,
-	0x8da4, 0x6102, 0x6206, 0x630a, 0x640e, 0x0804, 0x2823, 0x0006,
-	0x2001, 0x8b52, 0x2004, 0xd0cc, 0x000e, 0x0005, 0x0006, 0x2001,
-	0x8b71, 0x2004, 0xd0bc, 0x000e, 0x0005, 0x6164, 0x7a24, 0x6300,
-	0x82ff, 0x1118, 0x7926, 0x0804, 0x2823, 0x83ff, 0x1904, 0x284b,
-	0x2001, 0xfff0, 0xa200, 0x1a04, 0x284b, 0x2019, 0xffff, 0x6068,
-	0xa302, 0xa200, 0x0a04, 0x284b, 0x7926, 0x6266, 0x0804, 0x2823,
-	0x2001, 0x8b00, 0x2004, 0xa086, 0x0003, 0x1904, 0x2848, 0x7c28,
-	0x7d24, 0x7e38, 0x7f2c, 0x080c, 0x35c0, 0x0904, 0x2848, 0x2009,
-	0x0000, 0x2019, 0x0000, 0x7023, 0x0000, 0x702f, 0x0000, 0xad80,
-	0x0003, 0x7026, 0x20a0, 0xa1e0, 0x8c34, 0x2c64, 0x8cff, 0x01b8,
-	0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x0130, 0x6004, 0xa084,
-	0xff00, 0xa086, 0x0600, 0x1158, 0x6014, 0x20a2, 0x94a0, 0x6010,
-	0x8007, 0xa105, 0x8007, 0x20a2, 0x94a0, 0xa398, 0x0002, 0x8108,
-	0xa182, 0x00ff, 0x0120, 0xa386, 0x002a, 0x0148, 0x08e0, 0x83ff,
-	0x1120, 0x7120, 0x810c, 0x0804, 0x2823, 0x702f, 0x0001, 0x711e,
-	0x7020, 0xa300, 0x7022, 0x2061, 0x8bd1, 0x6007, 0x0000, 0x6312,
-	0x7024, 0x600e, 0x6426, 0x652a, 0x662e, 0x6732, 0x2c10, 0x080c,
-	0x14d3, 0x7007, 0x0002, 0x701b, 0x386e, 0x0005, 0x702c, 0xa005,
-	0x1158, 0x711c, 0x7024, 0x20a0, 0x2019, 0x0000, 0x6424, 0x6528,
-	0x662c, 0x6730, 0x0804, 0x382b, 0x7120, 0x810c, 0x0804, 0x2823,
-	0x81ff, 0x1904, 0x2848, 0x60c8, 0xd0ac, 0x1118, 0xd09c, 0x0904,
-	0x2848, 0x080c, 0x35c0, 0x0904, 0x2848, 0x7924, 0x7a2c, 0x7b28,
-	0x7c3c, 0x7d38, 0x080c, 0x3601, 0x701b, 0x3897, 0x0005, 0x00d6,
-	0xade8, 0x000d, 0x6828, 0xa0be, 0x7000, 0x0148, 0xa0be, 0x7100,
-	0x0130, 0xa0be, 0x7200, 0x0118, 0x00de, 0x0804, 0x284b, 0x6820,
-	0x6924, 0x080c, 0x22e9, 0x1500, 0x080c, 0x42d6, 0x11e8, 0x7122,
-	0x6612, 0x6516, 0x6e18, 0x00c6, 0x080c, 0x35c0, 0x01a8, 0x080c,
-	0x35c0, 0x0190, 0x00ce, 0x00de, 0x6837, 0x0000, 0x6838, 0xc0fd,
-	0x683a, 0x6823, 0x0000, 0x080c, 0x7cfd, 0x0904, 0x2848, 0x7007,
-	0x0003, 0x701b, 0x38cf, 0x0005, 0x00de, 0x0804, 0x2848, 0x7120,
-	0x080c, 0x42f5, 0x6820, 0xa086, 0x8001, 0x0904, 0x2848, 0x2d00,
-	0x701e, 0x6804, 0xa080, 0x0002, 0x0006, 0x20a9, 0x002a, 0x2098,
-	0x20a0, 0x080c, 0x409e, 0x000e, 0xade8, 0x000d, 0x6a08, 0x6b0c,
-	0x6c10, 0x6d14, 0x2061, 0x8bd1, 0x6007, 0x0000, 0x6e00, 0x6f28,
-	0xa7c6, 0x7000, 0x1108, 0x0018, 0xa7c6, 0x7100, 0x1140, 0xa6c2,
-	0x0004, 0x0a04, 0x284b, 0x2009, 0x0004, 0x0804, 0x3604, 0xa7c6,
-	0x7200, 0x1904, 0x284b, 0xa6c2, 0x0054, 0x0a04, 0x284b, 0x600e,
-	0x6013, 0x002a, 0x6226, 0x632a, 0x642e, 0x6532, 0x2c10, 0x080c,
-	0x14d3, 0x7007, 0x0002, 0x701b, 0x3916, 0x0005, 0x701c, 0x2068,
-	0x6804, 0xa080, 0x0001, 0x2004, 0xa080, 0x0002, 0x0006, 0x20a9,
-	0x002a, 0x2098, 0x20a0, 0x080c, 0x409e, 0x000e, 0x2009, 0x002a,
-	0x2061, 0x8bd1, 0x6224, 0x6328, 0x642c, 0x6530, 0x0804, 0x3604,
-	0x81ff, 0x1904, 0x2848, 0x080c, 0x35d5, 0x0904, 0x284b, 0x080c,
-	0x43ad, 0x0904, 0x2848, 0x080c, 0x44dd, 0x0804, 0x2823, 0x7824,
-	0xd084, 0x0904, 0x31d9, 0x080c, 0x35e5, 0x0904, 0x284b, 0x00c6,
-	0x080c, 0x35c0, 0x00ce, 0x0904, 0x2848, 0x6004, 0xa084, 0x00ff,
-	0xa086, 0x0006, 0x11f0, 0x2001, 0x8b52, 0x2004, 0xd0b4, 0x0904,
-	0x3206, 0x6000, 0xd08c, 0x1904, 0x3206, 0x6837, 0x0000, 0x6838,
-	0xc0fd, 0x683a, 0x080c, 0x7d17, 0x0904, 0x2848, 0x7007, 0x0003,
-	0x701b, 0x396b, 0x0005, 0x080c, 0x35e5, 0x0904, 0x284b, 0x0804,
-	0x3206, 0x2009, 0x8b2f, 0x210c, 0x81ff, 0x1904, 0x2848, 0x2001,
-	0x8b00, 0x2004, 0xa086, 0x0003, 0x1904, 0x2848, 0x2001, 0x8b52,
-	0x2004, 0xd0ac, 0x1904, 0x2848, 0x6837, 0x0000, 0x6833, 0x0000,
-	0x6838, 0xc0fd, 0x683a, 0x080c, 0x7d78, 0x0904, 0x2848, 0x7007,
-	0x0003, 0x701b, 0x3994, 0x0005, 0x6830, 0xa086, 0x0100, 0x0904,
-	0x2848, 0x080c, 0x35e5, 0x0904, 0x284b, 0x0804, 0x3953, 0x0126,
-	0x00c6, 0x00e6, 0x2061, 0x0100, 0x2071, 0x8b00, 0x6044, 0xd0a4,
-	0x11b0, 0xd084, 0x0118, 0x080c, 0x3b0c, 0x0068, 0xd08c, 0x0118,
-	0x080c, 0x3a2d, 0x0040, 0xd094, 0x0118, 0x080c, 0x3a05, 0x0018,
-	0xd09c, 0x0108, 0x0061, 0x00ee, 0x00ce, 0x012e, 0x0005, 0x0016,
-	0x6128, 0xd19c, 0x1110, 0xc19d, 0x612a, 0x001e, 0x0ca0, 0x624c,
-	0xa286, 0xf0f0, 0x1150, 0x6048, 0xa086, 0xf0f0, 0x0130, 0x624a,
-	0x6043, 0x0090, 0x6043, 0x0010, 0x0478, 0xa294, 0xff00, 0xa296,
-	0xf700, 0x0160, 0x6240, 0xa295, 0x0100, 0x6242, 0xa294, 0x0010,
-	0x0128, 0x2009, 0x00f7, 0x080c, 0x40be, 0x00f0, 0x6040, 0xa084,
-	0x0010, 0xa085, 0x0040, 0x6042, 0x6043, 0x0000, 0x7077, 0x0000,
-	0x7093, 0x0001, 0x70b3, 0x0000, 0x70cb, 0x0000, 0x2009, 0x91c0,
-	0x200b, 0x0000, 0x7087, 0x0000, 0x707b, 0x000f, 0x2009, 0x000f,
-	0x2011, 0x3fe0, 0x080c, 0x568c, 0x0005, 0x0156, 0x7078, 0xa005,
-	0x1510, 0x2011, 0x3fe0, 0x080c, 0x560d, 0x6040, 0xa094, 0x0010,
-	0xa285, 0x0020, 0x6042, 0x20a9, 0x00c8, 0x6044, 0xd08c, 0x1168,
-	0x1f04, 0x3a15, 0x6242, 0x708b, 0x0000, 0x6040, 0xa094, 0x0010,
-	0xa285, 0x0080, 0x6042, 0x6242, 0x0030, 0x6242, 0x708b, 0x0000,
-	0x707f, 0x0000, 0x0000, 0x015e, 0x0005, 0x707c, 0xa08a, 0x0003,
-	0x1210, 0x0023, 0x0010, 0x080c, 0x1410, 0x0005, 0x3a39, 0x3a89,
-	0x3b0b, 0x00f6, 0x707f, 0x0001, 0x20e1, 0xa000, 0xe000, 0x20e1,
-	0x8700, 0x080c, 0x1fbd, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2079,
-	0x9000, 0x207b, 0x2200, 0x7807, 0x00ef, 0x780b, 0x0000, 0x780f,
-	0x00ef, 0x7813, 0x0138, 0x7817, 0x0000, 0x781b, 0x0000, 0x781f,
-	0x0000, 0x7823, 0xffff, 0x7827, 0xffff, 0x782b, 0x0000, 0x782f,
-	0x0000, 0x2079, 0x900c, 0x207b, 0x1101, 0x7807, 0x0000, 0x2099,
-	0x8b05, 0x20a1, 0x900e, 0x20a9, 0x0004, 0x53a3, 0x2079, 0x9012,
-	0x207b, 0x0000, 0x7807, 0x0000, 0x2099, 0x9000, 0x20a1, 0x020b,
-	0x20a9, 0x0014, 0x53a6, 0x60c3, 0x000c, 0x600f, 0x0000, 0x080c,
-	0x4024, 0x00fe, 0x7083, 0x0000, 0x6043, 0x0008, 0x6043, 0x0000,
-	0x0005, 0x00d6, 0x7080, 0x7083, 0x0000, 0xa025, 0x0904, 0x3af3,
-	0x6020, 0xd0b4, 0x1904, 0x3af1, 0x7190, 0x81ff, 0x0904, 0x3adb,
-	0xa486, 0x000c, 0x1904, 0x3ae6, 0xa480, 0x0018, 0x8004, 0x20a8,
-	0x2011, 0x9080, 0x2019, 0x9000, 0x220c, 0x2304, 0xa106, 0x1188,
-	0x8210, 0x8318, 0x1f04, 0x3aa4, 0x6043, 0x0004, 0x608b, 0xbc94,
-	0x608f, 0xf0f0, 0x6043, 0x0006, 0x707f, 0x0002, 0x708b, 0x0002,
-	0x04c0, 0x2069, 0x9080, 0x6930, 0xa18e, 0x1101, 0x1538, 0x6834,
-	0xa005, 0x1520, 0x6900, 0xa18c, 0x00ff, 0x1118, 0x6804, 0xa005,
-	0x0190, 0x2011, 0x908e, 0x2019, 0x8b05, 0x20a9, 0x0004, 0x220c,
-	0x2304, 0xa102, 0x0230, 0x1190, 0x8210, 0x8318, 0x1f04, 0x3acf,
-	0x0068, 0x7093, 0x0000, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099,
-	0x9080, 0x20a1, 0x020b, 0x20a9, 0x0014, 0x53a6, 0x6043, 0x0008,
-	0x6043, 0x0000, 0x6020, 0xd0b4, 0x1120, 0x60c3, 0x000c, 0x080c,
-	0x4024, 0x00de, 0x0005, 0x6040, 0xa085, 0x0100, 0x6042, 0x6020,
-	0xd0b4, 0x1db8, 0x60c3, 0x000c, 0x2011, 0x8db4, 0x2013, 0x0000,
-	0x7083, 0x0000, 0x20e1, 0x9080, 0x60a3, 0x0056, 0x60a7, 0x9575,
-	0x080c, 0x66ee, 0x0c30, 0x0005, 0x7088, 0xa08a, 0x001d, 0x1210,
-	0x0023, 0x0010, 0x080c, 0x1410, 0x0005, 0x3b3f, 0x3b4e, 0x3b78,
-	0x3b8d, 0x3bb3, 0x3bdb, 0x3c01, 0x3c32, 0x3c58, 0x3c80, 0x3cbb,
-	0x3ce3, 0x3cff, 0x3d15, 0x3d35, 0x3d48, 0x3d50, 0x3d7a, 0x3da0,
-	0x3dc8, 0x3dee, 0x3e1f, 0x3e5b, 0x3e8a, 0x3ea6, 0x3ee5, 0x3f05,
-	0x3f1e, 0x3f1f, 0x00c6, 0x2061, 0x8b00, 0x6003, 0x0007, 0x2061,
-	0x0100, 0x6004, 0xa084, 0xfff9, 0x6006, 0x00ce, 0x0005, 0x608b,
-	0xbc94, 0x608f, 0xf0f0, 0x6043, 0x0002, 0x708b, 0x0001, 0x2009,
-	0x07d0, 0x2011, 0x3fe7, 0x080c, 0x5601, 0x0005, 0x00f6, 0x7080,
-	0xa086, 0x0014, 0x1518, 0x6043, 0x0000, 0x6020, 0xd0b4, 0x11f0,
-	0x2079, 0x9080, 0x7a30, 0xa296, 0x1102, 0x11b0, 0x7834, 0xa005,
-	0x1198, 0x7a38, 0xd2fc, 0x0138, 0x70b0, 0xa005, 0x1120, 0x080c,
-	0x40d5, 0x70b3, 0x0001, 0x2011, 0x3fe7, 0x080c, 0x560d, 0x708b,
-	0x0010, 0x080c, 0x3d50, 0x0010, 0x7083, 0x0000, 0x00fe, 0x0005,
-	0x708b, 0x0003, 0x6043, 0x0004, 0x080c, 0x40a6, 0x20a3, 0x1102,
-	0x20a3, 0x0000, 0x20a9, 0x000a, 0x20a3, 0x0000, 0x1f04, 0x3b84,
-	0x60c3, 0x0014, 0x080c, 0x4024, 0x0005, 0x00f6, 0x7080, 0xa005,
-	0x0500, 0x2011, 0x3fe7, 0x080c, 0x560d, 0xa086, 0x0014, 0x11b8,
-	0x2079, 0x9080, 0x7a30, 0xa296, 0x1102, 0x1188, 0x7834, 0xa005,
-	0x1170, 0x7a38, 0xd2fc, 0x0138, 0x70b0, 0xa005, 0x1120, 0x080c,
-	0x40d5, 0x70b3, 0x0001, 0x708b, 0x0004, 0x0029, 0x0010, 0x080c,
-	0x40ee, 0x00fe, 0x0005, 0x708b, 0x0005, 0x080c, 0x40a6, 0x20a3,
-	0x1103, 0x20a3, 0x0000, 0x3430, 0x2011, 0x908e, 0x080c, 0x40f5,
-	0x1160, 0x7074, 0xa005, 0x1148, 0x714c, 0xa186, 0xffff, 0x0128,
-	0x080c, 0x3fab, 0x0110, 0x080c, 0x40d5, 0x20a9, 0x0008, 0x2298,
-	0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014,
-	0x080c, 0x4024, 0x0005, 0x00f6, 0x7080, 0xa005, 0x0500, 0x2011,
-	0x3fe7, 0x080c, 0x560d, 0xa086, 0x0014, 0x11b8, 0x2079, 0x9080,
-	0x7a30, 0xa296, 0x1103, 0x1188, 0x7834, 0xa005, 0x1170, 0x7a38,
-	0xd2fc, 0x0138, 0x70b0, 0xa005, 0x1120, 0x080c, 0x40d5, 0x70b3,
-	0x0001, 0x708b, 0x0006, 0x0029, 0x0010, 0x080c, 0x40ee, 0x00fe,
-	0x0005, 0x708b, 0x0007, 0x080c, 0x40a6, 0x20a3, 0x1104, 0x20a3,
-	0x0000, 0x3430, 0x2011, 0x908e, 0x080c, 0x40f5, 0x11a8, 0x7074,
-	0xa005, 0x1190, 0x7154, 0xa186, 0xffff, 0x0170, 0xa180, 0x263d,
-	0x200d, 0xa18c, 0xff00, 0x810f, 0x080c, 0x3fab, 0x0128, 0x080c,
-	0x37ee, 0x0110, 0x080c, 0x2333, 0x20a9, 0x0008, 0x2298, 0x26a0,
-	0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c,
-	0x4024, 0x0005, 0x00f6, 0x7080, 0xa005, 0x0500, 0x2011, 0x3fe7,
-	0x080c, 0x560d, 0xa086, 0x0014, 0x11b8, 0x2079, 0x9080, 0x7a30,
-	0xa296, 0x1104, 0x1188, 0x7834, 0xa005, 0x1170, 0x7a38, 0xd2fc,
-	0x0138, 0x70b0, 0xa005, 0x1120, 0x080c, 0x40d5, 0x70b3, 0x0001,
-	0x708b, 0x0008, 0x0029, 0x0010, 0x080c, 0x40ee, 0x00fe, 0x0005,
-	0x708b, 0x0009, 0x080c, 0x40a6, 0x20a3, 0x1105, 0x20a3, 0x0100,
-	0x3430, 0x080c, 0x40f5, 0x1150, 0x7074, 0xa005, 0x1138, 0x080c,
-	0x3f20, 0x1170, 0xa085, 0x0001, 0x080c, 0x2333, 0x20a9, 0x0008,
-	0x2099, 0x908e, 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000,
-	0x60c3, 0x0014, 0x080c, 0x4024, 0x0010, 0x080c, 0x3b32, 0x0005,
-	0x00f6, 0x7080, 0xa005, 0x05a8, 0x2011, 0x3fe7, 0x080c, 0x560d,
-	0xa086, 0x0014, 0x1560, 0x2079, 0x9080, 0x7a30, 0xa296, 0x1105,
-	0x1530, 0x7834, 0x2011, 0x0100, 0xa21e, 0x1170, 0x7a38, 0xd2fc,
-	0x0138, 0x70b0, 0xa005, 0x1120, 0x080c, 0x40d5, 0x70b3, 0x0001,
-	0x708b, 0x000a, 0x00c1, 0x00a8, 0xa005, 0x1188, 0x7a38, 0xd2fc,
-	0x0138, 0x70b0, 0xa005, 0x1120, 0x080c, 0x40d5, 0x70b3, 0x0001,
-	0x7087, 0x0000, 0x708b, 0x000e, 0x080c, 0x3d35, 0x0010, 0x080c,
-	0x40ee, 0x00fe, 0x0005, 0x708b, 0x000b, 0x2011, 0x900e, 0x22a0,
-	0x20a9, 0x0040, 0x2019, 0xffff, 0x43a4, 0x20a9, 0x0002, 0x2009,
-	0x0000, 0x41a4, 0x080c, 0x40a6, 0x20a3, 0x1106, 0x20a3, 0x0000,
-	0x080c, 0x40f5, 0x0118, 0x2013, 0x0000, 0x0020, 0x7050, 0xa085,
-	0x0100, 0x2012, 0x2298, 0x20a9, 0x0042, 0x53a6, 0x60c3, 0x0084,
-	0x080c, 0x4024, 0x0005, 0x00f6, 0x7080, 0xa005, 0x01b0, 0x2011,
-	0x3fe7, 0x080c, 0x560d, 0xa086, 0x0084, 0x1168, 0x2079, 0x9080,
-	0x7a30, 0xa296, 0x1106, 0x1138, 0x7834, 0xa005, 0x1120, 0x708b,
-	0x000c, 0x0029, 0x0010, 0x080c, 0x40ee, 0x00fe, 0x0005, 0x708b,
-	0x000d, 0x080c, 0x40a6, 0x20a3, 0x1107, 0x20a3, 0x0000, 0x2099,
-	0x908e, 0x20a9, 0x0040, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000,
-	0x60c3, 0x0084, 0x080c, 0x4024, 0x0005, 0x00f6, 0x7080, 0xa005,
-	0x01d0, 0x2011, 0x3fe7, 0x080c, 0x560d, 0xa086, 0x0084, 0x1188,
-	0x2079, 0x9080, 0x7a30, 0xa296, 0x1107, 0x1158, 0x7834, 0xa005,
-	0x1140, 0x7087, 0x0001, 0x080c, 0x4098, 0x708b, 0x000e, 0x0029,
-	0x0010, 0x080c, 0x40ee, 0x00fe, 0x0005, 0x708b, 0x000f, 0x7083,
-	0x0000, 0x608b, 0xbc85, 0x608f, 0xb5b5, 0x6043, 0x0005, 0x6043,
-	0x0004, 0x2009, 0x07d0, 0x2011, 0x3fe7, 0x080c, 0x5601, 0x0005,
-	0x7080, 0xa005, 0x0120, 0x2011, 0x3fe7, 0x080c, 0x560d, 0x0005,
-	0x708b, 0x0011, 0x716c, 0x81ff, 0x0170, 0x2009, 0x0000, 0x7070,
-	0xa084, 0x00ff, 0x080c, 0x22e9, 0xa186, 0x0080, 0x0120, 0x2011,
-	0x908e, 0x080c, 0x3fab, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099,
-	0x9080, 0x20a1, 0x020b, 0x7480, 0xa480, 0x0018, 0xa080, 0x0007,
-	0xa084, 0x03f8, 0x8004, 0x20a8, 0x53a6, 0x60c3, 0x0014, 0x080c,
-	0x4024, 0x0005, 0x00f6, 0x7080, 0xa005, 0x0500, 0x2011, 0x3fe7,
-	0x080c, 0x560d, 0xa086, 0x0014, 0x11b8, 0x2079, 0x9080, 0x7a30,
-	0xa296, 0x1103, 0x1188, 0x7834, 0xa005, 0x1170, 0x7a38, 0xd2fc,
-	0x0138, 0x70b0, 0xa005, 0x1120, 0x080c, 0x40d5, 0x70b3, 0x0001,
-	0x708b, 0x0012, 0x0029, 0x0010, 0x7083, 0x0000, 0x00fe, 0x0005,
-	0x708b, 0x0013, 0x080c, 0x40b2, 0x20a3, 0x1103, 0x20a3, 0x0000,
-	0x3430, 0x2011, 0x908e, 0x080c, 0x40f5, 0x1160, 0x7074, 0xa005,
-	0x1148, 0x714c, 0xa186, 0xffff, 0x0128, 0x080c, 0x3fab, 0x0110,
-	0x080c, 0x40d5, 0x20a9, 0x0008, 0x2298, 0x26a0, 0x53a6, 0x20a3,
-	0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c, 0x4024, 0x0005,
-	0x00f6, 0x7080, 0xa005, 0x0500, 0x2011, 0x3fe7, 0x080c, 0x560d,
-	0xa086, 0x0014, 0x11b8, 0x2079, 0x9080, 0x7a30, 0xa296, 0x1104,
-	0x1188, 0x7834, 0xa005, 0x1170, 0x7a38, 0xd2fc, 0x0138, 0x70b0,
-	0xa005, 0x1120, 0x080c, 0x40d5, 0x70b3, 0x0001, 0x708b, 0x0014,
-	0x0029, 0x0010, 0x7083, 0x0000, 0x00fe, 0x0005, 0x708b, 0x0015,
-	0x080c, 0x40b2, 0x20a3, 0x1104, 0x20a3, 0x0000, 0x3430, 0x2011,
-	0x908e, 0x080c, 0x40f5, 0x11a8, 0x7074, 0xa005, 0x1190, 0x7154,
-	0xa186, 0xffff, 0x0170, 0xa180, 0x263d, 0x200d, 0xa18c, 0xff00,
-	0x810f, 0x080c, 0x3fab, 0x0128, 0x080c, 0x37ee, 0x0110, 0x080c,
-	0x2333, 0x20a9, 0x0008, 0x2298, 0x26a0, 0x53a6, 0x20a3, 0x0000,
-	0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c, 0x4024, 0x0005, 0x00f6,
-	0x7080, 0xa005, 0x05b0, 0x2011, 0x3fe7, 0x080c, 0x560d, 0xa086,
-	0x0014, 0x1568, 0x2079, 0x9080, 0x7a30, 0xa296, 0x1105, 0x1538,
-	0x7834, 0x2011, 0x0100, 0xa21e, 0x1158, 0x7a38, 0xd2fc, 0x0138,
-	0x70b0, 0xa005, 0x1120, 0x080c, 0x40d5, 0x70b3, 0x0001, 0x0070,
-	0xa005, 0x11a8, 0x7a38, 0xd2fc, 0x0138, 0x70b0, 0xa005, 0x1120,
-	0x080c, 0x40d5, 0x70b3, 0x0001, 0x7087, 0x0000, 0x7a38, 0xd2f4,
-	0x0110, 0x70cb, 0x0008, 0x708b, 0x0016, 0x0029, 0x0010, 0x7083,
-	0x0000, 0x00fe, 0x0005, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099,
-	0x9080, 0x20a1, 0x020b, 0x20a9, 0x000e, 0x53a6, 0x3430, 0x2011,
-	0x908e, 0x708b, 0x0017, 0x080c, 0x40f5, 0x1150, 0x7074, 0xa005,
-	0x1138, 0x080c, 0x3f20, 0x1170, 0xa085, 0x0001, 0x080c, 0x2333,
-	0x20a9, 0x0008, 0x2099, 0x908e, 0x26a0, 0x53a6, 0x20a3, 0x0000,
-	0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c, 0x4024, 0x0010, 0x080c,
-	0x3b32, 0x0005, 0x00f6, 0x7080, 0xa005, 0x01b0, 0x2011, 0x3fe7,
-	0x080c, 0x560d, 0xa086, 0x0084, 0x1168, 0x2079, 0x9080, 0x7a30,
-	0xa296, 0x1106, 0x1138, 0x7834, 0xa005, 0x1120, 0x708b, 0x0018,
-	0x0029, 0x0010, 0x7083, 0x0000, 0x00fe, 0x0005, 0x708b, 0x0019,
-	0x080c, 0x40b2, 0x20a3, 0x1106, 0x20a3, 0x0000, 0x3430, 0x2099,
-	0x908e, 0x2039, 0x900e, 0x27a0, 0x20a9, 0x0040, 0x53a3, 0x080c,
-	0x40f5, 0x11e8, 0x2728, 0x2514, 0x8207, 0xa084, 0x00ff, 0x8000,
-	0x2018, 0xa294, 0x00ff, 0x8007, 0xa205, 0x202a, 0x7050, 0x2310,
-	0x8214, 0xa2a0, 0x900e, 0x2414, 0xa38c, 0x0001, 0x0118, 0xa294,
-	0xff00, 0x0018, 0xa294, 0x00ff, 0x8007, 0xa215, 0x2222, 0x2798,
-	0x26a0, 0x20a9, 0x0040, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000,
-	0x60c3, 0x0084, 0x080c, 0x4024, 0x0005, 0x00f6, 0x7080, 0xa005,
-	0x01d0, 0x2011, 0x3fe7, 0x080c, 0x560d, 0xa086, 0x0084, 0x1188,
-	0x2079, 0x9080, 0x7a30, 0xa296, 0x1107, 0x1158, 0x7834, 0xa005,
-	0x1140, 0x7087, 0x0001, 0x080c, 0x4098, 0x708b, 0x001a, 0x0029,
-	0x0010, 0x7083, 0x0000, 0x00fe, 0x0005, 0x708b, 0x001b, 0x20e1,
-	0x9080, 0x20e1, 0x4000, 0x2099, 0x9080, 0x20a1, 0x020b, 0x7480,
-	0xa480, 0x0018, 0xa080, 0x0007, 0xa084, 0x03f8, 0x8004, 0x20a8,
-	0x53a6, 0x60c3, 0x0084, 0x080c, 0x4024, 0x0005, 0x0005, 0x0005,
-	0x0086, 0x0096, 0x2029, 0x8b52, 0x252c, 0x20a9, 0x0008, 0x2041,
-	0x900e, 0x28a0, 0x2099, 0x908e, 0x53a3, 0x20a9, 0x0008, 0x2011,
-	0x0007, 0xd5d4, 0x0110, 0x2011, 0x0000, 0x2800, 0xa200, 0x200c,
-	0xa1a6, 0xffff, 0x1148, 0xd5d4, 0x0110, 0x8210, 0x0008, 0x8211,
-	0x1f04, 0x3f35, 0x0804, 0x3fa3, 0x82ff, 0x1160, 0xd5d4, 0x0120,
-	0xa1a6, 0x3fff, 0x0d90, 0x0020, 0xa1a6, 0x3fff, 0x0904, 0x3fa3,
-	0xa18d, 0xc000, 0x20a9, 0x0010, 0x2019, 0x0001, 0xd5d4, 0x0110,
-	0x2019, 0x0010, 0x2120, 0xd5d4, 0x0110, 0x8423, 0x0008, 0x8424,
-	0x1240, 0xd5d4, 0x0110, 0x8319, 0x0008, 0x8318, 0x1f04, 0x3f5b,
-	0x04d0, 0x23a8, 0x2021, 0x0001, 0x8426, 0x8425, 0x1f04, 0x3f6d,
-	0x2328, 0x8529, 0xa2be, 0x0007, 0x0158, 0x0006, 0x2039, 0x0007,
-	0x2200, 0xa73a, 0x000e, 0x27a8, 0xa5a8, 0x0010, 0x1f04, 0x3f7c,
-	0x754e, 0xa5c8, 0x263d, 0x292d, 0xa5ac, 0x00ff, 0x7572, 0x6532,
-	0x6536, 0x0016, 0x2508, 0x080c, 0x2313, 0x001e, 0x60e7, 0x0000,
-	0x65ea, 0x2018, 0x2304, 0xa405, 0x201a, 0x7077, 0x0001, 0x26a0,
-	0x2898, 0x20a9, 0x0008, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000,
-	0xa085, 0x0001, 0x0028, 0xa006, 0x0018, 0xa006, 0x080c, 0x1410,
-	0x009e, 0x008e, 0x0005, 0x2118, 0x2021, 0x0000, 0x2001, 0x0007,
-	0xa39a, 0x0010, 0x0218, 0x8420, 0x8001, 0x0cd0, 0x2118, 0x84ff,
-	0x0120, 0xa39a, 0x0010, 0x8421, 0x1de0, 0x2021, 0x0001, 0x83ff,
-	0x0118, 0x8423, 0x8319, 0x1de8, 0xa238, 0x2704, 0xa42c, 0x11b8,
-	0xa405, 0x203a, 0x714e, 0xa1a0, 0x263d, 0x242d, 0xa5ac, 0x00ff,
-	0x7572, 0x6532, 0x6536, 0x0016, 0x2508, 0x080c, 0x2313, 0x001e,
-	0x60e7, 0x0000, 0x65ea, 0x7077, 0x0001, 0xa084, 0x0000, 0x0005,
-	0x00e6, 0x2071, 0x8b00, 0x707b, 0x0000, 0x00ee, 0x0005, 0x00e6,
-	0x00f6, 0x2079, 0x0100, 0x2071, 0x0140, 0x080c, 0x66f7, 0x7004,
-	0xa084, 0x4000, 0x0120, 0x7003, 0x1000, 0x7003, 0x0000, 0x080c,
-	0x4c4a, 0x01b0, 0x080c, 0x4c68, 0x1198, 0x2001, 0x8d9c, 0x2003,
-	0xaaaa, 0x2001, 0x0204, 0x2004, 0x0016, 0x2009, 0x8d8d, 0x200a,
-	0x001e, 0x2001, 0x8d9d, 0x2003, 0x0000, 0x080c, 0x4b8b, 0x0080,
-	0x0126, 0x2091, 0x8000, 0x2071, 0x8b22, 0x2073, 0x0000, 0x7840,
-	0x0026, 0xa094, 0x0010, 0xa285, 0x0080, 0x7842, 0x7a42, 0x002e,
-	0x012e, 0x00fe, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x2011,
-	0x8db4, 0x2013, 0x0000, 0x7083, 0x0000, 0x012e, 0x20e1, 0x9080,
-	0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c, 0x66ee, 0x2009, 0x07d0,
-	0x2011, 0x3fe7, 0x080c, 0x568c, 0x0005, 0x0016, 0x0026, 0x00c6,
-	0x0126, 0x2091, 0x8000, 0x2009, 0x00f7, 0x080c, 0x40be, 0x2061,
-	0x8dbd, 0x601b, 0x0000, 0x601f, 0x0000, 0x2061, 0x8b00, 0x6003,
-	0x0001, 0x2061, 0x0100, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009,
-	0x001e, 0x2011, 0x4062, 0x080c, 0x5601, 0x012e, 0x00ce, 0x002e,
-	0x001e, 0x0005, 0x00e6, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071,
-	0x0100, 0x080c, 0x66f7, 0x2071, 0x0140, 0x7004, 0xa084, 0x4000,
-	0x0120, 0x7003, 0x1000, 0x7003, 0x0000, 0x080c, 0x4c4a, 0x01b0,
-	0x080c, 0x4c68, 0x1198, 0x2001, 0x8d9c, 0x2003, 0xaaaa, 0x2001,
-	0x0204, 0x2004, 0x0016, 0x2009, 0x8d8d, 0x200a, 0x001e, 0x2001,
-	0x8d9d, 0x2003, 0x0000, 0x080c, 0x4b8b, 0x0030, 0x2001, 0x0001,
-	0x080c, 0x2298, 0x080c, 0x403d, 0x012e, 0x000e, 0x00ee, 0x0005,
-	0x20a9, 0x0040, 0x20a1, 0x91c0, 0x2099, 0x908e, 0x3304, 0x8007,
-	0x20a2, 0x9398, 0x94a0, 0x1f04, 0x409e, 0x0005, 0x20e1, 0x9080,
-	0x20e1, 0x4000, 0x2099, 0x9000, 0x20a1, 0x020b, 0x20a9, 0x000c,
-	0x53a6, 0x0005, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, 0x9080,
-	0x20a1, 0x020b, 0x20a9, 0x000c, 0x53a6, 0x0005, 0x00c6, 0x0006,
-	0x2061, 0x0100, 0x810f, 0x2001, 0x8b2f, 0x2004, 0xa005, 0x1138,
-	0x2001, 0x8b14, 0x2004, 0xa084, 0x00ff, 0xa105, 0x0010, 0xa185,
-	0x00f7, 0x604a, 0x000e, 0x00ce, 0x0005, 0x0016, 0x0046, 0x2001,
-	0x8b52, 0x2004, 0xd0a4, 0x0158, 0xa006, 0x2020, 0x2009, 0x002a,
-	0x080c, 0x8982, 0x2001, 0x8b0c, 0x200c, 0xc195, 0x2102, 0x2019,
-	0x002a, 0x080c, 0x2542, 0x004e, 0x001e, 0x0005, 0x080c, 0x403d,
-	0x708b, 0x0000, 0x7083, 0x0000, 0x0005, 0x0006, 0x2001, 0x8b0c,
-	0x2004, 0xd09c, 0x0100, 0x000e, 0x0005, 0x0006, 0x0016, 0x0126,
-	0x2091, 0x8000, 0x2001, 0x0101, 0x200c, 0xa18d, 0x0006, 0x2102,
-	0x012e, 0x001e, 0x000e, 0x0005, 0x0156, 0x20a9, 0x00ff, 0x2009,
-	0x8c34, 0xa006, 0x200a, 0x8108, 0x1f04, 0x4112, 0x015e, 0x0005,
-	0x00d6, 0x0036, 0x0156, 0x0136, 0x0146, 0x2069, 0x8b51, 0xa006,
-	0x6002, 0x6007, 0x0707, 0x600a, 0x600e, 0x6012, 0xa198, 0x263d,
-	0x231d, 0xa39c, 0x00ff, 0x6316, 0x20a9, 0x0004, 0xac98, 0x0006,
-	0x23a0, 0x40a4, 0x20a9, 0x0004, 0xac98, 0x000a, 0x23a0, 0x40a4,
-	0x603e, 0x6042, 0x604e, 0x6052, 0x6056, 0x605a, 0x605e, 0x6062,
-	0x6066, 0x606a, 0x606e, 0x6072, 0x6076, 0x607a, 0x607e, 0x6082,
-	0x6086, 0x608a, 0x608e, 0x6092, 0x6096, 0x609a, 0x609e, 0x61a2,
-	0x00d6, 0x60a4, 0xa06d, 0x0110, 0x080c, 0x149f, 0x60a7, 0x0000,
-	0x60a8, 0xa06d, 0x0110, 0x080c, 0x149f, 0x60ab, 0x0000, 0x00de,
-	0xa006, 0x604a, 0x6810, 0x603a, 0x680c, 0x6046, 0x6814, 0xa084,
-	0x00ff, 0x6042, 0x014e, 0x013e, 0x015e, 0x003e, 0x00de, 0x0005,
-	0x0126, 0x2091, 0x8000, 0x6944, 0x6e48, 0xa684, 0x3fff, 0xa082,
-	0x4000, 0x1a04, 0x4201, 0xa18c, 0xff00, 0x810f, 0xa182, 0x00ff,
-	0x1a04, 0x4206, 0x2001, 0x8b0c, 0x2004, 0xa084, 0x0003, 0x1904,
-	0x41ef, 0xa188, 0x8c34, 0x2104, 0xa065, 0x0904, 0x41db, 0x6004,
-	0xa084, 0x00ff, 0xa08e, 0x0006, 0x1904, 0x41e0, 0x60a4, 0xa00d,
-	0x0118, 0x080c, 0x4509, 0x05d0, 0x60a8, 0xa00d, 0x0188, 0x080c,
-	0x4553, 0x1170, 0x694c, 0xd1fc, 0x1118, 0x080c, 0x429a, 0x0448,
-	0x080c, 0x425c, 0x694c, 0xd1ec, 0x1520, 0x080c, 0x4404, 0x0408,
-	0x694c, 0xa184, 0xa000, 0x0178, 0xd1ec, 0x0140, 0xd1fc, 0x0118,
-	0x080c, 0x4413, 0x0028, 0x080c, 0x4413, 0x0028, 0xd1fc, 0x0118,
-	0x080c, 0x425c, 0x0070, 0x6050, 0xa00d, 0x0130, 0x2d00, 0x200a,
-	0x6803, 0x0000, 0x6052, 0x0028, 0x2d00, 0x6052, 0x604e, 0x6803,
-	0x0000, 0x080c, 0x58b9, 0xa006, 0x012e, 0x0005, 0x2001, 0x0005,
-	0x2009, 0x0000, 0x0478, 0x2001, 0x0028, 0x2009, 0x0000, 0x0450,
-	0xa082, 0x0006, 0x1260, 0x2001, 0x8b32, 0x2004, 0xd0ac, 0x1120,
-	0x60a0, 0xd0bc, 0x0904, 0x4196, 0x2001, 0x0028, 0x0078, 0x2009,
-	0x8b0c, 0x210c, 0xd18c, 0x0118, 0x2001, 0x0004, 0x0038, 0xd184,
-	0x0118, 0x2001, 0x0004, 0x0010, 0x2001, 0x0029, 0x2009, 0x0000,
-	0x0048, 0x2001, 0x0029, 0x2009, 0x0000, 0x0020, 0x2001, 0x0029,
-	0x2009, 0x0000, 0xa005, 0x012e, 0x0005, 0x6944, 0x6e48, 0xa684,
-	0x3fff, 0xa082, 0x4000, 0x1678, 0xa18c, 0xff00, 0x810f, 0xa182,
-	0x00ff, 0x12e0, 0xa188, 0x8c34, 0x2104, 0xa065, 0x01b8, 0x6004,
-	0xa084, 0x00ff, 0xa08e, 0x0006, 0x11b0, 0x684c, 0xd0ec, 0x0120,
-	0x080c, 0x4413, 0x0489, 0x0030, 0x0479, 0x684c, 0xd0fc, 0x0110,
-	0x080c, 0x4404, 0x080c, 0x4451, 0xa006, 0x0088, 0x2001, 0x0028,
-	0x2009, 0x0000, 0x0060, 0xa082, 0x0006, 0x0e38, 0x2001, 0x0029,
-	0x2009, 0x0000, 0x0020, 0x2001, 0x0029, 0x2009, 0x0000, 0xa005,
-	0x0005, 0x0126, 0x2091, 0x8000, 0x6050, 0xa00d, 0x0138, 0x2d00,
-	0x200a, 0x6803, 0x0000, 0x6052, 0x012e, 0x0005, 0x2d00, 0x6052,
-	0x604e, 0x6803, 0x0000, 0x0cc0, 0x0126, 0x2091, 0x8000, 0x604c,
-	0xa005, 0x0170, 0x00e6, 0x2071, 0x8daa, 0x7004, 0xa086, 0x0002,
-	0x0168, 0x00ee, 0x604c, 0x6802, 0x2d00, 0x604e, 0x012e, 0x0005,
-	0x2d00, 0x6052, 0x604e, 0x6803, 0x0000, 0x0cc0, 0x701c, 0xac06,
-	0x1d80, 0x604c, 0x2070, 0x7000, 0x6802, 0x2d00, 0x7002, 0x00ee,
-	0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x604c, 0xa06d, 0x0130,
-	0x6800, 0xa005, 0x1108, 0x6052, 0x604e, 0xad05, 0x012e, 0x0005,
-	0x604c, 0xa06d, 0x0130, 0x6800, 0xa005, 0x1108, 0x6052, 0x604e,
-	0xad05, 0x0005, 0x6803, 0x0000, 0x6084, 0xa00d, 0x0120, 0x2d00,
-	0x200a, 0x6086, 0x0005, 0x2d00, 0x6086, 0x6082, 0x0cd8, 0x0126,
-	0x00c6, 0x0026, 0x2091, 0x8000, 0x6218, 0x2260, 0x6200, 0xa005,
-	0x0110, 0xc285, 0x0008, 0xc284, 0x6202, 0x002e, 0x00ce, 0x012e,
-	0x0005, 0x0126, 0x00c6, 0x2091, 0x8000, 0x6218, 0x2260, 0x6204,
-	0xa294, 0xff00, 0xa215, 0x6206, 0x00ce, 0x012e, 0x0005, 0x0126,
-	0x00c6, 0x2091, 0x8000, 0x6218, 0x2260, 0x6204, 0xa294, 0x00ff,
-	0x8007, 0xa215, 0x6206, 0x00ce, 0x012e, 0x0005, 0x0026, 0xa182,
-	0x00ff, 0x0218, 0xa085, 0x0001, 0x00b0, 0xa190, 0x8c34, 0x2204,
-	0xa065, 0x1180, 0x0016, 0x00d6, 0x080c, 0x146f, 0x2d60, 0x00de,
-	0x001e, 0x0d80, 0x2c00, 0x2012, 0x60a7, 0x0000, 0x60ab, 0x0000,
-	0x080c, 0x4118, 0xa006, 0x002e, 0x0005, 0x0026, 0xa182, 0x00ff,
-	0x0218, 0xa085, 0x0001, 0x0060, 0x00d6, 0xa190, 0x8c34, 0x2204,
-	0xa06d, 0x0120, 0x2013, 0x0000, 0x080c, 0x149f, 0x00de, 0xa006,
-	0x002e, 0x0005, 0x0016, 0xa182, 0x00ff, 0x0218, 0xa085, 0x0001,
-	0x0030, 0xa188, 0x8c34, 0x2104, 0xa065, 0x0dc0, 0xa006, 0x001e,
-	0x0005, 0x00d6, 0x0156, 0x0136, 0x0146, 0x600b, 0x0000, 0x600f,
-	0x0000, 0x6000, 0xc08c, 0x6002, 0x080c, 0x4c42, 0x1538, 0x60a0,
-	0xa086, 0x007e, 0x2069, 0x9090, 0x0130, 0x2001, 0x8b32, 0x2004,
-	0xd0ac, 0x11e0, 0x0098, 0x2d04, 0xd0e4, 0x01c0, 0x00d6, 0x2069,
-	0x908e, 0x00c6, 0x2061, 0x8d9e, 0x6810, 0x2062, 0x6814, 0x6006,
-	0x6818, 0x600a, 0x681c, 0x600e, 0x00ce, 0x00de, 0x8d69, 0x2d04,
-	0x2069, 0x0140, 0x6886, 0x2069, 0x8b00, 0x689e, 0x2069, 0x908e,
-	0x6808, 0x605e, 0x6810, 0x6062, 0x6138, 0xa10a, 0x0208, 0x603a,
-	0x6814, 0x6066, 0x2099, 0x9096, 0xac88, 0x000a, 0x21a0, 0x20a9,
-	0x0004, 0x53a3, 0x2099, 0x909a, 0xac88, 0x0006, 0x21a0, 0x20a9,
-	0x0004, 0x53a3, 0x2069, 0x90ae, 0x6808, 0x606a, 0x690c, 0x616e,
-	0x6810, 0x6072, 0x6818, 0x6076, 0xa182, 0x0211, 0x1218, 0x2009,
-	0x0008, 0x0400, 0xa182, 0x0259, 0x1218, 0x2009, 0x0007, 0x00d0,
-	0xa182, 0x02c1, 0x1218, 0x2009, 0x0006, 0x00a0, 0xa182, 0x0349,
-	0x1218, 0x2009, 0x0005, 0x0070, 0xa182, 0x0421, 0x1218, 0x2009,
-	0x0004, 0x0040, 0xa182, 0x0581, 0x1218, 0x2009, 0x0003, 0x0010,
-	0x2009, 0x0002, 0x6192, 0x014e, 0x013e, 0x015e, 0x00de, 0x0005,
-	0x00e6, 0x2071, 0x908d, 0x2e04, 0x6896, 0x2071, 0x908e, 0x7004,
-	0x689a, 0x701c, 0x689e, 0x00ee, 0x0005, 0x00d6, 0x0126, 0x2091,
-	0x8000, 0x60a4, 0xa06d, 0x01c0, 0x6900, 0x81ff, 0x1540, 0x6a04,
-	0xa282, 0x0010, 0x1648, 0xad88, 0x0004, 0x20a9, 0x0010, 0x2104,
-	0xa086, 0xffff, 0x0128, 0x8108, 0x1f04, 0x43bf, 0x080c, 0x1410,
-	0x260a, 0x8210, 0x6a06, 0x0098, 0x080c, 0x1488, 0x01a8, 0x2d00,
-	0x60a6, 0x6803, 0x0000, 0xad88, 0x0004, 0x20a9, 0x0010, 0x200b,
-	0xffff, 0x8108, 0x1f04, 0x43d7, 0x6807, 0x0001, 0x6e12, 0xa085,
-	0x0001, 0x012e, 0x00de, 0x0005, 0xa006, 0x0cd8, 0x0126, 0x2091,
-	0x8000, 0x00d6, 0x60a4, 0xa00d, 0x01a0, 0x2168, 0x6800, 0xa005,
-	0x1160, 0x080c, 0x4509, 0x1168, 0x200b, 0xffff, 0x6804, 0xa08a,
-	0x0002, 0x0218, 0x8001, 0x6806, 0x0020, 0x080c, 0x149f, 0x60a7,
-	0x0000, 0x00de, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x080c,
-	0x4566, 0x0010, 0x080c, 0x4249, 0x080c, 0x4488, 0x1dd8, 0x080c,
-	0x4451, 0x012e, 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x60a8,
-	0xa06d, 0x01c0, 0x6950, 0x81ff, 0x1540, 0x6a54, 0xa282, 0x0010,
-	0x1670, 0xad88, 0x0018, 0x20a9, 0x0010, 0x2104, 0xa086, 0xffff,
-	0x0128, 0x8108, 0x1f04, 0x4425, 0x080c, 0x1410, 0x260a, 0x8210,
-	0x6a56, 0x0098, 0x080c, 0x1488, 0x01d0, 0x2d00, 0x60aa, 0x6853,
-	0x0000, 0xad88, 0x0018, 0x20a9, 0x0010, 0x200b, 0xffff, 0x8108,
-	0x1f04, 0x443d, 0x6857, 0x0001, 0x6e62, 0x0010, 0x080c, 0x429a,
-	0x0089, 0x1de0, 0xa085, 0x0001, 0x012e, 0x00de, 0x0005, 0xa006,
-	0x0cd8, 0x0126, 0x2091, 0x8000, 0x080c, 0x58b9, 0x012e, 0x0005,
-	0xa01e, 0x0010, 0x2019, 0x0001, 0xa00e, 0x0126, 0x2091, 0x8000,
-	0x604c, 0x2068, 0x6000, 0xd0dc, 0x1170, 0x8dff, 0x01e8, 0x83ff,
-	0x0120, 0x6848, 0xa606, 0x0158, 0x0030, 0x683c, 0xa406, 0x1118,
-	0x6840, 0xa506, 0x0120, 0x2d08, 0x6800, 0x2068, 0x0c70, 0x6a00,
-	0x604c, 0xad06, 0x1110, 0x624e, 0x0018, 0xa180, 0x0000, 0x2202,
-	0x82ff, 0x1110, 0x6152, 0x8dff, 0x012e, 0x0005, 0xa01e, 0x0010,
-	0x2019, 0x0001, 0xa00e, 0x6080, 0x2068, 0x8dff, 0x01e8, 0x83ff,
-	0x0120, 0x6848, 0xa606, 0x0158, 0x0030, 0x683c, 0xa406, 0x1118,
-	0x6840, 0xa506, 0x0120, 0x2d08, 0x6800, 0x2068, 0x0c70, 0x6a00,
-	0x6080, 0xad06, 0x1110, 0x6282, 0x0018, 0xa180, 0x0000, 0x2202,
-	0x82ff, 0x1110, 0x6186, 0x8dff, 0x0005, 0xa016, 0x080c, 0x4503,
-	0x1110, 0x2011, 0x0001, 0x080c, 0x454d, 0x1110, 0xa295, 0x0002,
-	0x0005, 0x080c, 0x457e, 0x0118, 0x080c, 0x7c4c, 0x0010, 0xa085,
-	0x0001, 0x0005, 0x080c, 0x457e, 0x0118, 0x080c, 0x7bd9, 0x0010,
-	0xa085, 0x0001, 0x0005, 0x080c, 0x457e, 0x0118, 0x080c, 0x7c1f,
-	0x0010, 0xa085, 0x0001, 0x0005, 0x080c, 0x457e, 0x0118, 0x080c,
-	0x7bf3, 0x0010, 0xa085, 0x0001, 0x0005, 0x080c, 0x457e, 0x0118,
-	0x080c, 0x7c79, 0x0010, 0xa085, 0x0001, 0x0005, 0x0126, 0x0006,
-	0x00d6, 0x2091, 0x8000, 0x6080, 0xa06d, 0x0168, 0x6800, 0x0006,
-	0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x080c, 0x7dc8, 0x080c,
-	0x46a1, 0x000e, 0x0c88, 0x6083, 0x0000, 0x6087, 0x0000, 0x00de,
-	0x000e, 0x012e, 0x0005, 0x60a4, 0xa00d, 0x1118, 0xa085, 0x0001,
-	0x0005, 0x00e6, 0x2170, 0x7000, 0xa005, 0x1160, 0x20a9, 0x0010,
-	0xae88, 0x0004, 0x2104, 0xa606, 0x0128, 0x8108, 0x1f04, 0x4512,
-	0xa085, 0x0001, 0xa006, 0x00ee, 0x0005, 0x00d6, 0x0126, 0x2091,
-	0x8000, 0x60a4, 0xa06d, 0x1128, 0x080c, 0x1488, 0x01a0, 0x2d00,
-	0x60a6, 0x6803, 0x0001, 0x6807, 0x0000, 0xad88, 0x0004, 0x20a9,
-	0x0010, 0x200b, 0xffff, 0x8108, 0x1f04, 0x4531, 0xa085, 0x0001,
-	0x012e, 0x00de, 0x0005, 0xa006, 0x0cd8, 0x00d6, 0x0126, 0x2091,
-	0x8000, 0x60a4, 0xa06d, 0x0130, 0x60a7, 0x0000, 0x080c, 0x149f,
-	0xa085, 0x0001, 0x012e, 0x00de, 0x0005, 0x60a8, 0xa00d, 0x1118,
-	0xa085, 0x0001, 0x0005, 0x00e6, 0x2170, 0x7050, 0xa005, 0x1160,
-	0x20a9, 0x0010, 0xae88, 0x0018, 0x2104, 0xa606, 0x0128, 0x8108,
-	0x1f04, 0x455c, 0xa085, 0x0001, 0x00ee, 0x0005, 0x0126, 0x2091,
-	0x8000, 0x0c19, 0x1188, 0x200b, 0xffff, 0x00d6, 0x60a8, 0x2068,
-	0x6854, 0xa08a, 0x0002, 0x0218, 0x8001, 0x6856, 0x0020, 0x080c,
-	0x149f, 0x60ab, 0x0000, 0x00de, 0x012e, 0x0005, 0x609c, 0xd0a4,
-	0x0005, 0x00f6, 0x2079, 0x8b51, 0x7804, 0xd0a4, 0x0518, 0x0156,
-	0x00c6, 0x20a9, 0x007f, 0x2009, 0x0000, 0x0016, 0x080c, 0x430a,
-	0x1168, 0x6004, 0xa084, 0xff00, 0x8007, 0xa096, 0x0004, 0x0118,
-	0xa086, 0x0006, 0x1118, 0x6000, 0xc0ed, 0x6002, 0x001e, 0x8108,
-	0x1f04, 0x458d, 0x00ce, 0x015e, 0x2009, 0x07d0, 0x2011, 0x45ac,
-	0x080c, 0x568c, 0x00fe, 0x0005, 0x2011, 0x45ac, 0x080c, 0x560d,
-	0x0156, 0x00c6, 0x20a9, 0x007f, 0x2009, 0x0000, 0x0016, 0x080c,
-	0x430a, 0x1530, 0x6000, 0xd0ec, 0x0518, 0x0046, 0x62a0, 0xa294,
-	0x00ff, 0x8227, 0xa006, 0x2009, 0x0029, 0x080c, 0x8982, 0x6000,
-	0xc0e5, 0xc0ec, 0x6002, 0x6004, 0xa084, 0x00ff, 0xa085, 0x0700,
-	0x6006, 0x2019, 0x0029, 0x080c, 0x59d5, 0x0086, 0x2041, 0x0000,
-	0x080c, 0x5911, 0x2009, 0x0000, 0x080c, 0x878f, 0x008e, 0x004e,
-	0x001e, 0x8108, 0x1f04, 0x45b6, 0x00ce, 0x015e, 0x0005, 0x00c6,
-	0x6018, 0x2060, 0x6000, 0xc0ec, 0x6002, 0x00ce, 0x0005, 0x2071,
-	0x8c13, 0x7003, 0x0001, 0x7007, 0x0000, 0x7013, 0x0000, 0x7017,
-	0x0000, 0x701b, 0x0000, 0x701f, 0x0000, 0x704b, 0x0001, 0x704f,
-	0x0000, 0x705b, 0x0020, 0x705f, 0x0040, 0x707f, 0x0000, 0x2071,
-	0x8d7c, 0x7003, 0x8c13, 0x7007, 0x0000, 0x700b, 0x0000, 0x700f,
-	0x8d5c, 0x7013, 0x0020, 0x7017, 0x0040, 0x7037, 0x0000, 0x0005,
-	0x0016, 0x00e6, 0x2071, 0x8d34, 0xa00e, 0x7186, 0x718a, 0x7097,
-	0x0001, 0x2001, 0x8b52, 0x2004, 0xd0fc, 0x1148, 0x2001, 0x8b52,
-	0x2004, 0xa00e, 0xd09c, 0x0108, 0x8108, 0x7102, 0x04f0, 0x2001,
-	0x8b71, 0x200c, 0xa184, 0x000f, 0x2009, 0x8b72, 0x210c, 0x0002,
-	0x4626, 0x4648, 0x464f, 0x4659, 0x465e, 0x4626, 0x4626, 0x4626,
-	0x4626, 0x4626, 0x4626, 0x4626, 0x4626, 0x4626, 0x4626, 0x4626,
-	0x708f, 0x0005, 0x7007, 0x0122, 0x2001, 0x0002, 0x0030, 0x708f,
-	0x0002, 0x7007, 0x0121, 0x2001, 0x0003, 0x7002, 0x7097, 0x0001,
-	0x0088, 0x7007, 0x0122, 0x2001, 0x0002, 0x0020, 0x7007, 0x0121,
-	0x2001, 0x0003, 0x7002, 0xa006, 0x7096, 0x708e, 0xa184, 0xff00,
-	0x8007, 0x709a, 0xa184, 0x00ff, 0x7092, 0x00ee, 0x001e, 0x0005,
-	0x00e6, 0x2071, 0x8c13, 0x684c, 0xa005, 0x1130, 0x7028, 0xc085,
-	0x702a, 0xa085, 0x0001, 0x0418, 0x6a60, 0x7236, 0x6b64, 0x733a,
-	0x6868, 0x703e, 0x7076, 0x686c, 0x7042, 0x707a, 0x684c, 0x702e,
-	0x6844, 0x7032, 0x2009, 0x000d, 0x200a, 0x8007, 0x8006, 0x8006,
-	0xa08c, 0x003f, 0xa084, 0xffc0, 0xa210, 0x2100, 0xa319, 0x726e,
-	0x7372, 0x7028, 0xc084, 0x702a, 0x7007, 0x0001, 0xa006, 0x00ee,
-	0x0005, 0x0156, 0x00e6, 0x0026, 0x6838, 0xd0fc, 0x1904, 0x46f9,
-	0x6804, 0xa00d, 0x0188, 0x00d6, 0x2071, 0x8b00, 0xa016, 0x702c,
-	0x2168, 0x6904, 0x206a, 0x8210, 0x2d00, 0x81ff, 0x1dc8, 0x702e,
-	0x70ac, 0xa200, 0x70ae, 0x00de, 0x2071, 0x8c13, 0x701c, 0xa005,
-	0x1904, 0x4709, 0x20a9, 0x0032, 0x0f04, 0x4707, 0x0e04, 0x46c4,
-	0x2071, 0x8d34, 0x7200, 0x82ff, 0x05d0, 0x6934, 0xa186, 0x0103,
-	0x1904, 0x4717, 0x6948, 0x6844, 0xa105, 0x1538, 0x2009, 0x8020,
-	0x2200, 0x0002, 0x4707, 0x46de, 0x472f, 0x473b, 0x2071, 0x0000,
-	0x20a9, 0x0032, 0x0f04, 0x4707, 0x7018, 0xd084, 0x1dd8, 0x7122,
-	0x683c, 0x7026, 0x6840, 0x702a, 0x701b, 0x0001, 0x2091, 0x4080,
-	0x2071, 0x8b00, 0x702c, 0x206a, 0x2d00, 0x702e, 0x70ac, 0x8000,
-	0x70ae, 0x002e, 0x00ee, 0x015e, 0x0005, 0x6844, 0xa086, 0x0100,
-	0x1130, 0x6868, 0xa005, 0x1118, 0x2009, 0x8020, 0x0888, 0x2071,
-	0x8c13, 0x2d08, 0x206b, 0x0000, 0x7010, 0x8000, 0x7012, 0x7018,
-	0xa06d, 0x711a, 0x0110, 0x6902, 0x0008, 0x711e, 0x0c10, 0xa18c,
-	0x00ff, 0xa186, 0x0017, 0x0130, 0xa186, 0x001e, 0x0118, 0xa18e,
-	0x001f, 0x1d28, 0x684c, 0xd0cc, 0x0d10, 0x6850, 0xa084, 0x00ff,
-	0xa086, 0x0001, 0x19e0, 0x2009, 0x8021, 0x0804, 0x46d8, 0x7084,
-	0x8008, 0xa092, 0x001e, 0x1a98, 0x7186, 0xae90, 0x0003, 0xa210,
-	0x683c, 0x2012, 0x0078, 0x7084, 0x8008, 0xa092, 0x000f, 0x1a38,
-	0x7186, 0xae90, 0x0003, 0x8003, 0xa210, 0x683c, 0x2012, 0x8210,
-	0x6840, 0x2012, 0x7088, 0xa10a, 0x0a04, 0x46f0, 0x718c, 0x7084,
-	0xa10a, 0x0a04, 0x46f0, 0x2071, 0x0000, 0x7018, 0xd084, 0x1904,
-	0x46f0, 0x2071, 0x8d34, 0x7000, 0xa086, 0x0002, 0x1150, 0x080c,
-	0x495f, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x0804,
-	0x46f0, 0x080c, 0x4989, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091,
-	0x4080, 0x0804, 0x46f0, 0x0006, 0x684c, 0x0006, 0x6837, 0x0103,
-	0x20a9, 0x001c, 0xad80, 0x0011, 0x20a0, 0x2001, 0x0000, 0x40a4,
-	0x000e, 0xa084, 0x00ff, 0x684e, 0x000e, 0x684a, 0x6952, 0x0005,
-	0x2071, 0x8c13, 0x7004, 0x0002, 0x4795, 0x47a5, 0x494a, 0x494b,
-	0x4958, 0x495e, 0x4796, 0x493b, 0x48e7, 0x0005, 0x0126, 0x2091,
-	0x8000, 0x0e04, 0x47a3, 0x2009, 0x000d, 0x7030, 0x200a, 0x2091,
-	0x4080, 0x7007, 0x0001, 0x012e, 0x0005, 0x2069, 0x8dbd, 0x683c,
-	0xa005, 0x03f8, 0x11f0, 0x0126, 0x2091, 0x8000, 0x2069, 0x0000,
-	0x6934, 0x2001, 0x8c1f, 0x2004, 0xa10a, 0x0170, 0x0e04, 0x47c8,
-	0x2069, 0x0000, 0x6818, 0xd084, 0x1158, 0x2009, 0x8040, 0x6922,
-	0x681b, 0x0001, 0x2091, 0x4080, 0x2069, 0x8dbd, 0x683f, 0xffff,
-	0x012e, 0x2069, 0x8b00, 0x6844, 0x6964, 0xa102, 0x2069, 0x8d34,
-	0x688a, 0x6984, 0x701c, 0xa06d, 0x0120, 0x81ff, 0x0904, 0x481e,
-	0x00a0, 0x81ff, 0x0904, 0x48bc, 0x2071, 0x8d34, 0x7184, 0x7088,
-	0xa10a, 0x1258, 0x7190, 0x2071, 0x8dbd, 0x7038, 0xa005, 0x0128,
-	0x1b04, 0x48bc, 0x713a, 0x0804, 0x48bc, 0x2071, 0x8d34, 0x718c,
-	0x0126, 0x2091, 0x8000, 0x7084, 0xa10a, 0x0a04, 0x48bd, 0x0e04,
-	0x487a, 0x2071, 0x0000, 0x7018, 0xd084, 0x1904, 0x487a, 0x2001,
-	0xffff, 0x2071, 0x8dbd, 0x703a, 0x2071, 0x8d34, 0x7000, 0xa086,
-	0x0002, 0x1150, 0x080c, 0x495f, 0x2071, 0x0000, 0x701b, 0x0001,
-	0x2091, 0x4080, 0x0804, 0x487a, 0x080c, 0x4989, 0x2071, 0x0000,
-	0x701b, 0x0001, 0x2091, 0x4080, 0x0804, 0x487a, 0x2071, 0x8d34,
-	0x7000, 0xa005, 0x0904, 0x489e, 0x6934, 0xa186, 0x0103, 0x1904,
-	0x487d, 0x6948, 0x6844, 0xa105, 0x1904, 0x4894, 0x2071, 0x8d34,
-	0x7000, 0x0002, 0x489e, 0x485e, 0x4836, 0x4848, 0x7084, 0x8008,
-	0xa092, 0x001e, 0x1a04, 0x48bc, 0xae90, 0x0003, 0xa210, 0x683c,
-	0x2012, 0x7186, 0x2071, 0x8c13, 0x080c, 0x49e2, 0x0804, 0x48bc,
-	0x7084, 0x8008, 0xa092, 0x000f, 0x1a04, 0x48bc, 0xae90, 0x0003,
-	0x8003, 0xa210, 0x683c, 0x2012, 0x8210, 0x6840, 0x2012, 0x7186,
-	0x2071, 0x8c13, 0x080c, 0x49e2, 0x0804, 0x48bc, 0x2009, 0x8020,
-	0x0126, 0x2091, 0x8000, 0x0e04, 0x487a, 0x2071, 0x0000, 0x7018,
-	0xd084, 0x1180, 0x7122, 0x683c, 0x7026, 0x6840, 0x702a, 0x701b,
-	0x0001, 0x2091, 0x4080, 0x012e, 0x2071, 0x8c13, 0x080c, 0x49e2,
-	0x0804, 0x48bc, 0x012e, 0x0804, 0x48bc, 0xa18c, 0x00ff, 0xa186,
-	0x0017, 0x0130, 0xa186, 0x001e, 0x0118, 0xa18e, 0x001f, 0x11b0,
-	0x684c, 0xd0cc, 0x0198, 0x6850, 0xa084, 0x00ff, 0xa086, 0x0001,
-	0x1168, 0x2009, 0x8021, 0x0860, 0x6844, 0xa086, 0x0100, 0x1130,
-	0x6868, 0xa005, 0x1118, 0x2009, 0x8020, 0x0810, 0x2071, 0x8c13,
-	0x080c, 0x49f4, 0x01c8, 0x2071, 0x8c13, 0x700f, 0x0001, 0x6934,
-	0xa184, 0x00ff, 0xa086, 0x0003, 0x1130, 0x810f, 0xa18c, 0x00ff,
-	0x8101, 0x0108, 0x710e, 0x7007, 0x0003, 0x080c, 0x4a0d, 0x7050,
-	0xa086, 0x0100, 0x0904, 0x494b, 0x0005, 0x2071, 0x8c13, 0x080c,
-	0x49f4, 0x0518, 0x2071, 0x8d34, 0x7084, 0x700a, 0x20a9, 0x0020,
-	0x2099, 0x8d35, 0x20a1, 0x8d5c, 0x53a3, 0x7087, 0x0000, 0x2071,
-	0x8c13, 0x2069, 0x8d7c, 0x706c, 0x6826, 0x7070, 0x682a, 0x7074,
-	0x682e, 0x7078, 0x6832, 0x2d10, 0x080c, 0x14d3, 0x7007, 0x0008,
-	0x2001, 0xffff, 0x2071, 0x8dbd, 0x703a, 0x012e, 0x08a8, 0x2069,
-	0x8d7c, 0x6808, 0xa08e, 0x0000, 0x0904, 0x493a, 0xa08e, 0x0200,
-	0x0904, 0x4938, 0xa08e, 0x0100, 0x1904, 0x493a, 0x0126, 0x2091,
-	0x8000, 0x0e04, 0x4936, 0x2069, 0x0000, 0x6818, 0xd084, 0x15b0,
-	0x702c, 0x7130, 0x8108, 0xa102, 0x0230, 0xa00e, 0x7034, 0x706e,
-	0x7038, 0x7072, 0x0048, 0x706c, 0xa080, 0x0040, 0x706e, 0x1220,
-	0x7070, 0xa081, 0x0000, 0x7072, 0x7132, 0x6936, 0x2001, 0x8d59,
-	0x2004, 0xa005, 0x1190, 0x6934, 0x2069, 0x8d34, 0x689c, 0x699e,
-	0x2069, 0x8dbd, 0xa102, 0x1118, 0x683c, 0xa005, 0x1368, 0x2001,
-	0x8d5a, 0x200c, 0x810d, 0x693e, 0x0038, 0x2009, 0x8040, 0x6922,
-	0x681b, 0x0001, 0x2091, 0x4080, 0x7007, 0x0001, 0x012e, 0x0010,
-	0x7007, 0x0005, 0x0005, 0x701c, 0xa06d, 0x0158, 0x080c, 0x49f4,
-	0x0140, 0x7007, 0x0003, 0x080c, 0x4a0d, 0x7050, 0xa086, 0x0100,
-	0x0110, 0x0005, 0x0005, 0x7050, 0xa09e, 0x0100, 0x1118, 0x7007,
-	0x0004, 0x0030, 0xa086, 0x0200, 0x1110, 0x7007, 0x0005, 0x0005,
-	0x080c, 0x49ae, 0x7006, 0x080c, 0x49e2, 0x0005, 0x0005, 0x00e6,
-	0x0156, 0x2071, 0x8d34, 0x7184, 0x81ff, 0x0500, 0xa006, 0x7086,
-	0xae80, 0x0003, 0x2071, 0x0000, 0x21a8, 0x2014, 0x7226, 0x8000,
-	0x0f04, 0x4983, 0x2014, 0x722a, 0x8000, 0x0f04, 0x4983, 0x2014,
-	0x722e, 0x8000, 0x0f04, 0x4983, 0x2014, 0x723a, 0x8000, 0x0f04,
-	0x4983, 0x2014, 0x723e, 0xa180, 0x8030, 0x7022, 0x015e, 0x00ee,
-	0x0005, 0x00e6, 0x0156, 0x2071, 0x8d34, 0x7184, 0x81ff, 0x01d8,
-	0xa006, 0x7086, 0xae80, 0x0003, 0x2071, 0x0000, 0x21a8, 0x2014,
-	0x7226, 0x8000, 0x2014, 0x722a, 0x8000, 0x0f04, 0x49a5, 0x2014,
-	0x723a, 0x8000, 0x2014, 0x723e, 0x0018, 0x2001, 0x8020, 0x0010,
-	0xa180, 0x8042, 0x7022, 0x015e, 0x00ee, 0x0005, 0x702c, 0x7130,
-	0x8108, 0xa102, 0x0230, 0xa00e, 0x7034, 0x706e, 0x7038, 0x7072,
-	0x0048, 0x706c, 0xa080, 0x0040, 0x706e, 0x1220, 0x7070, 0xa081,
-	0x0000, 0x7072, 0x7132, 0x700c, 0x8001, 0x700e, 0x11a0, 0x0126,
-	0x2091, 0x8000, 0x0e04, 0x49de, 0x2001, 0x000d, 0x2102, 0x2091,
-	0x4080, 0x2001, 0x0001, 0x012e, 0x0005, 0x2001, 0x000d, 0x2102,
-	0x2001, 0x0001, 0x0005, 0x2001, 0x0007, 0x0005, 0x2001, 0x0006,
-	0x012e, 0x0005, 0x701c, 0xa06d, 0x0170, 0x0126, 0x2091, 0x8000,
-	0x7010, 0x8001, 0x7012, 0x2d04, 0x701e, 0xa005, 0x1108, 0x701a,
-	0x012e, 0x080c, 0x149f, 0x0005, 0x2019, 0x000d, 0x2304, 0x230c,
-	0xa10e, 0x0130, 0x2304, 0x230c, 0xa10e, 0x0110, 0xa006, 0x0060,
-	0x732c, 0x8319, 0x7130, 0xa102, 0x1118, 0x2300, 0xa005, 0x0020,
-	0x0210, 0xa302, 0x0008, 0x8002, 0x0005, 0x2d00, 0x7026, 0xa080,
-	0x000d, 0x7056, 0x7053, 0x0000, 0x0126, 0x2091, 0x8000, 0x2009,
-	0x8dcd, 0x2104, 0xc08d, 0x200a, 0x012e, 0x080c, 0x14eb, 0x0005,
-	0x7088, 0xa08a, 0x0028, 0x1220, 0xa082, 0x001d, 0x0033, 0x0010,
-	0x080c, 0x1410, 0x6027, 0x1e00, 0x0005, 0x4ab8, 0x4a4a, 0x4a60,
-	0x4a88, 0x4aab, 0x4add, 0x4aef, 0x4a60, 0x4ac9, 0x4a37, 0x00d6,
-	0x2069, 0x0200, 0x6804, 0xa005, 0x1158, 0x6808, 0xa005, 0x1140,
-	0x708b, 0x0027, 0x7003, 0x0003, 0x6028, 0xa085, 0x0400, 0x602a,
-	0x00de, 0x0005, 0x6803, 0x0010, 0x6124, 0xd1e4, 0x1180, 0x080c,
-	0x4b52, 0xd1d4, 0x1150, 0xd1dc, 0x1128, 0xd1cc, 0x0140, 0x708b,
-	0x0020, 0x0028, 0x708b, 0x001d, 0x0010, 0x708b, 0x001f, 0x0005,
-	0x6803, 0x0008, 0x6124, 0xd1cc, 0x11e8, 0xd1dc, 0x11c0, 0xd1e4,
-	0x1198, 0xa184, 0x1e00, 0x11d8, 0x60e3, 0x0001, 0x600c, 0xc0b4,
-	0x600e, 0x080c, 0x4c72, 0x6803, 0x0000, 0x708b, 0x0027, 0x2001,
-	0x8b25, 0x2003, 0x0000, 0x0058, 0x708b, 0x001e, 0x0040, 0x708b,
-	0x001d, 0x0028, 0x708b, 0x0020, 0x0010, 0x708b, 0x001f, 0x0005,
-	0x60e3, 0x0001, 0x600c, 0xc0b4, 0x600e, 0x080c, 0x4c72, 0x6803,
-	0x0000, 0x6124, 0xd1d4, 0x11a0, 0xd1dc, 0x1178, 0xd1e4, 0x1150,
-	0xa184, 0x1e00, 0x1178, 0x708b, 0x0027, 0x2001, 0x8b25, 0x2003,
-	0x0000, 0x0040, 0x708b, 0x001e, 0x0028, 0x708b, 0x001d, 0x0010,
-	0x708b, 0x001f, 0x0005, 0x6803, 0x0020, 0x6124, 0xd1dc, 0x1128,
-	0xd1e4, 0x0128, 0x708b, 0x001e, 0x0010, 0x708b, 0x001d, 0x0005,
-	0x080c, 0x4b7e, 0x6124, 0xd1dc, 0x1158, 0x080c, 0x4b52, 0xd1d4,
-	0x1128, 0xd1e4, 0x0128, 0x708b, 0x001e, 0x0010, 0x708b, 0x001f,
-	0x0005, 0x6803, 0x0020, 0x6124, 0xd1d4, 0x1160, 0xd1cc, 0x1150,
-	0xd1dc, 0x1128, 0xd1e4, 0x0140, 0x708b, 0x001e, 0x0028, 0x708b,
-	0x001d, 0x0010, 0x708b, 0x0021, 0x0005, 0x080c, 0x4b7e, 0x6124,
-	0xd1d4, 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0140, 0x708b, 0x001e,
-	0x0028, 0x708b, 0x001d, 0x0010, 0x708b, 0x001f, 0x0005, 0x6803,
-	0x0010, 0x6124, 0xd1d4, 0x1178, 0xd1cc, 0x1150, 0xd1dc, 0x1128,
-	0xd1e4, 0x0158, 0x708b, 0x001e, 0x0040, 0x708b, 0x001d, 0x0028,
-	0x708b, 0x0020, 0x0010, 0x708b, 0x001f, 0x0005, 0x00c6, 0x00d6,
-	0x00e6, 0x0126, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x8b00,
-	0x2091, 0x8000, 0x080c, 0x4c42, 0x11b8, 0x7088, 0xa086, 0x0027,
-	0x1198, 0x6027, 0x0200, 0xe000, 0xe000, 0x6024, 0xd0cc, 0x0148,
-	0x2001, 0x8d9d, 0x2003, 0x0001, 0x2001, 0x8b00, 0x2003, 0x0001,
-	0x0420, 0x6028, 0xc0cd, 0x602a, 0x080c, 0x4c5e, 0x0150, 0x080c,
-	0x4c54, 0x1138, 0x2001, 0x0001, 0x080c, 0x2298, 0x080c, 0x4c15,
-	0x00a0, 0x080c, 0x4b7b, 0x0178, 0x2001, 0x0001, 0x080c, 0x2298,
-	0x7088, 0xa086, 0x001e, 0x0120, 0x7088, 0xa086, 0x0022, 0x1118,
-	0x708b, 0x0025, 0x0010, 0x708b, 0x0021, 0x012e, 0x00ee, 0x00de,
-	0x00ce, 0x0005, 0x0016, 0x0026, 0x2009, 0x0064, 0x2011, 0x4b5d,
-	0x080c, 0x5601, 0x002e, 0x001e, 0x0005, 0x00e6, 0x00f6, 0x0016,
-	0x080c, 0x66f7, 0x2071, 0x8b00, 0x080c, 0x4b06, 0x001e, 0x00fe,
-	0x00ee, 0x0005, 0x0026, 0x00e6, 0x2011, 0x4b5d, 0x2071, 0x8dbd,
-	0x701c, 0xa206, 0x1118, 0x7018, 0xa005, 0x0110, 0xa085, 0x0001,
-	0x00ee, 0x002e, 0x0005, 0x6020, 0xd09c, 0x0005, 0x6803, 0x0040,
-	0x0156, 0x20a9, 0x002d, 0x1d04, 0x4b83, 0x2091, 0x6000, 0x1f04,
-	0x4b83, 0x015e, 0x0005, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100,
-	0x2069, 0x0140, 0x2071, 0x8b00, 0x2001, 0x8d9d, 0x200c, 0xa186,
-	0x0000, 0x0158, 0xa186, 0x0001, 0x0158, 0xa186, 0x0002, 0x0158,
-	0xa186, 0x0003, 0x0158, 0x0804, 0x4c03, 0x708b, 0x0022, 0x0048,
-	0x708b, 0x0021, 0x0030, 0x708b, 0x0023, 0x0038, 0x708b, 0x0024,
-	0x0020, 0xa085, 0x0001, 0x080c, 0x4c82, 0x60e3, 0x0000, 0x6887,
-	0x0001, 0x2001, 0x0001, 0x080c, 0x233e, 0x0026, 0x2011, 0x0003,
-	0x080c, 0x695c, 0x002e, 0x7000, 0xa08e, 0x0004, 0x0118, 0x602b,
-	0x0028, 0x0010, 0x602b, 0x0020, 0x0156, 0x0126, 0x2091, 0x8000,
-	0x20a9, 0x0005, 0x6024, 0xd0ac, 0x0118, 0x012e, 0x015e, 0x04c8,
-	0x6803, 0x0080, 0x6803, 0x0000, 0x6904, 0xd1d4, 0x1130, 0x6803,
-	0x0100, 0x1f04, 0x4bd2, 0x080c, 0x4c8f, 0x012e, 0x015e, 0x080c,
-	0x4c54, 0x01a8, 0x6044, 0xa005, 0x0168, 0x6050, 0x0006, 0xa085,
-	0x0020, 0x6052, 0x080c, 0x4c8f, 0xa006, 0x8001, 0x1df0, 0x000e,
-	0x6052, 0x0028, 0x6804, 0xd0d4, 0x1110, 0x080c, 0x4c8f, 0x2001,
-	0x8d9d, 0x2003, 0x0004, 0x080c, 0x4a20, 0x080c, 0x4c54, 0x0148,
-	0x6804, 0xd0d4, 0x1130, 0xd0dc, 0x1100, 0x2001, 0x8d9d, 0x2003,
-	0x0000, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00d6, 0x00e6,
-	0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x8b00, 0x2001, 0x8d9c,
-	0x2003, 0x0000, 0x2001, 0x8d8d, 0x2003, 0x0000, 0x708b, 0x0000,
-	0x60e3, 0x0000, 0x6887, 0x0000, 0x2001, 0x0000, 0x080c, 0x233e,
-	0x6803, 0x0000, 0x6043, 0x0090, 0x6043, 0x0010, 0x2001, 0x8b25,
-	0x2003, 0x0000, 0x6027, 0xffff, 0x602b, 0x182f, 0x00ee, 0x00de,
-	0x00ce, 0x0005, 0x0006, 0x2001, 0x8d9c, 0x2004, 0xa086, 0xaaaa,
-	0x000e, 0x0005, 0x0006, 0x2001, 0x8b71, 0x2004, 0xa084, 0x0030,
-	0xa086, 0x0000, 0x000e, 0x0005, 0x0006, 0x2001, 0x8b71, 0x2004,
-	0xa084, 0x0030, 0xa086, 0x0030, 0x000e, 0x0005, 0x0006, 0x2001,
-	0x8b71, 0x2004, 0xa084, 0x0030, 0xa086, 0x0010, 0x000e, 0x0005,
-	0x0006, 0x2001, 0x8b71, 0x2004, 0xa084, 0x0030, 0xa086, 0x0020,
-	0x000e, 0x0005, 0x2001, 0x8b0c, 0x2004, 0xd0a4, 0x0150, 0x080c,
-	0x235e, 0x0036, 0x2019, 0x0028, 0x080c, 0x2542, 0x003e, 0xa006,
-	0x0009, 0x0005, 0x00e6, 0x2071, 0x8b0c, 0x2e04, 0x0118, 0xa085,
-	0x0010, 0x0010, 0xa084, 0xffef, 0x2072, 0x00ee, 0x0005, 0x6050,
-	0x0006, 0x60f0, 0x0006, 0x60ec, 0x0006, 0x600c, 0x0006, 0x6004,
-	0x0006, 0x6028, 0x0006, 0x602f, 0x0100, 0x602f, 0x0000, 0x602f,
-	0x0080, 0x602f, 0x0000, 0x000e, 0x602a, 0x000e, 0x6006, 0x000e,
-	0x600e, 0x000e, 0x60ee, 0x000e, 0x60f2, 0x60e3, 0x0000, 0x6887,
-	0x0001, 0x2001, 0x0001, 0x080c, 0x233e, 0x6803, 0x0080, 0x6803,
-	0x0000, 0x6803, 0x0020, 0x000e, 0x6052, 0x6050, 0x0005, 0x0156,
-	0x0016, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140,
-	0x2071, 0x8b00, 0x6028, 0xa084, 0xe1ff, 0x602a, 0x6027, 0x0200,
-	0x6803, 0x0010, 0x20a9, 0x04e2, 0x6024, 0xd0cc, 0x1188, 0x1d04,
-	0x4cd4, 0x2091, 0x6000, 0x1f04, 0x4cd4, 0x2001, 0x8d9d, 0x2003,
-	0x0001, 0x2001, 0x8b00, 0x2003, 0x0001, 0xa085, 0x0001, 0x0410,
-	0x6803, 0x0000, 0x20a9, 0x04e2, 0x6027, 0x1e00, 0x2009, 0x1e00,
-	0xe000, 0x6024, 0xa10c, 0x0138, 0x1d04, 0x4cec, 0x2091, 0x6000,
-	0x1f04, 0x4cec, 0x0c10, 0x6028, 0xa085, 0x1e00, 0x602a, 0x60e3,
-	0x0000, 0x709c, 0x6886, 0x2001, 0x8d8d, 0x2004, 0x080c, 0x233e,
-	0x60e2, 0xa006, 0x00ee, 0x00de, 0x00ce, 0x001e, 0x015e, 0x0005,
-	0x0156, 0x0016, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2071,
-	0x8b00, 0x2069, 0x0200, 0x6804, 0xa005, 0x1118, 0x6808, 0xa005,
-	0x0158, 0x6028, 0xa084, 0xfbff, 0x602a, 0x6027, 0x0400, 0x708b,
-	0x0026, 0x7003, 0x0001, 0x0460, 0x2069, 0x0140, 0x6803, 0x0008,
-	0x20a9, 0x04e2, 0x6027, 0x1e00, 0x2009, 0x1e00, 0xe000, 0x6024,
-	0xa10c, 0x0188, 0x1d04, 0x4d32, 0x2091, 0x6000, 0x1f04, 0x4d32,
-	0x2001, 0x8d9d, 0x2003, 0x0001, 0x2001, 0x8b00, 0x2003, 0x0001,
-	0xa085, 0x0001, 0x0068, 0x6803, 0x0000, 0x60e3, 0x0000, 0x709c,
-	0x6886, 0x2001, 0x8d8d, 0x2004, 0x080c, 0x233e, 0x60e2, 0xa006,
-	0x00ee, 0x00de, 0x00ce, 0x001e, 0x015e, 0x0005, 0x2071, 0x8be1,
-	0x7003, 0x0000, 0x7007, 0x0000, 0x700f, 0x0000, 0x702b, 0x0001,
-	0x704f, 0x0000, 0x7053, 0x0001, 0x705f, 0x0020, 0x7063, 0x0040,
-	0x7083, 0x0000, 0x708b, 0x0000, 0x708f, 0x0001, 0x70bf, 0x0000,
-	0x0005, 0x00e6, 0x2071, 0x8be1, 0x6848, 0xa005, 0x1130, 0x7028,
-	0xc085, 0x702a, 0xa085, 0x0001, 0x0428, 0x6a50, 0x7236, 0x6b54,
-	0x733a, 0x6858, 0x703e, 0x707a, 0x685c, 0x7042, 0x707e, 0x6848,
-	0x702e, 0x6840, 0x7032, 0x2009, 0x000c, 0x200a, 0x8007, 0x8006,
-	0x8006, 0xa08c, 0x003f, 0xa084, 0xffc0, 0xa210, 0x2100, 0xa319,
-	0x7272, 0x7376, 0x7028, 0xc084, 0x702a, 0x7007, 0x0001, 0x700f,
-	0x0000, 0xa006, 0x00ee, 0x0005, 0x2b78, 0x2071, 0x8be1, 0x7004,
-	0x0043, 0x700c, 0x0002, 0x4db8, 0x4daf, 0x4daf, 0x4daf, 0x4daf,
-	0x0005, 0x4e0e, 0x4e0f, 0x4e41, 0x4e42, 0x4e0c, 0x4e76, 0x4e7b,
-	0x4eac, 0x4ead, 0x4ec8, 0x4ec9, 0x4eca, 0x4ecb, 0x4ecc, 0x4ecd,
-	0x4f32, 0x4f59, 0x700c, 0x0002, 0x4dd1, 0x4e0c, 0x4e0c, 0x4e0d,
-	0x4e0d, 0x7830, 0x7930, 0xa106, 0x0120, 0x7830, 0x7930, 0xa106,
-	0x1510, 0x7030, 0xa10a, 0x01f8, 0x1210, 0x712c, 0xa10a, 0xa18a,
-	0x0002, 0x12d0, 0x080c, 0x146f, 0x01b0, 0x2d00, 0x705a, 0x7063,
-	0x0040, 0x2001, 0x0003, 0x7057, 0x0000, 0x0126, 0x0006, 0x2091,
-	0x8000, 0x2009, 0x8dcd, 0x2104, 0xc085, 0x200a, 0x000e, 0x700e,
-	0x012e, 0x080c, 0x14eb, 0x0005, 0x080c, 0x146f, 0x0de0, 0x2d00,
-	0x705a, 0x080c, 0x146f, 0x1108, 0x0c10, 0x2d00, 0x7086, 0x7063,
-	0x0080, 0x2001, 0x0004, 0x08f8, 0x0005, 0x0005, 0x0005, 0x700c,
-	0x0002, 0x4e16, 0x4e19, 0x4e27, 0x4e40, 0x4e40, 0x080c, 0x4dca,
-	0x0005, 0x0126, 0x8001, 0x700e, 0x7058, 0x0006, 0x080c, 0x51f4,
-	0x0120, 0x2091, 0x8000, 0x080c, 0x4dca, 0x00de, 0x0048, 0x0126,
-	0x8001, 0x700e, 0x080c, 0x51f4, 0x7058, 0x2068, 0x7084, 0x705a,
-	0x6803, 0x0000, 0x6807, 0x0000, 0x6834, 0xa084, 0x00ff, 0xa08a,
-	0x0020, 0x1218, 0x00db, 0x012e, 0x0005, 0x012e, 0x080c, 0x4ece,
-	0x0005, 0x0005, 0x0005, 0x00e6, 0x2071, 0x8be1, 0x700c, 0x0002,
-	0x4e4d, 0x4e4d, 0x4e4d, 0x4e4f, 0x4e52, 0x00ee, 0x0005, 0x700f,
-	0x0001, 0x0010, 0x700f, 0x0002, 0x00ee, 0x0005, 0x4ece, 0x4ece,
-	0x4eea, 0x4ece, 0x4fc5, 0x4ece, 0x4ece, 0x4ece, 0x4ece, 0x4ece,
-	0x4eea, 0x4ffe, 0x5041, 0x508a, 0x509e, 0x4ece, 0x4ece, 0x4f06,
-	0x4eea, 0x4ece, 0x4ece, 0x4f1a, 0x5128, 0x5143, 0x4ece, 0x4f06,
-	0x4ece, 0x4ece, 0x4ece, 0x4ece, 0x4f1a, 0x5143, 0x7020, 0x2068,
-	0x080c, 0x149f, 0x0005, 0x700c, 0x0002, 0x4e82, 0x4e85, 0x4e93,
-	0x4eab, 0x4eab, 0x080c, 0x4dca, 0x0005, 0x0126, 0x8001, 0x700e,
-	0x7058, 0x0006, 0x080c, 0x51f4, 0x0120, 0x2091, 0x8000, 0x080c,
-	0x4dca, 0x00de, 0x0048, 0x0126, 0x8001, 0x700e, 0x080c, 0x51f4,
-	0x7058, 0x2068, 0x7084, 0x705a, 0x6803, 0x0000, 0x6807, 0x0000,
-	0x6834, 0xa084, 0x00ff, 0xa08a, 0x001a, 0x1218, 0x003b, 0x012e,
-	0x0005, 0x012e, 0x0419, 0x0005, 0x0005, 0x0005, 0x4ece, 0x4eea,
-	0x4fb1, 0x4ece, 0x4eea, 0x4ece, 0x4eea, 0x4eea, 0x4ece, 0x4eea,
-	0x4fb1, 0x4eea, 0x4eea, 0x4eea, 0x4eea, 0x4eea, 0x4ece, 0x4eea,
-	0x4fb1, 0x4ece, 0x4ece, 0x4eea, 0x4ece, 0x4ece, 0x4ece, 0x4eea,
-	0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x7007, 0x0001,
-	0x6838, 0xa084, 0x00ff, 0xc0d5, 0x683a, 0x0126, 0x2091, 0x8000,
-	0x080c, 0x46a1, 0x012e, 0x0005, 0x7007, 0x0001, 0x6838, 0xa084,
-	0x00ff, 0xc0e5, 0x683a, 0x0126, 0x2091, 0x8000, 0x080c, 0x46a1,
-	0x012e, 0x0005, 0x7007, 0x0001, 0x6838, 0xa084, 0x00ff, 0xc0ed,
-	0x683a, 0x0126, 0x2091, 0x8000, 0x080c, 0x46a1, 0x012e, 0x0005,
-	0x7007, 0x0001, 0x6838, 0xa084, 0x00ff, 0xc0dd, 0x683a, 0x0126,
-	0x2091, 0x8000, 0x080c, 0x46a1, 0x012e, 0x0005, 0x6834, 0x8007,
-	0xa084, 0x00ff, 0x0988, 0x8001, 0x1120, 0x7007, 0x0001, 0x0804,
-	0x4f92, 0x7007, 0x0006, 0x7012, 0x2d00, 0x7016, 0x701a, 0x704b,
-	0x4f92, 0x0005, 0x2d00, 0x7016, 0x701a, 0x20a9, 0x0004, 0xa080,
-	0x0024, 0x2098, 0x20a1, 0x8c0c, 0x53a3, 0x6858, 0x7012, 0xa082,
-	0x0401, 0x1a70, 0x6884, 0xa08a, 0x0003, 0x1a50, 0xa080, 0x4f83,
-	0x2005, 0x70c6, 0x7010, 0xa015, 0x0904, 0x4f77, 0x080c, 0x146f,
-	0x1118, 0x7007, 0x000f, 0x0005, 0x2d00, 0x7022, 0x70c4, 0x2060,
-	0x2c05, 0x6836, 0xe004, 0xad00, 0x7096, 0xe008, 0xa20a, 0x1210,
-	0xa00e, 0x2200, 0x7112, 0xe20c, 0x8003, 0x800b, 0xa296, 0x0004,
-	0x0108, 0xa108, 0x719a, 0x810b, 0x719e, 0xae90, 0x0022, 0x080c,
-	0x14d3, 0x7090, 0xa08e, 0x0100, 0x0170, 0xa086, 0x0200, 0x0118,
-	0x7007, 0x0010, 0x0005, 0x7020, 0x2068, 0x080c, 0x149f, 0x7014,
-	0x2068, 0x0804, 0x4ef8, 0x7020, 0x2068, 0x7018, 0x6802, 0x6807,
-	0x0000, 0x2d08, 0x2068, 0x6906, 0x711a, 0x0804, 0x4f32, 0x7014,
-	0x2068, 0x7007, 0x0001, 0x6834, 0xa084, 0x00ff, 0xa086, 0x001e,
-	0x0904, 0x515b, 0x0078, 0x4f86, 0x4f8a, 0x4f8e, 0x0002, 0x0011,
-	0x0007, 0x0004, 0x000a, 0x000f, 0x0005, 0x0006, 0x0012, 0x000f,
-	0x0005, 0x0006, 0x2009, 0x8b2f, 0x210c, 0x81ff, 0x11a8, 0x6838,
-	0xa084, 0x00ff, 0x683a, 0x6853, 0x0000, 0x080c, 0x4170, 0x1108,
-	0x0005, 0x080c, 0x4773, 0x0126, 0x2091, 0x8000, 0x080c, 0x7dc8,
-	0x080c, 0x46a1, 0x012e, 0x0ca0, 0x2001, 0x0028, 0x2009, 0x0000,
-	0x0c80, 0x7018, 0x6802, 0x2d08, 0x2068, 0x6906, 0x711a, 0x7010,
-	0x8001, 0x7012, 0x0118, 0x7007, 0x0006, 0x0030, 0x7014, 0x2068,
-	0x7007, 0x0001, 0x7048, 0x080f, 0x0005, 0x7007, 0x0001, 0x6944,
-	0x810f, 0xa18c, 0x00ff, 0x6848, 0xa084, 0x00ff, 0x20a9, 0x0001,
-	0xa096, 0x0001, 0x01b0, 0x2009, 0x0000, 0x20a9, 0x007e, 0xa096,
-	0x0002, 0x0178, 0xa005, 0x11f8, 0x6944, 0x810f, 0xa18c, 0x00ff,
-	0x080c, 0x430a, 0x11c0, 0x0066, 0x6e50, 0x080c, 0x43e6, 0x006e,
-	0x0090, 0x0046, 0x2011, 0x8b0c, 0x2224, 0xc484, 0xc48c, 0x2412,
-	0x004e, 0x00c6, 0x080c, 0x430a, 0x1110, 0x080c, 0x453d, 0x8108,
-	0x1f04, 0x4ff2, 0x00ce, 0x080c, 0x149f, 0x0005, 0x0126, 0x2091,
-	0x8000, 0x7007, 0x0001, 0x2001, 0x8b52, 0x2004, 0xd0a4, 0x0580,
-	0x2061, 0x8e2a, 0x6100, 0xd184, 0x0178, 0x6858, 0xa084, 0x00ff,
-	0x1550, 0x6000, 0xd084, 0x0520, 0x6004, 0xa005, 0x1538, 0x6003,
-	0x0000, 0x600b, 0x0000, 0x00c8, 0x2011, 0x0001, 0x6860, 0xa005,
-	0x1110, 0x2001, 0x001e, 0x8000, 0x6016, 0x6858, 0xa084, 0x00ff,
-	0x0178, 0x6006, 0x6858, 0x8007, 0xa084, 0x00ff, 0x0148, 0x600a,
-	0x6858, 0x8000, 0x1108, 0xc28d, 0x6202, 0x012e, 0x0804, 0x51e3,
-	0x012e, 0x0804, 0x51dd, 0x012e, 0x0804, 0x51d7, 0x012e, 0x0804,
-	0x51da, 0x0126, 0x2091, 0x8000, 0x7007, 0x0001, 0x2001, 0x8b52,
-	0x2004, 0xd0a4, 0x05e0, 0x2061, 0x8e2a, 0x6000, 0xd084, 0x05b8,
-	0x6204, 0x6308, 0xd08c, 0x1530, 0x6c48, 0xa484, 0x0003, 0x0170,
-	0x6958, 0xa18c, 0x00ff, 0x8001, 0x1120, 0x2100, 0xa210, 0x0620,
-	0x0028, 0x8001, 0x1508, 0x2100, 0xa212, 0x02f0, 0xa484, 0x000c,
-	0x0188, 0x6958, 0x810f, 0xa18c, 0x00ff, 0xa082, 0x0004, 0x1120,
-	0x2100, 0xa318, 0x0288, 0x0030, 0xa082, 0x0004, 0x1168, 0x2100,
-	0xa31a, 0x0250, 0x6860, 0xa005, 0x0110, 0x8000, 0x6016, 0x6206,
-	0x630a, 0x012e, 0x0804, 0x51e3, 0x012e, 0x0804, 0x51e0, 0x012e,
-	0x0804, 0x51dd, 0x0126, 0x2091, 0x8000, 0x7007, 0x0001, 0x2061,
-	0x8e2a, 0x6300, 0xd38c, 0x1120, 0x6308, 0x8318, 0x0220, 0x630a,
-	0x012e, 0x0804, 0x51f1, 0x012e, 0x0804, 0x51e0, 0x0126, 0x00c6,
-	0x2091, 0x8000, 0x7007, 0x0001, 0x684c, 0xd0ac, 0x0148, 0x00c6,
-	0x2061, 0x8e2a, 0x6000, 0xa084, 0xfcff, 0x6002, 0x00ce, 0x04d8,
-	0x6858, 0xa005, 0x0904, 0x50ff, 0x685c, 0xa065, 0x0904, 0x50fb,
-	0x2001, 0x8b2f, 0x2004, 0xa005, 0x0118, 0x080c, 0x7d3c, 0x0068,
-	0x6013, 0x0400, 0x6027, 0x0000, 0x694c, 0xd1a4, 0x0110, 0x6950,
-	0x6126, 0x2009, 0x0041, 0x080c, 0x6d3f, 0x6958, 0xa18c, 0xff00,
-	0xa186, 0x2000, 0x0180, 0xa186, 0x0400, 0x0168, 0xa186, 0x1000,
-	0x0108, 0x0088, 0x00c6, 0x2061, 0x8e2a, 0x6000, 0xa084, 0xfdff,
-	0x6002, 0x00ce, 0x0040, 0x0026, 0x2009, 0x0000, 0x2011, 0xfdff,
-	0x080c, 0x5734, 0x002e, 0x684c, 0xd0c4, 0x0148, 0x2061, 0x8e2a,
-	0x6000, 0xd08c, 0x1120, 0x6008, 0x8000, 0x0208, 0x600a, 0x00ce,
-	0x012e, 0x0804, 0x51e3, 0x00ce, 0x012e, 0x0804, 0x51dd, 0x6954,
-	0xa186, 0x002e, 0x0d40, 0xa186, 0x002d, 0x0d28, 0xa186, 0x002a,
-	0x1130, 0x2001, 0x8b0c, 0x200c, 0xc194, 0x2102, 0x08e0, 0xa186,
-	0x0020, 0x0170, 0xa186, 0x0029, 0x1d30, 0x6944, 0xa18c, 0xff00,
-	0x810f, 0x080c, 0x430a, 0x1978, 0x6000, 0xc0e4, 0x6002, 0x0858,
-	0x685c, 0xa065, 0x09c0, 0x2001, 0x8da2, 0x2004, 0x6016, 0x0818,
-	0x2061, 0x8e2a, 0x6000, 0xd084, 0x0190, 0xd08c, 0x1904, 0x51f1,
-	0x0126, 0x2091, 0x8000, 0x6204, 0x8210, 0x0220, 0x6206, 0x012e,
-	0x0804, 0x51f1, 0x012e, 0x6853, 0x0016, 0x0804, 0x51ea, 0x6853,
-	0x0007, 0x0804, 0x51ea, 0x6834, 0x8007, 0xa084, 0x00ff, 0x1118,
-	0x080c, 0x4edc, 0x0078, 0x2030, 0x8001, 0x1120, 0x7007, 0x0001,
-	0x0051, 0x0040, 0x7007, 0x0006, 0x7012, 0x2d00, 0x7016, 0x701a,
-	0x704b, 0x515b, 0x0005, 0x00e6, 0x0126, 0x2091, 0x8000, 0x2009,
-	0x8b2f, 0x210c, 0x81ff, 0x1904, 0x51cc, 0x2009, 0x8b0c, 0x210c,
-	0xd194, 0x1904, 0x51d4, 0x6848, 0x2070, 0xae82, 0x9200, 0x0a04,
-	0x51c0, 0x2001, 0x8b16, 0x2004, 0xae02, 0x1a04, 0x51c0, 0x2061,
-	0x8e2a, 0x6100, 0xa184, 0x0001, 0x0568, 0xa184, 0x0100, 0x1904,
-	0x51c3, 0xa184, 0x0200, 0x1904, 0x51c6, 0x601c, 0xa005, 0x1904,
-	0x51c9, 0x711c, 0xa186, 0x0006, 0x1510, 0x7018, 0xa005, 0x05e0,
-	0x2004, 0xd0e4, 0x15e0, 0x6853, 0x0000, 0x6803, 0x0000, 0x2d08,
-	0x7010, 0xa005, 0x1138, 0x7112, 0x2e60, 0x080c, 0x56a3, 0x012e,
-	0x00ee, 0x0005, 0x2068, 0x6800, 0xa005, 0x1de0, 0x6902, 0x012e,
-	0x00ee, 0x0005, 0x012e, 0x00ee, 0x6853, 0x0006, 0x04d8, 0x6944,
-	0xa18c, 0xff00, 0x810f, 0x080c, 0x430a, 0x11c8, 0x6000, 0xd0e4,
-	0x11b0, 0x711c, 0xa186, 0x0007, 0x1118, 0x6853, 0x0002, 0x0088,
-	0x6853, 0x0008, 0x0070, 0x6853, 0x000e, 0x0058, 0x6853, 0x0017,
-	0x0040, 0x6853, 0x0035, 0x0028, 0x6853, 0x0028, 0x0010, 0x6853,
-	0x0029, 0x012e, 0x00ee, 0x00b0, 0x6853, 0x002a, 0x0cd0, 0x2009,
-	0x003e, 0x0058, 0x2009, 0x0004, 0x0040, 0x2009, 0x0006, 0x0028,
-	0x2009, 0x0016, 0x0010, 0x2009, 0x0001, 0x6854, 0xa084, 0xff00,
-	0xa105, 0x6856, 0x0126, 0x2091, 0x8000, 0x080c, 0x46a1, 0x012e,
-	0x0005, 0x080c, 0x149f, 0x0005, 0x702c, 0x7130, 0x8108, 0xa102,
-	0x0230, 0xa00e, 0x7034, 0x7072, 0x7038, 0x7076, 0x0058, 0x7070,
-	0xa080, 0x0040, 0x7072, 0x1230, 0x7074, 0xa081, 0x0000, 0x7076,
-	0xa085, 0x0001, 0x7932, 0x7132, 0x0005, 0x00d6, 0x080c, 0x569a,
-	0x00de, 0x0005, 0x00d6, 0x2011, 0x0004, 0x2204, 0xa085, 0x8002,
-	0x2012, 0x00de, 0x0005, 0x20e1, 0x0002, 0x3d08, 0x20e1, 0x2000,
-	0x3d00, 0xa084, 0x7000, 0x0118, 0xa086, 0x1000, 0x11b8, 0x20e1,
-	0x0004, 0x3d60, 0xd1bc, 0x1108, 0x3e60, 0xac84, 0x0003, 0x1170,
-	0xac82, 0x9200, 0x0258, 0x6858, 0xac02, 0x1240, 0x2009, 0x0047,
-	0x080c, 0x6d3f, 0x7a1c, 0xd284, 0x19f0, 0x0005, 0xa016, 0x080c,
-	0x16d1, 0x0cc0, 0x0156, 0x0136, 0x0146, 0x20e1, 0x3000, 0x3d20,
-	0x3e28, 0xa584, 0x0070, 0x1530, 0xa484, 0x7000, 0xa086, 0x1000,
-	0x11a8, 0x080c, 0x5295, 0x01f0, 0x20e1, 0x3000, 0x7828, 0x7828,
-	0x080c, 0x52b1, 0x014e, 0x013e, 0x015e, 0x2009, 0x8db2, 0x2104,
-	0xa005, 0x1108, 0x0005, 0x080c, 0x5d10, 0x0ce0, 0xa484, 0x7000,
-	0x1508, 0x0459, 0x01a8, 0x7000, 0xa084, 0xff00, 0xa086, 0x8100,
-	0x0d18, 0x0070, 0xd5a4, 0x0158, 0x080c, 0x1b5e, 0x20e1, 0x9010,
-	0x2001, 0x0160, 0x2502, 0x2001, 0x0138, 0x2202, 0x0038, 0x00a9,
-	0x080c, 0x8a02, 0x20e1, 0x3000, 0x7828, 0x7828, 0x014e, 0x013e,
-	0x015e, 0x08c0, 0x0051, 0x0da0, 0x080c, 0x8a02, 0x20e1, 0x3000,
-	0x7828, 0x7828, 0x080c, 0x5556, 0x0c88, 0xa484, 0x01ff, 0x6882,
-	0xa005, 0x0160, 0xa080, 0x001f, 0xa084, 0x03f8, 0x80ac, 0x20e1,
-	0x1000, 0x2ea0, 0x2099, 0x020a, 0x53a5, 0x0005, 0x20a9, 0x000c,
-	0x20e1, 0x1000, 0x2ea0, 0x2099, 0x020a, 0x53a5, 0xa085, 0x0001,
-	0x0ca0, 0x7000, 0xa084, 0xff00, 0xa08c, 0xf000, 0x8007, 0xa196,
-	0x0000, 0x1118, 0x0804, 0x5459, 0x0005, 0xa196, 0x2000, 0x1148,
-	0x6900, 0xa18e, 0x0001, 0x1118, 0x080c, 0x399f, 0x0ca8, 0x0039,
-	0x0c98, 0xa196, 0x8000, 0x1d80, 0x080c, 0x54e1, 0x0c68, 0x00c6,
-	0x6a80, 0x82ff, 0x0904, 0x53ee, 0x7110, 0xa18c, 0xff00, 0x810f,
-	0xa196, 0x0001, 0x0120, 0xa196, 0x0023, 0x1904, 0x53ee, 0xa08e,
-	0x0023, 0x1558, 0x080c, 0x5544, 0x0904, 0x53ee, 0x7124, 0x610a,
-	0x7030, 0xa08e, 0x0200, 0x1150, 0x7034, 0xa005, 0x1904, 0x53ee,
-	0x2009, 0x0015, 0x080c, 0x6d3f, 0x0804, 0x53ee, 0xa08e, 0x0210,
-	0x1130, 0x2009, 0x0015, 0x080c, 0x6d3f, 0x0804, 0x53ee, 0xa08e,
-	0x0100, 0x1904, 0x53ee, 0x7034, 0xa005, 0x1904, 0x53ee, 0x2009,
-	0x0016, 0x080c, 0x6d3f, 0x0804, 0x53ee, 0xa08e, 0x0022, 0x1904,
-	0x53ee, 0x7030, 0xa08e, 0x0300, 0x1580, 0x68c8, 0xd0a4, 0x0528,
-	0xc0b5, 0x68ca, 0x7100, 0xa18c, 0x00ff, 0x696e, 0x7004, 0x6872,
-	0x00f6, 0x2079, 0x0100, 0x79e6, 0x78ea, 0x0006, 0xa084, 0x00ff,
-	0x0016, 0x2008, 0x080c, 0x2313, 0x7932, 0x7936, 0x001e, 0x000e,
-	0x00fe, 0x080c, 0x22e9, 0x694e, 0x703c, 0x00e6, 0x2071, 0x0140,
-	0x7086, 0x2071, 0x8b00, 0x709e, 0x00ee, 0x7034, 0xa005, 0x1904,
-	0x53ee, 0x2009, 0x0017, 0x0804, 0x53c1, 0xa08e, 0x0400, 0x1158,
-	0x7034, 0xa005, 0x1904, 0x53ee, 0x68c8, 0xc0a5, 0x68ca, 0x2009,
-	0x0030, 0x0804, 0x53c1, 0xa08e, 0x0500, 0x1140, 0x7034, 0xa005,
-	0x1904, 0x53ee, 0x2009, 0x0018, 0x0804, 0x53c1, 0xa08e, 0x2010,
-	0x1120, 0x2009, 0x0019, 0x0804, 0x53c1, 0xa08e, 0x2110, 0x1120,
-	0x2009, 0x001a, 0x0804, 0x53c1, 0xa08e, 0x5200, 0x1140, 0x7034,
-	0xa005, 0x1904, 0x53ee, 0x2009, 0x001b, 0x0804, 0x53c1, 0xa08e,
-	0x5000, 0x1140, 0x7034, 0xa005, 0x1904, 0x53ee, 0x2009, 0x001c,
-	0x0804, 0x53c1, 0xa08e, 0x1200, 0x1138, 0x7034, 0xa005, 0x1904,
-	0x53ee, 0x2009, 0x0024, 0x04a8, 0xa08c, 0xff00, 0xa18e, 0x2400,
-	0x1118, 0x2009, 0x002d, 0x0468, 0xa08c, 0xff00, 0xa18e, 0x5300,
-	0x1118, 0x2009, 0x002a, 0x0428, 0xa08e, 0x0f00, 0x1118, 0x2009,
-	0x0020, 0x00f8, 0xa08e, 0x5300, 0x1108, 0x00c8, 0xa08e, 0x6104,
-	0x11b0, 0x2011, 0x908d, 0x8208, 0x2204, 0xa082, 0x0004, 0x20a8,
-	0x95ac, 0x95ac, 0x2011, 0x8015, 0x211c, 0x8108, 0x2124, 0x080c,
-	0x3617, 0x8108, 0x1f04, 0x53b2, 0x2009, 0x0023, 0x0010, 0x2009,
-	0x001d, 0x0016, 0x2011, 0x9083, 0x2204, 0x8211, 0x220c, 0x080c,
-	0x22e9, 0x1530, 0x080c, 0x42d6, 0x1518, 0x6612, 0x6516, 0x86ff,
-	0x0180, 0x001e, 0x0016, 0xa186, 0x0017, 0x1158, 0x686c, 0xa606,
-	0x1140, 0x6870, 0xa506, 0xa084, 0xff00, 0x1118, 0x6000, 0xc0f5,
-	0x6002, 0x00c6, 0x080c, 0x6cc2, 0x0168, 0x001e, 0x611a, 0x601f,
-	0x0004, 0x7120, 0x610a, 0x001e, 0x080c, 0x6d3f, 0x00ce, 0x0005,
-	0x001e, 0x0ce0, 0x00ce, 0x0ce0, 0x00e6, 0x00d6, 0x2028, 0x2130,
-	0xa696, 0x00ff, 0x1518, 0xa596, 0xfffd, 0x1120, 0x2009, 0x007f,
-	0x0804, 0x5455, 0xa596, 0xfffe, 0x1120, 0x2009, 0x007e, 0x0804,
-	0x5455, 0xa596, 0xfffc, 0x1120, 0x2009, 0x0080, 0x0804, 0x5455,
-	0xa594, 0xff00, 0xa296, 0xfc00, 0x1148, 0x2011, 0x0000, 0x2021,
-	0x0081, 0x20a9, 0x007e, 0x2071, 0x8cb5, 0x00a0, 0x2011, 0x0000,
-	0x2019, 0x8b32, 0x231c, 0xd3ac, 0x0138, 0x2021, 0x0000, 0x20a9,
-	0x00ff, 0x2071, 0x8c34, 0x0030, 0x2021, 0x0081, 0x20a9, 0x007e,
-	0x2071, 0x8cb5, 0x2e1c, 0x83ff, 0x1128, 0x82ff, 0x1198, 0x2410,
-	0xc2fd, 0x0080, 0x2368, 0x6f10, 0x0006, 0x2100, 0xa706, 0x000e,
-	0x6b14, 0x1120, 0xa346, 0x1110, 0x2408, 0x0078, 0x87ff, 0x1110,
-	0x83ff, 0x0d58, 0x8420, 0x8e70, 0x1f04, 0x5432, 0x82ff, 0x1118,
-	0xa085, 0x0001, 0x0018, 0xc2fc, 0x2208, 0xa006, 0x00de, 0x00ee,
-	0x0005, 0xa084, 0x0007, 0x000a, 0x0005, 0x5465, 0x5465, 0x5465,
-	0x5465, 0x5465, 0x5466, 0x547b, 0x54ce, 0x0005, 0x7110, 0xd1bc,
-	0x0188, 0x7120, 0x2160, 0xac8c, 0x0003, 0x1160, 0xac8a, 0x9200,
-	0x0248, 0x6858, 0xac02, 0x1230, 0x7124, 0x610a, 0x2009, 0x0046,
-	0x080c, 0x6d3f, 0x0005, 0x00c6, 0x7110, 0xd1bc, 0x1904, 0x54cc,
-	0x2011, 0x9083, 0x2204, 0x8211, 0x220c, 0x080c, 0x22e9, 0x1904,
-	0x54cc, 0x080c, 0x430a, 0x1904, 0x54cc, 0x6000, 0xd0ec, 0x15e0,
-	0x6204, 0xa294, 0xff00, 0x8217, 0xa286, 0x0006, 0x0160, 0x080c,
-	0x4c42, 0x11d0, 0x6204, 0xa294, 0x00ff, 0xa286, 0x0006, 0x11a0,
-	0xa295, 0x0600, 0x6206, 0x00c6, 0x080c, 0x6cc2, 0x001e, 0x0520,
-	0x611a, 0x601f, 0x0006, 0x7120, 0x610a, 0x7130, 0x6122, 0x2009,
-	0x0044, 0x080c, 0x6d3f, 0x00c0, 0x00c6, 0x080c, 0x6cc2, 0x001e,
-	0x0198, 0x611a, 0x601f, 0x0004, 0x7120, 0x610a, 0xa286, 0x0004,
-	0x1118, 0x6007, 0x0005, 0x0010, 0x6007, 0x0001, 0x6003, 0x0001,
-	0x080c, 0x58e2, 0x080c, 0x5d10, 0x00ce, 0x0005, 0x7110, 0xd1bc,
-	0x0178, 0x7020, 0x2060, 0xac84, 0x0003, 0x1150, 0xac82, 0x9200,
-	0x0238, 0x6858, 0xac02, 0x1220, 0x2009, 0x0045, 0x080c, 0x6d3f,
-	0x0005, 0x7110, 0xa18c, 0xff00, 0x810f, 0xa18e, 0x0000, 0x1138,
-	0xa084, 0x000f, 0xa08a, 0x0006, 0x1a0c, 0x1410, 0x000b, 0x0005,
-	0x54f6, 0x54f7, 0x54f6, 0x54f6, 0x552c, 0x5538, 0x0005, 0x7110,
-	0xd1bc, 0x1588, 0x700c, 0x7108, 0x080c, 0x22e9, 0x1560, 0x080c,
-	0x42d6, 0x1548, 0x6612, 0x6516, 0x6204, 0xa294, 0xff00, 0x8217,
-	0xa286, 0x0004, 0x0118, 0xa286, 0x0006, 0x1178, 0x00c6, 0x080c,
-	0x6cc2, 0x001e, 0x01c0, 0x611a, 0x601f, 0x0005, 0x7120, 0x610a,
-	0x2009, 0x0088, 0x080c, 0x6d3f, 0x0070, 0x00c6, 0x080c, 0x6cc2,
-	0x001e, 0x0148, 0x611a, 0x601f, 0x0004, 0x7120, 0x610a, 0x2009,
-	0x0001, 0x080c, 0x6d3f, 0x0005, 0x7110, 0xd1bc, 0x0140, 0x00a1,
-	0x0130, 0x7124, 0x610a, 0x2009, 0x0089, 0x080c, 0x6d3f, 0x0005,
-	0x7110, 0xd1bc, 0x0140, 0x0041, 0x0130, 0x7124, 0x610a, 0x2009,
-	0x008a, 0x080c, 0x6d3f, 0x0005, 0x7020, 0x2060, 0xac84, 0x0003,
-	0x1158, 0xac82, 0x9200, 0x0240, 0x2001, 0x8b16, 0x2004, 0xac02,
-	0x1218, 0xa085, 0x0001, 0x0005, 0xa006, 0x0ce8, 0x00c6, 0x00d6,
-	0x00f6, 0x7000, 0xa084, 0xf000, 0xa086, 0xc000, 0x0598, 0x080c,
-	0x6cc2, 0x0580, 0x00c6, 0x0046, 0x2011, 0x9083, 0x2204, 0x8211,
-	0x220c, 0x080c, 0x22e9, 0x1568, 0x080c, 0x42d6, 0x1550, 0x6612,
-	0x6516, 0x2c00, 0x004e, 0x00ce, 0x601a, 0x080c, 0x1488, 0x01f0,
-	0x2d00, 0x6026, 0x6803, 0x0000, 0x6837, 0x0000, 0x6c3a, 0xadf8,
-	0x000f, 0x20a9, 0x000e, 0x2fa0, 0x2e98, 0x53a3, 0x6013, 0x0205,
-	0x6007, 0x003e, 0x601f, 0x0001, 0x6003, 0x0001, 0x080c, 0x58e2,
-	0x080c, 0x5d10, 0x00fe, 0x00de, 0x00ce, 0x0005, 0x080c, 0x6d18,
-	0x0cc8, 0x004e, 0x00ce, 0x0cd0, 0x2071, 0x8dbd, 0x7003, 0x0003,
-	0x700f, 0x0361, 0xa006, 0x701a, 0x7012, 0x7017, 0x9200, 0x7007,
-	0x0000, 0x7026, 0x702b, 0x6704, 0x7032, 0x7037, 0x6745, 0x703b,
-	0xffff, 0x703f, 0xffff, 0x0005, 0x2071, 0x8dbd, 0x1d04, 0x55fc,
-	0x2091, 0x6000, 0x700c, 0x8001, 0x700e, 0x1120, 0x700f, 0x0361,
-	0x7007, 0x0001, 0x0126, 0x2091, 0x8000, 0x7024, 0xa00d, 0x0158,
-	0x7020, 0x8001, 0x7022, 0x1138, 0x7023, 0x0009, 0x8109, 0x7126,
-	0x1110, 0x7028, 0x080f, 0x7030, 0xa00d, 0x0158, 0x702c, 0x8001,
-	0x702e, 0x1138, 0x702f, 0x0009, 0x8109, 0x7132, 0x1110, 0x7034,
-	0x080f, 0x7038, 0xa005, 0x0118, 0x0310, 0x8001, 0x703a, 0x703c,
-	0xa005, 0x0118, 0x0310, 0x8001, 0x703e, 0x7018, 0xa00d, 0x0158,
-	0x7008, 0x8001, 0x700a, 0x1138, 0x700b, 0x0009, 0x8109, 0x711a,
-	0x1110, 0x701c, 0x080f, 0x012e, 0x7004, 0x0002, 0x5622, 0x5623,
-	0x563b, 0x00e6, 0x2071, 0x8dbd, 0x7018, 0xa005, 0x1120, 0x711a,
-	0x721e, 0x700b, 0x0009, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x2071,
-	0x8dbd, 0x701c, 0xa206, 0x1110, 0x701a, 0x701e, 0x000e, 0x00ee,
-	0x0005, 0x00e6, 0x2071, 0x8dbd, 0x6088, 0xa102, 0x0208, 0x618a,
-	0x00ee, 0x0005, 0x0005, 0x7110, 0x080c, 0x430a, 0x1158, 0x6088,
-	0x8001, 0x0240, 0x608a, 0x1130, 0x0126, 0x2091, 0x8000, 0x080c,
-	0x5d10, 0x012e, 0x8108, 0xa182, 0x00ff, 0x0218, 0xa00e, 0x7007,
-	0x0002, 0x7112, 0x0005, 0x7014, 0x2060, 0x0126, 0x2091, 0x8000,
-	0x6014, 0xa005, 0x0500, 0x8001, 0x6016, 0x11e8, 0x611c, 0xa186,
-	0x0003, 0x0118, 0xa186, 0x0006, 0x11a0, 0x6010, 0x2068, 0x6854,
-	0xa08a, 0x199a, 0x0270, 0xa082, 0x1999, 0x6856, 0xa08a, 0x199a,
-	0x0210, 0x2001, 0x1999, 0x8003, 0x800b, 0x810b, 0xa108, 0x6116,
-	0x0010, 0x080c, 0x79ec, 0x012e, 0xac88, 0x000c, 0x7116, 0x2001,
-	0x8b17, 0x2004, 0xa102, 0x0220, 0x7017, 0x9200, 0x7007, 0x0000,
-	0x0005, 0x00e6, 0x2071, 0x8dbd, 0x7027, 0x07d0, 0x7023, 0x0009,
-	0x00ee, 0x0005, 0x2001, 0x8dc6, 0x2003, 0x0000, 0x0005, 0x00e6,
-	0x2071, 0x8dbd, 0x7132, 0x702f, 0x0009, 0x00ee, 0x0005, 0x2011,
-	0x8dc9, 0x2013, 0x0000, 0x0005, 0x00e6, 0x2071, 0x8dbd, 0x711a,
-	0x721e, 0x700b, 0x0009, 0x00ee, 0x0005, 0x00c6, 0x2061, 0x8e2a,
-	0x00ce, 0x0005, 0xa184, 0x000f, 0x8003, 0x8003, 0x8003, 0xa080,
-	0x8e2a, 0x2060, 0x0005, 0x6854, 0xa08a, 0x199a, 0x0210, 0x2001,
-	0x1999, 0xa005, 0x1150, 0x00c6, 0x2061, 0x8e2a, 0x6014, 0x00ce,
-	0xa005, 0x1138, 0x2001, 0x001e, 0x0020, 0xa08e, 0xffff, 0x1108,
-	0xa006, 0x8003, 0x800b, 0x810b, 0xa108, 0x6116, 0x684c, 0xa08c,
-	0x00c0, 0xa18e, 0x00c0, 0x0588, 0xd0b4, 0x1138, 0xd0bc, 0x11f0,
-	0x2009, 0x0006, 0x080c, 0x5711, 0x0005, 0xd0fc, 0x0140, 0xa084,
-	0x0003, 0xa08e, 0x0003, 0x05b8, 0xa08e, 0x0000, 0x15a0, 0x2009,
-	0x8b73, 0x2104, 0xd084, 0x0128, 0x2009, 0x0042, 0x080c, 0x6d3f,
-	0x0005, 0x2009, 0x0043, 0x080c, 0x6d3f, 0x0005, 0xd0fc, 0x0140,
-	0xa084, 0x0003, 0xa08e, 0x0003, 0x01f0, 0xa08e, 0x0000, 0x11d8,
-	0x2009, 0x0042, 0x080c, 0x6d3f, 0x0005, 0xd0fc, 0x0168, 0xa084,
-	0x0003, 0xa08e, 0x0003, 0x0178, 0xa08e, 0x0002, 0x0138, 0x2009,
-	0x0041, 0x080c, 0x6d3f, 0x0005, 0x0051, 0x0ce8, 0x2009, 0x0043,
-	0x080c, 0x6d3f, 0x0cc0, 0x2009, 0x0004, 0x0019, 0x0005, 0x2009,
-	0x0001, 0x6010, 0xa0ec, 0xf000, 0x01f0, 0x2068, 0x6952, 0x6800,
-	0x6012, 0xa186, 0x0001, 0x1188, 0x694c, 0xa18c, 0x8100, 0xa18e,
-	0x8100, 0x1158, 0x00c6, 0x2061, 0x8e2a, 0x6200, 0xd28c, 0x1120,
-	0x6204, 0x8210, 0x0208, 0x6206, 0x00ce, 0x080c, 0x46a1, 0x6010,
-	0xa06d, 0x190c, 0x56a3, 0x0005, 0x0156, 0x00c6, 0x2061, 0x8e2a,
-	0x6000, 0x81ff, 0x0110, 0xa205, 0x0008, 0xa204, 0x6002, 0x00ce,
-	0x015e, 0x0005, 0x6800, 0xd08c, 0x1138, 0x6808, 0xa005, 0x0120,
-	0x8001, 0x680a, 0xa085, 0x0001, 0x0005, 0x20a9, 0x0010, 0xa006,
-	0x8004, 0x8086, 0x818e, 0x1208, 0xa200, 0x1f04, 0x5751, 0x8086,
-	0x818e, 0x0005, 0x0156, 0x20a9, 0x0010, 0xa005, 0x01b8, 0xa11a,
-	0x12a8, 0x8213, 0x818d, 0x0228, 0xa11a, 0x1220, 0x1f04, 0x5761,
-	0x0028, 0xa11a, 0x2308, 0x8210, 0x1f04, 0x5761, 0x0006, 0x3200,
-	0xa084, 0xefff, 0x2080, 0x000e, 0x015e, 0x0005, 0x0006, 0x3200,
-	0xa085, 0x1000, 0x0cb8, 0x0126, 0x2091, 0x2400, 0x2079, 0x8daa,
-	0x012e, 0x00d6, 0x2069, 0x8daa, 0x6803, 0x0005, 0x2069, 0x0004,
-	0x2d04, 0xa085, 0x8001, 0x206a, 0x00de, 0x0005, 0x00c6, 0x6027,
-	0x0001, 0x7804, 0xa084, 0x0007, 0x0002, 0x579f, 0x57c0, 0x5813,
-	0x57a5, 0x57c0, 0x579f, 0x579d, 0x579d, 0x080c, 0x1410, 0x080c,
-	0x567a, 0x080c, 0x5d10, 0x00ce, 0x0005, 0x62c0, 0x82ff, 0x1110,
-	0x00ce, 0x0005, 0x2011, 0x3fe7, 0x080c, 0x560d, 0x7828, 0xa092,
-	0x0002, 0x1228, 0x8000, 0x782a, 0x080c, 0x4034, 0x0c88, 0x080c,
-	0x3fe7, 0x7807, 0x0003, 0x7827, 0x0000, 0x782b, 0x0000, 0x0c40,
-	0x080c, 0x567a, 0x3c00, 0x0006, 0x2011, 0x0209, 0x20e1, 0x4000,
-	0x2214, 0x000e, 0x20e0, 0x82ff, 0x0178, 0x62c0, 0x82ff, 0x1160,
-	0x782b, 0x0000, 0x7824, 0xa065, 0x090c, 0x1410, 0x2009, 0x0013,
-	0x080c, 0x6d3f, 0x00ce, 0x0005, 0x3900, 0xa082, 0x8eca, 0x1210,
-	0x080c, 0x6c01, 0x00c6, 0x7824, 0xa065, 0x090c, 0x1410, 0x7804,
-	0xa086, 0x0004, 0x0904, 0x5853, 0x7828, 0xa092, 0x2710, 0x1230,
-	0x8000, 0x782a, 0x00ce, 0x080c, 0x66ea, 0x0c20, 0x6104, 0xa186,
-	0x0003, 0x1188, 0x00e6, 0x2071, 0x8b00, 0x70d4, 0x00ee, 0xd08c,
-	0x0150, 0x00c6, 0x00e6, 0x2061, 0x0100, 0x2071, 0x8b00, 0x080c,
-	0x403d, 0x00ee, 0x00ce, 0x080c, 0x8a4b, 0x2009, 0x0014, 0x080c,
-	0x6d3f, 0x00ce, 0x0838, 0x2001, 0x8dc6, 0x2003, 0x0000, 0x62c0,
-	0x82ff, 0x1160, 0x782b, 0x0000, 0x7824, 0xa065, 0x090c, 0x1410,
-	0x2009, 0x0013, 0x080c, 0x6d92, 0x00ce, 0x0005, 0x00c6, 0x00d6,
-	0x3900, 0xa082, 0x8eca, 0x1210, 0x080c, 0x6c01, 0x7824, 0xa005,
-	0x090c, 0x1410, 0x781c, 0xa06d, 0x090c, 0x1410, 0x6800, 0xc0dc,
-	0x6802, 0x7924, 0x2160, 0x080c, 0x6d18, 0x693c, 0x81ff, 0x090c,
-	0x1410, 0x8109, 0x693e, 0x6854, 0xa015, 0x0110, 0x7a1e, 0x0010,
-	0x7918, 0x791e, 0x7807, 0x0000, 0x7827, 0x0000, 0x00de, 0x00ce,
-	0x080c, 0x5d10, 0x0888, 0x6104, 0xa186, 0x0002, 0x0128, 0xa186,
-	0x0004, 0x0110, 0x0804, 0x57ec, 0x7808, 0xac06, 0x0904, 0x57ec,
-	0x080c, 0x5c37, 0x080c, 0x58e2, 0x00ce, 0x080c, 0x5d10, 0x0804,
-	0x57da, 0x00c6, 0x6027, 0x0002, 0x62c8, 0x60c4, 0xa205, 0x1170,
-	0x793c, 0xa1e5, 0x0000, 0x0120, 0x2009, 0x0049, 0x080c, 0x6d3f,
-	0x2011, 0x8dc9, 0x2013, 0x0000, 0x00ce, 0x0005, 0x3908, 0xa192,
-	0x8eca, 0x1210, 0x080c, 0x6c01, 0x793c, 0x81ff, 0x0d88, 0x793c,
-	0xa188, 0x0007, 0x210c, 0xa18e, 0x0006, 0x1138, 0x6014, 0xa084,
-	0x0184, 0xa085, 0x0012, 0x6016, 0x0c38, 0x6014, 0xa084, 0x0184,
-	0xa085, 0x0016, 0x6016, 0x0c00, 0x0006, 0x0016, 0x00c6, 0x0126,
-	0x2091, 0x8000, 0x600f, 0x0000, 0x2c08, 0x2061, 0x8daa, 0x6020,
-	0x8000, 0x6022, 0x6010, 0xa005, 0x0148, 0xa080, 0x0003, 0x2102,
-	0x6112, 0x012e, 0x00ce, 0x001e, 0x000e, 0x0005, 0x6116, 0x6112,
-	0x0cc0, 0x00d6, 0x2069, 0x8daa, 0x6000, 0xd0d4, 0x0168, 0x6820,
-	0x8000, 0x6822, 0xa086, 0x0001, 0x1110, 0x2c00, 0x681e, 0x6804,
-	0xa084, 0x0007, 0x0804, 0x5d16, 0xc0d5, 0x6002, 0x6818, 0xa005,
-	0x0158, 0x6056, 0x605b, 0x0000, 0x0006, 0x2c00, 0x681a, 0x00de,
-	0x685a, 0x2069, 0x8daa, 0x0c18, 0x6056, 0x605a, 0x2c00, 0x681a,
-	0x681e, 0x08e8, 0x0006, 0x0016, 0x00c6, 0x0126, 0x2091, 0x8000,
-	0x600f, 0x0000, 0x2c08, 0x2061, 0x8daa, 0x6020, 0x8000, 0x6022,
-	0x6008, 0xa005, 0x0148, 0xa080, 0x0003, 0x2102, 0x610a, 0x012e,
-	0x00ce, 0x001e, 0x000e, 0x0005, 0x610e, 0x610a, 0x0cc0, 0x00c6,
-	0x600f, 0x0000, 0x2c08, 0x2061, 0x8daa, 0x6034, 0xa005, 0x0130,
-	0xa080, 0x0003, 0x2102, 0x6136, 0x00ce, 0x0005, 0x613a, 0x6136,
-	0x0cd8, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0026, 0x0016,
-	0x0006, 0x0126, 0x2071, 0x8daa, 0x7638, 0x2660, 0x2678, 0x2091,
-	0x8000, 0x8cff, 0x0904, 0x597a, 0x6018, 0xa080, 0x0028, 0x2004,
-	0xa206, 0x1904, 0x5975, 0x88ff, 0x0120, 0x6020, 0xa106, 0x1904,
-	0x5975, 0x703c, 0xac06, 0x1170, 0x0036, 0x2019, 0x0001, 0x080c,
-	0x68e5, 0x7033, 0x0000, 0x703f, 0x0000, 0x7043, 0x0000, 0x7047,
-	0x0000, 0x003e, 0x7038, 0xac36, 0x1110, 0x660c, 0x763a, 0x7034,
-	0xac36, 0x1140, 0x2c00, 0xaf36, 0x0118, 0x2f00, 0x7036, 0x0010,
-	0x7037, 0x0000, 0x660c, 0x0066, 0x2c00, 0xaf06, 0x0110, 0x7e0e,
-	0x0008, 0x2678, 0x600f, 0x0000, 0x080c, 0x7b8f, 0x0188, 0x6010,
-	0x2068, 0x601c, 0xa086, 0x0003, 0x11f8, 0x6837, 0x0103, 0x6b4a,
-	0x6847, 0x0000, 0x080c, 0x7dc8, 0x080c, 0x46a1, 0x080c, 0x7d30,
-	0x080c, 0x7d3c, 0x00ce, 0x0804, 0x5921, 0x2c78, 0x600c, 0x2060,
-	0x0804, 0x5921, 0x012e, 0x000e, 0x001e, 0x002e, 0x006e, 0x00ce,
-	0x00de, 0x00ee, 0x00fe, 0x0005, 0x601c, 0xa086, 0x0006, 0x19e8,
-	0x080c, 0x8942, 0x0c28, 0x0006, 0x0066, 0x00c6, 0x00d6, 0x00f6,
-	0x2031, 0x0000, 0x0126, 0x2091, 0x8000, 0x2079, 0x8daa, 0x7838,
-	0xa065, 0x0558, 0x600c, 0x0006, 0x600f, 0x0000, 0x783c, 0xac06,
-	0x1170, 0x0036, 0x2019, 0x0001, 0x080c, 0x68e5, 0x7833, 0x0000,
-	0x783f, 0x0000, 0x7843, 0x0000, 0x7847, 0x0000, 0x003e, 0x080c,
-	0x7b8f, 0x0178, 0x6010, 0x2068, 0x601c, 0xa086, 0x0003, 0x11b0,
-	0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x080c, 0x46a1, 0x080c,
-	0x7d30, 0x080c, 0x7d3c, 0x000e, 0x0898, 0x7e3a, 0x7e36, 0x012e,
-	0x00fe, 0x00de, 0x00ce, 0x006e, 0x000e, 0x0005, 0x601c, 0xa086,
-	0x0006, 0x1d30, 0x080c, 0x8942, 0x0c60, 0x0016, 0x0026, 0x0086,
-	0x2041, 0x0000, 0x0099, 0x080c, 0x5a81, 0x008e, 0x002e, 0x001e,
-	0x0005, 0x00f6, 0x0126, 0x2079, 0x8daa, 0x2091, 0x8000, 0x080c,
-	0x5b0c, 0x080c, 0x5b6c, 0x012e, 0x00fe, 0x0005, 0x00f6, 0x00e6,
-	0x00d6, 0x00c6, 0x0066, 0x0016, 0x0006, 0x0126, 0x2091, 0x8000,
-	0x2071, 0x8daa, 0x7614, 0x2660, 0x2678, 0x8cff, 0x0904, 0x5a71,
-	0x6018, 0xa080, 0x0028, 0x2004, 0xa206, 0x1904, 0x5a6c, 0x88ff,
-	0x0120, 0x6020, 0xa106, 0x1904, 0x5a6c, 0x7024, 0xac06, 0x1538,
-	0x2069, 0x0100, 0x68c0, 0xa005, 0x01f0, 0x080c, 0x567a, 0x080c,
-	0x66f7, 0x68c3, 0x0000, 0x080c, 0x6b23, 0x7027, 0x0000, 0x0036,
-	0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, 0x0120, 0x6803, 0x0100,
-	0x6803, 0x0000, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827,
-	0x0001, 0x003e, 0x0020, 0x6003, 0x0009, 0x630a, 0x04a8, 0x7014,
-	0xac36, 0x1110, 0x660c, 0x7616, 0x7010, 0xac36, 0x1140, 0x2c00,
-	0xaf36, 0x0118, 0x2f00, 0x7012, 0x0010, 0x7013, 0x0000, 0x660c,
-	0x0066, 0x2c00, 0xaf06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f,
-	0x0000, 0x6010, 0x2068, 0x080c, 0x7b8f, 0x0178, 0x601c, 0xa086,
-	0x0003, 0x1500, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x080c,
-	0x7dc8, 0x080c, 0x46a1, 0x080c, 0x7d30, 0x080c, 0x7d3c, 0x080c,
-	0x6a05, 0x00ce, 0x0804, 0x59fd, 0x2c78, 0x600c, 0x2060, 0x0804,
-	0x59fd, 0x012e, 0x000e, 0x001e, 0x006e, 0x00ce, 0x00de, 0x00ee,
-	0x00fe, 0x0005, 0x601c, 0xa086, 0x0006, 0x19e0, 0x080c, 0x8942,
-	0x0c20, 0x00c6, 0x0006, 0x0126, 0x2091, 0x8000, 0xa280, 0x8c34,
-	0x2004, 0xa065, 0x0904, 0x5b08, 0x00f6, 0x00e6, 0x00d6, 0x0066,
-	0x2071, 0x8daa, 0x6654, 0x7018, 0xac06, 0x1108, 0x761a, 0x701c,
-	0xac06, 0x1130, 0x86ff, 0x1118, 0x7018, 0x701e, 0x0008, 0x761e,
-	0x6058, 0xa07d, 0x0108, 0x7e56, 0xa6ed, 0x0000, 0x0110, 0x2f00,
-	0x685a, 0x6057, 0x0000, 0x605b, 0x0000, 0x6000, 0xc0d4, 0xc0dc,
-	0x6002, 0x080c, 0x4290, 0x0904, 0x5b04, 0x7624, 0x86ff, 0x05e8,
-	0xa680, 0x0004, 0x2004, 0xad06, 0x15c0, 0x00d6, 0x2069, 0x0100,
-	0x68c0, 0xa005, 0x0548, 0x080c, 0x567a, 0x080c, 0x66f7, 0x68c3,
-	0x0000, 0x080c, 0x6b23, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140,
-	0x6b04, 0xa384, 0x1000, 0x0120, 0x6803, 0x0100, 0x6803, 0x0000,
-	0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e,
-	0x00de, 0x00c6, 0x603c, 0xa005, 0x0110, 0x8001, 0x603e, 0x2660,
-	0x080c, 0x7d3c, 0x00ce, 0x0048, 0x00de, 0x00c6, 0x2660, 0x6003,
-	0x0009, 0x630a, 0x00ce, 0x0804, 0x5ab1, 0x8dff, 0x0148, 0x6837,
-	0x0103, 0x6b4a, 0x6847, 0x0000, 0x080c, 0x7dc8, 0x080c, 0x46a1,
-	0x080c, 0x6a05, 0x0804, 0x5ab1, 0x006e, 0x00de, 0x00ee, 0x00fe,
-	0x012e, 0x000e, 0x00ce, 0x0005, 0x0006, 0x0066, 0x00c6, 0x00d6,
-	0x2031, 0x0000, 0x7814, 0xa065, 0x0904, 0x5b5e, 0x600c, 0x0006,
-	0x600f, 0x0000, 0x7824, 0xac06, 0x1540, 0x2069, 0x0100, 0x68c0,
-	0xa005, 0x01f0, 0x080c, 0x567a, 0x080c, 0x66f7, 0x68c3, 0x0000,
-	0x080c, 0x6b23, 0x7827, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04,
-	0xa384, 0x1000, 0x0120, 0x6803, 0x0100, 0x6803, 0x0000, 0x2069,
-	0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x0028,
-	0x6003, 0x0009, 0x630a, 0x2c30, 0x00b0, 0x6010, 0x2068, 0x080c,
-	0x7b8f, 0x0168, 0x601c, 0xa086, 0x0003, 0x11b8, 0x6837, 0x0103,
-	0x6b4a, 0x6847, 0x0000, 0x080c, 0x46a1, 0x080c, 0x7d30, 0x080c,
-	0x7d3c, 0x080c, 0x6a05, 0x000e, 0x0804, 0x5b13, 0x7e16, 0x7e12,
-	0x00de, 0x00ce, 0x006e, 0x000e, 0x0005, 0x601c, 0xa086, 0x0006,
-	0x1d28, 0x080c, 0x8942, 0x0c58, 0x0006, 0x0066, 0x00c6, 0x00d6,
-	0x7818, 0xa065, 0x0904, 0x5bd2, 0x6054, 0x0006, 0x6057, 0x0000,
-	0x605b, 0x0000, 0x6000, 0xc0d4, 0xc0dc, 0x6002, 0x080c, 0x4290,
-	0x0904, 0x5bcf, 0x7e24, 0x86ff, 0x05e8, 0xa680, 0x0004, 0x2004,
-	0xad06, 0x15c0, 0x00d6, 0x2069, 0x0100, 0x68c0, 0xa005, 0x0548,
-	0x080c, 0x567a, 0x080c, 0x66f7, 0x68c3, 0x0000, 0x080c, 0x6b23,
-	0x7827, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000,
-	0x0120, 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100, 0x6824,
-	0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x00de, 0x00c6, 0x603c,
-	0xa005, 0x0110, 0x8001, 0x603e, 0x2660, 0x080c, 0x7d3c, 0x00ce,
-	0x0048, 0x00de, 0x00c6, 0x2660, 0x6003, 0x0009, 0x630a, 0x00ce,
-	0x0804, 0x5b7e, 0x8dff, 0x0138, 0x6837, 0x0103, 0x6b4a, 0x6847,
-	0x0000, 0x080c, 0x46a1, 0x080c, 0x6a05, 0x0804, 0x5b7e, 0x000e,
-	0x0804, 0x5b71, 0x781e, 0x781a, 0x00de, 0x00ce, 0x006e, 0x000e,
-	0x0005, 0x00e6, 0x00d6, 0x0066, 0x6000, 0xd0dc, 0x0188, 0x604c,
-	0xa06d, 0x0170, 0x6848, 0xa606, 0x1158, 0x2071, 0x8daa, 0x7024,
-	0xa035, 0x0130, 0xa080, 0x0004, 0x2004, 0xad06, 0x1108, 0x0021,
-	0x006e, 0x00de, 0x00ee, 0x0005, 0x00f6, 0x2079, 0x0100, 0x78c0,
-	0xa005, 0x1138, 0x00c6, 0x2660, 0x6003, 0x0009, 0x630a, 0x00ce,
-	0x04a0, 0x080c, 0x66f7, 0x78c3, 0x0000, 0x080c, 0x6b23, 0x7027,
-	0x0000, 0x0036, 0x2079, 0x0140, 0x7b04, 0xa384, 0x1000, 0x0120,
-	0x7803, 0x0100, 0x7803, 0x0000, 0x2079, 0x0100, 0x7824, 0xd084,
-	0x0110, 0x7827, 0x0001, 0x080c, 0x6b23, 0x003e, 0x080c, 0x4290,
-	0x00c6, 0x603c, 0xa005, 0x0110, 0x8001, 0x603e, 0x2660, 0x080c,
-	0x6d18, 0x00ce, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x080c,
-	0x7dc8, 0x080c, 0x46a1, 0x080c, 0x6a05, 0x00fe, 0x0005, 0x00e6,
-	0x00c6, 0x2071, 0x8daa, 0x7004, 0xa084, 0x0007, 0x0002, 0x5c49,
-	0x5c4c, 0x5c62, 0x5c7b, 0x5cb4, 0x5c49, 0x5c47, 0x5c47, 0x080c,
-	0x1410, 0x00ce, 0x00ee, 0x0005, 0x7024, 0xa065, 0x0148, 0x7020,
-	0x8001, 0x7022, 0x600c, 0xa015, 0x0150, 0x7216, 0x600f, 0x0000,
-	0x7007, 0x0000, 0x7027, 0x0000, 0x00ce, 0x00ee, 0x0005, 0x7216,
-	0x7212, 0x0cb0, 0x6018, 0x2060, 0x080c, 0x4290, 0x6000, 0xc0dc,
-	0x6002, 0x7020, 0x8001, 0x7022, 0x0120, 0x6054, 0xa015, 0x0140,
-	0x721e, 0x7007, 0x0000, 0x7027, 0x0000, 0x00ce, 0x00ee, 0x0005,
-	0x7218, 0x721e, 0x0cb0, 0x7024, 0xa065, 0x0598, 0x700c, 0xac06,
-	0x1160, 0x080c, 0x6a05, 0x600c, 0xa015, 0x0120, 0x720e, 0x600f,
-	0x0000, 0x0428, 0x720e, 0x720a, 0x0410, 0x7014, 0xac06, 0x1160,
-	0x080c, 0x6a05, 0x600c, 0xa015, 0x0120, 0x7216, 0x600f, 0x0000,
-	0x00b0, 0x7216, 0x7212, 0x0098, 0x6018, 0x2060, 0x080c, 0x4290,
-	0x6000, 0xc0dc, 0x6002, 0x080c, 0x6a05, 0x701c, 0xa065, 0x0138,
-	0x6054, 0xa015, 0x0110, 0x721e, 0x0010, 0x7218, 0x721e, 0x7027,
-	0x0000, 0x00ce, 0x00ee, 0x0005, 0x7024, 0xa065, 0x0140, 0x080c,
-	0x6a05, 0x600c, 0xa015, 0x0150, 0x720e, 0x600f, 0x0000, 0x080c,
-	0x6b23, 0x7027, 0x0000, 0x00ce, 0x00ee, 0x0005, 0x720e, 0x720a,
-	0x0cb0, 0x00d6, 0x2069, 0x8daa, 0x6830, 0xa084, 0x0003, 0x0002,
-	0x5cd6, 0x5cd8, 0x5cf8, 0x5cd4, 0x080c, 0x1410, 0x00de, 0x0005,
-	0x00c6, 0x6840, 0xa086, 0x0001, 0x0198, 0x683c, 0xa065, 0x0130,
-	0x600c, 0xa015, 0x0150, 0x6a3a, 0x600f, 0x0000, 0x6833, 0x0000,
-	0x683f, 0x0000, 0x00ce, 0x00de, 0x0005, 0x683a, 0x6836, 0x0cb0,
-	0x6843, 0x0000, 0x6838, 0xa065, 0x0d88, 0x6003, 0x0003, 0x0c70,
-	0x00c6, 0x6843, 0x0000, 0x6847, 0x0000, 0x683c, 0xa065, 0x0168,
-	0x600c, 0xa015, 0x0130, 0x6a3a, 0x600f, 0x0000, 0x683f, 0x0000,
-	0x0020, 0x683f, 0x0000, 0x683a, 0x6836, 0x00ce, 0x00de, 0x0005,
-	0x00d6, 0x2069, 0x8daa, 0x6804, 0xa084, 0x0007, 0x0002, 0x5d21,
-	0x5db3, 0x5db3, 0x5db3, 0x5db3, 0x5db5, 0x5d1f, 0x5d1f, 0x080c,
-	0x1410, 0x6820, 0xa005, 0x1110, 0x00de, 0x0005, 0x00c6, 0x680c,
-	0xa065, 0x0150, 0x6807, 0x0004, 0x6826, 0x682b, 0x0000, 0x080c,
-	0x5df4, 0x00ce, 0x00de, 0x0005, 0x6814, 0xa065, 0x0150, 0x6807,
-	0x0001, 0x6826, 0x682b, 0x0000, 0x080c, 0x5df4, 0x00ce, 0x00de,
-	0x0005, 0x00e6, 0x0036, 0x6a1c, 0xa2f5, 0x0000, 0x0904, 0x5daf,
-	0x704c, 0xa00d, 0x0118, 0x7088, 0xa005, 0x01a0, 0x7054, 0xa075,
-	0x0120, 0xa20e, 0x0904, 0x5daf, 0x0028, 0x6818, 0xa20e, 0x0904,
-	0x5daf, 0x2070, 0x704c, 0xa00d, 0x0d88, 0x7088, 0xa005, 0x1d70,
-	0x2e00, 0x681e, 0x733c, 0x7038, 0xa302, 0x1e40, 0x080c, 0x6cef,
-	0x0904, 0x5daf, 0x8318, 0x733e, 0x6112, 0x2e10, 0x621a, 0xa180,
-	0x0015, 0x2004, 0xa08a, 0x199a, 0x0210, 0x2001, 0x1999, 0x8003,
-	0x801b, 0x831b, 0xa318, 0x6316, 0x003e, 0x00f6, 0x2c78, 0x71a0,
-	0x2001, 0x8b32, 0x2004, 0xd0ac, 0x1110, 0xd1bc, 0x0150, 0x7100,
-	0xd1f4, 0x0120, 0x7114, 0xa18c, 0x00ff, 0x0040, 0x2009, 0x0000,
-	0x0028, 0xa1e0, 0x263d, 0x2c0d, 0xa18c, 0x00ff, 0x2061, 0x0100,
-	0x619a, 0x080c, 0x62f1, 0x7300, 0xc3dd, 0x7302, 0x6807, 0x0002,
-	0x2f18, 0x6b26, 0x682b, 0x0000, 0x781f, 0x0003, 0x7803, 0x0001,
-	0x7807, 0x0040, 0x00fe, 0x00ee, 0x00ce, 0x00de, 0x0005, 0x003e,
-	0x00ee, 0x00ce, 0x0cd0, 0x00de, 0x0005, 0x00c6, 0x680c, 0xa065,
-	0x0130, 0x6807, 0x0004, 0x6826, 0x682b, 0x0000, 0x04a9, 0x00ce,
-	0x00de, 0x0005, 0x00f6, 0x00d6, 0x2069, 0x8daa, 0x6830, 0xa086,
-	0x0000, 0x1198, 0x6838, 0xa07d, 0x0180, 0x6833, 0x0001, 0x683e,
-	0x6847, 0x0000, 0x0126, 0x00f6, 0x2091, 0x2400, 0x002e, 0x080c,
-	0x1c40, 0x1130, 0x012e, 0x080c, 0x65ca, 0x00de, 0x00fe, 0x0005,
-	0x012e, 0xe000, 0x6843, 0x0000, 0x7803, 0x0002, 0x780c, 0xa015,
-	0x0140, 0x6a3a, 0x780f, 0x0000, 0x6833, 0x0000, 0x683f, 0x0000,
-	0x0c60, 0x683a, 0x6836, 0x0cc0, 0x601c, 0xa084, 0x000f, 0x000b,
-	0x0005, 0x5e02, 0x5e07, 0x618e, 0x62ae, 0x5e07, 0x618e, 0x62ae,
-	0x5e02, 0x5e07, 0x080c, 0x5c37, 0x080c, 0x5d10, 0x0005, 0x0156,
-	0x0136, 0x0146, 0x00c6, 0x00f6, 0x6004, 0xa08a, 0x0040, 0x1a0c,
-	0x1410, 0x6118, 0x2178, 0x79a0, 0x2011, 0x8b32, 0x2214, 0xd2ac,
-	0x1110, 0xd1bc, 0x0150, 0x7900, 0xd1f4, 0x0120, 0x7914, 0xa18c,
-	0x00ff, 0x0040, 0x2009, 0x0000, 0x0028, 0xa1f8, 0x263d, 0x2f0d,
-	0xa18c, 0x00ff, 0x2c78, 0x2061, 0x0100, 0x619a, 0x0033, 0x00fe,
-	0x00ce, 0x014e, 0x013e, 0x015e, 0x0005, 0x5e7d, 0x5eb5, 0x5ecf,
-	0x5f82, 0x5fad, 0x5fb5, 0x5fd6, 0x5fe7, 0x5ff8, 0x6000, 0x6011,
-	0x6000, 0x6056, 0x5fe7, 0x6077, 0x607f, 0x5ff8, 0x607f, 0x6090,
-	0x5e74, 0x5e74, 0x5e74, 0x5e74, 0x5e74, 0x5e74, 0x5e74, 0x5e74,
-	0x5e74, 0x5e74, 0x5e74, 0x5e74, 0x67ad, 0x67c2, 0x67e5, 0x6809,
-	0x5fd6, 0x5e74, 0x5fd6, 0x6000, 0x5e74, 0x5ecf, 0x5f82, 0x5e74,
-	0x6c1e, 0x6000, 0x5e74, 0x6c3e, 0x6000, 0x5e74, 0x5ff8, 0x5e76,
-	0x5e74, 0x5e74, 0x5e74, 0x5e74, 0x5e74, 0x5e74, 0x5e74, 0x5e74,
-	0x5e74, 0x5e74, 0x681e, 0x6c63, 0x080c, 0x1410, 0x2001, 0x8b14,
-	0x2004, 0x609a, 0x080c, 0x66e4, 0x0005, 0x20a1, 0x020b, 0x080c,
-	0x60a5, 0x20a3, 0x5200, 0x20a3, 0x0000, 0x00d6, 0x2069, 0x8b51,
-	0x6804, 0xd084, 0x0150, 0x6828, 0x20a3, 0x0000, 0x0016, 0x080c,
-	0x22fd, 0x21a2, 0x001e, 0x00de, 0x0028, 0x00de, 0x20a3, 0x0000,
-	0x20a3, 0x0000, 0x20a9, 0x0004, 0x2099, 0x8b05, 0x53a6, 0x20a9,
-	0x0004, 0x2099, 0x8b01, 0x53a6, 0x20a3, 0x0000, 0x2001, 0x8b14,
-	0x2004, 0xa084, 0x00ff, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000,
-	0x60c3, 0x001c, 0x080c, 0x66e4, 0x0005, 0x20a1, 0x020b, 0x080c,
-	0x60a5, 0x20a3, 0x0500, 0x20a3, 0x0000, 0x2001, 0x8b1b, 0x2004,
-	0x20a2, 0x2001, 0x8b1c, 0x2004, 0x20a2, 0x20a9, 0x0004, 0x2099,
-	0x8b05, 0x53a6, 0x60c3, 0x0010, 0x080c, 0x66e4, 0x0005, 0x20a1,
-	0x020b, 0x080c, 0x60a5, 0x7818, 0xa080, 0x0028, 0x2004, 0xa086,
-	0x007e, 0x1130, 0x20a3, 0x0400, 0x620c, 0xc2b4, 0x620e, 0x0010,
-	0x20a3, 0x0300, 0x20a3, 0x0000, 0x7818, 0xa080, 0x0028, 0x2004,
-	0xa086, 0x007e, 0x1904, 0x5f44, 0x2001, 0x8b32, 0x2004, 0xd0a4,
-	0x01c8, 0x2099, 0x8d8c, 0x33a6, 0x9398, 0x20a3, 0x0000, 0x9398,
-	0x3304, 0xa084, 0x2000, 0x20a2, 0x9398, 0x33a6, 0x9398, 0x20a3,
-	0x0000, 0x9398, 0x2001, 0x2710, 0x20a2, 0x9398, 0x33a6, 0x9398,
-	0x33a6, 0x00d0, 0x2099, 0x8d8c, 0x33a6, 0x9398, 0x33a6, 0x9398,
-	0x3304, 0x080c, 0x4c42, 0x1118, 0xa084, 0x37ff, 0x0010, 0xa084,
-	0x3fff, 0x20a2, 0x9398, 0x33a6, 0x20a3, 0x0000, 0x20a3, 0x0000,
-	0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a9, 0x0004, 0x2099, 0x8b05,
-	0x53a6, 0x20a9, 0x0004, 0x2099, 0x8b01, 0x53a6, 0x20a9, 0x0008,
-	0x20a3, 0x0000, 0x1f04, 0x5f30, 0x20a9, 0x0008, 0x20a3, 0x0000,
-	0x1f04, 0x5f36, 0x2099, 0x8d94, 0x33a6, 0x20a9, 0x0007, 0x20a3,
-	0x0000, 0x1f04, 0x5f3f, 0x0468, 0x2001, 0x8b32, 0x2004, 0xd0a4,
-	0x0140, 0x2001, 0x8d8d, 0x2004, 0x60e3, 0x0000, 0x080c, 0x233e,
-	0x60e2, 0x2099, 0x8d8c, 0x20a9, 0x0008, 0x53a6, 0x20a9, 0x0004,
-	0x2099, 0x8b05, 0x53a6, 0x20a9, 0x0004, 0x2099, 0x8b01, 0x53a6,
-	0x20a9, 0x0008, 0x20a3, 0x0000, 0x1f04, 0x5f62, 0x20a9, 0x0008,
-	0x20a3, 0x0000, 0x1f04, 0x5f68, 0x2099, 0x8d94, 0x20a9, 0x0008,
-	0x53a6, 0x20a9, 0x0008, 0x20a3, 0x0000, 0x1f04, 0x5f73, 0x20a9,
-	0x000a, 0x20a3, 0x0000, 0x1f04, 0x5f79, 0x60c3, 0x0074, 0x080c,
-	0x66e4, 0x0005, 0x20a1, 0x020b, 0x080c, 0x60a5, 0x20a3, 0x2010,
-	0x20a3, 0x0014, 0x20a3, 0x0800, 0x20a3, 0x2000, 0xa006, 0x20a2,
-	0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x00f6, 0x2079, 0x8b51, 0x7904,
-	0x00fe, 0xd1ac, 0x1110, 0xa085, 0x0020, 0xd1a4, 0x0110, 0xa085,
-	0x0010, 0xa085, 0x0002, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000,
-	0x60c3, 0x0014, 0x080c, 0x66e4, 0x0005, 0x20a1, 0x020b, 0x080c,
-	0x60a5, 0x20a3, 0x5000, 0x0804, 0x5ee2, 0x20a1, 0x020b, 0x080c,
-	0x60a5, 0x20a3, 0x2110, 0x20a3, 0x0014, 0x20a3, 0x0000, 0x20a3,
-	0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3,
-	0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3,
-	0x0000, 0x60c3, 0x0014, 0x080c, 0x66e4, 0x0005, 0x20a1, 0x020b,
-	0x080c, 0x612f, 0x20a3, 0x0200, 0x20a3, 0x0000, 0x20a3, 0x0000,
-	0x20a3, 0x0000, 0x60c3, 0x0004, 0x080c, 0x66e4, 0x0005, 0x20a1,
-	0x020b, 0x080c, 0x612f, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3,
-	0x0003, 0x20a3, 0x2a00, 0x60c3, 0x0008, 0x080c, 0x66e4, 0x0005,
-	0x20a1, 0x020b, 0x080c, 0x612f, 0x20a3, 0x0200, 0x0804, 0x5ee2,
-	0x20a1, 0x020b, 0x080c, 0x612f, 0x20a3, 0x0100, 0x20a3, 0x0000,
-	0x20a3, 0x0003, 0x7810, 0x20a2, 0x60c3, 0x0008, 0x080c, 0x66e4,
-	0x0005, 0x00d6, 0x20a1, 0x020b, 0x080c, 0x612f, 0x20a3, 0x0210,
-	0x20a3, 0x0014, 0x20a3, 0x0800, 0x7818, 0x2068, 0x6894, 0xa086,
-	0x0014, 0x1178, 0x6998, 0xa184, 0xc000, 0x1140, 0xd1ec, 0x0118,
-	0x20a3, 0x2100, 0x0040, 0x20a3, 0x0100, 0x0028, 0x20a3, 0x0400,
-	0x0010, 0x20a3, 0x0700, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2,
-	0x20a2, 0x00f6, 0x2079, 0x8b51, 0x7904, 0x00fe, 0xd1ac, 0x1110,
-	0xa085, 0x0020, 0xd1a4, 0x0110, 0xa085, 0x0010, 0x2009, 0x8b73,
-	0x210c, 0xd184, 0x1110, 0xa085, 0x0002, 0x20a2, 0x20a2, 0x20a2,
-	0x60c3, 0x0014, 0x080c, 0x66e4, 0x00de, 0x0005, 0x20a1, 0x020b,
-	0x080c, 0x612f, 0x20a3, 0x0210, 0x20a3, 0x0014, 0x20a3, 0x0000,
-	0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000,
-	0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000,
-	0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c, 0x66e4, 0x0005, 0x20a1,
-	0x020b, 0x080c, 0x612f, 0x20a3, 0x0200, 0x0804, 0x5e83, 0x20a1,
-	0x020b, 0x080c, 0x612f, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3,
-	0x0003, 0x20a3, 0x2a00, 0x60c3, 0x0008, 0x080c, 0x66e4, 0x0005,
-	0x20e1, 0x9080, 0x20e1, 0x4000, 0x20a1, 0x020b, 0x080c, 0x612f,
-	0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, 0x000b, 0x20a3, 0x0000,
-	0x60c3, 0x0008, 0x080c, 0x66e4, 0x0005, 0x0026, 0x20e1, 0x9080,
-	0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2014, 0xa286, 0x007e,
-	0x1198, 0x20a3, 0x22ff, 0x20a3, 0xfffe, 0x20a3, 0x0000, 0x2011,
-	0x8b14, 0x2214, 0x2001, 0x8d9c, 0x2004, 0xa005, 0x0118, 0x2011,
-	0x8b1c, 0x2214, 0x22a2, 0x04d0, 0xa286, 0x007f, 0x1130, 0x00d6,
-	0x20a3, 0x22ff, 0x20a3, 0xfffd, 0x00c8, 0x2001, 0x8b32, 0x2004,
-	0xd0ac, 0x1110, 0xd2bc, 0x01c8, 0xa286, 0x0080, 0x00d6, 0x1128,
-	0x20a3, 0x22ff, 0x20a3, 0xfffc, 0x0048, 0xa2e8, 0x8c34, 0x2d6c,
-	0x6810, 0xa085, 0x2200, 0x20a2, 0x6814, 0x20a2, 0x2069, 0x8b1b,
-	0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0088, 0x00d6, 0xa2e8, 0x8c34,
-	0x2d6c, 0x6810, 0xa085, 0x2200, 0x20a2, 0x6814, 0x20a2, 0x00de,
-	0x20a3, 0x0000, 0x2011, 0x8b14, 0x2214, 0x22a2, 0x20a3, 0x0129,
-	0x20a3, 0x0000, 0x080c, 0x66d3, 0x22a2, 0x20a3, 0x0000, 0x2fa2,
-	0x20a3, 0xffff, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x002e, 0x0005,
-	0x0026, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x20a3, 0x02ff, 0x2011,
-	0xfffc, 0x22a2, 0x00d6, 0x2069, 0x8b1b, 0x2da6, 0x8d68, 0x2da6,
-	0x00de, 0x20a3, 0x2029, 0x20a3, 0x0000, 0x08e0, 0x20a3, 0x0100,
-	0x20a3, 0x0000, 0x20a3, 0xfc02, 0x20a3, 0x0000, 0x0005, 0x0026,
-	0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004,
-	0x2011, 0x8b32, 0x2214, 0xd2ac, 0x1118, 0xa092, 0x007e, 0x02e0,
-	0x00d6, 0xa0e8, 0x8c34, 0x2d6c, 0x6810, 0xa085, 0x2300, 0x20a2,
-	0x6814, 0x20a2, 0x6810, 0xa005, 0x1140, 0x6814, 0xa005, 0x1128,
-	0x20a3, 0x00ff, 0x20a3, 0xfffe, 0x0028, 0x2069, 0x8b1b, 0x2da6,
-	0x8d68, 0x2da6, 0x00de, 0x0088, 0x00d6, 0xa0e8, 0x8c34, 0x2d6c,
-	0x6810, 0xa085, 0x2300, 0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3,
-	0x0000, 0x2011, 0x8b14, 0x2214, 0x22a2, 0x20a3, 0x0198, 0x20a3,
-	0x0000, 0x080c, 0x66d3, 0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2,
-	0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x002e, 0x0005, 0x080c,
-	0x66d3, 0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2, 0x7810, 0x20a2,
-	0x20a3, 0x0000, 0x20a3, 0x0000, 0x002e, 0x0005, 0x00c6, 0x00f6,
-	0x6004, 0xa08a, 0x0085, 0x0a0c, 0x1410, 0xa08a, 0x008c, 0x1a0c,
-	0x1410, 0x6118, 0x2178, 0x79a0, 0x2011, 0x8b32, 0x2214, 0xd2ac,
-	0x1110, 0xd1bc, 0x0150, 0x7900, 0xd1f4, 0x0120, 0x7914, 0xa18c,
-	0x00ff, 0x0040, 0x2009, 0x0000, 0x0028, 0xa1f8, 0x263d, 0x2f0d,
-	0xa18c, 0x00ff, 0x2c78, 0x2061, 0x0100, 0x619a, 0xa082, 0x0085,
-	0x001b, 0x00fe, 0x00ce, 0x0005, 0x61c5, 0x61cf, 0x61ea, 0x61c3,
-	0x61c3, 0x61c3, 0x61c5, 0x080c, 0x1410, 0x0146, 0x20a1, 0x020b,
-	0x04a1, 0x60c3, 0x0000, 0x080c, 0x66e4, 0x014e, 0x0005, 0x0146,
-	0x20a1, 0x020b, 0x080c, 0x6236, 0x20a3, 0x0000, 0x20a3, 0x0000,
-	0x7808, 0x20a2, 0x7810, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0xffff,
-	0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x000c, 0x080c, 0x66e4,
-	0x014e, 0x0005, 0x0146, 0x20a1, 0x020b, 0x080c, 0x6275, 0x20a3,
-	0x0003, 0x20a3, 0x0300, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3,
-	0x0004, 0x080c, 0x66e4, 0x014e, 0x0005, 0x0026, 0x20e1, 0x9080,
-	0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0x2011, 0x8b32,
-	0x2214, 0xd2ac, 0x1118, 0xa092, 0x007e, 0x0288, 0x00d6, 0xa0e8,
-	0x8c34, 0x2d6c, 0x6810, 0xa085, 0x8100, 0x20a2, 0x6814, 0x20a2,
-	0x2069, 0x8b1b, 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0088, 0x00d6,
-	0xa0e8, 0x8c34, 0x2d6c, 0x6810, 0xa085, 0x8100, 0x20a2, 0x6814,
-	0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011, 0x8b14, 0x2214, 0x22a2,
-	0x20a3, 0x0009, 0x20a3, 0x0000, 0x0804, 0x6102, 0x0026, 0x20e1,
-	0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0x2011,
-	0x8b32, 0x2214, 0xd2ac, 0x1118, 0xa092, 0x007e, 0x0288, 0x00d6,
-	0xa0e8, 0x8c34, 0x2d6c, 0x6810, 0xa085, 0x8400, 0x20a2, 0x6814,
-	0x20a2, 0x2069, 0x8b1b, 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0088,
-	0x00d6, 0xa0e8, 0x8c34, 0x2d6c, 0x6810, 0xa085, 0x8400, 0x20a2,
-	0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011, 0x8b14, 0x2214,
-	0x22a2, 0x080c, 0x4c42, 0x1118, 0x20a3, 0x0099, 0x0010, 0x20a3,
-	0x00d1, 0x20a3, 0x0000, 0x0804, 0x617f, 0x0026, 0x20e1, 0x9080,
-	0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0x2011, 0x8b32,
-	0x2214, 0xd2ac, 0x1118, 0xa092, 0x007e, 0x0288, 0x00d6, 0xa0e8,
-	0x8c34, 0x2d6c, 0x6810, 0xa085, 0x8500, 0x20a2, 0x6814, 0x20a2,
-	0x2069, 0x8b1b, 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0088, 0x00d6,
-	0xa0e8, 0x8c34, 0x2d6c, 0x6810, 0xa085, 0x8500, 0x20a2, 0x6814,
-	0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011, 0x8b14, 0x2214, 0x22a2,
-	0x20a3, 0x0099, 0x20a3, 0x0000, 0x0804, 0x617f, 0x00c6, 0x00f6,
-	0x2c78, 0x7804, 0xa08a, 0x0040, 0x0a0c, 0x1410, 0xa08a, 0x0053,
-	0x1a0c, 0x1410, 0x7918, 0x2160, 0x61a0, 0x2011, 0x8b32, 0x2214,
-	0xd2ac, 0x1110, 0xd1bc, 0x0150, 0x6100, 0xd1f4, 0x0120, 0x6114,
-	0xa18c, 0x00ff, 0x0040, 0x2009, 0x0000, 0x0028, 0xa1e0, 0x263d,
-	0x2c0d, 0xa18c, 0x00ff, 0x2061, 0x0100, 0x619a, 0xa082, 0x0040,
-	0x001b, 0x00fe, 0x00ce, 0x0005, 0x62f1, 0x63f3, 0x6390, 0x653f,
-	0x62ef, 0x62ef, 0x62ef, 0x62ef, 0x62ef, 0x62ef, 0x62ef, 0x69be,
-	0x69ce, 0x69de, 0x69ee, 0x62ef, 0x62ef, 0x62ef, 0x69ad, 0x080c,
-	0x1410, 0x00d6, 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x6347,
-	0x7910, 0x2168, 0x6948, 0x7922, 0x21a2, 0xa016, 0x22a2, 0x22a2,
-	0x22a2, 0x694c, 0xa184, 0x000f, 0x1118, 0x2001, 0x0005, 0x0040,
-	0xd184, 0x0118, 0x2001, 0x0004, 0x0018, 0xa084, 0x0006, 0x8004,
-	0x20a2, 0xd1ac, 0x0118, 0x20a3, 0x0002, 0x0048, 0xd1b4, 0x0118,
-	0x20a3, 0x0001, 0x0020, 0x20a3, 0x0000, 0x2230, 0x0010, 0x6a80,
-	0x6e7c, 0x20a9, 0x0008, 0x0136, 0xad88, 0x0017, 0x2198, 0x20a1,
-	0x021b, 0x53a6, 0x013e, 0x20a1, 0x020b, 0x22a2, 0x26a2, 0x60c3,
-	0x0020, 0x20e1, 0x9080, 0x6014, 0xa084, 0x0004, 0xa085, 0x0009,
-	0x6016, 0x2001, 0x8dc6, 0x2003, 0x07d0, 0x2001, 0x8dc5, 0x2003,
-	0x0009, 0x080c, 0x166c, 0x014e, 0x015e, 0x00de, 0x0005, 0x20e1,
-	0x9080, 0x20e1, 0x4000, 0x7a18, 0xa280, 0x0023, 0x2014, 0x8210,
-	0xa294, 0x00ff, 0x2202, 0x8217, 0x7818, 0xa080, 0x0028, 0x2004,
-	0x2019, 0x8b32, 0x231c, 0xd3ac, 0x1110, 0xd0bc, 0x0188, 0x00d6,
-	0xa0e8, 0x8c34, 0x2d6c, 0x6810, 0xa085, 0x0600, 0x20a2, 0x6814,
-	0x20a2, 0x2069, 0x8b1b, 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0088,
-	0x00d6, 0xa0e8, 0x8c34, 0x2d6c, 0x6810, 0xa085, 0x0600, 0x20a2,
-	0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2009, 0x8b14, 0x210c,
-	0x21a2, 0x20a3, 0x0829, 0x20a3, 0x0000, 0x22a2, 0x20a3, 0x0000,
-	0x2fa2, 0x20a3, 0xffff, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x0005,
-	0x00d6, 0x0156, 0x0136, 0x0146, 0x20a1, 0x020b, 0x00c1, 0x7810,
-	0x2068, 0x6860, 0x20a2, 0x685c, 0x20a2, 0x6880, 0x20a2, 0x687c,
-	0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x60c3, 0x000c,
-	0x080c, 0x66e4, 0x014e, 0x013e, 0x015e, 0x00de, 0x0005, 0x0026,
-	0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004,
-	0x2011, 0x8b32, 0x2214, 0xd2ac, 0x1110, 0xd0bc, 0x0188, 0x00d6,
-	0xa0e8, 0x8c34, 0x2d6c, 0x6810, 0xa085, 0x0500, 0x20a2, 0x6814,
-	0x20a2, 0x2069, 0x8b1b, 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0088,
-	0x00d6, 0xa0e8, 0x8c34, 0x2d6c, 0x6810, 0xa085, 0x0500, 0x20a2,
-	0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011, 0x8b14, 0x2214,
-	0x22a2, 0x20a3, 0x0889, 0x20a3, 0x0000, 0x080c, 0x66d3, 0x22a2,
-	0x20a3, 0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3,
-	0x0000, 0x002e, 0x0005, 0x00d6, 0x0156, 0x0136, 0x0146, 0x20a1,
-	0x020b, 0x080c, 0x64fb, 0x7810, 0x2068, 0xa016, 0x22a2, 0x22a2,
-	0x22a2, 0x22a2, 0x22a2, 0x7810, 0xa084, 0xf000, 0x1130, 0x7810,
-	0xa084, 0x0700, 0x8007, 0x0043, 0x0010, 0xa006, 0x002b, 0x014e,
-	0x013e, 0x015e, 0x00de, 0x0005, 0x641e, 0x649e, 0x64a1, 0x64c4,
-	0x64d1, 0x64e6, 0x64e9, 0x641c, 0x080c, 0x1410, 0x0016, 0x0036,
-	0x694c, 0xa18c, 0x0003, 0xa186, 0x0000, 0x1150, 0x6b78, 0x23a2,
-	0x6868, 0x20a2, 0x6864, 0x20a2, 0x003e, 0x001e, 0x0804, 0x64c8,
-	0xa186, 0x0001, 0x1904, 0x6499, 0x6b78, 0x23a2, 0x6868, 0x20a2,
-	0x6864, 0x20a2, 0x22a2, 0x6874, 0x20a2, 0x22a2, 0x687c, 0x20a2,
-	0x2009, 0x0018, 0xa384, 0x0300, 0x0904, 0x6498, 0xd3c4, 0x0110,
-	0x687c, 0xa108, 0xd3cc, 0x0110, 0x6874, 0xa108, 0x0156, 0x20a9,
-	0x000d, 0xad80, 0x0020, 0x201c, 0x831f, 0x23a2, 0x8000, 0x1f04,
-	0x6453, 0x015e, 0x22a2, 0x22a2, 0x22a2, 0xa184, 0x0003, 0x05c0,
-	0x20a1, 0x020b, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x0006, 0x7818,
-	0xa080, 0x0028, 0x2004, 0xd0bc, 0x0188, 0x00d6, 0xa0e8, 0x8c34,
-	0x2d6c, 0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, 0x20a2, 0x2069,
-	0x8b1b, 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0088, 0x00d6, 0xa0e8,
-	0x8c34, 0x2d6c, 0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, 0x20a2,
-	0x00de, 0x20a3, 0x0000, 0x2011, 0x8b14, 0x2214, 0x22a2, 0x000e,
-	0x20a3, 0x0898, 0x20a2, 0x080c, 0x66d3, 0x22a2, 0x20a3, 0x0000,
-	0x61c2, 0x003e, 0x001e, 0x080c, 0x66e4, 0x0005, 0x20a3, 0x0008,
-	0x0428, 0x20a3, 0x0302, 0x22a2, 0x22a2, 0x22a2, 0x20a3, 0x0012,
-	0x22a2, 0x20a3, 0x0008, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x20a3,
-	0x7000, 0x20a3, 0x0500, 0x22a2, 0x20a3, 0x000a, 0x22a2, 0x22a2,
-	0x20a3, 0x2500, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x60c3,
-	0x0032, 0x080c, 0x66e4, 0x0005, 0x20a3, 0x0028, 0x22a2, 0x22a2,
-	0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x60c3, 0x0018, 0x080c, 0x66e4,
-	0x0005, 0x20a3, 0x0100, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2,
-	0x20a3, 0x0008, 0x22a2, 0x7824, 0xa084, 0x00ff, 0x20a2, 0x22a2,
-	0x22a2, 0x60c3, 0x0020, 0x080c, 0x66e4, 0x0005, 0x20a3, 0x0008,
-	0x08e8, 0x0036, 0x7b10, 0xa384, 0xff00, 0x7812, 0xa384, 0x00ff,
-	0x8001, 0x1118, 0x22a2, 0x003e, 0x0888, 0x20a3, 0x0800, 0x22a2,
-	0x20a2, 0x003e, 0x0868, 0x0026, 0x20e1, 0x9080, 0x20e1, 0x4000,
-	0x7818, 0xa080, 0x0028, 0x2004, 0x2011, 0x8b32, 0x2214, 0xd2ac,
-	0x1110, 0xd0bc, 0x0188, 0x00d6, 0xa0e8, 0x8c34, 0x2d6c, 0x6810,
-	0xa085, 0x0700, 0x20a2, 0x6814, 0x20a2, 0x2069, 0x8b1b, 0x2da6,
-	0x8d68, 0x2da6, 0x00de, 0x0088, 0x00d6, 0xa0e8, 0x8c34, 0x2d6c,
-	0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3,
-	0x0000, 0x2011, 0x8b14, 0x2214, 0x22a2, 0x20a3, 0x0898, 0x20a3,
-	0x0000, 0x080c, 0x66d3, 0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2,
-	0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x002e, 0x0005, 0x00d6,
-	0x0156, 0x0136, 0x0146, 0x0016, 0x0036, 0x7810, 0xa084, 0x0700,
-	0x8007, 0x003b, 0x003e, 0x001e, 0x014e, 0x013e, 0x015e, 0x00de,
-	0x0005, 0x6559, 0x6559, 0x655b, 0x6559, 0x6559, 0x6559, 0x657d,
-	0x6559, 0x080c, 0x1410, 0x7910, 0xa18c, 0xf8ff, 0xa18d, 0x0600,
-	0x7912, 0x20a1, 0x020b, 0x2009, 0x0003, 0x00f9, 0x00d6, 0x2069,
-	0x8b51, 0x6804, 0xd0bc, 0x0130, 0x682c, 0xa084, 0x00ff, 0x8007,
-	0x20a2, 0x0010, 0x20a3, 0x3f00, 0x00de, 0x22a2, 0x22a2, 0x22a2,
-	0x60c3, 0x0001, 0x080c, 0x66e4, 0x0005, 0x20a1, 0x020b, 0x2009,
-	0x0003, 0x0019, 0x20a3, 0x7f00, 0x0c80, 0x0026, 0x20e1, 0x9080,
-	0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0x2011, 0x8b32,
-	0x2214, 0xd2ac, 0x1110, 0xd0bc, 0x0188, 0x00d6, 0xa0e8, 0x8c34,
-	0x2d6c, 0x6810, 0xa085, 0x0100, 0x20a2, 0x6814, 0x20a2, 0x2069,
-	0x8b1b, 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0088, 0x00d6, 0xa0e8,
-	0x8c34, 0x2d6c, 0x6810, 0xa085, 0x0100, 0x20a2, 0x6814, 0x20a2,
-	0x00de, 0x20a3, 0x0000, 0x2011, 0x8b14, 0x2214, 0x22a2, 0x20a3,
-	0x0888, 0xa18d, 0x0008, 0x21a2, 0x080c, 0x66d3, 0x22a2, 0x20a3,
-	0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000,
-	0x002e, 0x0005, 0x00e6, 0x00d6, 0x00c6, 0x0056, 0x0046, 0x0036,
-	0x2061, 0x0100, 0x2071, 0x8b00, 0x7150, 0x7818, 0x2068, 0x68a0,
-	0x2028, 0x76c8, 0xd6ac, 0x1130, 0xd0bc, 0x1120, 0x6910, 0x6a14,
-	0x7450, 0x0020, 0x6910, 0x6a14, 0x736c, 0x7470, 0x781c, 0xa086,
-	0x0006, 0x0904, 0x6640, 0x70c8, 0xd0ac, 0x1110, 0xd5bc, 0x0138,
-	0xa185, 0x0100, 0x6062, 0x6266, 0x636a, 0x646e, 0x0038, 0xa185,
-	0x0100, 0x6062, 0x6266, 0x606b, 0x0000, 0x646e, 0x6073, 0x0809,
-	0x6077, 0x0008, 0x688c, 0x8000, 0xa084, 0x00ff, 0x688e, 0x8007,
-	0x607a, 0x607f, 0x0000, 0x2f00, 0x6082, 0x7808, 0x6086, 0x7810,
-	0x2070, 0x7014, 0x608a, 0x7010, 0x608e, 0x700c, 0x60c6, 0x7008,
-	0x60ca, 0x686c, 0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000, 0xa582,
-	0x0080, 0x0248, 0x6a00, 0xd2f4, 0x0120, 0x6a14, 0xa294, 0x00ff,
-	0x0010, 0x2011, 0x0000, 0x629e, 0x080c, 0x6cb4, 0x2009, 0x07d0,
-	0x60c4, 0xa084, 0xfff0, 0xa005, 0x0110, 0x2009, 0x1b58, 0x080c,
-	0x567f, 0x003e, 0x004e, 0x005e, 0x00ce, 0x00de, 0x00ee, 0x0005,
-	0x7810, 0x2070, 0x704c, 0xa084, 0x0003, 0xa086, 0x0002, 0x0904,
-	0x668e, 0x2001, 0x8b32, 0x2004, 0xd0ac, 0x1110, 0xd5bc, 0x0138,
-	0xa185, 0x0100, 0x6062, 0x6266, 0x636a, 0x646e, 0x0038, 0xa185,
-	0x0100, 0x6062, 0x6266, 0x606b, 0x0000, 0x646e, 0x6073, 0x0880,
-	0x6077, 0x0008, 0x688c, 0x8000, 0xa084, 0x00ff, 0x688e, 0x8007,
-	0x607a, 0x607f, 0x0000, 0x2f00, 0x6086, 0x7808, 0x6082, 0x7060,
-	0x608a, 0x705c, 0x608e, 0x7080, 0x60c6, 0x707c, 0x60ca, 0x686c,
-	0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000, 0xa582, 0x0080, 0x0248,
-	0x6a00, 0xd2f4, 0x0120, 0x6a14, 0xa294, 0x00ff, 0x0010, 0x2011,
-	0x0000, 0x629e, 0x080c, 0x6cb1, 0x0804, 0x662e, 0x2001, 0x8b32,
-	0x2004, 0xd0ac, 0x1110, 0xd5bc, 0x0138, 0xa185, 0x0700, 0x6062,
-	0x6266, 0x636a, 0x646e, 0x0038, 0xa185, 0x0700, 0x6062, 0x6266,
-	0x606b, 0x0000, 0x646e, 0x6073, 0x0898, 0x6077, 0x0000, 0x688c,
-	0x8000, 0xa084, 0x00ff, 0x688e, 0x8007, 0x607a, 0x607f, 0x0000,
-	0x2f00, 0x6086, 0x7808, 0x6082, 0x7014, 0x608a, 0x7010, 0x608e,
-	0x700c, 0x60c6, 0x7008, 0x60ca, 0x686c, 0x60ce, 0x60af, 0x95d5,
-	0x60d7, 0x0000, 0xa582, 0x0080, 0x0248, 0x6a00, 0xd2f4, 0x0120,
-	0x6a14, 0xa294, 0x00ff, 0x0010, 0x2011, 0x0000, 0x629e, 0x080c,
-	0x6cb4, 0x0804, 0x662e, 0x7a18, 0xa280, 0x0023, 0x2014, 0x8210,
-	0xa294, 0x00ff, 0x2202, 0x8217, 0x0005, 0x00d6, 0x2069, 0x8daa,
-	0x6843, 0x0001, 0x00de, 0x0005, 0x20e1, 0x9080, 0x60a3, 0x0056,
-	0x60a7, 0x9575, 0x0019, 0x080c, 0x5671, 0x0005, 0x0006, 0x6014,
-	0xa084, 0x0004, 0xa085, 0x0009, 0x6016, 0x000e, 0x0005, 0x0006,
-	0x00c6, 0x2061, 0x0100, 0x6014, 0xa084, 0x0004, 0xa085, 0x0008,
-	0x6016, 0x00ce, 0x000e, 0x0005, 0x00c6, 0x00d6, 0x0016, 0x0026,
-	0x080c, 0x567a, 0x2061, 0x0100, 0x2069, 0x0140, 0x080c, 0x4c42,
-	0x1128, 0x0c29, 0x080c, 0x4cbf, 0x0150, 0x0438, 0x6904, 0xa194,
-	0x4000, 0x0540, 0x08e1, 0x6803, 0x1000, 0x6803, 0x0000, 0x00c6,
-	0x2061, 0x8daa, 0x6128, 0xa192, 0x0002, 0x1258, 0x8108, 0x612a,
-	0x6124, 0x00ce, 0x81ff, 0x0188, 0x080c, 0x5671, 0x080c, 0x66ee,
-	0x0060, 0x6124, 0xa1e5, 0x0000, 0x0130, 0x080c, 0x8a4b, 0x2009,
-	0x0014, 0x080c, 0x6d3f, 0x00ce, 0x0000, 0x002e, 0x001e, 0x00de,
-	0x00ce, 0x0005, 0x080c, 0x403d, 0x0cc0, 0x00c6, 0x00d6, 0x00e6,
-	0x0016, 0x0026, 0x080c, 0x5687, 0x2071, 0x8daa, 0x713c, 0x81ff,
-	0x0530, 0x2061, 0x0100, 0x2069, 0x0140, 0x080c, 0x4c42, 0x1148,
-	0x0036, 0x2019, 0x0001, 0x080c, 0x68e5, 0x003e, 0x080c, 0x4cbf,
-	0x00b0, 0x6904, 0xa194, 0x4000, 0x01c0, 0x6803, 0x1000, 0x6803,
-	0x0000, 0x0036, 0x2019, 0x0001, 0x080c, 0x68e5, 0x003e, 0x713c,
-	0x2160, 0x080c, 0x8a4b, 0x2009, 0x004a, 0x080c, 0x6d3f, 0x002e,
-	0x001e, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x0c58, 0x00e6, 0x00d6,
-	0x00c6, 0x0066, 0x0056, 0x0046, 0x0006, 0x0126, 0x2091, 0x8000,
-	0x6018, 0x2068, 0x6ca0, 0x2071, 0x8daa, 0x7018, 0x2068, 0x8dff,
-	0x0198, 0x68a0, 0xa406, 0x0118, 0x6854, 0x2068, 0x0cc0, 0x6010,
-	0x2060, 0x643c, 0x6540, 0x6e48, 0x2d60, 0x080c, 0x4458, 0x0120,
-	0x080c, 0x6a05, 0xa085, 0x0001, 0x012e, 0x000e, 0x004e, 0x005e,
-	0x006e, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x0156, 0x0146, 0x20a1,
-	0x020b, 0x080c, 0x60a5, 0x20a3, 0x0f00, 0x20a3, 0x0000, 0x20a3,
-	0x0000, 0x7808, 0x20a2, 0x60c3, 0x0008, 0x080c, 0x66e4, 0x014e,
-	0x015e, 0x0005, 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x612f,
-	0x20a3, 0x0200, 0x20a3, 0x0000, 0x20a9, 0x0006, 0x2011, 0x8b40,
-	0x2019, 0x8b41, 0x23a6, 0x22a6, 0xa398, 0x0002, 0xa290, 0x0002,
-	0x1f04, 0x67d2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x001c,
-	0x080c, 0x66e4, 0x014e, 0x015e, 0x0005, 0x0156, 0x0146, 0x0016,
-	0x0026, 0x20a1, 0x020b, 0x080c, 0x6110, 0x080c, 0x6126, 0x7810,
-	0x0006, 0xa080, 0x0015, 0x2098, 0x7808, 0xa088, 0x0002, 0x21a8,
-	0x53a6, 0xa080, 0x0004, 0x8003, 0x60c2, 0x000e, 0xa080, 0x0001,
-	0x2004, 0x7812, 0x080c, 0x66e4, 0x002e, 0x001e, 0x014e, 0x015e,
-	0x0005, 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x60a5, 0x20a3,
-	0x6200, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x7808, 0x20a2, 0x60c3,
-	0x0008, 0x080c, 0x66e4, 0x014e, 0x015e, 0x0005, 0x0156, 0x0146,
-	0x0016, 0x0026, 0x20a1, 0x020b, 0x080c, 0x60a5, 0x7810, 0x0006,
-	0xa080, 0x0017, 0x2098, 0x7808, 0xa088, 0x0002, 0x21a8, 0x53a6,
-	0x8003, 0x60c2, 0x000e, 0xa080, 0x0001, 0x2004, 0x7812, 0x080c,
-	0x66e4, 0x002e, 0x001e, 0x014e, 0x015e, 0x0005, 0x00e6, 0x00c6,
-	0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x8daa, 0x700c, 0x2060,
-	0x8cff, 0x0178, 0x080c, 0x7d69, 0x1110, 0x080c, 0x6fb6, 0x600c,
-	0x0006, 0x080c, 0x7df6, 0x080c, 0x6d18, 0x080c, 0x6a05, 0x00ce,
-	0x0c78, 0x700f, 0x0000, 0x700b, 0x0000, 0x012e, 0x000e, 0x00ce,
-	0x00ee, 0x0005, 0x0126, 0x0156, 0x00f6, 0x00e6, 0x00d6, 0x00c6,
-	0x0026, 0x0016, 0x0006, 0x2091, 0x8000, 0x2069, 0x0100, 0x2079,
-	0x0140, 0x2071, 0x8daa, 0x7024, 0x2060, 0x8cff, 0x05a0, 0x080c,
-	0x66f7, 0x68c3, 0x0000, 0x080c, 0x567a, 0x2009, 0x0013, 0x080c,
-	0x6d3f, 0x20a9, 0x01f4, 0x6824, 0xd094, 0x0158, 0x6827, 0x0004,
-	0x7804, 0xa084, 0x4000, 0x01a0, 0x7803, 0x1000, 0x7803, 0x0000,
-	0x0078, 0xd084, 0x0118, 0x6827, 0x0001, 0x0010, 0x1f04, 0x6883,
-	0x7804, 0xa084, 0x1000, 0x0120, 0x7803, 0x0100, 0x7803, 0x0000,
-	0x6824, 0x000e, 0x001e, 0x002e, 0x00ce, 0x00de, 0x00ee, 0x00fe,
-	0x015e, 0x012e, 0x0005, 0x2001, 0x8b00, 0x2004, 0xa096, 0x0001,
-	0x0550, 0xa096, 0x0004, 0x0538, 0x6817, 0x0008, 0x68c3, 0x0000,
-	0x2011, 0x3fe7, 0x080c, 0x560d, 0x20a9, 0x01f4, 0x6824, 0xd094,
-	0x0158, 0x6827, 0x0004, 0x7804, 0xa084, 0x4000, 0x01a0, 0x7803,
-	0x1000, 0x7803, 0x0000, 0x0078, 0xd084, 0x0118, 0x6827, 0x0001,
-	0x0010, 0x1f04, 0x68be, 0x7804, 0xa084, 0x1000, 0x0120, 0x7803,
-	0x0100, 0x7803, 0x0000, 0x000e, 0x001e, 0x002e, 0x00ce, 0x00de,
-	0x00ee, 0x00fe, 0x015e, 0x012e, 0x0005, 0x0126, 0x0156, 0x00f6,
-	0x00e6, 0x00d6, 0x00c6, 0x0026, 0x0016, 0x0006, 0x2091, 0x8000,
-	0x2069, 0x0100, 0x2079, 0x0140, 0x2071, 0x8daa, 0x703c, 0x2060,
-	0x8cff, 0x0904, 0x6952, 0x6817, 0x0010, 0x68c7, 0x0000, 0x68cb,
-	0x0000, 0x080c, 0x5687, 0x080c, 0x1e15, 0x0046, 0x2009, 0x017f,
-	0x200b, 0x00a5, 0x2021, 0x0169, 0x2404, 0xa084, 0x000f, 0xa086,
-	0x0004, 0x11b0, 0x68c7, 0x0000, 0x68cb, 0x0008, 0x00e6, 0x00f6,
-	0x2079, 0x0020, 0x2071, 0x8dff, 0x6814, 0xa084, 0x0184, 0xa085,
-	0x0012, 0x6816, 0x7803, 0x0008, 0x7003, 0x0000, 0x00fe, 0x00ee,
-	0x200b, 0x0000, 0x004e, 0xa39d, 0x0000, 0x1120, 0x2009, 0x0049,
-	0x080c, 0x6d3f, 0x20a9, 0x03e8, 0x6824, 0xd094, 0x0158, 0x6827,
-	0x0004, 0x7804, 0xa084, 0x4000, 0x01a0, 0x7803, 0x1000, 0x7803,
-	0x0000, 0x0078, 0xd094, 0x0118, 0x6827, 0x0002, 0x0010, 0x1f04,
-	0x6934, 0x7804, 0xa084, 0x1000, 0x0120, 0x7803, 0x0100, 0x7803,
-	0x0000, 0x6824, 0x000e, 0x001e, 0x002e, 0x00ce, 0x00de, 0x00ee,
-	0x00fe, 0x015e, 0x012e, 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000,
-	0x2069, 0x8daa, 0x6a06, 0x012e, 0x00de, 0x0005, 0x00d6, 0x0126,
-	0x2091, 0x8000, 0x2069, 0x8daa, 0x6a32, 0x012e, 0x00de, 0x0005,
-	0x00f6, 0x00e6, 0x00c6, 0x0066, 0x0006, 0x0126, 0x2071, 0x8daa,
-	0x7614, 0x2660, 0x2678, 0x2091, 0x8000, 0x8cff, 0x0538, 0x601c,
-	0xa206, 0x1500, 0x7014, 0xac36, 0x1110, 0x660c, 0x7616, 0x7010,
-	0xac36, 0x1140, 0x2c00, 0xaf36, 0x0118, 0x2f00, 0x7012, 0x0010,
-	0x7013, 0x0000, 0x660c, 0x0066, 0x2c00, 0xaf06, 0x0110, 0x7e0e,
-	0x0008, 0x2678, 0x600f, 0x0000, 0x080c, 0x7d3c, 0x080c, 0x6a05,
-	0x00ce, 0x08d8, 0x2c78, 0x600c, 0x2060, 0x08b8, 0x012e, 0x000e,
-	0x006e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x0156, 0x0146, 0x20a1,
-	0x020b, 0x080c, 0x6347, 0x7810, 0x20a2, 0xa006, 0x20a2, 0x20a2,
-	0x20a2, 0x20a2, 0x20a3, 0x1000, 0x0804, 0x69fd, 0x0156, 0x0146,
-	0x20a1, 0x020b, 0x080c, 0x6347, 0x7810, 0x20a2, 0xa006, 0x20a2,
-	0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x4000, 0x0478, 0x0156, 0x0146,
-	0x20a1, 0x020b, 0x080c, 0x6347, 0x7810, 0x20a2, 0xa006, 0x20a2,
-	0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x2000, 0x00f8, 0x0156, 0x0146,
-	0x20a1, 0x020b, 0x080c, 0x6347, 0x7810, 0x20a2, 0xa006, 0x20a2,
-	0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x0400, 0x0078, 0x0156, 0x0146,
-	0x20a1, 0x020b, 0x080c, 0x6347, 0x7810, 0x20a2, 0xa006, 0x20a2,
-	0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x0200, 0x0089, 0x60c3, 0x0020,
-	0x080c, 0x66e4, 0x014e, 0x015e, 0x0005, 0x00e6, 0x2071, 0x8daa,
-	0x7020, 0xa005, 0x0110, 0x8001, 0x7022, 0x00ee, 0x0005, 0x20a9,
-	0x0008, 0x20a2, 0x1f04, 0x6a11, 0x20a2, 0x20a2, 0x0005, 0x00f6,
-	0x00e6, 0x00d6, 0x00c6, 0x0076, 0x0066, 0x0006, 0x0126, 0x2091,
-	0x8000, 0x2071, 0x8daa, 0x7614, 0x2660, 0x2678, 0x2039, 0x0001,
-	0x87ff, 0x0904, 0x6a9f, 0x8cff, 0x0904, 0x6a9f, 0x601c, 0xa086,
-	0x0006, 0x1904, 0x6a9a, 0x88ff, 0x0138, 0x2800, 0xac06, 0x1904,
-	0x6a9a, 0x2039, 0x0000, 0x0050, 0x6018, 0xa206, 0x1904, 0x6a9a,
-	0x85ff, 0x0120, 0x6020, 0xa106, 0x1904, 0x6a9a, 0x7024, 0xac06,
-	0x1538, 0x2069, 0x0100, 0x68c0, 0xa005, 0x01f0, 0x080c, 0x567a,
-	0x6817, 0x0008, 0x68c3, 0x0000, 0x080c, 0x6b23, 0x7027, 0x0000,
-	0x0036, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, 0x0120, 0x6803,
-	0x0100, 0x6803, 0x0000, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110,
-	0x6827, 0x0001, 0x003e, 0x0020, 0x6003, 0x0009, 0x630a, 0x0450,
-	0x7014, 0xac36, 0x1110, 0x660c, 0x7616, 0x7010, 0xac36, 0x1140,
-	0x2c00, 0xaf36, 0x0118, 0x2f00, 0x7012, 0x0010, 0x7013, 0x0000,
-	0x660c, 0x0066, 0x2c00, 0xaf06, 0x0110, 0x7e0e, 0x0008, 0x2678,
-	0x600f, 0x0000, 0x6010, 0x2068, 0x080c, 0x7b8f, 0x0110, 0x080c,
-	0x8942, 0x080c, 0x7d3c, 0x080c, 0x6a05, 0x88ff, 0x1190, 0x00ce,
-	0x0804, 0x6a28, 0x2c78, 0x600c, 0x2060, 0x0804, 0x6a28, 0xa006,
-	0x012e, 0x000e, 0x006e, 0x007e, 0x00ce, 0x00de, 0x00ee, 0x00fe,
-	0x0005, 0x6017, 0x0000, 0x00ce, 0xa8c5, 0x0001, 0x0c88, 0x00f6,
-	0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0026, 0x0006, 0x0126, 0x2091,
-	0x8000, 0x2071, 0x8daa, 0x7638, 0x2660, 0x2678, 0x8cff, 0x0904,
-	0x6b13, 0x601c, 0xa086, 0x0006, 0x1904, 0x6b0e, 0x88ff, 0x0128,
-	0x2800, 0xac06, 0x1904, 0x6b0e, 0x0040, 0x6018, 0xa206, 0x15f0,
-	0x85ff, 0x0118, 0x6020, 0xa106, 0x15c8, 0x703c, 0xac06, 0x1170,
-	0x0036, 0x2019, 0x0001, 0x080c, 0x68e5, 0x7033, 0x0000, 0x703f,
-	0x0000, 0x7043, 0x0000, 0x7047, 0x0000, 0x003e, 0x7038, 0xac36,
-	0x1110, 0x660c, 0x763a, 0x7034, 0xac36, 0x1140, 0x2c00, 0xaf36,
-	0x0118, 0x2f00, 0x7036, 0x0010, 0x7037, 0x0000, 0x660c, 0x0066,
-	0x2c00, 0xaf06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000,
-	0x6010, 0x2068, 0x080c, 0x7b8f, 0x0110, 0x080c, 0x8942, 0x080c,
-	0x7d3c, 0x88ff, 0x1190, 0x00ce, 0x0804, 0x6abe, 0x2c78, 0x600c,
-	0x2060, 0x0804, 0x6abe, 0xa006, 0x012e, 0x000e, 0x002e, 0x006e,
-	0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x6017, 0x0000, 0x00ce,
-	0xa8c5, 0x0001, 0x0c88, 0x00e6, 0x2071, 0x8daa, 0x2001, 0x8b00,
-	0x2004, 0xa086, 0x0002, 0x1118, 0x7007, 0x0005, 0x0010, 0x7007,
-	0x0000, 0x00ee, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0066, 0x0026,
-	0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x8daa, 0x2c10, 0x7638,
-	0x2660, 0x2678, 0x8cff, 0x0518, 0x2200, 0xac06, 0x11e0, 0x7038,
-	0xac36, 0x1110, 0x660c, 0x763a, 0x7034, 0xac36, 0x1140, 0x2c00,
-	0xaf36, 0x0118, 0x2f00, 0x7036, 0x0010, 0x7037, 0x0000, 0x660c,
-	0x2c00, 0xaf06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000,
-	0xa085, 0x0001, 0x0020, 0x2c78, 0x600c, 0x2060, 0x08d8, 0x012e,
-	0x000e, 0x002e, 0x006e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x00f6,
-	0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0006, 0x0126, 0x2091, 0x8000,
-	0x2071, 0x8daa, 0x760c, 0x2660, 0x2678, 0x8cff, 0x0904, 0x6bf2,
-	0x6018, 0xa080, 0x0028, 0x2004, 0xa206, 0x1904, 0x6bed, 0x7024,
-	0xac06, 0x1500, 0x2069, 0x0100, 0x68c0, 0xa005, 0x01d8, 0x080c,
-	0x66f7, 0x68c3, 0x0000, 0x080c, 0x6b23, 0x7027, 0x0000, 0x0036,
-	0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, 0x0120, 0x6803, 0x0100,
-	0x6803, 0x0000, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827,
-	0x0001, 0x003e, 0x700c, 0xac36, 0x1110, 0x660c, 0x760e, 0x7008,
-	0xac36, 0x1140, 0x2c00, 0xaf36, 0x0118, 0x2f00, 0x700a, 0x0010,
-	0x700b, 0x0000, 0x660c, 0x0066, 0x2c00, 0xaf06, 0x0110, 0x7e0e,
-	0x0008, 0x2678, 0x600f, 0x0000, 0x080c, 0x7d58, 0x1118, 0x080c,
-	0x2589, 0x00c0, 0x080c, 0x7d69, 0x1118, 0x080c, 0x6fb6, 0x0090,
-	0x6010, 0x2068, 0x080c, 0x7b8f, 0x0168, 0x601c, 0xa086, 0x0003,
-	0x1508, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x080c, 0x46a1,
-	0x080c, 0x7d30, 0x6003, 0x0000, 0x080c, 0x7df6, 0x080c, 0x7d3c,
-	0x080c, 0x6a05, 0x00ce, 0x0804, 0x6b7d, 0x2c78, 0x600c, 0x2060,
-	0x0804, 0x6b7d, 0x012e, 0x000e, 0x006e, 0x00ce, 0x00de, 0x00ee,
-	0x00fe, 0x0005, 0x601c, 0xa086, 0x0006, 0x19d8, 0x080c, 0x8942,
-	0x0c08, 0x0036, 0x0156, 0x0136, 0x0146, 0x3908, 0xa006, 0xa190,
-	0x0020, 0x221c, 0xa39e, 0x23f9, 0x1118, 0x8210, 0x8000, 0x0cc8,
-	0xa005, 0x0138, 0x20a9, 0x0020, 0x2198, 0xa110, 0x22a0, 0x22c8,
-	0x53a3, 0x014e, 0x013e, 0x015e, 0x003e, 0x0005, 0x00d6, 0x20a1,
-	0x020b, 0x080c, 0x612f, 0x20a3, 0x0200, 0x20a3, 0x0014, 0x60c3,
-	0x0014, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x2099, 0x8da4, 0x20a9,
-	0x0004, 0x53a6, 0x20a3, 0x0004, 0x20a3, 0x7878, 0x20a3, 0x0000,
-	0x20a3, 0x0000, 0x080c, 0x66e4, 0x00de, 0x0005, 0x20a1, 0x020b,
-	0x080c, 0x612f, 0x20a3, 0x0210, 0x20a3, 0x0018, 0x20a3, 0x0800,
-	0x7810, 0xa084, 0xff00, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000,
-	0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x7810, 0xa084,
-	0x00ff, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0018,
-	0x080c, 0x66e4, 0x0005, 0x20a1, 0x020b, 0x0079, 0x7910, 0x21a2,
-	0x20a3, 0x0000, 0x60c3, 0x0000, 0x20e1, 0x9080, 0x60a7, 0x9575,
-	0x080c, 0x66ee, 0x080c, 0x5671, 0x0005, 0x0156, 0x0136, 0x0036,
-	0x00d6, 0x00e6, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7824, 0x2068,
-	0xadf0, 0x000f, 0x7210, 0xa296, 0x00c0, 0xa294, 0xfffd, 0x7212,
-	0x7214, 0xa294, 0x0300, 0x7216, 0x7100, 0xa194, 0x00ff, 0x7308,
-	0xa384, 0x00ff, 0xa08d, 0xc200, 0x7102, 0xa384, 0xff00, 0xa215,
-	0x720a, 0x7004, 0x720c, 0x700e, 0x7206, 0x20a9, 0x000a, 0x2e98,
-	0x53a6, 0x60a3, 0x0035, 0x6a38, 0xa294, 0x7000, 0xa286, 0x3000,
-	0x0110, 0x60a3, 0x0037, 0x00ee, 0x00de, 0x003e, 0x013e, 0x015e,
-	0x0005, 0x2009, 0x0092, 0x0010, 0x2009, 0x0096, 0x60ab, 0x0036,
-	0x6116, 0x0005, 0x2061, 0x9200, 0x2a70, 0x7064, 0x7046, 0x704b,
-	0x9200, 0x0005, 0x00e6, 0x0126, 0x2071, 0x8b00, 0x2091, 0x8000,
-	0x7544, 0xa582, 0x0001, 0x0608, 0x7048, 0x2060, 0x6000, 0xa086,
-	0x0000, 0x0148, 0xace0, 0x000c, 0x7058, 0xac02, 0x1208, 0x0cb0,
-	0x2061, 0x9200, 0x0c98, 0x6003, 0x0008, 0x8529, 0x7546, 0xaca8,
-	0x000c, 0x7058, 0xa502, 0x1230, 0x754a, 0xa085, 0x0001, 0x012e,
-	0x00ee, 0x0005, 0x704b, 0x9200, 0x0cc0, 0xa006, 0x0cc0, 0x00e6,
-	0x2071, 0x8b00, 0x7544, 0xa582, 0x0001, 0x0600, 0x7048, 0x2060,
-	0x6000, 0xa086, 0x0000, 0x0148, 0xace0, 0x000c, 0x7058, 0xac02,
-	0x1208, 0x0cb0, 0x2061, 0x9200, 0x0c98, 0x6003, 0x0008, 0x8529,
-	0x7546, 0xaca8, 0x000c, 0x7058, 0xa502, 0x1228, 0x754a, 0xa085,
-	0x0001, 0x00ee, 0x0005, 0x704b, 0x9200, 0x0cc8, 0xa006, 0x0cc8,
-	0xac82, 0x9200, 0x0a0c, 0x1410, 0x2001, 0x8b16, 0x2004, 0xac02,
-	0x1a0c, 0x1410, 0xa006, 0x6006, 0x600a, 0x600e, 0x6012, 0x6016,
-	0x601a, 0x601f, 0x0000, 0x6003, 0x0000, 0x6022, 0x6026, 0x2061,
-	0x8b00, 0x6044, 0x8000, 0x6046, 0xa086, 0x0001, 0x0108, 0x0005,
-	0x0126, 0x2091, 0x8000, 0x080c, 0x5d10, 0x012e, 0x0cc0, 0x601c,
-	0xa084, 0x000f, 0x0002, 0x6d4d, 0x6d5c, 0x6d77, 0x6d92, 0x7dfe,
-	0x7e19, 0x7e34, 0x6d4d, 0x6d5c, 0x6d4d, 0xa186, 0x0013, 0x1128,
-	0x080c, 0x5c37, 0x080c, 0x5d10, 0x0005, 0xa18e, 0x0047, 0x1118,
-	0xa016, 0x080c, 0x16d1, 0x0005, 0x0066, 0x6000, 0xa0b2, 0x0010,
-	0x1a0c, 0x1410, 0x0013, 0x006e, 0x0005, 0x6d75, 0x6e85, 0x6fdf,
-	0x6d75, 0x702e, 0x6d75, 0x6d75, 0x6d75, 0x6e25, 0x733b, 0x6d75,
-	0x6d75, 0x6d75, 0x6d75, 0x6d75, 0x6d75, 0x080c, 0x1410, 0x0066,
-	0x6000, 0xa0b2, 0x0010, 0x1a0c, 0x1410, 0x0013, 0x006e, 0x0005,
-	0x6d90, 0x77f2, 0x6d90, 0x6d90, 0x6d90, 0x6d90, 0x6d90, 0x6d90,
-	0x77da, 0x78d0, 0x6d90, 0x781f, 0x7877, 0x781f, 0x7877, 0x6d90,
-	0x080c, 0x1410, 0x0066, 0x6000, 0xa0b2, 0x0010, 0x1a0c, 0x1410,
-	0x0013, 0x006e, 0x0005, 0x6dab, 0x7377, 0x742b, 0x74ef, 0x762f,
-	0x6dab, 0x6dab, 0x6dab, 0x7353, 0x778f, 0x7792, 0x6dab, 0x6dab,
-	0x6dab, 0x6dab, 0x77b7, 0x080c, 0x1410, 0x20a9, 0x000e, 0x2e98,
-	0x6010, 0x20a0, 0x53a3, 0x20a9, 0x0006, 0x3310, 0x3420, 0x9398,
-	0x94a0, 0x3318, 0x3428, 0x222e, 0x2326, 0xa290, 0x0002, 0xa5a8,
-	0x0002, 0xa398, 0x0002, 0xa4a0, 0x0002, 0x1f04, 0x6dbb, 0x00e6,
-	0x080c, 0x7b8f, 0x0130, 0x6010, 0x2070, 0x7007, 0x0000, 0x7037,
-	0x0103, 0x00ee, 0x080c, 0x6d18, 0x0005, 0x00d6, 0x0036, 0x7330,
-	0xa386, 0x0200, 0x1130, 0x6018, 0x2068, 0x6813, 0x00ff, 0x6817,
-	0xfffd, 0x6010, 0xa005, 0x0130, 0x2068, 0x6807, 0x0000, 0x6837,
-	0x0103, 0x6b32, 0x080c, 0x6d18, 0x003e, 0x00de, 0x0005, 0x0016,
-	0x20a9, 0x002a, 0xae80, 0x000c, 0x2098, 0x6010, 0xa080, 0x0002,
-	0x20a0, 0x53a3, 0x20a9, 0x002a, 0x6010, 0xa080, 0x0001, 0x2004,
-	0xa080, 0x0002, 0x20a0, 0x53a3, 0x00e6, 0x6010, 0x2004, 0x2070,
-	0x7037, 0x0103, 0x00ee, 0x080c, 0x6d18, 0x001e, 0x0005, 0x00d6,
-	0x20a9, 0x000e, 0x2e98, 0x6010, 0x20a0, 0x53a3, 0xa1b6, 0x0015,
-	0x1148, 0x6018, 0x2068, 0x7038, 0x680a, 0x703c, 0x680e, 0x6800,
-	0xc08d, 0x6802, 0x00de, 0x0804, 0x6dc7, 0x2100, 0xa1b2, 0x0040,
-	0x1a0c, 0x1410, 0x0002, 0x6e6d, 0x6e79, 0x6e6d, 0x6e6d, 0x6e6d,
-	0x6e6d, 0x6e6b, 0x6e6b, 0x6e6b, 0x6e6b, 0x6e6b, 0x6e6b, 0x6e6b,
-	0x6e6b, 0x6e6b, 0x6e6b, 0x6e6b, 0x6e6b, 0x6e6b, 0x6e6b, 0x6e6b,
-	0x6e6b, 0x6e6b, 0x6e6b, 0x6e6b, 0x6e6b, 0x6e6b, 0x6e6b, 0x6e6b,
-	0x6e6b, 0x6e6b, 0x6e6d, 0x6e6b, 0x6e6d, 0x6e6d, 0x6e6b, 0x6e6b,
-	0x6e6b, 0x6e6b, 0x6e6b, 0x6e6d, 0x6e6b, 0x6e6b, 0x6e6b, 0x6e6b,
-	0x6e6b, 0x6e6b, 0x6e6b, 0x6e6b, 0x6e6b, 0x6e6d, 0x6e6b, 0x6e6b,
-	0x6e6b, 0x6e6b, 0x6e6b, 0x6e6b, 0x6e6b, 0x6e6b, 0x6e6b, 0x6e6b,
-	0x6e6d, 0x6e6b, 0x6e6b, 0x080c, 0x1410, 0x6003, 0x0001, 0x6106,
-	0x080c, 0x58e2, 0x0126, 0x2091, 0x8000, 0x080c, 0x5d10, 0x012e,
-	0x0005, 0x6003, 0x0001, 0x6106, 0x080c, 0x58e2, 0x0126, 0x2091,
-	0x8000, 0x080c, 0x5d10, 0x012e, 0x0005, 0x6004, 0xa0b2, 0x0040,
-	0x1a0c, 0x1410, 0xa1b6, 0x0013, 0x0904, 0x6f25, 0xa1b6, 0x0027,
-	0x1904, 0x6eeb, 0x080c, 0x5c37, 0x6004, 0x080c, 0x7d58, 0x0188,
-	0x080c, 0x7d69, 0x0904, 0x6ee5, 0xa08e, 0x0021, 0x0904, 0x6ee8,
-	0xa08e, 0x0022, 0x0904, 0x6ee5, 0xa08e, 0x003d, 0x0904, 0x6ee8,
-	0x04a8, 0x080c, 0x2589, 0x2001, 0x0007, 0x080c, 0x42b9, 0x6018,
-	0xa080, 0x0028, 0x200c, 0x080c, 0x6fb6, 0xa186, 0x007e, 0x1148,
-	0x2001, 0x8b32, 0x2014, 0xc285, 0x080c, 0x4c42, 0x1108, 0xc2ad,
-	0x2202, 0x0016, 0x0026, 0x0036, 0x2110, 0x2019, 0x0028, 0x080c,
-	0x59d5, 0x0086, 0x2041, 0x0000, 0x080c, 0x5911, 0x00c6, 0x6018,
-	0xa065, 0x0110, 0x080c, 0x44e6, 0x00ce, 0x2c08, 0x080c, 0x878f,
-	0x008e, 0x003e, 0x002e, 0x001e, 0x080c, 0x42f5, 0x080c, 0x7df6,
-	0x080c, 0x6d18, 0x080c, 0x5d10, 0x0005, 0x080c, 0x6fb6, 0x0cb0,
-	0x080c, 0x6fd3, 0x0c98, 0xa186, 0x0014, 0x1db0, 0x080c, 0x5c37,
-	0x080c, 0x2563, 0x080c, 0x7d58, 0x1188, 0x080c, 0x2589, 0x6018,
-	0xa080, 0x0028, 0x200c, 0x080c, 0x6fb6, 0xa186, 0x007e, 0x1128,
-	0x2001, 0x8b32, 0x200c, 0xc185, 0x2102, 0x08c0, 0x080c, 0x7d69,
-	0x1118, 0x080c, 0x6fb6, 0x0890, 0x6004, 0xa08e, 0x0032, 0x1158,
-	0x00e6, 0x00f6, 0x2071, 0x8b81, 0x2079, 0x0000, 0x080c, 0x2848,
-	0x00fe, 0x00ee, 0x0818, 0x6004, 0xa08e, 0x0021, 0x0d50, 0xa08e,
-	0x0022, 0x090c, 0x6fd3, 0x0804, 0x6ede, 0x2008, 0x0002, 0x6f69,
-	0x6f6a, 0x6f6d, 0x6f70, 0x6f73, 0x6f76, 0x6f67, 0x6f67, 0x6f67,
-	0x6f67, 0x6f67, 0x6f67, 0x6f67, 0x6f67, 0x6f67, 0x6f67, 0x6f67,
-	0x6f67, 0x6f67, 0x6f67, 0x6f67, 0x6f67, 0x6f67, 0x6f67, 0x6f67,
-	0x6f67, 0x6f67, 0x6f67, 0x6f67, 0x6f67, 0x6f79, 0x6f7e, 0x6f67,
-	0x6f87, 0x6f7e, 0x6f67, 0x6f67, 0x6f67, 0x6f67, 0x6f67, 0x6f7e,
-	0x6f7e, 0x6f67, 0x6f67, 0x6f67, 0x6f67, 0x6f67, 0x6f67, 0x6f67,
-	0x6f67, 0x6f67, 0x6f67, 0x6f67, 0x6f67, 0x6f67, 0x6f67, 0x6f67,
-	0x6f67, 0x6f67, 0x6f67, 0x6f67, 0x6f7e, 0x6fad, 0x6f67, 0x080c,
-	0x1410, 0x00a0, 0x2001, 0x000b, 0x0418, 0x2001, 0x0003, 0x0400,
-	0x2001, 0x0005, 0x00e8, 0x2001, 0x0001, 0x00d0, 0x2001, 0x0009,
-	0x00b8, 0x080c, 0x1410, 0x0098, 0x080c, 0x42b9, 0x080c, 0x5c37,
-	0x6003, 0x0002, 0x6017, 0x0028, 0x080c, 0x5d10, 0x0040, 0x080c,
-	0x5c37, 0x6003, 0x0004, 0x6017, 0x0028, 0x080c, 0x5d10, 0x0005,
-	0x080c, 0x42b9, 0x080c, 0x5c37, 0x6003, 0x0002, 0x0036, 0x2019,
-	0x8b5c, 0x2304, 0xa084, 0xff00, 0x1118, 0x2019, 0x0028, 0x0040,
-	0x8007, 0xa09a, 0x0004, 0x0ec8, 0x8003, 0x801b, 0x831b, 0xa318,
-	0x6316, 0x003e, 0x080c, 0x5d10, 0x0c10, 0x080c, 0x5c37, 0x080c,
-	0x7df6, 0x080c, 0x6d18, 0x080c, 0x5d10, 0x08c8, 0x00e6, 0x080c,
-	0x7b8f, 0x01a0, 0x6010, 0x2070, 0x7038, 0xd0fc, 0x0178, 0x7007,
-	0x0000, 0x0016, 0x6004, 0xa08e, 0x0021, 0x0150, 0xa08e, 0x003d,
-	0x0138, 0x001e, 0x7037, 0x0103, 0x7033, 0x0100, 0x00ee, 0x0005,
-	0x001e, 0x0009, 0x0cd8, 0x00e6, 0xacf0, 0x0004, 0x2e74, 0x7000,
-	0x2070, 0x7037, 0x0103, 0x7023, 0x8001, 0x00ee, 0x0005, 0x00d6,
-	0x6618, 0x2668, 0x6804, 0xa084, 0x00ff, 0x00de, 0xa0b2, 0x000c,
-	0x1a0c, 0x1410, 0x6604, 0xa6b6, 0x0028, 0x1118, 0x080c, 0x7d93,
-	0x0468, 0x6604, 0xa6b6, 0x0029, 0x1118, 0x080c, 0x7daa, 0x0430,
-	0x6604, 0xa6b6, 0x001f, 0x1118, 0x080c, 0x6dad, 0x00f8, 0x6604,
-	0xa6b6, 0x0000, 0x1118, 0x080c, 0x6e0f, 0x00c0, 0x6604, 0xa6b6,
-	0x0022, 0x1118, 0x080c, 0x6dd5, 0x0088, 0x6604, 0xa6b6, 0x003d,
-	0x1118, 0x080c, 0x6def, 0x0050, 0xa1b6, 0x0015, 0x1110, 0x0053,
-	0x0028, 0xa1b6, 0x0016, 0x1118, 0x0804, 0x71c6, 0x0005, 0x080c,
-	0x6d55, 0x0ce0, 0x7045, 0x7048, 0x7045, 0x7082, 0x7045, 0x716c,
-	0x7045, 0x7045, 0x7045, 0x71a2, 0x7045, 0x71b6, 0xa1b6, 0x0048,
-	0x0140, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x080c, 0x16d1,
-	0x0005, 0x00e6, 0xacf0, 0x0004, 0x2e74, 0x7000, 0x2070, 0x7037,
-	0x0103, 0x00ee, 0x080c, 0x6d18, 0x0005, 0xe000, 0xe000, 0x0005,
-	0x00e6, 0x2071, 0x8b00, 0x7080, 0xa086, 0x0074, 0x11f0, 0x080c,
-	0x8766, 0x1170, 0x00d6, 0x6018, 0x2068, 0x00d9, 0x00de, 0x2001,
-	0x0006, 0x080c, 0x42b9, 0x080c, 0x2589, 0x080c, 0x6d18, 0x0078,
-	0x2001, 0x000a, 0x080c, 0x42b9, 0x080c, 0x2589, 0x6003, 0x0001,
-	0x6007, 0x0001, 0x080c, 0x58e2, 0x0010, 0x080c, 0x715d, 0x00ee,
-	0x0005, 0x6800, 0xd084, 0x0168, 0x2001, 0x0000, 0x080c, 0x42a7,
-	0x2069, 0x8b51, 0x6804, 0xd0a4, 0x0120, 0x2001, 0x0006, 0x080c,
-	0x42c7, 0x0005, 0x00d6, 0x2011, 0x8b20, 0x2204, 0xa086, 0x0074,
-	0x1904, 0x715a, 0x080c, 0x72a4, 0x6018, 0x2068, 0xa080, 0x0028,
-	0x2014, 0xa286, 0x007e, 0x0198, 0xa286, 0x0080, 0x1904, 0x70da,
-	0x6813, 0x00ff, 0x6817, 0xfffc, 0x6010, 0xa005, 0x0588, 0x2068,
-	0x6807, 0x0000, 0x6837, 0x0103, 0x6833, 0x0200, 0x0448, 0x00d6,
-	0x00e6, 0x00f6, 0x6813, 0x00ff, 0x6817, 0xfffe, 0x2071, 0x8b32,
-	0x2e04, 0xa085, 0x0003, 0x2072, 0x2071, 0x9080, 0x2079, 0x0100,
-	0x2e04, 0xa084, 0x00ff, 0x2069, 0x8b1b, 0x206a, 0x78e6, 0x8e70,
-	0x2e04, 0x2069, 0x8b1c, 0x206a, 0x78ea, 0x7832, 0x7836, 0xa084,
-	0x00ff, 0x2008, 0x080c, 0x2313, 0x00fe, 0x00ee, 0x00de, 0x0470,
-	0x2001, 0x0006, 0x080c, 0x42b9, 0x080c, 0x2589, 0x080c, 0x6d18,
-	0x0804, 0x715b, 0x00e6, 0x2071, 0x8b32, 0x2e04, 0xd09c, 0x0188,
-	0x2071, 0x9080, 0x7108, 0x720c, 0xa18c, 0x00ff, 0x1118, 0xa284,
-	0xff00, 0x0138, 0x6018, 0x2070, 0x70a0, 0xd0bc, 0x1110, 0x7112,
-	0x7216, 0x00ee, 0x2001, 0x0004, 0x080c, 0x42b9, 0x6003, 0x0001,
-	0x6007, 0x0003, 0x080c, 0x58e2, 0x0804, 0x715b, 0x685c, 0xd0e4,
-	0x01d0, 0x080c, 0x7dd2, 0x080c, 0x4c42, 0x0110, 0xd0dc, 0x1940,
-	0x2011, 0x8b32, 0x2204, 0xc0ad, 0x2012, 0x2001, 0x8d8d, 0x2004,
-	0x00f6, 0x2079, 0x0100, 0x78e3, 0x0000, 0x080c, 0x233e, 0x78e2,
-	0x00fe, 0x0804, 0x70d0, 0x080c, 0x7deb, 0x2011, 0x8b32, 0x2204,
-	0xc0a5, 0x2012, 0x0006, 0x080c, 0x884f, 0x000e, 0x1904, 0x70d0,
-	0xc0b5, 0x2012, 0x2001, 0x0000, 0x080c, 0x42a7, 0x00c6, 0x2009,
-	0x00ef, 0x00f6, 0x2079, 0x0100, 0x79ea, 0x7932, 0x7936, 0x00fe,
-	0x080c, 0x2313, 0x00f6, 0x2079, 0x8b00, 0x7972, 0x2100, 0x2009,
-	0x0000, 0x080c, 0x22e9, 0x794e, 0x00fe, 0x8108, 0x080c, 0x42d6,
-	0x2c00, 0x00ce, 0x1904, 0x70d0, 0x601a, 0x2001, 0x0002, 0x080c,
-	0x42b9, 0x601f, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c,
-	0x58e2, 0x0008, 0x0011, 0x00de, 0x0005, 0x2001, 0x8b00, 0x2004,
-	0xa086, 0x0003, 0x0120, 0x2001, 0x0007, 0x080c, 0x42b9, 0x080c,
-	0x2589, 0x080c, 0x6d18, 0x0005, 0x00e6, 0x2071, 0x8b00, 0x7080,
-	0xa086, 0x0014, 0x1548, 0x7000, 0xa086, 0x0003, 0x1128, 0x6010,
-	0xa005, 0x1110, 0x080c, 0x3689, 0x00d6, 0x6018, 0x2068, 0x080c,
-	0x43a0, 0x080c, 0x7071, 0x00de, 0x080c, 0x72ae, 0x11a8, 0x2001,
-	0x0006, 0x080c, 0x42b9, 0x00e6, 0x6010, 0xa005, 0x0138, 0x2070,
-	0x7007, 0x0000, 0x7037, 0x0103, 0x7033, 0x0200, 0x00ee, 0x080c,
-	0x2589, 0x080c, 0x6d18, 0x0020, 0x080c, 0x6fb6, 0x080c, 0x715d,
-	0x00ee, 0x0005, 0x2011, 0x8b20, 0x2204, 0xa086, 0x0014, 0x1158,
-	0x2001, 0x0002, 0x080c, 0x42b9, 0x6003, 0x0001, 0x6007, 0x0001,
-	0x080c, 0x58e2, 0x0010, 0x080c, 0x715d, 0x0005, 0x2011, 0x8b20,
-	0x2204, 0xa086, 0x0004, 0x1138, 0x2001, 0x0007, 0x080c, 0x42b9,
-	0x080c, 0x6d18, 0x0010, 0x080c, 0x715d, 0x0005, 0x000b, 0x0005,
-	0x7045, 0x71d4, 0x7045, 0x71f6, 0x7045, 0x7260, 0x7045, 0x7045,
-	0x7045, 0x7273, 0x7045, 0x7283, 0x00c6, 0x080c, 0x7293, 0x1178,
-	0x2001, 0x0000, 0x080c, 0x42a7, 0x2001, 0x0002, 0x080c, 0x42b9,
-	0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x58e2, 0x0068, 0x2009,
-	0x908f, 0x2104, 0xa084, 0xff00, 0xa086, 0x1900, 0x1118, 0x080c,
-	0x6d18, 0x0010, 0x080c, 0x715d, 0x00ce, 0x0005, 0x080c, 0x72a1,
-	0x00d6, 0x2069, 0x8d9c, 0x2d04, 0xa005, 0x0168, 0x6018, 0x2068,
-	0x68a0, 0xa086, 0x007e, 0x1138, 0x2069, 0x8b1c, 0x2d04, 0x8000,
-	0x206a, 0x00de, 0x0010, 0x00de, 0x0078, 0x2001, 0x0000, 0x080c,
-	0x42a7, 0x2001, 0x0002, 0x080c, 0x42b9, 0x6003, 0x0001, 0x6007,
-	0x0002, 0x080c, 0x58e2, 0x0428, 0x080c, 0x6fb6, 0x2009, 0x908e,
-	0x2134, 0xa6b4, 0x00ff, 0xa686, 0x0005, 0x01e0, 0xa686, 0x000b,
-	0x01b0, 0x2009, 0x908f, 0x2104, 0xa084, 0xff00, 0x1118, 0xa686,
-	0x0009, 0x0180, 0xa086, 0x1900, 0x1150, 0xa686, 0x0009, 0x0150,
-	0x2001, 0x0004, 0x080c, 0x42b9, 0x080c, 0x6d18, 0x0010, 0x080c,
-	0x715d, 0x0005, 0x00d6, 0x6010, 0x2068, 0x080c, 0x7b8f, 0x0128,
-	0x6838, 0xd0fc, 0x0110, 0x00de, 0x0c90, 0x6018, 0x2068, 0x6840,
-	0xa084, 0x00ff, 0xa005, 0x0140, 0x8001, 0x6842, 0x6017, 0x000a,
-	0x6007, 0x0016, 0x00de, 0x0c28, 0x080c, 0x2563, 0x00de, 0x08f8,
-	0x080c, 0x72a1, 0x1158, 0x2001, 0x0004, 0x080c, 0x42b9, 0x6003,
-	0x0001, 0x6007, 0x0003, 0x080c, 0x58e2, 0x0020, 0x080c, 0x6fb6,
-	0x080c, 0x715d, 0x0005, 0x0469, 0x1158, 0x2001, 0x0008, 0x080c,
-	0x42b9, 0x6003, 0x0001, 0x6007, 0x0005, 0x080c, 0x58e2, 0x0010,
-	0x080c, 0x715d, 0x0005, 0x00e9, 0x1158, 0x2001, 0x000a, 0x080c,
-	0x42b9, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x58e2, 0x0010,
-	0x080c, 0x715d, 0x0005, 0x2009, 0x908e, 0x2104, 0xa086, 0x0003,
-	0x1138, 0x2009, 0x908f, 0x2104, 0xa084, 0xff00, 0xa086, 0x2a00,
-	0x0005, 0xa085, 0x0001, 0x0005, 0x00c6, 0x0016, 0xac88, 0x0006,
-	0x2164, 0x080c, 0x4319, 0x001e, 0x00ce, 0x0005, 0x00e6, 0x2071,
-	0x908c, 0x7004, 0xa086, 0x0014, 0x11a8, 0x7008, 0xa086, 0x0800,
-	0x1188, 0x700c, 0xd0ec, 0x0160, 0xa084, 0x0f00, 0xa086, 0x0100,
-	0x1138, 0x7024, 0xd0a4, 0x1110, 0xd0ac, 0x0110, 0xa006, 0x0010,
-	0xa085, 0x0001, 0x00ee, 0x0005, 0x00e6, 0x00d6, 0x00c6, 0x0076,
-	0x0056, 0x0046, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2029,
-	0x8db3, 0x252c, 0x2021, 0x8db9, 0x2424, 0x2061, 0x9200, 0x2071,
-	0x8b00, 0x7244, 0x7064, 0xa202, 0x1688, 0x080c, 0x8999, 0x0540,
-	0x671c, 0xa786, 0x0001, 0x0520, 0xa786, 0x0007, 0x0508, 0x2500,
-	0xac06, 0x01f0, 0x2400, 0xac06, 0x01d8, 0x00c6, 0x6000, 0xa086,
-	0x0004, 0x1110, 0x080c, 0x179e, 0x6010, 0x2068, 0x080c, 0x7b8f,
-	0x0160, 0xa786, 0x0003, 0x11e0, 0x6837, 0x0103, 0x6b4a, 0x6847,
-	0x0000, 0x080c, 0x46a1, 0x080c, 0x7d30, 0x080c, 0x7d3c, 0x00ce,
-	0xace0, 0x000c, 0x7058, 0xac02, 0x1208, 0x0858, 0x012e, 0x000e,
-	0x002e, 0x004e, 0x005e, 0x007e, 0x00ce, 0x00de, 0x00ee, 0x0005,
-	0xa786, 0x0006, 0x1d08, 0x080c, 0x8942, 0x0c38, 0x220c, 0x2304,
-	0xa106, 0x1130, 0x8210, 0x8318, 0x1f04, 0x7326, 0xa006, 0x0005,
-	0x2304, 0xa102, 0x0218, 0x2001, 0x0001, 0x0010, 0x2001, 0x0000,
-	0xa18d, 0x0001, 0x0005, 0x6004, 0xa08a, 0x0040, 0x1a0c, 0x1410,
-	0x080c, 0x7d58, 0x0120, 0x080c, 0x7d69, 0x0150, 0x0010, 0x080c,
-	0x2589, 0x080c, 0x5c37, 0x080c, 0x6d18, 0x080c, 0x5d10, 0x0005,
-	0x080c, 0x6fb6, 0x0cb0, 0xa182, 0x0040, 0x0002, 0x7369, 0x7369,
-	0x7369, 0x7369, 0x7369, 0x7369, 0x7369, 0x7369, 0x7369, 0x7369,
-	0x7369, 0x736b, 0x736b, 0x736b, 0x736b, 0x7369, 0x7369, 0x7369,
-	0x736b, 0x080c, 0x1410, 0x6003, 0x0001, 0x6106, 0x080c, 0x589c,
-	0x0126, 0x2091, 0x8000, 0x080c, 0x5d10, 0x012e, 0x0005, 0xa186,
-	0x0013, 0x1128, 0x6004, 0xa082, 0x0040, 0x0804, 0x7400, 0xa186,
-	0x0027, 0x11d0, 0x080c, 0x5c37, 0x080c, 0x2563, 0x00d6, 0x6110,
-	0x2168, 0x080c, 0x7b8f, 0x0150, 0x6837, 0x0103, 0x684b, 0x0029,
-	0x6847, 0x0000, 0x080c, 0x46a1, 0x080c, 0x7d30, 0x00de, 0x080c,
-	0x6d18, 0x080c, 0x5d10, 0x0005, 0xa186, 0x0014, 0x1120, 0x6004,
-	0xa082, 0x0040, 0x0428, 0xa186, 0x0046, 0x0138, 0xa186, 0x0045,
-	0x0120, 0xa186, 0x0047, 0x190c, 0x1410, 0x2001, 0x0109, 0x2004,
-	0xd084, 0x0198, 0x0126, 0x2091, 0x2400, 0x0006, 0x0016, 0x0026,
-	0x080c, 0x578e, 0x002e, 0x001e, 0x000e, 0x012e, 0xe000, 0x6000,
-	0xa086, 0x0002, 0x1110, 0x0804, 0x742b, 0x080c, 0x6d55, 0x0005,
-	0x0002, 0x73de, 0x73dc, 0x73dc, 0x73dc, 0x73dc, 0x73dc, 0x73dc,
-	0x73dc, 0x73dc, 0x73dc, 0x73dc, 0x73f9, 0x73f9, 0x73f9, 0x73f9,
-	0x73dc, 0x73dc, 0x73dc, 0x73f9, 0x080c, 0x1410, 0x080c, 0x5c37,
-	0x00d6, 0x6110, 0x2168, 0x080c, 0x7b8f, 0x0168, 0x6837, 0x0103,
-	0x684b, 0x0006, 0x6847, 0x0000, 0x6850, 0xc0ec, 0x6852, 0x080c,
-	0x46a1, 0x080c, 0x7d30, 0x00de, 0x080c, 0x6d18, 0x080c, 0x5d10,
-	0x0005, 0x080c, 0x5c37, 0x080c, 0x6d18, 0x080c, 0x5d10, 0x0005,
-	0x0002, 0x7416, 0x7414, 0x7414, 0x7414, 0x7414, 0x7414, 0x7414,
-	0x7414, 0x7414, 0x7414, 0x7414, 0x7424, 0x7424, 0x7424, 0x7424,
-	0x7414, 0x7414, 0x7414, 0x7424, 0x080c, 0x1410, 0x080c, 0x5c37,
-	0x6003, 0x0002, 0x080c, 0x5d10, 0x6010, 0xa088, 0x0013, 0x2104,
-	0xa085, 0x0400, 0x200a, 0x0005, 0x080c, 0x5c37, 0x6003, 0x000f,
-	0x080c, 0x5d10, 0x0005, 0xa182, 0x0040, 0x0002, 0x7441, 0x7441,
-	0x7441, 0x7441, 0x7441, 0x7443, 0x74c5, 0x74e4, 0x7441, 0x7441,
-	0x7441, 0x7441, 0x7441, 0x7441, 0x7441, 0x7441, 0x7441, 0x7441,
-	0x7441, 0x080c, 0x1410, 0x00e6, 0x00d6, 0x2071, 0x908c, 0x6110,
-	0x2168, 0x7614, 0xa6b4, 0x0fff, 0x86ff, 0x0904, 0x74ab, 0xa68c,
-	0x0c00, 0x0120, 0x7318, 0x6b62, 0x731c, 0x6b5e, 0xa68c, 0x00ff,
-	0xa186, 0x0002, 0x0190, 0xa186, 0x0028, 0x1128, 0x080c, 0x7d47,
-	0x684b, 0x001c, 0x0060, 0xd6dc, 0x0118, 0x684b, 0x0015, 0x0038,
-	0xd6d4, 0x0118, 0x684b, 0x0007, 0x0010, 0x684b, 0x0000, 0x6837,
-	0x0103, 0x6e46, 0xa01e, 0xd6c4, 0x01b0, 0xa686, 0x0100, 0x1138,
-	0x2001, 0x9099, 0x2004, 0xa005, 0x1110, 0xc6c4, 0x0868, 0x7328,
-	0x732c, 0x6b56, 0x0036, 0x2308, 0x2019, 0x9098, 0xad90, 0x0019,
-	0x080c, 0x794f, 0x003e, 0xd6cc, 0x0560, 0x7124, 0x695a, 0xa192,
-	0x0021, 0x1250, 0x2071, 0x9098, 0x831c, 0x2300, 0xae18, 0xad90,
-	0x001d, 0x080c, 0x794f, 0x00e8, 0x6838, 0xd0fc, 0x0120, 0x2009,
-	0x0020, 0x695a, 0x0c78, 0x00f6, 0x2d78, 0x080c, 0x78f4, 0x00fe,
-	0x080c, 0x793f, 0x0080, 0x684b, 0x0000, 0x6837, 0x0103, 0x6e46,
-	0x684c, 0xd0ac, 0x0130, 0x6810, 0x6914, 0xa115, 0x0110, 0x080c,
-	0x7621, 0x080c, 0x46a1, 0x6218, 0x2268, 0x6a3c, 0x8211, 0x6a3e,
-	0x00de, 0x00ee, 0x080c, 0x6d18, 0x0005, 0x00f6, 0x6003, 0x0003,
-	0x2079, 0x908c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08, 0x6010, 0x2078,
-	0x784c, 0xd0ac, 0x0120, 0x6003, 0x0002, 0x00fe, 0x0005, 0x7c12,
-	0x7b16, 0x7e0a, 0x7d0e, 0x00fe, 0x2c10, 0x080c, 0x1bc8, 0x080c,
-	0x58ff, 0x080c, 0x5dc2, 0x0005, 0x6003, 0x0004, 0x6110, 0x20e1,
-	0x0005, 0x3d18, 0x3e20, 0x2c10, 0x080c, 0x16d1, 0x0005, 0xa182,
-	0x0040, 0x0002, 0x7505, 0x7505, 0x7505, 0x7505, 0x7505, 0x7507,
-	0x758f, 0x7505, 0x7505, 0x75a5, 0x75fc, 0x7505, 0x7505, 0x7505,
-	0x7505, 0x7607, 0x7505, 0x7505, 0x7505, 0x080c, 0x1410, 0x0076,
-	0x00f6, 0x00e6, 0x00d6, 0x2071, 0x908c, 0x6110, 0x2178, 0x7614,
-	0xa6b4, 0x0fff, 0x7e46, 0x7f4c, 0xc7e5, 0x7f4e, 0x6218, 0x2268,
-	0x6a3c, 0x8211, 0x6a3e, 0x86ff, 0x0904, 0x758a, 0xa694, 0xff00,
-	0xa284, 0x0c00, 0x0120, 0x7018, 0x7862, 0x701c, 0x785e, 0xa284,
-	0x0300, 0x0904, 0x758a, 0x080c, 0x1488, 0x090c, 0x1410, 0x2d00,
-	0x784a, 0x7f4c, 0xc7cd, 0x7f4e, 0x6837, 0x0103, 0x7838, 0x683a,
-	0x783c, 0x683e, 0x7840, 0x6842, 0x6e46, 0xa68c, 0x0c00, 0x0120,
-	0x7318, 0x6b62, 0x731c, 0x6b5e, 0xa68c, 0x00ff, 0xa186, 0x0002,
-	0x0180, 0xa186, 0x0028, 0x1118, 0x684b, 0x001c, 0x0060, 0xd6dc,
-	0x0118, 0x684b, 0x0015, 0x0038, 0xd6d4, 0x0118, 0x684b, 0x0007,
-	0x0010, 0x684b, 0x0000, 0x6f4e, 0x7850, 0x6852, 0x7854, 0x6856,
-	0xa01e, 0xd6c4, 0x0160, 0x7328, 0x732c, 0x6b56, 0x0036, 0x2308,
-	0x2019, 0x9098, 0xad90, 0x0019, 0x080c, 0x794f, 0x003e, 0xd6cc,
-	0x01c8, 0x7124, 0x695a, 0xa192, 0x0021, 0x1250, 0x2071, 0x9098,
-	0x831c, 0x2300, 0xae18, 0xad90, 0x001d, 0x080c, 0x794f, 0x0050,
-	0x7838, 0xd0fc, 0x0120, 0x2009, 0x0020, 0x695a, 0x0c78, 0x2d78,
-	0x080c, 0x78f4, 0x00de, 0x00ee, 0x00fe, 0x007e, 0x0005, 0x00f6,
-	0x6003, 0x0003, 0x2079, 0x908c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08,
-	0x6010, 0x2078, 0x7c12, 0x7b16, 0x7e0a, 0x7d0e, 0x00fe, 0x2c10,
-	0x080c, 0x1bc8, 0x080c, 0x66dd, 0x0005, 0x00d6, 0x6003, 0x0002,
-	0x080c, 0x5cc9, 0x080c, 0x5dc2, 0x6110, 0x2168, 0x694c, 0xd1e4,
-	0x0904, 0x75fa, 0xd1cc, 0x0540, 0x6948, 0x6838, 0xd0fc, 0x01e8,
-	0x0016, 0x684c, 0x0006, 0x6850, 0x0006, 0xad90, 0x000d, 0xa198,
-	0x000d, 0x2009, 0x0023, 0x0156, 0x21a8, 0x2304, 0x2012, 0x8318,
-	0x8210, 0x1f04, 0x75c5, 0x015e, 0x000e, 0x6852, 0x000e, 0x684e,
-	0x001e, 0x2168, 0x080c, 0x14af, 0x0418, 0x0016, 0x080c, 0x14af,
-	0x00de, 0x080c, 0x793f, 0x00e0, 0x6837, 0x0103, 0x6944, 0xa184,
-	0x00ff, 0xa0b6, 0x0002, 0x0180, 0xa086, 0x0028, 0x1118, 0x684b,
-	0x001c, 0x0060, 0xd1dc, 0x0118, 0x684b, 0x0015, 0x0038, 0xd1d4,
-	0x0118, 0x684b, 0x0007, 0x0010, 0x684b, 0x0000, 0x080c, 0x46a1,
-	0x080c, 0x6d18, 0x00de, 0x0005, 0x2019, 0x0001, 0x080c, 0x68e5,
-	0x6003, 0x0002, 0x080c, 0x5cc9, 0x080c, 0x5dc2, 0x0005, 0x080c,
-	0x5cc9, 0x080c, 0x2563, 0x00d6, 0x6110, 0x2168, 0x080c, 0x7b8f,
-	0x0150, 0x6837, 0x0103, 0x684b, 0x0029, 0x6847, 0x0000, 0x080c,
-	0x46a1, 0x080c, 0x7d30, 0x00de, 0x080c, 0x6d18, 0x080c, 0x5dc2,
-	0x0005, 0x684b, 0x0015, 0xd1fc, 0x0138, 0x684b, 0x0007, 0x8002,
-	0x8000, 0x810a, 0xa189, 0x0000, 0x6962, 0x685e, 0x0005, 0xa182,
-	0x0040, 0x0002, 0x7645, 0x7645, 0x7645, 0x7645, 0x7645, 0x7647,
-	0x7645, 0x76e7, 0x76ef, 0x7645, 0x7645, 0x7645, 0x7645, 0x7645,
-	0x7645, 0x7645, 0x7645, 0x7645, 0x7645, 0x080c, 0x1410, 0x0076,
-	0x00f6, 0x00e6, 0x00d6, 0x2071, 0x908c, 0x6110, 0x2178, 0x7614,
-	0xa6b4, 0x0fff, 0x7e46, 0x7f4c, 0xc7e5, 0x7f4e, 0x6218, 0x2268,
-	0x6a3c, 0x8211, 0x6a3e, 0x86ff, 0x0904, 0x76d8, 0xa694, 0xff00,
-	0xa284, 0x0c00, 0x0120, 0x7018, 0x7862, 0x701c, 0x785e, 0xa284,
-	0x0300, 0x0904, 0x76d6, 0xa686, 0x0100, 0x1140, 0x2001, 0x9099,
-	0x2004, 0xa005, 0x1118, 0xc6c4, 0x7e46, 0x0c28, 0x080c, 0x1488,
-	0x090c, 0x1410, 0x2d00, 0x784a, 0x7f4c, 0xa7bd, 0x0200, 0x7f4e,
-	0x6837, 0x0103, 0x7838, 0x683a, 0x783c, 0x683e, 0x7840, 0x6842,
-	0x6e46, 0xa68c, 0x0c00, 0x0120, 0x7318, 0x6b62, 0x731c, 0x6b5e,
-	0xa68c, 0x00ff, 0xa186, 0x0002, 0x0180, 0xa186, 0x0028, 0x1118,
-	0x684b, 0x001c, 0x0060, 0xd6dc, 0x0118, 0x684b, 0x0015, 0x0038,
-	0xd6d4, 0x0118, 0x684b, 0x0007, 0x0010, 0x684b, 0x0000, 0x6f4e,
-	0x7850, 0x6852, 0x7854, 0x6856, 0xa01e, 0xd6c4, 0x0160, 0x7328,
-	0x732c, 0x6b56, 0x0036, 0x2308, 0x2019, 0x9098, 0xad90, 0x0019,
-	0x080c, 0x794f, 0x003e, 0xd6cc, 0x01c8, 0x7124, 0x695a, 0xa192,
-	0x0021, 0x1250, 0x2071, 0x9098, 0x831c, 0x2300, 0xae18, 0xad90,
-	0x001d, 0x080c, 0x794f, 0x0050, 0x7838, 0xd0fc, 0x0120, 0x2009,
-	0x0020, 0x695a, 0x0c78, 0x2d78, 0x080c, 0x78f4, 0xd6dc, 0x1110,
-	0xa006, 0x0030, 0x2001, 0x0001, 0x2071, 0x908c, 0x7218, 0x731c,
-	0x080c, 0x1716, 0x00de, 0x00ee, 0x00fe, 0x007e, 0x0005, 0x20e1,
-	0x0005, 0x3d18, 0x3e20, 0x2c10, 0x080c, 0x16d1, 0x0005, 0x00d6,
-	0x6003, 0x0002, 0x6110, 0x2168, 0x694c, 0xd1e4, 0x0904, 0x778d,
-	0xd1cc, 0x0904, 0x7766, 0x6948, 0x6838, 0xd0fc, 0x0590, 0x0016,
-	0x684c, 0x0006, 0x6850, 0x0006, 0x684c, 0xd0ac, 0x0180, 0x6810,
-	0x6914, 0xa115, 0x0160, 0x080c, 0x7621, 0x00f6, 0x6948, 0x2178,
-	0x6848, 0x784a, 0x6860, 0x7862, 0x685c, 0x785e, 0x00fe, 0x6948,
-	0xad90, 0x000d, 0xa198, 0x000d, 0x2009, 0x0023, 0x0156, 0x21a8,
-	0x2304, 0x2012, 0x8318, 0x8210, 0x1f04, 0x7720, 0x015e, 0x000e,
-	0x6852, 0x000e, 0x684e, 0x001e, 0x2168, 0x080c, 0x14af, 0x0804,
-	0x778b, 0x0016, 0x00f6, 0x2178, 0x7944, 0xa184, 0x00ff, 0xa0b6,
-	0x0002, 0x01b0, 0xa086, 0x0028, 0x1128, 0x684b, 0x001c, 0x784b,
-	0x001c, 0x00b8, 0xd1dc, 0x0128, 0x684b, 0x0015, 0x784b, 0x0015,
-	0x0080, 0xd1d4, 0x0128, 0x684b, 0x0007, 0x784b, 0x0007, 0x0048,
-	0x684c, 0xd0ac, 0x0130, 0x6810, 0x6914, 0xa115, 0x0110, 0x080c,
-	0x7621, 0x6860, 0x7862, 0x685c, 0x785e, 0x684c, 0x784e, 0x00fe,
-	0x080c, 0x14af, 0x00de, 0x080c, 0x793f, 0x0428, 0x6837, 0x0103,
-	0x6944, 0xa184, 0x00ff, 0xa0b6, 0x0002, 0x0180, 0xa086, 0x0028,
-	0x1118, 0x684b, 0x001c, 0x00a8, 0xd1dc, 0x0118, 0x684b, 0x0015,
-	0x0080, 0xd1d4, 0x0118, 0x684b, 0x0007, 0x0058, 0x684b, 0x0000,
-	0x684c, 0xd0ac, 0x0130, 0x6810, 0x6914, 0xa115, 0x0110, 0x080c,
-	0x7621, 0x080c, 0x46a1, 0x080c, 0x6d18, 0x00de, 0x0005, 0x080c,
-	0x5c37, 0x0010, 0x080c, 0x5cc9, 0x080c, 0x7b8f, 0x0198, 0x00d6,
-	0x6110, 0x2168, 0x6837, 0x0103, 0x2009, 0x8b0c, 0x210c, 0xd18c,
-	0x1198, 0xd184, 0x1170, 0x6108, 0x694a, 0x6847, 0x0000, 0x080c,
-	0x46a1, 0x00de, 0x080c, 0x6d18, 0x080c, 0x5d10, 0x080c, 0x5dc2,
-	0x0005, 0x684b, 0x0004, 0x0c88, 0x684b, 0x0004, 0x0c70, 0xa182,
-	0x0040, 0x0002, 0x77cd, 0x77cd, 0x77cd, 0x77cd, 0x77cd, 0x77cf,
-	0x77cd, 0x77d2, 0x77cd, 0x77cd, 0x77cd, 0x77cd, 0x77cd, 0x77cd,
-	0x77cd, 0x77cd, 0x77cd, 0x77cd, 0x77cd, 0x080c, 0x1410, 0x080c,
-	0x6d18, 0x0005, 0x0006, 0x0026, 0xa016, 0x080c, 0x16d1, 0x002e,
-	0x000e, 0x0005, 0xa182, 0x0085, 0x0002, 0x77e6, 0x77e4, 0x77e4,
-	0x77e4, 0x77e4, 0x77e4, 0x77e4, 0x080c, 0x1410, 0x6003, 0x000b,
-	0x6106, 0x080c, 0x589c, 0x0126, 0x2091, 0x8000, 0x080c, 0x5d10,
-	0x012e, 0x0005, 0xa186, 0x0013, 0x1160, 0x6004, 0xa08a, 0x0085,
-	0x0a0c, 0x1410, 0xa08a, 0x008c, 0x1a0c, 0x1410, 0xa082, 0x0085,
-	0x0072, 0xa186, 0x0027, 0x0120, 0xa186, 0x0014, 0x190c, 0x1410,
-	0x080c, 0x5c37, 0x080c, 0x7d3c, 0x080c, 0x5d10, 0x0005, 0x7816,
-	0x7818, 0x7818, 0x7816, 0x7816, 0x7816, 0x7816, 0x080c, 0x1410,
-	0x080c, 0x5c37, 0x080c, 0x7d3c, 0x080c, 0x5d10, 0x0005, 0xa186,
-	0x0013, 0x1128, 0x6004, 0xa082, 0x0085, 0x2008, 0x04aa, 0xa186,
-	0x0027, 0x11e8, 0x080c, 0x5c37, 0x080c, 0x2563, 0x00d6, 0x6010,
-	0x2068, 0x080c, 0x7b8f, 0x0150, 0x6837, 0x0103, 0x6847, 0x0000,
-	0x684b, 0x0029, 0x080c, 0x46a1, 0x080c, 0x7d30, 0x00de, 0x080c,
-	0x6d18, 0x080c, 0x5d10, 0x0005, 0x080c, 0x6d55, 0x0ce0, 0xa186,
-	0x0014, 0x1dd0, 0x080c, 0x5c37, 0x00d6, 0x6010, 0x2068, 0x080c,
-	0x7b8f, 0x0d60, 0x6837, 0x0103, 0x6847, 0x0000, 0x684b, 0x0006,
-	0x6850, 0xc0ec, 0x6852, 0x08f0, 0x7865, 0x7863, 0x7863, 0x7863,
-	0x7863, 0x7863, 0x786e, 0x080c, 0x1410, 0x080c, 0x5c37, 0x6017,
-	0x0014, 0x6003, 0x000c, 0x080c, 0x5d10, 0x0005, 0x080c, 0x5c37,
-	0x6017, 0x0014, 0x6003, 0x000e, 0x080c, 0x5d10, 0x0005, 0xa182,
-	0x008c, 0x1220, 0xa182, 0x0085, 0x0208, 0x001a, 0x080c, 0x6d55,
-	0x0005, 0x7888, 0x7888, 0x7888, 0x7888, 0x788a, 0x78ad, 0x7888,
-	0x080c, 0x1410, 0x00d6, 0x080c, 0x7d30, 0x080c, 0x7b8f, 0x01c8,
-	0x6010, 0x2068, 0x6837, 0x0103, 0x6850, 0xd0b4, 0x0128, 0x684b,
-	0x0006, 0xc0ec, 0x6852, 0x0048, 0xd0bc, 0x0118, 0x684b, 0x0002,
-	0x0020, 0x684b, 0x0005, 0x080c, 0x7dce, 0x6847, 0x0000, 0x080c,
-	0x46a1, 0x080c, 0x6d18, 0x00de, 0x0005, 0x00d6, 0x6010, 0x2068,
-	0x080c, 0x7b8f, 0x01c8, 0x6837, 0x0103, 0x6850, 0xd0b4, 0x0128,
-	0xc0ec, 0x6852, 0x684b, 0x0006, 0x0048, 0xd0bc, 0x0118, 0x684b,
-	0x0002, 0x0020, 0x684b, 0x0005, 0x080c, 0x7dce, 0x6847, 0x0000,
-	0x080c, 0x46a1, 0x080c, 0x7d30, 0x00de, 0x080c, 0x6d18, 0x0005,
-	0x0016, 0x00d6, 0x6010, 0x2068, 0x080c, 0x7b8f, 0x0140, 0x6837,
-	0x0103, 0x684b, 0x0028, 0x6847, 0x0000, 0x080c, 0x46a1, 0x00de,
-	0x001e, 0xa186, 0x0013, 0x0148, 0xa186, 0x0014, 0x0130, 0xa186,
-	0x0027, 0x0118, 0x080c, 0x6d55, 0x0030, 0x080c, 0x5c37, 0x080c,
-	0x7d3c, 0x080c, 0x5d10, 0x0005, 0x0056, 0x0066, 0x00d6, 0x00f6,
-	0x2029, 0x0001, 0xa182, 0x0101, 0x1208, 0x0010, 0x2009, 0x0100,
-	0x2130, 0x2069, 0x9098, 0x831c, 0x2300, 0xad18, 0x2009, 0x0020,
-	0xaf90, 0x001d, 0x080c, 0x794f, 0xa6b2, 0x0020, 0x7804, 0xa06d,
-	0x0110, 0x080c, 0x14af, 0x080c, 0x1488, 0x0500, 0x8528, 0x6837,
-	0x0110, 0x683b, 0x0000, 0x2d20, 0x7c06, 0xa68a, 0x003d, 0x1228,
-	0x2608, 0xad90, 0x000f, 0x0459, 0x0088, 0xa6b2, 0x003c, 0x2009,
-	0x003c, 0x2d78, 0xad90, 0x000f, 0x0411, 0x0c28, 0x00fe, 0x852f,
-	0xa5ad, 0x0003, 0x7d36, 0xa5ac, 0x0000, 0x0028, 0x00fe, 0x852f,
-	0xa5ad, 0x0003, 0x7d36, 0x00de, 0x006e, 0x005e, 0x0005, 0x00f6,
-	0x8dff, 0x0158, 0x6804, 0xa07d, 0x0130, 0x6807, 0x0000, 0x080c,
-	0x46a1, 0x2f68, 0x0cb8, 0x080c, 0x46a1, 0x00fe, 0x0005, 0x0156,
-	0xa184, 0x0001, 0x0108, 0x8108, 0x810c, 0x21a8, 0x2304, 0x8007,
-	0x2012, 0x8318, 0x8210, 0x1f04, 0x7956, 0x015e, 0x0005, 0x0126,
-	0x2091, 0x8000, 0x601c, 0xa084, 0x000f, 0x0013, 0x012e, 0x0005,
-	0x797e, 0x7970, 0x7979, 0x7995, 0x7970, 0x7979, 0x7972, 0x7979,
-	0x080c, 0x1410, 0x0036, 0x2019, 0x0010, 0x080c, 0x85f9, 0x003e,
-	0x0005, 0xa006, 0x0005, 0xa085, 0x0001, 0x0005, 0x00d6, 0x6010,
-	0x2068, 0x080c, 0x7b8f, 0x0178, 0xa00e, 0x2001, 0x0005, 0x080c,
-	0x4773, 0x080c, 0x7dce, 0x080c, 0x46a1, 0x080c, 0x6d18, 0xa085,
-	0x0001, 0x00de, 0x0005, 0xa006, 0x0ce0, 0x6000, 0xa08a, 0x0010,
-	0x1a0c, 0x1410, 0x000b, 0x0005, 0x79ac, 0x79c7, 0x79ae, 0x79d6,
-	0x79c4, 0x79ac, 0x7979, 0x797e, 0x797e, 0x7979, 0x7979, 0x7979,
-	0x7979, 0x7979, 0x7979, 0x7979, 0x080c, 0x1410, 0x00d6, 0x6010,
-	0x2068, 0x080c, 0x7b8f, 0x0110, 0x080c, 0x7dce, 0x00de, 0x6007,
-	0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x080c, 0x589c, 0x080c,
-	0x5d10, 0xa085, 0x0001, 0x0005, 0x080c, 0x179e, 0x0c38, 0x00e6,
-	0x2071, 0x8daa, 0x7024, 0xac06, 0x1110, 0x080c, 0x6862, 0x080c,
-	0x677e, 0x00ee, 0x19d8, 0x080c, 0x7979, 0x0005, 0x0036, 0x00e6,
-	0x2071, 0x8daa, 0x703c, 0xac06, 0x1138, 0x2019, 0x0000, 0x080c,
-	0x68e5, 0x00ee, 0x003e, 0x0850, 0x080c, 0x6b33, 0x00ee, 0x003e,
-	0x1928, 0x080c, 0x7979, 0x0005, 0x00c6, 0x601c, 0xa084, 0x000f,
-	0x0013, 0x00ce, 0x0005, 0x7a01, 0x7a62, 0x7b28, 0x7a05, 0x7a01,
-	0x7a01, 0x85ef, 0x6d18, 0x7a62, 0x080c, 0x7d69, 0x1110, 0x080c,
-	0x6fb6, 0x0005, 0x6017, 0x0001, 0x0005, 0x6010, 0xa080, 0x0019,
-	0x2c02, 0x6000, 0xa08a, 0x0010, 0x1a0c, 0x1410, 0x000b, 0x0005,
-	0x7a20, 0x7a22, 0x7a40, 0x7a52, 0x7a5f, 0x7a20, 0x7a01, 0x7a01,
-	0x7a01, 0x7a52, 0x7a52, 0x7a20, 0x7a20, 0x7a20, 0x7a20, 0x7a5c,
-	0x080c, 0x1410, 0x00e6, 0x6010, 0x2070, 0x7050, 0xc0b5, 0x7052,
-	0x2071, 0x8daa, 0x7024, 0xac06, 0x0180, 0x080c, 0x677e, 0x6007,
-	0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x6017, 0x0014, 0x080c,
-	0x589c, 0x080c, 0x5d10, 0x00ee, 0x0005, 0x6017, 0x0001, 0x0cd8,
-	0x00d6, 0x6010, 0x2068, 0x6850, 0xc0b5, 0x6852, 0x00de, 0x6007,
-	0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x080c, 0x589c, 0x080c,
-	0x5d10, 0x0005, 0x00d6, 0x6017, 0x0001, 0x6010, 0x2068, 0x6850,
-	0xc0b5, 0x6852, 0x00de, 0x0005, 0x080c, 0x6d18, 0x0005, 0x080c,
-	0x179e, 0x08f0, 0x6000, 0xa08a, 0x0010, 0x1a0c, 0x1410, 0x000b,
-	0x0005, 0x7a79, 0x7a02, 0x7a7b, 0x7a79, 0x7a7b, 0x7a79, 0x7a79,
-	0x7a79, 0x79fc, 0x79fc, 0x7a79, 0x7a79, 0x7a79, 0x7a79, 0x7a79,
-	0x7a79, 0x080c, 0x1410, 0x00d6, 0x6018, 0x2068, 0x6804, 0xa084,
-	0x00ff, 0x00de, 0xa08a, 0x000c, 0x1a0c, 0x1410, 0x000b, 0x0005,
-	0x7a94, 0x7ac2, 0x7a94, 0x7ac2, 0x7a94, 0x7ac2, 0x7a96, 0x7a9d,
-	0x7a94, 0x7ac2, 0x7a94, 0x7aae, 0x080c, 0x1410, 0x6004, 0xa08e,
-	0x0004, 0x0518, 0xa08e, 0x0002, 0x0500, 0x6004, 0x080c, 0x7d69,
-	0x0904, 0x7b0b, 0xa08e, 0x0021, 0x0904, 0x7b0f, 0xa08e, 0x0022,
-	0x0904, 0x7b0b, 0xa08e, 0x003d, 0x0904, 0x7b0f, 0xa08e, 0x0001,
-	0x1150, 0x00d6, 0x6018, 0x2068, 0x6804, 0xa084, 0x00ff, 0x00de,
-	0xa086, 0x0006, 0x0110, 0x080c, 0x2563, 0x080c, 0x6fb6, 0x080c,
-	0x7d3c, 0x0005, 0x00c6, 0x00d6, 0x6104, 0xa186, 0x0016, 0x05a0,
-	0xa186, 0x0002, 0x1500, 0x6018, 0x2068, 0x2001, 0x8b32, 0x2004,
-	0xd0ac, 0x1904, 0x7b13, 0x68a0, 0xd0bc, 0x15e8, 0x6840, 0xa084,
-	0x00ff, 0xa005, 0x0180, 0x8001, 0x6842, 0x6013, 0x0000, 0x601f,
-	0x0007, 0x6017, 0x0398, 0x080c, 0x6cc2, 0x0128, 0x2d00, 0x601a,
-	0x601f, 0x0001, 0x0088, 0x00de, 0x00ce, 0x080c, 0x6fb6, 0x080c,
-	0x2563, 0x00e6, 0x0126, 0x2091, 0x8000, 0x080c, 0x2589, 0x012e,
-	0x00ee, 0x080c, 0x7d3c, 0x0005, 0x2001, 0x0002, 0x080c, 0x42b9,
-	0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x58e2, 0x080c, 0x5d10,
-	0x00de, 0x00ce, 0x0c80, 0x080c, 0x6fb6, 0x0804, 0x7abf, 0x080c,
-	0x6fd3, 0x0804, 0x7abf, 0x00de, 0x00ce, 0x080c, 0x6fb6, 0x080c,
-	0x2563, 0x00e6, 0x0126, 0x2091, 0x8000, 0x080c, 0x2589, 0x6013,
-	0x0000, 0x601f, 0x0007, 0x6017, 0x0398, 0x012e, 0x00ee, 0x0005,
-	0x6000, 0xa08a, 0x0010, 0x1a0c, 0x1410, 0x000b, 0x0005, 0x7b3f,
-	0x7b3f, 0x7b3f, 0x7b3f, 0x7b3f, 0x7b3f, 0x7b3f, 0x7b3f, 0x7b3f,
-	0x7a01, 0x7b3f, 0x7a02, 0x7b41, 0x7a02, 0x7b4a, 0x7b3f, 0x080c,
-	0x1410, 0x6007, 0x008b, 0x6003, 0x000d, 0x080c, 0x589c, 0x080c,
-	0x5d10, 0x0005, 0x080c, 0x7d30, 0x080c, 0x7b8f, 0x0568, 0x080c,
-	0x2563, 0x00d6, 0x04e1, 0x0168, 0x6010, 0x2068, 0x6837, 0x0103,
-	0x684b, 0x0006, 0x6847, 0x0000, 0x6850, 0xc0ed, 0x6852, 0x080c,
-	0x46a1, 0x2c68, 0x080c, 0x6cc2, 0x0140, 0x6818, 0x601a, 0x00c6,
-	0x2d60, 0x080c, 0x7d3c, 0x00ce, 0x0008, 0x2d60, 0x00de, 0x6013,
-	0x0000, 0x601f, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c,
-	0x58e2, 0x080c, 0x5d10, 0x0010, 0x080c, 0x7d3c, 0x0005, 0xa284,
-	0x0003, 0x1158, 0xa282, 0x9200, 0x0240, 0x2001, 0x8b16, 0x2004,
-	0xa202, 0x1218, 0xa085, 0x0001, 0x0005, 0xa006, 0x0ce8, 0x0026,
-	0x6210, 0x82ff, 0x002e, 0x0005, 0x00e6, 0x00c6, 0x0036, 0x0006,
-	0x0126, 0x2091, 0x8000, 0x2061, 0x9200, 0x2071, 0x8b00, 0x7344,
-	0x7064, 0xa302, 0x1290, 0x601c, 0xa206, 0x1148, 0x080c, 0x7d69,
-	0x1110, 0x080c, 0x6fb6, 0x00c6, 0x080c, 0x6d18, 0x00ce, 0xace0,
-	0x000c, 0x7058, 0xac02, 0x1208, 0x0c50, 0x012e, 0x000e, 0x003e,
-	0x00ce, 0x00ee, 0x0005, 0x00e6, 0x00c6, 0x0016, 0xa188, 0x8c34,
-	0x210c, 0x81ff, 0x0170, 0x2061, 0x9200, 0x2071, 0x8b00, 0x0016,
-	0x080c, 0x6cc2, 0x001e, 0x0138, 0x611a, 0x080c, 0x2563, 0x080c,
-	0x6d18, 0xa006, 0x0010, 0xa085, 0x0001, 0x001e, 0x00ce, 0x00ee,
-	0x0005, 0x00c6, 0x0056, 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c,
-	0x6cc2, 0x005e, 0x0170, 0x6612, 0x651a, 0x601f, 0x0003, 0x2009,
-	0x004b, 0x080c, 0x6d3f, 0xa085, 0x0001, 0x012e, 0x005e, 0x00ce,
-	0x0005, 0xa006, 0x0cd0, 0x00c6, 0x0056, 0x0126, 0x2091, 0x8000,
-	0x62a0, 0x00c6, 0x080c, 0x6cc2, 0x005e, 0x01f8, 0x6013, 0x0000,
-	0x651a, 0x601f, 0x0003, 0x00c6, 0x2560, 0x080c, 0x44e6, 0x00ce,
-	0x080c, 0x59d5, 0x0086, 0x2041, 0x0000, 0x080c, 0x5911, 0x2c08,
-	0x080c, 0x878f, 0x008e, 0x2009, 0x004c, 0x080c, 0x6d3f, 0xa085,
-	0x0001, 0x012e, 0x005e, 0x00ce, 0x0005, 0xa006, 0x0cd0, 0x00c6,
-	0x0056, 0x0126, 0x2091, 0x8000, 0x62a0, 0x00c6, 0x080c, 0x6cc2,
-	0x005e, 0x0500, 0x6612, 0x651a, 0x601f, 0x0003, 0x2019, 0x0005,
-	0x00c6, 0x2560, 0x080c, 0x44e6, 0x00ce, 0x080c, 0x59d5, 0x0086,
-	0x2041, 0x0000, 0x080c, 0x5911, 0x2c08, 0x080c, 0x878f, 0x008e,
-	0x2009, 0x004d, 0x080c, 0x6d3f, 0xa085, 0x0001, 0x012e, 0x005e,
-	0x00ce, 0x0005, 0xa006, 0x0cd0, 0x00c6, 0x0056, 0x0126, 0x2091,
-	0x8000, 0x62a0, 0x00c6, 0x080c, 0x6cc2, 0x005e, 0x0500, 0x6612,
-	0x651a, 0x601f, 0x0003, 0x2019, 0x0005, 0x00c6, 0x2560, 0x080c,
-	0x44e6, 0x00ce, 0x080c, 0x59d5, 0x0086, 0x2041, 0x0000, 0x080c,
-	0x5911, 0x2c08, 0x080c, 0x878f, 0x008e, 0x2009, 0x004e, 0x080c,
-	0x6d3f, 0xa085, 0x0001, 0x012e, 0x005e, 0x00ce, 0x0005, 0xa006,
-	0x0cd0, 0x00c6, 0x0096, 0x0086, 0x0056, 0x0126, 0x2091, 0x8000,
-	0x62a0, 0x00c6, 0x080c, 0x6cc2, 0x005e, 0x0904, 0x7cc7, 0x6612,
-	0x651a, 0x601f, 0x0003, 0x00c6, 0x2560, 0x080c, 0x4488, 0x0118,
-	0x2001, 0x7c8d, 0x0028, 0x080c, 0x445a, 0x0160, 0x2001, 0x7c93,
-	0x0006, 0xa00e, 0x2001, 0x0004, 0x080c, 0x4773, 0x080c, 0x46a1,
-	0x000e, 0x0807, 0x2019, 0x0004, 0x080c, 0x5bd9, 0x0036, 0x003e,
-	0x00ce, 0x2041, 0x0001, 0x2608, 0x080c, 0x59ee, 0x080c, 0x5911,
-	0x2c08, 0x2648, 0x080c, 0x878f, 0x6018, 0xa080, 0x000f, 0x200c,
-	0x81ff, 0x090c, 0x5a81, 0x2009, 0x0052, 0x080c, 0x6d3f, 0xa085,
-	0x0001, 0x012e, 0x005e, 0x008e, 0x009e, 0x00ce, 0x0005, 0xa006,
-	0x0cc0, 0x00c6, 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x6cc2,
-	0x001e, 0x0178, 0x660a, 0x611a, 0x601f, 0x0001, 0x2d00, 0x6012,
-	0x2009, 0x001f, 0x080c, 0x6d3f, 0xa085, 0x0001, 0x012e, 0x00ce,
-	0x0005, 0xa006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x00c6,
-	0x080c, 0x6cc2, 0x001e, 0x0178, 0x660a, 0x611a, 0x601f, 0x0008,
-	0x2d00, 0x6012, 0x2009, 0x0021, 0x080c, 0x6d3f, 0xa085, 0x0001,
-	0x012e, 0x00ce, 0x0005, 0xa006, 0x0cd8, 0x00c6, 0x0126, 0x2091,
-	0x8000, 0x00c6, 0x080c, 0x6cc2, 0x001e, 0x0178, 0x660a, 0x611a,
-	0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, 0x003d, 0x080c, 0x6d3f,
-	0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, 0xa006, 0x0cd8, 0x00c6,
-	0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x6cc2, 0x001e, 0x0170,
-	0x611a, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, 0x0000, 0x080c,
-	0x6d3f, 0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, 0xa006, 0x0cd8,
-	0x0026, 0x00d6, 0x6218, 0x2268, 0x6a3c, 0x82ff, 0x0110, 0x8211,
-	0x6a3e, 0x00de, 0x002e, 0x0005, 0x0006, 0x6013, 0x0000, 0x601f,
-	0x0007, 0x2001, 0x8da2, 0x2004, 0x6016, 0x000e, 0x0005, 0x0066,
-	0x00c6, 0x00d6, 0x2031, 0x8b52, 0x2634, 0xd6e4, 0x0128, 0x6618,
-	0x2660, 0x6e48, 0x080c, 0x4413, 0x00de, 0x00ce, 0x006e, 0x0005,
-	0x0006, 0x0016, 0x6004, 0xa08e, 0x0002, 0x0140, 0xa08e, 0x0003,
-	0x0128, 0xa08e, 0x0004, 0x0110, 0xa085, 0x0001, 0x001e, 0x000e,
-	0x0005, 0x0006, 0x00d6, 0x6010, 0xa06d, 0x0128, 0x6838, 0xd0fc,
-	0x0110, 0xa006, 0x0010, 0xa085, 0x0001, 0x00de, 0x000e, 0x0005,
-	0x00c6, 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x6cc2, 0x001e,
-	0x0180, 0x611a, 0x601f, 0x0001, 0x2d00, 0x6012, 0x080c, 0x2563,
-	0x2009, 0x0028, 0x080c, 0x6d3f, 0xa085, 0x0001, 0x012e, 0x00ce,
-	0x0005, 0xa006, 0x0cd8, 0xa186, 0x0015, 0x1178, 0x2011, 0x8b20,
-	0x2204, 0xa086, 0x0074, 0x1148, 0x080c, 0x72a4, 0x6003, 0x0001,
-	0x6007, 0x0029, 0x080c, 0x58e2, 0x0020, 0x080c, 0x6fb6, 0x080c,
-	0x6d18, 0x0005, 0xa186, 0x0015, 0x11b0, 0x2011, 0x8b20, 0x2204,
-	0xa086, 0x0014, 0x1180, 0x00d6, 0x6018, 0x2068, 0x080c, 0x43a0,
-	0x00de, 0x080c, 0x72ae, 0x1138, 0x2001, 0x0006, 0x080c, 0x42b9,
-	0x080c, 0x6dc7, 0x0020, 0x080c, 0x6fb6, 0x080c, 0x6d18, 0x0005,
-	0x6848, 0xa086, 0x0005, 0x1108, 0x0009, 0x0005, 0x6850, 0xc0ad,
-	0x6852, 0x0005, 0x0006, 0x0016, 0x0026, 0x0036, 0x2001, 0x8d9e,
-	0x200c, 0x8000, 0x2014, 0x2001, 0x0064, 0x080c, 0x575a, 0x2001,
-	0x8da2, 0x82ff, 0x1110, 0x2011, 0x0002, 0x2202, 0x003e, 0x002e,
-	0x001e, 0x000e, 0x0005, 0x0006, 0x2001, 0x8da2, 0x2003, 0x0028,
-	0x2001, 0x8da3, 0x2003, 0x07d0, 0x000e, 0x0005, 0x00d6, 0x6024,
-	0xa06d, 0x0110, 0x080c, 0x149f, 0x00de, 0x0005, 0x0066, 0x6000,
-	0xa0b2, 0x0010, 0x1a0c, 0x1410, 0x0013, 0x006e, 0x0005, 0x7e17,
-	0x80cf, 0x81c5, 0x7e17, 0x7e17, 0x7e17, 0x7e17, 0x7e17, 0x7e4f,
-	0x8231, 0x7e17, 0x7e17, 0x7e17, 0x7e17, 0x7e17, 0x7e17, 0x080c,
-	0x1410, 0x0066, 0x6000, 0xa0b2, 0x0010, 0x1a0c, 0x1410, 0x0013,
-	0x006e, 0x0005, 0x7e32, 0x8594, 0x7e32, 0x7e32, 0x7e32, 0x7e32,
-	0x7e32, 0x7e32, 0x8558, 0x85dc, 0x7e32, 0x89b0, 0x89e0, 0x89b0,
-	0x89e0, 0x7e32, 0x080c, 0x1410, 0x0066, 0x6000, 0xa0b2, 0x0010,
-	0x1a0c, 0x1410, 0x0013, 0x006e, 0x0005, 0x7e4d, 0x8364, 0x840f,
-	0x8433, 0x847e, 0x7e4d, 0x7e4d, 0x84ef, 0x823d, 0x8532, 0x8545,
-	0x7e4d, 0x7e4d, 0x7e4d, 0x7e4d, 0x7e4d, 0x080c, 0x1410, 0xa1b2,
-	0x0040, 0x1a0c, 0x1410, 0x2100, 0x0002, 0x7e98, 0x7fa9, 0x7e98,
-	0x7e98, 0x7e98, 0x7fb0, 0x7e98, 0x7e98, 0x7e98, 0x7e98, 0x7e98,
-	0x7e98, 0x7e98, 0x7e98, 0x7e98, 0x7e98, 0x7e98, 0x7e98, 0x7e98,
-	0x7e98, 0x7e98, 0x7e98, 0x7e98, 0x7e9a, 0x7ec4, 0x7ecf, 0x7f13,
-	0x7f2d, 0x7f63, 0x7f96, 0x7e98, 0x7e98, 0x7fb3, 0x7e98, 0x7e98,
-	0x7fc2, 0x7fc9, 0x7e98, 0x7e98, 0x7e98, 0x7e98, 0x7e98, 0x805e,
-	0x7e98, 0x7e98, 0x8068, 0x7e98, 0x7e98, 0x8016, 0x7e98, 0x7e98,
-	0x7e98, 0x7e98, 0x7e98, 0x7e98, 0x7e98, 0x7e98, 0x7e98, 0x7e98,
-	0x7e98, 0x7e98, 0x7e98, 0x7e98, 0x7e98, 0x7e98, 0x7e98, 0x7e98,
-	0x080c, 0x1410, 0x080c, 0x45e7, 0x6618, 0x00c6, 0x2660, 0x080c,
-	0x4319, 0x00ce, 0xa6b0, 0x0001, 0x2634, 0xa684, 0x00ff, 0xa082,
-	0x0006, 0x0278, 0x080c, 0x86d3, 0x1904, 0x7f0d, 0x080c, 0x867e,
-	0x1120, 0x6007, 0x0008, 0x0804, 0x7fa4, 0x6007, 0x0009, 0x0804,
-	0x7fa4, 0x080c, 0x884f, 0x0128, 0x080c, 0x86d3, 0x0d78, 0x0804,
-	0x7f0d, 0x6013, 0x1900, 0x0c88, 0x6106, 0x080c, 0x862e, 0x6007,
-	0x0006, 0x0804, 0x7fa4, 0x6007, 0x0007, 0x0804, 0x7fa4, 0x080c,
-	0x89fb, 0x1904, 0x8079, 0x00d6, 0x6618, 0x2668, 0x6e04, 0xa6b4,
-	0xff00, 0x8637, 0xa686, 0x0006, 0x01a0, 0xa686, 0x0004, 0x0188,
-	0x080c, 0x4c42, 0x1160, 0x6e04, 0xa6b4, 0x00ff, 0xa686, 0x0006,
-	0x0140, 0xa686, 0x0004, 0x0128, 0xa686, 0x0005, 0x0110, 0x00de,
-	0x00e0, 0x080c, 0x8731, 0x11a0, 0xa686, 0x0006, 0x1150, 0x0026,
-	0x6218, 0xa290, 0x0028, 0x2214, 0x2009, 0x0000, 0x080c, 0x25a8,
-	0x002e, 0x080c, 0x43a0, 0x6007, 0x000a, 0x00de, 0x0804, 0x7fa4,
-	0x6007, 0x000b, 0x00de, 0x0804, 0x7fa4, 0x080c, 0x2563, 0x6007,
-	0x0001, 0x0804, 0x7fa4, 0x080c, 0x89fb, 0x1904, 0x8079, 0x6618,
-	0x00d6, 0x2668, 0x6e04, 0x00de, 0xa686, 0x0707, 0x0d70, 0x0026,
-	0x6218, 0xa290, 0x0028, 0x2214, 0x2009, 0x0000, 0x080c, 0x25a8,
-	0x002e, 0x6007, 0x000c, 0x0804, 0x7fa4, 0x080c, 0x45e7, 0x6618,
-	0xa6b0, 0x0001, 0x2634, 0xa684, 0x00ff, 0xa082, 0x0006, 0x02b0,
-	0xa6b4, 0xff00, 0x8637, 0xa686, 0x0004, 0x0118, 0xa686, 0x0006,
-	0x1960, 0x080c, 0x873e, 0x1120, 0x6007, 0x000e, 0x0804, 0x7fa4,
-	0x080c, 0x2563, 0x6007, 0x000f, 0x0804, 0x7fa4, 0x080c, 0x884f,
-	0x0160, 0xa6b4, 0xff00, 0x8637, 0xa682, 0x0004, 0x0a04, 0x7f0d,
-	0xa682, 0x0007, 0x0e30, 0x0804, 0x7f0d, 0x6013, 0x1900, 0x6007,
-	0x0009, 0x0804, 0x7fa4, 0x080c, 0x45e7, 0x6618, 0xa6b0, 0x0001,
-	0x2634, 0xa684, 0x00ff, 0xa082, 0x0006, 0x02c0, 0xa6b4, 0xff00,
-	0x8637, 0xa686, 0x0004, 0x0120, 0xa686, 0x0006, 0x1904, 0x7f0d,
-	0x080c, 0x8766, 0x1130, 0x080c, 0x867e, 0x1118, 0x6007, 0x0010,
-	0x0418, 0x080c, 0x2563, 0x6007, 0x0011, 0x00f0, 0x080c, 0x884f,
-	0x0140, 0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006, 0x0d48, 0x0804,
-	0x7f0d, 0x6013, 0x1900, 0x6007, 0x0009, 0x0070, 0x7030, 0xa086,
-	0x6000, 0x0140, 0x080c, 0x89fb, 0x1904, 0x8079, 0x080c, 0x807c,
-	0x1904, 0x7f0d, 0x6007, 0x0012, 0x6003, 0x0001, 0x080c, 0x58e2,
-	0x0005, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x58e2, 0x0cc0,
-	0x6007, 0x0005, 0x0cc0, 0x080c, 0x89fb, 0x1904, 0x8079, 0x080c,
-	0x807c, 0x1904, 0x7f0d, 0x6007, 0x0020, 0x6003, 0x0001, 0x080c,
-	0x58e2, 0x0005, 0x6007, 0x0023, 0x6003, 0x0001, 0x080c, 0x58e2,
-	0x0005, 0x080c, 0x89fb, 0x1904, 0x8079, 0x080c, 0x807c, 0x1904,
-	0x7f0d, 0x0016, 0x0026, 0x2011, 0x9091, 0x2214, 0xa286, 0xffff,
-	0x0190, 0x2c08, 0x080c, 0x7b7f, 0x01d8, 0x2260, 0x2011, 0x9090,
-	0x2214, 0x6008, 0xa206, 0x11a0, 0x6018, 0xa190, 0x0006, 0x2214,
-	0xa206, 0x01e0, 0x0068, 0x2011, 0x9090, 0x2214, 0x2c08, 0x080c,
-	0x8956, 0x11a0, 0x2011, 0x9091, 0x2214, 0xa286, 0xffff, 0x01a0,
-	0x2160, 0x6007, 0x0026, 0x6013, 0x1700, 0x2011, 0x9089, 0x2214,
-	0xa296, 0xffff, 0x1160, 0x6007, 0x0025, 0x0048, 0x601c, 0xa086,
-	0x0007, 0x1d70, 0x080c, 0x6d18, 0x2160, 0x6007, 0x0025, 0x6003,
-	0x0001, 0x080c, 0x58e2, 0x002e, 0x001e, 0x0005, 0x2001, 0x0001,
-	0x080c, 0x42a7, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004,
-	0x2019, 0x8b05, 0x2011, 0x9096, 0x080c, 0x7326, 0x003e, 0x002e,
-	0x001e, 0x015e, 0x0120, 0x6007, 0x0031, 0x0804, 0x7fa4, 0x080c,
-	0x715d, 0x080c, 0x4c42, 0x1548, 0x0006, 0x0026, 0x0036, 0x2011,
-	0x8b23, 0x2204, 0x8000, 0x2012, 0xa084, 0x0007, 0x0190, 0x2001,
-	0x8d9c, 0x2003, 0xaaaa, 0x2001, 0x8d9d, 0x2003, 0x0001, 0x2001,
-	0x8b00, 0x2003, 0x0001, 0x080c, 0x4b8b, 0x003e, 0x002e, 0x000e,
-	0x0005, 0x2001, 0x0001, 0x080c, 0x2298, 0x080c, 0x4c54, 0x1110,
-	0x080c, 0x4c15, 0x003e, 0x002e, 0x000e, 0x0005, 0x6106, 0x0479,
-	0x6007, 0x002b, 0x0804, 0x7fa4, 0x6007, 0x002c, 0x0804, 0x7fa4,
-	0x080c, 0x89fb, 0x1170, 0x0081, 0x1904, 0x7f0d, 0x6106, 0x0419,
-	0x1120, 0x6007, 0x002e, 0x0804, 0x7fa4, 0x6007, 0x002f, 0x0804,
-	0x7fa4, 0x080c, 0x6d18, 0x0005, 0x00d6, 0x0066, 0x6618, 0x2668,
-	0x6e04, 0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006, 0x0128, 0xa686,
-	0x0004, 0x0110, 0xa085, 0x0001, 0x006e, 0x00de, 0x0005, 0x00d6,
-	0x0439, 0x00de, 0x0005, 0x00d6, 0x0481, 0x11e0, 0x680c, 0xa08c,
-	0xff00, 0x6824, 0xa084, 0x00ff, 0xa115, 0x6212, 0xd1e4, 0x0118,
-	0x2009, 0x0001, 0x0060, 0xd1ec, 0x0168, 0x6920, 0xa18c, 0x00ff,
-	0x6824, 0x080c, 0x22e9, 0x1130, 0x2110, 0x2009, 0x0000, 0x080c,
-	0x25a8, 0x0018, 0xa085, 0x0001, 0x0008, 0xa006, 0x00de, 0x0005,
-	0x2069, 0x908d, 0x6800, 0xa082, 0x0010, 0x1228, 0x6013, 0x0000,
-	0xa085, 0x0001, 0x0008, 0xa006, 0x0005, 0x6013, 0x0000, 0x2069,
-	0x908c, 0x6808, 0xa084, 0xff00, 0xa086, 0x0800, 0x0005, 0x6004,
-	0xa0b2, 0x0040, 0x1a0c, 0x1410, 0xa1b6, 0x0013, 0x1110, 0x2008,
-	0x0092, 0xa1b6, 0x0027, 0x0120, 0xa1b6, 0x0014, 0x190c, 0x1410,
-	0x2001, 0x0007, 0x080c, 0x42c7, 0x080c, 0x5c37, 0x080c, 0x7d3c,
-	0x080c, 0x5d10, 0x0005, 0x812b, 0x812d, 0x812b, 0x812b, 0x812b,
-	0x812d, 0x813b, 0x81a3, 0x816e, 0x81a3, 0x817f, 0x81a3, 0x813b,
-	0x81a3, 0x819b, 0x81a3, 0x819b, 0x81a3, 0x81a3, 0x812b, 0x812b,
-	0x812b, 0x812b, 0x812b, 0x812b, 0x812b, 0x812b, 0x812b, 0x812b,
-	0x812b, 0x812b, 0x812b, 0x81a3, 0x812b, 0x812b, 0x81a3, 0x812b,
-	0x81a3, 0x81a3, 0x812b, 0x812b, 0x812b, 0x812b, 0x81a3, 0x81a3,
-	0x812b, 0x81a3, 0x81a3, 0x812b, 0x8135, 0x812b, 0x812b, 0x812b,
-	0x812b, 0x812b, 0x812b, 0x812b, 0x812b, 0x812b, 0x812b, 0x812b,
-	0x812b, 0x812b, 0x812b, 0x080c, 0x1410, 0x080c, 0x5c37, 0x6003,
-	0x0002, 0x080c, 0x5d10, 0x0804, 0x81a9, 0x2001, 0x0000, 0x080c,
-	0x42a7, 0x0804, 0x81a3, 0x00f6, 0x2079, 0x8b51, 0x7804, 0x00fe,
-	0xd0ac, 0x1904, 0x81a3, 0x2001, 0x0000, 0x080c, 0x42a7, 0x6018,
-	0xa080, 0x0004, 0x2004, 0xa086, 0x00ff, 0x1138, 0x00f6, 0x2079,
-	0x8b00, 0x7894, 0x8000, 0x7896, 0x00fe, 0x2001, 0x0002, 0x080c,
-	0x42b9, 0x080c, 0x5c37, 0x601f, 0x0001, 0x6003, 0x0001, 0x6007,
-	0x0002, 0x080c, 0x58e2, 0x080c, 0x5d10, 0x00c6, 0x6118, 0x2160,
-	0x2009, 0x0001, 0x080c, 0x5619, 0x00ce, 0x04d8, 0x6618, 0x00d6,
-	0x2668, 0x6e04, 0x00de, 0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006,
-	0x0550, 0xa686, 0x0004, 0x0538, 0x2001, 0x0004, 0x0410, 0x2001,
-	0x8b00, 0x2004, 0xa086, 0x0003, 0x1110, 0x080c, 0x3689, 0x2001,
-	0x0006, 0x0401, 0x6618, 0x00d6, 0x2668, 0x6e04, 0x00de, 0xa6b4,
-	0xff00, 0x8637, 0xa686, 0x0006, 0x0170, 0x2001, 0x0006, 0x0048,
-	0x2001, 0x0004, 0x0030, 0x2001, 0x0006, 0x0061, 0x0020, 0x0018,
-	0x0010, 0x080c, 0x42c7, 0x080c, 0x5c37, 0x080c, 0x6d18, 0x080c,
-	0x5d10, 0x0005, 0x0016, 0x00d6, 0x6118, 0x2168, 0x6900, 0xd184,
-	0x0188, 0x6104, 0xa18e, 0x000a, 0x1128, 0x699c, 0xd1a4, 0x1110,
-	0x2001, 0x0007, 0x080c, 0x42b9, 0x2001, 0x0000, 0x080c, 0x42a7,
-	0x080c, 0x2589, 0x00de, 0x001e, 0x0005, 0x00d6, 0x6618, 0x2668,
-	0x6804, 0xa084, 0xff00, 0x8007, 0x00de, 0xa0b2, 0x000c, 0x1a0c,
-	0x1410, 0xa1b6, 0x0015, 0x1110, 0x003b, 0x0028, 0xa1b6, 0x0016,
-	0x190c, 0x1410, 0x04eb, 0x0005, 0x7045, 0x7045, 0x7045, 0x7045,
-	0x7045, 0x7045, 0x7045, 0x81e8, 0x7045, 0x7045, 0x7045, 0x7045,
-	0x00f6, 0x2079, 0x8b51, 0x7804, 0x00fe, 0xd0ac, 0x1198, 0x2001,
-	0x0000, 0x080c, 0x42a7, 0x2001, 0x0002, 0x080c, 0x42b9, 0x601f,
-	0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x58e2, 0x080c,
-	0x5d10, 0x00a8, 0x2011, 0x9083, 0x2204, 0x8211, 0x220c, 0x080c,
-	0x22e9, 0x1168, 0x00c6, 0x080c, 0x430a, 0x0120, 0x00ce, 0x080c,
-	0x6d18, 0x0028, 0x080c, 0x4118, 0x00ce, 0x080c, 0x6d18, 0x0005,
-	0x7045, 0x7045, 0x7045, 0x7045, 0x7045, 0x7045, 0x7045, 0x8224,
-	0x7045, 0x7045, 0x7045, 0x7045, 0x080c, 0x72a1, 0x1138, 0x6003,
-	0x0001, 0x6007, 0x0001, 0x080c, 0x58e2, 0x0010, 0x080c, 0x6d18,
-	0x0005, 0x6004, 0xa08a, 0x0040, 0x1a0c, 0x1410, 0x080c, 0x5c37,
-	0x080c, 0x7d3c, 0x080c, 0x5d10, 0x0005, 0xa182, 0x0040, 0x0002,
-	0x8253, 0x8253, 0x8253, 0x8253, 0x8255, 0x8253, 0x8253, 0x8253,
-	0x8253, 0x8253, 0x8253, 0x8253, 0x8253, 0x8253, 0x8253, 0x8253,
-	0x8253, 0x8253, 0x8253, 0x080c, 0x1410, 0x00d6, 0x00e6, 0x00f6,
-	0x0156, 0x0046, 0x0026, 0x6106, 0x2071, 0x9080, 0x7444, 0xa4a4,
-	0xff00, 0x0904, 0x82bd, 0xa486, 0x2000, 0x0180, 0xa486, 0x0400,
-	0x0168, 0xa486, 0x1000, 0x0108, 0x0078, 0x2069, 0x8e2a, 0x6a00,
-	0xd284, 0x0904, 0x8324, 0xc2cd, 0x6a02, 0x0030, 0x2009, 0x0001,
-	0x2011, 0x0200, 0x080c, 0x5734, 0x080c, 0x1488, 0x090c, 0x1410,
-	0x6003, 0x0007, 0x2d00, 0x6837, 0x010d, 0x6803, 0x0000, 0x683b,
-	0x0000, 0x6c5a, 0x2c00, 0x685e, 0x6008, 0x68b2, 0x6018, 0x2078,
-	0x78a0, 0x8007, 0x7130, 0x694a, 0x0016, 0xa084, 0xff00, 0x6846,
-	0x684f, 0x0000, 0x6857, 0x0036, 0x080c, 0x46a1, 0x001e, 0xa486,
-	0x2000, 0x1130, 0x2019, 0x0017, 0x080c, 0x891c, 0x0804, 0x8312,
-	0xa486, 0x0400, 0x1130, 0x2019, 0x0002, 0x080c, 0x88de, 0x0804,
-	0x8312, 0xa486, 0x0200, 0x1110, 0x080c, 0x88cb, 0xa486, 0x1000,
-	0x1110, 0x080c, 0x8909, 0x0804, 0x8312, 0x2069, 0x8e2a, 0x6a00,
-	0xd284, 0x0904, 0x8361, 0xa284, 0x0300, 0x1904, 0x835b, 0x6804,
-	0xa005, 0x0904, 0x834c, 0x2d78, 0x6003, 0x0007, 0x080c, 0x146f,
-	0x0904, 0x8319, 0x7800, 0xd08c, 0x1118, 0x7804, 0x8001, 0x7806,
-	0x6013, 0x0000, 0x6803, 0x0000, 0x6837, 0x0116, 0x683b, 0x0000,
-	0x6008, 0x68b2, 0x2c00, 0x684a, 0x6018, 0x2078, 0x78a0, 0x8007,
-	0x7130, 0x6986, 0x6846, 0x6853, 0x003d, 0x7244, 0xa294, 0x0003,
-	0xa286, 0x0002, 0x1118, 0x684f, 0x0040, 0x0040, 0xa286, 0x0001,
-	0x1118, 0x684f, 0x0080, 0x0010, 0x684f, 0x0000, 0x20a9, 0x000a,
-	0x2001, 0x9090, 0xad90, 0x0015, 0x200c, 0x810f, 0x2112, 0x8000,
-	0x8210, 0x1f04, 0x8304, 0x200c, 0x6982, 0x8000, 0x200c, 0x697e,
-	0x080c, 0x46a1, 0x002e, 0x004e, 0x015e, 0x00fe, 0x00ee, 0x00de,
-	0x0005, 0x6013, 0x0100, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c,
-	0x589c, 0x080c, 0x5d10, 0x0c70, 0x2069, 0x9092, 0x2d04, 0xa084,
-	0xff00, 0xa086, 0x1200, 0x11a8, 0x2069, 0x9080, 0x686c, 0xa084,
-	0x00ff, 0x0016, 0x6110, 0xa18c, 0x0700, 0xa10d, 0x6112, 0x001e,
-	0x6003, 0x0001, 0x6007, 0x0043, 0x080c, 0x589c, 0x080c, 0x5d10,
-	0x0888, 0x6013, 0x0200, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c,
-	0x589c, 0x080c, 0x5d10, 0x0830, 0x6013, 0x0300, 0x0010, 0x6013,
-	0x0100, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x589c, 0x080c,
-	0x5d10, 0x0804, 0x8312, 0x6013, 0x0500, 0x0c98, 0x6013, 0x0600,
-	0x0818, 0x6013, 0x0200, 0x0800, 0xa186, 0x0013, 0x1170, 0x6004,
-	0xa08a, 0x0040, 0x0a0c, 0x1410, 0xa08a, 0x0053, 0x1a0c, 0x1410,
-	0xa082, 0x0040, 0x2008, 0x0804, 0x83cf, 0xa186, 0x0047, 0x11b8,
-	0x2001, 0x0109, 0x2004, 0xd084, 0x01f0, 0x0126, 0x2091, 0x2400,
-	0x0006, 0x0016, 0x0026, 0x080c, 0x578e, 0x002e, 0x001e, 0x000e,
-	0x012e, 0x6000, 0xa086, 0x0002, 0x1170, 0x0804, 0x840f, 0xa186,
-	0x0027, 0x0120, 0xa186, 0x0014, 0x190c, 0x1410, 0x6004, 0xa082,
-	0x0040, 0x2008, 0x001a, 0x080c, 0x6d55, 0x0005, 0x83b1, 0x83b3,
-	0x83b3, 0x83b1, 0x83b1, 0x83b1, 0x83b1, 0x83b1, 0x83b1, 0x83b1,
-	0x83b1, 0x83b1, 0x83b1, 0x83b1, 0x83b1, 0x83b1, 0x83b1, 0x83b1,
-	0x83b1, 0x080c, 0x1410, 0x080c, 0x5c37, 0x080c, 0x5d10, 0x0036,
-	0x00d6, 0x6010, 0xa06d, 0x0180, 0xad84, 0xf000, 0x0168, 0x2019,
-	0x0004, 0x080c, 0x8942, 0x6013, 0x0000, 0x6014, 0xa005, 0x1110,
-	0x6017, 0x0014, 0x6003, 0x0007, 0x00de, 0x003e, 0x0005, 0x0002,
-	0x83e3, 0x8400, 0x83ec, 0x8409, 0x83e3, 0x83e3, 0x83e3, 0x83e3,
-	0x83e3, 0x83e3, 0x83e3, 0x83e3, 0x83e3, 0x83e3, 0x83e3, 0x83e3,
-	0x83e3, 0x83e3, 0x83e3, 0x080c, 0x1410, 0x6010, 0xa088, 0x0013,
-	0x2104, 0xa085, 0x0400, 0x200a, 0x080c, 0x5c37, 0x6010, 0xa080,
-	0x0013, 0x2004, 0xd0b4, 0x0138, 0x6003, 0x0007, 0x2009, 0x0043,
-	0x080c, 0x6d3f, 0x0010, 0x6003, 0x0002, 0x080c, 0x5d10, 0x0005,
-	0x080c, 0x5c37, 0x080c, 0x570f, 0x080c, 0x6d18, 0x080c, 0x5d10,
-	0x0005, 0x080c, 0x5c37, 0x2009, 0x0041, 0x0804, 0x84ef, 0xa182,
-	0x0040, 0x0002, 0x8425, 0x8427, 0x8425, 0x8425, 0x8425, 0x8425,
-	0x8425, 0x8428, 0x8425, 0x8425, 0x8425, 0x8425, 0x8425, 0x8425,
-	0x8425, 0x8425, 0x8425, 0x8425, 0x8425, 0x080c, 0x1410, 0x0005,
-	0x6003, 0x0004, 0x6110, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10,
-	0x080c, 0x16d1, 0x0005, 0xa182, 0x0040, 0x0002, 0x8449, 0x8449,
-	0x8449, 0x8449, 0x8449, 0x8449, 0x8449, 0x8449, 0x8449, 0x844b,
-	0x846b, 0x8449, 0x8449, 0x8449, 0x8449, 0x846b, 0x8449, 0x8449,
-	0x8449, 0x080c, 0x1410, 0x080c, 0x5cc9, 0x080c, 0x5dc2, 0x6010,
-	0x00d6, 0x2068, 0x684c, 0xd0fc, 0x0150, 0xa08c, 0x0003, 0xa18e,
-	0x0002, 0x0158, 0x2009, 0x0041, 0x00de, 0x0804, 0x84ef, 0x6003,
-	0x0007, 0x080c, 0x570f, 0x00de, 0x0005, 0x080c, 0x570f, 0x080c,
-	0x6d18, 0x00de, 0x0cc8, 0x0036, 0x080c, 0x5cc9, 0x080c, 0x5dc2,
-	0x6010, 0x00d6, 0x2068, 0x2019, 0x0004, 0x080c, 0x8942, 0x080c,
-	0x7d3c, 0x6017, 0x0028, 0x00de, 0x003e, 0x0005, 0xa186, 0x0013,
-	0x1150, 0x6004, 0xa086, 0x0042, 0x190c, 0x1410, 0x080c, 0x5c37,
-	0x080c, 0x5d10, 0x0005, 0xa186, 0x0027, 0x0118, 0xa186, 0x0014,
-	0x1180, 0x6004, 0xa086, 0x0042, 0x190c, 0x1410, 0x2001, 0x0007,
-	0x080c, 0x42c7, 0x080c, 0x5c37, 0x080c, 0x7d3c, 0x080c, 0x5d10,
-	0x0005, 0xa182, 0x0040, 0x0002, 0x84b7, 0x84b7, 0x84b7, 0x84b7,
-	0x84b7, 0x84b7, 0x84b7, 0x84b9, 0x84c5, 0x84b7, 0x84b7, 0x84b7,
-	0x84b7, 0x84b7, 0x84b7, 0x84b7, 0x84b7, 0x84b7, 0x84b7, 0x080c,
-	0x1410, 0x0036, 0x0046, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10,
-	0x080c, 0x16d1, 0x004e, 0x003e, 0x0005, 0x6010, 0x00d6, 0x2068,
-	0x6810, 0x6a14, 0xa20d, 0x1168, 0x684c, 0xd0fc, 0x0120, 0x2009,
-	0x0041, 0x00de, 0x00e0, 0x6003, 0x0007, 0x080c, 0x570f, 0x00de,
-	0x0005, 0x6003, 0x0007, 0x0021, 0x080c, 0x5711, 0x00de, 0x0005,
-	0xd2fc, 0x0140, 0x8002, 0x8000, 0x8212, 0xa291, 0x0000, 0x2009,
-	0x0009, 0x0010, 0x2009, 0x0015, 0x6a6a, 0x6866, 0x0005, 0xa182,
-	0x0040, 0x0002, 0x8505, 0x8507, 0x8513, 0x851f, 0x8505, 0x8505,
-	0x8505, 0x852e, 0x8505, 0x8505, 0x8505, 0x8505, 0x8505, 0x8505,
-	0x8505, 0x8505, 0x8505, 0x8505, 0x8505, 0x080c, 0x1410, 0x6003,
-	0x0001, 0x6106, 0x080c, 0x589c, 0x0126, 0x2091, 0x8000, 0x080c,
-	0x5d10, 0x012e, 0x0005, 0x6003, 0x0001, 0x6106, 0x080c, 0x589c,
-	0x0126, 0x2091, 0x8000, 0x080c, 0x5d10, 0x012e, 0x0005, 0x6003,
-	0x0003, 0x6106, 0x2c10, 0x080c, 0x1bc8, 0x0126, 0x2091, 0x8000,
-	0x080c, 0x58ff, 0x080c, 0x5dc2, 0x012e, 0x0005, 0xa016, 0x080c,
-	0x16d1, 0x0005, 0x080c, 0x5c37, 0x6110, 0x81ff, 0x0148, 0x00d6,
-	0x2168, 0x0036, 0x2019, 0x0029, 0x080c, 0x8942, 0x003e, 0x00de,
-	0x080c, 0x7d3c, 0x080c, 0x5d10, 0x0005, 0x080c, 0x5cc9, 0x6110,
-	0x81ff, 0x0148, 0x00d6, 0x2168, 0x0036, 0x2019, 0x0029, 0x080c,
-	0x8942, 0x003e, 0x00de, 0x080c, 0x7d3c, 0x080c, 0x5dc2, 0x0005,
-	0xa182, 0x0085, 0x0002, 0x8564, 0x8562, 0x8562, 0x8570, 0x8562,
-	0x8562, 0x8562, 0x080c, 0x1410, 0x6003, 0x000b, 0x6106, 0x080c,
-	0x589c, 0x0126, 0x2091, 0x8000, 0x080c, 0x5d10, 0x012e, 0x0005,
-	0x0026, 0x00e6, 0x080c, 0x89fb, 0x0118, 0x080c, 0x6d18, 0x00c8,
-	0x2071, 0x9080, 0x7224, 0x6212, 0x7220, 0x080c, 0x881c, 0x0118,
-	0x6007, 0x0086, 0x0040, 0x6007, 0x0087, 0x7224, 0xa296, 0xffff,
-	0x1110, 0x6007, 0x0086, 0x6003, 0x0001, 0x080c, 0x589c, 0x080c,
-	0x5d10, 0x00ee, 0x002e, 0x0005, 0xa186, 0x0013, 0x1160, 0x6004,
-	0xa08a, 0x0085, 0x0a0c, 0x1410, 0xa08a, 0x008c, 0x1a0c, 0x1410,
-	0xa082, 0x0085, 0x00a2, 0xa186, 0x0027, 0x0130, 0xa186, 0x0014,
-	0x0118, 0x080c, 0x6d55, 0x0050, 0x2001, 0x0007, 0x080c, 0x42c7,
-	0x080c, 0x5c37, 0x080c, 0x7d3c, 0x080c, 0x5d10, 0x0005, 0x85be,
-	0x85c0, 0x85c0, 0x85be, 0x85be, 0x85be, 0x85be, 0x080c, 0x1410,
-	0x080c, 0x5c37, 0x080c, 0x6d18, 0x080c, 0x5d10, 0x0005, 0xa182,
-	0x0085, 0x0a0c, 0x1410, 0xa182, 0x008c, 0x1a0c, 0x1410, 0xa182,
-	0x0085, 0x0002, 0x85d9, 0x85d9, 0x85d9, 0x85db, 0x85d9, 0x85d9,
-	0x85d9, 0x080c, 0x1410, 0x0005, 0xa186, 0x0013, 0x0148, 0xa186,
-	0x0014, 0x0130, 0xa186, 0x0027, 0x0118, 0x080c, 0x6d55, 0x0030,
-	0x080c, 0x5c37, 0x080c, 0x7d3c, 0x080c, 0x5d10, 0x0005, 0x0036,
-	0x2019, 0x000b, 0x0031, 0x601f, 0x0006, 0x6003, 0x0007, 0x003e,
-	0x0005, 0x0126, 0x0036, 0x0086, 0x2091, 0x8000, 0x2c40, 0x080c,
-	0x6a17, 0x1540, 0x080c, 0x6aaf, 0x1528, 0x6000, 0xa086, 0x0000,
-	0x0508, 0x601c, 0xa086, 0x0007, 0x01e8, 0x00d6, 0x6000, 0xa086,
-	0x0004, 0x1140, 0x601f, 0x0007, 0x2001, 0x8da2, 0x2004, 0x6016,
-	0x080c, 0x179e, 0x6010, 0x2068, 0x080c, 0x7b8f, 0x0110, 0x080c,
-	0x8942, 0x00de, 0x6013, 0x0000, 0x601f, 0x0007, 0x2001, 0x8da2,
-	0x2004, 0x6016, 0x008e, 0x003e, 0x012e, 0x0005, 0x00f6, 0x00c6,
-	0x0036, 0x0156, 0x2079, 0x9080, 0x7938, 0x783c, 0x080c, 0x22e9,
-	0x1904, 0x8679, 0x0016, 0x00c6, 0x080c, 0x430a, 0x15c0, 0x2011,
-	0x9090, 0xac98, 0x000a, 0x20a9, 0x0004, 0x080c, 0x7326, 0x1578,
-	0x001e, 0x002e, 0x0026, 0x0016, 0x2019, 0x0029, 0x080c, 0x6b6f,
-	0x080c, 0x59d5, 0x0086, 0x2041, 0x0000, 0x080c, 0x5911, 0x008e,
-	0x001e, 0x0086, 0x2041, 0x0000, 0x080c, 0x878f, 0x008e, 0x080c,
-	0x44e6, 0x0026, 0x6204, 0xa294, 0xff00, 0x8217, 0xa286, 0x0006,
-	0x0118, 0xa286, 0x0004, 0x1118, 0x62a0, 0x080c, 0x25fb, 0x002e,
-	0x001e, 0x080c, 0x4118, 0x6612, 0x6516, 0xa006, 0x0010, 0x00ce,
-	0x001e, 0x015e, 0x003e, 0x00ce, 0x00fe, 0x0005, 0x00c6, 0x00d6,
-	0x0016, 0x2009, 0x8b20, 0x2104, 0xa086, 0x0074, 0x1904, 0x86c9,
-	0x2069, 0x908e, 0x690c, 0xa182, 0x0100, 0x0678, 0x6908, 0xa184,
-	0x8000, 0x05a0, 0x2001, 0x8d9c, 0x2004, 0xa005, 0x1118, 0xa184,
-	0x0800, 0x0560, 0x6910, 0xa18a, 0x0001, 0x0610, 0x6914, 0x2069,
-	0x90ae, 0x6904, 0x81ff, 0x1198, 0x690c, 0xa182, 0x0100, 0x02a8,
-	0x6908, 0x81ff, 0x1178, 0x6910, 0xa18a, 0x0001, 0x0288, 0x6918,
-	0xa18a, 0x0001, 0x0298, 0x00d0, 0x6013, 0x0100, 0x00a0, 0x6013,
-	0x0300, 0x0088, 0x6013, 0x0500, 0x0070, 0x6013, 0x0700, 0x0058,
-	0x6013, 0x0900, 0x0040, 0x6013, 0x0b00, 0x0028, 0x6013, 0x0f00,
-	0x0010, 0x6013, 0x2d00, 0xa085, 0x0001, 0x0008, 0xa006, 0x001e,
-	0x00de, 0x00ce, 0x0005, 0x00c6, 0x00d6, 0x0026, 0x0036, 0x0156,
-	0x6218, 0x2268, 0x6b04, 0xa394, 0x00ff, 0xa286, 0x0006, 0x0190,
-	0xa286, 0x0004, 0x0178, 0xa394, 0xff00, 0x8217, 0xa286, 0x0006,
-	0x0148, 0xa286, 0x0004, 0x0130, 0x00c6, 0x2d60, 0x080c, 0x4319,
-	0x00ce, 0x04c0, 0x2011, 0x9096, 0xad98, 0x000a, 0x20a9, 0x0004,
-	0x080c, 0x7326, 0x1580, 0x2011, 0x909a, 0xad98, 0x0006, 0x20a9,
-	0x0004, 0x080c, 0x7326, 0x1538, 0x0046, 0x0016, 0x6aa0, 0xa294,
-	0x00ff, 0x8227, 0xa006, 0x2009, 0x8b52, 0x210c, 0xd1a4, 0x0138,
-	0x2009, 0x0029, 0x080c, 0x8982, 0x6800, 0xc0e5, 0x6802, 0x2019,
-	0x0029, 0x080c, 0x59d5, 0x0086, 0x2041, 0x0000, 0x080c, 0x5911,
-	0x2c08, 0x080c, 0x878f, 0x008e, 0x2001, 0x0007, 0x080c, 0x42c7,
-	0x001e, 0x004e, 0xa006, 0x015e, 0x003e, 0x002e, 0x00de, 0x00ce,
-	0x0005, 0x00d6, 0x2069, 0x908e, 0x6800, 0xa086, 0x0800, 0x0118,
-	0x6013, 0x0000, 0x0008, 0xa006, 0x00de, 0x0005, 0x00c6, 0x00f6,
-	0x0016, 0x0026, 0x0036, 0x0156, 0x2079, 0x908c, 0x7930, 0x7834,
-	0x080c, 0x22e9, 0x11a0, 0x080c, 0x430a, 0x1188, 0x2011, 0x9090,
-	0xac98, 0x000a, 0x20a9, 0x0004, 0x080c, 0x7326, 0x1140, 0x2011,
-	0x9094, 0xac98, 0x0006, 0x20a9, 0x0004, 0x080c, 0x7326, 0x015e,
-	0x003e, 0x002e, 0x001e, 0x00fe, 0x00ce, 0x0005, 0x00c6, 0x0006,
-	0x0016, 0x0026, 0x0036, 0x0156, 0x2011, 0x9083, 0x2204, 0x8211,
-	0x220c, 0x080c, 0x22e9, 0x11a0, 0x080c, 0x430a, 0x1188, 0x2011,
-	0x9096, 0xac98, 0x000a, 0x20a9, 0x0004, 0x080c, 0x7326, 0x1140,
-	0x2011, 0x909a, 0xac98, 0x0006, 0x20a9, 0x0004, 0x080c, 0x7326,
-	0x015e, 0x003e, 0x002e, 0x001e, 0x000e, 0x00ce, 0x0005, 0x00e6,
-	0x00c6, 0x0076, 0x0066, 0x0056, 0x0046, 0x0026, 0x0126, 0x2091,
-	0x8000, 0x2029, 0x8db3, 0x252c, 0x2021, 0x8db9, 0x2424, 0x2061,
-	0x9200, 0x2071, 0x8b00, 0x7644, 0x7064, 0x8001, 0xa602, 0x1a04,
-	0x87ef, 0x2100, 0xac06, 0x05d0, 0x080c, 0x8999, 0x05b8, 0x671c,
-	0xa786, 0x0001, 0x0904, 0x8801, 0xa786, 0x0007, 0x0578, 0x2500,
-	0xac06, 0x0560, 0x2400, 0xac06, 0x0548, 0x080c, 0x89a9, 0x1530,
-	0x88ff, 0x0118, 0x6020, 0xa906, 0x1508, 0x00d6, 0x6000, 0xa086,
-	0x0004, 0x1120, 0x0016, 0x080c, 0x179e, 0x001e, 0x6010, 0x2068,
-	0x080c, 0x7b8f, 0x0180, 0xa786, 0x0003, 0x1510, 0x6837, 0x0103,
-	0x6b4a, 0x6847, 0x0000, 0x0016, 0x080c, 0x7dc8, 0x080c, 0x46a1,
-	0x001e, 0x080c, 0x7d30, 0x00de, 0x080c, 0x7d3c, 0xace0, 0x000c,
-	0x2001, 0x8b16, 0x2004, 0xac02, 0x1210, 0x0804, 0x87a1, 0x012e,
-	0x002e, 0x004e, 0x005e, 0x006e, 0x007e, 0x00ce, 0x00ee, 0x0005,
-	0xa786, 0x0006, 0x19d8, 0xa386, 0x0005, 0x0d40, 0x080c, 0x8942,
-	0x0c10, 0x080c, 0x89a9, 0x1d10, 0xa180, 0x0001, 0x2004, 0xa086,
-	0x0018, 0x19e0, 0x6000, 0xa086, 0x0002, 0x19c0, 0x080c, 0x7d58,
-	0x0130, 0x080c, 0x7d69, 0x1990, 0x080c, 0x6fb6, 0x0010, 0x080c,
-	0x2589, 0x080c, 0x7d3c, 0x0850, 0x00c6, 0x00e6, 0x0016, 0x2c08,
-	0x2170, 0x080c, 0x8956, 0x001e, 0x0120, 0x601c, 0xa084, 0x000f,
-	0x001b, 0x00ee, 0x00ce, 0x0005, 0x8834, 0x8834, 0x8834, 0x8834,
-	0x8834, 0x8834, 0x8836, 0x8834, 0xa006, 0x0005, 0x0046, 0x0016,
-	0x7018, 0xa080, 0x0028, 0x2024, 0xa4a4, 0x00ff, 0x8427, 0x2c00,
-	0x2009, 0x0020, 0x080c, 0x8982, 0x001e, 0x004e, 0x0036, 0x2019,
-	0x0002, 0x080c, 0x85f9, 0x003e, 0xa085, 0x0001, 0x0005, 0x2001,
-	0x0001, 0x080c, 0x42a7, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9,
-	0x0004, 0x2019, 0x8b05, 0x2011, 0x9096, 0x080c, 0x7326, 0x003e,
-	0x002e, 0x001e, 0x015e, 0xa005, 0x0005, 0x00f6, 0x00e6, 0x00c6,
-	0x0076, 0x0066, 0x0026, 0x0126, 0x2091, 0x8000, 0x2061, 0x9200,
-	0x2079, 0x0001, 0x8fff, 0x0904, 0x88bf, 0x2071, 0x8b00, 0x7644,
-	0x7064, 0x8001, 0xa602, 0x1a04, 0x88bf, 0x88ff, 0x0128, 0x2800,
-	0xac06, 0x15a0, 0x2079, 0x0000, 0x080c, 0x8999, 0x0578, 0x2400,
-	0xac06, 0x0560, 0x671c, 0xa786, 0x0006, 0x1540, 0xa786, 0x0007,
-	0x0528, 0x88ff, 0x1140, 0x6018, 0xa206, 0x1500, 0x85ff, 0x0118,
-	0x6020, 0xa106, 0x11d8, 0x00d6, 0x6000, 0xa086, 0x0004, 0x1140,
-	0x601f, 0x0007, 0x2001, 0x8da2, 0x2004, 0x6016, 0x080c, 0x179e,
-	0x6010, 0x2068, 0x080c, 0x7b8f, 0x0120, 0x0046, 0x080c, 0x8942,
-	0x004e, 0x00de, 0x080c, 0x7d3c, 0x88ff, 0x1190, 0xace0, 0x000c,
-	0x2001, 0x8b16, 0x2004, 0xac02, 0x1210, 0x0804, 0x8872, 0xa006,
-	0x012e, 0x002e, 0x006e, 0x007e, 0x00ce, 0x00ee, 0x00fe, 0x0005,
-	0xa8c5, 0x0001, 0x0ca8, 0x0086, 0x0056, 0x2041, 0x0000, 0x2029,
-	0x0001, 0x2c20, 0x2019, 0x0002, 0x6218, 0x080c, 0x6a17, 0x080c,
-	0x6aaf, 0x080c, 0x8865, 0x005e, 0x008e, 0x0005, 0x0026, 0x0046,
-	0x0056, 0x0086, 0x00c6, 0x0156, 0x2c20, 0x2128, 0x20a9, 0x007f,
-	0x2009, 0x0000, 0x0016, 0x0036, 0x080c, 0x430a, 0x1170, 0x2c10,
-	0x2041, 0x0000, 0x2508, 0x0056, 0x2029, 0x0001, 0x080c, 0x6a17,
-	0x080c, 0x6aaf, 0x080c, 0x8865, 0x005e, 0x003e, 0x001e, 0x8108,
-	0x1f04, 0x88ea, 0x015e, 0x00ce, 0x008e, 0x005e, 0x004e, 0x002e,
-	0x0005, 0x0086, 0x0056, 0x6218, 0x2041, 0x0000, 0x2029, 0x0001,
-	0x2019, 0x0048, 0x080c, 0x6a17, 0x080c, 0x6aaf, 0x2c20, 0x080c,
-	0x8865, 0x005e, 0x008e, 0x0005, 0x0026, 0x0046, 0x0056, 0x0086,
-	0x00c6, 0x0156, 0x2c20, 0x20a9, 0x007f, 0x2009, 0x0000, 0x0016,
-	0x0036, 0x080c, 0x430a, 0x1150, 0x2c10, 0x2041, 0x0000, 0x2828,
-	0x080c, 0x6a17, 0x080c, 0x6aaf, 0x080c, 0x8865, 0x003e, 0x001e,
-	0x8108, 0x1f04, 0x8927, 0x015e, 0x00ce, 0x008e, 0x005e, 0x004e,
-	0x002e, 0x0005, 0x0016, 0x00f6, 0x8dff, 0x0168, 0x6800, 0xa07d,
-	0x0138, 0x6803, 0x0000, 0x6b52, 0x080c, 0x46a1, 0x2f68, 0x0cb0,
-	0x6b52, 0x080c, 0x46a1, 0x00fe, 0x001e, 0x0005, 0x00e6, 0x0046,
-	0x0036, 0x2061, 0x9200, 0x2071, 0x8b00, 0x7444, 0x7064, 0x8001,
-	0xa402, 0x12d8, 0x2100, 0xac06, 0x0168, 0x6000, 0xa086, 0x0000,
-	0x0148, 0x6008, 0xa206, 0x1130, 0x6018, 0xa1a0, 0x0006, 0x2424,
-	0xa406, 0x0140, 0xace0, 0x000c, 0x2001, 0x8b16, 0x2004, 0xac02,
-	0x1220, 0x0c08, 0xa085, 0x0001, 0x0008, 0xa006, 0x003e, 0x004e,
-	0x00ee, 0x0005, 0x00d6, 0x0006, 0x080c, 0x1488, 0x000e, 0x090c,
-	0x1410, 0x6837, 0x010d, 0x685e, 0x6956, 0x6c46, 0x684f, 0x0000,
-	0xa006, 0x68b2, 0x6802, 0x683a, 0x685a, 0x080c, 0x46a1, 0x00de,
-	0x0005, 0x6700, 0xa786, 0x0000, 0x0158, 0xa786, 0x0001, 0x0140,
-	0xa786, 0x000a, 0x0128, 0xa786, 0x0009, 0x0110, 0xa085, 0x0001,
-	0x0005, 0x00e6, 0x6018, 0x2070, 0x70a0, 0xa206, 0x00ee, 0x0005,
-	0xa186, 0x0013, 0x1128, 0x6004, 0xa082, 0x0085, 0x2008, 0x00c2,
-	0xa186, 0x0027, 0x1178, 0x080c, 0x5c37, 0x0036, 0x00d6, 0x6010,
-	0x2068, 0x2019, 0x0004, 0x080c, 0x8942, 0x00de, 0x003e, 0x080c,
-	0x5d10, 0x0005, 0xa186, 0x0014, 0x0d70, 0x080c, 0x6d55, 0x0005,
-	0x89d9, 0x89d7, 0x89d7, 0x89d7, 0x89d7, 0x89d7, 0x89d9, 0x080c,
-	0x1410, 0x080c, 0x5c37, 0x6003, 0x000c, 0x080c, 0x5d10, 0x0005,
-	0xa182, 0x008c, 0x1220, 0xa182, 0x0085, 0x0208, 0x001a, 0x080c,
-	0x6d55, 0x0005, 0x89f1, 0x89f1, 0x89f1, 0x89f1, 0x89f3, 0x89f8,
-	0x89f1, 0x080c, 0x1410, 0x00d6, 0x080c, 0x6d18, 0x00de, 0x0005,
-	0x080c, 0x6d18, 0x0005, 0x00e6, 0x6018, 0x2070, 0x7000, 0xd0ec,
-	0x00ee, 0x0005, 0x0126, 0x0006, 0x00e6, 0x2091, 0x8000, 0x2071,
-	0x8b40, 0xd5a4, 0x0118, 0x7034, 0x8000, 0x7036, 0xd5b4, 0x0118,
-	0x7030, 0x8000, 0x7032, 0xd5ac, 0x0118, 0x2071, 0x8b4a, 0x0451,
-	0x00ee, 0x000e, 0x012e, 0x0005, 0x0126, 0x0006, 0x00e6, 0x2091,
-	0x8000, 0x2071, 0x8b40, 0xd5a4, 0x0118, 0x7034, 0x8000, 0x7036,
-	0xd5b4, 0x0118, 0x7030, 0x8000, 0x7032, 0xd5ac, 0x0118, 0x2071,
-	0x8b4a, 0x0081, 0x00ee, 0x000e, 0x012e, 0x0005, 0x0126, 0x0006,
-	0x00e6, 0x2091, 0x8000, 0x2071, 0x8b42, 0x0021, 0x00ee, 0x000e,
-	0x012e, 0x0005, 0x2e04, 0x8000, 0x2072, 0x1220, 0x8e70, 0x2e04,
-	0x8000, 0x2072, 0x0005, 0x00e6, 0x2071, 0x8b40, 0x0c99, 0x00ee,
-	0x0005, 0x00e6, 0x2071, 0x8b44, 0x0c69, 0x00ee, 0x0005, 0x0001,
-	0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100,
-	0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000, 0x2854
-};
-
diff -u --recursive --new-file v2.4.8/linux/drivers/scsi/scsi_lib.c linux/drivers/scsi/scsi_lib.c
--- v2.4.8/linux/drivers/scsi/scsi_lib.c	Sun Aug 12 13:28:00 2001
+++ linux/drivers/scsi/scsi_lib.c	Sun Aug 12 10:51:42 2001
@@ -726,6 +726,15 @@
 			break;
 		}
 	}			/* driver byte != 0 */
+	if (host_byte(result) == DID_RESET) {
+		/*
+		 * Third party bus reset or reset for error
+		 * recovery reasons.  Just retry the request
+		 * and see what happens.  
+		 */
+		scsi_queue_next_request(q, SCpnt);
+		return;
+	}
 	if (result) {
 		struct Scsi_Device_Template *STpnt;
 
diff -u --recursive --new-file v2.4.8/linux/drivers/scsi/st.c linux/drivers/scsi/st.c
--- v2.4.8/linux/drivers/scsi/st.c	Wed Jul 25 17:10:23 2001
+++ linux/drivers/scsi/st.c	Sun Aug 12 11:21:47 2001
@@ -5,14 +5,14 @@
    History:
    Rewritten from Dwayne Forsyth's SCSI tape driver by Kai Makisara.
    Contribution and ideas from several people including (in alphabetical
-   order) Klaus Ehrenfried, Eric Lee Green, Wolfgang Denk, Steve Hirsch,
-   Andreas Koppenh"ofer, Michael Leodolter, Eyal Lebedinsky, Michael Schaefer,
-   J"org Weule, and Eric Youngdale.
+   order) Klaus Ehrenfried, Eugene Exarevsky, Eric Lee Green, Wolfgang Denk,
+   Steve Hirsch, Andreas Koppenh"ofer, Michael Leodolter, Eyal Lebedinsky,
+   Michael Schaefer, J"org Weule, and Eric Youngdale.
 
-   Copyright 1992 - 2000 Kai Makisara
+   Copyright 1992 - 2001 Kai Makisara
    email Kai.Makisara@metla.fi
 
-   Last modified: Mon Nov 13 21:01:09 2000 by makisara@kai.makisara.local
+   Last modified: Sun Aug 12 12:34:28 2001 by makisara@kai.makisara.local
    Some small formal changes - aeb, 950809
 
    Last modified: 18-JAN-1998 Richard Gooch <rgooch@atnf.csiro.au> Devfs support
@@ -21,6 +21,8 @@
    error handling will be discarded.
  */
 
+static char *verstr = "20010812";
+
 #include <linux/module.h>
 
 #include <linux/fs.h>
@@ -77,9 +79,13 @@
 MODULE_AUTHOR("Kai Makisara");
 MODULE_DESCRIPTION("SCSI Tape Driver");
 MODULE_PARM(buffer_kbs, "i");
+MODULE_PARM_DESC(buffer_kbs, "Default driver buffer size (KB; 32)");
 MODULE_PARM(write_threshold_kbs, "i");
+MODULE_PARM_DESC(write_threshold_kbs, "Asynchronous write threshold (KB; 30)");
 MODULE_PARM(max_buffers, "i");
+MODULE_PARM_DESC(max_buffers, "Maximum number of buffer allocated at initialisation (4)");
 MODULE_PARM(max_sg_segs, "i");
+MODULE_PARM_DESC(max_sg_segs, "Maximum number of scatter/gather segments to use (32)");
 
 #ifndef MODULE
 static struct st_dev_parm {
@@ -302,38 +308,33 @@
 	int remainder;
 	Scsi_Tape *STp;
 
-	if ((st_nbr = TAPE_NR(SCpnt->request.rq_dev)) < st_template.nr_dev) {
-		read_lock(&st_dev_arr_lock);
-		STp = scsi_tapes[st_nbr];
-		read_unlock(&st_dev_arr_lock);
-		if ((STp->buffer)->writing &&
-		    (SCpnt->sense_buffer[0] & 0x70) == 0x70 &&
-		    (SCpnt->sense_buffer[2] & 0x40)) {
-			/* EOM at write-behind, has all been written? */
-			if ((SCpnt->sense_buffer[0] & 0x80) != 0)
-				remainder = (SCpnt->sense_buffer[3] << 24) |
-                                    (SCpnt->sense_buffer[4] << 16) |
-				    (SCpnt->sense_buffer[5] << 8) |
-                                    SCpnt->sense_buffer[6];
-			else
-				remainder = 0;
-			if ((SCpnt->sense_buffer[2] & 0x0f) == VOLUME_OVERFLOW ||
-			    remainder > 0)
-				(STp->buffer)->midlevel_result = SCpnt->result; /* Error */
-			else
-				(STp->buffer)->midlevel_result = INT_MAX;	/* OK */
-		} else
-			(STp->buffer)->midlevel_result = SCpnt->result;
-		SCpnt->request.rq_status = RQ_SCSI_DONE;
-		(STp->buffer)->last_SRpnt = SCpnt->sc_request;
-		DEB( STp->write_pending = 0; )
+	st_nbr = TAPE_NR(SCpnt->request.rq_dev);
+	read_lock(&st_dev_arr_lock);
+	STp = scsi_tapes[st_nbr];
+	read_unlock(&st_dev_arr_lock);
+	if ((STp->buffer)->writing &&
+	    (SCpnt->sense_buffer[0] & 0x70) == 0x70 &&
+	    (SCpnt->sense_buffer[2] & 0x40)) {
+		/* EOM at write-behind, has all been written? */
+		if ((SCpnt->sense_buffer[0] & 0x80) != 0)
+			remainder = (SCpnt->sense_buffer[3] << 24) |
+				(SCpnt->sense_buffer[4] << 16) |
+				(SCpnt->sense_buffer[5] << 8) |
+				SCpnt->sense_buffer[6];
+		else
+			remainder = 0;
+		if ((SCpnt->sense_buffer[2] & 0x0f) == VOLUME_OVERFLOW ||
+		    remainder > 0)
+			(STp->buffer)->midlevel_result = SCpnt->result; /* Error */
+		else
+			(STp->buffer)->midlevel_result = INT_MAX;	/* OK */
+	} else
+		(STp->buffer)->midlevel_result = SCpnt->result;
+	SCpnt->request.rq_status = RQ_SCSI_DONE;
+	(STp->buffer)->last_SRpnt = SCpnt->sc_request;
+	DEB( STp->write_pending = 0; )
 
-		complete(SCpnt->request.waiting);
-	}
-        DEB(
-	else if (debugging)
-		printk(KERN_ERR "st?: Illegal interrupt device %x\n", st_nbr);
-	) /* end DEB */
+	complete(SCpnt->request.waiting);
 }
 
 
@@ -1302,8 +1303,7 @@
                         DEBC(printk(ST_DEB_MSG "st%d: Error on write:\n", dev));
 			if ((SRpnt->sr_sense_buffer[0] & 0x70) == 0x70 &&
 			    (SRpnt->sr_sense_buffer[2] & 0x40)) {
-				if (STp->block_size != 0 &&
-                                    (SRpnt->sr_sense_buffer[0] & 0x80) != 0)
+				if ((SRpnt->sr_sense_buffer[0] & 0x80) != 0)
 					transfer = (SRpnt->sr_sense_buffer[3] << 24) |
 					    (SRpnt->sr_sense_buffer[4] << 16) |
 					    (SRpnt->sr_sense_buffer[5] << 8) |
@@ -2302,7 +2302,7 @@
 	case MTEOM:
 		if (!STp->fast_mteom) {
 			/* space to the end of tape */
-			ioctl_result = st_int_ioctl(STp, MTFSF, 0x3fff);
+			ioctl_result = st_int_ioctl(STp, MTFSF, 0x7fffff);
 			fileno = STps->drv_file;
 			if (STps->eof >= ST_EOD_1)
 				return 0;
@@ -2361,6 +2361,8 @@
 			return (-EINVAL);
 		}
 		cmd[0] = MODE_SELECT;
+		if ((STp->use_pf & USE_PF))
+			cmd[1] = MODE_SELECT_PAGE_FORMAT;
 		cmd[4] = datalen = 12;
 		direction = SCSI_DATA_WRITE;
 
@@ -2474,11 +2476,11 @@
 			STps->drv_block = 0;
 		}
 
-		undone = (
-				 (SRpnt->sr_sense_buffer[3] << 24) +
-				 (SRpnt->sr_sense_buffer[4] << 16) +
-				 (SRpnt->sr_sense_buffer[5] << 8) +
-				 SRpnt->sr_sense_buffer[6]);
+		undone = ((SRpnt->sr_sense_buffer[3] << 24) +
+			  (SRpnt->sr_sense_buffer[4] << 16) +
+			  (SRpnt->sr_sense_buffer[5] << 8) +
+			  SRpnt->sr_sense_buffer[6]);
+
 		if (cmd_in == MTWEOF &&
 		    (SRpnt->sr_sense_buffer[0] & 0x70) == 0x70 &&
 		    (SRpnt->sr_sense_buffer[2] & 0x4f) == 0x40 &&
@@ -2496,6 +2498,8 @@
 			STps->drv_block = 0;
 			STps->eof = ST_NOEOF;
 		} else if ((cmd_in == MTBSF) || (cmd_in == MTBSFM)) {
+			if (arg > 0 && undone < 0)  /* Some drives get this wrong */
+				undone = (-undone);
 			if (STps->drv_file >= 0)
 				STps->drv_file = fileno + undone;
 			STps->drv_block = 0;
@@ -2518,6 +2522,8 @@
 				STps->drv_file--;
 				STps->drv_block = (-1);
 			} else {
+				if (arg > 0 && undone < 0)  /* Some drives get this wrong */
+					undone = (-undone);
 				if (STps->drv_block >= 0)
 					STps->drv_block = blkno + undone;
 			}
@@ -2526,6 +2532,19 @@
 			STps->drv_file = (-1);
 			STps->drv_block = (-1);
 			STps->eof = ST_EOD;
+		} else if (cmd_in == MTSETBLK ||
+			   cmd_in == MTSETDENSITY ||
+			   cmd_in == MTSETDRVBUFFER ||
+			   cmd_in == SET_DENS_AND_BLK) {
+			if ((SRpnt->sr_sense_buffer[2] & 0x0f) == ILLEGAL_REQUEST &&
+			    !(STp->use_pf & PF_TESTED)) {
+				/* Try the other possible state of Page Format if not
+				   already tried */
+				STp->use_pf = !STp->use_pf | PF_TESTED;
+				scsi_release_request(SRpnt);
+				SRpnt = NULL;
+				return st_int_ioctl(STp, cmd_in, arg);
+			}
 		} else if (chg_eof)
 			STps->eof = ST_NOEOF;
 
@@ -3608,6 +3627,7 @@
 	tpnt->in_use = 0;
 	tpnt->drv_buffer = 1;	/* Try buffering if no mode sense */
 	tpnt->restr_dma = (SDp->host)->unchecked_isa_dma;
+	tpnt->use_pf = (SDp->scsi_level >= SCSI_2);
 	tpnt->density = 0;
 	tpnt->do_auto_lock = ST_AUTO_LOCK;
 	tpnt->can_bsr = ST_IN_FILE_POS;
@@ -3692,8 +3712,9 @@
 	if (st_template.dev_noticed == 0 || st_registered)
 		return 0;
 
-	printk(KERN_INFO "st: bufsize %d, wrt %d, max init. buffers %d, s/g segs %d.\n",
-	       st_buffer_size, st_write_threshold, st_max_buffers, st_max_sg_segs);
+	printk(KERN_INFO
+	       "st: Version %s, bufsize %d, wrt %d, max init. bufs %d, s/g segs %d\n",
+	       verstr, st_buffer_size, st_write_threshold, st_max_buffers, st_max_sg_segs);
 
 	write_lock_irqsave(&st_dev_arr_lock, flags);
 	if (!st_registered) {
diff -u --recursive --new-file v2.4.8/linux/drivers/scsi/st.h linux/drivers/scsi/st.h
--- v2.4.8/linux/drivers/scsi/st.h	Wed Jul 25 17:10:23 2001
+++ linux/drivers/scsi/st.h	Sun Aug 12 11:19:58 2001
@@ -81,6 +81,7 @@
 	unsigned char restr_dma;
 	unsigned char scsi2_logical;
 	unsigned char default_drvbuffer;	/* 0xff = don't touch, value 3 bits */
+	unsigned char use_pf;			/* Set Page Format bit in all mode selects? */
 	int tape_type;
 	int write_threshold;
 	int timeout;		/* timeout for normal commands */
@@ -126,6 +127,9 @@
 #endif
 } Scsi_Tape;
 
+/* Bit masks for use_pf */
+#define USE_PF      1
+#define PF_TESTED   2
 
 /* Values of eof */
 #define	ST_NOEOF	0
diff -u --recursive --new-file v2.4.8/linux/drivers/sgi/char/ds1286.c linux/drivers/sgi/char/ds1286.c
--- v2.4.8/linux/drivers/sgi/char/ds1286.c	Fri Feb  9 11:30:23 2001
+++ linux/drivers/sgi/char/ds1286.c	Sun Aug 12 10:38:48 2001
@@ -56,8 +56,6 @@
 
 static DECLARE_WAIT_QUEUE_HEAD(ds1286_wait);
 
-static long long ds1286_llseek(struct file *file, loff_t offset, int origin);
-
 static ssize_t ds1286_read(struct file *file, char *buf,
 			size_t count, loff_t *ppos);
 
@@ -101,11 +99,6 @@
  *	Now all the various file operations that we export.
  */
 
-static long long ds1286_llseek(struct file *file, loff_t offset, int origin)
-{
-	return -ESPIPE;
-}
-
 static ssize_t ds1286_read(struct file *file, char *buf,
                            size_t count, loff_t *ppos)
 {
@@ -374,7 +367,7 @@
  */
 
 static struct file_operations ds1286_fops = {
-	llseek:		ds1286_llseek,
+	llseek:		no_llseek,
 	read:		ds1286_read,
 	poll:		ds1286_poll,
 	ioctl:		ds1286_ioctl,
diff -u --recursive --new-file v2.4.8/linux/drivers/sound/Config.in linux/drivers/sound/Config.in
--- v2.4.8/linux/drivers/sound/Config.in	Wed Jul 25 17:10:23 2001
+++ linux/drivers/sound/Config.in	Sun Aug 12 12:29:01 2001
@@ -6,6 +6,7 @@
 
 # Prompt user for primary drivers.
 
+dep_tristate '  BT878 audio dma' CONFIG_SOUND_BT878 $CONFIG_SOUND
 dep_tristate '  C-Media PCI (CMI8338/8738)' CONFIG_SOUND_CMPCI $CONFIG_SOUND $CONFIG_PCI
 if [ "$CONFIG_SOUND_CMPCI" = "y" -o "$CONFIG_SOUND_CMPCI" = "m" ]; then
     bool '    Enable legacy FM' CONFIG_SOUND_CMPCI_FM
@@ -30,6 +31,7 @@
     fi
 fi
 dep_tristate '  Creative SBLive! (EMU10K1)' CONFIG_SOUND_EMU10K1 $CONFIG_SOUND $CONFIG_PCI
+dep_mbool    '    Creative SBLive! MIDI' CONFIG_MIDI_EMU10K1 $CONFIG_SOUND_EMU10K1 $CONFIG_EXPERIMENTAL
 dep_tristate '  Crystal SoundFusion (CS4280/461x)' CONFIG_SOUND_FUSION $CONFIG_SOUND
 dep_tristate '  Crystal Sound CS4281' CONFIG_SOUND_CS4281 $CONFIG_SOUND
 dep_tristate '  Ensoniq AudioPCI (ES1370)' CONFIG_SOUND_ES1370 $CONFIG_SOUND $CONFIG_PCI
@@ -38,11 +40,11 @@
 dep_tristate '  ESS Maestro, Maestro2, Maestro2E driver' CONFIG_SOUND_MAESTRO $CONFIG_SOUND
 dep_tristate '  ESS Maestro3/Allegro driver (EXPERIMENTAL)' CONFIG_SOUND_MAESTRO3 $CONFIG_SOUND $CONFIG_PCI $CONFIG_EXPERIMENTAL
 dep_tristate '  Intel ICH (i8xx) audio support' CONFIG_SOUND_ICH $CONFIG_PCI
+dep_tristate '  RME Hammerfall (RME96XX) support' CONFIG_SOUND_RME96XX $CONFIG_SOUND $CONFIG_PCI $CONFIG_EXPERIMENTAL
 dep_tristate '  S3 SonicVibes' CONFIG_SOUND_SONICVIBES $CONFIG_SOUND
 if [ "$CONFIG_VISWS" = "y" ]; then
     dep_tristate '  SGI Visual Workstation Sound' CONFIG_SOUND_VWSND $CONFIG_SOUND
 fi
-
 dep_tristate '  Trident 4DWave DX/NX, SiS 7018 or ALi 5451 PCI Audio Core' CONFIG_SOUND_TRIDENT $CONFIG_SOUND
 
 dep_tristate '  Support for Turtle Beach MultiSound Classic, Tahiti, Monterey' CONFIG_SOUND_MSNDCLAS $CONFIG_SOUND
diff -u --recursive --new-file v2.4.8/linux/drivers/sound/Makefile linux/drivers/sound/Makefile
--- v2.4.8/linux/drivers/sound/Makefile	Sun Aug 12 13:28:00 2001
+++ linux/drivers/sound/Makefile	Sun Aug 12 10:47:57 2001
@@ -68,12 +68,19 @@
 obj-$(CONFIG_SOUND_MAESTRO)	+= maestro.o
 obj-$(CONFIG_SOUND_MAESTRO3)	+= maestro3.o ac97_codec.o
 obj-$(CONFIG_SOUND_TRIDENT)	+= trident.o ac97_codec.o
+obj-$(CONFIG_SOUND_RME96XX)	+= rme96xx.o
+obj-$(CONFIG_SOUND_BT878)	+= btaudio.o
+
+obj-$(CONFIG_SOUND_EMU10K1)	+= ac97_codec.o
+ifeq ($(CONFIG_MIDI_EMU10K1),y)
+  obj-$(CONFIG_SOUND_EMU10K1)	+= sound.o
+endif
 
 subdir-$(CONFIG_SOUND_EMU10K1) += emu10k1
 subdir-$(CONFIG_SOUND_CS4281) += cs4281
 
 ifeq ($(CONFIG_SOUND_EMU10K1),y)
-  obj-y += ac97_codec.o emu10k1/emu10k1.o
+  obj-y += emu10k1/emu10k1.o
 endif
 
 ifeq ($(CONFIG_SOUND_CS4281),y)
diff -u --recursive --new-file v2.4.8/linux/drivers/sound/ac97_codec.c linux/drivers/sound/ac97_codec.c
--- v2.4.8/linux/drivers/sound/ac97_codec.c	Thu Apr 19 22:58:20 2001
+++ linux/drivers/sound/ac97_codec.c	Sun Aug 12 10:51:42 2001
@@ -65,54 +65,83 @@
 static int sigmatel_9708_init(struct ac97_codec *codec);
 static int sigmatel_9721_init(struct ac97_codec *codec);
 static int sigmatel_9744_init(struct ac97_codec *codec);
-static int enable_eapd(struct ac97_codec *codec);
+static int eapd_control(struct ac97_codec *codec, int);
+static int crystal_digital_control(struct ac97_codec *codec, int mode);
+
+
+/*
+ *	AC97 operations.
+ *
+ *	If you are adding a codec then you should be able to use
+ *		eapd_ops - any codec that supports EAPD amp control (most)
+ *		null_ops - any ancient codec that supports nothing
+ *
+ *	The three functions are
+ *		init - used for non AC97 standard initialisation
+ *		amplifier - used to do amplifier control (1=on 0=off)
+ *		digital - switch to digital modes (0 = analog)
+ *
+ *	Not all codecs support all features, not all drivers use all the
+ *	operations yet
+ */
+ 
+static struct ac97_ops null_ops = { NULL, NULL, NULL };
+static struct ac97_ops default_ops = { NULL, eapd_control, NULL };
+static struct ac97_ops wolfson_ops = { wolfson_init, NULL, NULL };
+static struct ac97_ops tritech_ops = { tritech_init, NULL, NULL };
+static struct ac97_ops tritech_m_ops = { tritech_maestro_init, NULL, NULL };
+static struct ac97_ops sigmatel_9708_ops = { sigmatel_9708_init, NULL, NULL };
+static struct ac97_ops sigmatel_9721_ops = { sigmatel_9721_init, NULL, NULL };
+static struct ac97_ops sigmatel_9744_ops = { sigmatel_9744_init, NULL, NULL };
+static struct ac97_ops crystal_digital_ops = { NULL, eapd_control, crystal_digital_control };
 
 /* sorted by vendor/device id */
 static const struct {
 	u32 id;
 	char *name;
-	int  (*init)  (struct ac97_codec *codec);
+	struct ac97_ops *ops;
 } ac97_codec_ids[] = {
-	{0x41445303, "Analog Devices AD1819",	NULL},
-	{0x41445340, "Analog Devices AD1881",	NULL},
-	{0x41445348, "Analog Devices AD1881A",	NULL},
-	{0x41445460, "Analog Devices AD1885",	enable_eapd},
-	{0x414B4D00, "Asahi Kasei AK4540",	NULL},
-	{0x414B4D01, "Asahi Kasei AK4542",	NULL},
-	{0x414B4D02, "Asahi Kasei AK4543",	NULL},
-	{0x414C4710, "ALC200/200P",		NULL},
-	{0x43525900, "Cirrus Logic CS4297",	enable_eapd},
-	{0x43525903, "Cirrus Logic CS4297",	enable_eapd},
-	{0x43525913, "Cirrus Logic CS4297A rev A", enable_eapd},
-	{0x43525914, "Cirrus Logic CS4297A rev B", NULL},
-	{0x43525923, "Cirrus Logic CS4298",	NULL},
-	{0x4352592B, "Cirrus Logic CS4294",	NULL},
-	{0x4352592D, "Cirrus Logic CS4294",	NULL},
-	{0x43525931, "Cirrus Logic CS4299 rev A", NULL},
-	{0x43525933, "Cirrus Logic CS4299 rev C", NULL},
-	{0x43525934, "Cirrus Logic CS4299 rev D", NULL},
-	{0x45838308, "ESS Allegro ES1988",	NULL},
-	{0x49434511, "ICE1232",			NULL}, /* I hope --jk */
-	{0x4e534331, "National Semiconductor LM4549", NULL},
-	{0x53494c22, "Silicon Laboratory Si3036", NULL},
-	{0x53494c23, "Silicon Laboratory Si3038", NULL},
-	{0x545200FF, "TriTech TR?????",		tritech_maestro_init},
-	{0x54524102, "TriTech TR28022",		NULL},
-	{0x54524103, "TriTech TR28023",		NULL},
-	{0x54524106, "TriTech TR28026",		NULL},
-	{0x54524108, "TriTech TR28028",		tritech_init},
-	{0x54524123, "TriTech TR?????",		NULL},
-	{0x574D4C00, "Wolfson WM9704",		wolfson_init},
-	{0x574D4C03, "Wolfson WM9703/9704",	wolfson_init},
-	{0x574D4C04, "Wolfson WM9704 (quad)",	wolfson_init},
-	{0x83847600, "SigmaTel STAC????",	NULL},
-	{0x83847604, "SigmaTel STAC9701/3/4/5", NULL},
-	{0x83847605, "SigmaTel STAC9704",	NULL},
-	{0x83847608, "SigmaTel STAC9708",	sigmatel_9708_init},
-	{0x83847609, "SigmaTel STAC9721/23",	sigmatel_9721_init},
-	{0x83847644, "SigmaTel STAC9744/45",	sigmatel_9744_init},
-	{0x83847656, "SigmaTel STAC9756/57",	sigmatel_9744_init},
-	{0x83847684, "SigmaTel STAC9783/84?",	NULL},
+	{0x41445303, "Analog Devices AD1819",	&null_ops},
+	{0x41445340, "Analog Devices AD1881",	&null_ops},
+	{0x41445348, "Analog Devices AD1881A",	&null_ops},
+	{0x41445460, "Analog Devices AD1885",	&default_ops},
+	{0x414B4D00, "Asahi Kasei AK4540",	&null_ops},
+	{0x414B4D01, "Asahi Kasei AK4542",	&null_ops},
+	{0x414B4D02, "Asahi Kasei AK4543",	&null_ops},
+	{0x414C4710, "ALC200/200P",		&null_ops},
+	{0x43525900, "Cirrus Logic CS4297",	&default_ops},
+	{0x43525903, "Cirrus Logic CS4297",	&default_ops},
+	{0x43525913, "Cirrus Logic CS4297A rev A", &default_ops},
+	{0x43525914, "Cirrus Logic CS4297A rev B", &default_ops},
+	{0x43525923, "Cirrus Logic CS4298",	&null_ops},
+	{0x4352592B, "Cirrus Logic CS4294",	&null_ops},
+	{0x4352592D, "Cirrus Logic CS4294",	&null_ops},
+	{0x43525931, "Cirrus Logic CS4299 rev A", &crystal_digital_ops},
+	{0x43525933, "Cirrus Logic CS4299 rev C", &crystal_digital_ops},
+	{0x43525934, "Cirrus Logic CS4299 rev D", &crystal_digital_ops},
+	{0x45838308, "ESS Allegro ES1988",	&null_ops},
+	{0x49434511, "ICE1232",			&null_ops}, /* I hope --jk */
+	{0x4e534331, "National Semiconductor LM4549", &null_ops},
+	{0x53494c22, "Silicon Laboratory Si3036", &null_ops},
+	{0x53494c23, "Silicon Laboratory Si3038", &null_ops},
+	{0x545200FF, "TriTech TR?????",		&tritech_m_ops},
+	{0x54524102, "TriTech TR28022",		&null_ops},
+	{0x54524103, "TriTech TR28023",		&null_ops},
+	{0x54524106, "TriTech TR28026",		&null_ops},
+	{0x54524108, "TriTech TR28028",		&tritech_ops},
+	{0x54524123, "TriTech TR?????",		&null_ops},
+	{0x574D4C00, "Wolfson WM9704",		&wolfson_ops},
+	{0x574D4C03, "Wolfson WM9703/9704",	&wolfson_ops},
+	{0x574D4C04, "Wolfson WM9704 (quad)",	&wolfson_ops},
+	{0x83847600, "SigmaTel STAC????",	&null_ops},
+	{0x83847604, "SigmaTel STAC9701/3/4/5", &null_ops},
+	{0x83847605, "SigmaTel STAC9704",	&null_ops},
+	{0x83847608, "SigmaTel STAC9708",	&sigmatel_9708_ops},
+	{0x83847609, "SigmaTel STAC9721/23",	&sigmatel_9721_ops},
+	{0x83847644, "SigmaTel STAC9744/45",	&sigmatel_9744_ops},
+	{0x83847656, "SigmaTel STAC9756/57",	&sigmatel_9744_ops},
+	{0x83847684, "SigmaTel STAC9783/84?",	&null_ops},
+	{0x57454301, "Winbond 83971D",		&null_ops},
 	{0,}
 };
 
@@ -145,7 +174,7 @@
 	/*  24 */ "Wolfson Microelectronics 3D Enhancement",
 	/*  25 */ "Delta Integration 3D Enhancement",
 	/*  26 */ "SigmaTel 3D Enhancement",
-	/*  27 */ "Reserved 27",
+	/*  27 */ "Winbond 3D Stereo Enhancement",
 	/*  28 */ "Rockwell 3D Stereo Enhancement",
 	/*  29 */ "Reserved 29",
 	/*  30 */ "Reserved 30",
@@ -666,7 +695,7 @@
 	modem = codec->codec_read(codec, AC97_EXTENDED_MODEM_ID);
 
 	codec->name = NULL;
-	codec->codec_init = NULL;
+	codec->codec_ops = &null_ops;
 
 	id1 = codec->codec_read(codec, AC97_VENDOR_ID1);
 	id2 = codec->codec_read(codec, AC97_VENDOR_ID2);
@@ -674,7 +703,7 @@
 		if (ac97_codec_ids[i].id == ((id1 << 16) | id2)) {
 			codec->type = ac97_codec_ids[i].id;
 			codec->name = ac97_codec_ids[i].name;
-			codec->codec_init = ac97_codec_ids[i].init;
+			codec->codec_ops = ac97_codec_ids[i].ops;
 			break;
 		}
 	}
@@ -717,8 +746,8 @@
 	codec->mixer_ioctl = ac97_mixer_ioctl;
 
 	/* codec specific initialization for 4-6 channel output or secondary codec stuff */
-	if (codec->codec_init != NULL) {
-		codec->codec_init(codec);
+	if (codec->codec_ops->init != NULL) {
+		codec->codec_ops->init(codec);
 	}
 
 	/* initialize mixer channel volumes */
@@ -843,17 +872,42 @@
 
 
 /*
- *	External AMP management for EAPD using codecs
- *	(CS4279A, AD1885, ...)
+ *	This is basically standard AC97. It should work as a default for
+ *	almost all modern codecs. Note that some cards wire EAPD *backwards*
+ *	That side of it is up to the card driver not us to cope with.
+ *
  */
 
-static int enable_eapd(struct ac97_codec * codec)
+static int eapd_control(struct ac97_codec * codec, int on)
 {
-	codec->codec_write(codec, AC97_POWER_CONTROL,
-		codec->codec_read(codec, AC97_POWER_CONTROL)|0x8000);
+	if(on)
+		codec->codec_write(codec, AC97_POWER_CONTROL,
+			codec->codec_read(codec, AC97_POWER_CONTROL)|0x8000);
+	else
+		codec->codec_write(codec, AC97_POWER_CONTROL,
+			codec->codec_read(codec, AC97_POWER_CONTROL)&~0x8000);
 	return 0;
 }
 
+/*
+ *	Crystal digital audio control (CS4299
+ */
+ 
+static int crystal_digital_control(struct ac97_codec *codec, int mode)
+{
+	u16 cv;
+
+	switch(mode)
+	{
+		case 0: cv = 0x0; break;	/* SPEN off */
+		case 1: cv = 0x8004; break;	/* 48KHz digital */
+		case 2: cv = 0x8104; break;	/* 44.1KHz digital */
+		default:
+			return -1;		/* Not supported yet(eg AC3) */
+	}
+	codec->codec_write(codec, 0x68, cv);
+	return 0;
+}
 
 /* copied from drivers/sound/maestro.c */
 #if 0  /* there has been 1 person on the planet with a pt101 that we
diff -u --recursive --new-file v2.4.8/linux/drivers/sound/btaudio.c linux/drivers/sound/btaudio.c
--- v2.4.8/linux/drivers/sound/btaudio.c	Wed Dec 31 16:00:00 1969
+++ linux/drivers/sound/btaudio.c	Sun Aug 12 10:51:41 2001
@@ -0,0 +1,979 @@
+/*
+    btaudio - bt878 audio dma driver for linux 2.4.x
+
+    (c) 2000 Gerd Knorr <kraxel@goldbach.in-berlin.de>
+
+    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.
+
+*/
+
+#include <linux/version.h>
+#include <linux/module.h>
+#include <linux/errno.h>
+#include <linux/pci.h>
+#include <linux/sched.h>
+#include <linux/signal.h>
+#include <linux/types.h>
+#include <linux/wrapper.h>
+#include <linux/interrupt.h>
+#include <linux/init.h>
+#include <linux/poll.h>
+#include <linux/sound.h>
+#include <linux/soundcard.h>
+#include <asm/uaccess.h>
+
+
+/* mmio access */
+#define btwrite(dat,adr)    writel((dat), (bta->mmio+(adr)))
+#define btread(adr)         readl(bta->mmio+(adr))
+
+#define btand(dat,adr)      btwrite((dat) & btread(adr), adr)
+#define btor(dat,adr)       btwrite((dat) | btread(adr), adr)
+#define btaor(dat,mask,adr) btwrite((dat) | ((mask) & btread(adr)), adr)
+
+/* registers (shifted because bta->mmio is long) */
+#define REG_INT_STAT      (0x100 >> 2)
+#define REG_INT_MASK      (0x104 >> 2)
+#define REG_GPIO_DMA_CTL  (0x10c >> 2)
+#define REG_PACKET_LEN    (0x110 >> 2)
+#define REG_RISC_STRT_ADD (0x114 >> 2)
+#define REG_RISC_COUNT    (0x120 >> 2)
+
+/* IRQ bits - REG_INT_(STAT|MASK) */
+#define IRQ_SCERR         (1 << 19)
+#define IRQ_OCERR         (1 << 18)
+#define IRQ_PABORT        (1 << 17)
+#define IRQ_RIPERR        (1 << 16)
+#define IRQ_PPERR         (1 << 15)
+#define IRQ_FDSR          (1 << 14)
+#define IRQ_FTRGT         (1 << 13)
+#define IRQ_FBUS          (1 << 12)
+#define IRQ_RISCI         (1 << 11)
+#define IRQ_OFLOW         (1 <<  3)
+
+#define IRQ_BTAUDIO       (IRQ_SCERR | IRQ_OCERR | IRQ_PABORT | IRQ_RIPERR |\
+			   IRQ_PPERR | IRQ_FDSR  | IRQ_FTRGT  | IRQ_FBUS   |\
+			   IRQ_RISCI)
+
+/* REG_GPIO_DMA_CTL bits */
+#define DMA_CTL_A_PWRDN   (1 << 26)
+#define DMA_CTL_DA_SBR    (1 << 14)
+#define DMA_CTL_DA_ES2    (1 << 13)
+#define DMA_CTL_ACAP_EN   (1 <<  4)
+#define DMA_CTL_RISC_EN   (1 <<  1)
+#define DMA_CTL_FIFO_EN   (1 <<  0)
+
+/* RISC instructions */
+#define RISC_WRITE        (0x01 << 28)
+#define RISC_JUMP         (0x07 << 28)
+#define RISC_SYNC         (0x08 << 28)
+
+/* RISC bits */
+#define RISC_WR_SOL       (1 << 27)
+#define RISC_WR_EOL       (1 << 26)
+#define RISC_IRQ          (1 << 24)
+#define RISC_SYNC_RESYNC  (1 << 15)
+#define RISC_SYNC_FM1     0x06
+#define RISC_SYNC_VRO     0x0c
+
+#define HWBASE_AD (448000)
+#define HWBASE_DA 31928 /* 48000 */
+
+/* -------------------------------------------------------------- */
+
+struct btaudio {
+	/* linked list */
+	struct btaudio *next;
+
+	/* device info */
+	int            dsp_dev;
+	int            mixer_dev;
+	struct pci_dev *pci;
+	unsigned int   irq;
+	unsigned long  mem;
+	unsigned long  *mmio;
+
+	/* locking */
+	int            users;
+	struct semaphore lock;
+
+	/* risc instructions */
+	unsigned int   risc_size;
+	unsigned long  *risc_cpu;
+	dma_addr_t     risc_dma;
+
+	/* audio data */
+	unsigned int   buf_size;
+	unsigned char  *buf_cpu;
+	dma_addr_t     buf_dma;
+
+	/* buffer setup */
+	int line_bytes;
+	int line_count;
+	int block_bytes;
+	int block_count;
+
+	/* read fifo management */
+	int recording;
+	int dma_block;
+	int read_offset;
+	int read_count;
+	wait_queue_head_t readq;
+
+	/* settings */
+	int gain[3];
+	int source;
+	int bits;
+	int decimation;
+	int mixcount;
+	int sampleshift;
+	int channels;
+};
+
+static struct btaudio *btaudios = NULL;
+static unsigned int dsp = -1;
+static unsigned int mixer = -1;
+static unsigned int debug = 0;
+static unsigned int irq_debug = 0;
+static int analog = 0;
+
+/* -------------------------------------------------------------- */
+
+#define BUF_DEFAULT 128*1024
+#define BUF_MIN         8192
+
+static int alloc_buffer(struct btaudio *bta)
+{
+	if (NULL == bta->buf_cpu) {
+		for (bta->buf_size = BUF_DEFAULT; bta->buf_size >= BUF_MIN;
+		     bta->buf_size = bta->buf_size >> 1) {
+			bta->buf_cpu = pci_alloc_consistent
+				(bta->pci, bta->buf_size, &bta->buf_dma);
+			if (NULL != bta->buf_cpu)
+				break;
+		}
+		if (NULL == bta->buf_cpu)
+			return -ENOMEM;
+		memset(bta->buf_cpu,0,bta->buf_size);
+	}
+	if (NULL == bta->risc_cpu) {
+		bta->risc_size = PAGE_SIZE;
+		bta->risc_cpu = pci_alloc_consistent
+			(bta->pci, bta->risc_size, &bta->risc_dma);
+		if (NULL == bta->risc_cpu)
+			return -ENOMEM;
+	}
+	return 0;
+}
+
+static void free_buffer(struct btaudio *bta)
+{
+	if (NULL != bta->buf_cpu) {
+		pci_free_consistent(bta->pci, bta->buf_size,
+				    bta->buf_cpu, bta->buf_dma);
+		bta->buf_cpu = NULL;
+	}
+	if (NULL != bta->risc_cpu) {
+		pci_free_consistent(bta->pci, bta->risc_size,
+				    bta->risc_cpu, bta->risc_dma);
+		bta->risc_cpu = NULL;
+	}
+}
+
+static int make_risc(struct btaudio *bta)
+{
+	int rp, bp, line, block;
+	unsigned long risc;
+
+	bta->block_bytes = bta->buf_size >> 4;
+	bta->block_count = 1 << 4;
+	bta->line_bytes  = bta->block_bytes;
+	bta->line_count  = bta->block_count;
+	while (bta->line_bytes > 4095) {
+		bta->line_bytes >>= 1;
+		bta->line_count <<= 1;
+	}
+	if (bta->line_count > 255)
+		return -EINVAL;
+	if (debug)
+		printk("btaudio: bufsize=%d - bs=%d bc=%d - ls=%d, lc=%d\n",
+		       bta->buf_size,bta->block_bytes,bta->block_count,
+		       bta->line_bytes,bta->line_count);
+        rp = 0; bp = 0;
+	block = 0;
+	bta->risc_cpu[rp++] = cpu_to_le32(RISC_SYNC|RISC_SYNC_FM1);
+	bta->risc_cpu[rp++] = cpu_to_le32(0);
+	for (line = 0; line < bta->line_count; line++) {
+		risc  = RISC_WRITE | RISC_WR_SOL | RISC_WR_EOL;
+		risc |= bta->line_bytes;
+		if (0 == (bp & (bta->block_bytes-1))) {
+			risc |= RISC_IRQ;
+			risc |= (block  & 0x0f) << 16;
+			risc |= (~block & 0x0f) << 20;
+			block++;
+		}
+		bta->risc_cpu[rp++] = cpu_to_le32(risc);
+		bta->risc_cpu[rp++] = cpu_to_le32(bta->buf_dma + bp);
+		bp += bta->line_bytes;
+	}
+	bta->risc_cpu[rp++] = cpu_to_le32(RISC_SYNC|RISC_SYNC_VRO);
+	bta->risc_cpu[rp++] = cpu_to_le32(0);
+	bta->risc_cpu[rp++] = cpu_to_le32(RISC_JUMP); 
+	bta->risc_cpu[rp++] = cpu_to_le32(bta->risc_dma);
+	return 0;
+}
+
+static int start_recording(struct btaudio *bta)
+{
+	int ret;
+
+	if (0 != (ret = alloc_buffer(bta)))
+		return ret;
+	if (0 != (ret = make_risc(bta)))
+		return ret;
+
+	btwrite(bta->risc_dma, REG_RISC_STRT_ADD);
+	btwrite((bta->line_count << 16) | bta->line_bytes,
+		REG_PACKET_LEN);
+	btwrite(IRQ_BTAUDIO, REG_INT_MASK);
+	if (analog) {
+		btwrite(DMA_CTL_ACAP_EN |
+			DMA_CTL_RISC_EN |
+			DMA_CTL_FIFO_EN |
+			DMA_CTL_DA_ES2  |
+			((bta->bits == 8) ? DMA_CTL_DA_SBR : 0) |
+			(bta->gain[bta->source] << 28) |
+			(bta->source            << 24) |
+			(bta->decimation        <<  8),
+			REG_GPIO_DMA_CTL);
+	} else {
+		btwrite(DMA_CTL_ACAP_EN |
+			DMA_CTL_RISC_EN |
+			DMA_CTL_FIFO_EN |
+			DMA_CTL_DA_ES2  |
+			DMA_CTL_A_PWRDN |
+			(1 << 6)   |
+			((bta->bits == 8) ? DMA_CTL_DA_SBR : 0) |
+			(bta->gain[bta->source] << 28) |
+			(bta->source            << 24) |
+			(bta->decimation        <<  8),
+			REG_GPIO_DMA_CTL);
+	}
+	bta->dma_block = 0;
+	bta->read_offset = 0;
+	bta->read_count = 0;
+	bta->recording = 1;
+	if (debug)
+		printk("btaudio: recording started\n");
+	return 0;
+}
+
+static void stop_recording(struct btaudio *bta)
+{
+        btand(~15, REG_GPIO_DMA_CTL);
+	bta->recording = 0;
+	if (debug)
+		printk("btaudio: recording stopped\n");
+}
+
+/* -------------------------------------------------------------- */
+
+static loff_t btaudio_llseek(struct file *file, loff_t offset, int origin)
+{
+        return -ESPIPE;
+}
+
+/* -------------------------------------------------------------- */
+
+static int btaudio_mixer_open(struct inode *inode, struct file *file)
+{
+	int minor = MINOR(inode->i_rdev);
+	struct btaudio *bta;
+
+	for (bta = btaudios; bta != NULL; bta = bta->next)
+		if (bta->mixer_dev == minor)
+			break;
+	if (NULL == bta)
+		return -ENODEV;
+
+	file->private_data = bta;
+	return 0;
+}
+
+static int btaudio_mixer_release(struct inode *inode, struct file *file)
+{
+	return 0;
+}
+
+static int btaudio_mixer_ioctl(struct inode *inode, struct file *file,
+			       unsigned int cmd, unsigned long arg)
+{
+	struct btaudio *bta = file->private_data;
+	int ret,val=0,i=0;
+
+	if (cmd == SOUND_MIXER_INFO) {
+		mixer_info info;
+                strncpy(info.id, "bt878", sizeof(info.id));
+                strncpy(info.name, "Brooktree Bt878 audio", sizeof(info.name));
+                info.modify_counter = bta->mixcount;
+                if (copy_to_user((void *)arg, &info, sizeof(info)))
+                        return -EFAULT;
+		return 0;
+	}
+	if (cmd == SOUND_OLD_MIXER_INFO) {
+		_old_mixer_info info;
+                strncpy(info.id, "bt878", sizeof(info.id));
+                strncpy(info.name, "Brooktree Bt878 audio", sizeof(info.name));
+                if (copy_to_user((void *)arg, &info, sizeof(info)))
+                        return -EFAULT;
+		return 0;
+	}
+	if (cmd == OSS_GETVERSION)
+		return put_user(SOUND_VERSION, (int *)arg);
+
+	/* read */
+	if (_SIOC_DIR(cmd) & _SIOC_WRITE)
+		if (get_user(val, (int *)arg))
+			return -EFAULT;
+
+	switch (cmd) {
+	case MIXER_READ(SOUND_MIXER_CAPS):
+		ret = SOUND_CAP_EXCL_INPUT;
+		break;
+	case MIXER_READ(SOUND_MIXER_STEREODEVS):
+		ret = 0;
+		break;
+	case MIXER_READ(SOUND_MIXER_RECMASK):
+	case MIXER_READ(SOUND_MIXER_DEVMASK):
+		ret = SOUND_MASK_LINE1|SOUND_MASK_LINE2|SOUND_MASK_LINE3;
+		break;
+
+	case MIXER_WRITE(SOUND_MIXER_RECSRC):
+		if (val & SOUND_MASK_LINE1 && bta->source != 0)
+			bta->source = 0;
+		else if (val & SOUND_MASK_LINE2 && bta->source != 1)
+			bta->source = 1;
+		else if (val & SOUND_MASK_LINE3 && bta->source != 2)
+			bta->source = 2;
+		btaor((bta->gain[bta->source] << 28) |
+		      (bta->source            << 24),
+		      0x0cffffff, REG_GPIO_DMA_CTL);
+	case MIXER_READ(SOUND_MIXER_RECSRC):
+		switch (bta->source) {
+		case 0:  ret = SOUND_MASK_LINE1; break;
+		case 1:  ret = SOUND_MASK_LINE2; break;
+		case 2:  ret = SOUND_MASK_LINE3; break;
+		default: ret = 0;
+		}
+		break;
+
+	case MIXER_WRITE(SOUND_MIXER_LINE1):
+	case MIXER_WRITE(SOUND_MIXER_LINE2):
+	case MIXER_WRITE(SOUND_MIXER_LINE3):
+		if (MIXER_WRITE(SOUND_MIXER_LINE1) == cmd)
+			i = 0;
+		if (MIXER_WRITE(SOUND_MIXER_LINE2) == cmd)
+			i = 1;
+		if (MIXER_WRITE(SOUND_MIXER_LINE3) == cmd)
+			i = 2;
+		bta->gain[i] = (val & 0xff) * 15 / 100;
+		if (bta->gain[i] > 15) bta->gain[i] = 15;
+		if (bta->gain[i] <  0) bta->gain[i] =  0;
+		if (i == bta->source)
+			btaor((bta->gain[bta->source]<<28),
+			      0x0fffffff, REG_GPIO_DMA_CTL);
+		ret  = bta->gain[i] * 100 / 15;
+		ret |= ret << 8;
+		break;
+
+	case MIXER_READ(SOUND_MIXER_LINE1):
+	case MIXER_READ(SOUND_MIXER_LINE2):
+	case MIXER_READ(SOUND_MIXER_LINE3):
+		if (MIXER_READ(SOUND_MIXER_LINE1) == cmd)
+			i = 0;
+		if (MIXER_READ(SOUND_MIXER_LINE2) == cmd)
+			i = 1;
+		if (MIXER_READ(SOUND_MIXER_LINE3) == cmd)
+			i = 2;
+		ret  = bta->gain[i] * 100 / 15;
+		ret |= ret << 8;
+		break;
+
+	default:
+		return -EINVAL;
+	}
+	if (put_user(ret, (int *)arg))
+		return -EFAULT;
+	return 0;
+}
+
+static struct file_operations btaudio_mixer_fops = {
+	owner:   THIS_MODULE,
+	llseek:  btaudio_llseek,
+	open:    btaudio_mixer_open,
+	release: btaudio_mixer_release,
+	ioctl:   btaudio_mixer_ioctl,
+};
+
+/* -------------------------------------------------------------- */
+
+static int btaudio_dsp_open(struct inode *inode, struct file *file)
+{
+	int minor = MINOR(inode->i_rdev);
+	struct btaudio *bta;
+
+	for (bta = btaudios; bta != NULL; bta = bta->next)
+		if (bta->dsp_dev == minor)
+			break;
+	if (NULL == bta)
+		return -ENODEV;
+
+	down(&bta->lock);
+	if (bta->users)
+		goto busy;
+	bta->users++;
+	file->private_data = bta;
+
+	bta->dma_block = 0;
+	bta->read_offset = 0;
+	bta->read_count = 0;
+	bta->sampleshift = 0;
+
+	up(&bta->lock);
+	return 0;
+
+ busy:
+	up(&bta->lock);
+	return -EBUSY;
+}
+
+static int btaudio_dsp_release(struct inode *inode, struct file *file)
+{
+	struct btaudio *bta = file->private_data;
+
+	down(&bta->lock);
+	if (bta->recording)
+		stop_recording(bta);
+	bta->users--;
+	up(&bta->lock);
+	return 0;
+}
+
+static ssize_t btaudio_dsp_read(struct file *file, char *buffer,
+				size_t swcount, loff_t *ppos)
+{
+	struct btaudio *bta = file->private_data;
+	int hwcount = swcount << bta->sampleshift;
+	int nsrc, ndst, err, ret = 0;
+	DECLARE_WAITQUEUE(wait, current);
+
+	add_wait_queue(&bta->readq, &wait);
+	down(&bta->lock);
+	while (swcount > 0) {
+		if (0 == bta->read_count) {
+			if (!bta->recording) {
+				if (0 != (err = start_recording(bta))) {
+					if (0 == ret)
+						ret = err;
+					break;
+				}
+			}
+			if (file->f_flags & O_NONBLOCK) {
+				if (0 == ret)
+					ret = -EAGAIN;
+				break;
+			}
+			up(&bta->lock);
+			current->state = TASK_INTERRUPTIBLE;
+			schedule();
+			down(&bta->lock);
+			if(signal_pending(current)) {
+				if (0 == ret)
+					ret = -EINTR;
+				break;
+			}
+		}
+		nsrc = (bta->read_count < hwcount) ? bta->read_count : hwcount;
+		if (nsrc > bta->buf_size - bta->read_offset)
+			nsrc = bta->buf_size - bta->read_offset;
+		ndst = nsrc >> bta->sampleshift;
+
+		if ((analog  && 0 == bta->sampleshift) ||
+		    (!analog && 2 == bta->channels)) {
+			/* just copy */
+			if (copy_to_user(buffer + ret, bta->buf_cpu + bta->read_offset, nsrc)) {
+				if (0 == ret)
+					ret = -EFAULT;
+				break;
+			}
+
+		} else if (!analog) {
+			/* stereo => mono (digital audio) */
+			__u16 *src = (__u16*)(bta->buf_cpu + bta->read_offset);
+			__u16 *dst = (__u16*)(buffer + ret);
+			__u16 avg;
+			int n = ndst>>1;
+			if (0 != verify_area(VERIFY_WRITE,dst,ndst)) {
+				if (0 == ret)
+					ret = -EFAULT;
+				break;
+			}
+			for (; n; n--, dst++) {
+				avg  = *(src++) >> 1;
+				avg += *(src++) >> 1;
+				__put_user(avg,(__u16*)(dst));
+			}
+
+		} else if (8 == bta->bits) {
+			/* copy + byte downsampling (audio A/D) */
+			__u8 *src = bta->buf_cpu + bta->read_offset;
+			__u8 *dst = buffer + ret;
+			int n = ndst;
+			if (0 != verify_area(VERIFY_WRITE,dst,ndst)) {
+				if (0 == ret)
+					ret = -EFAULT;
+				break;
+			}
+			for (; n; n--, src += (1 << bta->sampleshift), dst++)
+				__put_user(*src,(__u8*)(dst));
+
+		} else {
+			/* copy + word downsampling (audio A/D) */
+			__u16 *src = (__u16*)(bta->buf_cpu + bta->read_offset);
+			__u16 *dst = (__u16*)(buffer + ret);
+			int n = ndst>>1;
+			if (0 != verify_area(VERIFY_WRITE,dst,ndst)) {
+				if (0 == ret)
+					ret = -EFAULT;
+				break;
+			}
+			for (; n; n--, src += (1 << bta->sampleshift), dst++)
+				__put_user(*src,(__u16*)(dst));
+		}
+
+		ret     += ndst;
+		swcount -= ndst;
+		hwcount -= nsrc;
+		bta->read_count  -= nsrc;
+		bta->read_offset += nsrc;
+		if (bta->read_offset == bta->buf_size)
+			bta->read_offset = 0;
+	}
+	up(&bta->lock);
+	remove_wait_queue(&bta->readq, &wait);
+	current->state = TASK_RUNNING;
+	return ret;
+}
+
+static ssize_t btaudio_dsp_write(struct file *file, const char *buffer,
+				 size_t count, loff_t *ppos)
+{
+	return -EINVAL;
+}
+
+static int btaudio_dsp_ioctl(struct inode *inode, struct file *file,
+			     unsigned int cmd, unsigned long arg)
+{
+	struct btaudio *bta = file->private_data;
+	int s, i, ret, val = 0;
+	
+        switch (cmd) {
+        case OSS_GETVERSION:
+                return put_user(SOUND_VERSION, (int *)arg);
+        case SNDCTL_DSP_GETCAPS:
+		return 0;
+
+        case SNDCTL_DSP_SPEED:
+		if (get_user(val, (int*)arg))
+			return -EFAULT;
+		if (analog) {
+			for (s = 0; s < 16; s++)
+				if (val << s >= HWBASE_AD*4/15)
+					break;
+			for (i = 15; i >= 5; i--)
+				if (val << s <= HWBASE_AD*4/i)
+					break;
+			bta->sampleshift = s;
+			bta->decimation  = i;
+			if (debug)
+				printk("btaudio: rate: req=%d  dec=%d shift=%d hwrate=%d swrate=%d\n",
+				       val,i,s,(HWBASE_AD*4/i),(HWBASE_AD*4/i)>>s);
+		} else {
+			bta->sampleshift = (bta->channels == 2) ? 0 : 1;
+			bta->decimation  = 0;
+		}
+		if (bta->recording) {
+			down(&bta->lock);
+			stop_recording(bta);
+			start_recording(bta);
+			up(&bta->lock);
+		}
+		/* fall through */
+        case SOUND_PCM_READ_RATE:
+		if (analog) {
+			return put_user(HWBASE_AD*4/bta->decimation>>bta->sampleshift, (int*)arg);
+		} else {
+			return put_user(HWBASE_DA, (int*)arg);
+		}
+
+        case SNDCTL_DSP_STEREO:
+		if (!analog) {
+			if (get_user(val, (int*)arg))
+				return -EFAULT;
+			bta->channels    = (val > 0) ? 2 : 1;
+			bta->sampleshift = (bta->channels == 2) ? 0 : 1;
+			printk("btaudio: stereo=%d channels=%d\n",
+			       val,bta->channels);
+		} else {
+			if (val == 1)
+				return -EFAULT;
+			else {
+				bta->channels = 1;
+				printk("btaudio: stereo=0 channels=1\n");
+			}
+		}
+		return put_user((bta->channels)-1, (int *)arg);
+
+        case SNDCTL_DSP_CHANNELS:
+		if (!analog) {
+			if (get_user(val, (int*)arg))
+				return -EFAULT;
+			bta->channels    = (val > 1) ? 2 : 1;
+			bta->sampleshift = (bta->channels == 2) ? 0 : 1;
+			printk("btaudio: val=%d channels=%d\n",
+			       val,bta->channels);
+		}
+		/* fall through */
+        case SOUND_PCM_READ_CHANNELS:
+		return put_user(bta->channels, (int *)arg);
+		
+        case SNDCTL_DSP_GETFMTS: /* Returns a mask */
+		if (analog)
+			return put_user(AFMT_S16_LE|AFMT_S8, (int*)arg);
+		else
+			return put_user(AFMT_S16_LE, (int*)arg);
+
+        case SNDCTL_DSP_SETFMT: /* Selects ONE fmt*/
+		if (get_user(val, (int*)arg))
+			return -EFAULT;
+                if (val != AFMT_QUERY) {
+			if (analog)
+				bta->bits = (val == AFMT_S8) ? 8 : 16;
+			else
+				bta->bits = 16;
+			if (bta->recording) {
+				down(&bta->lock);
+				stop_recording(bta);
+				start_recording(bta);
+				up(&bta->lock);
+			}
+		}
+		if (debug)
+			printk("btaudio: fmt: bits=%d\n",bta->bits);
+                return put_user((bta->bits==16) ? AFMT_S16_LE : AFMT_S8,
+				(int*)arg);
+		break;
+        case SOUND_PCM_READ_BITS:
+		return put_user(bta->bits, (int*)arg);
+
+        case SNDCTL_DSP_NONBLOCK:
+                file->f_flags |= O_NONBLOCK;
+                return 0;
+
+        case SNDCTL_DSP_RESET:
+		if (bta->recording) {
+			down(&bta->lock);
+			stop_recording(bta);
+			up(&bta->lock);
+		}
+		return 0;
+        case SNDCTL_DSP_GETBLKSIZE:
+		if (!bta->recording) {
+			if (0 != (ret = alloc_buffer(bta)))
+				return ret;
+			if (0 != (ret = make_risc(bta)))
+				return ret;
+		}
+		return put_user(bta->block_bytes>>bta->sampleshift,(int*)arg);
+
+        case SNDCTL_DSP_SYNC:
+		/* NOP */
+		return 0;
+#if 0 /* TODO */
+        case SNDCTL_DSP_GETTRIGGER:
+        case SNDCTL_DSP_SETTRIGGER:
+        case SNDCTL_DSP_SETFRAGMENT:
+#endif
+	default:
+		return -EINVAL;
+	}
+}
+
+static unsigned int btaudio_dsp_poll(struct file *file, struct poll_table_struct *wait)
+{
+	struct btaudio *bta = file->private_data;
+	unsigned int mask = 0;
+
+	poll_wait(file, &bta->readq, wait);
+
+	if (0 == bta->read_count)
+		mask |= (POLLIN | POLLRDNORM);
+
+	return mask;
+}
+
+static struct file_operations btaudio_dsp_fops = {
+	owner:   THIS_MODULE,
+	llseek:  btaudio_llseek,
+	open:    btaudio_dsp_open,
+	release: btaudio_dsp_release,
+	read:    btaudio_dsp_read,
+	write:   btaudio_dsp_write,
+	ioctl:   btaudio_dsp_ioctl,
+	poll:    btaudio_dsp_poll,
+};
+
+/* -------------------------------------------------------------- */
+
+static char *irq_name[] = { "", "", "", "OFLOW", "", "", "", "", "", "", "",
+			    "RISCI", "FBUS", "FTRGT", "FDSR", "PPERR",
+			    "RIPERR", "PABORT", "OCERR", "SCERR" };
+
+static void btaudio_irq(int irq, void *dev_id, struct pt_regs * regs)
+{
+	int count = 0;
+	u32 stat,astat;
+	struct btaudio *bta = dev_id;
+
+	for (;;) {
+		count++;
+		stat  = btread(REG_INT_STAT);
+		astat = stat & btread(REG_INT_MASK);
+		if (!astat)
+			return;
+		btwrite(astat,REG_INT_STAT);
+
+		if (irq_debug) {
+			int i;
+			printk("btaudio: irq loop=%d risc=%x, bits:",
+			       count, stat>>28);
+			for (i = 0; i < (sizeof(irq_name)/sizeof(char*)); i++) {
+				if (stat & (1 << i))
+					printk(" %s",irq_name[i]);
+				if (astat & (1 << i))
+					printk("*");
+			}
+			printk("\n");
+		}
+		if (stat & IRQ_RISCI) {
+			int blocks;
+			blocks = (stat >> 28) - bta->dma_block;
+			if (blocks < 0)
+				blocks += bta->block_count;
+			bta->dma_block = stat >> 28;
+			if (bta->read_count + 2*bta->block_bytes > bta->buf_size) {
+				stop_recording(bta);
+				printk("btaudio: buffer overrun\n");
+			}
+			if (blocks > 0) {
+				bta->read_count += blocks * bta->block_bytes;
+				wake_up_interruptible(&bta->readq);
+			}
+		}
+		if (count > 10) {
+			printk("btaudio: Oops - irq mask cleared\n");
+			btwrite(0, REG_INT_MASK);
+		}
+	}
+	return;
+}
+
+/* -------------------------------------------------------------- */
+
+static int __devinit btaudio_probe(struct pci_dev *pci_dev,
+				   const struct pci_device_id *pci_id)
+{
+	struct btaudio *bta;
+	unsigned char revision,latency;
+	int rc = -EBUSY;
+
+	if (pci_enable_device(pci_dev))
+		return -EIO;
+	if (!request_mem_region(pci_resource_start(pci_dev,0),
+				pci_resource_len(pci_dev,0),
+				"btaudio")) {
+		return -EBUSY;
+	}
+
+	bta = kmalloc(sizeof(*bta),GFP_ATOMIC);
+	memset(bta,0,sizeof(*bta));
+
+	bta->pci  = pci_dev;
+	bta->irq  = pci_dev->irq;
+	bta->mem  = pci_resource_start(pci_dev,0);
+	bta->mmio = ioremap(pci_resource_start(pci_dev,0),
+			    pci_resource_len(pci_dev,0));
+
+	bta->source     = 1;
+	bta->bits       = 8;
+	bta->channels   = 1;
+	if (analog) {
+		bta->decimation  = 15;
+	} else {
+		bta->decimation  = 0;
+		bta->sampleshift = 1;
+	}
+
+	init_MUTEX(&bta->lock);
+        init_waitqueue_head(&bta->readq);
+
+        pci_read_config_byte(pci_dev, PCI_CLASS_REVISION, &revision);
+        pci_read_config_byte(pci_dev, PCI_LATENCY_TIMER, &latency);
+        printk("btaudio: Bt%x (rev %d) at %02x:%02x.%x, ",
+	       pci_dev->device,revision,pci_dev->bus->number,
+	       PCI_SLOT(pci_dev->devfn),PCI_FUNC(pci_dev->devfn));
+        printk("irq: %d, latency: %d, memory: 0x%lx\n",
+	       bta->irq, latency, bta->mem);
+
+	/* init hw */
+        btwrite(0, REG_GPIO_DMA_CTL);
+        btwrite(0, REG_INT_MASK);
+        btwrite(~0x0UL, REG_INT_STAT);
+	pci_set_master(pci_dev);
+
+	if ((rc = request_irq(bta->irq, btaudio_irq, SA_SHIRQ|SA_INTERRUPT,
+			       "btaudio",(void *)bta)) < 0) {
+		printk("btaudio: can't request irq (rc=%d)\n",rc);
+		goto fail1;
+	}
+
+	/* register devices */
+	rc = bta->dsp_dev = register_sound_dsp(&btaudio_dsp_fops,dsp);
+	if (rc < 0) {
+		printk("btaudio: can't register dsp (rc=%d)\n",rc);
+		goto fail2;
+	}
+	if (analog) {
+		rc = bta->mixer_dev = register_sound_mixer(&btaudio_mixer_fops,mixer);
+		if (rc < 0) {
+			printk("btaudio: can't register mixer (rc=%d)\n",rc);
+			goto fail3;
+		}
+	}
+	if (debug)
+		printk("btaudio: dsp: minor=%d, mixer: minor=%d\n",
+		       bta->dsp_dev,bta->mixer_dev);
+
+	/* hook into linked list */
+	bta->next = btaudios;
+	btaudios = bta;
+
+	pci_set_drvdata(pci_dev,bta);
+        return 0;
+
+ fail3:
+	unregister_sound_dsp(bta->dsp_dev);
+ fail2:
+        free_irq(bta->irq,bta);	
+ fail1:
+	release_mem_region(pci_resource_start(pci_dev,0),
+			   pci_resource_len(pci_dev,0));
+	kfree(bta);
+	return rc;
+}
+
+static void __devexit btaudio_remove(struct pci_dev *pci_dev)
+{
+	struct btaudio *bta = pci_get_drvdata(pci_dev);
+	struct btaudio *walk;
+
+	/* turn off all DMA / IRQs */
+        btand(~15, REG_GPIO_DMA_CTL);
+        btwrite(0, REG_INT_MASK);
+        btwrite(~0x0UL, REG_INT_STAT);
+
+	/* unregister devices */
+	unregister_sound_dsp(bta->dsp_dev);
+	if (analog)
+		unregister_sound_mixer(bta->mixer_dev);
+
+	/* free resources */
+	free_buffer(bta);
+        free_irq(bta->irq,bta);
+	release_mem_region(pci_resource_start(pci_dev,0),
+			   pci_resource_len(pci_dev,0));
+
+	/* remove from linked list */
+	if (bta == btaudios) {
+		btaudios = NULL;
+	} else {
+		for (walk = btaudios; walk->next != bta; walk = walk->next)
+			; /* if (NULL == walk->next) BUG(); */
+		walk->next = bta->next;
+	}
+
+	pci_set_drvdata(pci_dev, NULL);
+	kfree(bta);
+	return;
+}
+
+/* -------------------------------------------------------------- */
+
+static struct pci_device_id btaudio_pci_tbl[] __devinitdata = {
+        { PCI_VENDOR_ID_BROOKTREE, 0x0878,
+          PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+        { PCI_VENDOR_ID_BROOKTREE, 0x0879,
+          PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+        {0,}
+};
+
+static struct pci_driver btaudio_pci_driver = {
+        name:     "btaudio",
+        id_table: btaudio_pci_tbl,
+        probe:    btaudio_probe,
+        remove:   btaudio_remove,
+};
+
+int btaudio_init_module(void)
+{
+	printk("btaudio: driver version 0.5 loaded [%s mode]\n",
+	       analog ? "audio A/D" : "digital audio");
+	return pci_module_init(&btaudio_pci_driver);
+}
+
+void btaudio_cleanup_module(void)
+{
+	pci_unregister_driver(&btaudio_pci_driver);
+	return;
+}
+
+module_init(btaudio_init_module);
+module_exit(btaudio_cleanup_module);
+
+MODULE_PARM(dsp,"i");
+MODULE_PARM(mixer,"i");
+MODULE_PARM(debug,"i");
+MODULE_PARM(irq_debug,"i");
+MODULE_PARM(analog,"i");
+
+MODULE_DEVICE_TABLE(pci, btaudio_pci_tbl);
+MODULE_DESCRIPTION("btaudio - bt878 audio dma driver");
+MODULE_AUTHOR("Gerd Knorr");
+
+/*
+ * Local variables:
+ * c-basic-offset: 8
+ * End:
+ */
diff -u --recursive --new-file v2.4.8/linux/drivers/sound/cmpci.c linux/drivers/sound/cmpci.c
--- v2.4.8/linux/drivers/sound/cmpci.c	Tue Jul  3 17:08:21 2001
+++ linux/drivers/sound/cmpci.c	Sun Aug 12 10:51:41 2001
@@ -84,7 +84,6 @@
 
 /*****************************************************************************/
       
-#define EXPORT_SYMTAB
 #include <linux/version.h>
 #include <linux/config.h>
 #include <linux/module.h>
@@ -93,7 +92,7 @@
 #include <linux/sched.h>
 #include <linux/delay.h>
 #include <linux/sound.h>
-#include <linux/malloc.h>
+#include <linux/slab.h>
 #include <linux/soundcard.h>
 #include <linux/pci.h>
 #include <linux/wrapper.h>
@@ -346,7 +345,7 @@
 
 /* --------------------------------------------------------------------- */
 
-extern __inline__ unsigned ld2(unsigned int x)
+static inline unsigned ld2(unsigned int x)
 {
 	unsigned r = 0;
 	
@@ -380,7 +379,7 @@
 #undef hweight32
 #endif
 
-extern __inline__ unsigned int hweight32(unsigned int w)
+static inline unsigned int hweight32(unsigned int w)
 {
         unsigned int res = (w & 0x55555555) + ((w >> 1) & 0x55555555);
         res = (res & 0x33333333) + ((res >> 2) & 0x33333333);
@@ -448,7 +447,7 @@
 	    set_countadc(s, count);
 }
 
-extern __inline__ unsigned get_dmadac(struct cm_state *s)
+static inline unsigned get_dmadac(struct cm_state *s)
 {
 	unsigned int curr_addr;
 
@@ -464,7 +463,7 @@
 	return curr_addr;
 }
 
-extern __inline__ unsigned get_dmaadc(struct cm_state *s)
+static inline unsigned get_dmaadc(struct cm_state *s)
 {
 	unsigned int curr_addr;
 
@@ -771,7 +770,7 @@
 		pause_adc(s);
 }
 
-extern inline void disable_adc(struct cm_state *s)
+static inline void disable_adc(struct cm_state *s)
 {
 	/* disable channel */
 	s->enable &= ~CM_ENABLE_CH0;
@@ -779,7 +778,7 @@
 	reset_adc(s);
 }
 
-extern inline void disable_dac(struct cm_state *s)
+static inline void disable_dac(struct cm_state *s)
 {
 	/* disable channel */
 	s->enable &= ~CM_ENABLE_CH1;
@@ -789,7 +788,7 @@
 		disable_adc(s);
 }
 
-extern inline void enable_adc(struct cm_state *s)
+static inline void enable_adc(struct cm_state *s)
 {
 	if (!(s->enable & CM_ENABLE_CH0)) {
 		/* enable channel */
@@ -799,7 +798,7 @@
 	maskb(s->iobase + CODEC_CMI_FUNCTRL0, ~4, 0);
 }
 
-extern inline void enable_dac_unlocked(struct cm_state *s)
+static inline void enable_dac_unlocked(struct cm_state *s)
 {
 	if (!(s->enable & CM_ENABLE_CH1)) {
 		/* enable channel */
@@ -812,7 +811,7 @@
 		enable_adc(s);
 }
 
-extern inline void enable_dac(struct cm_state *s)
+static inline void enable_dac(struct cm_state *s)
 {
 	unsigned long flags;
 
@@ -821,7 +820,7 @@
 	spin_unlock_irqrestore(&s->lock, flags);
 }
 
-extern inline void stop_adc_unlocked(struct cm_state *s)
+static inline void stop_adc_unlocked(struct cm_state *s)
 {
 	if (s->enable & CM_ENABLE_CH0) {
 		/* disable interrupt */
@@ -830,7 +829,7 @@
 	}
 }
 
-extern inline void stop_adc(struct cm_state *s)
+static inline void stop_adc(struct cm_state *s)
 {
 	unsigned long flags;
 
@@ -840,7 +839,7 @@
 
 }
 
-extern inline void stop_dac_unlocked(struct cm_state *s)
+static inline void stop_dac_unlocked(struct cm_state *s)
 {
 	if (s->enable & CM_ENABLE_CH1) {
 		/* disable interrupt */
@@ -851,7 +850,7 @@
 		stop_adc_unlocked(s);
 }
 
-extern inline void stop_dac(struct cm_state *s)
+static inline void stop_dac(struct cm_state *s)
 {
 	unsigned long flags;
 
@@ -1095,7 +1094,7 @@
 	return 0;
 }
 
-extern __inline__ void clear_advance(struct cm_state *s)
+static inline void clear_advance(struct cm_state *s)
 {
 	unsigned char c = (s->fmt & (CM_CFMT_16BIT << CM_CFMT_DACSHIFT)) ? 0 : 0x80;
 	unsigned char *buf = s->dma_dac.rawbuf;
@@ -1568,13 +1567,6 @@
 
 /* --------------------------------------------------------------------- */
 
-static loff_t cm_llseek(struct file *file, loff_t offset, int origin)
-{
-	return -ESPIPE;
-}
-
-/* --------------------------------------------------------------------- */
-
 static int cm_open_mixdev(struct inode *inode, struct file *file)
 {
 	int minor = MINOR(inode->i_rdev);
@@ -1604,7 +1596,7 @@
 
 static /*const*/ struct file_operations cm_mixer_fops = {
 	owner:		THIS_MODULE,
-	llseek:		cm_llseek,
+	llseek:		no_llseek,
 	ioctl:		cm_ioctl_mixdev,
 	open:		cm_open_mixdev,
 	release:	cm_release_mixdev,
@@ -2422,7 +2414,7 @@
 
 static /*const*/ struct file_operations cm_audio_fops = {
 	owner:		THIS_MODULE,
-	llseek:		cm_llseek,
+	llseek:		no_llseek,
 	read:		cm_read,
 	write:		cm_write,
 	poll:		cm_poll,
@@ -2701,7 +2693,7 @@
 
 static /*const*/ struct file_operations cm_midi_fops = {
 	owner:		THIS_MODULE,
-	llseek:		cm_llseek,
+	llseek:		no_llseek,
 	read:		cm_midi_read,
 	write:		cm_midi_write,
 	poll:		cm_midi_poll,
@@ -2868,7 +2860,7 @@
 
 static /*const*/ struct file_operations cm_dmfm_fops = {
 	owner:		THIS_MODULE,
-	llseek:		cm_llseek,
+	llseek:		no_llseek,
 	ioctl:		cm_dmfm_ioctl,
 	open:		cm_dmfm_open,
 	release:	cm_dmfm_release,
diff -u --recursive --new-file v2.4.8/linux/drivers/sound/cs4281/cs4281m.c linux/drivers/sound/cs4281/cs4281m.c
--- v2.4.8/linux/drivers/sound/cs4281/cs4281m.c	Tue Jul  3 17:08:21 2001
+++ linux/drivers/sound/cs4281/cs4281m.c	Sun Aug 12 10:51:41 2001
@@ -65,7 +65,7 @@
 #include <linux/sched.h>
 #include <linux/delay.h>
 #include <linux/sound.h>
-#include <linux/malloc.h>
+#include <linux/slab.h>
 #include <linux/soundcard.h>
 #include <linux/pci.h>
 #include <linux/bitops.h>
@@ -2567,14 +2567,6 @@
 
 // --------------------------------------------------------------------- 
 
-static loff_t cs4281_llseek(struct file *file, loff_t offset, int origin)
-{
-	return -ESPIPE;
-}
-
-
-// --------------------------------------------------------------------- 
-
 static int cs4281_open_mixdev(struct inode *inode, struct file *file)
 {
 	int minor = MINOR(inode->i_rdev);
@@ -2630,7 +2622,7 @@
 //   Mixer file operations struct.
 // ******************************************************************************************
 static /*const */ struct file_operations cs4281_mixer_fops = {
-	llseek:cs4281_llseek,
+	llseek:no_llseek,
 	ioctl:cs4281_ioctl_mixdev,
 	open:cs4281_open_mixdev,
 	release:cs4281_release_mixdev,
@@ -3747,7 +3739,7 @@
 //   Wave (audio) file operations struct.
 // ******************************************************************************************
 static /*const */ struct file_operations cs4281_audio_fops = {
-	llseek:cs4281_llseek,
+	llseek:no_llseek,
 	read:cs4281_read,
 	write:cs4281_write,
 	poll:cs4281_poll,
@@ -4096,7 +4088,7 @@
 //   Midi file operations struct.
 // ******************************************************************************************
 static /*const */ struct file_operations cs4281_midi_fops = {
-	llseek:cs4281_llseek,
+	llseek:no_llseek,
 	read:cs4281_midi_read,
 	write:cs4281_midi_write,
 	poll:cs4281_midi_poll,
diff -u --recursive --new-file v2.4.8/linux/drivers/sound/cs46xx.c linux/drivers/sound/cs46xx.c
--- v2.4.8/linux/drivers/sound/cs46xx.c	Tue Jul  3 17:08:21 2001
+++ linux/drivers/sound/cs46xx.c	Sun Aug 12 10:51:41 2001
@@ -51,6 +51,11 @@
  *	20010420-tw	cleanup powerdown/up code.
  *	20010521-tw	eliminate pops, and fixes for powerdown.
  *	20010525-tw	added fixes for thinkpads with powerdown logic.
+ *	20010723-sh     patch from Horms (Simon Horman) -
+ *	                SOUND_PCM_READ_BITS returns bits as set in driver
+ *	                rather than a logical or of the possible values.
+ *	                Various ioctls handle the case where the device
+ *	                is open for reading or writing but not both better.
  *
  *	Status:
  *	Playback/Capture supported from 8k-48k.
@@ -378,7 +383,6 @@
 static int cs_release_mixdev(struct inode *inode, struct file *file);
 static int cs_ioctl_mixdev(struct inode *inode, struct file *file, unsigned int cmd,
 				unsigned long arg);
-static loff_t cs_llseek(struct file *file, loff_t offset, int origin);
 static int cs_hardware_init(struct cs_card *card);
 static int cs46xx_powerup(struct cs_card *card, unsigned int type);
 static int cs461x_powerdown(struct cs_card *card, unsigned int type, int suspendflag);
@@ -997,7 +1001,7 @@
 /* get current playback/recording dma buffer pointer (byte offset from LBA),
    called with spinlock held! */
    
-extern __inline__ unsigned cs_get_dma_addr(struct cs_state *state)
+static inline unsigned cs_get_dma_addr(struct cs_state *state)
 {
 	struct dmabuf *dmabuf = &state->dmabuf;
 	u32 offset;
@@ -1044,7 +1048,7 @@
 }
 	
 /* Stop recording (lock held) */
-extern __inline__ void __stop_adc(struct cs_state *state)
+static inline void __stop_adc(struct cs_state *state)
 {
 	struct dmabuf *dmabuf = &state->dmabuf;
 	struct cs_card *card = state->card;
@@ -1931,7 +1935,7 @@
  */
 static /*const*/ struct file_operations cs_midi_fops = {
 	CS_OWNER	CS_THIS_MODULE
-	llseek:		cs_llseek,
+	llseek:		no_llseek,
 	read:		cs_midi_read,
 	write:		cs_midi_write,
 	poll:		cs_midi_poll,
@@ -1939,11 +1943,6 @@
 	release:	cs_midi_release,
 };
 
-static loff_t cs_llseek(struct file *file, loff_t offset, int origin)
-{
-	return -ESPIPE;
-}
-
 /*
  *
  * CopySamples copies 16-bit stereo signed samples from the source to the
@@ -2846,6 +2845,8 @@
 		return 0;
 
 	case SNDCTL_DSP_GETOSPACE:
+		if (!(file->f_mode & FMODE_WRITE))
+			return -EINVAL;
 		state = (struct cs_state *)card->states[1];
 		if(state)
 		{
@@ -2869,6 +2870,8 @@
 		return -ENODEV;
 
 	case SNDCTL_DSP_GETISPACE:
+		if (!(file->f_mode & FMODE_READ))
+			return -EINVAL;
 		state = (struct cs_state *)card->states[0];
 		if(state)
 		{
@@ -2950,6 +2953,8 @@
 		return 0;
 
 	case SNDCTL_DSP_GETIPTR:
+		if (!(file->f_mode & FMODE_READ))
+			return -EINVAL;
 		state = (struct cs_state *)card->states[0];
 		if(state)
 		{
@@ -2965,6 +2970,8 @@
 		return -ENODEV;
 
 	case SNDCTL_DSP_GETOPTR:
+		if (!(file->f_mode & FMODE_WRITE))
+			return -EINVAL;
 		state = (struct cs_state *)card->states[1];
 		if(state)
 		{
@@ -3015,7 +3022,10 @@
 		return put_user(val, (int *)arg);
 
 	case SOUND_PCM_READ_RATE:
-		state = (struct cs_state *)card->states[0];
+		if(file->f_mode & FMODE_READ)
+			state = (struct cs_state *)card->states[0];
+		else 
+			state = (struct cs_state *)card->states[1];
 		if(state)
 		{
 			dmabuf = &state->dmabuf;
@@ -3025,7 +3035,10 @@
 		
 
 	case SOUND_PCM_READ_CHANNELS:
-		state = (struct cs_state *)card->states[0];
+		if(file->f_mode & FMODE_READ)
+			state = (struct cs_state *)card->states[0];
+		else 
+			state = (struct cs_state *)card->states[1];
 		if(state)
 		{
 			dmabuf = &state->dmabuf;
@@ -3035,11 +3048,16 @@
 		return put_user(0, (int *)arg);
 
 	case SOUND_PCM_READ_BITS:
-		state = (struct cs_state *)card->states[0];
+		if(file->f_mode & FMODE_READ)
+			state = (struct cs_state *)card->states[0];
+		else 
+			state = (struct cs_state *)card->states[1];
 		if(state)
 		{
 			dmabuf = &state->dmabuf;
-			return put_user(AFMT_S16_LE | AFMT_U8, (int *)arg);
+			return put_user((dmabuf->fmt & CS_FMT_16BIT) ? 
+			  	AFMT_S16_LE : AFMT_U8, (int *)arg);
+
 		}
 		return put_user(0, (int *)arg);
 
@@ -3799,7 +3817,7 @@
 
 static /*const*/ struct file_operations cs461x_fops = {
 	CS_OWNER	CS_THIS_MODULE
-	llseek:		cs_llseek,
+	llseek:		no_llseek,
 	read:		cs_read,
 	write:		cs_write,
 	poll:		cs_poll,
@@ -4206,7 +4224,7 @@
 
 static /*const*/ struct file_operations cs_mixer_fops = {
 	CS_OWNER	CS_THIS_MODULE
-	llseek:		cs_llseek,
+	llseek:		no_llseek,
 	ioctl:		cs_ioctl_mixdev,
 	open:		cs_open_mixdev,
 	release:	cs_release_mixdev,
diff -u --recursive --new-file v2.4.8/linux/drivers/sound/dmasound/dmasound_core.c linux/drivers/sound/dmasound/dmasound_core.c
--- v2.4.8/linux/drivers/sound/dmasound/dmasound_core.c	Fri Feb  9 11:30:23 2001
+++ linux/drivers/sound/dmasound/dmasound_core.c	Sun Aug 12 10:51:41 2001
@@ -385,16 +385,6 @@
 
 
     /*
-     *  Common stuff
-     */
-
-static long long sound_lseek(struct file *file, long long offset, int orig)
-{
-	return -ESPIPE;
-}
-
-
-    /*
      *  Mid level stuff
      */
 
@@ -536,7 +526,7 @@
 static struct file_operations mixer_fops =
 {
 	owner:		THIS_MODULE,
-	llseek:		sound_lseek,
+	llseek:		no_llseek,
 	ioctl:		mixer_ioctl,
 	open:		mixer_open,
 	release:	mixer_release,
@@ -1036,7 +1026,7 @@
 static struct file_operations sq_fops =
 {
 	owner:		THIS_MODULE,
-	llseek:		sound_lseek,
+	llseek:		no_llseek,
 	write:		sq_write,
 	ioctl:		sq_ioctl,
 	open:		sq_open,
@@ -1174,7 +1164,7 @@
 
 static struct file_operations state_fops = {
 	owner:		THIS_MODULE,
-	llseek:		sound_lseek,
+	llseek:		no_llseek,
 	read:		state_read,
 	open:		state_open,
 	release:	state_release,
diff -u --recursive --new-file v2.4.8/linux/drivers/sound/emu10k1/Makefile linux/drivers/sound/emu10k1/Makefile
--- v2.4.8/linux/drivers/sound/emu10k1/Makefile	Sun Aug 12 13:28:00 2001
+++ linux/drivers/sound/emu10k1/Makefile	Sun Aug 12 10:25:31 2001
@@ -5,13 +5,16 @@
 O_TARGET := emu10k1.o
 
 obj-y :=     audio.o cardmi.o cardmo.o cardwi.o cardwo.o ecard.o \
-             efxmgr.o emuadxmg.o hwaccess.o irqmgr.o joystick.o \
-             main.o midi.o mixer.o passthrough.o recmgr.o timer.o \
-             voicemgr.o
+             efxmgr.o emuadxmg.o hwaccess.o irqmgr.o main.o midi.o \
+             mixer.o passthrough.o recmgr.o timer.o voicemgr.o
 obj-m := $(O_TARGET)
 
 ifdef DEBUG
     EXTRA_CFLAGS += -DEMU10K1_DEBUG
+endif
+
+ifdef CONFIG_MIDI_EMU10K1
+    EXTRA_CFLAGS += -DEMU10K1_SEQUENCER
 endif
 
 include $(TOPDIR)/Rules.make
diff -u --recursive --new-file v2.4.8/linux/drivers/sound/emu10k1/audio.c linux/drivers/sound/emu10k1/audio.c
--- v2.4.8/linux/drivers/sound/emu10k1/audio.c	Sun Aug 12 13:28:00 2001
+++ linux/drivers/sound/emu10k1/audio.c	Sun Aug 12 17:53:18 2001
@@ -55,11 +55,6 @@
 static void calculate_ifrag(struct wiinst *);
 
 /* Audio file operations */
-static loff_t emu10k1_audio_llseek(struct file *file, loff_t offset, int origin)
-{
-	return -ESPIPE;
-}
-
 static ssize_t emu10k1_audio_read(struct file *file, char *buffer, size_t count, loff_t * ppos)
 {
 	struct emu10k1_wavedevice *wave_dev = (struct emu10k1_wavedevice *) file->private_data;
@@ -1223,7 +1218,6 @@
 		tasklet_init(&woinst->timer.tasklet, emu10k1_waveout_bh, (unsigned long) wave_dev);
 		wave_dev->woinst = woinst;
 		emu10k1_waveout_setformat(wave_dev, &woinst->format);
-
 	}
 
 	file->private_data = (void *) wave_dev;
@@ -1266,7 +1260,7 @@
 
 		spin_unlock_irqrestore(&woinst->lock, flags);
 		/* wait for the tasklet (bottom-half) to finish */
-		tasklet_unlock_wait(&woinst->timer.tasklet);
+		tasklet_kill(&woinst->timer.tasklet);
 		kfree(wave_dev->woinst);
 	}
 
@@ -1280,7 +1274,7 @@
 		}
 
 		spin_unlock_irqrestore(&wiinst->lock, flags);
-		tasklet_unlock_wait(&wiinst->timer.tasklet);
+		tasklet_kill(&wiinst->timer.tasklet);
 		kfree(wave_dev->wiinst);
 	}
 
@@ -1496,6 +1490,9 @@
 	u32 bytestocopy;
 	unsigned long flags;
 
+	if (!wiinst)
+		return;
+
 	spin_lock_irqsave(&wiinst->lock, flags);
 
 	if (!(wiinst->state & WAVE_STATE_STARTED)) {
@@ -1523,6 +1520,9 @@
 	u32 bytestocopy;
 	unsigned long flags;
 
+	if (!woinst)
+		return;
+
 	spin_lock_irqsave(&woinst->lock, flags);
 
 	if (!(woinst->state & WAVE_STATE_STARTED)) {
@@ -1549,7 +1549,7 @@
 
 struct file_operations emu10k1_audio_fops = {
 	owner:		THIS_MODULE,
-	llseek:		emu10k1_audio_llseek,
+	llseek:		no_llseek,
 	read:		emu10k1_audio_read,
 	write:		emu10k1_audio_write,
 	poll:		emu10k1_audio_poll,
diff -u --recursive --new-file v2.4.8/linux/drivers/sound/emu10k1/joystick.c linux/drivers/sound/emu10k1/joystick.c
--- v2.4.8/linux/drivers/sound/emu10k1/joystick.c	Sun Aug 12 13:28:00 2001
+++ linux/drivers/sound/emu10k1/joystick.c	Wed Dec 31 16:00:00 1969
@@ -1,204 +0,0 @@
-/*
- **********************************************************************
- *     joystick.c - Creative EMU10K1 Joystick port driver
- *     Copyright 2000 Rui Sousa.
- *
- **********************************************************************
- *
- *     Date                 Author          Summary of changes
- *     ----                 ------          ------------------
- *     April  1, 2000       Rui Sousa       initial version 
- *     April 28, 2000       Rui Sousa       fixed a kernel oops,
- *					    make use of kcompat24 for
- *					    2.2 kernels compatibility.
- *     May    1, 2000       Rui Sousa       improved kernel compatibility
- *                                          layer.
- *
- **********************************************************************
- *
- *     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.
- *
- **********************************************************************/
-
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/version.h>
-#include <linux/pci.h>
-#include <linux/slab.h>
-#include <linux/ioport.h>
-#include <linux/list.h>
-
-#define DRIVER_VERSION "0.3.1"
-
-#ifndef PCI_VENDOR_ID_CREATIVE
-#define PCI_VENDOR_ID_CREATIVE 0x1102
-#endif
-
-#ifndef PCI_DEVICE_ID_CREATIVE_EMU10K1_JOYSTICK
-#define PCI_DEVICE_ID_CREATIVE_EMU10K1_JOYSTICK 0x7002
-#endif
-
-/* PCI function 1 registers, address = <val> + PCIBASE1 */
-
-#define JOYSTICK1               0x00            /* Analog joystick port register                */
-#define JOYSTICK2               0x01            /* Analog joystick port register                */
-#define JOYSTICK3               0x02            /* Analog joystick port register                */
-#define JOYSTICK4               0x03            /* Analog joystick port register                */
-#define JOYSTICK5               0x04            /* Analog joystick port register                */
-#define JOYSTICK6               0x05            /* Analog joystick port register                */
-#define JOYSTICK7               0x06            /* Analog joystick port register                */
-#define JOYSTICK8               0x07            /* Analog joystick port register                */
-
-/* When writing, any write causes JOYSTICK_COMPARATOR output enable to be pulsed on write.      */
-/* When reading, use these bitfields: */
-#define JOYSTICK_BUTTONS        0x0f            /* Joystick button data                         */
-#define JOYSTICK_COMPARATOR     0xf0            /* Joystick comparator data                     */
-
-#define NR_DEV 5
-
-static int io[NR_DEV] = { 0, };
-
-enum {
-	EMU10K1_JOYSTICK = 0
-};
-
-static char *card_names[] = {
-	"EMU10K1 Joystick Port"
-};
-
-static struct pci_device_id emu10k1_joy_pci_tbl[] __devinitdata = {
-	{PCI_VENDOR_ID_CREATIVE, PCI_DEVICE_ID_CREATIVE_EMU10K1_JOYSTICK,
-	 PCI_ANY_ID, PCI_ANY_ID, 0, 0, EMU10K1_JOYSTICK},
-	{0,}
-};
-
-MODULE_DEVICE_TABLE(pci, emu10k1_joy_pci_tbl);
-
-struct emu10k1_joy_card {
-	struct list_head list;
-
-	struct pci_dev *pci_dev;
-	unsigned long iobase;
-	unsigned long length;
-	u8 addr_changed;
-};
-
-static LIST_HEAD(emu10k1_joy_devs);
-static unsigned int devindex = 0;
-
-/* Driver initialization routine */
-static int __devinit emu10k1_joy_probe(struct pci_dev *pci_dev, const struct pci_device_id *pci_id)
-{
-	struct emu10k1_joy_card *card;
-	u16 model;
-	u8 chiprev;
-
-	if ((card = kmalloc(sizeof(struct emu10k1_joy_card), GFP_KERNEL)) == NULL) {
-		printk(KERN_ERR "emu10k1-joy: out of memory\n");
-		return -ENOMEM;
-	}
-	memset(card, 0, sizeof(struct emu10k1_joy_card));
-
-	if (pci_enable_device(pci_dev)) {
-		printk(KERN_ERR "emu10k1-joy: couldn't enable device\n");
-		kfree(card);
-		return -ENODEV;
-	}
-
-	card->iobase = pci_resource_start(pci_dev, 0); 
-	card->length = pci_resource_len(pci_dev, 0);
-
-	if (request_region(card->iobase, card->length, card_names[pci_id->driver_data])
-	    == NULL) {
-		printk(KERN_ERR "emu10k1-joy: IO space in use\n");
-		kfree(card);
-		return -ENODEV;
-	}
-
-	pci_set_drvdata(pci_dev, card);
-
-	card->pci_dev = pci_dev;
-	card->addr_changed = 0;
-
-	pci_read_config_byte(pci_dev, PCI_REVISION_ID, &chiprev);
-	pci_read_config_word(pci_dev, PCI_SUBSYSTEM_ID, &model);
-
-	printk(KERN_INFO "emu10k1-joy: %s rev %d model 0x%x found, IO at 0x%04lx-0x%04lx\n",
-		card_names[pci_id->driver_data], chiprev, model, card->iobase,
-		card->iobase + card->length - 1);
-
-	if (io[devindex]) {
-		if ((io[devindex] & ~0x18) != 0x200) {
-			printk(KERN_ERR "emu10k1-joy: invalid io value\n");
-			release_region(card->iobase, card->length);
-			kfree(card);
-			return -ENODEV;
-		}
-
-		card->addr_changed = 1;
-		pci_write_config_dword(pci_dev, PCI_BASE_ADDRESS_0, io[devindex]);
-		printk(KERN_INFO "emu10k1-joy: IO ports mirrored at 0x%03x\n", io[devindex]);
-	}
-
-	list_add(&card->list, &emu10k1_joy_devs);
-	devindex++;
-
-	return 0;
-}
-
-static void __devexit emu10k1_joy_remove(struct pci_dev *pci_dev)
-{
-	struct emu10k1_joy_card *card = pci_get_drvdata(pci_dev);
-
-	if(card->addr_changed)
-		pci_write_config_dword(pci_dev, PCI_BASE_ADDRESS_0, card->iobase);
-
-	release_region(card->iobase, card->length);
-
-	list_del(&card->list);
-	kfree(card);
-	pci_set_drvdata(pci_dev, NULL);
-}
-
-MODULE_PARM(io, "1-" __MODULE_STRING(NR_DEV) "i");
-MODULE_PARM_DESC(io, "sets joystick port address");
-MODULE_AUTHOR("Rui Sousa (Email to: emu10k1-devel@opensource.creative.com)");
-MODULE_DESCRIPTION("Creative EMU10K1 PCI Joystick Port v" DRIVER_VERSION
-		   "\nCopyright (C) 2000 Rui Sousa");
-
-static struct pci_driver emu10k1_joy_pci_driver = {
-	name:"emu10k1 joystick",
-	id_table:emu10k1_joy_pci_tbl,
-	probe:emu10k1_joy_probe,
-	remove:emu10k1_joy_remove,
-};
-
-static int __init emu10k1_joy_init_module(void)
-{
-	printk(KERN_INFO "Creative EMU10K1 PCI Joystick Port, version " DRIVER_VERSION ", " __TIME__
-	       " " __DATE__ "\n");
-
-	return pci_module_init(&emu10k1_joy_pci_driver);
-}
-
-static void __exit emu10k1_joy_cleanup_module(void)
-{
-	pci_unregister_driver(&emu10k1_joy_pci_driver);
-	return;
-}
-
-module_init(emu10k1_joy_init_module);
-module_exit(emu10k1_joy_cleanup_module);
diff -u --recursive --new-file v2.4.8/linux/drivers/sound/emu10k1/main.c linux/drivers/sound/emu10k1/main.c
--- v2.4.8/linux/drivers/sound/emu10k1/main.c	Sun Aug 12 13:28:00 2001
+++ linux/drivers/sound/emu10k1/main.c	Sun Aug 12 17:53:57 2001
@@ -92,8 +92,8 @@
 #define MIDI_SYNTH_NAME "EMU10K1 MIDI"
 #define MIDI_SYNTH_CAPS SYNTH_CAP_INPUT
  
-#include "sound_config.h"
-#include "midi_synth.h"
+#include "../sound_config.h"
+#include "../midi_synth.h"
 
 /* this should be in dev_table.h */
 #define SNDCARD_EMU10K1 46
@@ -370,10 +370,10 @@
 
 static void __devinit emu10k1_midi_cleanup(struct emu10k1_card *card)
 {
-    tasklet_unlock_wait(&card->mpuout->tasklet);
+    tasklet_kill(&card->mpuout->tasklet);
     kfree(card->mpuout);
 
-    tasklet_unlock_wait(&card->mpuin->tasklet);
+    tasklet_kill(&card->mpuin->tasklet);
     kfree(card->mpuin);
 
 #ifdef EMU10K1_SEQUENCER
@@ -1039,6 +1039,7 @@
 
 static struct midi_operations emu10k1_midi_operations =
 {
+    THIS_MODULE,
     {"EMU10K1 MIDI", 0, 0, SNDCARD_EMU10K1},
 	&std_midi_synth,
 	{0},
diff -u --recursive --new-file v2.4.8/linux/drivers/sound/emu10k1/midi.c linux/drivers/sound/emu10k1/midi.c
--- v2.4.8/linux/drivers/sound/emu10k1/midi.c	Sun Aug 12 13:28:00 2001
+++ linux/drivers/sound/emu10k1/midi.c	Sun Aug 12 10:25:31 2001
@@ -43,7 +43,7 @@
 #include "midi.h"
 
 #ifdef EMU10K1_SEQUENCER
-#include "sound_config.h"
+#include "../sound_config.h"
 #endif
 
 static spinlock_t midi_spinlock __attribute((unused)) = SPIN_LOCK_UNLOCKED;
diff -u --recursive --new-file v2.4.8/linux/drivers/sound/emu10k1/passthrough.h linux/drivers/sound/emu10k1/passthrough.h
--- v2.4.8/linux/drivers/sound/emu10k1/passthrough.h	Sun Aug 12 13:28:00 2001
+++ linux/drivers/sound/emu10k1/passthrough.h	Sun Aug 12 10:25:31 2001
@@ -32,6 +32,7 @@
 #ifndef _PASSTHROUGH_H
 #define _PASSTHROUGH_H
 
+#include "hwaccess.h"
 #include "audio.h"
 
 /* number of 16-bit stereo samples in XTRAM buffer */
diff -u --recursive --new-file v2.4.8/linux/drivers/sound/es1370.c linux/drivers/sound/es1370.c
--- v2.4.8/linux/drivers/sound/es1370.c	Tue May 22 10:23:16 2001
+++ linux/drivers/sound/es1370.c	Sun Aug 12 10:51:42 2001
@@ -401,6 +401,7 @@
 	} midi;
 
 	struct gameport gameport;
+	struct semaphore sem;
 };
 
 /* --------------------------------------------------------------------- */
@@ -416,7 +417,7 @@
 
 /* --------------------------------------------------------------------- */
 
-extern inline unsigned ld2(unsigned int x)
+static inline unsigned ld2(unsigned int x)
 {
 	unsigned r = 0;
 	
@@ -460,7 +461,7 @@
 
 /* --------------------------------------------------------------------- */
 
-extern inline void stop_adc(struct es1370_state *s)
+static inline void stop_adc(struct es1370_state *s)
 {
 	unsigned long flags;
 
@@ -470,7 +471,7 @@
 	spin_unlock_irqrestore(&s->lock, flags);
 }	
 
-extern inline void stop_dac1(struct es1370_state *s)
+static inline void stop_dac1(struct es1370_state *s)
 {
 	unsigned long flags;
 
@@ -480,7 +481,7 @@
 	spin_unlock_irqrestore(&s->lock, flags);
 }	
 
-extern inline void stop_dac2(struct es1370_state *s)
+static inline void stop_dac2(struct es1370_state *s)
 {
 	unsigned long flags;
 
@@ -564,7 +565,7 @@
 #define DMABUF_DEFAULTORDER (17-PAGE_SHIFT)
 #define DMABUF_MINORDER 1
 
-extern inline void dealloc_dmabuf(struct es1370_state *s, struct dmabuf *db)
+static inline void dealloc_dmabuf(struct es1370_state *s, struct dmabuf *db)
 {
 	struct page *page, *pend;
 
@@ -632,28 +633,28 @@
 	return 0;
 }
 
-extern inline int prog_dmabuf_adc(struct es1370_state *s)
+static inline int prog_dmabuf_adc(struct es1370_state *s)
 {
 	stop_adc(s);
 	return prog_dmabuf(s, &s->dma_adc, DAC2_DIVTOSR((s->ctrl & CTRL_PCLKDIV) >> CTRL_SH_PCLKDIV),
 			   (s->sctrl >> SCTRL_SH_R1FMT) & ES1370_FMT_MASK, ES1370_REG_ADC_FRAMEADR);
 }
 
-extern inline int prog_dmabuf_dac2(struct es1370_state *s)
+static inline int prog_dmabuf_dac2(struct es1370_state *s)
 {
 	stop_dac2(s);
 	return prog_dmabuf(s, &s->dma_dac2, DAC2_DIVTOSR((s->ctrl & CTRL_PCLKDIV) >> CTRL_SH_PCLKDIV),
 			   (s->sctrl >> SCTRL_SH_P2FMT) & ES1370_FMT_MASK, ES1370_REG_DAC2_FRAMEADR);
 }
 
-extern inline int prog_dmabuf_dac1(struct es1370_state *s)
+static inline int prog_dmabuf_dac1(struct es1370_state *s)
 {
 	stop_dac1(s);
 	return prog_dmabuf(s, &s->dma_dac1, dac1_samplerate[(s->ctrl & CTRL_WTSRSEL) >> CTRL_SH_WTSRSEL],
 			   (s->sctrl >> SCTRL_SH_P1FMT) & ES1370_FMT_MASK, ES1370_REG_DAC1_FRAMEADR);
 }
 
-extern inline unsigned get_hwptr(struct es1370_state *s, struct dmabuf *db, unsigned reg)
+static inline unsigned get_hwptr(struct es1370_state *s, struct dmabuf *db, unsigned reg)
 {
 	unsigned hwptr, diff;
 
@@ -664,7 +665,7 @@
 	return diff;
 }
 
-extern inline void clear_advance(void *buf, unsigned bsize, unsigned bptr, unsigned len, unsigned char c)
+static inline void clear_advance(void *buf, unsigned bsize, unsigned bptr, unsigned len, unsigned char c)
 {
 	if (bptr + len > bsize) {
 		unsigned x = bsize - bptr;
@@ -1042,13 +1043,6 @@
 
 /* --------------------------------------------------------------------- */
 
-static loff_t es1370_llseek(struct file *file, loff_t offset, int origin)
-{
-	return -ESPIPE;
-}
-
-/* --------------------------------------------------------------------- */
-
 static int es1370_open_mixdev(struct inode *inode, struct file *file)
 {
 	int minor = MINOR(inode->i_rdev);
@@ -1082,7 +1076,7 @@
 
 static /*const*/ struct file_operations es1370_mixer_fops = {
 	owner:		THIS_MODULE,
-	llseek:		es1370_llseek,
+	llseek:		no_llseek,
 	ioctl:		es1370_ioctl_mixdev,
 	open:		es1370_open_mixdev,
 	release:	es1370_release_mixdev,
@@ -1168,7 +1162,7 @@
 {
 	struct es1370_state *s = (struct es1370_state *)file->private_data;
 	DECLARE_WAITQUEUE(wait, current);
-	ssize_t ret;
+	ssize_t ret = 0;
 	unsigned long flags;
 	unsigned swptr;
 	int cnt;
@@ -1178,12 +1172,13 @@
 		return -ESPIPE;
 	if (s->dma_adc.mapped)
 		return -ENXIO;
-	if (!s->dma_adc.ready && (ret = prog_dmabuf_adc(s)))
-		return ret;
 	if (!access_ok(VERIFY_WRITE, buffer, count))
 		return -EFAULT;
-	ret = 0;
-        add_wait_queue(&s->dma_adc.wait, &wait);
+	down(&s->sem);	
+	if (!s->dma_adc.ready && (ret = prog_dmabuf_adc(s)))
+		goto out;
+        
+	add_wait_queue(&s->dma_adc.wait, &wait);
 	while (count > 0) {
 		spin_lock_irqsave(&s->lock, flags);
 		swptr = s->dma_adc.swptr;
@@ -1201,20 +1196,27 @@
 			if (file->f_flags & O_NONBLOCK) {
 				if (!ret)
 					ret = -EAGAIN;
-				break;
+				goto out;
 			}
+			up(&s->sem);
 			schedule();
 			if (signal_pending(current)) {
 				if (!ret)
 					ret = -ERESTARTSYS;
-				break;
+				goto out;
+			}
+			down(&s->sem);
+			if (s->dma_adc.mapped)
+			{
+				ret = -ENXIO;
+				goto out;
 			}
 			continue;
 		}
 		if (copy_to_user(buffer, s->dma_adc.rawbuf + swptr, cnt)) {
 			if (!ret)
 				ret = -EFAULT;
-			break;
+			goto out;
 		}
 		swptr = (swptr + cnt) % s->dma_adc.dmasize;
 		spin_lock_irqsave(&s->lock, flags);
@@ -1227,6 +1229,8 @@
 		if (s->dma_adc.enabled)
 			start_adc(s);
 	}
+out:
+	up(&s->sem);
         remove_wait_queue(&s->dma_adc.wait, &wait);
 	set_current_state(TASK_RUNNING);
 	return ret;
@@ -1246,10 +1250,11 @@
 		return -ESPIPE;
 	if (s->dma_dac2.mapped)
 		return -ENXIO;
-	if (!s->dma_dac2.ready && (ret = prog_dmabuf_dac2(s)))
-		return ret;
 	if (!access_ok(VERIFY_READ, buffer, count))
 		return -EFAULT;
+	down(&s->sem);	
+	if (!s->dma_dac2.ready && (ret = prog_dmabuf_dac2(s)))
+		goto out;
 	ret = 0;
         add_wait_queue(&s->dma_dac2.wait, &wait);
 	while (count > 0) {
@@ -1273,20 +1278,27 @@
 			if (file->f_flags & O_NONBLOCK) {
 				if (!ret)
 					ret = -EAGAIN;
-				break;
+				goto out;
 			}
+			up(&s->sem);
 			schedule();
 			if (signal_pending(current)) {
 				if (!ret)
 					ret = -ERESTARTSYS;
-				break;
+				goto out;	
+			}
+			down(&s->sem);
+			if (s->dma_dac2.mapped)
+			{
+			ret = -ENXIO;
+			goto out;
 			}
 			continue;
 		}
 		if (copy_from_user(s->dma_dac2.rawbuf + swptr, buffer, cnt)) {
 			if (!ret)
 				ret = -EFAULT;
-			break;
+			goto out;
 		}
 		swptr = (swptr + cnt) % s->dma_dac2.dmasize;
 		spin_lock_irqsave(&s->lock, flags);
@@ -1300,6 +1312,8 @@
 		if (s->dma_dac2.enabled)
 			start_dac2(s);
 	}
+out:
+	up(&s->sem);
         remove_wait_queue(&s->dma_dac2.wait, &wait);
 	set_current_state(TASK_RUNNING);
 	return ret;
@@ -1346,43 +1360,44 @@
 {
 	struct es1370_state *s = (struct es1370_state *)file->private_data;
 	struct dmabuf *db;
-	int ret;
+	int ret = 0;
 	unsigned long size;
 
 	VALIDATE_STATE(s);
 	lock_kernel();
+	down(&s->sem);
 	if (vma->vm_flags & VM_WRITE) {
 		if ((ret = prog_dmabuf_dac2(s)) != 0) {
-			unlock_kernel();
-			return ret;
+			goto out;
 		}
 		db = &s->dma_dac2;
 	} else if (vma->vm_flags & VM_READ) {
 		if ((ret = prog_dmabuf_adc(s)) != 0) {
-			unlock_kernel();
-			return ret;
+			goto out;
 		}
 		db = &s->dma_adc;
 	} else  {
-		unlock_kernel();
-		return -EINVAL;
+		ret = -EINVAL;
+		goto out;
 	}
 	if (vma->vm_pgoff != 0) {
-		unlock_kernel();
-		return -EINVAL;
+		ret = -EINVAL;
+		goto out;
 	}
 	size = vma->vm_end - vma->vm_start;
 	if (size > (PAGE_SIZE << db->buforder)) {
-		unlock_kernel();
-		return -EINVAL;
+		ret = -EINVAL;
+		goto out;
 	}
 	if (remap_page_range(vma->vm_start, virt_to_phys(db->rawbuf), size, vma->vm_page_prot)) {
-		unlock_kernel();
-		return -EAGAIN;
+		ret = -EAGAIN;
+		goto out;
 	}
 	db->mapped = 1;
+out:
+	up(&s->sem);
 	unlock_kernel();
-	return 0;
+	return ret;
 }
 
 static int es1370_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
@@ -1788,6 +1803,7 @@
 	spin_unlock_irqrestore(&s->lock, flags);
 	s->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE);
 	up(&s->open_sem);
+	init_MUTEX(&s->sem);
 	return 0;
 }
 
@@ -1818,7 +1834,7 @@
 
 static /*const*/ struct file_operations es1370_audio_fops = {
 	owner:		THIS_MODULE,
-	llseek:		es1370_llseek,
+	llseek:		no_llseek,
 	read:		es1370_read,
 	write:		es1370_write,
 	poll:		es1370_poll,
@@ -2240,7 +2256,7 @@
 
 static /*const*/ struct file_operations es1370_dac_fops = {
 	owner:		THIS_MODULE,
-	llseek:		es1370_llseek,
+	llseek:		no_llseek,
 	write:		es1370_write_dac,
 	poll:		es1370_poll_dac,
 	ioctl:		es1370_ioctl_dac,
@@ -2513,7 +2529,7 @@
 
 static /*const*/ struct file_operations es1370_midi_fops = {
 	owner:		THIS_MODULE,
-	llseek:		es1370_llseek,
+	llseek:		no_llseek,
 	read:		es1370_midi_read,
 	write:		es1370_midi_write,
 	poll:		es1370_midi_poll,
@@ -2612,14 +2628,12 @@
 	 * mic bias setting (by Kim.Berts@fisub.mail.abb.com) */
 	s->ctrl = CTRL_CDC_EN | (DAC2_SRTODIV(8000) << CTRL_SH_PCLKDIV) | (1 << CTRL_SH_WTSRSEL);
 	s->gameport.io = 0;
-	s->gameport.size = 0;
 	if (joystick[devindex]) {
 		if (!request_region(0x200, JOY_EXTENT, "es1370"))
 			printk(KERN_ERR "es1370: joystick io port 0x200 in use\n");
 		else {
 			s->ctrl |= CTRL_JYSTK_EN;
 			s->gameport.io = 0x200;
-			s->gameport.size = JOY_EXTENT;
 		}
 	}
 	if (lineout[devindex])
@@ -2693,7 +2707,7 @@
 	printk(KERN_ERR "es1370: cannot register misc device\n");
 	free_irq(s->irq, s);
 	if (s->gameport.io)
-		release_region(s->gameport.io, s->gameport.size);
+		release_region(s->gameport.io, JOY_EXTENT);
  err_irq:
 	release_region(s->io, ES1370_EXTENT);
  err_region:
@@ -2714,7 +2728,7 @@
 	free_irq(s->irq, s);
 	if (s->gameport.io) {
 		gameport_unregister_port(&s->gameport);
-		release_region(s->gameport.io, s->gameport.size);
+		release_region(s->gameport.io, JOY_EXTENT);
 	}
 	release_region(s->io, ES1370_EXTENT);
 	unregister_sound_dsp(s->dev_audio);
diff -u --recursive --new-file v2.4.8/linux/drivers/sound/es1371.c linux/drivers/sound/es1371.c
--- v2.4.8/linux/drivers/sound/es1371.c	Tue May 22 10:23:16 2001
+++ linux/drivers/sound/es1371.c	Sun Aug 12 10:51:42 2001
@@ -109,6 +109,7 @@
  *                       suggested by Stephan Müller <smueller@chronox.de>
  *    31.01.2001   0.30  Register/Unregister gameport
  *                       Fix SETTRIGGER non OSS API conformity
+ *    14.07.2001   0.31  Add list of laptops needing amplifier control
  */
 
 /*****************************************************************************/
@@ -474,6 +475,7 @@
 	} midi;
 
 	struct gameport gameport;
+	struct semaphore sem;
 };
 
 /* --------------------------------------------------------------------- */
@@ -482,7 +484,7 @@
 
 /* --------------------------------------------------------------------- */
 
-extern inline unsigned ld2(unsigned int x)
+static inline unsigned ld2(unsigned int x)
 {
 	unsigned r = 0;
 	
@@ -792,7 +794,7 @@
 
 /* --------------------------------------------------------------------- */
 
-extern inline void stop_adc(struct es1371_state *s)
+static inline void stop_adc(struct es1371_state *s)
 {
 	unsigned long flags;
 
@@ -802,7 +804,7 @@
 	spin_unlock_irqrestore(&s->lock, flags);
 }	
 
-extern inline void stop_dac1(struct es1371_state *s)
+static inline void stop_dac1(struct es1371_state *s)
 {
 	unsigned long flags;
 
@@ -812,7 +814,7 @@
 	spin_unlock_irqrestore(&s->lock, flags);
 }	
 
-extern inline void stop_dac2(struct es1371_state *s)
+static inline void stop_dac2(struct es1371_state *s)
 {
 	unsigned long flags;
 
@@ -897,7 +899,7 @@
 #define DMABUF_MINORDER 1
 
 
-extern inline void dealloc_dmabuf(struct es1371_state *s, struct dmabuf *db)
+static inline void dealloc_dmabuf(struct es1371_state *s, struct dmabuf *db)
 {
 	struct page *page, *pend;
 
@@ -965,28 +967,28 @@
 	return 0;
 }
 
-extern inline int prog_dmabuf_adc(struct es1371_state *s)
+static inline int prog_dmabuf_adc(struct es1371_state *s)
 {
 	stop_adc(s);
 	return prog_dmabuf(s, &s->dma_adc, s->adcrate, (s->sctrl >> SCTRL_SH_R1FMT) & ES1371_FMT_MASK, 
 			   ES1371_REG_ADC_FRAMEADR);
 }
 
-extern inline int prog_dmabuf_dac2(struct es1371_state *s)
+static inline int prog_dmabuf_dac2(struct es1371_state *s)
 {
 	stop_dac2(s);
 	return prog_dmabuf(s, &s->dma_dac2, s->dac2rate, (s->sctrl >> SCTRL_SH_P2FMT) & ES1371_FMT_MASK, 
 			   ES1371_REG_DAC2_FRAMEADR);
 }
 
-extern inline int prog_dmabuf_dac1(struct es1371_state *s)
+static inline int prog_dmabuf_dac1(struct es1371_state *s)
 {
 	stop_dac1(s);
 	return prog_dmabuf(s, &s->dma_dac1, s->dac1rate, (s->sctrl >> SCTRL_SH_P1FMT) & ES1371_FMT_MASK,
 			   ES1371_REG_DAC1_FRAMEADR);
 }
 
-extern inline unsigned get_hwptr(struct es1371_state *s, struct dmabuf *db, unsigned reg)
+static inline unsigned get_hwptr(struct es1371_state *s, struct dmabuf *db, unsigned reg)
 {
 	unsigned hwptr, diff;
 
@@ -997,7 +999,7 @@
 	return diff;
 }
 
-extern inline void clear_advance(void *buf, unsigned bsize, unsigned bptr, unsigned len, unsigned char c)
+static inline void clear_advance(void *buf, unsigned bsize, unsigned bptr, unsigned len, unsigned char c)
 {
 	if (bptr + len > bsize) {
 		unsigned x = bsize - bptr;
@@ -1148,13 +1150,6 @@
 
 /* --------------------------------------------------------------------- */
 
-static loff_t es1371_llseek(struct file *file, loff_t offset, int origin)
-{
-	return -ESPIPE;
-}
-
-/* --------------------------------------------------------------------- */
-
 /* Conversion table for S/PDIF PCM volume emulation through the SRC */
 /* dB-linear table of DAC vol values; -0dB to -46.5dB with mute */
 static const unsigned short DACVolTable[101] =
@@ -1268,7 +1263,7 @@
 
 static /*const*/ struct file_operations es1371_mixer_fops = {
 	owner:		THIS_MODULE,
-	llseek:		es1371_llseek,
+	llseek:		no_llseek,
 	ioctl:		es1371_ioctl_mixdev,
 	open:		es1371_open_mixdev,
 	release:	es1371_release_mixdev,
@@ -1352,7 +1347,7 @@
 {
 	struct es1371_state *s = (struct es1371_state *)file->private_data;
 	DECLARE_WAITQUEUE(wait, current);
-	ssize_t ret;
+	ssize_t ret = 0;
 	unsigned long flags;
 	unsigned swptr;
 	int cnt;
@@ -1362,11 +1357,12 @@
 		return -ESPIPE;
 	if (s->dma_adc.mapped)
 		return -ENXIO;
-	if (!s->dma_adc.ready && (ret = prog_dmabuf_adc(s)))
-		return ret;
 	if (!access_ok(VERIFY_WRITE, buffer, count))
 		return -EFAULT;
-	ret = 0;
+	down(&s->sem);
+	if (!s->dma_adc.ready && (ret = prog_dmabuf_adc(s)))
+		goto out2;
+	
 	add_wait_queue(&s->dma_adc.wait, &wait);
 	while (count > 0) {
 		spin_lock_irqsave(&s->lock, flags);
@@ -1385,20 +1381,27 @@
 			if (file->f_flags & O_NONBLOCK) {
 				if (!ret)
 					ret = -EAGAIN;
-				break;
+				goto out;
 			}
+			up(&s->sem);
 			schedule();
 			if (signal_pending(current)) {
 				if (!ret)
 					ret = -ERESTARTSYS;
-				break;
+				goto out2;
+			}
+			down(&s->sem);
+			if (s->dma_adc.mapped)
+			{
+				ret = -ENXIO;
+				goto out;
 			}
 			continue;
 		}
 		if (copy_to_user(buffer, s->dma_adc.rawbuf + swptr, cnt)) {
 			if (!ret)
 				ret = -EFAULT;
-			break;
+			goto out;
 		}
 		swptr = (swptr + cnt) % s->dma_adc.dmasize;
 		spin_lock_irqsave(&s->lock, flags);
@@ -1411,6 +1414,9 @@
 		if (s->dma_adc.enabled)
 			start_adc(s);
 	}
+out:
+	up(&s->sem);
+out2:
 	remove_wait_queue(&s->dma_adc.wait, &wait);
 	set_current_state(TASK_RUNNING);
 	return ret;
@@ -1430,10 +1436,11 @@
 		return -ESPIPE;
 	if (s->dma_dac2.mapped)
 		return -ENXIO;
-	if (!s->dma_dac2.ready && (ret = prog_dmabuf_dac2(s)))
-		return ret;
 	if (!access_ok(VERIFY_READ, buffer, count))
 		return -EFAULT;
+	down(&s->sem);	
+	if (!s->dma_dac2.ready && (ret = prog_dmabuf_dac2(s)))
+		goto out3;
 	ret = 0;
 	add_wait_queue(&s->dma_dac2.wait, &wait);
 	while (count > 0) {
@@ -1457,20 +1464,27 @@
 			if (file->f_flags & O_NONBLOCK) {
 				if (!ret)
 					ret = -EAGAIN;
-				break;
-			}
+				goto out;
+			}	
+			up(&s->sem);
 			schedule();
 			if (signal_pending(current)) {
 				if (!ret)
 					ret = -ERESTARTSYS;
-				break;
+				goto out2;
+			}
+			down(&s->sem);
+			if (s->dma_dac2.mapped)
+			{
+				ret = -ENXIO;
+				goto out;
 			}
 			continue;
 		}
 		if (copy_from_user(s->dma_dac2.rawbuf + swptr, buffer, cnt)) {
 			if (!ret)
 				ret = -EFAULT;
-			break;
+			goto out;
 		}
 		swptr = (swptr + cnt) % s->dma_dac2.dmasize;
 		spin_lock_irqsave(&s->lock, flags);
@@ -1484,7 +1498,11 @@
 		if (s->dma_dac2.enabled)
 			start_dac2(s);
 	}
+out:
+	up(&s->sem);
+out2:
 	remove_wait_queue(&s->dma_dac2.wait, &wait);
+out3:	
 	set_current_state(TASK_RUNNING);
 	return ret;
 }
@@ -1530,43 +1548,45 @@
 {
 	struct es1371_state *s = (struct es1371_state *)file->private_data;
 	struct dmabuf *db;
-	int ret;
+	int ret = 0;
 	unsigned long size;
 
 	VALIDATE_STATE(s);
 	lock_kernel();
+	down(&s->sem);
+	
 	if (vma->vm_flags & VM_WRITE) {
 		if ((ret = prog_dmabuf_dac2(s)) != 0) {
-			unlock_kernel();
-			return ret;
+			goto out;
 		}
 		db = &s->dma_dac2;
 	} else if (vma->vm_flags & VM_READ) {
 		if ((ret = prog_dmabuf_adc(s)) != 0) {
-			unlock_kernel();
-			return ret;
+			goto out;
 		}
 		db = &s->dma_adc;
 	} else {
-		unlock_kernel();
-		return -EINVAL;
+		ret = -EINVAL;
+		goto out;
 	}
 	if (vma->vm_pgoff != 0) {
-		unlock_kernel();
-		return -EINVAL;
+		ret = -EINVAL;
+		goto out;
 	}
 	size = vma->vm_end - vma->vm_start;
 	if (size > (PAGE_SIZE << db->buforder)) {
-		unlock_kernel();
-		return -EINVAL;
+		ret = -EINVAL;
+		goto out;
 	}
 	if (remap_page_range(vma->vm_start, virt_to_phys(db->rawbuf), size, vma->vm_page_prot)) {
-		unlock_kernel();
-		return -EAGAIN;
+		ret = -EAGAIN;
+		goto out;
 	}
 	db->mapped = 1;
+out:
+	up(&s->sem);
 	unlock_kernel();
-	return 0;
+	return ret;
 }
 
 static int es1371_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
@@ -1970,6 +1990,7 @@
 	spin_unlock_irqrestore(&s->lock, flags);
 	s->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE);
 	up(&s->open_sem);
+	init_MUTEX(&s->sem);
 	return 0;
 }
 
@@ -1999,7 +2020,7 @@
 
 static /*const*/ struct file_operations es1371_audio_fops = {
 	owner:		THIS_MODULE,
-	llseek:		es1371_llseek,
+	llseek:		no_llseek,
 	read:		es1371_read,
 	write:		es1371_write,
 	poll:		es1371_poll,
@@ -2411,7 +2432,7 @@
 
 static /*const*/ struct file_operations es1371_dac_fops = {
 	owner:		THIS_MODULE,
-	llseek:		es1371_llseek,
+	llseek:		no_llseek,
 	write:		es1371_write_dac,
 	poll:		es1371_poll_dac,
 	ioctl:		es1371_ioctl_dac,
@@ -2683,7 +2704,7 @@
 
 static /*const*/ struct file_operations es1371_midi_fops = {
 	owner:		THIS_MODULE,
-	llseek:		es1371_llseek,
+	llseek:		no_llseek,
 	read:		es1371_midi_read,
 	write:		es1371_midi_write,
 	poll:		es1371_midi_poll,
@@ -2739,6 +2760,7 @@
 static int nomix[NR_DEVICE] = { 0, };
 
 static unsigned int devindex = 0;
+static int amplifier = 0;
 
 MODULE_PARM(joystick, "1-" __MODULE_STRING(NR_DEVICE) "i");
 MODULE_PARM_DESC(joystick, "sets address and enables joystick interface (still need separate driver)");
@@ -2746,6 +2768,8 @@
 MODULE_PARM_DESC(spdif, "if 1 the output is in S/PDIF digital mode");
 MODULE_PARM(nomix, "1-" __MODULE_STRING(NR_DEVICE) "i");
 MODULE_PARM_DESC(nomix, "if 1 no analog audio is mixed to the digital output");
+MODULE_PARM(amplifier, "i");
+MODULE_PARM_DESC(amplifier, "Set to 1 if the machine needs the amp control enabling (many laptops)");
 
 MODULE_AUTHOR("Thomas M. Sailer, sailer@ife.ee.ethz.ch, hb9jnx@hb9w.che.eu");
 MODULE_DESCRIPTION("ES1371 AudioPCI97 Driver");
@@ -2771,11 +2795,25 @@
 	{ SOUND_MIXER_WRITE_IGAIN, 0x4040 }
 };
 
+static struct
+{
+	short svid, sdid;
+} amplifier_needed[] = 
+{
+	{ 0x107B, 0x2150 },		/* Gateway Solo 2150 */
+	{ 0x13BD, 0x100C },		/* Mebius PC-MJ100V */
+	{ 0x1102, 0x5938 },		/* Targa Xtender 300 */
+	{ 0x1102, 0x8938 },		/* IPC notebook */
+	{ PCI_ANY_ID, PCI_ANY_ID }
+};
+
+
 static int __devinit es1371_probe(struct pci_dev *pcidev, const struct pci_device_id *pciid)
 {
 	struct es1371_state *s;
 	mm_segment_t fs;
 	int i, val, res = -1;
+	int idx;
 	unsigned long tmo;
 	signed long tmo2;
 	unsigned int cssr;
@@ -2845,25 +2883,33 @@
 	
 	/* initialize codec registers */
 	s->ctrl = 0;
-	if (pcidev->subsystem_vendor == 0x107b && pcidev->subsystem_device == 0x2150) {
+
+	/* Check amplifier requirements */
+	
+	if(amplifier)
 		s->ctrl |= CTRL_GPIO_OUT0;
-		printk(KERN_INFO PFX "Running On Gateway 2000 Solo 2510 - Amp On \n");
-	}	
-	s->gameport.io = s->gameport.size = 0;
+	else for(idx = 0; amplifier_needed[idx].svid != PCI_ANY_ID; idx++)
+	{
+		if(pcidev->subsystem_vendor == amplifier_needed[idx].svid &&
+		   pcidev->subsystem_device == amplifier_needed[idx].sdid)
+		{
+                    	s->ctrl |= CTRL_GPIO_OUT0;   /* turn internal amplifier on */
+                    	printk(KERN_INFO PFX "Enabling internal amplifier.\n");
+		}
+	}
+	s->gameport.io = 0;
 	if ((joystick[devindex] & ~0x18) == 0x200) {
 		if (!request_region(joystick[devindex], JOY_EXTENT, "es1371"))
 			printk(KERN_ERR PFX "joystick address 0x%x already in use\n", joystick[devindex]);
 		else {
 			s->ctrl |= CTRL_JYSTK_EN | (((joystick[devindex] >> 3) & CTRL_JOY_MASK) << CTRL_JOY_SHIFT);
 			s->gameport.io = joystick[devindex];
-			s->gameport.size = JOY_EXTENT;
 		}
 	} else if (joystick[devindex] == 1) {
 		for (i = 0x218; i >= 0x200; i -= 0x08) {
 			if (request_region(i, JOY_EXTENT, "es1371")) {
 				s->ctrl |= CTRL_JYSTK_EN | (((i >> 3) & CTRL_JOY_MASK) << CTRL_JOY_SHIFT);
 				s->gameport.io = i;
-				s->gameport.size = JOY_EXTENT;
 				break;
 			}
 		}
@@ -2951,7 +2997,7 @@
 
  err_gp:
 	if (s->gameport.io)
-		release_region(s->gameport.io, s->gameport.size);
+		release_region(s->gameport.io, JOY_EXTENT);
  err_dev4:
 	unregister_sound_dsp(s->dev_dac);
  err_dev3:
@@ -2985,7 +3031,7 @@
 	free_irq(s->irq, s);
 	if (s->gameport.io) {
 		gameport_unregister_port(&s->gameport);
-		release_region(s->gameport.io, s->gameport.size);
+		release_region(s->gameport.io, JOY_EXTENT);
 	}
 	release_region(s->io, ES1371_EXTENT);
 	unregister_sound_dsp(s->dev_audio);
diff -u --recursive --new-file v2.4.8/linux/drivers/sound/esssolo1.c linux/drivers/sound/esssolo1.c
--- v2.4.8/linux/drivers/sound/esssolo1.c	Wed Jul 25 17:10:23 2001
+++ linux/drivers/sound/esssolo1.c	Sun Aug 12 10:51:42 2001
@@ -230,7 +230,7 @@
 
 /* --------------------------------------------------------------------- */
 
-extern inline void write_seq(struct solo1_state *s, unsigned char data)
+static inline void write_seq(struct solo1_state *s, unsigned char data)
 {
         int i;
 	unsigned long flags;
@@ -250,7 +250,7 @@
 	outb(data, s->sbbase+0xc);
 }
 
-extern inline int read_seq(struct solo1_state *s, unsigned char *data)
+static inline int read_seq(struct solo1_state *s, unsigned char *data)
 {
         int i;
 
@@ -313,7 +313,7 @@
 
 /* --------------------------------------------------------------------- */
 
-extern inline unsigned ld2(unsigned int x)
+static inline unsigned ld2(unsigned int x)
 {
 	unsigned r = 0;
 	
@@ -340,7 +340,7 @@
 
 /* --------------------------------------------------------------------- */
 
-extern inline void stop_dac(struct solo1_state *s)
+static inline void stop_dac(struct solo1_state *s)
 {
 	unsigned long flags;
 
@@ -364,7 +364,7 @@
 	spin_unlock_irqrestore(&s->lock, flags);
 }	
 
-extern inline void stop_adc(struct solo1_state *s)
+static inline void stop_adc(struct solo1_state *s)
 {
 	unsigned long flags;
 
@@ -414,7 +414,7 @@
 #define DMABUF_DEFAULTORDER (15-PAGE_SHIFT)
 #define DMABUF_MINORDER 1
 
-extern inline void dealloc_dmabuf(struct solo1_state *s, struct dmabuf *db)
+static inline void dealloc_dmabuf(struct solo1_state *s, struct dmabuf *db)
 {
 	struct page *page, *pend;
 
@@ -480,7 +480,7 @@
 	return 0;
 }
 
-extern inline int prog_dmabuf_adc(struct solo1_state *s)
+static inline int prog_dmabuf_adc(struct solo1_state *s)
 {
 	unsigned long va;
 	int c;
@@ -508,7 +508,7 @@
 	return 0;
 }
 
-extern inline int prog_dmabuf_dac(struct solo1_state *s)
+static inline int prog_dmabuf_dac(struct solo1_state *s)
 {
 	unsigned long va;
 	int c;
@@ -531,7 +531,7 @@
 	return 0;
 }
 
-extern inline void clear_advance(void *buf, unsigned bsize, unsigned bptr, unsigned len, unsigned char c)
+static inline void clear_advance(void *buf, unsigned bsize, unsigned bptr, unsigned len, unsigned char c)
 {
 	if (bptr + len > bsize) {
 		unsigned x = bsize - bptr;
@@ -911,13 +911,6 @@
 
 /* --------------------------------------------------------------------- */
 
-static loff_t solo1_llseek(struct file *file, loff_t offset, int origin)
-{
-        return -ESPIPE;
-}
-
-/* --------------------------------------------------------------------- */
-
 static int solo1_open_mixdev(struct inode *inode, struct file *file)
 {
 	int minor = MINOR(inode->i_rdev);
@@ -957,7 +950,7 @@
 
 static /*const*/ struct file_operations solo1_mixer_fops = {
 	owner:		THIS_MODULE,
-	llseek:		solo1_llseek,
+	llseek:		no_llseek,
 	ioctl:		solo1_ioctl_mixdev,
 	open:		solo1_open_mixdev,
 	release:	solo1_release_mixdev,
@@ -1652,7 +1645,7 @@
 
 static /*const*/ struct file_operations solo1_audio_fops = {
 	owner:		THIS_MODULE,
-	llseek:		solo1_llseek,
+	llseek:		no_llseek,
 	read:		solo1_read,
 	write:		solo1_write,
 	poll:		solo1_poll,
@@ -2003,7 +1996,7 @@
 
 static /*const*/ struct file_operations solo1_midi_fops = {
 	owner:		THIS_MODULE,
-	llseek:		solo1_llseek,
+	llseek:		no_llseek,
 	read:		solo1_midi_read,
 	write:		solo1_midi_write,
 	poll:		solo1_midi_poll,
@@ -2191,7 +2184,7 @@
 
 static /*const*/ struct file_operations solo1_dmfm_fops = {
 	owner:		THIS_MODULE,
-	llseek:		solo1_llseek,
+	llseek:		no_llseek,
 	ioctl:		solo1_dmfm_ioctl,
 	open:		solo1_dmfm_open,
 	release:	solo1_dmfm_release,
@@ -2265,8 +2258,8 @@
 	return 0;
 }
 
-static void
-solo1_suspend(struct pci_dev *pci_dev) {
+static int
+solo1_suspend(struct pci_dev *pci_dev, u32 state) {
 	struct solo1_state *s = (struct solo1_state*)pci_get_drvdata(pci_dev);
 	if (!s)
 		return;
@@ -2277,14 +2270,16 @@
 	outb(3, s->sbbase+6); 
 	/* turn off DDMA controller address space */
 	pci_write_config_word(s->dev, 0x60, 0); 
+	return 0;
 }
 
-static void
+static int
 solo1_resume(struct pci_dev *pci_dev) {
 	struct solo1_state *s = (struct solo1_state*)pci_get_drvdata(pci_dev);
 	if (!s)
-		return;
+		return 1;
 	setup_solo1(s);
+	return 0;
 }
 
 static int __devinit solo1_probe(struct pci_dev *pcidev, const struct pci_device_id *pciid)
diff -u --recursive --new-file v2.4.8/linux/drivers/sound/i810_audio.c linux/drivers/sound/i810_audio.c
--- v2.4.8/linux/drivers/sound/i810_audio.c	Tue Jul  3 17:08:21 2001
+++ linux/drivers/sound/i810_audio.c	Sun Aug 12 17:37:53 2001
@@ -109,6 +109,7 @@
 
 //#define DEBUG
 //#define DEBUG2
+//#define DEBUG_INTERRUPTS
 
 #define ADC_RUNNING	1
 #define DAC_RUNNING	2
@@ -190,7 +191,7 @@
 #define INT_MASK (INT_SEC|INT_PRI|INT_MC|INT_PO|INT_PI|INT_MO|INT_NI|INT_GPI)
 
 
-#define DRIVER_VERSION "0.02"
+#define DRIVER_VERSION "0.03"
 
 /* magic numbers to protect our data structures */
 #define I810_CARD_MAGIC		0x5072696E /* "Prin" */
@@ -281,10 +282,15 @@
 		wait_queue_head_t wait;	/* put process on wait queue when no more space in buffer */
 
 		/* redundant, but makes calculations easier */
-		unsigned fragsize;
+		/* what the hardware uses */
 		unsigned dmasize;
+		unsigned fragsize;
 		unsigned fragsamples;
 
+		/* what we tell the user to expect */
+		unsigned userfrags;
+		unsigned userfragsize;
+
 		/* OSS stuff */
 		unsigned mapped:1;
 		unsigned ready:1;
@@ -337,9 +343,8 @@
 static int i810_open_mixdev(struct inode *inode, struct file *file);
 static int i810_ioctl_mixdev(struct inode *inode, struct file *file, unsigned int cmd,
 				unsigned long arg);
-static loff_t i810_llseek(struct file *file, loff_t offset, int origin);
 
-extern __inline__ unsigned ld2(unsigned int x)
+static inline unsigned ld2(unsigned int x)
 {
 	unsigned r = 0;
 	
@@ -498,7 +503,7 @@
 /* get current playback/recording dma buffer pointer (byte offset from LBA),
    called with spinlock held! */
    
-extern __inline__ unsigned i810_get_dma_addr(struct i810_state *state, int rec)
+static inline unsigned i810_get_dma_addr(struct i810_state *state, int rec)
 {
 	struct dmabuf *dmabuf = &state->dmabuf;
 	unsigned int civ, offset;
@@ -543,13 +548,18 @@
 //}
 	
 /* Stop recording (lock held) */
-extern __inline__ void __stop_adc(struct i810_state *state)
+static inline void __stop_adc(struct i810_state *state)
 {
 	struct dmabuf *dmabuf = &state->dmabuf;
 	struct i810_card *card = state->card;
 
 	dmabuf->enable &= ~ADC_RUNNING;
 	outb(0, card->iobase + PI_CR);
+	// wait for the card to acknowledge shutdown
+	while( inb(card->iobase + PI_CR) != 0 ) ;
+	// now clear any latent interrupt bits (like the halt bit)
+	outb( inb(card->iobase + PI_SR), card->iobase + PI_SR );
+	outl( inl(card->iobase + GLOB_STA) & INT_PI, card->iobase + GLOB_STA);
 }
 
 static void stop_adc(struct i810_state *state)
@@ -578,13 +588,18 @@
 }
 
 /* stop playback (lock held) */
-extern __inline__ void __stop_dac(struct i810_state *state)
+static inline void __stop_dac(struct i810_state *state)
 {
 	struct dmabuf *dmabuf = &state->dmabuf;
 	struct i810_card *card = state->card;
 
 	dmabuf->enable &= ~DAC_RUNNING;
 	outb(0, card->iobase + PO_CR);
+	// wait for the card to acknowledge shutdown
+	while( inb(card->iobase + PO_CR) != 0 ) ;
+	// now clear any latent interrupt bits (like the halt bit)
+	outb( inb(card->iobase + PO_SR), card->iobase + PO_SR );
+	outl( inl(card->iobase + GLOB_STA) & INT_PO, card->iobase + GLOB_STA);
 }
 
 static void stop_dac(struct i810_state *state)
@@ -710,24 +725,22 @@
 	dmabuf->numfrag = SG_LEN;
 	dmabuf->fragsize = dmabuf->dmasize/dmabuf->numfrag;
 	dmabuf->fragsamples = dmabuf->fragsize >> 1;
+	dmabuf->userfragsize = dmabuf->ossfragsize;
+	dmabuf->userfrags = dmabuf->dmasize/dmabuf->ossfragsize;
 
 	memset(dmabuf->rawbuf, 0, dmabuf->dmasize);
 
 	if(dmabuf->ossmaxfrags == 4) {
 		fragint = 8;
-		dmabuf->ossfragsize = dmabuf->dmasize>>2;
 		dmabuf->fragshift = 2;
 	} else if (dmabuf->ossmaxfrags == 8) {
 		fragint = 4;
-		dmabuf->ossfragsize = dmabuf->dmasize>>3;
 		dmabuf->fragshift = 3;
 	} else if (dmabuf->ossmaxfrags == 16) {
 		fragint = 2;
-		dmabuf->ossfragsize = dmabuf->dmasize>>4;
 		dmabuf->fragshift = 4;
 	} else {
 		fragint = 1;
-		dmabuf->ossfragsize = dmabuf->dmasize>>5;
 		dmabuf->fragshift = 5;
 	}
 	/*
@@ -862,7 +875,7 @@
 				dmabuf->error++;
 			}
 		}
-		if (dmabuf->count > dmabuf->ossfragsize)
+		if (dmabuf->count > dmabuf->userfragsize)
 			wake_up(&dmabuf->wait);
 	}
 	/* error handling and process wake up for DAC */
@@ -890,7 +903,7 @@
 				dmabuf->error++;
 			}
 		}
-		if (dmabuf->count < (dmabuf->dmasize-dmabuf->ossfragsize))
+		if (dmabuf->count < (dmabuf->dmasize-dmabuf->userfragsize))
 			wake_up(&dmabuf->wait);
 	}
 }
@@ -940,6 +953,8 @@
 			break;
 		}
 	}
+	stop_dac(state);
+	synchronize_irq();
 	remove_wait_queue(&dmabuf->wait, &wait);
 	current->state = TASK_RUNNING;
 	if (signal_pending(current))
@@ -977,13 +992,14 @@
 		
 		status = inw(port + OFF_SR);
 #ifdef DEBUG_INTERRUPTS
-		printk("NUM %d PORT %lX IRQ ( ST%d ", c->num, c->port, status);
+		printk("NUM %d PORT %X IRQ ( ST%d ", c->num, c->port, status);
 #endif
 		if(status & DMA_INT_COMPLETE)
 		{
 			i810_update_ptr(state);
 #ifdef DEBUG_INTERRUPTS
-			printk("COMP%d ",x);
+			printk("COMP %d ", dmabuf->hwptr /
+					dmabuf->fragsize);
 #endif
 		}
 		if(status & DMA_INT_LVI)
@@ -1040,11 +1056,6 @@
 	spin_unlock(&card->lock);
 }
 
-static loff_t i810_llseek(struct file *file, loff_t offset, int origin)
-{
-	return -ESPIPE;
-}
-
 /* in this loop, dmabuf.count signifies the amount of data that is waiting to be copied to
    the user's buffer.  it is filled by the dma machine and drained by this loop. */
 static ssize_t i810_read(struct file *file, char *buffer, size_t count, loff_t *ppos)
@@ -1084,9 +1095,10 @@
 		spin_lock_irqsave(&state->card->lock, flags);
 		swptr = dmabuf->swptr;
 		if (dmabuf->count > dmabuf->dmasize) {
-			dmabuf->count = 0;
+			dmabuf->count = dmabuf->dmasize;
 		}
-		cnt = dmabuf->count;
+		cnt = dmabuf->count - dmabuf->fragsize;
+		// this is to make the copy_to_user simpler below
 		if(cnt > (dmabuf->dmasize - swptr))
 			cnt = dmabuf->dmasize - swptr;
 		spin_unlock_irqrestore(&state->card->lock, flags);
@@ -1095,13 +1107,11 @@
 			cnt = count;
 		if (cnt <= 0) {
 			unsigned long tmo;
-			// are we already running?  only start us if we aren't running
-			// currently
-			i810_update_lvi(state,1);
 			if(!dmabuf->enable) {
 				dmabuf->trigger |= PCM_ENABLE_INPUT;
 				start_adc(state);
 			}
+			i810_update_lvi(state,1);
 			if (file->f_flags & O_NONBLOCK) {
 				if (!ret) ret = -EAGAIN;
 				return ret;
@@ -1150,7 +1160,8 @@
 		ret += cnt;
 	}
 	i810_update_lvi(state,1);
-	start_adc(state);
+	if(!(dmabuf->enable & ADC_RUNNING))
+		start_adc(state);
 	return ret;
 }
 
@@ -1194,23 +1205,30 @@
 		if (dmabuf->count < 0) {
 			dmabuf->count = 0;
 		}
-		cnt = dmabuf->dmasize - swptr;
-		if(cnt > (dmabuf->dmasize - dmabuf->count))
-			cnt = dmabuf->dmasize - dmabuf->count;
+		cnt = dmabuf->dmasize - dmabuf->fragsize - dmabuf->count;
+		// this is to make the copy_from_user simpler below
+		if(cnt > (dmabuf->dmasize - swptr))
+			cnt = dmabuf->dmasize - swptr;
 		spin_unlock_irqrestore(&state->card->lock, flags);
 
+#ifdef DEBUG2
+		printk(KERN_INFO "i810_audio: i810_write: %d bytes available space\n", cnt);
+#endif
 		if (cnt > count)
 			cnt = count;
 		if (cnt <= 0) {
 			unsigned long tmo;
 			// There is data waiting to be played
-			i810_update_lvi(state,0);
 			if(!dmabuf->enable && dmabuf->count) {
 				/* force the starting incase SETTRIGGER has been used */
 				/* to stop it, otherwise this is a deadlock situation */
 				dmabuf->trigger |= PCM_ENABLE_OUTPUT;
 				start_dac(state);
 			}
+			// Update the LVI pointer in case we have already
+			// written data in this syscall and are just waiting
+			// on the tail bit of data
+			i810_update_lvi(state,0);
 			if (file->f_flags & O_NONBLOCK) {
 				if (!ret) ret = -EAGAIN;
 				return ret;
@@ -1259,11 +1277,10 @@
 	}
 	if (swptr % dmabuf->fragsize) {
 		x = dmabuf->fragsize - (swptr % dmabuf->fragsize);
-		if((x + dmabuf->count) < dmabuf->dmasize)
-			memset(dmabuf->rawbuf + swptr, '\0', x);
+		memset(dmabuf->rawbuf + swptr, '\0', x);
 	}
 	i810_update_lvi(state,0);
-	if (!dmabuf->enable && dmabuf->count >= dmabuf->ossfragsize)
+	if (!dmabuf->enable && dmabuf->count >= dmabuf->userfragsize)
 		start_dac(state);
 
 	return ret;
@@ -1398,8 +1415,6 @@
 		if (dmabuf->enable != DAC_RUNNING || file->f_flags & O_NONBLOCK)
 			return 0;
 		drain_dac(state, 0);
-		stop_dac(state);
-		synchronize_irq();
 		dmabuf->ready = 0;
 		dmabuf->swptr = dmabuf->hwptr = 0;
 		dmabuf->count = dmabuf->total_bytes = 0;
@@ -1436,7 +1451,7 @@
 		if (get_user(val, (int *)arg))
 			return -EFAULT;
 		if(val==0) {
-			ret = -EINVAL;
+			return -EINVAL;
 		} else {
 			ret = 1;
 		}
@@ -1458,9 +1473,9 @@
 				return val;
 		}
 #ifdef DEBUG
-		printk("SNDCTL_DSP_GETBLKSIZE %d\n", dmabuf->ossfragsize);
+		printk("SNDCTL_DSP_GETBLKSIZE %d\n", dmabuf->userfragsize);
 #endif
-		return put_user(dmabuf->ossfragsize, (int *)arg);
+		return put_user(dmabuf->userfragsize, (int *)arg);
 
 	case SNDCTL_DSP_GETFMTS: /* Returns a mask of supported sample format*/
 #ifdef DEBUG
@@ -1545,13 +1560,13 @@
 			return val;
 		spin_lock_irqsave(&state->card->lock, flags);
 		i810_update_ptr(state);
-		abinfo.fragsize = dmabuf->ossfragsize;
-		abinfo.fragstotal = dmabuf->ossmaxfrags;
+		abinfo.fragsize = dmabuf->userfragsize;
+		abinfo.fragstotal = dmabuf->userfrags;
 		if(dmabuf->mapped)
 			abinfo.bytes = dmabuf->count;
 		else
 			abinfo.bytes = dmabuf->dmasize - dmabuf->count;
-		abinfo.fragments = abinfo.bytes / dmabuf->ossfragsize;
+		abinfo.fragments = abinfo.bytes / dmabuf->userfragsize;
 		spin_unlock_irqrestore(&state->card->lock, flags);
 #ifdef DEBUG
 		printk("SNDCTL_DSP_GETOSPACE %d, %d, %d, %d\n", abinfo.bytes,
@@ -1568,10 +1583,10 @@
 		i810_update_ptr(state);
 		cinfo.bytes = dmabuf->total_bytes;
 		cinfo.ptr = dmabuf->hwptr;
-		cinfo.blocks = (dmabuf->dmasize - dmabuf->count)/dmabuf->ossfragsize;
+		cinfo.blocks = (dmabuf->dmasize - dmabuf->count)/dmabuf->userfragsize;
 		if (dmabuf->mapped) {
 			dmabuf->count = (dmabuf->dmasize - 
-					 (dmabuf->count & (dmabuf->ossfragsize-1)));
+					 (dmabuf->count & (dmabuf->userfragsize-1)));
 			__i810_update_lvi(state, 0);
 		}
 		spin_unlock_irqrestore(&state->card->lock, flags);
@@ -1588,10 +1603,10 @@
 			return val;
 		spin_lock_irqsave(&state->card->lock, flags);
 		i810_update_ptr(state);
-		abinfo.fragsize = dmabuf->ossfragsize;
-		abinfo.fragstotal = dmabuf->ossmaxfrags;
+		abinfo.fragsize = dmabuf->userfragsize;
+		abinfo.fragstotal = dmabuf->userfrags;
 		abinfo.bytes = dmabuf->dmasize - dmabuf->count;
-		abinfo.fragments = abinfo.bytes / dmabuf->ossfragsize;
+		abinfo.fragments = abinfo.bytes / dmabuf->userfragsize;
 		spin_unlock_irqrestore(&state->card->lock, flags);
 #ifdef DEBUG
 		printk("SNDCTL_DSP_GETISPACE %d, %d, %d, %d\n", abinfo.bytes,
@@ -1607,10 +1622,10 @@
 		spin_lock_irqsave(&state->card->lock, flags);
 		i810_update_ptr(state);
 		cinfo.bytes = dmabuf->total_bytes;
-		cinfo.blocks = dmabuf->count/dmabuf->ossfragsize;
+		cinfo.blocks = dmabuf->count/dmabuf->userfragsize;
 		cinfo.ptr = dmabuf->hwptr;
 		if (dmabuf->mapped) {
-			dmabuf->count &= dmabuf->ossfragsize-1;
+			dmabuf->count &= (dmabuf->userfragsize-1);
 			__i810_update_lvi(state, 1);
 		}
 		spin_unlock_irqrestore(&state->card->lock, flags);
@@ -1667,7 +1682,7 @@
 				dmabuf->count = dmabuf->dmasize;
 				i810_update_lvi(state,0);
 			}
-			if (!dmabuf->enable && dmabuf->count > dmabuf->fragsize)
+			if (!dmabuf->enable && dmabuf->count > dmabuf->userfragsize)
 				start_dac(state);
 		}
 		if(val & PCM_ENABLE_INPUT) {
@@ -1684,7 +1699,7 @@
 				i810_update_lvi(state,1);
 			}
 			if (!dmabuf->enable && dmabuf->count <
-			    (dmabuf->dmasize - dmabuf->fragsize))
+			    (dmabuf->dmasize - dmabuf->userfragsize))
 				start_adc(state);
 		}
 		return 0;
@@ -1794,8 +1809,6 @@
 		dmabuf->trigger |= PCM_ENABLE_OUTPUT;
 	}
 		
-	down(&state->open_sem);
-
 	/* set default sample format. According to OSS Programmer's Guide  /dev/dsp
 	   should be default to unsigned 8-bits, mono, with sample rate 8kHz and
 	   /dev/dspW will accept 16-bits sample, but we don't support those so we
@@ -1806,7 +1819,6 @@
 	dmabuf->subdivision  = 0;
 
 	state->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE);
-	up(&state->open_sem);
 
 	return 0;
 }
@@ -1814,21 +1826,21 @@
 static int i810_release(struct inode *inode, struct file *file)
 {
 	struct i810_state *state = (struct i810_state *)file->private_data;
+	struct i810_card *card = state->card;
 	struct dmabuf *dmabuf = &state->dmabuf;
+	unsigned long flags;
 
 	lock_kernel();
 
-	down(&state->open_sem);
-
 	/* stop DMA state machine and free DMA buffers/channels */
-	if(dmabuf->enable == DAC_RUNNING ||
+	if(dmabuf->enable & DAC_RUNNING ||
 	   (dmabuf->count && (dmabuf->trigger & PCM_ENABLE_OUTPUT))) {
 		drain_dac(state,0);
-		stop_dac(state);
 	}
 	if(dmabuf->enable & ADC_RUNNING) {
 		stop_adc(state);
 	}
+	spin_lock_irqsave(&card->lock, flags);
 	dealloc_dmabuf(state);
 	if (file->f_mode & FMODE_WRITE) {
 		state->card->free_pcm_channel(state->card, dmabuf->write_channel->num);
@@ -1837,11 +1849,9 @@
 		state->card->free_pcm_channel(state->card, dmabuf->read_channel->num);
 	}
 
-	/* we're covered by the open_sem */
-	up(&state->open_sem);
-	
 	state->card->states[state->virt] = NULL;
 	kfree(state);
+	spin_unlock_irqrestore(&card->lock, flags);
 	unlock_kernel();
 
 	return 0;
@@ -1849,7 +1859,7 @@
 
 static /*const*/ struct file_operations i810_audio_fops = {
 	owner:		THIS_MODULE,
-	llseek:		i810_llseek,
+	llseek:		no_llseek,
 	read:		i810_read,
 	write:		i810_write,
 	poll:		i810_poll,
@@ -1910,7 +1920,7 @@
 
 static /*const*/ struct file_operations i810_mixer_fops = {
 	owner:		THIS_MODULE,
-	llseek:		i810_llseek,
+	llseek:		no_llseek,
 	ioctl:		i810_ioctl_mixdev,
 	open:		i810_open_mixdev,
 };
diff -u --recursive --new-file v2.4.8/linux/drivers/sound/maestro.c linux/drivers/sound/maestro.c
--- v2.4.8/linux/drivers/sound/maestro.c	Wed Jul 25 17:10:23 2001
+++ linux/drivers/sound/maestro.c	Sun Aug 12 10:51:42 2001
@@ -1290,7 +1290,7 @@
 }
 
 /* Stop our host of recording apus */
-extern inline void stop_adc(struct ess_state *s)
+static inline void stop_adc(struct ess_state *s)
 {
 	/* XXX lets hope we don't have to lock around this */
 	if (! (s->enable & ADC_RUNNING)) return;
@@ -1594,7 +1594,7 @@
 }
 
 /* Playback pointer */
-extern __inline__ unsigned get_dmaa(struct ess_state *s)
+static inline unsigned get_dmaa(struct ess_state *s)
 {
 	int offset;
 
@@ -1608,7 +1608,7 @@
 }
 
 /* Record pointer */
-extern __inline__ unsigned get_dmac(struct ess_state *s)
+static inline unsigned get_dmac(struct ess_state *s)
 {
 	int offset;
 
@@ -2122,13 +2122,6 @@
 }
 
 /* --------------------------------------------------------------------- */
-
-static loff_t ess_llseek(struct file *file, loff_t offset, int origin)
-{
-	return -ESPIPE;
-}
-
-/* --------------------------------------------------------------------- */
 static int ess_open_mixdev(struct inode *inode, struct file *file)
 {
 	int minor = MINOR(inode->i_rdev);
@@ -2172,7 +2165,7 @@
 
 static /*const*/ struct file_operations ess_mixer_fops = {
 	owner:		THIS_MODULE,
-	llseek:         ess_llseek,
+	llseek:         no_llseek,
 	ioctl:          ess_ioctl_mixdev,
 	open:           ess_open_mixdev,
 	release:        ess_release_mixdev,
@@ -3104,7 +3097,7 @@
 
 static struct file_operations ess_audio_fops = {
 	owner:		THIS_MODULE,
-	llseek:         ess_llseek,
+	llseek:         no_llseek,
 	read:           ess_read,
 	write:          ess_write,
 	poll:           ess_poll,
diff -u --recursive --new-file v2.4.8/linux/drivers/sound/maestro3.c linux/drivers/sound/maestro3.c
--- v2.4.8/linux/drivers/sound/maestro3.c	Tue Jul  3 17:08:21 2001
+++ linux/drivers/sound/maestro3.c	Sun Aug 12 10:38:48 2001
@@ -130,7 +130,7 @@
 #include <linux/sched.h>
 #include <linux/delay.h>
 #include <linux/sound.h>
-#include <linux/malloc.h>
+#include <linux/slab.h>
 #include <linux/soundcard.h>
 #include <linux/pci.h>
 #include <linux/vmalloc.h>
@@ -1280,13 +1280,6 @@
 
 /* --------------------------------------------------------------------- */
 
-static loff_t m3_llseek(struct file *file, loff_t offset, int origin)
-{
-    return -ESPIPE;
-}
-
-/* --------------------------------------------------------------------- */
-
 static int drain_dac(struct m3_state *s, int nonblock)
 {
     DECLARE_WAITQUEUE(wait,current);
@@ -2180,7 +2173,7 @@
 }
 
 static struct file_operations m3_mixer_fops = {
-    llseek:         m3_llseek,
+    llseek:         no_llseek,
     ioctl:          m3_ioctl_mixdev,
     open:           m3_open_mixdev,
     release:        m3_release_mixdev,
@@ -2553,7 +2546,7 @@
 }
 
 static struct file_operations m3_audio_fops = {
-    llseek:     &m3_llseek,
+    llseek:     &no_llseek,
     read:       &m3_read,
     write:      &m3_write,
     poll:       &m3_poll,
diff -u --recursive --new-file v2.4.8/linux/drivers/sound/rme96xx.c linux/drivers/sound/rme96xx.c
--- v2.4.8/linux/drivers/sound/rme96xx.c	Wed Dec 31 16:00:00 1969
+++ linux/drivers/sound/rme96xx.c	Sun Aug 12 10:51:42 2001
@@ -0,0 +1,1561 @@
+/* (C) 2000 Guenter Geiger <geiger@debian.org>
+   with copy/pastes from the driver of Winfried Ritsch <ritsch@iem.kug.ac.at>
+   based on es1370.c
+
+
+
+   *  10 Jan 2001: 0.1 initial version
+   *  19 Jan 2001: 0.2 fixed bug in select()
+   *  27 Apr 2001: 0.3 more than one card usable
+   *  11 May 2001: 0.4 fixed for SMP, included into kernel source tree
+   *  17 May 2001: 0.5 draining code didn't work on new cards
+   *  18 May 2001: 0.6 remove synchronize_irq() call 
+
+TODO:
+   - test more than one card --- done
+   - check for pci IOREGION (see es1370) in rme96xx_probe ??
+   - error detection
+   - mmap interface
+   - mixer mmap interface
+   - mixer ioctl
+   - get rid of noise upon first open (why ??)
+   - allow multiple open(at least for read)
+   - allow multiple open for non overlapping regions
+   - recheck the multiple devices part (offsets of different devices, etc)
+   - do decent draining in _release --- done
+   - SMP support
+*/
+
+#ifndef RMEVERSION
+#define RMEVERSION "0.6"
+#endif
+
+#include <linux/version.h>
+#include <linux/module.h>
+#include <linux/string.h>
+#include <linux/sched.h>
+#include <linux/sound.h>
+#include <linux/soundcard.h>
+#include <linux/pci.h>
+#include <linux/smp_lock.h>
+#include <asm/dma.h>
+#include <linux/init.h>
+#include <linux/poll.h>
+#include "rme96xx.h"
+
+#define NR_DEVICE 2
+
+static int devices = 1;
+MODULE_PARM(devices, "1-" __MODULE_STRING(NR_DEVICE) "i");
+MODULE_PARM_DESC(devices, "number of dsp devices allocated by the driver");
+
+
+MODULE_AUTHOR("Guenter Geiger, geiger@debian.org");
+MODULE_DESCRIPTION("RME9652/36 \"Hammerfall\" Driver");
+
+#ifdef DEBUG
+#define DBG(x) printk("RME_DEBUG:");x
+#define COMM(x) printk("RME_COMM: " x "\n");
+#else
+#define DBG(x) while (0) {}
+#define COMM(x)
+#endif
+
+/*-------------------------------------------------------------------------- 
+                        Preporcessor Macros and Definitions
+ --------------------------------------------------------------------------*/
+
+#define RME96xx_MAGIC 0x6473
+
+/* Registers-Space in offsets from base address with 16MByte size */
+
+#define RME96xx_IO_EXTENT     16l*1024l*1024l
+#define RME96xx_CHANNELS_PER_CARD 26
+
+/*                  Write - Register */
+
+/* 0,4,8,12,16,20,24,28 ... hardware init (erasing fifo-pointer intern) */
+#define RME96xx_num_of_init_regs   8
+
+#define RME96xx_init_buffer       (0/4)
+#define RME96xx_play_buffer       (32/4)  /* pointer to 26x64kBit RAM from mainboard */
+#define RME96xx_rec_buffer        (36/4)  /* pointer to 26x64kBit RAM from mainboard */
+#define RME96xx_control_register  (64/4)  /* exact meaning see below */
+#define RME96xx_irq_clear         (96/4)  /* irq acknowledge */
+#define RME96xx_time_code         (100/4) /* if used with alesis adat */
+#define RME96xx_thru_base         (128/4) /* 132...228 Thru for 26 channels */
+#define RME96xx_thru_channels     RME96xx_CHANNELS_PER_CARD
+
+/*                     Read Register */
+
+#define RME96xx_status_register    0     /* meaning see below */
+
+
+
+/* Status Register: */
+/* ------------------------------------------------------------------------ */
+#define RME96xx_IRQ          0x0000001 /* IRQ is High if not reset by RMExx_irq_clear */
+#define RME96xx_lock_2       0x0000002 /* ADAT 3-PLL: 1=locked, 0=unlocked */
+#define RME96xx_lock_1       0x0000004 /* ADAT 2-PLL: 1=locked, 0=unlocked */
+#define RME96xx_lock_0       0x0000008 /* ADAT 1-PLL: 1=locked, 0=unlocked */
+
+#define RME96xx_fs48         0x0000010 /* sample rate 0 ...44.1/88.2,  1 ... 48/96 Khz */
+#define RME96xx_wsel_rd      0x0000020 /* if Word-Clock is used and valid then 1 */
+#define RME96xx_buf_pos1     0x0000040 /* Bit 6..15 : Position of buffer-pointer in 64Bytes-blocks */
+#define RME96xx_buf_pos2     0x0000080 /* resolution +/- 1 64Byte/block (since 64Bytes bursts) */
+ 
+#define RME96xx_buf_pos3     0x0000100 /* 10 bits = 1024 values */
+#define RME96xx_buf_pos4     0x0000200 /* if we mask off the first 6 bits, we can take the status */
+#define RME96xx_buf_pos5     0x0000400 /* register as sample counter in the hardware buffer */
+#define RME96xx_buf_pos6     0x0000800 
+
+#define RME96xx_buf_pos7     0x0001000 
+#define RME96xx_buf_pos8     0x0002000 
+#define RME96xx_buf_pos9     0x0004000
+#define RME96xx_buf_pos10    0x0008000 
+
+#define RME96xx_sync_2       0x0010000 /* if ADAT-IN3 synced to system clock */
+#define RME96xx_sync_1       0x0020000 /* if ADAT-IN2 synced to system clock */
+#define RME96xx_sync_0       0x0040000 /* if ADAT-IN1 synced to system clock */
+#define RME96xx_DS_rd        0x0080000 /* 1=Double Speed, 0=Normal Speed */
+
+#define RME96xx_tc_busy      0x0100000 /* 1=time-code copy in progress (960ms) */
+#define RME96xx_tc_out       0x0200000 /* time-code out bit */
+#define RME96xx_F_0          0x0400000 /*  000=64kHz, 100=88.2kHz, 011=96kHz  */
+#define RME96xx_F_1          0x0800000 /*  111=32kHz, 110=44.1kHz, 101=48kHz, */
+
+#define RME96xx_F_2          0x1000000 /*  od external Crystal Chip if ERF=1*/
+#define RME96xx_ERF          0x2000000 /* Error-Flag of SDPIF Receiver (1=No Lock)*/
+#define RME96xx_buffer_id    0x4000000 /* toggles by each interrupt on rec/play */
+#define RME96xx_tc_valid     0x8000000 /* 1 = a signal is detected on time-code input */
+
+/* Status Register Fields */
+
+#define RME96xx_lock            (RME96xx_lock_0|RME96xx_lock_1|RME96xx_lock_2)
+#define RME96xx_buf_pos          0x000FFC0 
+#define RME96xx_sync            (RME96xx_sync_0|RME96xx_sync_1|RME96xx_sync_2)
+#define RME96xx_F               (RME96xx_F_0|RME96xx_F_1|RME96xx_F_2)
+
+
+
+/* Control-Register: */			    
+/*--------------------------------------------------------------------------------*/
+
+#define RME96xx_start_bit	   0x0001    /* start record/play */
+#define RME96xx_latency0	   0x0002    /* Bit 0 -  Buffer size or latency */
+#define RME96xx_latency1	   0x0004    /* Bit 1 - Buffer size or latency */
+#define RME96xx_latency2	   0x0008    /* Bit 2 - Buffer size or latency */
+
+#define RME96xx_Master		   0x0010   /* Clock Mode Master=1,Slave/Auto=0 */
+#define RME96xx_IE		   0x0020   /* Interupt Enable */
+#define RME96xx_freq		   0x0040   /* samplerate 0=44.1/88.2, 1=48/96 kHz*/
+
+
+#define RME96xx_DS                 0x0100   /* Doule Speed 0=44.1/48, 1=88.2/96 Khz */
+#define RME96xx_PRO		   0x0200    /* spdif 0=consumer, 1=professional Mode*/
+#define RME96xx_EMP		   0x0400    /* spdif Emphasis 0=None, 1=ON */
+#define RME96xx_Dolby		   0x0800    /* spdif Non-audio bit 1=set, 0=unset */
+
+#define RME96xx_opt_out	           0x1000  /* Use 1st optical OUT as SPDIF: 1=yes,0=no */
+#define RME96xx_wsel               0x2000  /* use Wordclock as sync (overwrites master)*/
+#define RME96xx_inp_0              0x4000  /* SPDIF-IN: 00=optical (ADAT1),     */
+#define RME96xx_inp_1              0x8000  /* 01=koaxial (Cinch), 10=Internal CDROM*/
+
+#define RME96xx_SyncRef0           0x10000  /* preferred sync-source in autosync */
+#define RME96xx_SyncRef1           0x20000  /* 00=ADAT1,01=ADAT2,10=ADAT3,11=SPDIF */
+
+
+#define RME96xx_ctrl_init            (RME96xx_latency0 |\
+                                     RME96xx_Master |\
+                                     RME96xx_inp_1)
+                              
+
+
+/* Control register fields and shortcuts */
+
+#define RME96xx_latency (RME96xx_latency0|RME96xx_latency1|RME96xx_latency2)
+#define RME96xx_inp         (RME96xx_inp_0|RME96xx_inp_1)
+#define RME96xx_SyncRef    (RME96xx_SyncRef0|RME96xx_SyncRef1)
+/* latency = 512Bytes * 2^n, where n is made from Bit3 ... Bit0 */
+
+#define RME96xx_SET_LATENCY(x)   (((x)&0x7)<<1)
+#define RME96xx_GET_LATENCY(x)   (((x)>>1)&0x7)
+#define RME96xx_SET_inp(x) (((x)&0x3)<<14)
+#define RME96xx_GET_inp(x)   (((x)>>14)&0x3)
+#define RME96xx_SET_SyncRef(x) (((x)&0x3)<<17)
+#define RME96xx_GET_SyncRef(x)   (((x)>>17)&0x3)
+
+
+/* buffer sizes */
+#define RME96xx_BYTES_PER_SAMPLE  4 /* sizeof(u32) */
+#define RME_16K 16*1024
+
+#define RME96xx_DMA_MAX_SAMPLES  (RME_16K)
+#define RME96xx_DMA_MAX_SIZE     (RME_16K * RME96xx_BYTES_PER_SAMPLE)
+#define RME96xx_DMA_MAX_SIZE_ALL (RME96xx_DMA_MAX_SIZE * RME96xx_CHANNELS_PER_CARD)
+
+#define RME96xx_NUM_OF_FRAGMENTS     2
+#define RME96xx_FRAGMENT_MAX_SIZE    (RME96xx_DMA_MAX_SIZE/2)
+#define RME96xx_FRAGMENT_MAX_SAMPLES (RME96xx_DMA_MAX_SAMPLES/2)
+#define RME96xx_MAX_LATENCY       7   /* 16k samples */
+
+
+#define RME96xx_MAX_DEVS 4 /* we provide some OSS stereodevs */
+
+#define RME_MESS "rme96xx:"
+/*------------------------------------------------------------------------ 
+                  Types, struct and function declarations 
+ ------------------------------------------------------------------------*/
+
+
+/* --------------------------------------------------------------------- */
+
+static const char invalid_magic[] = KERN_CRIT RME_MESS" invalid magic value\n";
+
+#define VALIDATE_STATE(s)                         \
+({                                                \
+	if (!(s) || (s)->magic != RME96xx_MAGIC) { \
+		printk(invalid_magic);            \
+		return -ENXIO;                    \
+	}                                         \
+})
+
+/* --------------------------------------------------------------------- */
+
+
+static struct file_operations rme96xx_audio_fops;
+static struct file_operations rme96xx_mixer_fops;
+static int numcards;
+
+typedef int32_t raw_sample_t;
+
+typedef struct _rme96xx_info {
+
+	/* hardware settings */
+	int magic;
+	struct pci_dev * pcidev; /* pci_dev structure */
+	unsigned long *iobase;	
+	unsigned int irq;
+
+	/* list of rme96xx devices */
+	struct list_head devs;
+
+	spinlock_t lock;
+
+	u32 *recbuf;             /* memory for rec buffer */
+	u32 *playbuf;            /* memory for play buffer */
+
+	u32 control_register;
+
+	u32 thru_bits; /* thru 1=on, 0=off channel 1=Bit1... channel 26= Bit26 */
+
+	int open_count;
+
+
+	int rate;
+	int latency;
+	unsigned int fragsize;
+	int started;
+
+	int hwptr; /* can be negativ because of pci burst offset  */
+	unsigned int hwbufid;  /* set by interrupt, buffer which is written/read now */
+	
+	struct dmabuf {
+
+		unsigned int format;
+		int formatshift;
+		int inchannels;       /* number of channels for device */
+		int outchannels;       /* number of channels for device */
+		int mono; /* if true, we play mono on 2 channels */
+		int inoffset; /* which channel is considered the first one */
+         	int outoffset;
+		
+		/* state */
+		int opened;               /* open() made */
+		int started;              /* first write/read */
+		int mmapped;              /* mmap */
+		int open_mode;
+
+		struct _rme96xx_info *s;  
+
+		/* pointer to read/write position in buffer */
+		unsigned readptr;          
+		unsigned writeptr;          
+
+		unsigned error; /* over/underruns cleared on sync again */
+
+		/* waiting and locking */
+		wait_queue_head_t wait;
+		struct semaphore  open_sem;
+		wait_queue_head_t open_wait;
+
+	} dma[RME96xx_MAX_DEVS]; 
+
+	int dspnum[RME96xx_MAX_DEVS];  /* register with sound subsystem */ 
+	int mixer;  /* register with sound subsystem */ 
+} rme96xx_info;
+
+
+/* fiddling with the card (first level hardware control) */
+
+inline void rme96xx_set_ctrl(rme96xx_info* s,int mask)
+{
+
+	s->control_register|=mask;
+	writel(s->control_register,s->iobase + RME96xx_control_register);
+
+}
+
+inline void rme96xx_unset_ctrl(rme96xx_info* s,int mask)
+{
+
+	s->control_register&=(~mask);
+	writel(s->control_register,s->iobase + RME96xx_control_register);
+
+}
+
+
+
+/* the hwbuf in the status register seems to have some jitter, to get rid of
+   it, we first only let the numbers grow, to be on the secure side we 
+   subtract a certain amount RME96xx_BURSTBYTES from the resulting number */
+
+/* the function returns the hardware pointer in bytes */
+#define RME96xx_BURSTBYTES -64  /* bytes by which hwptr could be off */
+
+inline int rme96xx_gethwptr(rme96xx_info* s,int exact)
+{
+	long flags;
+	if (exact) {
+		unsigned int hwp;
+/* the hwptr seems to be rather unreliable :(, so we don't use it */
+		spin_lock_irqsave(&s->lock,flags);
+		
+		hwp  = readl(s->iobase + RME96xx_status_register) & 0xffc0;
+		s->hwptr = (hwp < s->hwptr) ? s->hwptr : hwp;
+//		s->hwptr = hwp;
+
+		spin_unlock_irqrestore(&s->lock,flags);
+		return (s->hwptr+RME96xx_BURSTBYTES) & ((s->fragsize<<1)-1);
+	}
+	return (s->hwbufid ? s->fragsize : 0);
+}
+
+inline void rme96xx_setlatency(rme96xx_info* s,int l)
+{
+	s->latency = l;
+	s->fragsize = 1<<(8+l);
+	rme96xx_unset_ctrl(s,RME96xx_latency);
+	rme96xx_set_ctrl(s,RME96xx_SET_LATENCY(l));	
+}
+
+
+static void rme96xx_clearbufs(struct dmabuf* dma)
+{
+	int i,j;
+	unsigned long flags;
+
+	/* clear dmabufs */
+	for(i=0;i<devices;i++) {
+		for (j=0;j<dma->outchannels + dma->mono;j++)
+			memset(&dma->s->playbuf[(dma->outoffset + j)*RME96xx_DMA_MAX_SAMPLES], 
+			       0, RME96xx_DMA_MAX_SIZE);
+	}
+	spin_lock_irqsave(&dma->s->lock,flags);
+	dma->writeptr = 0;
+	dma->readptr = 0;
+	spin_unlock_irqrestore(&dma->s->lock,flags);
+}
+
+static int rme96xx_startcard(rme96xx_info *s,int stop)
+{
+	int i;
+	long flags;
+
+	COMM       ("startcard");
+	if(s->control_register & RME96xx_IE){
+		/* disable interrupt first */
+		
+		rme96xx_unset_ctrl( s,RME96xx_start_bit );
+		udelay(10);
+		rme96xx_unset_ctrl( s,RME96xx_IE);
+		spin_lock_irqsave(&s->lock,flags); /* timing is critical */
+		s->started = 0;
+		spin_unlock_irqrestore(&s->lock,flags);
+		if (stop) {
+		     COMM("Sound card stopped");
+		     return 1;
+		}
+	}
+	COMM       ("interupt disabled");
+	/* first initialize all pointers on card */
+	for(i=0;i<RME96xx_num_of_init_regs;i++){
+		writel(0,s->iobase + i);
+		udelay(10); /* ?? */
+	}
+	COMM       ("regs cleaned");
+
+	spin_lock_irqsave(&s->lock,flags); /* timing is critical */
+	udelay(10);
+	s->started = 1;
+	s->hwptr = 0;
+	spin_unlock_irqrestore(&s->lock,flags);
+
+	rme96xx_set_ctrl( s, RME96xx_IE | RME96xx_start_bit);
+
+
+	COMM("Sound card started");
+  
+	return 1;
+}
+
+
+inline int rme96xx_getospace(struct dmabuf * dma, unsigned int hwp)
+{
+	int cnt;
+	int  swptr;
+	unsigned long flags;
+
+	spin_lock_irqsave(&dma->s->lock,flags); 
+	swptr = dma->writeptr;
+	cnt = (hwp - swptr);
+	
+	if (cnt < 0) {
+	     cnt = ((dma->s->fragsize<<1) - swptr);
+	}
+	spin_unlock_irqrestore(&dma->s->lock,flags);
+	return cnt;
+}
+
+inline int rme96xx_getispace(struct dmabuf * dma, unsigned int hwp)
+{
+	int cnt;
+	int  swptr;
+	unsigned long flags;
+
+	spin_lock_irqsave(&dma->s->lock,flags); 
+	swptr = dma->readptr;
+	cnt = (hwp - swptr);
+	 
+	if (cnt < 0) {
+		cnt = ((dma->s->fragsize<<1) - swptr);
+	}
+	spin_unlock_irqrestore(&dma->s->lock,flags);
+	return cnt;
+}
+
+
+inline int rme96xx_copyfromuser(struct dmabuf* dma,const char* buffer,int count,int hop)
+{
+	int swptr = dma->writeptr;
+	switch (dma->format) {
+	case AFMT_S32_BLOCKED:
+	{
+	     char* buf = (char*)buffer;
+	     int cnt = count/dma->outchannels;
+	     int i;
+	     for (i=0;i < dma->outchannels;i++) {
+		  char* hwbuf =(char*) &dma->s->playbuf[(dma->outoffset + i)*RME96xx_DMA_MAX_SAMPLES];
+		  hwbuf+=swptr;
+
+		  if (copy_from_user(hwbuf,buf, cnt))
+		       return -1;
+		  buf+=hop;
+	     }
+	     swptr+=cnt;
+	     break;
+	}
+	case AFMT_S16_LE:
+	{
+	     int i,j;
+	     int cnt = count/dma->outchannels;
+	     for (i=0;i < dma->outchannels + dma->mono;i++) {
+		     short* sbuf = (short*)buffer + i*(!dma->mono);
+		     short* hwbuf =(short*) &dma->s->playbuf[(dma->outoffset + i)*RME96xx_DMA_MAX_SAMPLES];	     
+		     hwbuf+=(swptr>>1);
+		     for (j=0;j<(cnt>>1);j++) {
+			     hwbuf++; /* skip the low 16 bits */
+			     __get_user(*hwbuf++,sbuf++);
+			     sbuf+=(dma->outchannels-1);
+		     }
+	     }
+	     swptr += (cnt<<1);
+	     break;
+	}
+	default:
+	     printk(RME_MESS" unsupported format\n");
+	     return -1;
+	} /* switch */
+
+	swptr&=((dma->s->fragsize<<1) -1);
+	dma->writeptr = swptr;
+
+	return 0;
+}
+
+/* The count argument is the number of bytes */
+inline int rme96xx_copytouser(struct dmabuf* dma,const char* buffer,int count,int hop)
+{
+	int swptr = dma->readptr;
+	switch (dma->format) {
+	case AFMT_S32_BLOCKED:
+	{
+	     char* buf = (char*)buffer;
+	     int cnt = count/dma->inchannels;
+	     int i;
+
+	     for (i=0;i < dma->inchannels;i++) {
+		  char* hwbuf =(char*) &dma->s->recbuf[(dma->inoffset + i)*RME96xx_DMA_MAX_SAMPLES];
+		  hwbuf+=swptr;
+
+		  if (copy_to_user(buf,hwbuf,cnt))
+		       return -1;
+		  buf+=hop;
+	     }
+	     swptr+=cnt;
+	     break;
+	}
+	case AFMT_S16_LE:
+	{
+	     int i,j;
+	     int cnt = count/dma->inchannels;
+	     for (i=0;i < dma->inchannels;i++) {
+		  short* sbuf = (short*)buffer + i;
+		  short* hwbuf =(short*) &dma->s->recbuf[(dma->inoffset + i)*RME96xx_DMA_MAX_SAMPLES];	     
+		  hwbuf+=(swptr>>1);
+		  for (j=0;j<(cnt>>1);j++) {
+		       hwbuf++;
+		       __put_user(*hwbuf++,sbuf++);
+		       sbuf+=(dma->inchannels-1);
+		  }
+	     }
+	     swptr += (cnt<<1);
+	     break;
+	}
+	default:
+	     printk(RME_MESS" unsupported format\n");
+	     return -1;
+	} /* switch */
+	
+	swptr&=((dma->s->fragsize<<1) -1);	
+	dma->readptr = swptr;
+	return 0;
+}
+
+
+static void rme96xx_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+{
+	int i;
+	rme96xx_info *s = (rme96xx_info *)dev_id;
+	struct dmabuf *db;
+	u32 status;
+	unsigned long flags;
+
+	status = readl(s->iobase + RME96xx_status_register);
+	if (!(status & RME96xx_IRQ)) {
+		return;
+	}
+
+	spin_lock_irqsave(&s->lock,flags);
+	writel(0,s->iobase + RME96xx_irq_clear);
+
+	s->hwbufid = (status & RME96xx_buffer_id)>>26;	
+	if ((status & 0xffc0) <= 256) s->hwptr = 0; 
+	for(i=0;i<devices;i++)
+	{
+		db = &(s->dma[i]);
+		if(db->started > 0)
+			wake_up(&(db->wait));		
+	}  
+	spin_unlock_irqrestore(&s->lock,flags);
+}
+
+
+
+/*---------------------------------------------------------------------------- 
+ PCI detection and module initialization stuff 
+ ----------------------------------------------------------------------------*/
+
+void* busmaster_malloc(int size) {
+     int pg; /* 2 s exponent of memory size */
+        char *buf;
+
+        DBG(printk("kernel malloc pages ..\n"));
+        
+        for (pg = 0; PAGE_SIZE * (1 << pg) < size; pg++);
+
+        buf = (char *) __get_free_pages(GFP_KERNEL | GFP_DMA, pg);
+
+        if (buf) {
+                struct page* page, *last_page;
+
+                page = virt_to_page(buf);
+                last_page = virt_to_page(buf + (1 << pg));
+                DBG(printk("setting reserved bit\n"));
+                while (page < last_page) {
+			SetPageReserved(page);
+                        page++;
+                }
+		return buf;
+        }
+	DBG(printk("allocated %ld",(long)buf));
+	return NULL;
+}
+
+void busmaster_free(void* ptr,int size) {
+        int pg;
+	struct page* page, *last_page;
+
+        if (ptr == NULL)
+                return;
+
+        for (pg = 0; PAGE_SIZE * (1 << pg) < size; pg++);
+
+        page = virt_to_page(ptr);
+        last_page = page + (1 << pg);
+        while (page < last_page) {
+		ClearPageReserved(page);
+		page++;
+	}
+	DBG(printk("freeing pages\n"));
+        free_pages((unsigned long) ptr, pg);
+	DBG(printk("done\n"));
+}
+
+/* initialize those parts of the info structure which are not pci detectable resources */
+
+static int rme96xx_dmabuf_init(rme96xx_info * s,struct dmabuf* dma,int ioffset,int ooffset) {
+
+	init_MUTEX(&dma->open_sem);
+	init_waitqueue_head(&dma->open_wait);
+	init_waitqueue_head(&dma->wait);
+	dma->s = s; 
+	dma->error = 0;
+
+	dma->format = AFMT_S32_BLOCKED;
+	dma->formatshift = 0;
+	dma->inchannels = dma->outchannels = 1;
+	dma->inoffset = ioffset;
+	dma->outoffset = ooffset;
+
+	dma->opened=0;
+	dma->started=0;
+	dma->mmapped=0;
+	dma->open_mode=0;
+	dma->mono=0;
+
+	rme96xx_clearbufs(dma);
+	return 0;
+}
+
+
+int rme96xx_init(rme96xx_info* s)
+{
+	int i;
+	DBG(printk(__FUNCTION__"\n"));
+	numcards++;
+
+	s->magic = RME96xx_MAGIC; 
+
+	spin_lock_init(&s->lock);
+
+	COMM            ("setup busmaster memory")
+	s->recbuf = busmaster_malloc(RME96xx_DMA_MAX_SIZE_ALL);
+	s->playbuf = busmaster_malloc(RME96xx_DMA_MAX_SIZE_ALL);
+
+	if (!s->recbuf || !s->playbuf) {
+		printk(KERN_ERR RME_MESS" Unable to allocate busmaster memory\n");
+		return -ENODEV;
+	}
+
+	COMM            ("setting rec and playbuffers")
+
+	writel((u32) virt_to_bus(s->recbuf),s->iobase + RME96xx_rec_buffer);
+  	writel((u32) virt_to_bus(s->playbuf),s->iobase + RME96xx_play_buffer);
+
+	COMM             ("initializing control register")
+	rme96xx_unset_ctrl(s,0xffffffff);
+	rme96xx_set_ctrl(s,RME96xx_ctrl_init);
+
+
+	COMM              ("setup devices")	
+	for (i=0;i < devices;i++) {
+		struct dmabuf * dma = &s->dma[i];
+		rme96xx_dmabuf_init(s,dma,2*i,2*i);
+	}
+
+	s->started = 0;
+	rme96xx_setlatency(s,7);
+
+	printk(KERN_INFO RME_MESS" card %d initialized\n",numcards); 
+	return 0;
+}
+
+
+/* open uses this to figure out which device was opened .. this seems to be 
+   unnecessary complex */
+
+static LIST_HEAD(devs);
+
+static int __devinit rme96xx_probe(struct pci_dev *pcidev, const struct pci_device_id *pciid)
+{
+	int i;
+	rme96xx_info *s;
+
+	DBG(printk(__FUNCTION__"\n"));
+	
+	if (pcidev->irq == 0) 
+		return -1;
+	if (!pci_dma_supported(pcidev, 0xffffffff)) {
+		printk(KERN_WARNING RME_MESS" architecture does not support 32bit PCI busmaster DMA\n");
+		return -1;
+	}
+	if (!(s = kmalloc(sizeof(rme96xx_info), GFP_KERNEL))) {
+		printk(KERN_WARNING RME_MESS" out of memory\n");
+		return -1;
+	}
+	memset(s, 0, sizeof(rme96xx_info));
+
+	s->pcidev = pcidev;
+	s->iobase = ioremap(pci_resource_start(pcidev, 0),RME96xx_IO_EXTENT);
+	s->irq = pcidev->irq;
+
+        DBG(printk("remapped iobase: %lx irq %d\n",(long)s->iobase,s->irq));
+
+	if (pci_enable_device(pcidev))
+		goto err_irq;
+	if (request_irq(s->irq, rme96xx_interrupt, SA_SHIRQ, "es1370", s)) {
+		printk(KERN_ERR RME_MESS" irq %u in use\n", s->irq);
+		goto err_irq;
+	}
+	
+	/* initialize the card */
+
+	i = 0;
+	if (rme96xx_init(s) < 0) {
+		printk(KERN_ERR RME_MESS" initialization failed\n");
+		goto err_devices;
+	}
+	for (i=0;i<devices;i++) {
+		if ((s->dspnum[i] = register_sound_dsp(&rme96xx_audio_fops, -1)) < 0)
+			goto err_devices;
+	}
+
+	if ((s->mixer = register_sound_mixer(&rme96xx_mixer_fops, -1)) < 0)
+		goto err_devices;
+
+	pci_set_drvdata(pcidev, s);
+	pcidev->dma_mask = 0xffffffff; /* ????? */
+	/* put it into driver list */
+	list_add_tail(&s->devs, &devs);
+
+	DBG(printk("initialization successful\n"));
+	return 0;
+
+	/* error handler */
+ err_devices:
+	while (i--) 
+		unregister_sound_dsp(s->dspnum[i]);
+	free_irq(s->irq,s);
+ err_irq:
+	kfree(s);
+	return -1;
+}
+
+
+static void __devinit rme96xx_remove(struct pci_dev *dev)
+{
+	int i;
+	rme96xx_info *s = pci_get_drvdata(dev);
+
+	if (!s) {
+		printk(KERN_ERR"device structure not valid\n");
+		return ;
+	}
+
+	if (s->started) rme96xx_startcard(s,0);
+
+	i = devices;
+	while (i) {
+		i--;
+		unregister_sound_dsp(s->dspnum[i]);
+	}
+	
+	unregister_sound_mixer(s->mixer);
+/*	synchronize_irq(); This call got lost somehow ? */
+        free_irq(s->irq,s);
+	busmaster_free(s->recbuf,RME96xx_DMA_MAX_SIZE_ALL);
+	busmaster_free(s->playbuf,RME96xx_DMA_MAX_SIZE_ALL);
+	kfree(s);
+	pci_set_drvdata(dev, NULL);
+}
+
+
+#ifndef PCI_VENDOR_ID_RME 
+#define PCI_VENDOR_ID_RME 0x10ee
+#endif
+#ifndef PCI_DEVICE_ID_RME9652
+#define PCI_DEVICE_ID_RME9652 0x3fc4
+#endif
+#ifndef PCI_ANY_ID
+#define PCI_ANY_ID 0
+#endif
+
+static struct pci_device_id id_table[] __devinitdata = {
+	{ PCI_VENDOR_ID_RME, PCI_DEVICE_ID_RME9652, PCI_ANY_ID, PCI_ANY_ID, 0, 0 },
+	{ 0, }
+};
+
+MODULE_DEVICE_TABLE(pci, id_table);
+
+static struct pci_driver rme96xx_driver = {
+	name: "rme96xx",
+	id_table: id_table,
+	probe: rme96xx_probe,
+	remove: rme96xx_remove
+};
+
+static int __init init_rme96xx(void)
+{
+  
+	if (!pci_present())   /* No PCI bus in this machine! */
+		return -ENODEV;
+	printk(KERN_INFO RME_MESS" version "RMEVERSION" time " __TIME__ " " __DATE__ "\n");
+	printk(KERN_INFO RME_MESS" reserving %d dsp device(s)\n",devices);
+        numcards = 0;
+	return pci_module_init(&rme96xx_driver);
+}
+
+static void __exit cleanup_rme96xx(void)
+{
+	printk(KERN_INFO RME_MESS" unloading\n");
+	pci_unregister_driver(&rme96xx_driver);
+}
+
+module_init(init_rme96xx);
+module_exit(cleanup_rme96xx);
+
+
+
+
+
+/*-------------------------------------------------------------------------- 
+   Implementation of file operations 
+---------------------------------------------------------------------------*/
+
+#define RME96xx_FMT (AFMT_S16_LE|AFMT_U8|AFMT_S32_BLOCKED)
+
+
+static int rme96xx_ioctl(struct inode *in, struct file *file, 
+						unsigned int cmd, unsigned long arg)
+{
+
+
+	struct dmabuf * dma = (struct dmabuf *)file->private_data; 
+	rme96xx_info *s = dma->s;
+	unsigned long flags;
+        audio_buf_info abinfo;
+        count_info cinfo;
+	int count;
+	int val = 0;
+
+	VALIDATE_STATE(s);
+
+	DBG(printk("ioctl %ud\n",cmd));
+
+	switch (cmd) {
+	case OSS_GETVERSION:
+		return put_user(SOUND_VERSION, (int *)arg);
+
+	case SNDCTL_DSP_SYNC:
+#if 0
+		if (file->f_mode & FMODE_WRITE)
+			return drain_dac2(s, 0/*file->f_flags & O_NONBLOCK*/);
+#endif
+		return 0;
+		
+	case SNDCTL_DSP_SETDUPLEX:
+		return 0;
+
+	case SNDCTL_DSP_GETCAPS:
+		return put_user(DSP_CAP_DUPLEX | DSP_CAP_REALTIME | DSP_CAP_TRIGGER | DSP_CAP_MMAP, (int *)arg);
+		
+        case SNDCTL_DSP_RESET:
+//		rme96xx_clearbufs(dma);
+		return 0;
+
+        case SNDCTL_DSP_SPEED:
+                if (get_user(val, (int *)arg))
+			return -EFAULT;
+		if (val >= 0) {
+/* generally it's not a problem if we change the speed 
+			if (dma->open_mode & (~file->f_mode) & (FMODE_READ|FMODE_WRITE))
+				return -EINVAL;
+*/
+			spin_lock_irqsave(&s->lock, flags);
+
+			switch (val) {
+			case 44100:
+			case 88200:
+				rme96xx_unset_ctrl(s,RME96xx_freq);
+				break;
+			case 48000: 
+			case 96000: 
+				rme96xx_set_ctrl(s,RME96xx_freq);
+				break;
+			default:
+				rme96xx_unset_ctrl(s,RME96xx_freq);
+				val = 44100;
+			}
+			if (val > 50000)
+				rme96xx_set_ctrl(s,RME96xx_DS);
+			else
+				rme96xx_unset_ctrl(s,RME96xx_DS);
+			s->rate = val;
+			spin_unlock_irqrestore(&s->lock, flags);
+		}
+		DBG(printk("speed set to %d\n",val));
+		return put_user(val, (int *)arg);
+		
+        case SNDCTL_DSP_STEREO: /* this plays a mono file on two channels */
+                if (get_user(val, (int *)arg))
+			return -EFAULT;
+		
+		if (!val) {
+			DBG(printk("setting to mono\n")); 
+			dma->mono=1; 
+			dma->inchannels = 1;
+			dma->outchannels = 1;
+		}
+		else {
+			DBG(printk("setting to stereo\n")); 
+			dma->mono = 0;
+			dma->inchannels = 2;
+			dma->outchannels = 2;
+		}
+		return 0;
+        case SNDCTL_DSP_CHANNELS:
+		/* remember to check for resonable offset/channel pairs here */
+                if (get_user(val, (int *)arg))
+			return -EFAULT;
+
+		if (file->f_mode & FMODE_WRITE) { 			
+			if (val > 0 && (dma->outoffset + val) <= RME96xx_CHANNELS_PER_CARD) 
+				dma->outchannels = val;
+			else
+				dma->outchannels = val = 2;
+			DBG(printk("setting to outchannels %d\n",val)); 
+		}
+		if (file->f_mode & FMODE_READ) {
+			if (val > 0 && (dma->inoffset + val) <= RME96xx_CHANNELS_PER_CARD) 
+				dma->inchannels = val;
+			else
+				dma->inchannels = val = 2;
+			DBG(printk("setting to inchannels %d\n",val)); 
+		}
+
+		dma->mono=0;
+
+		return put_user(val, (int *)arg);
+		
+	case SNDCTL_DSP_GETFMTS: /* Returns a mask */
+                return put_user(RME96xx_FMT, (int *)arg);
+		
+	case SNDCTL_DSP_SETFMT: /* Selects ONE fmt*/
+		DBG(printk("setting to format %x\n",val)); 
+		if (get_user(val, (int *)arg))
+			return -EFAULT;
+		if (val != AFMT_QUERY) {
+			if (val & RME96xx_FMT)
+				dma->format = val;
+			switch (dma->format) {
+			case AFMT_S16_LE:
+				dma->formatshift=1;
+				break;
+			case AFMT_S32_BLOCKED:
+				dma->formatshift=0;
+				break;
+			}
+		}
+		return put_user(dma->format, (int *)arg);
+		
+	case SNDCTL_DSP_POST:
+                return 0;
+
+        case SNDCTL_DSP_GETTRIGGER:
+		val = 0;
+#if 0
+		if (file->f_mode & FMODE_READ && s->ctrl & CTRL_ADC_EN) 
+			val |= PCM_ENABLE_INPUT;
+		if (file->f_mode & FMODE_WRITE && s->ctrl & CTRL_DAC2_EN) 
+			val |= PCM_ENABLE_OUTPUT;
+#endif
+		return put_user(val, (int *)arg);
+		
+	case SNDCTL_DSP_SETTRIGGER:
+		if (get_user(val, (int *)arg))
+			return -EFAULT;
+#if 0
+		if (file->f_mode & FMODE_READ) {
+			if (val & PCM_ENABLE_INPUT) {
+				if (!s->dma_adc.ready && (ret = prog_dmabuf_adc(s)))
+					return ret;
+				start_adc(s);
+			} else
+				stop_adc(s);
+		}
+		if (file->f_mode & FMODE_WRITE) {
+			if (val & PCM_ENABLE_OUTPUT) {
+				if (!s->dma_dac2.ready && (ret = prog_dmabuf_dac2(s)))
+					return ret;
+				start_dac2(s);
+			} else
+				stop_dac2(s);
+		}
+#endif
+		return 0;
+
+	case SNDCTL_DSP_GETOSPACE:
+		if (!(file->f_mode & FMODE_WRITE))
+			return -EINVAL;
+
+		val = rme96xx_gethwptr(dma->s,0);
+
+
+		count = rme96xx_getospace(dma,val);
+		if (!s->started) count = s->fragsize*2;
+		abinfo.fragsize =(s->fragsize*dma->outchannels)>>dma->formatshift;
+                abinfo.bytes = (count*dma->outchannels)>>dma->formatshift;
+                abinfo.fragstotal = 2;
+                abinfo.fragments = (count > s->fragsize); 
+
+		return copy_to_user((void *)arg, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
+
+	case SNDCTL_DSP_GETISPACE:
+		if (!(file->f_mode & FMODE_READ))
+			return -EINVAL;
+
+		val = rme96xx_gethwptr(dma->s,0);
+
+		count = rme96xx_getispace(dma,val);
+
+		abinfo.fragsize = (s->fragsize*dma->inchannels)>>dma->formatshift;
+                abinfo.bytes = (count*dma->inchannels)>>dma->formatshift;;
+                abinfo.fragstotal = 2;
+                abinfo.fragments = count > s->fragsize; 
+		return copy_to_user((void *)arg, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
+		
+        case SNDCTL_DSP_NONBLOCK:
+                file->f_flags |= O_NONBLOCK;
+                return 0;
+
+        case SNDCTL_DSP_GETODELAY: /* What shold this exactly do ? , 
+				      ATM it is just abinfo.bytes */
+		if (!(file->f_mode & FMODE_WRITE))
+			return -EINVAL;
+
+		val = rme96xx_gethwptr(dma->s,0);
+		count = val - dma->readptr;
+		if (count < 0)
+			count += s->fragsize<<1;
+
+		return put_user(count, (int *)arg);
+
+
+/* check out how to use mmaped mode (can only be blocked !!!) */
+        case SNDCTL_DSP_GETIPTR:
+		if (!(file->f_mode & FMODE_READ))
+			return -EINVAL;
+		val = rme96xx_gethwptr(dma->s,0);
+		spin_lock_irqsave(&s->lock,flags);
+                cinfo.bytes = s->fragsize<<1;;
+		count = val - dma->readptr;
+		if (count < 0)
+			count += s->fragsize<<1;
+
+                cinfo.blocks = (count > s->fragsize); 
+                cinfo.ptr = val;
+		if (dma->mmapped)
+			dma->readptr &= s->fragsize<<1;
+		spin_unlock_irqrestore(&s->lock,flags);
+
+                return copy_to_user((void *)arg, &cinfo, sizeof(cinfo));
+
+        case SNDCTL_DSP_GETOPTR:
+		if (!(file->f_mode & FMODE_READ))
+			return -EINVAL;
+		val = rme96xx_gethwptr(dma->s,0);
+		spin_lock_irqsave(&s->lock,flags);
+                cinfo.bytes = s->fragsize<<1;;
+		count = val - dma->writeptr;
+		if (count < 0)
+			count += s->fragsize<<1;
+
+                cinfo.blocks = (count > s->fragsize); 
+                cinfo.ptr = val;
+		if (dma->mmapped)
+			dma->writeptr &= s->fragsize<<1;
+		spin_unlock_irqrestore(&s->lock,flags);
+                return copy_to_user((void *)arg, &cinfo, sizeof(cinfo));
+        case SNDCTL_DSP_GETBLKSIZE:
+	     return put_user(s->fragsize, (int *)arg);
+
+        case SNDCTL_DSP_SETFRAGMENT:
+                if (get_user(val, (int *)arg))
+			return -EFAULT;
+		val&=0xffff;
+		val -= 7;
+		if (val < 0) val = 0;
+		if (val > 7) val = 7;
+		rme96xx_setlatency(s,val);
+		return 0;
+
+        case SNDCTL_DSP_SUBDIVIDE:
+#if 0
+		if ((file->f_mode & FMODE_READ && s->dma_adc.subdivision) ||
+		    (file->f_mode & FMODE_WRITE && s->dma_dac2.subdivision))
+			return -EINVAL;
+                if (get_user(val, (int *)arg))
+			return -EFAULT;
+		if (val != 1 && val != 2 && val != 4)
+			return -EINVAL;
+		if (file->f_mode & FMODE_READ)
+			s->dma_adc.subdivision = val;
+		if (file->f_mode & FMODE_WRITE)
+			s->dma_dac2.subdivision = val;
+#endif		
+		return 0;
+
+        case SOUND_PCM_READ_RATE:
+		return put_user(s->rate, (int *)arg);
+
+        case SOUND_PCM_READ_CHANNELS:
+		return put_user(dma->outchannels, (int *)arg);
+
+        case SOUND_PCM_READ_BITS:
+		switch (dma->format) {
+			case AFMT_S32_BLOCKED:
+				val = 32;
+				break;
+			case AFMT_S16_LE:
+				val = 16;
+				break;
+		}
+		return put_user(val, (int *)arg);
+
+        case SOUND_PCM_WRITE_FILTER:
+        case SNDCTL_DSP_SETSYNCRO:
+        case SOUND_PCM_READ_FILTER:
+                return -EINVAL;
+		
+	}
+
+
+	return -ENODEV;
+}
+
+
+
+static int rme96xx_open(struct inode *in, struct file *f)
+{
+	int minor = MINOR(in->i_rdev);
+	struct list_head *list;
+	int devnum = ((minor-3)/16) % devices; /* default = 0 */
+	rme96xx_info *s;
+	struct dmabuf* dma;
+	DECLARE_WAITQUEUE(wait, current); 
+
+	DBG(printk("device num %d open\n",devnum));
+
+/* ??? */
+	for (list = devs.next; ; list = list->next) {
+		if (list == &devs)
+			return -ENODEV;
+		s = list_entry(list, rme96xx_info, devs);
+		if (!((s->dspnum[devnum] ^ minor) & ~0xf)) 
+			break;
+	}
+       	VALIDATE_STATE(s);
+/* ??? */
+
+	dma = &s->dma[devnum];
+	f->private_data = dma;
+	/* wait for device to become free */
+	down(&s->dma[devnum].open_sem);
+	while (dma->open_mode & f->f_mode) {
+		if (f->f_flags & O_NONBLOCK) {
+			up(&dma->open_sem);
+			return -EBUSY;
+		}
+		add_wait_queue(&dma->open_wait, &wait);
+		__set_current_state(TASK_INTERRUPTIBLE);
+		up(&dma->open_sem);
+		schedule();
+		remove_wait_queue(&dma->open_wait, &wait);
+		set_current_state(TASK_RUNNING);
+		if (signal_pending(current))
+			return -ERESTARTSYS;
+		down(&dma->open_sem);
+	}
+
+	COMM                ("hardware open")
+
+	if (!s->dma[devnum].opened) rme96xx_dmabuf_init(dma->s,dma,dma->inoffset,dma->outoffset);
+
+	s->dma[devnum].open_mode |= (f->f_mode & (FMODE_READ | FMODE_WRITE));
+	s->dma[devnum].opened = 1;
+	up(&s->dma[devnum].open_sem);
+
+	DBG(printk("device num %d open finished\n",devnum));
+	return 0;
+}
+
+static int rme96xx_release(struct inode *in, struct file *file)
+{
+	struct dmabuf * dma = (struct dmabuf*) file->private_data;
+	int hwp;
+	DBG(printk(__FUNCTION__"\n"));
+
+	COMM          ("draining")
+	if (dma->open_mode & FMODE_WRITE) {
+#if 0 /* Why doesn't this work with some cards ?? */
+	     hwp = rme96xx_gethwptr(dma->s,0);
+	     while (rme96xx_getospace(dma,hwp)) {
+		  interruptible_sleep_on(&(dma->wait));
+		  hwp = rme96xx_gethwptr(dma->s,0);
+	     }
+#endif
+	     rme96xx_clearbufs(dma);
+	}
+
+	dma->open_mode &= (~file->f_mode) & (FMODE_READ|FMODE_WRITE);
+
+	if (!(dma->open_mode & (FMODE_READ|FMODE_WRITE))) {
+	     dma->opened = 0;
+	     if (dma->s->started) rme96xx_startcard(dma->s,1);
+	}
+
+	wake_up(&dma->open_wait);
+	up(&dma->open_sem);
+
+	return 0;
+}
+
+
+static ssize_t rme96xx_write(struct file *file, const char *buffer, 
+									  size_t count, loff_t *ppos)
+{
+	struct dmabuf *dma = (struct dmabuf *)file->private_data;
+	ssize_t ret = 0;
+	int cnt; /* number of bytes from "buffer" that will/can be used */
+	int hop = count/dma->outchannels;
+	int hwp;
+	int exact = (file->f_flags & O_NONBLOCK); 
+
+
+	if(dma == NULL || (dma->s) == NULL) 
+		return -ENXIO;
+
+	if (ppos != &file->f_pos)
+		return -ESPIPE;
+
+	if (dma->mmapped || !dma->opened)
+		return -ENXIO;
+
+	if (!access_ok(VERIFY_READ, buffer, count))
+		return -EFAULT;
+
+	if (! (dma->open_mode  & FMODE_WRITE))
+                return -ENXIO;
+
+	if (!dma->s->started) rme96xx_startcard(dma->s,exact);
+	hwp = rme96xx_gethwptr(dma->s,0);
+
+	if(!(dma->started)){		 
+		COMM          ("first write")
+			
+		dma->readptr = hwp;
+		dma->writeptr = hwp;
+		dma->started = 1;
+		COMM          ("first write done")
+	}
+
+  	while (count > 0) {
+		cnt = rme96xx_getospace(dma,hwp);		
+		cnt>>=dma->formatshift;
+		cnt*=dma->outchannels;
+		if (cnt > count)
+			cnt = count;
+
+		if (cnt != 0) {
+		        if (rme96xx_copyfromuser(dma,buffer,cnt,hop))
+				return ret ? ret : -EFAULT;
+			count -= cnt;
+			buffer += cnt;
+			ret += cnt;
+			if (count == 0) return ret;
+		}
+		if (file->f_flags & O_NONBLOCK)
+			return ret ? ret : -EAGAIN;
+		
+		if ((hwp - dma->writeptr) <= 0) {
+			interruptible_sleep_on(&(dma->wait));
+			
+			if (signal_pending(current))
+				return ret ? ret : -ERESTARTSYS;
+		}			
+
+		hwp = rme96xx_gethwptr(dma->s,exact);
+
+	}; /* count > 0 */
+
+	return ret;
+}
+
+static ssize_t rme96xx_read(struct file *file, char *buffer,size_t count, loff_t *ppos)
+{ 
+	struct dmabuf *dma = (struct dmabuf *)file->private_data;
+	ssize_t ret = 0;
+	int cnt;
+	int hop = count/dma->inchannels;
+	int hwp;
+	int exact = (file->f_flags & O_NONBLOCK); 
+
+
+	if(dma == NULL || (dma->s) == NULL) 
+		return -ENXIO;
+
+	if (ppos != &file->f_pos)
+		return -ESPIPE;
+
+	if (dma->mmapped || !dma->opened)
+		return -ENXIO;
+
+	if (!access_ok(VERIFY_WRITE, buffer, count))
+		return -EFAULT;
+
+	if (! (dma->open_mode  & FMODE_READ))
+                return -ENXIO;
+
+	if (count > ((dma->s->fragsize*dma->inchannels)>>dma->formatshift))
+	    return -EFAULT;
+
+	if (!dma->s->started) rme96xx_startcard(dma->s,exact);
+	hwp = rme96xx_gethwptr(dma->s,0);
+
+	if(!(dma->started)){		 
+		COMM          ("first read")
+		     
+		dma->writeptr = hwp;
+		dma->readptr = hwp;
+		dma->started = 1;
+	}
+
+  	while (count > 0) {
+		cnt = rme96xx_getispace(dma,hwp);		
+		cnt>>=dma->formatshift;
+		cnt*=dma->inchannels;
+
+		if (cnt > count)
+			cnt = count;
+
+		if (cnt != 0) {
+		        
+			if (rme96xx_copytouser(dma,buffer,cnt,hop))
+				return ret ? ret : -EFAULT;
+			
+			count -= cnt;
+			buffer += cnt;
+			ret += cnt;
+			if (count == 0) return ret;
+		}
+		if (file->f_flags & O_NONBLOCK)
+			return ret ? ret : -EAGAIN;
+		
+		if ((hwp - dma->readptr) <= 0) {
+			interruptible_sleep_on(&(dma->wait));
+			
+			if (signal_pending(current))
+				return ret ? ret : -ERESTARTSYS;
+		}			
+		hwp = rme96xx_gethwptr(dma->s,exact);
+
+	}; /* count > 0 */
+
+	return ret;
+}
+
+static int rm96xx_mmap(struct file *file, struct vm_area_struct *vma) {
+	struct dmabuf *dma = (struct dmabuf *)file->private_data;
+	rme96xx_info* s = dma->s;
+	unsigned long size;
+
+	VALIDATE_STATE(s);
+	lock_kernel();
+
+	if (vma->vm_pgoff != 0) {
+		unlock_kernel();
+		return -EINVAL;
+	}
+	size = vma->vm_end - vma->vm_start;
+	if (size > RME96xx_DMA_MAX_SIZE) {
+		unlock_kernel();
+		return -EINVAL;
+	}
+
+
+	if (vma->vm_flags & VM_WRITE) {
+		if (!s->started) rme96xx_startcard(s,1);
+
+		if (remap_page_range(vma->vm_start, virt_to_phys(s->playbuf + dma->outoffset*RME96xx_DMA_MAX_SIZE), size, vma->vm_page_prot)) {
+			unlock_kernel();
+			return -EAGAIN;
+		}
+	} 
+	else if (vma->vm_flags & VM_READ) {
+		if (!s->started) rme96xx_startcard(s,1);
+		if (remap_page_range(vma->vm_start, virt_to_phys(s->playbuf + dma->inoffset*RME96xx_DMA_MAX_SIZE), size, vma->vm_page_prot)) {
+			unlock_kernel();
+			return -EAGAIN;
+		}
+	} else  {
+		unlock_kernel();
+		return -EINVAL;
+	}
+
+
+/* this is the mapping */
+
+	dma->mmapped = 1;
+	unlock_kernel();
+	return 0;
+}
+
+static unsigned int rme96xx_poll(struct file *file, struct poll_table_struct *wait)
+{
+	struct dmabuf *dma = (struct dmabuf *)file->private_data;
+	rme96xx_info* s = dma->s;
+	unsigned int mask = 0;
+	unsigned int hwp,cnt;
+
+        DBG(printk("rme96xx poll_wait ...\n"));
+	VALIDATE_STATE(s);
+
+	if (!s->started) {
+		  mask |= POLLOUT | POLLWRNORM;
+	}
+	poll_wait(file, &dma->wait, wait);
+
+	hwp = rme96xx_gethwptr(dma->s,0);
+
+        DBG(printk("rme96xx poll: ..cnt %d > %d\n",cnt,s->fragsize));	
+
+	cnt = rme96xx_getispace(dma,hwp);
+
+	if (file->f_mode & FMODE_READ) 
+	     if (cnt > 0)
+		  mask |= POLLIN | POLLRDNORM;
+
+
+
+	cnt = rme96xx_getospace(dma,hwp);
+
+	if (file->f_mode & FMODE_WRITE) 
+	     if (cnt > 0)
+		  mask |= POLLOUT | POLLWRNORM;
+
+
+//        printk("rme96xx poll_wait ...%d > %d\n",rme96xx_getospace(dma,hwp),rme96xx_getispace(dma,hwp));
+
+	return mask;
+}
+
+
+static struct file_operations rme96xx_audio_fops = {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
+	owner: THIS_MODULE,
+#endif
+	read: rme96xx_read,
+	write: rme96xx_write,
+	poll: rme96xx_poll,
+	ioctl: rme96xx_ioctl,  
+	mmap: rm96xx_mmap,
+	open: rme96xx_open,  
+	release: rme96xx_release 
+};
+
+static int rme96xx_mixer_open(struct inode *inode, struct file *file)
+{
+	int minor = MINOR(inode->i_rdev);
+	struct list_head *list;
+	rme96xx_info *s;
+
+	COMM  ("mixer open");
+
+	for (list = devs.next; ; list = list->next) {
+		if (list == &devs)
+			return -ENODEV;
+		s = list_entry(list, rme96xx_info, devs);
+		if (s->mixer== minor)
+			break;
+	}
+       	VALIDATE_STATE(s);
+	file->private_data = s;
+
+	COMM                       ("mixer opened")
+	return 0;
+}
+
+static int rme96xx_mixer_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
+{
+	rme96xx_info *s = (rme96xx_info *)file->private_data;
+	u32 status;
+
+	status = readl(s->iobase + RME96xx_status_register);
+
+	VALIDATE_STATE(s);
+	if (cmd == SOUND_MIXER_PRIVATE1) {
+		rme_mixer mixer;
+		copy_from_user(&mixer,(void*)arg,sizeof(mixer));
+		
+		if (file->f_mode & FMODE_WRITE) {
+		     s->dma[mixer.devnr].outoffset = mixer.o_offset;
+		     s->dma[mixer.devnr].inoffset = mixer.i_offset;
+		}
+
+		mixer.o_offset = s->dma[mixer.devnr].outoffset;
+		mixer.i_offset = s->dma[mixer.devnr].inoffset;
+
+		return copy_to_user((void *)arg, &mixer, sizeof(mixer)) ? -EFAULT : 0;
+	}
+	if (cmd == SOUND_MIXER_PRIVATE2) {
+		return put_user(status, (int *)arg);
+	}
+	if (cmd == SOUND_MIXER_PRIVATE3) {
+	     u32 control;
+	     copy_from_user(&control,(void*)arg,sizeof(control)); 
+	     if (file->f_mode & FMODE_WRITE) {
+		  s->control_register = control;
+		  writel(control,s->iobase + RME96xx_control_register);
+	     }
+
+	     return put_user(s->control_register, (int *)arg);
+	}
+	return -1;
+}
+
+
+
+static int rme96xx_mixer_release(struct inode *inode, struct file *file)
+{
+	return 0;
+}
+
+static /*const*/ struct file_operations rme96xx_mixer_fops = {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
+	owner: THIS_MODULE,
+#endif
+	ioctl:		rme96xx_mixer_ioctl,
+	open:		rme96xx_mixer_open,
+	release:	rme96xx_mixer_release,
+};
diff -u --recursive --new-file v2.4.8/linux/drivers/sound/rme96xx.h linux/drivers/sound/rme96xx.h
--- v2.4.8/linux/drivers/sound/rme96xx.h	Wed Dec 31 16:00:00 1969
+++ linux/drivers/sound/rme96xx.h	Sun Aug 12 10:51:42 2001
@@ -0,0 +1,61 @@
+/* (C) 2000 Guenter Geiger <geiger@debian.org>
+   with copy/pastes from the driver of Winfried Ritsch <ritsch@iem.kug.ac.at>
+*/
+
+
+#ifndef AFMT_S32_BLOCKED
+#define AFMT_S32_BLOCKED 0x0000400
+#endif
+
+#ifndef AFMT_S16_BLOCKED 
+#define AFMT_S16_BLOCKED 0x0000800
+#endif
+
+
+typedef struct rme_status {
+     unsigned int irq:1;    /* high or low */
+     unsigned int lockmask:3;  /* ADAT1, ADAT2, ADAT3 */
+     unsigned int sr48:1;   /* current sample rate */
+     unsigned int wclock:1; /* wordclock used ? */
+     unsigned int bufpoint:10;
+
+     unsigned int syncmask:3;  /* ADAT1, ADAT2, ADAT3 */
+     unsigned int doublespeed:1;
+     unsigned int tc_busy:1;
+     unsigned int tc_out:1;
+     unsigned int crystalrate:3;
+     unsigned int spdif_error:1;
+     unsigned int bufid:1;
+     unsigned int tc_valid:1;     
+} rme_status_t;
+
+
+typedef struct rme_control {
+     unsigned int start:1;
+     unsigned int latency:3;
+
+     unsigned int master:1;
+     unsigned int ie:1;
+     unsigned int sr48:1;
+     unsigned int spare:1;
+
+     unsigned int doublespeed:1;
+     unsigned int pro:1;
+     unsigned int emphasis:1;
+     unsigned int dolby:1;
+
+     unsigned int opt_out:1;
+     unsigned int wordclock:1;
+     unsigned int spdif_in:2;
+
+     unsigned int sync_ref:2;
+} rme_ctrl_t;
+
+
+typedef struct _rme_mixer {
+     int i_offset;
+     int o_offset;
+     int devnr;
+     int spare[8];
+} rme_mixer;
+
diff -u --recursive --new-file v2.4.8/linux/drivers/sound/sonicvibes.c linux/drivers/sound/sonicvibes.c
--- v2.4.8/linux/drivers/sound/sonicvibes.c	Sun May 20 12:11:39 2001
+++ linux/drivers/sound/sonicvibes.c	Sun Aug 12 10:51:42 2001
@@ -92,6 +92,8 @@
  *                       Tjeerd Mulder <tjeerd.mulder@fujitsu-siemens.com>
  *    31.01.2001   0.29  Register/Unregister gameport
  *                       Fix SETTRIGGER non OSS API conformity
+ *    18.05.2001   0.30  PCI probing and error values cleaned up by Marcus
+ *                       Meissner <mm@caldera.de>
  *
  */
 
@@ -388,7 +390,7 @@
 
 /* --------------------------------------------------------------------- */
 
-extern __inline__ unsigned ld2(unsigned int x)
+static inline unsigned ld2(unsigned int x)
 {
 	unsigned r = 0;
 	
@@ -422,7 +424,7 @@
 #undef hweight32
 #endif
 
-extern __inline__ unsigned int hweight32(unsigned int w)
+static inline unsigned int hweight32(unsigned int w)
 {
         unsigned int res = (w & 0x55555555) + ((w >> 1) & 0x55555555);
         res = (res & 0x33333333) + ((res >> 2) & 0x33333333);
@@ -477,7 +479,7 @@
 	outb(0x14, s->iodmac + SV_DMA_MODE);
 }
 
-extern __inline__ unsigned get_dmaa(struct sv_state *s)
+static inline unsigned get_dmaa(struct sv_state *s)
 {
 #ifdef DMABYTEIO
 	unsigned io = s->iodmaa+6, v = 0, u;
@@ -492,7 +494,7 @@
 #endif /* DMABYTEIO */
 }
 
-extern __inline__ unsigned get_dmac(struct sv_state *s)
+static inline unsigned get_dmac(struct sv_state *s)
 {
 #ifdef DMABYTEIO
 	unsigned io = s->iodmac+6, v = 0, u;
@@ -663,7 +665,7 @@
 
 /* --------------------------------------------------------------------- */
 
-extern inline void stop_adc(struct sv_state *s)
+static inline void stop_adc(struct sv_state *s)
 {
 	unsigned long flags;
 
@@ -673,7 +675,7 @@
 	spin_unlock_irqrestore(&s->lock, flags);
 }	
 
-extern inline void stop_dac(struct sv_state *s)
+static inline void stop_dac(struct sv_state *s)
 {
 	unsigned long flags;
 
@@ -815,7 +817,7 @@
 	return 0;
 }
 
-extern __inline__ void clear_advance(struct sv_state *s)
+static inline void clear_advance(struct sv_state *s)
 {
 	unsigned char c = (s->fmt & (SV_CFMT_16BIT << SV_CFMT_ASHIFT)) ? 0 : 0x80;
 	unsigned char *buf = s->dma_dac.rawbuf;
@@ -1246,13 +1248,6 @@
 
 /* --------------------------------------------------------------------- */
 
-static loff_t sv_llseek(struct file *file, loff_t offset, int origin)
-{
-	return -ESPIPE;
-}
-
-/* --------------------------------------------------------------------- */
-
 static int sv_open_mixdev(struct inode *inode, struct file *file)
 {
 	int minor = MINOR(inode->i_rdev);
@@ -1286,7 +1281,7 @@
 
 static /*const*/ struct file_operations sv_mixer_fops = {
 	owner:		THIS_MODULE,
-	llseek:		sv_llseek,
+	llseek:		no_llseek,
 	ioctl:		sv_ioctl_mixdev,
 	open:		sv_open_mixdev,
 	release:	sv_release_mixdev,
@@ -1993,7 +1988,7 @@
 
 static /*const*/ struct file_operations sv_audio_fops = {
 	owner:		THIS_MODULE,
-	llseek:		sv_llseek,
+	llseek:		no_llseek,
 	read:		sv_read,
 	write:		sv_write,
 	poll:		sv_poll,
@@ -2275,7 +2270,7 @@
 
 static /*const*/ struct file_operations sv_midi_fops = {
 	owner:		THIS_MODULE,
-	llseek:		sv_llseek,
+	llseek:		no_llseek,
 	read:		sv_midi_read,
 	write:		sv_midi_write,
 	poll:		sv_midi_poll,
@@ -2450,7 +2445,7 @@
 
 static /*const*/ struct file_operations sv_dmfm_fops = {
 	owner:		THIS_MODULE,
-	llseek:		sv_llseek,
+	llseek:		no_llseek,
 	ioctl:		sv_dmfm_ioctl,
 	open:		sv_dmfm_open,
 	release:	sv_dmfm_release,
@@ -2504,21 +2499,24 @@
 	static const char __initdata sv_ddma_name[] = "S3 Inc. SonicVibes DDMA Controller";
        	struct sv_state *s;
 	mm_segment_t fs;
-	int i, val;
+	int i, val, ret;
 	char *ddmaname;
 	unsigned ddmanamelen;
 
+	if ((ret=pci_enable_device(pcidev)))
+		return ret;
+
 	if (!RSRCISIOREGION(pcidev, RESOURCE_SB) ||
 	    !RSRCISIOREGION(pcidev, RESOURCE_ENH) ||
 	    !RSRCISIOREGION(pcidev, RESOURCE_SYNTH) ||
 	    !RSRCISIOREGION(pcidev, RESOURCE_MIDI) ||
 	    !RSRCISIOREGION(pcidev, RESOURCE_GAME))
-		return -1;
+		return -ENODEV;
 	if (pcidev->irq == 0)
-		return -1;
+		return -ENODEV;
 	if (pci_set_dma_mask(pcidev, 0x00ffffff)) {
 		printk(KERN_WARNING "sonicvibes: architecture does not support 24bit PCI busmaster DMA\n");
-		return -1;
+		return -ENODEV;
 	}
 	/* try to allocate a DDMA resource if not already available */
 	if (!RSRCISIOREGION(pcidev, RESOURCE_DDMA)) {
@@ -2534,12 +2532,12 @@
 			pcidev->resource[RESOURCE_DDMA].name = NULL;
 			kfree(ddmaname);
 			printk(KERN_ERR "sv: cannot allocate DDMA controller io ports\n");
-			return -1;
+			return -EBUSY;
 		}
 	}
 	if (!(s = kmalloc(sizeof(struct sv_state), GFP_KERNEL))) {
 		printk(KERN_WARNING "sv: out of memory\n");
-		return -1;
+		return -ENOMEM;
 	}
 	memset(s, 0, sizeof(struct sv_state));
 	init_waitqueue_head(&s->dma_adc.wait);
@@ -2558,7 +2556,6 @@
 	s->iodmaa = pci_resource_start(pcidev, RESOURCE_DDMA);
 	s->iodmac = pci_resource_start(pcidev, RESOURCE_DDMA) + SV_EXTENT_DMA;
 	s->gameport.io = pci_resource_start(pcidev, RESOURCE_GAME);
-	s->gameport.size = pci_resource_len(pcidev,RESOURCE_GAME);
 	pci_write_config_dword(pcidev, 0x40, s->iodmaa | 9);  /* enable and use extended mode */
 	pci_write_config_dword(pcidev, 0x48, s->iodmac | 9);  /* enable */
 	printk(KERN_DEBUG "sv: io ports: %#lx %#lx %#lx %#lx %#x %#x %#x\n",
@@ -2567,7 +2564,8 @@
 	
 	/* hack */
 	pci_write_config_dword(pcidev, 0x60, wavetable_mem >> 12);  /* wavetable base address */
-	
+
+	ret = -EBUSY;
 	if (!request_region(s->ioenh, SV_EXTENT_ENH, "S3 SonicVibes PCM")) {
 		printk(KERN_ERR "sv: io ports %#lx-%#lx in use\n", s->ioenh, s->ioenh+SV_EXTENT_ENH-1);
 		goto err_region5;
@@ -2588,14 +2586,10 @@
 		printk(KERN_ERR "sv: io ports %#lx-%#lx in use\n", s->iosynth, s->iosynth+SV_EXTENT_SYNTH-1);
 		goto err_region1;
 	}
-	if (!s->gameport.size)
-		s->gameport.io = 0;
-	if (s->gameport.io && !request_region(s->gameport.io, s->gameport.size, "ESS Solo1")) {
+	if (s->gameport.io && !request_region(s->gameport.io, SV_EXTENT_GAME, "ESS Solo1")) {
 		printk(KERN_ERR "sv: gameport io ports in use\n");
-		s->gameport.io = s->gameport.size = 0;
+		s->gameport.io = 0;
 	}
-	if (pci_enable_device(pcidev))
-		goto err_irq;
 	/* initialize codec registers */
 	outb(0x80, s->ioenh + SV_CODEC_CONTROL); /* assert reset */
 	udelay(50);
@@ -2619,21 +2613,29 @@
 	wrindir(s, SV_CIPCMSR1, ((8000 * 65536 / FULLRATE) >> 8) & 0xff);
 	wrindir(s, SV_CIADCOUTPUT, 0);
 	/* request irq */
-	if (request_irq(s->irq, sv_interrupt, SA_SHIRQ, "S3 SonicVibes", s)) {
+	if ((ret=request_irq(s->irq,sv_interrupt,SA_SHIRQ,"S3 SonicVibes",s))) {
 		printk(KERN_ERR "sv: irq %u in use\n", s->irq);
 		goto err_irq;
 	}
 	printk(KERN_INFO "sv: found adapter at io %#lx irq %u dmaa %#06x dmac %#06x revision %u\n",
 	       s->ioenh, s->irq, s->iodmaa, s->iodmac, rdindir(s, SV_CIREVISION));
 	/* register devices */
-	if ((s->dev_audio = register_sound_dsp(&sv_audio_fops, -1)) < 0)
+	if ((s->dev_audio = register_sound_dsp(&sv_audio_fops, -1)) < 0) {
+		ret = s->dev_audio;
 		goto err_dev1;
-	if ((s->dev_mixer = register_sound_mixer(&sv_mixer_fops, -1)) < 0)
+	}
+	if ((s->dev_mixer = register_sound_mixer(&sv_mixer_fops, -1)) < 0) {
+		ret = s->dev_mixer;
 		goto err_dev2;
-	if ((s->dev_midi = register_sound_midi(&sv_midi_fops, -1)) < 0)
+	}
+	if ((s->dev_midi = register_sound_midi(&sv_midi_fops, -1)) < 0) {
+		ret = s->dev_midi;
 		goto err_dev3;
-	if ((s->dev_dmfm = register_sound_special(&sv_dmfm_fops, 15 /* ?? */)) < 0)
+	}
+	if ((s->dev_dmfm = register_sound_special(&sv_dmfm_fops, 15 /* ?? */)) < 0) {
+		ret = s->dev_dmfm;
 		goto err_dev4;
+	}
 	pci_set_master(pcidev);  /* enable bus mastering */
 	/* initialize the chips */
 	fs = get_fs();
@@ -2667,7 +2669,7 @@
 	free_irq(s->irq, s);
  err_irq:
 	if (s->gameport.io)
-		release_region(s->gameport.io, s->gameport.size);
+		release_region(s->gameport.io, SV_EXTENT_GAME);
 	release_region(s->iosynth, SV_EXTENT_SYNTH);
  err_region1:
 	release_region(s->iomidi, SV_EXTENT_MIDI);
@@ -2679,7 +2681,7 @@
 	release_region(s->ioenh, SV_EXTENT_ENH);
  err_region5:
 	kfree(s);
-	return -1;
+	return ret;
 }
 
 static void __devinit sv_remove(struct pci_dev *dev)
@@ -2698,7 +2700,7 @@
 	free_irq(s->irq, s);
 	if (s->gameport.io) {
 		gameport_unregister_port(&s->gameport);
-		release_region(s->gameport.io, s->gameport.size);
+		release_region(s->gameport.io, SV_EXTENT_GAME);
 	}
 	release_region(s->iodmac, SV_EXTENT_DMA);
 	release_region(s->iodmaa, SV_EXTENT_DMA);
@@ -2731,7 +2733,7 @@
 {
 	if (!pci_present())   /* No PCI bus in this machine! */
 		return -ENODEV;
-	printk(KERN_INFO "sv: version v0.29 time " __TIME__ " " __DATE__ "\n");
+	printk(KERN_INFO "sv: version v0.30 time " __TIME__ " " __DATE__ "\n");
 #if 0
 	if (!(wavetable_mem = __get_free_pages(GFP_KERNEL, 20-PAGE_SHIFT)))
 		printk(KERN_INFO "sv: cannot allocate 1MB of contiguous nonpageable memory for wavetable data\n");
diff -u --recursive --new-file v2.4.8/linux/drivers/sound/soundcard.c linux/drivers/sound/soundcard.c
--- v2.4.8/linux/drivers/sound/soundcard.c	Fri Feb  9 11:30:23 2001
+++ linux/drivers/sound/soundcard.c	Sun Aug 12 10:51:42 2001
@@ -202,11 +202,6 @@
 	return ret;
 }
 
-static long long sound_lseek(struct file *file, long long offset, int orig)
-{
-	return -ESPIPE;
-}
-
 static int sound_open(struct inode *inode, struct file *file)
 {
 	int dev = MINOR(inode->i_rdev);
@@ -499,7 +494,7 @@
 
 struct file_operations oss_sound_fops = {
 	owner:		THIS_MODULE,
-	llseek:		sound_lseek,
+	llseek:		no_llseek,
 	read:		sound_read,
 	write:		sound_write,
 	poll:		sound_poll,
diff -u --recursive --new-file v2.4.8/linux/drivers/sound/trident.c linux/drivers/sound/trident.c
--- v2.4.8/linux/drivers/sound/trident.c	Wed Jul 25 17:10:23 2001
+++ linux/drivers/sound/trident.c	Sun Aug 12 10:51:42 2001
@@ -31,6 +31,17 @@
  *	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  *  History
+ *  v0.14.9b
+ *	Switch to static inline not extern inline (gcc 3)
+ *  v0.14.9a
+ *	Aug 6 2001 Alan Cox
+ *	0.14.9 crashed on rmmod due to a timer/bh left running. Simplified
+ *	the existing logic (the BH doesnt help as ac97 is lock_irqsave)
+ *	and used del_timer_sync to clean up
+ *	Fixed a problem where the ALi change broke my generic card
+ *  v0.14.9
+ *	Jul 10 2001 Matt Wu
+ *	Add H/W Volume Control
  *  v0.14.8a
  *	July 7 2001 Alan Cox
  *	Moved Matt Wu's ac97 register cache into the card structure
@@ -146,6 +157,7 @@
 #include <asm/hardirq.h>
 #include <linux/bitops.h>
 #include <linux/proc_fs.h>
+#include <linux/interrupt.h>
 
 #if defined CONFIG_ALPHA_NAUTILUS || CONFIG_ALPHA_GENERIC
 #include <asm/hwrpb.h>
@@ -155,7 +167,7 @@
 
 #include <linux/pm.h>
 
-#define DRIVER_VERSION "0.14.8"
+#define DRIVER_VERSION "0.14.9b"
 
 /* magic numbers to protect our data structures */
 #define TRIDENT_CARD_MAGIC	0x5072696E /* "Prin" */
@@ -348,6 +360,10 @@
 	int rec_channel_use_count;
 	u16 mixer_regs[64][NR_AC97];	/* Made card local by Alan */
 	int mixer_regs_ready;
+
+	/* Added for hardware volume control */
+	int hwvolctl;
+	struct timer_list timer;
 };
 
 /* table to map from CHANNELMASK to channel attribute for SiS 7018 */
@@ -379,7 +395,6 @@
 static int trident_open_mixdev(struct inode *inode, struct file *file);
 static int trident_ioctl_mixdev(struct inode *inode, struct file *file, unsigned int cmd,
 				unsigned long arg);
-static loff_t trident_llseek(struct file *file, loff_t offset, int origin);
 
 static void ali_ac97_set(struct trident_card *card, int secondary, u8 reg, u16 val);
 static u16 ali_ac97_get(struct trident_card *card, int secondary, u8 reg);
@@ -890,7 +905,7 @@
 
 /* get current playback/recording dma buffer pointer (byte offset from LBA),
    called with spinlock held! */
-extern __inline__ unsigned trident_get_dma_addr(struct trident_state *state)
+static inline unsigned trident_get_dma_addr(struct trident_state *state)
 {
 	struct dmabuf *dmabuf = &state->dmabuf;
 	u32 cso;
@@ -928,7 +943,7 @@
 }
 
 /* Stop recording (lock held) */
-extern __inline__ void __stop_adc(struct trident_state *state)
+static inline void __stop_adc(struct trident_state *state)
 {
 	struct dmabuf *dmabuf = &state->dmabuf;
 	unsigned int chan_num = dmabuf->channel->num;
@@ -966,7 +981,7 @@
 }
 
 /* stop playback (lock held) */
-extern __inline__ void __stop_dac(struct trident_state *state)
+static inline void __stop_dac(struct trident_state *state)
 {
 	struct dmabuf *dmabuf = &state->dmabuf;
 	unsigned int chan_num = dmabuf->channel->num;
@@ -1415,10 +1430,109 @@
 	}
 }
 
+static void ali_hwvol_control(struct trident_card *card, int opt)
+{
+	u16 dwTemp, volume[2], mute, diff, *pVol[2];
+
+	dwTemp = ali_ac97_read(card->ac97_codec[0], 0x02);
+	mute = dwTemp & 0x8000;
+	volume[0] = dwTemp & 0x001f;
+	volume[1] = (dwTemp & 0x1f00) >> 8;
+	if (volume[0] < volume [1]) {
+		pVol[0] = &volume[0];
+		pVol[1] = &volume[1];
+	} else {
+		pVol[1] = &volume[0];
+		pVol[0] = &volume[1];
+	}
+	diff = *(pVol[1]) - *(pVol[0]);
+
+	if (opt == 1) {                     // MUTE
+		dwTemp ^= 0x8000;
+		ali_ac97_write(card->ac97_codec[0], 0x02, dwTemp);
+	} else if (opt == 2) {   // Down
+		if (mute)
+			return;
+		if (*(pVol[1]) < 0x001f) {
+			(*pVol[1])++;
+			*(pVol[0]) = *(pVol[1]) - diff;
+		}
+		dwTemp &= 0xe0e0;
+		dwTemp |= (volume[0]) | (volume[1] << 8);
+		ali_ac97_write(card->ac97_codec[0], 0x02, dwTemp);
+		card->ac97_codec[0]->mixer_state[0] = ((32-volume[0])*25/8) | (((32-volume[1])*25/8) << 8);
+	} else if (opt == 4) {   // Up
+		if (mute)
+			return;
+		if (*(pVol[0]) >0) {
+			(*pVol[0])--;
+			*(pVol[1]) = *(pVol[0]) + diff;
+		}
+		dwTemp &= 0xe0e0;
+		dwTemp |= (volume[0]) | (volume[1] << 8);
+		ali_ac97_write(card->ac97_codec[0], 0x02, dwTemp);
+		card->ac97_codec[0]->mixer_state[0] = ((32-volume[0])*25/8) | (((32-volume[1])*25/8) << 8);
+	} 
+	else 
+	{
+		/* Nothing needs doing */
+	}
+}
+
+/*
+ *	Re-enable reporting of vol change after 0.1 seconds
+ */
+
+static void ali_timeout(unsigned long ptr)
+{
+	struct trident_card *card = (struct trident_card *)ptr;
+	u16 temp = 0;
+
+	/* Enable GPIO IRQ (MISCINT bit 18h)*/
+	temp = inw(TRID_REG(card, T4D_MISCINT + 2));
+	temp |= 0x0004;
+	outw(temp, TRID_REG(card, T4D_MISCINT + 2));
+}
+
+/*
+ *	Set up the timer to clear the vol change notification
+ */
+ 
+static void ali_set_timer(struct trident_card *card)
+{
+	/* Add Timer Routine to Enable GPIO IRQ */
+	del_timer(&card->timer);	/* Never queue twice */
+	card->timer.function = ali_timeout;
+	card->timer.data = (unsigned long) card;
+	card->timer.expires = jiffies + HZ/10;
+	add_timer(&card->timer);
+}
+
+/*
+ *	Process a GPIO event
+ */
+ 
+static void ali_queue_task(struct trident_card *card, int opt)
+{
+	u16 temp;
+
+	/* Disable GPIO IRQ (MISCINT bit 18h)*/
+	temp = inw(TRID_REG(card, T4D_MISCINT + 2));
+	temp &= (u16)(~0x0004);
+	outw(temp, TRID_REG(card, T4D_MISCINT + 2));
+
+	/* Adjust the volume */
+	ali_hwvol_control(card, opt);
+	
+	/* Set the timer for 1/10th sec */
+	ali_set_timer(card);
+}
+
 static void trident_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 {
 	struct trident_card *card = (struct trident_card *)dev_id;
 	u32 event;
+	u32 gpio;
 
 	spin_lock(&card->lock);
 	event = inl(TRID_REG(card, T4D_MISCINT));
@@ -1431,17 +1545,27 @@
 		card->address_interrupt(card);
 	}
 
+	if(card->pci_id == PCI_DEVICE_ID_ALI_5451)
+	{
+		/* GPIO IRQ (H/W Volume Control) */
+		event = inl(TRID_REG(card, T4D_MISCINT));
+		if (event & (1<<25)) {
+			gpio = inl(TRID_REG(card, ALI_GPIO));
+			if (!timer_pending(&card->timer)) 
+				ali_queue_task(card, gpio&0x07);
+		}
+		event = inl(TRID_REG(card, T4D_MISCINT));
+		outl(event | (ST_TARGET_REACHED | MIXER_OVERFLOW | MIXER_UNDERFLOW), TRID_REG(card, T4D_MISCINT));
+		spin_unlock(&card->lock);
+		return;
+	}
+
 	/* manually clear interrupt status, bad hardware design, blame T^2 */
 	outl((ST_TARGET_REACHED | MIXER_OVERFLOW | MIXER_UNDERFLOW),
 	     TRID_REG(card, T4D_MISCINT));
 	spin_unlock(&card->lock);
 }
 
-static loff_t trident_llseek(struct file *file, loff_t offset, int origin)
-{
-	return -ESPIPE;
-}
-
 /* in this loop, dmabuf.count signifies the amount of data that is waiting to be copied to
    the user's buffer.  it is filled by the dma machine and drained by this loop. */
 static ssize_t trident_read(struct file *file, char *buffer, size_t count, loff_t *ppos)
@@ -2459,7 +2583,7 @@
 
 static /*const*/ struct file_operations trident_audio_fops = {
 	owner:		THIS_MODULE,
-	llseek:		trident_llseek,
+	llseek:		no_llseek,
 	read:		trident_read,
 	write:		trident_write,
 	poll:		trident_poll,
@@ -3486,7 +3610,7 @@
 
 static /*const*/ struct file_operations trident_mixer_fops = {
 	owner:		THIS_MODULE,
-	llseek:		trident_llseek,
+	llseek:		no_llseek,
 	ioctl:		trident_ioctl_mixdev,
 	open:		trident_open_mixdev,
 };
@@ -3638,9 +3762,11 @@
 	unsigned long iobase;
 	struct trident_card *card;
 	dma_addr_t mask;
-	int bits;
+	u8 bits;
 	u8 revision;
 	int i = 0;
+	u16 temp;
+	struct pci_dev *pci_dev_m1533 = NULL;
 
 	if (pci_enable_device(pci_dev))
 	    return -ENODEV;
@@ -3676,8 +3802,11 @@
 	card->banks[BANK_A].bitmap = 0UL;
 	card->banks[BANK_B].addresses = &bank_b_addrs;
 	card->banks[BANK_B].bitmap = 0UL;
+
 	init_MUTEX(&card->open_sem);
 	spin_lock_init(&card->lock);
+	init_timer(&card->timer);
+
 	devs = card;
 
 	pci_set_master(pci_dev);
@@ -3708,6 +3837,23 @@
 			}
 #endif
 		}
+
+		/* Add H/W Volume Control By Matt Wu Jul. 06, 2001 */
+		card->hwvolctl = 0;
+		pci_dev_m1533 = pci_find_device(PCI_VENDOR_ID_AL,PCI_DEVICE_ID_AL_M1533, pci_dev_m1533);
+		if (pci_dev_m1533 == NULL)
+			return -ENODEV;
+		pci_read_config_byte(pci_dev_m1533, 0x63, &bits);
+		if (bits & (1<<5))
+			card->hwvolctl = 1;
+		if (card->hwvolctl) 
+		{
+			/* Clear m1533 pci cfg 78h bit 30 to zero, which makes
+			   GPIO11/12/13 work as ACGP_UP/DOWN/MUTE. */
+			pci_read_config_byte(pci_dev_m1533, 0x7b, &bits);
+			bits &= 0xbf; /*clear bit 6 */
+			pci_write_config_byte(pci_dev_m1533, 0x7b, bits);
+		}
 	}
 	else {
 		card->alloc_pcm_channel = trident_alloc_pcm_channel;
@@ -3753,17 +3899,33 @@
 	outl(0x00, TRID_REG(card, T4D_MUSICVOL_WAVEVOL));
 
 	if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
+		/* Add H/W Volume Control By Matt Wu Jul. 06, 2001 */
+		if(card->hwvolctl) 
+		{
+			/* Enable GPIO IRQ (MISCINT bit 18h)*/
+			temp = inw(TRID_REG(card, T4D_MISCINT + 2));
+			temp |= 0x0004;
+			outw(temp, TRID_REG(card, T4D_MISCINT + 2));
+
+			/* Enable H/W Volume Control GLOVAL CONTROL bit 0*/
+			temp = inw(TRID_REG(card, ALI_GLOBAL_CONTROL));
+			temp |= 0x0001;
+			outw(temp, TRID_REG(card, ALI_GLOBAL_CONTROL));
+
+		}
 		if(card->revision == ALI_5451_V02)
 			ali_close_multi_channels();
 		/* edited by HMSEO for GT sound */
 #if defined CONFIG_ALPHA_NAUTILUS || CONFIG_ALPHA_GENERIC
-		u16 ac97_data;
-		extern struct hwrpb_struct *hwrpb;
+		{
+			u16 ac97_data;
+			extern struct hwrpb_struct *hwrpb;
 		
-		if ((hwrpb->sys_type) == 201) {
-			printk(KERN_INFO "trident: Running on Alpha system type Nautilus\n");
-			ac97_data = ali_ac97_get(card, 0, AC97_POWER_CONTROL);
-			ali_ac97_set(card, 0, AC97_POWER_CONTROL, ac97_data |
+			if ((hwrpb->sys_type) == 201) {
+				printk(KERN_INFO "trident: Running on Alpha system type Nautilus\n");
+				ac97_data = ali_ac97_get(card, 0, AC97_POWER_CONTROL);
+				ali_ac97_set(card, 0, AC97_POWER_CONTROL, ac97_data |
+			}
 		}
 #endif
 		/* edited by HMSEO for GT sound*/
@@ -3782,6 +3944,13 @@
 	int i;
 	struct trident_card *card = pci_get_drvdata(pci_dev);
 
+	/*
+ 	 *	Kill running timers before unload. We can't have them
+ 	 *	going off after rmmod!
+ 	 */
+	if(card->hwvolctl)
+		del_timer_sync(&card->timer);
+		
 	/* ALi S/PDIF and Power Management */
 	if(card->pci_id == PCI_DEVICE_ID_ALI_5451) {
 		ali_setup_spdif_out(card, ALI_PCM_TO_SPDIF_OUT);
diff -u --recursive --new-file v2.4.8/linux/drivers/sound/trident.h linux/drivers/sound/trident.h
--- v2.4.8/linux/drivers/sound/trident.h	Wed Jul 25 17:10:23 2001
+++ linux/drivers/sound/trident.h	Sun Aug 12 10:51:42 2001
@@ -90,8 +90,8 @@
 	T4D_STOP_B      = 0xb8, T4D_CSPF_B	= 0xbc,
 	T4D_SBBL_SBCL	= 0xc0, T4D_SBCTRL_SBE2R_SBDD    = 0xc4,
 	T4D_STIMER	= 0xc8, T4D_LFO_B_I2S_DELTA      = 0xcc,
-	T4D_AINT_B	= 0xd8,	T4D_AINTEN_B 	= 0xdc,
-	ALI_MPUR2 = 0x22,
+	T4D_AINT_B	= 0xd8, T4D_AINTEN_B	= 0xdc,
+	ALI_MPUR2	= 0x22,	ALI_GPIO	= 0x7c,
 	ALI_EBUF1 = 0xf4,
 	ALI_EBUF2 = 0xf8
 };
diff -u --recursive --new-file v2.4.8/linux/drivers/sound/via82cxxx_audio.c linux/drivers/sound/via82cxxx_audio.c
--- v2.4.8/linux/drivers/sound/via82cxxx_audio.c	Sun Aug 12 13:28:00 2001
+++ linux/drivers/sound/via82cxxx_audio.c	Sun Aug 12 10:38:48 2001
@@ -1362,19 +1362,10 @@
 }
 
 
-static loff_t via_llseek(struct file *file, loff_t offset, int origin)
-{
-	DPRINTK ("ENTER\n");
-
-	DPRINTK ("EXIT, returning -ESPIPE\n");
-	return -ESPIPE;
-}
-
-
 static struct file_operations via_mixer_fops = {
 	owner:		THIS_MODULE,
 	open:		via_mixer_open,
-	llseek:		via_llseek,
+	llseek:		no_llseek,
 	ioctl:		via_mixer_ioctl,
 };
 
@@ -1780,7 +1771,7 @@
 	read:		via_dsp_read,
 	write:		via_dsp_write,
 	poll:		via_dsp_poll,
-	llseek: 	via_llseek,
+	llseek: 	no_llseek,
 	ioctl:		via_dsp_ioctl,
 	mmap:		via_dsp_mmap,
 };
diff -u --recursive --new-file v2.4.8/linux/drivers/sound/vwsnd.c linux/drivers/sound/vwsnd.c
--- v2.4.8/linux/drivers/sound/vwsnd.c	Mon Dec 11 13:13:51 2000
+++ linux/drivers/sound/vwsnd.c	Sun Aug 12 10:38:48 2001
@@ -2250,12 +2250,6 @@
 	vwsnd_audio_write_intr(devc, status);
 }
 
-static loff_t vwsnd_audio_llseek(struct file *file, loff_t offset, int whence)
-{
-	DBGEV("(file=0x%p, offset=%Ld, whence=%d)\n", file, offset, whence);
-	return -ESPIPE;
-}
-
 static ssize_t vwsnd_audio_do_read(struct file *file,
 				   char *buffer,
 				   size_t count,
@@ -3037,7 +3031,7 @@
 
 static struct file_operations vwsnd_audio_fops = {
 	owner:		THIS_MODULE,
-	llseek:		vwsnd_audio_llseek,
+	llseek:		no_llseek,
 	read:		vwsnd_audio_read,
 	write:		vwsnd_audio_write,
 	poll:		vwsnd_audio_poll,
@@ -3080,13 +3074,6 @@
 	return 0;
 }
 
-/* seek is illegal on mixer. */
-
-static loff_t vwsnd_mixer_llseek(struct file *file, loff_t offset, int whence)
-{
-	return -ESPIPE;
-}
-
 /* mixer_read_ioctl handles all read ioctls on the mixer device. */
 
 static int mixer_read_ioctl(vwsnd_dev_t *devc, unsigned int nr, caddr_t arg)
@@ -3234,7 +3221,7 @@
 
 static struct file_operations vwsnd_mixer_fops = {
 	owner:		THIS_MODULE,
-	llseek:		vwsnd_mixer_llseek,
+	llseek:		no_llseek,
 	ioctl:		vwsnd_mixer_ioctl,
 	open:		vwsnd_mixer_open,
 	release:	vwsnd_mixer_release,
diff -u --recursive --new-file v2.4.8/linux/drivers/sound/wavfront.c linux/drivers/sound/wavfront.c
--- v2.4.8/linux/drivers/sound/wavfront.c	Wed Jul 25 17:10:23 2001
+++ linux/drivers/sound/wavfront.c	Sun Aug 12 10:38:48 2001
@@ -1947,12 +1947,6 @@
 /* WaveFront: Linux file system interface (for access via raw synth)    */
 /***********************************************************************/
 
-static loff_t
-wavefront_llseek(struct file *file, loff_t offset, int origin)
-{
-	return -ESPIPE;
-}
-
 static int 
 wavefront_open (struct inode *inode, struct file *file)
 {
@@ -2002,7 +1996,7 @@
 
 static /*const*/ struct file_operations wavefront_fops = {
 	owner:		THIS_MODULE,
-	llseek:		wavefront_llseek,
+	llseek:		no_llseek,
 	ioctl:		wavefront_ioctl,
 	open:		wavefront_open,
 	release:	wavefront_release,
diff -u --recursive --new-file v2.4.8/linux/drivers/sound/ymfpci.c linux/drivers/sound/ymfpci.c
--- v2.4.8/linux/drivers/sound/ymfpci.c	Wed Jul 25 17:10:23 2001
+++ linux/drivers/sound/ymfpci.c	Sun Aug 12 10:51:42 2001
@@ -38,6 +38,7 @@
  *  - 2001/01/07 Replace the OPL3 part of CONFIG_SOUND_YMFPCI_LEGACY code with
  *    native synthesizer through a playback slot.
  *  - Use new 2.3.x cache coherent PCI DMA routines instead of virt_to_bus.
+ *  - Make the thing big endian compatible. ALSA has it done.
  */
 
 #include <linux/config.h>
@@ -488,32 +489,34 @@
  *  Hardware start management
  */
 
-static void ymfpci_hw_start(ymfpci_t *codec)
+static void ymfpci_hw_start(ymfpci_t *unit)
 {
 	unsigned long flags;
 
-	spin_lock_irqsave(&codec->reg_lock, flags);
-	if (codec->start_count++ == 0) {
-		ymfpci_writel(codec, YDSXGR_MODE, 3);
-		codec->active_bank = ymfpci_readl(codec, YDSXGR_CTRLSELECT) & 1;
+	spin_lock_irqsave(&unit->reg_lock, flags);
+	if (unit->start_count++ == 0) {
+		ymfpci_writel(unit, YDSXGR_MODE,
+		    ymfpci_readl(unit, YDSXGR_MODE) | 3);
+		unit->active_bank = ymfpci_readl(unit, YDSXGR_CTRLSELECT) & 1;
 	}
-      	spin_unlock_irqrestore(&codec->reg_lock, flags);
+	spin_unlock_irqrestore(&unit->reg_lock, flags);
 }
 
-static void ymfpci_hw_stop(ymfpci_t *codec)
+static void ymfpci_hw_stop(ymfpci_t *unit)
 {
 	unsigned long flags;
 	long timeout = 1000;
 
-	spin_lock_irqsave(&codec->reg_lock, flags);
-	if (--codec->start_count == 0) {
-		ymfpci_writel(codec, YDSXGR_MODE, 0);
+	spin_lock_irqsave(&unit->reg_lock, flags);
+	if (--unit->start_count == 0) {
+		ymfpci_writel(unit, YDSXGR_MODE,
+		    ymfpci_readl(unit, YDSXGR_MODE) & ~3);
 		while (timeout-- > 0) {
-			if ((ymfpci_readl(codec, YDSXGR_STATUS) & 2) == 0)
+			if ((ymfpci_readl(unit, YDSXGR_STATUS) & 2) == 0)
 				break;
 		}
 	}
-      	spin_unlock_irqrestore(&codec->reg_lock, flags);
+	spin_unlock_irqrestore(&unit->reg_lock, flags);
 }
 
 /*
@@ -525,7 +528,7 @@
 	ymfpci_voice_t *voice, *voice2;
 	int idx;
 
-	for (idx = 0; idx < 64; idx += pair ? 2 : 1) {
+	for (idx = 0; idx < YDSXG_PLAYBACK_VOICES; idx += pair ? 2 : 1) {
 		voice = &codec->voices[idx];
 		voice2 = pair ? &codec->voices[idx+1] : NULL;
 		if (voice->use || (voice2 && voice2->use))
@@ -867,19 +870,19 @@
 		} else {
 			if (!spdif) {
 				if ((voice->number & 1) == 0) {
-					bank->format |= 1;
 					bank->left_gain =
 					bank->left_gain_end = 0x40000000;
 				} else {
+					bank->format |= 1;
 					bank->right_gain =
 					bank->right_gain_end = 0x40000000;
 				}
 			} else {
 				if ((voice->number & 1) == 0) {
-					bank->format |= 1;
 					bank->eff2_gain =
 					bank->eff2_gain_end = 0x40000000;
 				} else {
+					bank->format |= 1;
 					bank->eff3_gain =
 					bank->eff3_gain_end = 0x40000000;
 				}
@@ -997,12 +1000,12 @@
 	if (status & 0x80000000) {
 		codec->active_bank = ymfpci_readl(codec, YDSXGR_CTRLSELECT) & 1;
 		spin_lock(&codec->voice_lock);
-		for (nvoice = 0; nvoice < 64; nvoice++) {
+		for (nvoice = 0; nvoice < YDSXG_PLAYBACK_VOICES; nvoice++) {
 			voice = &codec->voices[nvoice];
 			if (voice->use)
 				ymf_pcm_interrupt(codec, voice);
 		}
-		for (nvoice = 0; nvoice < 5; nvoice++) {
+		for (nvoice = 0; nvoice < YDSXG_CAPTURE_VOICES; nvoice++) {
 			cap = &codec->capture[nvoice];
 			if (cap->use)
 				ymf_cap_interrupt(codec, cap);
@@ -1169,11 +1172,6 @@
  * User interface
  */
 
-static loff_t ymf_llseek(struct file *file, loff_t offset, int origin)
-{
-	return -ESPIPE;
-}
-
 /*
  * in this loop, dmabuf.count signifies the amount of data that is
  * waiting to be copied to the user's buffer.  it is filled by the dma
@@ -1971,7 +1969,7 @@
 }
 
 static /*const*/ struct file_operations ymf_fops = {
-	llseek:		ymf_llseek,
+	llseek:		no_llseek,
 	read:		ymf_read,
 	write:		ymf_write,
 	poll:		ymf_poll,
@@ -1982,7 +1980,7 @@
 };
 
 static /*const*/ struct file_operations ymf_mixer_fops = {
-	llseek:		ymf_llseek,
+	llseek:		no_llseek,
 	ioctl:		ymf_ioctl_mixdev,
 	open:		ymf_open_mixdev,
 	release:	ymf_release_mixdev,
diff -u --recursive --new-file v2.4.8/linux/drivers/sound/ymfpci.h linux/drivers/sound/ymfpci.h
--- v2.4.8/linux/drivers/sound/ymfpci.h	Wed Jul 25 17:10:23 2001
+++ linux/drivers/sound/ymfpci.h	Sun Aug 12 10:51:42 2001
@@ -260,8 +260,8 @@
 	int suspended;
 
 	u32 active_bank;
-	struct ymf_voice voices[64];
-	struct ymf_capture capture[5];
+	struct ymf_voice voices[YDSXG_PLAYBACK_VOICES];
+	struct ymf_capture capture[YDSXG_CAPTURE_VOICES];
 
 	struct ac97_codec *ac97_codec[NR_AC97];
 	u16 ac97_features;
diff -u --recursive --new-file v2.4.8/linux/drivers/usb/CDCEther.c linux/drivers/usb/CDCEther.c
--- v2.4.8/linux/drivers/usb/CDCEther.c	Wed Dec 31 16:00:00 1969
+++ linux/drivers/usb/CDCEther.c	Sun Aug 12 17:37:53 2001
@@ -0,0 +1,1279 @@
+// Portions of this file taken from 
+// Petko Manolov - Petkan (petkan@dce.bg)
+// from his driver pegasus.c
+
+/*
+ * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+#include <linux/sched.h>
+#include <linux/slab.h>
+#include <linux/init.h>
+#include <linux/delay.h>
+#include <linux/netdevice.h>
+#include <linux/etherdevice.h>
+#include <linux/usb.h>
+#include <linux/module.h>
+#include "CDCEther.h"
+
+static const char *version = __FILE__ ": v0.98.4 4 July 2001 Brad Hards and another";
+
+// We will attempt to probe anything that is in the
+// communication device class...
+// We will sort through them later.
+static struct usb_device_id CDCEther_ids[] = {
+	{ USB_DEVICE_INFO(2, 0, 0) },
+	{ }
+};
+
+//////////////////////////////////////////////////////////////////////////////
+// Callback routines from USB device /////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+
+static void read_bulk_callback( struct urb *urb )
+{
+	ether_dev_t *ether_dev = urb->context;
+	struct net_device *net;
+	int count = urb->actual_length, res;
+	struct sk_buff	*skb;
+
+	// Sanity check 
+	if ( !ether_dev || !(ether_dev->flags & CDC_ETHER_RUNNING) ) {
+		dbg("BULK IN callback but driver is not active!");
+		return;
+	}
+
+	net = ether_dev->net;
+	if ( !netif_device_present(net) ) {
+		// Somebody killed our network interface...
+		return;
+	}
+
+	if ( ether_dev->flags & CDC_ETHER_RX_BUSY ) {
+		// Are we already trying to receive a frame???
+		ether_dev->stats.rx_errors++;
+		dbg("ether_dev Rx busy");
+		return;
+	}
+
+	// We are busy, leave us alone!
+	ether_dev->flags |= CDC_ETHER_RX_BUSY;
+
+	switch ( urb->status ) {
+		case USB_ST_NOERROR:
+			break;
+		case USB_ST_NORESPONSE:
+			dbg( "no repsonse in BULK IN" );
+			ether_dev->flags &= ~CDC_ETHER_RX_BUSY;
+			break;
+		default:
+			dbg( "%s: RX status %d", net->name, urb->status );
+			goto goon;
+	}
+
+	// Check to make sure we got some data...
+	if ( !count ) {
+		// We got no data!!!
+		goto goon;
+	}
+
+	// Tell the kernel we want some memory
+	if ( !(skb = dev_alloc_skb(count)) ) {
+		// We got no receive buffer.
+		goto goon;
+	}
+
+	// Here's where it came from
+	skb->dev = net;
+	
+	// Now we copy it over
+	eth_copy_and_sum(skb, ether_dev->rx_buff, count, 0);
+	
+	// Not sure
+	skb_put(skb, count);
+	// Not sure here either
+	skb->protocol = eth_type_trans(skb, net);
+	
+	// Ship it off to the kernel
+	netif_rx(skb);
+	
+	// update out statistics
+	ether_dev->stats.rx_packets++;
+	ether_dev->stats.rx_bytes += count;
+
+goon:
+	// Prep the USB to wait for another frame
+	FILL_BULK_URB( &ether_dev->rx_urb, ether_dev->usb,
+			usb_rcvbulkpipe(ether_dev->usb, ether_dev->data_ep_in),
+			ether_dev->rx_buff, ether_dev->wMaxSegmentSize, 
+			read_bulk_callback, ether_dev );
+			
+	// Give this to the USB subsystem so it can tell us 
+	// when more data arrives.
+	if ( (res = usb_submit_urb(&ether_dev->rx_urb)) ) {
+		warn( __FUNCTION__ " failed submint rx_urb %d", res);
+	}
+	
+	// We are no longer busy, show us the frames!!!
+	ether_dev->flags &= ~CDC_ETHER_RX_BUSY;
+}
+
+static void write_bulk_callback( struct urb *urb )
+{
+	ether_dev_t *ether_dev = urb->context;
+
+	// Sanity check
+	if ( !ether_dev || !(ether_dev->flags & CDC_ETHER_RUNNING) ) {
+		// We are insane!!!
+		err( "write_bulk_callback: device not running" );
+		return;
+	}
+
+	// Do we still have a valid kernel network device?
+	if ( !netif_device_present(ether_dev->net) ) {
+		// Someone killed our network interface.
+		err( "write_bulk_callback: net device not present" );
+		return;
+	}
+
+	// Hmm...  What on Earth could have happened???
+	if ( urb->status ) {
+		info("%s: TX status %d", ether_dev->net->name, urb->status);
+	}
+
+	// Update the network interface and tell it we are
+	// ready for another frame
+	ether_dev->net->trans_start = jiffies;
+	netif_wake_queue( ether_dev->net );
+}
+
+//static void intr_callback( struct urb *urb )
+//{
+//	ether_dev_t *ether_dev = urb->context;
+//	struct net_device *net;
+//	__u8	*d;
+//
+//	if ( !ether_dev )
+//		return;
+//		
+//	switch ( urb->status ) {
+//		case USB_ST_NOERROR:
+//			break;
+//		case USB_ST_URB_KILLED:
+//			return;
+//		default:
+//			info("intr status %d", urb->status);
+//	}
+//
+//	d = urb->transfer_buffer;
+//	net = ether_dev->net;
+//	if ( d[0] & 0xfc ) {
+//		ether_dev->stats.tx_errors++;
+//		if ( d[0] & TX_UNDERRUN )
+//			ether_dev->stats.tx_fifo_errors++;
+//		if ( d[0] & (EXCESSIVE_COL | JABBER_TIMEOUT) )
+//			ether_dev->stats.tx_aborted_errors++;
+//		if ( d[0] & LATE_COL )
+//			ether_dev->stats.tx_window_errors++;
+//		if ( d[0] & (NO_CARRIER | LOSS_CARRIER) )
+//			ether_dev->stats.tx_carrier_errors++;
+//	}
+//}
+
+//////////////////////////////////////////////////////////////////////////////
+// Routines for turning net traffic on and off on the USB side ///////////////
+//////////////////////////////////////////////////////////////////////////////
+
+static inline int enable_net_traffic( ether_dev_t *ether_dev )
+{
+	struct usb_device *usb = ether_dev->usb;
+
+	// Here would be the time to set the data interface to the configuration where
+	// it has two endpoints that use a protocol we can understand.
+
+	if (usb_set_interface( usb, 
+	                        ether_dev->data_bInterfaceNumber, 
+	                        ether_dev->data_bAlternateSetting_with_traffic ) )  {
+		err("usb_set_interface() failed" );
+		err("Attempted to set interface %d", ether_dev->data_bInterfaceNumber);
+		err("To alternate setting       %d", ether_dev->data_bAlternateSetting_with_traffic);
+		return -1;
+	}
+	return 0;
+}
+
+static inline void disable_net_traffic( ether_dev_t *ether_dev )
+{
+	// The thing to do is to set the data interface to the alternate setting that has
+	// no endpoints.  This is what the spec suggests.
+
+	if (ether_dev->data_interface_altset_num_without_traffic >= 0 ) {
+		if (usb_set_interface( ether_dev->usb, 
+		                        ether_dev->data_bInterfaceNumber, 
+		                        ether_dev->data_bAlternateSetting_without_traffic ) ) 	{
+			err("usb_set_interface() failed");
+		}
+	} else {
+		// Some devices just may not support this...
+		warn("No way to disable net traffic");
+	}
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// Callback routines for kernel Ethernet Device //////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+
+static void CDCEther_tx_timeout( struct net_device *net )
+{
+	ether_dev_t *ether_dev = net->priv;
+
+	// Sanity check
+	if ( !ether_dev ) {
+		// Seems to be a case of insanity here
+		return;
+	}
+
+	// Tell syslog we are hosed.
+	warn("%s: Tx timed out.", net->name);
+	
+	// Tear the waiting frame off the list
+	ether_dev->tx_urb.transfer_flags |= USB_ASYNC_UNLINK;
+	usb_unlink_urb( &ether_dev->tx_urb );
+	
+	// Update statistics
+	ether_dev->stats.tx_errors++;
+}
+
+static int CDCEther_start_xmit( struct sk_buff *skb, struct net_device *net )
+{
+	ether_dev_t	*ether_dev = net->priv;
+	int 	count;
+	int 	res;
+
+	// If we are told to transmit an ethernet frame that fits EXACTLY 
+	// into an integer number of USB packets, we force it to send one 
+	// more byte so the device will get a runt USB packet signalling the 
+	// end of the ethernet frame
+	if ( (skb->len) ^ (ether_dev->data_ep_out_size) ) {
+		// It was not an exact multiple
+		// no need to add anything extra
+		count = skb->len;
+	} else {
+		// Add one to make it NOT an exact multiple
+		count = skb->len + 1;
+	}
+
+	// Tell the kernel, "No more frames 'til we are done
+	// with this one.'
+	netif_stop_queue( net );
+
+	// Copy it from kernel memory to OUR memory
+	memcpy(ether_dev->tx_buff, skb->data, skb->len);
+
+	// Fill in the URB for shipping it out.
+	FILL_BULK_URB( &ether_dev->tx_urb, ether_dev->usb,
+			usb_sndbulkpipe(ether_dev->usb, ether_dev->data_ep_out),
+			ether_dev->tx_buff, ether_dev->wMaxSegmentSize, 
+			write_bulk_callback, ether_dev );
+
+	// Tell the URB how much it will be transporting today
+	ether_dev->tx_urb.transfer_buffer_length = count;
+	
+	// Send the URB on its merry way.
+	if ((res = usb_submit_urb(&ether_dev->tx_urb)))  {
+		// Hmm...  It didn't go. Tell someone...
+		warn("failed tx_urb %d", res);
+		// update some stats...
+		ether_dev->stats.tx_errors++;
+		// and tell the kernel to give us another.
+		// Maybe we'll get it right next time.
+		netif_start_queue( net );
+	} else {
+		// Okay, it went out.
+		// Update statistics
+		ether_dev->stats.tx_packets++;
+		ether_dev->stats.tx_bytes += skb->len;
+		// And tell the kernel when the last transmit occurred.
+		net->trans_start = jiffies;
+	}
+
+	// We are done with the kernel's memory
+	dev_kfree_skb(skb);
+
+	// We are done here.
+	return 0;
+}
+
+static struct net_device_stats *CDCEther_netdev_stats( struct net_device *net )
+{
+	// Easy enough!
+	return &((ether_dev_t *)net->priv)->stats;
+}
+
+static int CDCEther_open(struct net_device *net)
+{
+	ether_dev_t *ether_dev = (ether_dev_t *)net->priv;
+	int	res;
+
+	// We are finally getting used!
+	MOD_INC_USE_COUNT;
+
+	// Turn on the USB and let the packets flow!!!
+	if ( (res = enable_net_traffic( ether_dev )) ) {
+		err( __FUNCTION__ "can't enable_net_traffic() - %d", res );
+		MOD_DEC_USE_COUNT;
+		return -EIO;
+	}
+
+	// Prep a receive URB
+	FILL_BULK_URB( &ether_dev->rx_urb, ether_dev->usb,
+			usb_rcvbulkpipe(ether_dev->usb, ether_dev->data_ep_in),
+			ether_dev->rx_buff, ether_dev->wMaxSegmentSize, 
+			read_bulk_callback, ether_dev );
+
+	// Put it out there so the device can send us stuff
+	if ( (res = usb_submit_urb(&ether_dev->rx_urb)) )
+	{
+		// Hmm...  Okay...
+		warn( __FUNCTION__ " failed rx_urb %d", res );
+	}
+
+	// Tell the kernel we are ready to start receiving from it
+	netif_start_queue( net );
+	
+	// We are up and running.
+	ether_dev->flags |= CDC_ETHER_RUNNING;
+
+	// Let's get ready to move frames!!!
+	return 0;
+}
+
+static int CDCEther_close( struct net_device *net )
+{
+	ether_dev_t	*ether_dev = net->priv;
+
+	// We are no longer running.
+	ether_dev->flags &= ~CDC_ETHER_RUNNING;
+	
+	// Tell the kernel to stop sending us stuff
+	netif_stop_queue( net );
+	
+	// If we are not already unplugged, turn off USB
+	// traffic
+	if ( !(ether_dev->flags & CDC_ETHER_UNPLUG) ) {
+		disable_net_traffic( ether_dev );
+	}
+
+	// We don't need the URBs anymore.
+	usb_unlink_urb( &ether_dev->rx_urb );
+	usb_unlink_urb( &ether_dev->tx_urb );
+	usb_unlink_urb( &ether_dev->intr_urb );
+	
+	// We are not being used now.
+	MOD_DEC_USE_COUNT;
+
+	// That's it.  I'm done.
+	return 0;
+}
+
+static int CDCEther_ioctl( struct net_device *net, struct ifreq *rq, int cmd )
+{
+	//__u16 *data = (__u16 *)&rq->ifr_data;
+	//ether_dev_t	*ether_dev = net->priv;
+
+	// No support here yet.
+	// Do we need support???
+	switch(cmd) {
+		case SIOCDEVPRIVATE:
+			return -EOPNOTSUPP;
+		case SIOCDEVPRIVATE+1:
+			return -EOPNOTSUPP;
+		case SIOCDEVPRIVATE+2:
+			//return 0;
+			return -EOPNOTSUPP;
+		default:
+			return -EOPNOTSUPP;
+	}
+}
+
+static void CDCEther_set_multicast( struct net_device *net )
+{
+	ether_dev_t *ether_dev = net->priv;
+
+	// Tell the kernel to stop sending us frames while we get this
+	// all set up.
+	netif_stop_queue(net);
+
+	// Do what we are told.
+	if (net->flags & IFF_PROMISC) {
+		// TODO - Turn on promiscuous mode
+		info( "%s: Promiscuous mode enabled", net->name);
+	} else if (net->flags & IFF_ALLMULTI){
+		// TODO - Here we need to tell the device to block ALL multicast traffic.
+		info("%s: set allmulti", net->name);
+	} else if (net->mc_count > ether_dev->wNumberMCFilters)	{
+		// TODO - Here we need to set multicast filters, but
+		// There are more than our limit...  Hmm...
+		info("%s: set too many MC filters", net->name);
+	} else {
+		// TODO - Here we are supposed to set SOME of the multicast filters.
+		// I must learn how to do this...
+		//info("%s: set Rx mode", net->name);
+	}
+
+	// Tell the kernel to start giving frames to us again.
+	netif_wake_queue(net);
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// Routines used to parse out the Functional Descriptors /////////////////////
+//////////////////////////////////////////////////////////////////////////////
+
+static int parse_header_functional_descriptor( int *bFunctionLength, 
+                                               int bDescriptorType, 
+                                               int bDescriptorSubtype,
+                                               unsigned char *data,
+                                               ether_dev_t *ether_dev,
+                                               int *requirements )
+{
+	// Check to make sure we haven't seen one of these already.
+	if ( (~*requirements) & REQ_HDR_FUNC_DESCR ) {
+		err( "Multiple Header Functional Descriptors found." );
+		return -1;
+	}
+	
+	// Is it the right size???
+	if (*bFunctionLength != 5) {
+		info( "Invalid length in Header Functional Descriptor" );
+		// This is a hack to get around a particular device (NO NAMES)
+		// It has this function length set to the length of the
+		// whole class-specific descriptor
+		*bFunctionLength = 5;
+	}
+	
+	// Nothing extremely useful here.
+	// We'll keep it for posterity
+	ether_dev->bcdCDC = data[0] + (data[1] << 8);
+	dbg( "Found Header descriptor, CDC version %x", ether_dev->bcdCDC);
+
+	// We've seen one of these
+	*requirements &= ~REQ_HDR_FUNC_DESCR;
+	
+	// It's all good.
+	return 0;
+}
+
+static int parse_union_functional_descriptor( int *bFunctionLength, 
+                                              int bDescriptorType, 
+                                              int bDescriptorSubtype,
+                                              unsigned char *data,
+                                              ether_dev_t *ether_dev,
+                                              int *requirements )
+{
+	// Check to make sure we haven't seen one of these already.
+	if ( (~*requirements) & REQ_UNION_FUNC_DESCR ) {
+		err( "Multiple Union Functional Descriptors found." );
+		return -1;
+	}
+
+	// Is it the right size?
+	if (*bFunctionLength != 5) {
+		// It is NOT the size we expected.
+		err( "Unsupported length in Union Functional Descriptor" );
+		return -1;
+	}
+	
+	// Sanity check of sorts
+	if (ether_dev->comm_interface != data[0]) {
+		// This tells us that we are chasing the wrong comm
+		// interface or we are crazy or something else weird.
+		if (ether_dev->comm_interface == data[1]) {
+			info( "Probably broken Union descriptor, fudging data interface" );
+			// We'll need this in a few microseconds, 
+			// so guess here, and hope for the best
+			ether_dev->data_interface = data[0];
+		} else {
+			err( "Union Functional Descriptor is broken beyond repair" );
+			return -1;
+		}
+	} else{ // Descriptor is OK
+       		// We'll need this in a few microseconds!
+		ether_dev->data_interface = data[1];
+	}
+
+	// We've seen one of these now.
+	*requirements &= ~REQ_UNION_FUNC_DESCR;
+	
+	// Done
+	return 0;
+}
+
+static int parse_ethernet_functional_descriptor( int *bFunctionLength, 
+                                                 int bDescriptorType, 
+                                                 int bDescriptorSubtype,
+                                                 unsigned char *data,
+                                                 ether_dev_t *ether_dev,
+                                                 int *requirements )
+{
+	// Check to make sure we haven't seen one of these already.
+	if ( (~*requirements) & REQ_ETH_FUNC_DESCR ) {
+		err( "Multiple Ethernet Functional Descriptors found." );
+		return -1;
+	}
+	
+	// Is it the right size?
+	if (*bFunctionLength != 13) {
+		err( "Invalid length in Ethernet Networking Functional Descriptor" );
+		return -1;
+	}
+	
+	// Lots of goodies from this one.  They are all important.
+	ether_dev->iMACAddress = data[0];
+	ether_dev->bmEthernetStatistics = data[1] + (data[2] << 8) + (data[3] << 16) + (data[4] << 24);
+	ether_dev->wMaxSegmentSize = data[5] + (data[6] << 8);
+	ether_dev->wNumberMCFilters = (data[7] + (data[8] << 8)) & 0x00007FFF;
+	ether_dev->bNumberPowerFilters = data[9];
+	
+	// We've seen one of these now.
+	*requirements &= ~REQ_ETH_FUNC_DESCR;
+	
+	// That's all she wrote.
+	return 0;
+}
+
+static int parse_protocol_unit_functional_descriptor( int *bFunctionLength, 
+                                                      int bDescriptorType, 
+                                                      int bDescriptorSubtype,
+                                                      unsigned char *data,
+                                                      ether_dev_t *ether_dev,
+                                                      int *requirements )
+{
+	// There should only be one type if we are sane
+	if (bDescriptorType != CS_INTERFACE) {
+		info( "Invalid bDescriptorType found." );
+		return -1;
+	}
+
+	// The Subtype tells the tale.
+	switch (bDescriptorSubtype){
+		case 0x00:	// Header Functional Descriptor
+			return parse_header_functional_descriptor( bFunctionLength,
+			                                           bDescriptorType,
+			                                           bDescriptorSubtype,
+			                                           data,
+			                                           ether_dev,
+			                                           requirements );
+			break;
+		case 0x06:	// Union Functional Descriptor
+			return parse_union_functional_descriptor( bFunctionLength,
+			                                          bDescriptorType,
+			                                          bDescriptorSubtype,
+			                                          data,
+			                                          ether_dev,
+			                                          requirements );
+			break;
+		case 0x0F:	// Ethernet Networking Functional Descriptor
+			return parse_ethernet_functional_descriptor( bFunctionLength,
+			                                             bDescriptorType,
+			                                             bDescriptorSubtype,
+			                                             data,
+			                                             ether_dev,
+			                                             requirements );
+			break;
+		default:	// We don't support this at this time...
+			// However that doesn't necessarily indicate an error.
+			dbg( "Unexpected header type %x:", bDescriptorSubtype );
+			return 0;
+	}
+	// How did we get here???
+	return -1;
+}
+
+static int parse_ethernet_class_information( unsigned char *data, int length, ether_dev_t *ether_dev )
+{
+	int loc = 0;
+	int rc;
+	int bFunctionLength;
+	int bDescriptorType;
+	int bDescriptorSubtype;
+	int requirements = REQUIREMENTS_TOTAL;
+
+	// As long as there is something here, we will try to parse it
+	while (loc < length) {
+		// Length
+		bFunctionLength = data[loc];
+		loc++;
+		
+		// Type
+		bDescriptorType = data[loc];
+		loc++;
+		
+		// Subtype
+		bDescriptorSubtype = data[loc];
+		loc++;
+		
+		// ship this off to be processed elsewhere.
+		rc = parse_protocol_unit_functional_descriptor( &bFunctionLength, 
+		                                                bDescriptorType, 
+		                                                bDescriptorSubtype, 
+		                                                &data[loc],
+		                                                ether_dev,
+		                                                &requirements );
+		// Did it process okay?
+		if (rc)	{
+			// Something was hosed somewhere.
+			// No need to continue;
+			err("Bad descriptor parsing: %x", rc );
+			return -1;
+		}
+		// We have already taken three bytes.
+		loc += (bFunctionLength - 3);
+	}
+	// Check to see if we got everything we need.
+	if (requirements) {
+		// We missed some of the requirements...
+		err( "Not all required functional descriptors present 0x%08X", requirements );
+		return -1;
+	}
+	// We got everything.
+	return 0;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// Routine to check for the existence of the Functional Descriptors //////////
+//////////////////////////////////////////////////////////////////////////////
+
+static int find_and_parse_ethernet_class_information( struct usb_device *device, ether_dev_t *ether_dev )
+{
+	struct usb_config_descriptor *conf = NULL;
+	struct usb_interface *comm_intf_group = NULL;
+	struct usb_interface_descriptor *comm_intf = NULL;
+	int rc = -1;
+	// The assumption here is that find_ethernet_comm_interface
+	// and find_valid_configuration 
+	// have already filled in the information about where to find
+	// the a valid commication interface.
+
+	conf = &( device->config[ether_dev->configuration_num] );
+	comm_intf_group = &( conf->interface[ether_dev->comm_interface] );
+	comm_intf = &( comm_intf_group->altsetting[ether_dev->comm_interface_altset_num] );
+	// Let's check and see if it has the extra information we need...
+
+	if (comm_intf->extralen > 0) {
+		// This is where the information is SUPPOSED to be.
+		rc = parse_ethernet_class_information( comm_intf->extra, comm_intf->extralen, ether_dev );
+	} else if (conf->extralen > 0) {
+		// This is a hack.  The spec says it should be at the interface 
+		// location checked above.  However I have seen it here also.
+		// This is the same device that requires the functional descriptor hack above
+		warn( "Ethernet information found at device configuration.  This is broken." );
+		rc = parse_ethernet_class_information( conf->extra, conf->extralen, ether_dev );
+	} else 	{
+		// I don't know where else to look.
+		warn( "No ethernet information found." );
+		rc = -1;
+	}
+	return rc;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// Routines to verify the data interface /////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+
+static int get_data_interface_endpoints( struct usb_device *device, ether_dev_t *ether_dev )
+{
+	struct usb_config_descriptor *conf = NULL;
+	struct usb_interface *data_intf_group = NULL;
+	struct usb_interface_descriptor *data_intf = NULL;
+	
+	// Walk through and get to the data interface we are checking.
+	conf = &( device->config[ether_dev->configuration_num] );
+	data_intf_group = &( conf->interface[ether_dev->data_interface] );
+	data_intf = &( data_intf_group->altsetting[ether_dev->data_interface_altset_num_with_traffic] );
+
+	// Start out assuming we won't find anything we can use
+	ether_dev->data_ep_in = 0;
+	ether_dev->data_ep_out = 0;
+	
+	// If these are not BULK endpoints, we don't want them
+	if ( data_intf->endpoint[0].bmAttributes != 0x02 ) {
+		return -1;
+	} if ( data_intf->endpoint[1].bmAttributes != 0x02 ) {
+		return -1;
+	}
+
+	// Check the first endpoint to see if it is IN or OUT
+	if ( data_intf->endpoint[0].bEndpointAddress & 0x80 ) {
+		// This endpoint is IN
+		ether_dev->data_ep_in = data_intf->endpoint[0].bEndpointAddress & 0x7F;
+	} else {
+		// This endpoint is OUT
+		ether_dev->data_ep_out = data_intf->endpoint[0].bEndpointAddress & 0x7F;
+		ether_dev->data_ep_out_size = data_intf->endpoint[0].wMaxPacketSize;
+	}
+
+	// Check the second endpoint to see if it is IN or OUT
+	if ( data_intf->endpoint[1].bEndpointAddress & 0x80 ) {
+		// This endpoint is IN
+		ether_dev->data_ep_in = data_intf->endpoint[1].bEndpointAddress & 0x7F;
+	} else	{
+		// This endpoint is OUT
+		ether_dev->data_ep_out = data_intf->endpoint[1].bEndpointAddress & 0x7F;
+		ether_dev->data_ep_out_size = data_intf->endpoint[1].wMaxPacketSize;
+	}
+	
+	// Now make sure we got both an IN and an OUT
+	if (ether_dev->data_ep_in && ether_dev->data_ep_out) {
+		// We did get both, we are in good shape...
+		info( "detected BULK OUT packets of size %d", ether_dev->data_ep_out_size );
+		return 0;
+	}
+	return -1;
+}
+
+static int verify_ethernet_data_interface( struct usb_device *device, ether_dev_t *ether_dev )
+{
+	struct usb_config_descriptor *conf = NULL;
+	struct usb_interface *data_intf_group = NULL;
+	struct usb_interface_descriptor *data_intf = NULL;
+	int rc = -1;
+	int status;
+	int altset_num;
+
+	// The assumption here is that parse_ethernet_class_information()
+	// and find_valid_configuration() 
+	// have already filled in the information about where to find
+	// a data interface
+	conf = &( device->config[ether_dev->configuration_num] );
+	data_intf_group = &( conf->interface[ether_dev->data_interface] );
+
+	// start out assuming we won't find what we are looking for.
+	ether_dev->data_interface_altset_num_with_traffic = -1;
+	ether_dev->data_bAlternateSetting_with_traffic = -1;
+	ether_dev->data_interface_altset_num_without_traffic = -1;
+	ether_dev->data_bAlternateSetting_without_traffic = -1;
+
+	// Walk through every possible setting for this interface until
+	// we find what makes us happy.
+	for ( altset_num = 0; altset_num < data_intf_group->num_altsetting; altset_num++ ) {
+		data_intf = &( data_intf_group->altsetting[altset_num] );
+
+		// Is this a data interface we like?
+		if ( ( data_intf->bInterfaceClass == 0x0A )
+		   && ( data_intf->bInterfaceSubClass == 0x00 )
+		   && ( data_intf->bInterfaceProtocol == 0x00 ) ) {
+			if ( data_intf->bNumEndpoints == 2 ) {
+				// We are required to have one of these.
+				// An interface with 2 endpoints to send Ethernet traffic back and forth
+				// It actually may be possible that the device might only
+				// communicate in a vendor specific manner.
+				// That would not be very nice.
+				// We can add that one later.
+				ether_dev->data_bInterfaceNumber = data_intf->bInterfaceNumber;
+				ether_dev->data_interface_altset_num_with_traffic = altset_num;
+				ether_dev->data_bAlternateSetting_with_traffic = data_intf->bAlternateSetting;
+				status = get_data_interface_endpoints( device, ether_dev );
+				if (!status) {
+					rc = 0;
+				}
+			}
+			if ( data_intf->bNumEndpoints == 0 ) {
+				// According to the spec we are SUPPOSED to have one of these
+				// In fact the device is supposed to come up in this state.
+				// However, I have seen a device that did not have such an interface.
+				// So it must be just optional for our driver...
+				ether_dev->data_bInterfaceNumber = data_intf->bInterfaceNumber;
+				ether_dev->data_interface_altset_num_without_traffic = altset_num;
+				ether_dev->data_bAlternateSetting_without_traffic = data_intf->bAlternateSetting;
+			}
+		}
+	}
+	return rc;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// Routine to find a communication interface /////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+
+static int find_ethernet_comm_interface( struct usb_device *device, ether_dev_t *ether_dev )
+{
+	struct usb_config_descriptor *conf = NULL;
+	struct usb_interface *comm_intf_group = NULL;
+	struct usb_interface_descriptor *comm_intf = NULL;
+	int intf_num;
+	int altset_num;
+	int rc;
+
+	conf = &( device->config[ether_dev->configuration_num] );
+
+	// We need to check and see if any of these interfaces are something we want.
+	// Walk through each interface one at a time
+	for ( intf_num = 0; intf_num < conf->bNumInterfaces; intf_num++ ) {
+		comm_intf_group = &( conf->interface[intf_num] );
+		// Now for each of those interfaces, check every possible
+		// alternate setting.
+		for ( altset_num = 0; altset_num < comm_intf_group->num_altsetting; altset_num++ ) {
+			comm_intf = &( comm_intf_group->altsetting[altset_num] );
+
+			// Is this a communication class of interface of the
+			// ethernet subclass variety.
+			if ( ( comm_intf->bInterfaceClass == 0x02 )
+			   && ( comm_intf->bInterfaceSubClass == 0x06 )
+			   && ( comm_intf->bInterfaceProtocol == 0x00 ) ) {
+				if ( comm_intf->bNumEndpoints == 1 ) {
+					// Good, we found one, we will try this one
+					// Fill in the structure...
+					ether_dev->comm_interface = intf_num;
+					ether_dev->comm_bInterfaceNumber = comm_intf->bInterfaceNumber;
+					ether_dev->comm_interface_altset_num = altset_num;
+					ether_dev->comm_bAlternateSetting = comm_intf->bAlternateSetting;
+
+					// Look for the Ethernet Functional Descriptors
+					rc = find_and_parse_ethernet_class_information( device, ether_dev );
+					if (rc) {
+						// Nope this was no good after all.
+						continue;
+					}
+
+					// Check that we really can talk to the data
+					// interface 
+					// This includes # of endpoints, protocols,
+					// etc.
+					rc = verify_ethernet_data_interface( device, ether_dev );
+					if (rc)	{
+						// We got something we didn't like
+						continue;
+					}
+					// This communication interface seems to give us everything
+					// we require.  We have all the ethernet info we need.
+					// Let's get out of here and go home right now.
+					return 0;
+				} else {
+                                        // bNumEndPoints != 1
+					// We found an interface that had the wrong number of 
+					// endpoints but would have otherwise been okay
+				} // end bNumEndpoints check.
+			} // end interface specifics check.
+		} // end for altset_num
+	} // end for intf_num
+	return -1;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// Routine to go through all configurations and find one that ////////////////
+// is an Ethernet Networking Device //////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+
+static int find_valid_configuration( struct usb_device *device, ether_dev_t *ether_dev )
+{
+	struct usb_config_descriptor *conf = NULL;
+	int conf_num;
+	int rc;
+
+	// We will try each and every possible configuration
+	for ( conf_num = 0; conf_num < device->descriptor.bNumConfigurations; conf_num++ ) {
+		conf = &( device->config[conf_num] );
+
+		// Our first requirement : 2 interfaces
+		if ( conf->bNumInterfaces != 2 ) {
+			// I currently don't know how to handle devices with any number of interfaces
+			// other than 2.
+			continue;
+		}
+
+		// This one passed our first check, fill in some 
+		// useful data
+		ether_dev->configuration_num = conf_num;
+		ether_dev->bConfigurationValue = conf->bConfigurationValue;
+
+		// Now run it through the ringers and see what comes
+		// out the other side.
+		rc = find_ethernet_comm_interface( device, ether_dev );
+
+		// Check if we found an ethernet Communcation Device
+		if ( !rc ) {
+			// We found one.
+			return 0;
+		}
+	}
+	// None of the configurations suited us.
+	return -1;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// Routine that checks a given configuration to see if any driver ////////////
+// has claimed any of the devices interfaces /////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+
+static int check_for_claimed_interfaces( struct usb_config_descriptor *config )
+{
+	struct usb_interface *comm_intf_group;
+	int intf_num;
+
+	// Go through all the interfaces and make sure none are 
+	// claimed by anybody else.
+	for ( intf_num = 0; intf_num < config->bNumInterfaces; intf_num++ ) {
+		comm_intf_group = &( config->interface[intf_num] );
+		if ( usb_interface_claimed( comm_intf_group ) )	{
+			// Somebody has beat us to this guy.
+			// We can't change the configuration out from underneath of whoever
+			// is using this device, so we will go ahead and give up.
+			return -1;
+		}
+	}
+	// We made it all the way through.
+	// I guess no one has claimed any of these interfaces.
+	return 0;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// Routines to ask for and set the kernel network interface's MAC address ////
+// Used by driver's probe routine ////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+
+static inline unsigned char hex2dec( unsigned char digit )
+{
+	// Is there a standard way to do this???
+	// I have written this code TOO MANY times.
+	if ( (digit >= '0') && (digit <= '9') )	{
+		return (digit - '0');
+	}
+	if ( (digit >= 'a') && (digit <= 'f') )	{
+		return (digit - 'a' + 10);
+	}
+	if ( (digit >= 'A') && (digit <= 'F') )	{
+		return (digit - 'A' + 10);
+	}
+	return 0;
+}
+
+static void set_ethernet_addr( ether_dev_t *ether_dev )
+{
+	unsigned char	mac_addr[6];
+	int		i;
+	int 		len;
+	unsigned char	buffer[13];
+
+	// Let's assume we don't get anything...
+	mac_addr[0] = 0x00;
+	mac_addr[1] = 0x00;
+	mac_addr[2] = 0x00;
+	mac_addr[3] = 0x00;
+	mac_addr[4] = 0x00;
+	mac_addr[5] = 0x00;
+
+	// Let's ask the device...
+	len = usb_string(ether_dev->usb, ether_dev->iMACAddress, buffer, 13);
+
+	// Sanity check!
+	if (len != 12)	{
+		// You gotta love failing sanity checks
+		err("Attempting to get MAC address returned %d bytes", len);
+		return;
+	}
+
+	// Fill in the mac_addr
+	for (i = 0; i < 6; i++)	{
+		mac_addr[i] = ( hex2dec( buffer[2 * i] ) << 4 ) + hex2dec( buffer[2 * i + 1] );
+	}
+
+	// Now copy it over to the kernel's network driver.
+	memcpy( ether_dev->net->dev_addr, mac_addr, sizeof(mac_addr) );
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// Routine to print to syslog information about the driver ///////////////////
+// Used by driver's probe routine ////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+
+void log_device_info(ether_dev_t *ether_dev)
+{
+	int len;
+	int string_num;
+	unsigned char manu[256];
+	unsigned char prod[256];
+	unsigned char sern[256];
+	unsigned char *mac_addr;
+
+	// Default empty strings in case we don't find a real one
+	manu[0] = 0x00;
+	prod[0] = 0x00;
+	sern[0] = 0x00;
+
+	// Try to get the device Manufacturer
+	string_num = ether_dev->usb->descriptor.iManufacturer;
+	if (string_num)	{
+		// Put it into its buffer
+		len = usb_string(ether_dev->usb, string_num, manu, 255);
+		// Just to be safe
+		manu[len] = 0x00;
+	}
+
+	// Try to get the device Product Name
+	string_num = ether_dev->usb->descriptor.iProduct;
+	if (string_num)	{
+		// Put it into its buffer
+		len = usb_string(ether_dev->usb, string_num, prod, 255);
+		// Just to be safe
+		prod[len] = 0x00;
+	}
+
+	// Try to get the device Serial Number
+	string_num = ether_dev->usb->descriptor.iSerialNumber;
+	if (string_num)	{
+		// Put it into its buffer
+		len = usb_string(ether_dev->usb, string_num, sern, 255);
+		// Just to be safe
+		sern[len] = 0x00;
+	}
+
+	// This makes it easier for us to print
+	mac_addr = ether_dev->net->dev_addr;
+
+	// Now send everything we found to the syslog
+	info( "%s: %s %s %s %02X:%02X:%02X:%02X:%02X:%02X", 
+	      ether_dev->net->name, manu, prod, sern, mac_addr[0], 
+	      mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], 
+	      mac_addr[5] );
+}
+
+/* Forward declaration */
+static struct usb_driver CDCEther_driver ;
+
+//////////////////////////////////////////////////////////////////////////////
+// Module's probe routine ////////////////////////////////////////////////////
+// claims interfaces if they are for an Ethernet CDC /////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+
+static void * CDCEther_probe( struct usb_device *usb, unsigned int ifnum,
+			     const struct usb_device_id *id)
+{
+	struct net_device	*net;
+	ether_dev_t		*ether_dev;
+	int 			rc;
+
+	// First we should check the active configuration to see if 
+	// any other driver has claimed any of the interfaces.
+	if ( check_for_claimed_interfaces( usb->actconfig ) ) {
+		// Someone has already put there grubby paws on this device.
+		// We don't want it now...
+		return NULL;
+	}
+
+	// We might be finding a device we can use.
+	// We all go ahead and allocate our storage space.
+	// We need to because we have to start filling in the data that
+	// we are going to need later.
+	if(!(ether_dev = kmalloc(sizeof(ether_dev_t), GFP_KERNEL))) {
+		err("out of memory allocating device structure");
+		return NULL;
+	}
+
+	// Zero everything out.
+	memset(ether_dev, 0, sizeof(ether_dev_t));
+
+	// Let's see if we can find a configuration we can use.
+	rc = find_valid_configuration( usb, ether_dev );
+	if (rc)	{
+		// Nope we couldn't find one we liked.
+		// This device was not meant for us to control.
+		kfree( ether_dev );
+		return	NULL;
+	}
+
+	// Now that we FOUND a configuration. let's try to make the 
+	// device go into it.
+	if ( usb_set_configuration( usb, ether_dev->bConfigurationValue ) ) {
+		err("usb_set_configuration() failed");
+		kfree( ether_dev );
+		return NULL;
+	}
+
+	// Now set the communication interface up as required.
+	if (usb_set_interface(usb, ether_dev->comm_bInterfaceNumber, ether_dev->comm_bAlternateSetting)) {
+		err("usb_set_interface() failed");
+		kfree( ether_dev );
+		return NULL;
+	}
+
+	// Only turn traffic on right now if we must...
+	if (ether_dev->data_interface_altset_num_without_traffic >= 0)	{
+		// We found an alternate setting for the data
+		// interface that allows us to turn off traffic.
+		// We should use it.
+		if (usb_set_interface( usb, 
+		                       ether_dev->data_bInterfaceNumber, 
+		                       ether_dev->data_bAlternateSetting_without_traffic)) {
+			err("usb_set_interface() failed");
+			kfree( ether_dev );
+			return NULL;
+		}
+	} else	{
+		// We didn't find an alternate setting for the data
+		// interface that would let us turn off traffic.
+		// Oh well, let's go ahead and do what we must...
+		if (usb_set_interface( usb, 
+		                       ether_dev->data_bInterfaceNumber, 
+		                       ether_dev->data_bAlternateSetting_with_traffic)) {
+			err("usb_set_interface() failed");
+			kfree( ether_dev );
+			return NULL;
+		}
+	}
+
+	// Now we need to get a kernel Ethernet interface.
+	net = init_etherdev( NULL, 0 );
+	if ( !net ) {
+		// Hmm...  The kernel is not sharing today...
+		// Fine, we didn't want it anyway...
+		err( "Unable to initialize ethernet device" );
+		kfree( ether_dev );
+		return	NULL;
+	}
+
+	// Now that we have an ethernet device, let's set it up
+	// (And I don't mean "set [it] up the bomb".)
+	net->priv = ether_dev;
+	net->open = CDCEther_open;
+	net->stop = CDCEther_close;
+	net->watchdog_timeo = CDC_ETHER_TX_TIMEOUT;
+	net->tx_timeout = CDCEther_tx_timeout;   // TX timeout function
+	net->do_ioctl = CDCEther_ioctl;
+	net->hard_start_xmit = CDCEther_start_xmit;
+	net->set_multicast_list = CDCEther_set_multicast;
+	net->get_stats = CDCEther_netdev_stats;
+	net->mtu = ether_dev->wMaxSegmentSize - 14;
+
+	// We'll keep track of this information for later...
+	ether_dev->usb = usb;
+	ether_dev->net = net;
+	
+	// and don't forget the MAC address.
+	set_ethernet_addr( ether_dev );
+
+	// Send a message to syslog about what we are handling
+	log_device_info( ether_dev );
+
+	// I claim this interface to be a CDC Ethernet Networking device
+	usb_driver_claim_interface( &CDCEther_driver, 
+	                            &(usb->config[ether_dev->configuration_num].interface[ether_dev->comm_interface]), 
+	                            ether_dev );
+	// I claim this interface to be a CDC Ethernet Networking device
+	usb_driver_claim_interface( &CDCEther_driver, 
+	                            &(usb->config[ether_dev->configuration_num].interface[ether_dev->data_interface]), 
+	                            ether_dev );
+
+	// Does this REALLY do anything???
+	usb_inc_dev_use( usb );
+
+	// TODO - last minute HACK
+	ether_dev->comm_ep_in = 5;
+
+	// Okay, we are finally done...
+	return NULL;
+}
+
+
+//////////////////////////////////////////////////////////////////////////////
+// Module's disconnect routine ///////////////////////////////////////////////
+// Called when the driver is unloaded or the device is unplugged /////////////
+// (Whichever happens first assuming the driver suceeded at its probe) ///////
+//////////////////////////////////////////////////////////////////////////////
+
+static void CDCEther_disconnect( struct usb_device *usb, void *ptr )
+{
+	ether_dev_t *ether_dev = ptr;
+
+	// Sanity check!!!
+	if ( !ether_dev || !ether_dev->usb ) {
+		// We failed.  We are insane!!!
+		warn("unregistering non-existant device");
+		return;
+	}
+
+	// Make sure we fail the sanity check if we try this again.
+	ether_dev->usb = NULL;
+	
+	// It is possible that this function is called before
+	// the "close" function.
+	// This tells the close function we are already disconnected
+	ether_dev->flags |= CDC_ETHER_UNPLUG;
+	
+	// We don't need the network device any more
+	unregister_netdev( ether_dev->net );
+	
+	// For sanity checks
+	ether_dev->net = NULL;
+
+	// I ask again, does this do anything???
+	usb_dec_dev_use( usb );
+
+	// We are done with this interface
+	usb_driver_release_interface( &CDCEther_driver, 
+	                              &(usb->config[ether_dev->configuration_num].interface[ether_dev->comm_interface]) );
+
+	// We are done with this interface too
+	usb_driver_release_interface( &CDCEther_driver, 
+	                              &(usb->config[ether_dev->configuration_num].interface[ether_dev->data_interface]) );
+
+	// No more tied up kernel memory
+	kfree( ether_dev );
+	
+	// This does no good, but it looks nice!
+	ether_dev = NULL;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// Driver info ///////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+
+static struct usb_driver CDCEther_driver = {
+	name:		"CDCEther",
+	probe:		CDCEther_probe,
+	disconnect:	CDCEther_disconnect,
+	id_table:	CDCEther_ids,
+};
+
+//////////////////////////////////////////////////////////////////////////////
+// init and exit routines called when driver is installed and uninstalled ////
+//////////////////////////////////////////////////////////////////////////////
+
+int __init CDCEther_init(void)
+{
+	info( "%s", version );
+	return usb_register( &CDCEther_driver );
+}
+
+void __exit CDCEther_exit(void)
+{
+	usb_deregister( &CDCEther_driver );
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// Module info ///////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+
+module_init( CDCEther_init );
+module_exit( CDCEther_exit );
+
+MODULE_AUTHOR("Brad Hards and another");
+MODULE_DESCRIPTION("USB CDC Ethernet driver");
+
+MODULE_DEVICE_TABLE (usb, CDCEther_ids);
+
+//////////////////////////////////////////////////////////////////////////////
+// End of file ///////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
diff -u --recursive --new-file v2.4.8/linux/drivers/usb/CDCEther.h linux/drivers/usb/CDCEther.h
--- v2.4.8/linux/drivers/usb/CDCEther.h	Wed Dec 31 16:00:00 1969
+++ linux/drivers/usb/CDCEther.h	Sun Aug 12 17:37:53 2001
@@ -0,0 +1,88 @@
+// Portions of this file taken from 
+// Petko Manolov - Petkan (petkan@dce.bg)
+// from his driver pegasus.h
+
+/*
+ * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+#define CS_INTERFACE			0x24
+
+#define	CDC_ETHER_MAX_MTU		1536
+
+#define	CDC_ETHER_PRESENT		0x00000001
+#define	CDC_ETHER_RUNNING		0x00000002
+#define	CDC_ETHER_TX_BUSY		0x00000004
+#define	CDC_ETHER_RX_BUSY		0x00000008
+#define	CDC_ETHER_UNPLUG		0x00000040
+
+#define	CDC_ETHER_TX_TIMEOUT	(HZ*10)
+
+#define	TX_UNDERRUN				0x80
+#define	EXCESSIVE_COL			0x40
+#define	LATE_COL				0x20
+#define	NO_CARRIER				0x10
+#define	LOSS_CARRIER			0x08
+#define	JABBER_TIMEOUT			0x04
+
+#define	CDC_ETHER_REQT_READ		0xc0
+#define	CDC_ETHER_REQT_WRITE	0x40
+#define	CDC_ETHER_REQ_GET_REGS	0xf0
+#define	CDC_ETHER_REQ_SET_REGS	0xf1
+#define	CDC_ETHER_REQ_SET_REG	PIPERIDER_REQ_SET_REGS
+#define	ALIGN(x)		x __attribute__((aligned(L1_CACHE_BYTES)))
+
+typedef struct _ether_dev_t {
+	struct usb_device	*usb;
+	struct net_device	*net;
+	struct net_device_stats	stats;
+	unsigned		flags;
+	int			configuration_num;
+	int			bConfigurationValue;
+	int			comm_interface;
+	int			comm_bInterfaceNumber;
+	int			comm_interface_altset_num;
+	int			comm_bAlternateSetting;
+	int			comm_ep_in;
+	int			data_interface;
+	int			data_bInterfaceNumber;
+	int			data_interface_altset_num_with_traffic;
+	int			data_bAlternateSetting_with_traffic;
+	int			data_interface_altset_num_without_traffic;
+	int			data_bAlternateSetting_without_traffic;
+	int			data_ep_in;
+	int			data_ep_out;
+	int			data_ep_out_size;
+	__u16			bcdCDC;
+	__u8			iMACAddress;
+	__u32			bmEthernetStatistics;
+	__u16			wMaxSegmentSize;
+	__u16			wNumberMCFilters;
+	__u8			bNumberPowerFilters;
+	int			intr_interval;
+	struct urb		rx_urb, tx_urb, intr_urb;
+	unsigned char		ALIGN(rx_buff[CDC_ETHER_MAX_MTU]);
+	unsigned char		ALIGN(tx_buff[CDC_ETHER_MAX_MTU]);
+	unsigned char		ALIGN(intr_buff[8]);
+} ether_dev_t;
+
+#define REQ_HDR_FUNC_DESCR	0x0001
+#define REQ_UNION_FUNC_DESCR	0x0002
+#define REQ_ETH_FUNC_DESCR	0x0004
+#define REQUIREMENTS_TOTAL	0x0007
+
+
+
diff -u --recursive --new-file v2.4.8/linux/drivers/usb/dabusb.c linux/drivers/usb/dabusb.c
--- v2.4.8/linux/drivers/usb/dabusb.c	Tue Jul  3 17:08:21 2001
+++ linux/drivers/usb/dabusb.c	Sun Aug 12 10:38:48 2001
@@ -422,11 +422,6 @@
 	return ret;
 }
 
-static loff_t dabusb_llseek (struct file *file, loff_t offset, int origin)
-{
-	return -ESPIPE;
-}
-
 static int dabusb_stop (pdabusb_t s)
 {
 	dbg("dabusb_stop");
@@ -705,7 +700,7 @@
 static struct file_operations dabusb_fops =
 {
 	owner:		THIS_MODULE,
-	llseek:		dabusb_llseek,
+	llseek:		no_llseek,
 	read:		dabusb_read,
 	ioctl:		dabusb_ioctl,
 	open:		dabusb_open,
diff -u --recursive --new-file v2.4.8/linux/drivers/usb/hub.c linux/drivers/usb/hub.c
--- v2.4.8/linux/drivers/usb/hub.c	Wed Apr 25 14:10:47 2001
+++ linux/drivers/usb/hub.c	Sun Aug 12 10:52:29 2001
@@ -9,6 +9,7 @@
 #include <linux/config.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
+#include <linux/completion.h>
 #include <linux/sched.h>
 #include <linux/list.h>
 #include <linux/slab.h>
@@ -36,7 +37,7 @@
 
 static DECLARE_WAIT_QUEUE_HEAD(khubd_wait);
 static int khubd_pid = 0;			/* PID of khubd */
-static DECLARE_MUTEX_LOCKED(khubd_exited);
+static DECLARE_COMPLETION(khubd_exited);
 
 static int usb_get_hub_descriptor(struct usb_device *dev, void *data, int size)
 {
@@ -781,7 +782,7 @@
 
 	dbg("usb_hub_thread exiting");
 
-	up_and_exit(&khubd_exited, 0);
+	complete_and_exit(&khubd_exited, 0);
 }
 
 static struct usb_device_id hub_id_table [] = {
@@ -834,7 +835,7 @@
 	/* Kill the thread */
 	ret = kill_proc(khubd_pid, SIGTERM, 1);
 
-	down(&khubd_exited);
+	wait_for_completion(&khubd_exited);
 
 	/*
 	 * Hub resources are freed for us by usb_deregister. It calls
diff -u --recursive --new-file v2.4.8/linux/drivers/usb/kaweth.c linux/drivers/usb/kaweth.c
--- v2.4.8/linux/drivers/usb/kaweth.c	Wed Dec 31 16:00:00 1969
+++ linux/drivers/usb/kaweth.c	Sun Aug 12 17:37:53 2001
@@ -0,0 +1,1054 @@
+/****************************************************************
+ *
+ *     kaweth.c - driver for KL5KUSB101 based USB->Ethernet
+ *
+ *     (c) 2000 Interlan Communications
+ *     (c) 2000 Stephane Alnet
+ *     (C) 2001 Brad Hards
+ *
+ *     Original author: The Zapman <zapman@interlan.net>
+ *     Inspired by, and much credit goes to Michael Rothwell 
+ *     <rothwell@interlan.net> for the test equipment, help, and patience
+ *     Based off of (and with thanks to) Petko Manolov's pegaus.c driver.
+ *     Also many thanks to Joel Silverman and Ed Surprenant at Kawasaki 
+ *     for providing the firmware and driver resources.
+ *
+ *     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, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 
+ *
+ ****************************************************************/
+
+/* TODO:
+ * Fix in_interrupt() problem
+ * Develop test procedures for USB net interfaces
+ * Run test procedures
+ * Fix bugs from previous two steps
+ * Snoop other OSs for any tricks we're not doing
+ * SMP locking
+ * Reduce arbitrary timeouts 
+ * Smart multicast support 
+ * Temporary MAC change support
+ * Tunable SOFs parameter - ioctl()?
+ * Ethernet stats collection
+ * Code formatting improvements
+ */
+
+#include <linux/module.h>
+#include <linux/sched.h>
+#include <linux/slab.h>
+#include <linux/string.h>
+#include <linux/init.h>
+#include <linux/delay.h>
+#include <linux/netdevice.h>
+#include <linux/etherdevice.h>
+#include <linux/usb.h>
+#include <linux/types.h>
+#include <asm/semaphore.h>
+
+#define DEBUG
+
+#ifdef DEBUG
+#define kaweth_dbg(format, arg...) printk(KERN_DEBUG __FILE__ ": " format "\n" ,##arg)
+#else
+#define kaweth_dbg(format, arg...) do {} while (0)
+#endif
+#define kaweth_err(format, arg...) printk(KERN_ERR __FILE__ ": " format "\n" ,##arg)
+#define kaweth_info(format, arg...) printk(KERN_INFO __FILE__ ": " format "\n" , ##arg)
+#define kaweth_warn(format, arg...) printk(KERN_WARNING __FILE__ ": " format "\n" , ##arg)
+
+
+#include "kawethfw.h"
+
+#define KAWETH_MTU			1514
+#define KAWETH_BUF_SIZE			1664
+#define KAWETH_TX_TIMEOUT		(5 * HZ)
+#define KAWETH_FIRMWARE_BUF_SIZE	4096
+#define KAWETH_CONTROL_TIMEOUT		(30 * HZ)
+
+#define KAWETH_STATUS_BROKEN		0x0000001
+#define KAWETH_STATUS_CLOSING		0x0000002
+
+#define KAWETH_PACKET_FILTER_PROMISCUOUS	0x01
+#define KAWETH_PACKET_FILTER_ALL_MULTICAST	0x02
+#define KAWETH_PACKET_FILTER_DIRECTED		0x04
+#define KAWETH_PACKET_FILTER_BROADCAST		0x08
+#define KAWETH_PACKET_FILTER_MULTICAST		0x10
+
+/* Table 7 */
+#define KAWETH_COMMAND_GET_ETHERNET_DESC	0x00
+#define KAWETH_COMMAND_MULTICAST_FILTERS        0x01
+#define KAWETH_COMMAND_SET_PACKET_FILTER	0x02
+#define KAWETH_COMMAND_STATISTICS               0x03
+#define KAWETH_COMMAND_SET_TEMP_MAC     	0x06
+#define KAWETH_COMMAND_GET_TEMP_MAC             0x07
+#define KAWETH_COMMAND_SET_URB_SIZE		0x08
+#define KAWETH_COMMAND_SET_SOFS_WAIT		0x09
+#define KAWETH_COMMAND_SCAN			0xFF
+
+#define KAWETH_SOFS_TO_WAIT			0x05
+
+
+MODULE_AUTHOR("Michael Zappe <zapman@interlan.net>, Stephane Alnet <stephane@u-picardie.fr> and Brad Hards <bhards@bigpond.net.au>");
+MODULE_DESCRIPTION("KL5USB101 USB Ethernet driver");
+
+static void *kaweth_probe(
+            struct usb_device *dev,             /* the device */
+            unsigned ifnum,                     /* what interface */
+            const struct usb_device_id *id      /* from id_table */
+	);
+static void kaweth_disconnect(struct usb_device *dev, void *ptr);
+int kaweth_internal_control_msg(struct usb_device *usb_dev, unsigned int pipe,
+				devrequest *cmd, void *data, int len,
+				int timeout);
+
+/****************************************************************
+ *     usb_device_id
+ ****************************************************************/
+static struct usb_device_id usb_klsi_table[] = {
+	{ USB_DEVICE(0x03e8, 0x0008) }, /* AOX Endpoints USB Ethernet */ 
+	{ USB_DEVICE(0x04bb, 0x0901) }, /* I-O DATA USB-ET/T */
+	{ USB_DEVICE(0x0506, 0x03e8) }, /* 3Com 3C19250 */ 
+	{ USB_DEVICE(0x0557, 0x2002) }, /* ATEN USB Ethernet */ 
+	{ USB_DEVICE(0x0557, 0x4000) }, /* D-Link DSB-650C */ 
+	{ USB_DEVICE(0x0565, 0x0002) }, /* Peracom Enet */
+	{ USB_DEVICE(0x0565, 0x0005) }, /* Peracom Enet2 */ 
+	{ USB_DEVICE(0x05e9, 0x0008) }, /* KLSI KL5KUSB101B */
+	{ USB_DEVICE(0x05e9, 0x0009) }, /* KLSI KL5KUSB101B (Board change) */
+	{ USB_DEVICE(0x066b, 0x2202) }, /* Linksys USB10T */ 
+	{ USB_DEVICE(0x06e1, 0x0008) }, /* ADS USB-10BT */ 
+	{ USB_DEVICE(0x06e1, 0x0009) }, /* ADS USB-10BT */ 
+	{ USB_DEVICE(0x0707, 0x0100) }, /* SMC 2202USB */ 
+	{ USB_DEVICE(0x07aa, 0x0001) }, /* Correga K.K. */ 
+	{ USB_DEVICE(0x07b8, 0x4000) }, /* D-Link DU-E10 */
+	{ USB_DEVICE(0x0846, 0x1001) }, /* NetGear EA-101 */
+	{ USB_DEVICE(0x0846, 0x1002) }, /* NetGear EA-101 */
+	{ USB_DEVICE(0x085a, 0x0008) }, /* PortGear Ethernet Adapter */
+	{ USB_DEVICE(0x085a, 0x0009) }, /* PortGear Ethernet Adapter */
+	{ USB_DEVICE(0x087d, 0x5704) }, /* Jaton USB Ethernet Device Adapter */
+	{ USB_DEVICE(0x0951, 0x0008) }, /* Kingston Technology USB Ethernet Adapter */
+	{ USB_DEVICE(0x095a, 0x3003) }, /* Portsmith Express Ethernet Adapter */
+	{ USB_DEVICE(0x10bd, 0x1427) }, /* ASANTE USB To Ethernet Adapter */
+	{ USB_DEVICE(0x1342, 0x0204) }, /* Mobility USB-Ethernet Adapter */
+	{ USB_DEVICE(0x13d2, 0x0400) }, /* Shark Pocket Adapter */
+	{ USB_DEVICE(0x1645, 0x0005) }, /* Entrega E45 */ 
+	{ USB_DEVICE(0x1645, 0x0008) }, /* Entrega USB Ethernet Adapter */ 
+	{ USB_DEVICE(0x1645, 0x8005) }, /* PortGear Ethernet Adapter */ 
+	{ USB_DEVICE(0x2001, 0x4000) }, /* D-link DSB-650C */
+	{} /* Null terminator */
+};
+
+MODULE_DEVICE_TABLE (usb, usb_klsi_table);
+
+/****************************************************************
+ *     kaweth_driver
+ ****************************************************************/
+static struct usb_driver kaweth_driver = {
+	name:		"kaweth",
+	probe:		kaweth_probe,
+	disconnect:	kaweth_disconnect,
+	id_table:       usb_klsi_table,
+};
+
+typedef __u8 eth_addr_t[6];
+
+/****************************************************************
+ *     usb_eth_dev
+ ****************************************************************/
+struct usb_eth_dev {
+	char *name;
+	__u16 vendor;
+	__u16 device;
+	void *pdata;
+};
+
+/****************************************************************
+ *     kaweth_ethernet_configuration
+ *     Refer Table 8
+ ****************************************************************/
+struct kaweth_ethernet_configuration
+{
+	__u8 size;
+	__u8 reserved1;
+	__u8 reserved2;
+	eth_addr_t hw_addr;
+	__u32 statistics_mask;
+	__u16 segment_size;
+	__u16 max_multicast_filters;
+	__u8 reserved3;
+} __attribute__ ((packed));
+
+/****************************************************************
+ *     kaweth_device
+ ****************************************************************/
+struct kaweth_device
+{
+	spinlock_t device_lock;
+
+	__u32 status;
+
+	struct usb_device *dev;
+	struct net_device *net;
+	wait_queue_head_t control_wait;
+
+	struct urb *rx_urb;
+	struct urb *tx_urb;
+	
+	__u8 firmware_buf[KAWETH_FIRMWARE_BUF_SIZE];
+	__u8 tx_buf[KAWETH_BUF_SIZE];
+	__u8 rx_buf[KAWETH_BUF_SIZE];
+	__u16 packet_filter_bitmap;
+
+	struct kaweth_ethernet_configuration configuration;
+
+	struct net_device_stats stats;
+} __attribute__ ((packed));
+
+
+/****************************************************************
+ *     kaweth_control
+ ****************************************************************/
+static int kaweth_control(struct kaweth_device *kaweth,
+			  unsigned int pipe, 
+			  __u8 request, 
+			  __u8 requesttype, 
+			  __u16 value, 
+			  __u16 index,
+			  void *data, 
+			  __u16 size, 
+			  int timeout)
+{
+	devrequest *dr;
+
+	kaweth_dbg("kaweth_control()");
+
+	if(in_interrupt()) {
+		kaweth_dbg("in_interrupt()");
+		return -EBUSY;
+	}
+
+	dr = kmalloc(sizeof(devrequest), 
+                     in_interrupt() ? GFP_ATOMIC : GFP_KERNEL);
+
+	if(!dr)
+	{
+		kaweth_dbg("kmalloc() failed");
+		return -ENOMEM;
+	}
+	
+	dr->requesttype = requesttype;
+	dr->request = request;
+	dr->value = value;
+	dr->index = index;
+	dr->length = size;
+
+	return kaweth_internal_control_msg(kaweth->dev,
+					pipe,
+					dr,
+					data,
+					size,
+					timeout);
+}
+
+/****************************************************************
+ *     kaweth_read_configuration
+ ****************************************************************/
+static int kaweth_read_configuration(struct kaweth_device *kaweth)
+{
+	int retval;
+
+	kaweth_dbg("Reading kaweth configuration");
+
+	retval = kaweth_control(kaweth,
+				usb_rcvctrlpipe(kaweth->dev, 0),
+				KAWETH_COMMAND_GET_ETHERNET_DESC,
+				USB_TYPE_VENDOR | USB_DIR_IN | USB_RECIP_DEVICE,
+				0,
+				0,
+				(void *)&kaweth->configuration,
+				sizeof(kaweth->configuration),
+				KAWETH_CONTROL_TIMEOUT);
+
+	return retval;
+}
+
+/****************************************************************
+ *     kaweth_set_urb_size
+ ****************************************************************/
+static int kaweth_set_urb_size(struct kaweth_device *kaweth, __u16 urb_size)
+{
+	int retval;
+
+	kaweth_dbg("Setting URB size to %d", (unsigned)urb_size);
+
+	retval = kaweth_control(kaweth,
+				usb_sndctrlpipe(kaweth->dev, 0),
+				KAWETH_COMMAND_SET_URB_SIZE,
+				USB_TYPE_VENDOR | USB_DIR_OUT | USB_RECIP_DEVICE,
+				urb_size,
+				0,
+				(void *)&kaweth->firmware_buf,
+				0,
+				KAWETH_CONTROL_TIMEOUT);
+
+	return retval;
+}
+
+/****************************************************************
+ *     kaweth_set_sofs_wait
+ ****************************************************************/
+static int kaweth_set_sofs_wait(struct kaweth_device *kaweth, __u16 sofs_wait)
+{
+	int retval;
+
+	kaweth_dbg("Set SOFS wait to %d", (unsigned)sofs_wait);
+
+	retval = kaweth_control(kaweth,
+				usb_sndctrlpipe(kaweth->dev, 0),
+				KAWETH_COMMAND_SET_SOFS_WAIT,
+				USB_TYPE_VENDOR | USB_DIR_OUT | USB_RECIP_DEVICE,
+				sofs_wait,
+				0,
+				(void *)&kaweth->firmware_buf,
+				0,
+				KAWETH_CONTROL_TIMEOUT);
+
+	return retval;
+}
+
+/****************************************************************
+ *     kaweth_set_receive_filter
+ ****************************************************************/
+static int kaweth_set_receive_filter(struct kaweth_device *kaweth,
+				     __u16 receive_filter)
+{
+	int retval;
+
+	kaweth_dbg("Set receive filter to %d", (unsigned)receive_filter);
+
+	retval = kaweth_control(kaweth,
+				usb_sndctrlpipe(kaweth->dev, 0),
+				KAWETH_COMMAND_SET_PACKET_FILTER,
+				USB_TYPE_VENDOR | USB_DIR_OUT | USB_RECIP_DEVICE,
+				receive_filter,
+				0,
+				(void *)&kaweth->firmware_buf,
+				0,
+				KAWETH_CONTROL_TIMEOUT);
+
+	return retval;
+}
+
+/****************************************************************
+ *     kaweth_download_firmware
+ ****************************************************************/
+static int kaweth_download_firmware(struct kaweth_device *kaweth, 
+				    __u8 *data, 
+				    __u16 data_len,
+				    __u8 interrupt,
+				    __u8 type)
+{	
+	if(data_len > KAWETH_FIRMWARE_BUF_SIZE)	{
+		kaweth_err("Firmware too big: %d", data_len);
+		return -ENOSPC;
+	}
+	
+	memcpy(kaweth->firmware_buf, data, data_len);
+	
+	kaweth->firmware_buf[2] = (data_len & 0xFF) - 7;
+	kaweth->firmware_buf[3] = data_len >> 8;
+	kaweth->firmware_buf[4] = type;
+	kaweth->firmware_buf[5] = interrupt;
+
+	kaweth_dbg("Downloading firmware at %x to kaweth device at %x", 
+	    (int)data, 
+	    (int)kaweth);
+	kaweth_dbg("Firmware length: %d", data_len);
+
+	return kaweth_control(kaweth,
+		              usb_sndctrlpipe(kaweth->dev, 0),
+			      KAWETH_COMMAND_SCAN,
+			      USB_TYPE_VENDOR | USB_DIR_OUT | USB_RECIP_DEVICE,
+			      0,
+			      0,
+			      (void *)&kaweth->firmware_buf,
+			      data_len,
+			      KAWETH_CONTROL_TIMEOUT);
+}
+
+/****************************************************************
+ *     kaweth_trigger_firmware
+ ****************************************************************/
+static int kaweth_trigger_firmware(struct kaweth_device *kaweth,
+				   __u8 interrupt)
+{
+	kaweth->firmware_buf[0] = 0xB6;
+	kaweth->firmware_buf[1] = 0xC3;
+	kaweth->firmware_buf[2] = 0x01;
+	kaweth->firmware_buf[3] = 0x00;
+	kaweth->firmware_buf[4] = 0x06;
+	kaweth->firmware_buf[5] = interrupt;
+	kaweth->firmware_buf[6] = 0x00;
+	kaweth->firmware_buf[7] = 0x00;
+	
+	kaweth_dbg("Triggering firmware");
+
+	return kaweth_control(kaweth,
+			      usb_sndctrlpipe(kaweth->dev, 0),
+			      KAWETH_COMMAND_SCAN,
+			      USB_TYPE_VENDOR | USB_DIR_OUT | USB_RECIP_DEVICE,
+			      0,
+			      0,
+			      (void *)&kaweth->firmware_buf,
+			      8,
+			      KAWETH_CONTROL_TIMEOUT);
+}
+
+/****************************************************************
+ *     kaweth_reset
+ ****************************************************************/
+static int kaweth_reset(struct kaweth_device *kaweth)
+{
+	int result;
+
+	kaweth_dbg("kaweth_reset(%p)", kaweth);
+	result = kaweth_control(kaweth,
+				usb_sndctrlpipe(kaweth->dev, 0),
+				USB_REQ_SET_CONFIGURATION, 
+				0, 
+				kaweth->dev->config[0].bConfigurationValue,
+				0, 
+				NULL, 
+				0, 
+				KAWETH_CONTROL_TIMEOUT);
+
+	udelay(10000);
+
+	kaweth_dbg("kaweth_reset() returns %d.",result);
+
+	return result;
+}
+
+static void kaweth_usb_receive(struct urb *);
+
+/****************************************************************
+ *     kaweth_resubmit_rx_urb
+ ****************************************************************/
+static inline void kaweth_resubmit_rx_urb(struct kaweth_device *kaweth)
+{
+	int result;
+
+	memset(kaweth->rx_urb, 0, sizeof(*kaweth->rx_urb));
+
+	FILL_BULK_URB(kaweth->rx_urb,
+		      kaweth->dev,
+		      usb_rcvbulkpipe(kaweth->dev, 1),
+		      kaweth->rx_buf,
+		      KAWETH_BUF_SIZE,
+		      kaweth_usb_receive,
+		      kaweth);
+
+	if((result = usb_submit_urb(kaweth->rx_urb))) {
+		kaweth_err("resubmitting rx_urb %d failed", result);
+	}
+}
+
+static void kaweth_async_set_rx_mode(struct kaweth_device *kaweth);
+
+/****************************************************************
+ *     kaweth_usb_receive
+ ****************************************************************/
+static void kaweth_usb_receive(struct urb *urb)
+{
+	struct kaweth_device *kaweth = urb->context;
+	struct net_device *net = kaweth->net;
+	
+	int count = urb->actual_length;
+	int count2 = urb->transfer_buffer_length;
+			
+	__u16 pkt_len = *(__u16 *)kaweth->rx_buf;
+
+	struct sk_buff *skb;
+
+	if(kaweth->status & KAWETH_STATUS_CLOSING) {
+		return;
+	}
+	
+	if(urb->status && urb->status != -EREMOTEIO && count != 1) { 
+		kaweth_err("%s RX status: %d count: %d packet_len: %d",
+                           net->name, 
+			   urb->status,
+			   count, 
+			   (int)pkt_len);
+		kaweth_resubmit_rx_urb(kaweth);
+                return;
+	}
+
+	if(kaweth->net && (count > 2)) {
+		if(pkt_len > (count - 2)) {
+			kaweth_err("Packet length too long for USB frame (pkt_len: %x, count: %x)",pkt_len, count);
+			kaweth_err("Packet len & 2047: %x", pkt_len & 2047);
+			kaweth_err("Count 2: %x", count2);
+		        kaweth_resubmit_rx_urb(kaweth);
+                        return;
+                }
+		
+		if(!(skb = dev_alloc_skb(pkt_len+2))) {
+		        kaweth_resubmit_rx_urb(kaweth);
+                        return;
+		}
+
+		skb->dev = net;
+
+		eth_copy_and_sum(skb, kaweth->rx_buf + 2, pkt_len, 0);
+		
+		skb_put(skb, pkt_len);
+
+		skb->protocol = eth_type_trans(skb, net);
+		
+		netif_rx(skb);
+		
+		kaweth->stats.rx_packets++;
+		kaweth->stats.rx_bytes += pkt_len;
+	}
+
+	kaweth_resubmit_rx_urb(kaweth);
+}
+
+/****************************************************************
+ *     kaweth_open
+ ****************************************************************/
+static int kaweth_open(struct net_device *net)
+{
+	struct kaweth_device *kaweth = (struct kaweth_device *)net->priv;
+
+	kaweth_dbg("Dev usage: %d", kaweth->dev->refcnt.counter);
+
+	kaweth_dbg("Opening network device.");
+
+	kaweth_resubmit_rx_urb(kaweth);
+
+	netif_start_queue(net);
+
+	MOD_INC_USE_COUNT;
+
+	kaweth_async_set_rx_mode(kaweth);
+	return 0;
+}
+
+/****************************************************************
+ *     kaweth_close
+ ****************************************************************/
+static int kaweth_close(struct net_device *net)
+{
+	struct kaweth_device *kaweth = net->priv;
+
+	netif_stop_queue(net);
+
+	kaweth->status |= KAWETH_STATUS_CLOSING;
+
+	usb_unlink_urb(kaweth->rx_urb);
+
+	kaweth->status &= ~KAWETH_STATUS_CLOSING;
+
+	MOD_DEC_USE_COUNT;
+
+	printk("Dev usage: %d", kaweth->dev->refcnt.counter);
+
+	return 0;
+}
+
+/****************************************************************
+ *     kaweth_ioctl
+ ****************************************************************/
+static int kaweth_ioctl(struct net_device *net, struct ifreq *rq, int cmd)
+{
+	return -EOPNOTSUPP;
+}
+
+/****************************************************************
+ *     kaweth_usb_transmit_complete
+ ****************************************************************/
+static void kaweth_usb_transmit_complete(struct urb *urb)
+{
+	struct kaweth_device *kaweth = urb->context;
+
+	spin_lock(&kaweth->device_lock);
+
+	if (urb->status)
+		kaweth_dbg("%s: TX status %d.", kaweth->net->name, urb->status);
+
+	netif_wake_queue(kaweth->net);
+
+	spin_unlock(&kaweth->device_lock);
+}
+
+/****************************************************************
+ *     kaweth_start_xmit
+ ****************************************************************/
+static int kaweth_start_xmit(struct sk_buff *skb, struct net_device *net)
+{
+	struct kaweth_device *kaweth = net->priv;
+	int count = skb->len;
+	
+	int res;
+
+	spin_lock(&kaweth->device_lock);
+
+	kaweth_async_set_rx_mode(kaweth);
+	netif_stop_queue(net);
+
+	*((__u16 *)kaweth->tx_buf) = skb->len;
+
+	memcpy(kaweth->tx_buf + 2, skb->data, skb->len);
+
+	memset(kaweth->tx_urb, 0, sizeof(*kaweth->tx_urb));
+
+	FILL_BULK_URB(kaweth->tx_urb,
+		      kaweth->dev,
+		      usb_sndbulkpipe(kaweth->dev, 2),
+		      kaweth->tx_buf,
+		      count + 2,
+		      kaweth_usb_transmit_complete,
+		      kaweth);
+
+	if((res = usb_submit_urb(kaweth->tx_urb)))
+	{
+		kaweth_warn("kaweth failed tx_urb %d", res);
+		kaweth->stats.tx_errors++;
+		
+		netif_start_queue(net);
+	} 
+	else 
+	{
+		kaweth->stats.tx_packets++;
+		kaweth->stats.tx_bytes += skb->len;
+		net->trans_start = jiffies;
+	}
+
+	dev_kfree_skb(skb);
+
+	spin_unlock(&kaweth->device_lock);
+
+	return 0;
+}
+
+/****************************************************************
+ *     kaweth_set_rx_mode
+ ****************************************************************/
+static void kaweth_set_rx_mode(struct net_device *net)
+{
+	struct kaweth_device *kaweth = net->priv;
+	
+	__u16 packet_filter_bitmap = KAWETH_PACKET_FILTER_DIRECTED |
+                                     KAWETH_PACKET_FILTER_BROADCAST |
+		                     KAWETH_PACKET_FILTER_MULTICAST;
+
+	kaweth_dbg("Setting Rx mode to %d", packet_filter_bitmap);
+
+	netif_stop_queue(net);
+
+	if (net->flags & IFF_PROMISC) {
+		packet_filter_bitmap |= KAWETH_PACKET_FILTER_PROMISCUOUS;
+	} 
+	else if ((net->mc_count) || (net->flags & IFF_ALLMULTI)) {
+		packet_filter_bitmap |= KAWETH_PACKET_FILTER_ALL_MULTICAST;
+	}
+
+	kaweth->packet_filter_bitmap = packet_filter_bitmap;
+	netif_wake_queue(net);
+}
+
+/****************************************************************
+ *     kaweth_async_set_rx_mode
+ ****************************************************************/
+static void kaweth_async_set_rx_mode(struct kaweth_device *kaweth)
+{
+	__u16 packet_filter_bitmap = kaweth->packet_filter_bitmap;
+	kaweth->packet_filter_bitmap = 0;	
+	if(packet_filter_bitmap == 0) return;
+
+	{
+	int result;
+	result = kaweth_control(kaweth,
+				usb_sndctrlpipe(kaweth->dev, 0),
+				KAWETH_COMMAND_SET_PACKET_FILTER,
+				USB_TYPE_VENDOR | USB_DIR_OUT | USB_RECIP_DEVICE,
+				packet_filter_bitmap,
+				0,
+				(void *)&kaweth->firmware_buf,
+				0,
+				KAWETH_CONTROL_TIMEOUT);
+
+	if(result < 0) {
+		kaweth_err("Failed to set Rx mode: %d", result);
+	}
+	else {
+		kaweth_dbg("Set Rx mode to %d", packet_filter_bitmap);
+	}
+	}
+}
+
+/****************************************************************
+ *     kaweth_netdev_stats
+ ****************************************************************/
+static struct net_device_stats *kaweth_netdev_stats(struct net_device *dev)
+{
+	return &((struct kaweth_device *)dev->priv)->stats;
+}
+
+/****************************************************************
+ *     kaweth_tx_timeout
+ ****************************************************************/
+static void kaweth_tx_timeout(struct net_device *net)
+{
+	struct kaweth_device *kaweth = net->priv;
+
+	kaweth_warn("%s: Tx timed out. Resetting.", net->name);
+	kaweth->stats.tx_errors++;
+	net->trans_start = jiffies;
+
+	usb_unlink_urb(kaweth->tx_urb);
+
+	netif_wake_queue(net);
+}
+
+/****************************************************************
+ *     kaweth_probe
+ ****************************************************************/
+static void *kaweth_probe(
+            struct usb_device *dev,             /* the device */
+            unsigned ifnum,                      /* what interface */
+            const struct usb_device_id *id      /* from id_table */
+	)
+{
+	struct kaweth_device *kaweth;
+	const eth_addr_t bcast_addr = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
+	int result = 0;
+
+	kaweth_dbg("Kawasaki Device Probe (Device number:%d): 0x%4.4x:0x%4.4x:0x%4.4x",
+		 dev->devnum, 
+		 (int)dev->descriptor.idVendor, 
+		 (int)dev->descriptor.idProduct,
+		 (int)dev->descriptor.bcdDevice);
+
+	kaweth_dbg("Device at %p", dev);
+
+	kaweth_dbg("Descriptor length: %x type: %x", 
+		 (int)dev->descriptor.bLength,
+		 (int)dev->descriptor.bDescriptorType);
+
+	if(!(kaweth = kmalloc(sizeof(struct kaweth_device), GFP_KERNEL))) {
+		kaweth_dbg("out of memory allocating device structure\n");
+		return NULL;
+	}
+
+	memset(kaweth, 0, sizeof(struct kaweth_device));
+
+	kaweth->dev = dev;
+	kaweth->status = 0;
+	kaweth->net = NULL;
+	kaweth->device_lock = SPIN_LOCK_UNLOCKED;
+		
+	kaweth_dbg("Resetting.");
+
+	kaweth_reset(kaweth);
+
+	/*
+	 * If high byte of bcdDevice is nonzero, firmware is already
+	 * downloaded. Don't try to do it again, or we'll hang the device.
+	 */
+
+	if (dev->descriptor.bcdDevice >> 8) {
+		kaweth_info("Firmware present in device.");
+	} else {
+		/* Download the firmware */
+		kaweth_info("Downloading firmware...");
+		if ((result = kaweth_download_firmware(kaweth, 
+						      kaweth_new_code, 
+						      len_kaweth_new_code, 
+						      100, 
+						      2)) < 0) {
+			kaweth_err("Error downloading firmware (%d)", result);
+			kfree(kaweth);
+			return NULL;
+		}
+
+		if ((result = kaweth_download_firmware(kaweth, 
+						      kaweth_new_code_fix, 
+						      len_kaweth_new_code_fix, 
+						      100, 
+						      3)) < 0) {
+			kaweth_err("Error downloading firmware fix (%d)", result);
+			kfree(kaweth);
+			return NULL;
+		}
+
+		if ((result = kaweth_download_firmware(kaweth,
+						      kaweth_trigger_code,
+						      len_kaweth_trigger_code,
+						      126,
+						      2)) < 0) {
+			kaweth_err("Error downloading trigger code (%d)", result);
+			kfree(kaweth);
+			return NULL;
+		}
+
+		if ((result = kaweth_download_firmware(kaweth,
+						      kaweth_trigger_code_fix,
+						      len_kaweth_trigger_code_fix,
+						      126,
+						      3)) < 0) {
+			kaweth_err("Error downloading trigger code fix (%d)", result);
+			kfree(kaweth);
+			return NULL;
+		}
+
+
+		if ((result = kaweth_trigger_firmware(kaweth, 126)) < 0) {
+			kaweth_err("Error triggering firmware (%d)", result);
+			kfree(kaweth);
+			return NULL;
+		}
+
+		/* Device will now disappear for a moment...  */
+		kaweth_info("Firmware loaded.  I'll be back...");
+		return NULL;
+	}
+
+	result = kaweth_read_configuration(kaweth);
+
+	if(result < 0) {
+		kaweth_err("Error reading configuration (%d), no net device created", result);
+		kfree(kaweth);
+		return NULL;
+	}
+
+	kaweth_info("Statistics collection: %x", kaweth->configuration.statistics_mask);
+	kaweth_info("Multicast filter limit: %x", kaweth->configuration.max_multicast_filters & ((1 << 15) - 1));
+	kaweth_info("MTU: %d", kaweth->configuration.segment_size);
+	kaweth_info("Read MAC address %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x",
+		 (int)kaweth->configuration.hw_addr[0],
+		 (int)kaweth->configuration.hw_addr[1],
+		 (int)kaweth->configuration.hw_addr[2],
+		 (int)kaweth->configuration.hw_addr[3],
+		 (int)kaweth->configuration.hw_addr[4],
+		 (int)kaweth->configuration.hw_addr[5]);
+
+	if(!memcmp(&kaweth->configuration.hw_addr,
+                   &bcast_addr, 
+		   sizeof(bcast_addr))) {
+		kaweth_err("Firmware not functioning properly, no net device created");
+		kfree(kaweth);
+		return NULL;
+	}
+
+	if(kaweth_set_urb_size(kaweth, KAWETH_BUF_SIZE) < 0) {
+		kaweth_dbg("Error setting URB size");
+		return kaweth;
+	}
+	
+	if(kaweth_set_sofs_wait(kaweth, KAWETH_SOFS_TO_WAIT) < 0) {
+		kaweth_err("Error setting SOFS wait");
+		return kaweth;
+	}
+
+	result = kaweth_set_receive_filter(kaweth, 
+                                           KAWETH_PACKET_FILTER_DIRECTED |
+                                           KAWETH_PACKET_FILTER_BROADCAST |
+                                           KAWETH_PACKET_FILTER_MULTICAST);
+
+	if(result < 0) {
+		kaweth_err("Error setting receive filter");
+		return kaweth;
+	}
+	
+	kaweth_dbg("Initializing net device.");
+
+	kaweth->tx_urb = usb_alloc_urb(0);
+	kaweth->rx_urb = usb_alloc_urb(0);
+
+	kaweth->net = init_etherdev(0, 0);
+
+	memcpy(kaweth->net->broadcast, &bcast_addr, sizeof(bcast_addr));
+	memcpy(kaweth->net->dev_addr, 
+               &kaweth->configuration.hw_addr,
+               sizeof(kaweth->configuration.hw_addr));
+	 
+	kaweth->net->priv = kaweth;
+	kaweth->net->open = kaweth_open;
+	kaweth->net->stop = kaweth_close;
+
+	kaweth->net->watchdog_timeo = KAWETH_TX_TIMEOUT;
+	kaweth->net->tx_timeout = kaweth_tx_timeout;
+	
+	kaweth->net->do_ioctl = kaweth_ioctl;
+	kaweth->net->hard_start_xmit = kaweth_start_xmit;
+	kaweth->net->set_multicast_list = kaweth_set_rx_mode;
+	kaweth->net->get_stats = kaweth_netdev_stats;
+	kaweth->net->mtu = kaweth->configuration.segment_size;
+
+	memset(&kaweth->stats, 0, sizeof(kaweth->stats));
+
+	kaweth_info("kaweth interface created at %s", kaweth->net->name);
+								
+	kaweth_dbg("Kaweth probe returning.");
+
+	return kaweth;
+}
+
+/****************************************************************
+ *     kaweth_disconnect
+ ****************************************************************/
+static void kaweth_disconnect(struct usb_device *dev, void *ptr)
+{
+	struct kaweth_device *kaweth = ptr;
+
+	kaweth_info("Unregistering");
+
+	if (!kaweth) {
+		kaweth_warn("unregistering non-existant device");
+		return;
+	}
+
+	if(kaweth->net) {
+		if(kaweth->net->flags & IFF_UP) {
+			kaweth_dbg("Closing net device");
+			dev_close(kaweth->net);
+		}
+
+		kaweth_dbg("Unregistering net device");
+		unregister_netdev(kaweth->net);
+	}
+
+	usb_free_urb(kaweth->rx_urb);
+	usb_free_urb(kaweth->tx_urb);
+
+	kfree(kaweth);
+}
+
+
+/*-------------------------------------------------------------------*
+ * completion handler for compatibility wrappers (sync control/bulk) *
+ *-------------------------------------------------------------------*/
+static void usb_api_blocking_completion(urb_t *urb)
+{
+        api_wrapper_data *awd = (api_wrapper_data *)urb->context;
+
+        if (waitqueue_active(awd->wakeup)) {
+                wake_up(awd->wakeup);
+	}
+
+}
+
+/*-------------------------------------------------------------------*
+ *                         COMPATIBILITY STUFF                       *
+ *-------------------------------------------------------------------*/
+
+// Starts urb and waits for completion or timeout
+static int usb_start_wait_urb(urb_t *urb, int timeout, int* actual_length)
+{
+        DECLARE_WAITQUEUE(wait, current);
+        DECLARE_WAIT_QUEUE_HEAD(wqh);
+        api_wrapper_data awd;
+        int status;
+
+        awd.wakeup = &wqh;
+        init_waitqueue_head(&wqh);
+        current->state = TASK_INTERRUPTIBLE;
+        add_wait_queue(&wqh, &wait);
+        urb->context = &awd;
+        status = usb_submit_urb(urb);
+        if (status) {
+                // something went wrong
+                usb_free_urb(urb);
+                current->state = TASK_RUNNING;
+                remove_wait_queue(&wqh, &wait);
+                return status;
+        }
+
+        if (urb->status == -EINPROGRESS) {
+                while (timeout && urb->status == -EINPROGRESS)
+                        status = timeout = schedule_timeout(timeout);
+        } 
+	else {
+                status = 1;
+	}
+
+        current->state = TASK_RUNNING;
+        remove_wait_queue(&wqh, &wait);
+
+        if (!status) {
+                // timeout
+                kaweth_warn("usb_control/bulk_msg: timeout");
+                usb_unlink_urb(urb);  // remove urb safely
+                status = -ETIMEDOUT;
+        }
+	else {
+                status = urb->status;
+	}
+
+        if (actual_length) {
+                *actual_length = urb->actual_length;
+	}
+
+        usb_free_urb(urb);
+        return status;
+}
+
+/*-------------------------------------------------------------------*/
+// returns status (negative) or length (positive)
+int kaweth_internal_control_msg(struct usb_device *usb_dev, unsigned int pipe,
+                            devrequest *cmd,  void *data, int len, int timeout)
+{
+        urb_t *urb;
+        int retv;
+        int length;
+
+        urb = usb_alloc_urb(0);
+        if (!urb)
+                return -ENOMEM;
+
+        FILL_CONTROL_URB(urb, usb_dev, pipe, (unsigned char*)cmd, data,
+			 len, (usb_complete_t)usb_api_blocking_completion,0);
+
+        retv = usb_start_wait_urb(urb, timeout, &length);
+        if (retv < 0) {
+                return retv;
+	}
+        else {
+                return length;
+	}
+}
+
+
+/****************************************************************
+ *     kaweth_init
+ ****************************************************************/
+int __init kaweth_init(void)
+{
+	kaweth_dbg("Driver loading");
+	return usb_register(&kaweth_driver);
+}
+
+/****************************************************************
+ *     kaweth_exit
+ ****************************************************************/
+void __exit kaweth_exit(void)
+{
+	usb_deregister(&kaweth_driver);
+}
+
+module_init(kaweth_init);
+module_exit(kaweth_exit);
+
diff -u --recursive --new-file v2.4.8/linux/drivers/usb/kawethfw.h linux/drivers/usb/kawethfw.h
--- v2.4.8/linux/drivers/usb/kawethfw.h	Wed Dec 31 16:00:00 1969
+++ linux/drivers/usb/kawethfw.h	Sun Aug 12 17:37:53 2001
@@ -0,0 +1,557 @@
+/******************************************/
+/* NOTE: B6/C3 is data header signature   */
+/*       0xAA/0xBB is data length = total */
+/*       bytes - 7, 0xCC is type, 0xDD is */
+/*       interrupt to use.                */
+/******************************************/
+
+/****************************************************************
+ *     kaweth_trigger_code
+ ****************************************************************/
+static __u8 kaweth_trigger_code[] = 
+{
+    0xB6, 0xC3, 0xAA, 0xBB, 0xCC, 0xDD,
+    0xc8, 0x07, 0xa0, 0x00, 0xf0, 0x07, 0x5e, 0x00,
+    0x06, 0x00, 0xf0, 0x07, 0x0a, 0x00, 0x08, 0x00,
+    0xf0, 0x09, 0x00, 0x00, 0x02, 0x00, 0xe7, 0x07,
+    0x36, 0x00, 0x00, 0x00, 0xf0, 0x07, 0x00, 0x00,
+    0x04, 0x00, 0xe7, 0x07, 0x50, 0xc3, 0x10, 0xc0,
+    0xf0, 0x09, 0x0e, 0xc0, 0x00, 0x00, 0xe7, 0x87,
+    0x01, 0x00, 0x0e, 0xc0, 0x97, 0xcf, 0xd7, 0x09,
+    0x00, 0xc0, 0x17, 0x02, 0xc8, 0x07, 0xa0, 0x00,
+    0xe7, 0x17, 0x50, 0xc3, 0x10, 0xc0, 0x30, 0xd8,
+    0x04, 0x00, 0x30, 0x5c, 0x08, 0x00, 0x04, 0x00,
+    0xb0, 0xc0, 0x06, 0x00, 0xc8, 0x05, 0xe7, 0x05,
+    0x00, 0xc0, 0xc0, 0xdf, 0x97, 0xcf, 0x49, 0xaf,
+    0xc0, 0x07, 0x00, 0x00, 0x60, 0xaf, 0x4a, 0xaf,
+    0x00, 0x0c, 0x0c, 0x00, 0x40, 0xd2, 0x00, 0x1c,
+    0x0c, 0x00, 0x40, 0xd2, 0x30, 0x00, 0x08, 0x00,
+    0xf0, 0x07, 0x00, 0x00, 0x04, 0x00, 0xf0, 0x07,
+    0x86, 0x00, 0x06, 0x00, 0x67, 0xcf, 0x27, 0x0c,
+    0x02, 0x00, 0x00, 0x00, 0x27, 0x0c, 0x00, 0x00,
+    0x0e, 0xc0, 0x49, 0xaf, 0x64, 0xaf, 0xc0, 0x07,
+    0x00, 0x00, 0x4b, 0xaf, 0x4a, 0xaf, 0x5a, 0xcf,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x94, 0x00, 0x05, 0x00,
+    0x00, 0x00
+};
+/****************************************************************
+ *     kaweth_trigger_code_fix
+ ****************************************************************/
+static __u8 kaweth_trigger_code_fix[] = 
+{
+    0xB6, 0xC3, 0xAA, 0xBB, 0xCC, 0xDD,
+    0x02, 0x00, 0x06, 0x00, 0x18, 0x00, 0x3e, 0x00,
+    0x80, 0x00, 0x98, 0x00, 0xaa, 0x00,
+    0x00, 0x00
+};
+
+/****************************************************************
+ *     kaweth_new_code
+ ****************************************************************/
+static __u8 kaweth_new_code[] = 
+{
+    0xB6, 0xC3, 0xAA, 0xBB, 0xCC, 0xDD,
+    0x9f, 0xcf, 0xde, 0x06, 0xe7, 0x57, 0x00, 0x00,
+    0xc4, 0x06, 0x97, 0xc1, 0xe7, 0x67, 0xff, 0x1f,
+    0x28, 0xc0, 0xe7, 0x87, 0x00, 0x04, 0x24, 0xc0,
+    0xe7, 0x67, 0xff, 0xf9, 0x22, 0xc0, 0x97, 0xcf,
+    0xd7, 0x09, 0x00, 0xc0, 0xe7, 0x09, 0xa2, 0xc0,
+    0xbe, 0x06, 0x9f, 0xaf, 0x36, 0x00, 0xe7, 0x05,
+    0x00, 0xc0, 0xa7, 0xcf, 0xbc, 0x06, 0x97, 0xcf,
+    0xe7, 0x57, 0x00, 0x00, 0xb8, 0x06, 0xa7, 0xa1,
+    0xb8, 0x06, 0x97, 0xcf, 0xe7, 0x57, 0x00, 0x00,
+    0x14, 0x08, 0x0a, 0xc0, 0xe7, 0x57, 0x00, 0x00,
+    0xa4, 0xc0, 0xa7, 0xc0, 0x7a, 0x06, 0x9f, 0xaf,
+    0x92, 0x07, 0xe7, 0x07, 0x00, 0x00, 0x14, 0x08,
+    0xe7, 0x57, 0xff, 0xff, 0xba, 0x06, 0x9f, 0xa0,
+    0x38, 0x00, 0xe7, 0x59, 0xba, 0x06, 0xbe, 0x06,
+    0x9f, 0xa0, 0x38, 0x00, 0xc8, 0x09, 0xca, 0x06,
+    0x08, 0x62, 0x9f, 0xa1, 0x36, 0x08, 0xc0, 0x09,
+    0x76, 0x06, 0x00, 0x60, 0xa7, 0xc0, 0x7a, 0x06,
+    0x9f, 0xaf, 0xcc, 0x02, 0xe7, 0x57, 0x00, 0x00,
+    0xb8, 0x06, 0xa7, 0xc1, 0x7a, 0x06, 0x9f, 0xaf,
+    0x04, 0x00, 0xe7, 0x57, 0x00, 0x00, 0x8e, 0x06,
+    0x0a, 0xc1, 0xe7, 0x09, 0x20, 0xc0, 0x10, 0x08,
+    0xe7, 0xd0, 0x10, 0x08, 0xe7, 0x67, 0x40, 0x00,
+    0x10, 0x08, 0x9f, 0xaf, 0x92, 0x0c, 0xc0, 0x09,
+    0xd0, 0x06, 0x00, 0x60, 0x05, 0xc4, 0xc0, 0x59,
+    0xbe, 0x06, 0x02, 0xc0, 0x9f, 0xaf, 0xec, 0x00,
+    0x9f, 0xaf, 0x34, 0x02, 0xe7, 0x57, 0x00, 0x00,
+    0xa6, 0x06, 0x9f, 0xa0, 0x7a, 0x02, 0xa7, 0xcf,
+    0x7a, 0x06, 0x48, 0x02, 0xe7, 0x09, 0xbe, 0x06,
+    0xd0, 0x06, 0xc8, 0x37, 0x04, 0x00, 0x9f, 0xaf,
+    0x08, 0x03, 0x97, 0xcf, 0xe7, 0x57, 0x00, 0x00,
+    0xce, 0x06, 0x97, 0xc0, 0xd7, 0x09, 0x00, 0xc0,
+    0xc1, 0xdf, 0xc8, 0x09, 0xc6, 0x06, 0x08, 0x62,
+    0x14, 0xc0, 0x27, 0x04, 0xc6, 0x06, 0x10, 0x94,
+    0xf0, 0x07, 0x10, 0x08, 0x02, 0x00, 0xc1, 0x07,
+    0x01, 0x00, 0x70, 0x00, 0x04, 0x00, 0xf0, 0x07,
+    0x30, 0x01, 0x06, 0x00, 0x50, 0xaf, 0xe7, 0x07,
+    0xff, 0xff, 0xd0, 0x06, 0xe7, 0x07, 0x00, 0x00,
+    0xce, 0x06, 0xe7, 0x05, 0x00, 0xc0, 0x97, 0xcf,
+    0xd7, 0x09, 0x00, 0xc0, 0xc1, 0xdf, 0x48, 0x02,
+    0xd0, 0x09, 0xc6, 0x06, 0x27, 0x02, 0xc6, 0x06,
+    0xe7, 0x05, 0x00, 0xc0, 0x97, 0xcf, 0x48, 0x02,
+    0xc8, 0x37, 0x04, 0x00, 0x00, 0x0c, 0x0c, 0x00,
+    0x00, 0x60, 0x21, 0xc0, 0xc0, 0x37, 0x3e, 0x00,
+    0x23, 0xc9, 0xc0, 0x57, 0xb4, 0x05, 0x1b, 0xc8,
+    0xc0, 0x17, 0x3f, 0x00, 0xc0, 0x67, 0xc0, 0xff,
+    0x30, 0x00, 0x08, 0x00, 0xf0, 0x07, 0x00, 0x00,
+    0x04, 0x00, 0x00, 0x02, 0xc0, 0x17, 0x4c, 0x00,
+    0x30, 0x00, 0x06, 0x00, 0xf0, 0x07, 0xa0, 0x01,
+    0x0a, 0x00, 0x48, 0x02, 0xc1, 0x07, 0x02, 0x00,
+    0xd7, 0x09, 0x00, 0xc0, 0xc1, 0xdf, 0x51, 0xaf,
+    0xe7, 0x05, 0x00, 0xc0, 0x97, 0xcf, 0x9f, 0xaf,
+    0x08, 0x03, 0x9f, 0xaf, 0x7a, 0x02, 0x97, 0xcf,
+    0x9f, 0xaf, 0x7a, 0x02, 0xc9, 0x37, 0x04, 0x00,
+    0xc1, 0xdf, 0xc8, 0x09, 0xa2, 0x06, 0x50, 0x02,
+    0x67, 0x02, 0xa2, 0x06, 0xd1, 0x07, 0x00, 0x00,
+    0x27, 0xd8, 0xaa, 0x06, 0xc0, 0xdf, 0x9f, 0xaf,
+    0xc4, 0x01, 0x97, 0xcf, 0xe7, 0x57, 0x00, 0x00,
+    0xd2, 0x06, 0x97, 0xc1, 0xe7, 0x57, 0x01, 0x00,
+    0xa8, 0x06, 0x97, 0xc0, 0xc8, 0x09, 0xa0, 0x06,
+    0x08, 0x62, 0x97, 0xc0, 0x00, 0x02, 0xc0, 0x17,
+    0x0e, 0x00, 0x27, 0x00, 0x34, 0x01, 0x27, 0x0c,
+    0x0c, 0x00, 0x36, 0x01, 0xe7, 0x07, 0x50, 0xc3,
+    0x12, 0xc0, 0xe7, 0x07, 0xcc, 0x0b, 0x02, 0x00,
+    0xe7, 0x07, 0x01, 0x00, 0xa8, 0x06, 0xe7, 0x07,
+    0x05, 0x00, 0x90, 0xc0, 0x97, 0xcf, 0xc8, 0x09,
+    0xa4, 0x06, 0x08, 0x62, 0x02, 0xc0, 0x10, 0x64,
+    0x07, 0xc1, 0xe7, 0x07, 0x00, 0x00, 0x9e, 0x06,
+    0xe7, 0x07, 0x72, 0x04, 0x24, 0x00, 0x97, 0xcf,
+    0x27, 0x04, 0xa4, 0x06, 0xc8, 0x17, 0x0e, 0x00,
+    0x27, 0x02, 0x9e, 0x06, 0xe7, 0x07, 0x80, 0x04,
+    0x24, 0x00, 0x97, 0xcf, 0xd7, 0x09, 0x00, 0xc0,
+    0xc1, 0xdf, 0xe7, 0x57, 0x00, 0x00, 0x90, 0x06,
+    0x13, 0xc1, 0x9f, 0xaf, 0x06, 0x02, 0xe7, 0x57,
+    0x00, 0x00, 0x9e, 0x06, 0x13, 0xc0, 0xe7, 0x09,
+    0x9e, 0x06, 0x30, 0x01, 0xe7, 0x07, 0xf2, 0x05,
+    0x32, 0x01, 0xe7, 0x07, 0x10, 0x00, 0x96, 0xc0,
+    0xe7, 0x09, 0x9e, 0x06, 0x90, 0x06, 0x04, 0xcf,
+    0xe7, 0x57, 0x00, 0x00, 0x9e, 0x06, 0x02, 0xc1,
+    0x9f, 0xaf, 0x06, 0x02, 0xe7, 0x05, 0x00, 0xc0,
+    0x97, 0xcf, 0xd7, 0x09, 0x00, 0xc0, 0xc1, 0xdf,
+    0x08, 0x92, 0xe7, 0x57, 0x02, 0x00, 0xaa, 0x06,
+    0x02, 0xc3, 0xc8, 0x09, 0xa4, 0x06, 0x27, 0x02,
+    0xa6, 0x06, 0x08, 0x62, 0x03, 0xc1, 0xe7, 0x05,
+    0x00, 0xc0, 0x97, 0xcf, 0x27, 0x04, 0xa4, 0x06,
+    0xe7, 0x05, 0x00, 0xc0, 0xf0, 0x07, 0x40, 0x00,
+    0x08, 0x00, 0xf0, 0x07, 0x00, 0x00, 0x04, 0x00,
+    0x00, 0x02, 0xc0, 0x17, 0x0c, 0x00, 0x30, 0x00,
+    0x06, 0x00, 0xf0, 0x07, 0x46, 0x01, 0x0a, 0x00,
+    0xc8, 0x17, 0x04, 0x00, 0xc1, 0x07, 0x02, 0x00,
+    0x51, 0xaf, 0x97, 0xcf, 0xe7, 0x57, 0x00, 0x00,
+    0x96, 0x06, 0x97, 0xc0, 0xc1, 0xdf, 0xc8, 0x09,
+    0x96, 0x06, 0x27, 0x04, 0x96, 0x06, 0x27, 0x52,
+    0x98, 0x06, 0x03, 0xc1, 0xe7, 0x07, 0x96, 0x06,
+    0x98, 0x06, 0xc0, 0xdf, 0x17, 0x02, 0xc8, 0x17,
+    0x0e, 0x00, 0x9f, 0xaf, 0xba, 0x03, 0xc8, 0x05,
+    0x00, 0x60, 0x03, 0xc0, 0x9f, 0xaf, 0x24, 0x03,
+    0x97, 0xcf, 0x9f, 0xaf, 0x08, 0x03, 0x97, 0xcf,
+    0x57, 0x02, 0xc9, 0x07, 0xa4, 0x06, 0xd7, 0x09,
+    0x00, 0xc0, 0xc1, 0xdf, 0x08, 0x62, 0x1b, 0xc0,
+    0x50, 0x04, 0x11, 0x02, 0xe7, 0x05, 0x00, 0xc0,
+    0xc9, 0x05, 0x97, 0xcf, 0x97, 0x02, 0xca, 0x09,
+    0xd6, 0x06, 0xf2, 0x17, 0x01, 0x00, 0x04, 0x00,
+    0xf2, 0x27, 0x00, 0x00, 0x06, 0x00, 0xca, 0x17,
+    0x2c, 0x00, 0xf8, 0x77, 0x01, 0x00, 0x0e, 0x00,
+    0x06, 0xc0, 0xca, 0xd9, 0xf8, 0x57, 0xff, 0x00,
+    0x0e, 0x00, 0x01, 0xc1, 0xca, 0xd9, 0x22, 0x1c,
+    0x0c, 0x00, 0xe2, 0x27, 0x00, 0x00, 0xe2, 0x17,
+    0x01, 0x00, 0xe2, 0x27, 0x00, 0x00, 0xca, 0x05,
+    0x00, 0x0c, 0x0c, 0x00, 0xc0, 0x17, 0x41, 0x00,
+    0xc0, 0x67, 0xc0, 0xff, 0x30, 0x00, 0x08, 0x00,
+    0x00, 0x02, 0xc0, 0x17, 0x0c, 0x00, 0x30, 0x00,
+    0x06, 0x00, 0xf0, 0x07, 0xda, 0x00, 0x0a, 0x00,
+    0xf0, 0x07, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0c,
+    0x08, 0x00, 0x40, 0xd1, 0x01, 0x00, 0xc0, 0x19,
+    0xce, 0x06, 0xc0, 0x59, 0xc2, 0x06, 0x04, 0xc9,
+    0x49, 0xaf, 0x9f, 0xaf, 0xec, 0x00, 0x4a, 0xaf,
+    0x67, 0x10, 0xce, 0x06, 0xc8, 0x17, 0x04, 0x00,
+    0xc1, 0x07, 0x01, 0x00, 0xd7, 0x09, 0x00, 0xc0,
+    0xc1, 0xdf, 0x50, 0xaf, 0xe7, 0x05, 0x00, 0xc0,
+    0x97, 0xcf, 0xc0, 0x07, 0x01, 0x00, 0xc1, 0x09,
+    0xac, 0x06, 0xc1, 0x77, 0x01, 0x00, 0x97, 0xc1,
+    0xd8, 0x77, 0x01, 0x00, 0x12, 0xc0, 0xc9, 0x07,
+    0x6a, 0x06, 0x9f, 0xaf, 0x08, 0x04, 0x04, 0xc1,
+    0xc1, 0x77, 0x08, 0x00, 0x13, 0xc0, 0x97, 0xcf,
+    0xc1, 0x77, 0x02, 0x00, 0x97, 0xc1, 0xc1, 0x77,
+    0x10, 0x00, 0x0c, 0xc0, 0x9f, 0xaf, 0x2c, 0x04,
+    0x97, 0xcf, 0xc1, 0x77, 0x04, 0x00, 0x06, 0xc0,
+    0xc9, 0x07, 0x70, 0x06, 0x9f, 0xaf, 0x08, 0x04,
+    0x97, 0xc0, 0x00, 0xcf, 0x00, 0x90, 0x97, 0xcf,
+    0x50, 0x54, 0x97, 0xc1, 0x70, 0x5c, 0x02, 0x00,
+    0x02, 0x00, 0x97, 0xc1, 0x70, 0x5c, 0x04, 0x00,
+    0x04, 0x00, 0x97, 0xcf, 0x80, 0x01, 0xc0, 0x00,
+    0x60, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0c, 0x00,
+    0x06, 0x00, 0x00, 0x00, 0xcb, 0x09, 0xb2, 0x06,
+    0xcc, 0x09, 0xb4, 0x06, 0x0b, 0x53, 0x11, 0xc0,
+    0xc9, 0x02, 0xca, 0x07, 0x1c, 0x04, 0x9f, 0xaf,
+    0x08, 0x04, 0x97, 0xc0, 0x0a, 0xc8, 0x82, 0x08,
+    0x0a, 0xcf, 0x82, 0x08, 0x9f, 0xaf, 0x08, 0x04,
+    0x97, 0xc0, 0x05, 0xc2, 0x89, 0x30, 0x82, 0x60,
+    0x78, 0xc1, 0x00, 0x90, 0x97, 0xcf, 0x89, 0x10,
+    0x09, 0x53, 0x79, 0xc2, 0x89, 0x30, 0x82, 0x08,
+    0x7a, 0xcf, 0xc0, 0xdf, 0x97, 0xcf, 0xc0, 0xdf,
+    0x97, 0xcf, 0xe7, 0x09, 0x96, 0xc0, 0x92, 0x06,
+    0xe7, 0x09, 0x98, 0xc0, 0x94, 0x06, 0x0f, 0xcf,
+    0xe7, 0x09, 0x96, 0xc0, 0x92, 0x06, 0xe7, 0x09,
+    0x98, 0xc0, 0x94, 0x06, 0xe7, 0x09, 0x9e, 0x06,
+    0x30, 0x01, 0xe7, 0x07, 0xf2, 0x05, 0x32, 0x01,
+    0xe7, 0x07, 0x10, 0x00, 0x96, 0xc0, 0xd7, 0x09,
+    0x00, 0xc0, 0x17, 0x02, 0xc8, 0x09, 0x90, 0x06,
+    0xc8, 0x37, 0x0e, 0x00, 0xe7, 0x77, 0x2a, 0x00,
+    0x92, 0x06, 0x30, 0xc0, 0x97, 0x02, 0xca, 0x09,
+    0xd6, 0x06, 0xe7, 0x77, 0x20, 0x00, 0x92, 0x06,
+    0x0e, 0xc0, 0xf2, 0x17, 0x01, 0x00, 0x10, 0x00,
+    0xf2, 0x27, 0x00, 0x00, 0x12, 0x00, 0xe7, 0x77,
+    0x0a, 0x00, 0x92, 0x06, 0xca, 0x05, 0x1e, 0xc0,
+    0x97, 0x02, 0xca, 0x09, 0xd6, 0x06, 0xf2, 0x17,
+    0x01, 0x00, 0x0c, 0x00, 0xf2, 0x27, 0x00, 0x00,
+    0x0e, 0x00, 0xe7, 0x77, 0x02, 0x00, 0x92, 0x06,
+    0x07, 0xc0, 0xf2, 0x17, 0x01, 0x00, 0x44, 0x00,
+    0xf2, 0x27, 0x00, 0x00, 0x46, 0x00, 0x06, 0xcf,
+    0xf2, 0x17, 0x01, 0x00, 0x60, 0x00, 0xf2, 0x27,
+    0x00, 0x00, 0x62, 0x00, 0xca, 0x05, 0x9f, 0xaf,
+    0x08, 0x03, 0x0f, 0xcf, 0x57, 0x02, 0x09, 0x02,
+    0xf1, 0x09, 0x94, 0x06, 0x0c, 0x00, 0xf1, 0xda,
+    0x0c, 0x00, 0xc8, 0x09, 0x98, 0x06, 0x50, 0x02,
+    0x67, 0x02, 0x98, 0x06, 0xd1, 0x07, 0x00, 0x00,
+    0xc9, 0x05, 0xe7, 0x09, 0x9e, 0x06, 0x90, 0x06,
+    0xe7, 0x57, 0x00, 0x00, 0x90, 0x06, 0x02, 0xc0,
+    0x9f, 0xaf, 0x06, 0x02, 0xc8, 0x05, 0xe7, 0x05,
+    0x00, 0xc0, 0xc0, 0xdf, 0x97, 0xcf, 0xd7, 0x09,
+    0x00, 0xc0, 0x17, 0x00, 0x17, 0x02, 0x97, 0x02,
+    0xc0, 0x09, 0x92, 0xc0, 0xe7, 0x07, 0x04, 0x00,
+    0x90, 0xc0, 0xca, 0x09, 0xd6, 0x06, 0xe7, 0x07,
+    0x00, 0x00, 0xa8, 0x06, 0xe7, 0x07, 0x6a, 0x04,
+    0x02, 0x00, 0xc0, 0x77, 0x02, 0x00, 0x08, 0xc0,
+    0xf2, 0x17, 0x01, 0x00, 0x50, 0x00, 0xf2, 0x27,
+    0x00, 0x00, 0x52, 0x00, 0x9f, 0xcf, 0x24, 0x06,
+    0xc0, 0x77, 0x10, 0x00, 0x06, 0xc0, 0xf2, 0x17,
+    0x01, 0x00, 0x58, 0x00, 0xf2, 0x27, 0x00, 0x00,
+    0x5a, 0x00, 0xc0, 0x77, 0x80, 0x00, 0x06, 0xc0,
+    0xf2, 0x17, 0x01, 0x00, 0x70, 0x00, 0xf2, 0x27,
+    0x00, 0x00, 0x72, 0x00, 0xc0, 0x77, 0x08, 0x00,
+    0x1d, 0xc1, 0xf2, 0x17, 0x01, 0x00, 0x08, 0x00,
+    0xf2, 0x27, 0x00, 0x00, 0x0a, 0x00, 0xc0, 0x77,
+    0x00, 0x02, 0x06, 0xc0, 0xf2, 0x17, 0x01, 0x00,
+    0x64, 0x00, 0xf2, 0x27, 0x00, 0x00, 0x66, 0x00,
+    0xc0, 0x77, 0x40, 0x00, 0x06, 0xc0, 0xf2, 0x17,
+    0x01, 0x00, 0x5c, 0x00, 0xf2, 0x27, 0x00, 0x00,
+    0x5e, 0x00, 0xc0, 0x77, 0x01, 0x00, 0x01, 0xc0,
+    0x1b, 0xcf, 0x1a, 0xcf, 0xf2, 0x17, 0x01, 0x00,
+    0x00, 0x00, 0xf2, 0x27, 0x00, 0x00, 0x02, 0x00,
+    0xc8, 0x09, 0x34, 0x01, 0xca, 0x17, 0x14, 0x00,
+    0xd8, 0x77, 0x01, 0x00, 0x05, 0xc0, 0xca, 0xd9,
+    0xd8, 0x57, 0xff, 0x00, 0x01, 0xc0, 0xca, 0xd9,
+    0xe2, 0x19, 0x94, 0xc0, 0xe2, 0x27, 0x00, 0x00,
+    0xe2, 0x17, 0x01, 0x00, 0xe2, 0x27, 0x00, 0x00,
+    0x9f, 0xaf, 0x40, 0x06, 0x9f, 0xaf, 0xc4, 0x01,
+    0xe7, 0x57, 0x00, 0x00, 0xd2, 0x06, 0x9f, 0xa1,
+    0x0e, 0x0a, 0xca, 0x05, 0xc8, 0x05, 0xc0, 0x05,
+    0xe7, 0x05, 0x00, 0xc0, 0xc0, 0xdf, 0x97, 0xcf,
+    0xc8, 0x09, 0xa0, 0x06, 0x08, 0x62, 0x97, 0xc0,
+    0x27, 0x04, 0xa0, 0x06, 0x27, 0x52, 0xa2, 0x06,
+    0x03, 0xc1, 0xe7, 0x07, 0xa0, 0x06, 0xa2, 0x06,
+    0x9f, 0xaf, 0x08, 0x03, 0xe7, 0x57, 0x00, 0x00,
+    0xaa, 0x06, 0x02, 0xc0, 0x27, 0xda, 0xaa, 0x06,
+    0x97, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0xff, 0xff, 0xfb, 0x13, 0xe7, 0x57,
+    0x00, 0x80, 0xb2, 0x00, 0x06, 0xc2, 0xe7, 0x07,
+    0xee, 0x0b, 0x12, 0x00, 0xe7, 0x07, 0x34, 0x0c,
+    0xb2, 0x00, 0xe7, 0x07, 0xc6, 0x07, 0xf2, 0x02,
+    0xc8, 0x09, 0xb4, 0x00, 0xf8, 0x07, 0x02, 0x00,
+    0x0d, 0x00, 0xd7, 0x09, 0x0e, 0xc0, 0xe7, 0x07,
+    0x00, 0x00, 0x0e, 0xc0, 0xc8, 0x09, 0xde, 0x00,
+    0xc8, 0x17, 0x09, 0x00, 0xc9, 0x07, 0xda, 0x06,
+    0xc0, 0x07, 0x04, 0x00, 0x68, 0x0a, 0x00, 0xda,
+    0x7d, 0xc1, 0xe7, 0x09, 0xc0, 0x00, 0x7c, 0x06,
+    0xe7, 0x09, 0xbe, 0x00, 0x78, 0x06, 0xe7, 0x09,
+    0x10, 0x00, 0xbc, 0x06, 0xc8, 0x07, 0xd6, 0x07,
+    0x9f, 0xaf, 0xae, 0x07, 0x9f, 0xaf, 0x00, 0x0a,
+    0xc8, 0x09, 0xde, 0x00, 0x00, 0x0e, 0x0f, 0x00,
+    0x41, 0x90, 0x9f, 0xde, 0x06, 0x00, 0x44, 0xaf,
+    0x27, 0x00, 0xb2, 0x06, 0x27, 0x00, 0xb4, 0x06,
+    0x27, 0x00, 0xb6, 0x06, 0xc0, 0x07, 0x74, 0x00,
+    0x44, 0xaf, 0x27, 0x00, 0xd6, 0x06, 0x08, 0x00,
+    0x00, 0x90, 0xc1, 0x07, 0x3a, 0x00, 0x20, 0x00,
+    0x01, 0xda, 0x7d, 0xc1, 0x9f, 0xaf, 0xba, 0x09,
+    0xc0, 0x07, 0x44, 0x00, 0x48, 0xaf, 0x27, 0x00,
+    0x7a, 0x06, 0x9f, 0xaf, 0x96, 0x0a, 0xe7, 0x07,
+    0x01, 0x00, 0xc0, 0x06, 0xe7, 0x05, 0x0e, 0xc0,
+    0x97, 0xcf, 0x49, 0xaf, 0xe7, 0x87, 0x43, 0x00,
+    0x0e, 0xc0, 0xe7, 0x07, 0xff, 0xff, 0xbe, 0x06,
+    0x9f, 0xaf, 0xae, 0x0a, 0xc0, 0x07, 0x01, 0x00,
+    0x60, 0xaf, 0x4a, 0xaf, 0x97, 0xcf, 0x00, 0x08,
+    0x09, 0x08, 0x11, 0x08, 0x00, 0xda, 0x7c, 0xc1,
+    0x97, 0xcf, 0x67, 0x04, 0xcc, 0x02, 0xc0, 0xdf,
+    0x51, 0x94, 0xb1, 0xaf, 0x06, 0x00, 0xc1, 0xdf,
+    0xc9, 0x09, 0xcc, 0x02, 0x49, 0x62, 0x75, 0xc1,
+    0xc0, 0xdf, 0xa7, 0xcf, 0xd6, 0x02, 0x0e, 0x00,
+    0x24, 0x00, 0x80, 0x04, 0x22, 0x00, 0x4e, 0x05,
+    0xd0, 0x00, 0x0e, 0x0a, 0xaa, 0x00, 0x30, 0x08,
+    0xbe, 0x00, 0x4a, 0x0a, 0x10, 0x00, 0x20, 0x00,
+    0x04, 0x00, 0x6e, 0x04, 0x02, 0x00, 0x6a, 0x04,
+    0x06, 0x00, 0x00, 0x00, 0x24, 0xc0, 0x04, 0x04,
+    0x28, 0xc0, 0xfe, 0xfb, 0x1e, 0xc0, 0x00, 0x04,
+    0x22, 0xc0, 0xff, 0xf4, 0xc0, 0x00, 0x90, 0x09,
+    0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x56, 0x08,
+    0x60, 0x08, 0xd0, 0x08, 0xda, 0x08, 0x00, 0x09,
+    0x04, 0x09, 0x08, 0x09, 0x32, 0x09, 0x42, 0x09,
+    0x50, 0x09, 0x52, 0x09, 0x5a, 0x09, 0x5a, 0x09,
+    0x27, 0x02, 0xca, 0x06, 0x97, 0xcf, 0xe7, 0x07,
+    0x00, 0x00, 0xca, 0x06, 0x0a, 0x0e, 0x01, 0x00,
+    0xca, 0x57, 0x0e, 0x00, 0x9f, 0xc3, 0x5a, 0x09,
+    0xca, 0x37, 0x00, 0x00, 0x9f, 0xc2, 0x5a, 0x09,
+    0x0a, 0xd2, 0xb2, 0xcf, 0x16, 0x08, 0xc8, 0x09,
+    0xde, 0x00, 0x07, 0x06, 0x9f, 0xcf, 0x6c, 0x09,
+    0x17, 0x02, 0xc8, 0x09, 0xde, 0x00, 0x00, 0x0e,
+    0x0f, 0x00, 0x41, 0x90, 0x9f, 0xde, 0x06, 0x00,
+    0xc8, 0x05, 0x30, 0x50, 0x06, 0x00, 0x9f, 0xc8,
+    0x5a, 0x09, 0x27, 0x0c, 0x02, 0x00, 0xb0, 0x06,
+    0xc0, 0x09, 0xb2, 0x06, 0x27, 0x00, 0xb4, 0x06,
+    0xe7, 0x07, 0x00, 0x00, 0xae, 0x06, 0x27, 0x00,
+    0x80, 0x06, 0x00, 0x1c, 0x06, 0x00, 0x27, 0x00,
+    0xb6, 0x06, 0x41, 0x90, 0x67, 0x50, 0xb0, 0x06,
+    0x0d, 0xc0, 0x67, 0x00, 0x7e, 0x06, 0x27, 0x0c,
+    0x06, 0x00, 0x82, 0x06, 0xe7, 0x07, 0xbc, 0x08,
+    0x84, 0x06, 0xc8, 0x07, 0x7e, 0x06, 0x41, 0x90,
+    0x51, 0xaf, 0x97, 0xcf, 0x9f, 0xaf, 0x48, 0x0c,
+    0xe7, 0x09, 0xb6, 0x06, 0xb4, 0x06, 0xe7, 0x09,
+    0xb0, 0x06, 0xae, 0x06, 0x59, 0xaf, 0x97, 0xcf,
+    0x27, 0x0c, 0x02, 0x00, 0xac, 0x06, 0x59, 0xaf,
+    0x97, 0xcf, 0x09, 0x0c, 0x02, 0x00, 0x09, 0xda,
+    0x49, 0xd2, 0xc9, 0x19, 0xd6, 0x06, 0xc8, 0x07,
+    0x7e, 0x06, 0xe0, 0x07, 0x00, 0x00, 0x60, 0x02,
+    0xe0, 0x07, 0x04, 0x00, 0xd0, 0x07, 0xcc, 0x08,
+    0x48, 0xdb, 0x41, 0x90, 0x50, 0xaf, 0x97, 0xcf,
+    0x59, 0xaf, 0x97, 0xcf, 0x59, 0xaf, 0x97, 0xcf,
+    0xf0, 0x57, 0x06, 0x00, 0x06, 0x00, 0x25, 0xc1,
+    0xe7, 0x07, 0x70, 0x06, 0x80, 0x06, 0x41, 0x90,
+    0x67, 0x00, 0x7e, 0x06, 0x27, 0x0c, 0x06, 0x00,
+    0x82, 0x06, 0xe7, 0x07, 0x8c, 0x09, 0x84, 0x06,
+    0xc8, 0x07, 0x7e, 0x06, 0x41, 0x90, 0x51, 0xaf,
+    0x97, 0xcf, 0x07, 0x0c, 0x06, 0x00, 0xc7, 0x57,
+    0x06, 0x00, 0x0f, 0xc1, 0xc8, 0x07, 0x70, 0x06,
+    0x15, 0xcf, 0x00, 0x0c, 0x02, 0x00, 0x00, 0xda,
+    0x40, 0xd1, 0x27, 0x00, 0xc2, 0x06, 0x1e, 0xcf,
+    0x1d, 0xcf, 0x27, 0x0c, 0x02, 0x00, 0xcc, 0x06,
+    0x19, 0xcf, 0x27, 0x02, 0x20, 0x01, 0xe7, 0x07,
+    0x08, 0x00, 0x22, 0x01, 0xe7, 0x07, 0x13, 0x00,
+    0xb0, 0xc0, 0x97, 0xcf, 0x41, 0x90, 0x67, 0x00,
+    0x7e, 0x06, 0xe7, 0x01, 0x82, 0x06, 0x27, 0x02,
+    0x80, 0x06, 0xe7, 0x07, 0x8c, 0x09, 0x84, 0x06,
+    0xc8, 0x07, 0x7e, 0x06, 0xc1, 0x07, 0x00, 0x80,
+    0x50, 0xaf, 0x97, 0xcf, 0x59, 0xaf, 0x97, 0xcf,
+    0x00, 0x60, 0x05, 0xc0, 0xe7, 0x07, 0x00, 0x00,
+    0xc4, 0x06, 0xa7, 0xcf, 0x7c, 0x06, 0x9f, 0xaf,
+    0x00, 0x0a, 0xe7, 0x07, 0x01, 0x00, 0xc4, 0x06,
+    0x49, 0xaf, 0xd7, 0x09, 0x00, 0xc0, 0x07, 0xaf,
+    0xe7, 0x05, 0x00, 0xc0, 0x4a, 0xaf, 0xa7, 0xcf,
+    0x7c, 0x06, 0xc0, 0x07, 0xfe, 0x7f, 0x44, 0xaf,
+    0x40, 0x00, 0xc0, 0x37, 0x00, 0x01, 0x41, 0x90,
+    0xc0, 0x37, 0x08, 0x00, 0xdf, 0xde, 0x50, 0x06,
+    0xc0, 0x57, 0x10, 0x00, 0x02, 0xc2, 0xc0, 0x07,
+    0x10, 0x00, 0x27, 0x00, 0x9a, 0x06, 0x41, 0x90,
+    0x9f, 0xde, 0x40, 0x06, 0x44, 0xaf, 0x27, 0x00,
+    0x9c, 0x06, 0xc0, 0x09, 0x9a, 0x06, 0x41, 0x90,
+    0x00, 0xd2, 0x00, 0xd8, 0x9f, 0xde, 0x08, 0x00,
+    0x44, 0xaf, 0x27, 0x00, 0xc8, 0x06, 0x97, 0xcf,
+    0xe7, 0x87, 0x00, 0x84, 0x28, 0xc0, 0xe7, 0x67,
+    0xff, 0xfb, 0x24, 0xc0, 0x97, 0xcf, 0xe7, 0x87,
+    0x01, 0x00, 0xd2, 0x06, 0xe7, 0x57, 0x00, 0x00,
+    0xa8, 0x06, 0x97, 0xc1, 0x9f, 0xaf, 0x00, 0x0a,
+    0xe7, 0x87, 0x00, 0x06, 0x22, 0xc0, 0xe7, 0x07,
+    0x00, 0x00, 0x90, 0xc0, 0xe7, 0x67, 0xfe, 0xff,
+    0x3e, 0xc0, 0xe7, 0x07, 0x26, 0x00, 0x0a, 0xc0,
+    0xe7, 0x87, 0x01, 0x00, 0x3e, 0xc0, 0xe7, 0x07,
+    0xff, 0xff, 0xbe, 0x06, 0x9f, 0xaf, 0x10, 0x0b,
+    0x97, 0xcf, 0x17, 0x00, 0xa7, 0xaf, 0x78, 0x06,
+    0xc0, 0x05, 0x27, 0x00, 0x76, 0x06, 0xe7, 0x87,
+    0x01, 0x00, 0xd2, 0x06, 0x9f, 0xaf, 0x00, 0x0a,
+    0xe7, 0x07, 0x0c, 0x00, 0x40, 0xc0, 0x9f, 0xaf,
+    0x10, 0x0b, 0x00, 0x90, 0x27, 0x00, 0xa6, 0x06,
+    0x27, 0x00, 0xaa, 0x06, 0xe7, 0x09, 0xb2, 0x06,
+    0xb4, 0x06, 0x27, 0x00, 0xae, 0x06, 0x27, 0x00,
+    0xac, 0x06, 0x9f, 0xaf, 0xae, 0x0a, 0xc0, 0x07,
+    0x00, 0x00, 0x27, 0x00, 0xb2, 0x02, 0x27, 0x00,
+    0xb4, 0x02, 0x27, 0x00, 0x8e, 0x06, 0xc0, 0x07,
+    0x06, 0x00, 0xc8, 0x09, 0xde, 0x00, 0xc8, 0x17,
+    0x03, 0x00, 0xc9, 0x07, 0x70, 0x06, 0x29, 0x0a,
+    0x00, 0xda, 0x7d, 0xc1, 0x97, 0xcf, 0xd7, 0x09,
+    0x00, 0xc0, 0xc1, 0xdf, 0x00, 0x90, 0x27, 0x00,
+    0x96, 0x06, 0xe7, 0x07, 0x96, 0x06, 0x98, 0x06,
+    0x27, 0x00, 0xa0, 0x06, 0xe7, 0x07, 0xa0, 0x06,
+    0xa2, 0x06, 0x27, 0x00, 0xa6, 0x06, 0x27, 0x00,
+    0x90, 0x06, 0x27, 0x00, 0x9e, 0x06, 0xc8, 0x09,
+    0x9c, 0x06, 0xc1, 0x09, 0x9a, 0x06, 0xc9, 0x07,
+    0xa4, 0x06, 0x11, 0x02, 0x09, 0x02, 0xc8, 0x17,
+    0x40, 0x06, 0x01, 0xda, 0x7a, 0xc1, 0x51, 0x94,
+    0xc8, 0x09, 0xc8, 0x06, 0xc9, 0x07, 0xc6, 0x06,
+    0xc1, 0x09, 0x9a, 0x06, 0x11, 0x02, 0x09, 0x02,
+    0xc8, 0x17, 0x08, 0x00, 0x01, 0xda, 0x7a, 0xc1,
+    0x51, 0x94, 0xe7, 0x05, 0x00, 0xc0, 0x97, 0xcf,
+    0xe7, 0x57, 0x00, 0x00, 0x76, 0x06, 0x97, 0xc0,
+    0x9f, 0xaf, 0x04, 0x00, 0xe7, 0x09, 0xbe, 0x06,
+    0xba, 0x06, 0xe7, 0x57, 0xff, 0xff, 0xba, 0x06,
+    0x04, 0xc1, 0xe7, 0x07, 0x10, 0x0b, 0xb8, 0x06,
+    0x97, 0xcf, 0xe7, 0x17, 0x32, 0x00, 0xba, 0x06,
+    0xe7, 0x67, 0xff, 0x07, 0xba, 0x06, 0xe7, 0x07,
+    0x46, 0x0b, 0xb8, 0x06, 0x97, 0xcf, 0xe7, 0x57,
+    0x00, 0x00, 0xc0, 0x06, 0x23, 0xc0, 0xe7, 0x07,
+    0x04, 0x00, 0x90, 0xc0, 0xe7, 0x07, 0x00, 0x80,
+    0x80, 0xc0, 0xe7, 0x07, 0x00, 0x00, 0x80, 0xc0,
+    0xe7, 0x07, 0x00, 0x80, 0x80, 0xc0, 0xc0, 0x07,
+    0x00, 0x00, 0xc0, 0x07, 0x00, 0x00, 0xc0, 0x07,
+    0x00, 0x00, 0xe7, 0x07, 0x00, 0x00, 0x80, 0xc0,
+    0xe7, 0x07, 0x00, 0x80, 0x80, 0xc0, 0xe7, 0x07,
+    0x00, 0x80, 0x40, 0xc0, 0xc0, 0x07, 0x00, 0x00,
+    0xe7, 0x07, 0x00, 0x00, 0x40, 0xc0, 0xe7, 0x07,
+    0x00, 0x00, 0x80, 0xc0, 0xe7, 0x07, 0x04, 0x00,
+    0x90, 0xc0, 0xe7, 0x07, 0x00, 0x02, 0x40, 0xc0,
+    0xe7, 0x07, 0x0c, 0x02, 0x40, 0xc0, 0xe7, 0x07,
+    0x00, 0x00, 0xc0, 0x06, 0xe7, 0x07, 0x00, 0x00,
+    0xb8, 0x06, 0xe7, 0x07, 0x00, 0x00, 0xd2, 0x06,
+    0xd7, 0x09, 0x00, 0xc0, 0xc1, 0xdf, 0x9f, 0xaf,
+    0x34, 0x02, 0xe7, 0x05, 0x00, 0xc0, 0x9f, 0xaf,
+    0xc4, 0x01, 0x97, 0xcf, 0xd7, 0x09, 0x00, 0xc0,
+    0x17, 0x00, 0x17, 0x02, 0x97, 0x02, 0xe7, 0x57,
+    0x00, 0x00, 0xa8, 0x06, 0x06, 0xc0, 0xc0, 0x09,
+    0x92, 0xc0, 0xc0, 0x77, 0x09, 0x02, 0x9f, 0xc1,
+    0x5c, 0x05, 0x9f, 0xcf, 0x32, 0x06, 0xd7, 0x09,
+    0x0e, 0xc0, 0xe7, 0x07, 0x00, 0x00, 0x0e, 0xc0,
+    0x9f, 0xaf, 0x02, 0x0c, 0xe7, 0x05, 0x0e, 0xc0,
+    0x97, 0xcf, 0xd7, 0x09, 0x00, 0xc0, 0x17, 0x02,
+    0xc8, 0x09, 0xb0, 0xc0, 0xe7, 0x67, 0xfe, 0x7f,
+    0xb0, 0xc0, 0xc8, 0x77, 0x00, 0x20, 0x9f, 0xc1,
+    0x64, 0xeb, 0xe7, 0x57, 0x00, 0x00, 0xc8, 0x02,
+    0x9f, 0xc1, 0x80, 0xeb, 0xc8, 0x99, 0xca, 0x02,
+    0xc8, 0x67, 0x04, 0x00, 0x9f, 0xc1, 0x96, 0xeb,
+    0x9f, 0xcf, 0x4c, 0xeb, 0xe7, 0x07, 0x00, 0x00,
+    0xa6, 0xc0, 0xe7, 0x09, 0xb0, 0xc0, 0xc8, 0x02,
+    0xe7, 0x07, 0x03, 0x00, 0xb0, 0xc0, 0x97, 0xcf,
+    0xc0, 0x09, 0xb0, 0x06, 0xc0, 0x37, 0x01, 0x00,
+    0x97, 0xc9, 0xc9, 0x09, 0xb2, 0x06, 0x02, 0x00,
+    0x41, 0x90, 0x48, 0x02, 0xc9, 0x17, 0x06, 0x00,
+    0x9f, 0xaf, 0x08, 0x04, 0x9f, 0xa2, 0x72, 0x0c,
+    0x02, 0xda, 0x77, 0xc1, 0x41, 0x60, 0x71, 0xc1,
+    0x97, 0xcf, 0x17, 0x02, 0x57, 0x02, 0x43, 0x04,
+    0x21, 0x04, 0xe0, 0x00, 0x43, 0x04, 0x21, 0x04,
+    0xe0, 0x00, 0x43, 0x04, 0x21, 0x04, 0xe0, 0x00,
+    0xc1, 0x07, 0x01, 0x00, 0xc9, 0x05, 0xc8, 0x05,
+    0x97, 0xcf, 0xe7, 0x07, 0x01, 0x00, 0x8e, 0x06,
+    0xc8, 0x07, 0x86, 0x06, 0xe7, 0x07, 0x00, 0x00,
+    0x86, 0x06, 0xe7, 0x07, 0x10, 0x08, 0x88, 0x06,
+    0xe7, 0x07, 0x04, 0x00, 0x8a, 0x06, 0xe7, 0x07,
+    0xbc, 0x0c, 0x8c, 0x06, 0xc1, 0x07, 0x03, 0x80,
+    0x50, 0xaf, 0x97, 0xcf, 0xe7, 0x07, 0x00, 0x00,
+    0x8e, 0x06, 0x97, 0xcf,
+    0x00, 0x00
+};
+
+/****************************************************************
+ *     kaweth_new_code_fix
+ ****************************************************************/
+static __u8 kaweth_new_code_fix[] = 
+{
+    0xB6, 0xC3, 0xAA, 0xBB, 0xCC, 0xDD,
+    0x02, 0x00, 0x08, 0x00, 0x28, 0x00, 0x2c, 0x00,
+    0x34, 0x00, 0x3c, 0x00, 0x40, 0x00, 0x48, 0x00,
+    0x54, 0x00, 0x58, 0x00, 0x5e, 0x00, 0x64, 0x00,
+    0x68, 0x00, 0x6e, 0x00, 0x6c, 0x00, 0x72, 0x00,
+    0x76, 0x00, 0x7c, 0x00, 0x80, 0x00, 0x86, 0x00,
+    0x8a, 0x00, 0x90, 0x00, 0x94, 0x00, 0x98, 0x00,
+    0x9e, 0x00, 0xa6, 0x00, 0xaa, 0x00, 0xb0, 0x00,
+    0xb4, 0x00, 0xb8, 0x00, 0xc0, 0x00, 0xc6, 0x00,
+    0xca, 0x00, 0xd0, 0x00, 0xd4, 0x00, 0xd8, 0x00,
+    0xe0, 0x00, 0xde, 0x00, 0xe8, 0x00, 0xf0, 0x00,
+    0xfc, 0x00, 0x04, 0x01, 0x0a, 0x01, 0x18, 0x01,
+    0x22, 0x01, 0x28, 0x01, 0x3a, 0x01, 0x3e, 0x01,
+    0x7e, 0x01, 0x98, 0x01, 0x9c, 0x01, 0xa2, 0x01,
+    0xac, 0x01, 0xb2, 0x01, 0xba, 0x01, 0xc0, 0x01,
+    0xc8, 0x01, 0xd0, 0x01, 0xd6, 0x01, 0xf4, 0x01,
+    0xfc, 0x01, 0x08, 0x02, 0x16, 0x02, 0x1a, 0x02,
+    0x22, 0x02, 0x2a, 0x02, 0x2e, 0x02, 0x3e, 0x02,
+    0x44, 0x02, 0x4a, 0x02, 0x50, 0x02, 0x64, 0x02,
+    0x62, 0x02, 0x6c, 0x02, 0x72, 0x02, 0x86, 0x02,
+    0x8c, 0x02, 0x90, 0x02, 0x9e, 0x02, 0xbc, 0x02,
+    0xd0, 0x02, 0xd8, 0x02, 0xdc, 0x02, 0xe0, 0x02,
+    0xe8, 0x02, 0xe6, 0x02, 0xf4, 0x02, 0xfe, 0x02,
+    0x04, 0x03, 0x0c, 0x03, 0x28, 0x03, 0x7c, 0x03,
+    0x90, 0x03, 0x94, 0x03, 0x9c, 0x03, 0xa2, 0x03,
+    0xc0, 0x03, 0xd0, 0x03, 0xd4, 0x03, 0xee, 0x03,
+    0xfa, 0x03, 0xfe, 0x03, 0x2e, 0x04, 0x32, 0x04,
+    0x3c, 0x04, 0x40, 0x04, 0x4e, 0x04, 0x76, 0x04,
+    0x7c, 0x04, 0x84, 0x04, 0x8a, 0x04, 0x8e, 0x04,
+    0xa6, 0x04, 0xb0, 0x04, 0xb8, 0x04, 0xbe, 0x04,
+    0xd2, 0x04, 0xdc, 0x04, 0xee, 0x04, 0x10, 0x05,
+    0x1a, 0x05, 0x24, 0x05, 0x2a, 0x05, 0x36, 0x05,
+    0x34, 0x05, 0x3c, 0x05, 0x42, 0x05, 0x64, 0x05,
+    0x6a, 0x05, 0x6e, 0x05, 0x86, 0x05, 0x22, 0x06,
+    0x26, 0x06, 0x2c, 0x06, 0x30, 0x06, 0x42, 0x06,
+    0x4a, 0x06, 0x4e, 0x06, 0x56, 0x06, 0x54, 0x06,
+    0x5a, 0x06, 0x60, 0x06, 0x66, 0x06, 0xe8, 0x06,
+    0xee, 0x06, 0xf4, 0x06, 0x16, 0x07, 0x26, 0x07,
+    0x2c, 0x07, 0x32, 0x07, 0x36, 0x07, 0x3a, 0x07,
+    0x3e, 0x07, 0x52, 0x07, 0x56, 0x07, 0x5a, 0x07,
+    0x64, 0x07, 0x76, 0x07, 0x7a, 0x07, 0x80, 0x07,
+    0x84, 0x07, 0x8a, 0x07, 0x9e, 0x07, 0xa2, 0x07,
+    0xda, 0x07, 0xde, 0x07, 0xe2, 0x07, 0xe6, 0x07,
+    0xea, 0x07, 0xee, 0x07, 0xf2, 0x07, 0xf6, 0x07,
+    0x0e, 0x08, 0x16, 0x08, 0x18, 0x08, 0x1a, 0x08,
+    0x1c, 0x08, 0x1e, 0x08, 0x20, 0x08, 0x22, 0x08,
+    0x24, 0x08, 0x26, 0x08, 0x28, 0x08, 0x2a, 0x08,
+    0x2c, 0x08, 0x2e, 0x08, 0x32, 0x08, 0x3a, 0x08,
+    0x46, 0x08, 0x4e, 0x08, 0x54, 0x08, 0x5e, 0x08,
+    0x78, 0x08, 0x7e, 0x08, 0x82, 0x08, 0x86, 0x08,
+    0x8c, 0x08, 0x90, 0x08, 0x98, 0x08, 0x9e, 0x08,
+    0xa4, 0x08, 0xaa, 0x08, 0xb0, 0x08, 0xae, 0x08,
+    0xb4, 0x08, 0xbe, 0x08, 0xc4, 0x08, 0xc2, 0x08,
+    0xca, 0x08, 0xc8, 0x08, 0xd4, 0x08, 0xe4, 0x08,
+    0xe8, 0x08, 0xf6, 0x08, 0x14, 0x09, 0x12, 0x09,
+    0x1a, 0x09, 0x20, 0x09, 0x26, 0x09, 0x24, 0x09,
+    0x2a, 0x09, 0x3e, 0x09, 0x4c, 0x09, 0x56, 0x09,
+    0x70, 0x09, 0x74, 0x09, 0x78, 0x09, 0x7e, 0x09,
+    0x7c, 0x09, 0x82, 0x09, 0x98, 0x09, 0x9c, 0x09,
+    0xa0, 0x09, 0xa6, 0x09, 0xb8, 0x09, 0xdc, 0x09,
+    0xe8, 0x09, 0xec, 0x09, 0xfc, 0x09, 0x12, 0x0a,
+    0x18, 0x0a, 0x1e, 0x0a, 0x42, 0x0a, 0x46, 0x0a,
+    0x4e, 0x0a, 0x54, 0x0a, 0x5a, 0x0a, 0x5e, 0x0a,
+    0x68, 0x0a, 0x6e, 0x0a, 0x72, 0x0a, 0x78, 0x0a,
+    0x76, 0x0a, 0x7c, 0x0a, 0x80, 0x0a, 0x84, 0x0a,
+    0x94, 0x0a, 0xa4, 0x0a, 0xb8, 0x0a, 0xbe, 0x0a,
+    0xbc, 0x0a, 0xc2, 0x0a, 0xc8, 0x0a, 0xc6, 0x0a,
+    0xcc, 0x0a, 0xd0, 0x0a, 0xd4, 0x0a, 0xd8, 0x0a,
+    0xdc, 0x0a, 0xe0, 0x0a, 0xf2, 0x0a, 0xf6, 0x0a,
+    0xfa, 0x0a, 0x14, 0x0b, 0x1a, 0x0b, 0x20, 0x0b,
+    0x1e, 0x0b, 0x26, 0x0b, 0x2e, 0x0b, 0x2c, 0x0b,
+    0x36, 0x0b, 0x3c, 0x0b, 0x42, 0x0b, 0x40, 0x0b,
+    0x4a, 0x0b, 0xaa, 0x0b, 0xb0, 0x0b, 0xb6, 0x0b,
+    0xc0, 0x0b, 0xc8, 0x0b, 0xda, 0x0b, 0xe8, 0x0b,
+    0xec, 0x0b, 0xfa, 0x0b, 0x4a, 0x0c, 0x54, 0x0c,
+    0x62, 0x0c, 0x66, 0x0c, 0x96, 0x0c, 0x9a, 0x0c,
+    0xa0, 0x0c, 0xa6, 0x0c, 0xa4, 0x0c, 0xac, 0x0c,
+    0xb2, 0x0c, 0xb0, 0x0c, 0xc0, 0x0c,
+    0x00, 0x00
+};
+
+
+const int len_kaweth_trigger_code = sizeof(kaweth_trigger_code);
+const int len_kaweth_trigger_code_fix = sizeof(kaweth_trigger_code_fix);
+const int len_kaweth_new_code = sizeof(kaweth_new_code);
+const int len_kaweth_new_code_fix = sizeof(kaweth_new_code_fix);
diff -u --recursive --new-file v2.4.8/linux/drivers/usb/pwc-ctrl.c linux/drivers/usb/pwc-ctrl.c
--- v2.4.8/linux/drivers/usb/pwc-ctrl.c	Tue Jul  3 17:08:21 2001
+++ linux/drivers/usb/pwc-ctrl.c	Sun Aug 12 10:51:42 2001
@@ -137,7 +137,7 @@
 #include "pwc_timon.h"
 };
 
-/* Entries for the Kiara (730/740) camera */
+/* Entries for the Kiara (730/740/750) camera */
 
 struct Kiara_table_entry
 {
@@ -412,6 +412,7 @@
 		
 	case 730:
 	case 740:
+	case 750:
 		ret = set_video_mode_Kiara(pdev, size, frames, compression, snapshot);
 		break;
 	}
@@ -427,7 +428,6 @@
 	pdev->view.y = height;
 	pwc_set_image_buffer_size(pdev);
 	Trace(TRACE_SIZE, "Set viewport to %dx%d, image size is %dx%d, palette = %d.\n", width, height, pwc_image_sizes[size].x, pwc_image_sizes[size].y, pdev->vpalette);
-Debug("bandlength = %d\n", pdev->vbandlength);	
 	return 0;
 }
 
@@ -752,6 +752,7 @@
 			break;
 		case 730:
 		case 740:
+		case 750:
 			/* speed seems to range from 0x0 to 0xff */
 			buf[1] = 0;
 			buf[0] = value >> 8;
diff -u --recursive --new-file v2.4.8/linux/drivers/usb/pwc-if.c linux/drivers/usb/pwc-if.c
--- v2.4.8/linux/drivers/usb/pwc-if.c	Tue Jul  3 17:08:21 2001
+++ linux/drivers/usb/pwc-if.c	Sun Aug 12 10:51:42 2001
@@ -66,6 +66,7 @@
 	{ USB_DEVICE(0x0471, 0x030C) },
 	{ USB_DEVICE(0x0471, 0x0310) },
 	{ USB_DEVICE(0x0471, 0x0311) },
+	{ USB_DEVICE(0x0471, 0x0312) },
 	{ USB_DEVICE(0x069A, 0x0001) },
 	{ }
 };
@@ -84,10 +85,10 @@
 
 static int default_size = PSZ_QCIF;
 static int default_fps = 10;
-static int default_palette = VIDEO_PALETTE_YUV420P; /* This format is understood by most tools */
+static int default_palette = VIDEO_PALETTE_YUV420P; /* This is normal for webcams */
 static int default_fbufs = 3;   /* Default number of frame buffers */
 static int default_mbufs = 2;	/* Default number of mmap() buffers */
-       int pwc_trace = TRACE_MODULE | TRACE_FLOW | TRACE_PWCX;
+       int pwc_trace = TRACE_MODULE | TRACE_FLOW;
 static int power_save = 0;
 int pwc_preferred_compression = 2; /* 0..3 = uncompressed..high */
 
@@ -977,7 +978,7 @@
 
 	/* Set some defaults */
 	pdev->vsnapshot = 0;
-	if (pdev->type == 730 || pdev->type == 740)
+	if (pdev->type == 730 || pdev->type == 740 || pdev->type == 750)
 		pdev->vsize = PSZ_QSIF;
 	else
 		pdev->vsize = PSZ_QCIF;
@@ -990,7 +991,7 @@
 	i = pwc_set_video_mode(pdev, pwc_image_sizes[default_size].x, pwc_image_sizes[default_size].y, default_fps, pdev->vcompression, 0);
 	if (i)	{
 		Trace(TRACE_OPEN, "First attempt at set_video_mode failed.\n");
-		if (pdev->type == 730 || pdev->type == 740) 
+		if (pdev->type == 730 || pdev->type == 740 || pdev->type == 750)
 			i = pwc_set_video_mode(pdev, pwc_image_sizes[PSZ_QSIF].x, pwc_image_sizes[PSZ_QSIF].y, 10, pdev->vcompression, 0);
 		else
 			i = pwc_set_video_mode(pdev, pwc_image_sizes[PSZ_QCIF].x, pwc_image_sizes[PSZ_QCIF].y, 10, pdev->vcompression, 0);
@@ -1490,7 +1491,49 @@
 				return -EFAULT;
 			break;
 		}
-
+		
+		case VIDIOCGAUDIO:
+		{
+			struct video_audio v;
+			
+			strcpy(v.name, "Microphone");
+			v.audio = -1; /* unknown audio minor */
+			v.flags = 0;
+			v.mode = VIDEO_SOUND_MONO;
+			v.volume = 0;
+			v.bass = 0;
+			v.treble = 0;
+			v.balance = 0x8000;
+			v.step = 1;
+			
+			if (copy_to_user(arg, &v, sizeof(v)))
+				return -EFAULT;
+			break;	
+		}
+		
+		case VIDIOCSAUDIO:
+		{
+			struct video_audio v;
+			
+			if (copy_from_user(&v, arg, sizeof(v)))
+				return -EFAULT;
+			/* Dummy: nothing can be set */
+			break;
+		}
+		
+		case VIDIOCGUNIT:
+		{
+			struct video_unit vu;
+			
+			vu.video = pdev->vdev->minor & 0x3F;
+			vu.audio = -1; /* not known yet */
+			vu.vbi = -1;
+			vu.radio = -1;
+			vu.teletext = -1;
+			if (copy_to_user(arg, &vu, sizeof(vu)))
+				return -EFAULT;
+			break;
+		}
 		default:
 			return pwc_ioctl(pdev, cmd, arg);
 	} /* ..switch */
@@ -1536,8 +1579,6 @@
 {
 	struct pwc_device *pdev = NULL;
 	struct video_device *vdev;
-	struct usb_config_descriptor *config;
-	struct usb_interface *iface;
 	int vendor_id, product_id, type_id;
 	int i;
 
@@ -1579,7 +1620,7 @@
 			type_id = 680;
 			break;
 		case 0x030C:
-			Info("Philips PCVC690K (Vesta Scanner) USB webcam detected.\n");
+			Info("Philips PCVC690K (Vesta Pro Scan) USB webcam detected.\n");
 			type_id = 690;
 			break;
 		case 0x0310:
@@ -1590,6 +1631,10 @@
 			Info("Philips PCVC740K (ToUCam Pro) USB webcam detected.\n");
 			type_id = 740;
 			break;
+		case 0x0312:
+			Info("Philips PCVC750K (ToUCam Pro Scan) USB webcam detected.\n");
+			type_id = 750;
+			break;
 		default:
 			return NULL;
 			break;
@@ -1611,9 +1656,6 @@
 	if (udev->descriptor.bNumConfigurations > 1)
 		Info("Warning: more than 1 configuration available.\n");
 
-	config = udev->actconfig;
-	iface = &config->interface[0];
-
 	/* Allocate structure, initialize pointers, mutexes, etc. and link it to the usb_device */
 	pdev = kmalloc(sizeof(struct pwc_device), GFP_KERNEL);
 	if (pdev == NULL) {
@@ -1771,7 +1813,7 @@
 	int s;
 	char *sizenames[PSZ_MAX] = { "sqcif", "qsif", "qcif", "sif", "cif", "vga" };
 
-	Info("Philips PCA645/646 + PCVC675/680/690 + PCVC730/740 webcam module version " PWC_VERSION " loaded.\n");
+	Info("Philips PCA645/646 + PCVC675/680/690 + PCVC730/740/750 webcam module version " PWC_VERSION " loaded.\n");
 	Info("Also supports Askey VC010 cam.\n");
 
 	if (fps) {
@@ -1801,10 +1843,12 @@
 		/* Determine default palette */
 		if (!strcmp(palette, "yuv420"))
 			default_palette = VIDEO_PALETTE_YUV420;
-		if (!strcmp(palette, "yuv420p"))
+		else if (!strcmp(palette, "yuv420p"))
 			default_palette = VIDEO_PALETTE_YUV420P;
 		else {
 			Err("Palette not recognized: try palette=yuv420 or yuv420p.\n");
+			Info("Download the driver from http://www.smcc.demon.nl/webcam/ for in kernel\n");
+			Info("format conversion support.\n");
 			return -EINVAL;
 		}
 		Info("Default palette set to %d.\n", default_palette);
diff -u --recursive --new-file v2.4.8/linux/drivers/usb/pwc-misc.c linux/drivers/usb/pwc-misc.c
--- v2.4.8/linux/drivers/usb/pwc-misc.c	Tue May 22 10:25:36 2001
+++ linux/drivers/usb/pwc-misc.c	Sun Aug 12 10:51:42 2001
@@ -83,6 +83,7 @@
 		break;
 	case 730:
 	case 740:
+	case 750:
 		pdev->view_min.x = 160;
 		pdev->view_min.y = 120;
 		pdev->view_max.x = 640;
diff -u --recursive --new-file v2.4.8/linux/drivers/usb/pwc.h linux/drivers/usb/pwc.h
--- v2.4.8/linux/drivers/usb/pwc.h	Tue Jul  3 17:08:21 2001
+++ linux/drivers/usb/pwc.h	Sun Aug 12 10:51:42 2001
@@ -58,8 +58,8 @@
 
 /* Version block */
 #define PWC_MAJOR	8
-#define PWC_MINOR	0
-#define PWC_VERSION 	"8.0"
+#define PWC_MINOR	1
+#define PWC_VERSION 	"8.1"
 #define PWC_NAME 	"pwc"
 
 /* Turn certain features on/off */
@@ -138,7 +138,7 @@
    int vbandlength;		/* compressed band length; 0 is uncompressed */
    char vsnapshot;		/* snapshot mode */
    char vsync;			/* used by isoc handler */
-
+   
    /* The image acquisition requires 3 to 4 steps:
       1. data is gathered in short packets from the USB controller
       2. data is synchronized and packed into a frame buffer
@@ -157,7 +157,7 @@
    struct pwc_frame_buf *fbuf;	/* all frames */
    struct pwc_frame_buf *empty_frames, *empty_frames_tail;	/* all empty frames */
    struct pwc_frame_buf *full_frames, *full_frames_tail;	/* all filled frames */
-   struct pwc_frame_buf *fill_frame;	/* frame currently filled */
+   struct pwc_frame_buf *fill_frame;	/* frame currently being filled */
    struct pwc_frame_buf *read_frame;	/* frame currently read by user process */
    int frame_size;
    int frame_header_size, frame_trailer_size;
diff -u --recursive --new-file v2.4.8/linux/drivers/usb/storage/scsiglue.c linux/drivers/usb/storage/scsiglue.c
--- v2.4.8/linux/drivers/usb/storage/scsiglue.c	Sun Aug 12 13:28:00 2001
+++ linux/drivers/usb/storage/scsiglue.c	Sun Aug 12 13:54:53 2001
@@ -249,7 +249,7 @@
         for (i = 0; i < us->pusb_dev->actconfig->bNumInterfaces; i++) {
  		struct usb_interface *intf =
 			&us->pusb_dev->actconfig->interface[i];
-		struct usb_device_id *id;
+		const struct usb_device_id *id;
 
 		/* if this is an unclaimed interface, skip it */
 		if (!intf->driver) {
diff -u --recursive --new-file v2.4.8/linux/drivers/video/acornfb.c linux/drivers/video/acornfb.c
--- v2.4.8/linux/drivers/video/acornfb.c	Wed Apr 18 11:49:12 2001
+++ linux/drivers/video/acornfb.c	Sun Aug 12 17:37:53 2001
@@ -1,7 +1,7 @@
 /*
  *  linux/drivers/video/acornfb.c
  *
- *  Copyright (C) 1998-2000 Russell King
+ *  Copyright (C) 1998-2001 Russell King
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
@@ -30,6 +30,7 @@
 #include <asm/hardware.h>
 #include <asm/io.h>
 #include <asm/irq.h>
+#include <asm/mach-types.h>
 #include <asm/uaccess.h>
 
 #include <video/fbcon.h>
@@ -43,6 +44,14 @@
 #include "acornfb.h"
 
 /*
+ * VIDC machines can't do 16 or 32BPP modes.
+ */
+#ifdef HAS_VIDC
+#undef FBCON_HAS_CFB16
+#undef FBCON_HAS_CFB32
+#endif
+
+/*
  * Default resolution.
  * NOTE that it has to be supported in the table towards
  * the end of this file.
@@ -117,37 +126,50 @@
  * 25.175  3	25.175
  * 36.000  3	36.000
  */
-static struct pixclock {
+struct pixclock {
 	u_long	min_clock;
 	u_long	max_clock;
 	u_int	vidc_ctl;
 	u_int	vid_ctl;
-} pixclocks[] = {
+};
+
+static struct pixclock arc_clocks[] = {
 	/* we allow +/-1% on these */
 	{ 123750, 126250, VIDC_CTRL_DIV3,   VID_CTL_24MHz },	/*  8.000MHz */
 	{  82500,  84167, VIDC_CTRL_DIV2,   VID_CTL_24MHz },	/* 12.000MHz */
 	{  61875,  63125, VIDC_CTRL_DIV1_5, VID_CTL_24MHz },	/* 16.000MHz */
 	{  41250,  42083, VIDC_CTRL_DIV1,   VID_CTL_24MHz },	/* 24.000MHz */
+};
+
 #ifdef CONFIG_ARCH_A5K
+static struct pixclock a5k_clocks[] = {
 	{ 117974, 120357, VIDC_CTRL_DIV3,   VID_CTL_25MHz },	/*  8.392MHz */
 	{  78649,  80238, VIDC_CTRL_DIV2,   VID_CTL_25MHz },	/* 12.588MHz */
 	{  58987,  60178, VIDC_CTRL_DIV1_5, VID_CTL_25MHz },	/* 16.588MHz */
 	{  55000,  56111, VIDC_CTRL_DIV2,   VID_CTL_36MHz },	/* 18.000MHz */
 	{  39325,  40119, VIDC_CTRL_DIV1,   VID_CTL_25MHz },	/* 25.175MHz */
 	{  27500,  28055, VIDC_CTRL_DIV1,   VID_CTL_36MHz },	/* 36.000MHz */
-#endif
-	{ 0, }
 };
+#endif
 
 static struct pixclock *
 acornfb_valid_pixrate(u_long pixclock)
 {
 	u_int i;
 
-	for (i = 0; pixclocks[i].min_clock; i++)
-		if (pixclock > pixclocks[i].min_clock &&
-		    pixclock < pixclocks[i].max_clock)
-			return pixclocks + i;
+	for (i = 0; i < ARRAY_SIZE(arc_clocks); i++)
+		if (pixclock > arc_clocks[i].min_clock &&
+		    pixclock < arc_clocks[i].max_clock)
+			return arc_clocks + i;
+
+#ifdef CONFIG_ARCH_A5K
+	if (machine_is_a5k()) {
+		for (i = 0; i < ARRAY_SIZE(a5k_clocks); i++)
+			if (pixclock > a5k_clocks[i].min_clock &&
+			    pixclock < a5k_clocks[i].max_clock)
+				return a5k_clocks + i;
+	}
+#endif
 
 	return NULL;
 }
@@ -215,11 +237,15 @@
 		break;
 	}
 
-	if (!(var->sync & FB_SYNC_HOR_HIGH_ACT))
-		vid_ctl |= VID_CTL_HS_NHSYNC;
+	if (var->sync & FB_SYNC_COMP_HIGH_ACT) /* should be FB_SYNC_COMP */
+		vidc_ctl |= VIDC_CTRL_CSYNC;
+	else {
+		if (!(var->sync & FB_SYNC_HOR_HIGH_ACT))
+			vid_ctl |= VID_CTL_HS_NHSYNC;
 
-	if (!(var->sync & FB_SYNC_VERT_HIGH_ACT))
-		vid_ctl |= VID_CTL_VS_NVSYNC;
+		if (!(var->sync & FB_SYNC_VERT_HIGH_ACT))
+			vid_ctl |= VID_CTL_VS_NVSYNC;
+	}
 
 	sync_len	= var->hsync_len;
 	display_start	= sync_len + var->left_margin;
@@ -262,9 +288,9 @@
 	vidc.v_display_end	= display_end - 1;
 	vidc.v_border_end	= vidc.v_display_end;
 
-#ifdef CONFIG_ARCH_A5K
-	__raw_writeb(vid_ctl, IOEB_VID_CTL);
-#endif
+	if (machine_is_a5k())
+		__raw_writeb(vid_ctl, IOEB_VID_CTL);
+
 	if (memcmp(&current_vidc, &vidc, sizeof(vidc))) {
 		current_vidc = vidc;
 
@@ -719,30 +745,19 @@
 	pal = acornfb_palette_encode(regno, red, green, blue, trans);
 	current_par.palette[regno] = pal;
 
-#ifdef HAS_VIDC20
-	if (regno < 16) {
-		switch (bpp) {
-#ifdef FBCON_HAS_CFB16
-		case 16:
-			current_par.cmap.cfb16[regno] =
-				regno | regno << 5 | regno << 10;
-			break;
-#endif
 #ifdef FBCON_HAS_CFB32
-		case 32:
-			current_par.cmap.cfb32[regno] =
+	if (bpp == 32 && regno < 16) {
+		current_par.cmap.cfb32[regno] =
 				regno | regno << 8 | regno << 16;
-			break;
-#endif
-		default:
-			break;
-		}
 	}
-
+#endif
 #ifdef FBCON_HAS_CFB16
-	if (bpp == 16) {
+	if (bpp == 16 && regno < 16) {
 		int i;
 
+		current_par.cmap.cfb16[regno] =
+				regno | regno << 5 | regno << 10;
+
 		pal.p = 0;
 		vidc_writel(0x10000000);
 		for (i = 0; i < 256; i += 1) {
@@ -754,7 +769,6 @@
 		}
 	} else
 #endif
-#endif
 		acornfb_palette_write(regno, pal);
 
 	return 0;
@@ -797,52 +811,73 @@
 }
 
 static int
-acornfb_decode_var(struct fb_var_screeninfo *var, int con, int *visual)
+acornfb_decode_var(struct fb_var_screeninfo *var, int con)
 {
 	int err;
 
+#if defined(HAS_VIDC20)
+	var->red.offset    = 0;
+	var->red.length    = 8;
+	var->green         = var->red;
+	var->blue          = var->red;
+	var->transp.offset = 0;
+	var->transp.length = 4;
+#elif defined(HAS_VIDC)
+	var->red.length	   = 4;
+	var->green         = var->red;
+	var->blue          = var->red;
+	var->transp.length = 1;
+#endif
+
 	switch (var->bits_per_pixel) {
 #ifdef FBCON_HAS_MFB
 	case 1:
-		*visual = FB_VISUAL_MONO10;
 		break;
 #endif
-#ifdef FBCON_HAS_CFB8
-	case 8:
-#ifdef HAS_VIDC
-		*visual = FB_VISUAL_STATIC_PSEUDOCOLOR;
-#else
-		*visual = FB_VISUAL_PSEUDOCOLOR;
-#endif
+#ifdef FBCON_HAS_CFB2
+	case 2:
 		break;
 #endif
 #ifdef FBCON_HAS_CFB4
 	case 4:
-		*visual = FB_VISUAL_PSEUDOCOLOR;
 		break;
 #endif
-#ifdef FBCON_HAS_CFB2
-	case 2:
-		*visual = FB_VISUAL_PSEUDOCOLOR;
+#ifdef FBCON_HAS_CFB8
+	case 8:
 		break;
 #endif
-#ifdef HAS_VIDC20
 #ifdef FBCON_HAS_CFB16
 	case 16:
-		*visual = FB_VISUAL_DIRECTCOLOR;
+		var->red.offset    = 0;
+		var->red.length    = 5;
+		var->green.offset  = 5;
+		var->green.length  = 5;
+		var->blue.offset   = 10;
+		var->blue.length   = 5;
+		var->transp.offset = 15;
+		var->transp.length = 1;
 		break;
 #endif
 #ifdef FBCON_HAS_CFB32
 	case 32:
-		*visual = FB_VISUAL_TRUECOLOR;
+		var->red.offset    = 0;
+		var->red.length    = 8;
+		var->green.offset  = 8;
+		var->green.length  = 8;
+		var->blue.offset   = 16;
+		var->blue.length   = 8;
+		var->transp.offset = 24;
+		var->transp.length = 4;
 		break;
 #endif
-#endif
 	default:
 		return -EINVAL;
 	}
 
-	if (!acornfb_valid_pixrate(var->pixclock))
+	/*
+	 * Check to see if the pixel rate is valid.
+	 */
+	if (!var->pixclock || !acornfb_valid_pixrate(var->pixclock))
 		return -EINVAL;
 
 	/*
@@ -857,50 +892,7 @@
 	 * Validate the timing against the
 	 * monitor hardware.
 	 */
-	err = acornfb_validate_timing(var, &fb_info.monspecs);
-	if (err)
-		return err;
-
-#if defined(HAS_VIDC20)
-	switch (var->bits_per_pixel) {
-	case 1: case 2: case 4: case 8:
-		var->red.offset    = 0;
-		var->red.length    = 8;
-		var->green         = var->red;
-		var->blue          = var->red;
-		var->transp.offset = 0;
-		var->transp.length = 4;
-		break;
-
-	case 16:
-		var->red.offset    = 0;
-		var->red.length    = 5;
-		var->green.offset  = 5;
-		var->green.length  = 5;
-		var->blue.offset   = 10;
-		var->blue.length   = 5;
-		var->transp.offset = 15;
-		var->transp.length = 1;
-		break;
-
-	case 32:
-		var->red.offset    = 0;
-		var->red.length    = 8;
-		var->green.offset  = 8;
-		var->green.length  = 8;
-		var->blue.offset   = 16;
-		var->blue.length   = 8;
-		var->transp.offset = 24;
-		var->transp.length = 4;
-		break;
-	}
-#elif defined(HAS_VIDC)
-	var->red.length	   = 4;
-	var->green         = var->red;
-	var->blue          = var->red;
-	var->transp.length = 1;
-#endif
-	return 0;
+	return acornfb_validate_timing(var, &fb_info.monspecs);
 }
 
 static int
@@ -945,14 +937,14 @@
 acornfb_set_var(struct fb_var_screeninfo *var, int con, struct fb_info *info)
 {
 	struct display *display;
-	int err, chgvar = 0, visual;
+	int err, chgvar = 0;
 
 	if (con >= 0)
 		display = fb_display + con;
 	else
 		display = &global_disp;
 
-	err = acornfb_decode_var(var, con, &visual);
+	err = acornfb_decode_var(var, con);
 	if (err)
 		return err;
 
@@ -991,40 +983,37 @@
 	if (var->activate & FB_ACTIVATE_ALL)
 		global_disp.var = display->var;
 
-	display->screen_base	= (char *)current_par.screen_base;
-	display->visual		= visual;
-	display->type		= FB_TYPE_PACKED_PIXELS;
-	display->type_aux	= 0;
-	display->ypanstep	= 1;
-	display->ywrapstep	= 1;
-	display->line_length	=
-	display->next_line      = (var->xres * var->bits_per_pixel) / 8;
-	display->can_soft_blank	= visual == FB_VISUAL_PSEUDOCOLOR ? 1 : 0;
-	display->inverse	= 0;
-
 	switch (display->var.bits_per_pixel) {
 #ifdef FBCON_HAS_MFB
 	case 1:
 		current_par.palette_size = 2;
 		display->dispsw = &fbcon_mfb;
+		display->visual = FB_VISUAL_MONO10;
 		break;
 #endif
 #ifdef FBCON_HAS_CFB2
 	case 2:
 		current_par.palette_size = 4;
 		display->dispsw = &fbcon_cfb2;
+		display->visual = FB_VISUAL_PSEUDOCOLOR;
 		break;
 #endif
 #ifdef FBCON_HAS_CFB4
 	case 4:
 		current_par.palette_size = 16;
 		display->dispsw = &fbcon_cfb4;
+		display->visual = FB_VISUAL_PSEUDOCOLOR;
 		break;
 #endif
 #ifdef FBCON_HAS_CFB8
 	case 8:
 		current_par.palette_size = VIDC_PALETTE_SIZE;
 		display->dispsw = &fbcon_cfb8;
+#ifdef HAS_VIDC
+		display->visual = FB_VISUAL_STATIC_PSEUDOCOLOR;
+#else
+		display->visual = FB_VISUAL_PSEUDOCOLOR;
+#endif
 		break;
 #endif
 #ifdef FBCON_HAS_CFB16
@@ -1032,6 +1021,7 @@
 		current_par.palette_size = 32;
 		display->dispsw = &fbcon_cfb16;
 		display->dispsw_data = current_par.cmap.cfb16;
+		display->visual = FB_VISUAL_DIRECTCOLOR;
 		break;
 #endif
 #ifdef FBCON_HAS_CFB32
@@ -1039,6 +1029,7 @@
 		current_par.palette_size = VIDC_PALETTE_SIZE;
 		display->dispsw = &fbcon_cfb32;
 		display->dispsw_data = current_par.cmap.cfb32;
+		display->visual = FB_VISUAL_TRUECOLOR;
 		break;
 #endif
 	default:
@@ -1046,6 +1037,16 @@
 		break;
 	}
 
+	display->screen_base	= (char *)current_par.screen_base;
+	display->type		= FB_TYPE_PACKED_PIXELS;
+	display->type_aux	= 0;
+	display->ypanstep	= 1;
+	display->ywrapstep	= 1;
+	display->line_length	=
+	display->next_line      = (var->xres * var->bits_per_pixel) / 8;
+	display->can_soft_blank	= display->visual == FB_VISUAL_PSEUDOCOLOR ? 1 : 0;
+	display->inverse	= 0;
+
 	if (chgvar && info && info->changevar)
 		info->changevar(con);
 
@@ -1205,18 +1206,8 @@
 	union palette p;
 	int i, bpp = fb_display[current_par.currcon].var.bits_per_pixel;
 
-	if (bpp != 16) {
-		for (i = 0; i < current_par.palette_size; i++) {
-			if (blank)
-				p = acornfb_palette_encode(i, 0, 0, 0, 0);
-			else
-				p = current_par.palette[i];
-
-			acornfb_palette_write(i, p);
-		}
-	}
 #ifdef FBCON_HAS_CFB16
-	else {
+	if (bpp == 16) {
 		p.p = 0;
 
 		for (i = 0; i < 256; i++) {
@@ -1229,8 +1220,18 @@
 			}
 			acornfb_palette_write(i, current_par.palette[i]);
 		}
-	}
+	} else
 #endif
+	{
+		for (i = 0; i < current_par.palette_size; i++) {
+			if (blank)
+				p = acornfb_palette_encode(i, 0, 0, 0, 0);
+			else
+				p = current_par.palette[i];
+
+			acornfb_palette_write(i, p);
+		}
+	}
 }
 
 /*
diff -u --recursive --new-file v2.4.8/linux/drivers/video/acornfb.h linux/drivers/video/acornfb.h
--- v2.4.8/linux/drivers/video/acornfb.h	Mon Sep 18 15:15:22 2000
+++ linux/drivers/video/acornfb.h	Sun Aug 12 17:37:53 2001
@@ -115,6 +115,7 @@
 #define VID_CTL_25MHz		(1)
 #define VID_CTL_36MHz		(2)
 
+#define VIDC_CTRL_CSYNC		(1 << 7)
 #define VIDC_CTRL_INTERLACE	(1 << 6)
 #define VIDC_CTRL_FIFO_0_4	(0 << 4)
 #define VIDC_CTRL_FIFO_1_5	(1 << 4)
diff -u --recursive --new-file v2.4.8/linux/drivers/video/controlfb.c linux/drivers/video/controlfb.c
--- v2.4.8/linux/drivers/video/controlfb.c	Fri Feb  9 11:30:23 2001
+++ linux/drivers/video/controlfb.c	Sun Aug 12 10:51:42 2001
@@ -3,6 +3,9 @@
  *
  *  Created 12 July 1998 by Dan Jacobowitz <dan@debian.org>
  *  Copyright (C) 1998 Dan Jacobowitz
+ *  Copyright (C) 2001 Takashi Oe
+ *
+ *  Mmap code by Michel Lanners <mlan@cpu.lu>
  *
  *  Frame buffer structure from:
  *    drivers/video/chipsfb.c -- frame buffer device for
@@ -62,26 +65,40 @@
 	int	xres, yres;
 	int	vxres, vyres;
 	int	xoffset, yoffset;
+	int	pitch;
+	struct control_regvals	regvals;
+	unsigned long sync;
+	unsigned char ctrl;
 };
 
 #define DIRTY(z) ((x)->z != (y)->z)
+#define DIRTY_CMAP(z) (memcmp(&((x)->z), &((y)->z), sizeof((y)->z)))
 static inline int PAR_EQUAL(struct fb_par_control *x, struct fb_par_control *y)
 {
-	return (!DIRTY(vmode) && !DIRTY(cmode) && !DIRTY(xres)
-		&& !DIRTY(yres) && !DIRTY(vxres) && !DIRTY(vyres)
-		&& !DIRTY(xoffset) && !DIRTY(yoffset));
+	int i, results;
+
+	results = 1;
+	for (i = 0; i < 3; i++)
+		results &= !DIRTY(regvals.clock_params[i]);
+	if (!results)
+		return 0;
+	for (i = 0; i < 16; i++)
+		results &= !DIRTY(regvals.regs[i]);
+	if (!results)
+		return 0;
+	return (!DIRTY(cmode) && !DIRTY(xres) && !DIRTY(yres)
+		&& !DIRTY(vxres) && !DIRTY(vyres));
 }
 static inline int VAR_MATCH(struct fb_var_screeninfo *x, struct fb_var_screeninfo *y)
 {
 	return (!DIRTY(bits_per_pixel) && !DIRTY(xres)
 		&& !DIRTY(yres) && !DIRTY(xres_virtual)
-		&& !DIRTY(yres_virtual));
+		&& !DIRTY(yres_virtual)
+		&& !DIRTY_CMAP(red) && !DIRTY_CMAP(green) && !DIRTY_CMAP(blue));
 }
 
 struct fb_info_control {
 	struct fb_info			info;
-/*	struct fb_fix_screeninfo	fix;
-	struct fb_var_screeninfo	var;*/
 	struct display			display;
 	struct fb_par_control		par;
 	struct {
@@ -93,12 +110,16 @@
 	
 	struct control_regs	*control_regs;
 	unsigned long		control_regs_phys;
+	unsigned long		control_regs_size;
 	
 	__u8			*frame_buffer;
 	unsigned long		frame_buffer_phys;
-	
-	int			sense, control_use_bank2;
+	unsigned long		fb_orig_base;
+	unsigned long		fb_orig_size;
+
+	int			control_use_bank2;
 	unsigned long		total_vram;
+	unsigned char		vram_attr;
 	union {
 #ifdef FBCON_HAS_CFB16
 		u16 cfb16[16];
@@ -109,61 +130,96 @@
 	} fbcon_cmap;
 };
 
+/* control register access macro */
+#define CNTRL_REG(INFO,REG) (&(((INFO)->control_regs-> ## REG).r))
+
+
 /******************** Prototypes for exported functions ********************/
+/*
+ * struct fb_ops
+ */
 static int control_get_fix(struct fb_fix_screeninfo *fix, int con,
-			 struct fb_info *info);
+	struct fb_info *info);
 static int control_get_var(struct fb_var_screeninfo *var, int con,
-			 struct fb_info *info);
+	struct fb_info *info);
 static int control_set_var(struct fb_var_screeninfo *var, int con,
-			 struct fb_info *info);
+	struct fb_info *info);
 static int control_pan_display(struct fb_var_screeninfo *var, int con,
-			     struct fb_info *info);
+	struct fb_info *info);
 static int control_get_cmap(struct fb_cmap *cmap, int kspc, int con,
-			  struct fb_info *info);
+	struct fb_info *info);
 static int control_set_cmap(struct fb_cmap *cmap, int kspc, int con,
-			  struct fb_info *info);
+	struct fb_info *info);
 static int control_mmap(struct fb_info *info, struct file *file,
-                         struct vm_area_struct *vma);
+	struct vm_area_struct *vma);
 
+/*
+ * low level fbcon ops
+ */
+static int controlfb_switch(int con, struct fb_info *info);
+static int controlfb_updatevar(int con, struct fb_info *info);
+static void controlfb_blank(int blank_mode, struct fb_info *info);
 
+/*
+ * low level cmap set/get ops
+ */
 static int controlfb_getcolreg(u_int regno, u_int *red, u_int *green,
-			     u_int *blue, u_int *transp, struct fb_info *info);
+	u_int *blue, u_int *transp, struct fb_info *info);
 static int controlfb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
-			     u_int transp, struct fb_info *info);
-
-/******************** Prototypes for internal functions ********************/
-static void control_par_to_fix(struct fb_par_control *par, struct fb_fix_screeninfo *fix,
-	struct fb_info_control *p);
-static void do_install_cmap(int con, struct fb_info *info);
-static void control_set_dispsw(struct display *disp, int cmode, struct fb_info_control *p);
-
-/************************* Internal variables *****************************/
-static int currcon = 0;
-static int par_set = 0;
-static char fontname[40] __initdata = { 0 };
-static int default_vmode = VMODE_NVRAM;
-static int default_cmode = CMODE_NVRAM;
+	u_int transp, struct fb_info *info);
 
 /*
- * Exported functions
+ * inititialization
  */
 int control_init(void);
 void control_setup(char *);
 
-static void control_of_init(struct device_node *dp);
-static int read_control_sense(struct fb_info_control *p);
-static inline int control_vram_reqd(int video_mode, int color_mode);
+/*
+ * low level fbcon revc ops
+ */
+static void control_cfb16_revc(struct display *p, int xx, int yy);
+static void control_cfb32_revc(struct display *p, int xx, int yy);
+
+
+/******************** Prototypes for internal functions **********************/
+
+static void do_install_cmap(struct display *disp, struct fb_info *info);
 static void set_control_clock(unsigned char *params);
-static void control_set_hardware(struct fb_info_control *p, struct fb_par_control *par);
-static inline void control_par_to_var(struct fb_par_control *par, struct fb_var_screeninfo *var);
+static int init_control(struct fb_info_control *p);
+static void control_set_hardware(struct fb_info_control *p,
+	struct fb_par_control *par);
+static int control_of_init(struct device_node *dp);
+static void control_par_to_fix(struct fb_par_control *par,
+	struct fb_fix_screeninfo *fix, struct fb_info_control *p);
+static void control_set_dispsw(struct display *disp, int cmode,
+	struct fb_info_control *p);
+static void find_vram_size(struct fb_info_control *p);
+static int read_control_sense(struct fb_info_control *p);
+static int calc_clock_params(unsigned long clk, unsigned char *param);
 static int control_var_to_par(struct fb_var_screeninfo *var,
 	struct fb_par_control *par, const struct fb_info *fb_info);
-
-static void control_init_info(struct fb_info *info, struct fb_info_control *p);
+static inline void control_par_to_var(struct fb_par_control *par,
+	struct fb_var_screeninfo *var);
+static void control_par_to_fix(struct fb_par_control *par,
+	struct fb_fix_screeninfo *fix, struct fb_info_control *p);
 static void control_par_to_display(struct fb_par_control *par,
-  struct display *disp, struct fb_fix_screeninfo *fix, struct fb_info_control *p);
+	struct display *disp, struct fb_fix_screeninfo *fix,
+	struct fb_info_control *p);
+static void control_set_dispsw(struct display *disp, int cmode,
+	struct fb_info_control *p);
+static void control_init_info(struct fb_info *info, struct fb_info_control *p);
+static void control_cleanup(void);
+
+
+/************************** Internal variables *******************************/
+
+static int currcon;
+static struct fb_info_control *control_fb;
+
+static char fontname[40] __initdata = { 0 };
+static int default_vmode __initdata = VMODE_NVRAM;
+static int default_cmode __initdata = CMODE_NVRAM;
 
-static int controlfb_updatevar(int con, struct fb_info *info);
 
 static struct fb_ops controlfb_ops = {
 	owner:		THIS_MODULE,
@@ -177,7 +233,6 @@
 };
 
 
-
 /********************  The functions for controlfb_ops ********************/
 
 #ifdef MODULE
@@ -185,18 +240,16 @@
 {
 	struct device_node *dp;
 
-	printk("Loading...\n");
 	dp = find_devices("control");
-	if (dp != 0)
-		control_of_init(dp);
-	else
-		printk("Failed.\n");
-	printk("Done.\n");
+	if (dp != 0 && !control_of_init(dp))
+		return 0;
+
+	return -ENXIO;
 }
 
 void cleanup_module(void)
 {
-	/* FIXME: clean up and release regions */
+	control_cleanup();
 }
 #endif
 
@@ -207,8 +260,6 @@
 {
 	struct fb_info_control *p = (struct fb_info_control *) info;
 
-	if(!par_set)
-		printk(KERN_ERR "control_get_fix called with unset par!\n");
 	if(con == -1) {
 		control_par_to_fix(&p->par, fix, p);
 	} else {
@@ -225,8 +276,6 @@
 {
 	struct fb_info_control *p = (struct fb_info_control *) info;
 
-	if(!par_set)
-		printk(KERN_ERR "control_get_var called with unset par!\n");
 	if(con == -1) {
 		control_par_to_var(&p->par, var);
 	} else {
@@ -235,8 +284,10 @@
 	return 0;
 }
 
-/* Sets everything according to var */
-/* No longer safe for use in console switching */
+
+/*
+ * Sets everything according to var
+ */
 static int control_set_var(struct fb_var_screeninfo *var, int con,
 			 struct fb_info *info)
 {
@@ -246,10 +297,10 @@
 	int depthchange, err;
 	int activate = var->activate;
 
-	disp = (con >= 0) ? &fb_display[con] : info->disp;
-
 	if((err = control_var_to_par(var, &par, info))) {
-		printk (KERN_ERR "control_set_var: error calling control_var_to_par: %d.\n", err);
+		if (con < 0)
+			printk (KERN_ERR "control_set_var: error calling"
+					 " control_var_to_par: %d.\n", err);
 		return err;
 	}
 	
@@ -258,8 +309,8 @@
 	if ((activate & FB_ACTIVATE_MASK) != FB_ACTIVATE_NOW)
 		return 0;
 
-/* I know, we want to use fb_display[con], but grab certain info from p->var instead. */
-/* [above no longer true] */
+	disp = (con >= 0) ? &fb_display[con] : info->disp;
+
 	depthchange = (disp->var.bits_per_pixel != var->bits_per_pixel);
 	if(!VAR_MATCH(&disp->var, var)) {
 		struct fb_fix_screeninfo	fix;
@@ -269,32 +320,54 @@
 			(*info->changevar)(con);
 	} else
 		disp->var = *var;
-	/*p->disp = *disp;*/
 
-	
-	if(con == currcon || con == -1) {
+	if(con == currcon) {
 		control_set_hardware(p, &par);
+		if(depthchange) {
+			if((err = fb_alloc_cmap(&disp->cmap, 0, 0)))
+				return err;
+			do_install_cmap(disp, info);
+		}
 	}
-	if(depthchange) {
-		if((err = fb_alloc_cmap(&disp->cmap, 0, 0)))
-			return err;
-		do_install_cmap(con, info);
-	}
+
 	return 0;
 }
 
+
+/*
+ * Set screen start address according to var offset values
+ */
+static inline void set_screen_start(int xoffset, int yoffset,
+	struct fb_info_control *p)
+{
+	struct fb_par_control *par = &p->par;
+
+	par->xoffset = xoffset;
+	par->yoffset = yoffset;
+	out_le32(CNTRL_REG(p,start_addr),
+		 par->yoffset * par->pitch + (par->xoffset << par->cmode));
+}
+
+
 static int control_pan_display(struct fb_var_screeninfo *var, int con,
 			     struct fb_info *info)
 {
+	unsigned int xoffset, hstep;
 	struct fb_info_control *p = (struct fb_info_control *)info;
 	struct fb_par_control *par = &p->par;
-	
-	if (var->xoffset != 0 || var->yoffset+var->yres > var->yres_virtual)
+
+	/*
+	 * make sure start addr will be 32-byte aligned
+	 */
+	hstep = 0x1f >> par->cmode;
+	xoffset = (var->xoffset + hstep) & ~hstep;
+
+	if (xoffset+par->xres > par->vxres ||
+	    var->yoffset+par->yres > par->vyres)
 		return -EINVAL;
-	fb_display[con].var.yoffset =  par->yoffset = var->yoffset;
-	if(con == currcon)
-		out_le32(&p->control_regs->start_addr.r,
-		    par->yoffset * (par->vxres << par->cmode));
+
+	set_screen_start(xoffset, var->yoffset, p);
+
 	return 0;
 }
 
@@ -315,11 +388,10 @@
 static int control_set_cmap(struct fb_cmap *cmap, int kspc, int con,
 			 struct fb_info *info)
 {
-	struct display *disp = &fb_display[con];
-	int err;
+	struct display *disp = (con < 0)? info->disp: &fb_display[con];
+	int err, size = disp->var.bits_per_pixel == 16 ? 32 : 256;
 
-	if (disp->cmap.len == 0) {
-		int size = disp->var.bits_per_pixel == 16 ? 32 : 256;
+	if (disp->cmap.len != size) {
 		err = fb_alloc_cmap(&disp->cmap, size, 0);
 		if (err)
 			return err;
@@ -330,7 +402,9 @@
 	return 0;
 }
 
-/* Private mmap since we want to have a different caching on the framebuffer
+
+/*
+ * Private mmap since we want to have a different caching on the framebuffer
  * for controlfb.
  * Note there's no locking in here; it's done in fb_mmap() in fbmem.c.
  */
@@ -363,6 +437,9 @@
                pgprot_val(vma->vm_page_prot) |= _PAGE_WRITETHRU;
        }
        start &= PAGE_MASK;
+       if ((vma->vm_end - vma->vm_start + off) > len)
+       		return -EINVAL;
+       off += start;
        vma->vm_pgoff = off >> PAGE_SHIFT;
        if (io_remap_page_range(vma->vm_start, off,
            vma->vm_end - vma->vm_start, vma->vm_page_prot))
@@ -372,77 +449,80 @@
 }
 
 
-/********************  End of controlfb_ops implementation  ********************/
-/* (new one that is) */
+/********************  End of controlfb_ops implementation  ******************/
 
+/*
+ * low level fbcon ops
+ */
 
 static int controlfb_switch(int con, struct fb_info *info)
 {
 	struct fb_info_control	*p = (struct fb_info_control *)info;
 	struct fb_par_control	par;
-	int oldcon = currcon;
 
-	if (fb_display[currcon].cmap.len)
+	if (currcon >= 0 && fb_display[currcon].cmap.len)
 		fb_get_cmap(&fb_display[currcon].cmap, 1, controlfb_getcolreg,
 			    info);
 	currcon = con;
 
+	fb_display[con].var.activate = FB_ACTIVATE_NOW;
 	control_var_to_par(&fb_display[con].var, &par, info);
 	control_set_hardware(p, &par);
 	control_set_dispsw(&fb_display[con], par.cmode, p);
+	do_install_cmap(&fb_display[con], info);
 
-	if(fb_display[oldcon].var.yoffset != fb_display[con].var.yoffset)
-		controlfb_updatevar(con, info);
-
-	do_install_cmap(con, info);
 	return 1;
 }
 
+
 static int controlfb_updatevar(int con, struct fb_info *info)
 {
-	struct fb_info_control	*p = (struct fb_info_control *)info;
+	struct fb_var_screeninfo *var = &fb_display[con].var;
+	struct fb_info_control *p = (struct fb_info_control *) info;
+
+	set_screen_start(var->xoffset, var->yoffset, p);
 
-	if(con != currcon)
-		return 0;
-	/* imsttfb blanks the unused bottom of the screen here...hmm. */
-	out_le32(&p->control_regs->start_addr.r,
-	    fb_display[con].var.yoffset * fb_display[con].line_length);
-	
 	return 0;
 }
 
+
 static void controlfb_blank(int blank_mode, struct fb_info *info)
 {
-/*
- *  Blank the screen if blank_mode != 0, else unblank. If blank == NULL
- *  then the caller blanks by setting the CLUT (Color Look Up Table) to all
- *  black. Return 0 if blanking succeeded, != 0 if un-/blanking failed due
- *  to e.g. a video mode which doesn't support it. Implements VESA suspend
- *  and powerdown modes on hardware that supports disabling hsync/vsync:
- *    blank_mode == 2: suspend vsync
- *    blank_mode == 3: suspend hsync
- *    blank_mode == 4: powerdown
- */
-/* A blank_mode of 1+VESA_NO_BLANKING or 1+VESA_POWERDOWN act alike... */
 	struct fb_info_control *p = (struct fb_info_control *) info;
-	int	ctrl;
-
-	if(blank_mode == 1+VESA_NO_BLANKING)
-		blank_mode = 1+VESA_POWERDOWN;
-	ctrl = ld_le32(&p->control_regs->ctrl.r) | 0x33;
-	if (blank_mode)
-		--blank_mode;
-	if (blank_mode & VESA_VSYNC_SUSPEND)
-		ctrl &= ~3;
-	if (blank_mode & VESA_HSYNC_SUSPEND)
-		ctrl &= ~0x30;
-	out_le32(&p->control_regs->ctrl.r, ctrl);
+	unsigned ctrl;
 
-/* TODO: Figure out how the heck to powerdown this thing! */
+	ctrl = ld_le32(CNTRL_REG(p,ctrl));
+	if (blank_mode > 0)
+		switch (blank_mode - 1) {
+		case VESA_VSYNC_SUSPEND:
+			ctrl &= ~3;
+			break;
+		case VESA_HSYNC_SUSPEND:
+			ctrl &= ~0x30;
+			break;
+		case VESA_POWERDOWN:
+			ctrl &= ~0x33;
+			/* fall through */
+		case VESA_NO_BLANKING:
+			ctrl |= 0x400;
+			break;
+		default:
+			break;
+		}
+	else {
+		ctrl &= ~0x400;
+		ctrl |= 0x33;
+	}
+	out_le32(CNTRL_REG(p,ctrl), ctrl);
 
-    return;
+	return;
 }
 
+
+/*
+ * low level cmap set/get ops
+ */
+
 static int controlfb_getcolreg(u_int regno, u_int *red, u_int *green,
 			     u_int *blue, u_int *transp, struct fb_info *info)
 {
@@ -497,33 +577,25 @@
 	return 0;
 }
 
-static void do_install_cmap(int con, struct fb_info *info)
+static void do_install_cmap(struct display *disp, struct fb_info *info)
 {
-	if (con != currcon)
-		return;
-	if (fb_display[con].cmap.len)
-		fb_set_cmap(&fb_display[con].cmap, 1, controlfb_setcolreg,
+	if (disp->cmap.len)
+		fb_set_cmap(&disp->cmap, 1, controlfb_setcolreg,
 			    info);
 	else {
-		int size = fb_display[con].var.bits_per_pixel == 16 ? 32 : 256;
+		int size = disp->var.bits_per_pixel == 16 ? 32 : 256;
 		fb_set_cmap(fb_default_cmap(size), 1, controlfb_setcolreg,
 			    info);
 	}
 }
 
-static inline int control_vram_reqd(int video_mode, int color_mode)
-{
-	return (control_reg_init[video_mode-1]->vres
-		* control_reg_init[video_mode-1]->hres << color_mode)
-	       + control_reg_init[video_mode-1]->offset[color_mode];
-}
 
 static void set_control_clock(unsigned char *params)
 {
+#ifdef CONFIG_ADB_CUDA
 	struct adb_request req;
 	int i;
 
-#ifdef CONFIG_ADB_CUDA
 	for (i = 0; i < 3; ++i) {
 		cuda_request(&req, NULL, 5, CUDA_PACKET, CUDA_GET_SET_IIC,
 			     0x50, i + 1, params[i]);
@@ -534,128 +606,137 @@
 }
 
 
-static void __init init_control(struct fb_info_control *p)
+/*
+ * finish off the driver initialization and register
+ */
+static int __init init_control(struct fb_info_control *p)
 {
-	struct fb_par_control parstruct;
-	struct fb_par_control *par = &parstruct;
+	int full, sense, vmode, cmode, vyres;
 	struct fb_var_screeninfo var;
 
-	p->sense = read_control_sense(p);
-	printk(KERN_INFO "Monitor sense value = 0x%x, ", p->sense);
+	printk(KERN_INFO "controlfb: ");
+
+	full = p->total_vram == 0x400000;
+
 	/* Try to pick a video mode out of NVRAM if we have one. */
-	if (default_vmode == VMODE_NVRAM) {
-		par->vmode = nvram_read_byte(NV_VMODE);
-		if(par->vmode <= 0 || par->vmode > VMODE_MAX || !control_reg_init[par->vmode - 1])
-			par->vmode = VMODE_CHOOSE;
-		if(par->vmode == VMODE_CHOOSE)
-			par->vmode = mac_map_monitor_sense(p->sense);
-		if(!control_reg_init[par->vmode - 1])
-			par->vmode = VMODE_640_480_60;
+	if (default_cmode == CMODE_NVRAM){
+		cmode = nvram_read_byte(NV_CMODE);
+		if(cmode < CMODE_8 || cmode > CMODE_32)
+			cmode = CMODE_8;
 	} else
-		par->vmode=default_vmode;
+		cmode=default_cmode;
+
+	if (default_vmode == VMODE_NVRAM) {
+		vmode = nvram_read_byte(NV_VMODE);
+		if (vmode < 1 || vmode > VMODE_MAX ||
+		    control_mac_modes[vmode - 1].m[full] < cmode) {
+			sense = read_control_sense(p);
+			printk("Monitor sense value = 0x%x, ", sense);
+			vmode = mac_map_monitor_sense(sense);
+			if (control_mac_modes[vmode - 1].m[full] < cmode)
+				vmode = VMODE_640_480_60;
+		}
+	} else {
+		vmode=default_vmode;
+		if (control_mac_modes[vmode - 1].m[full] < cmode) {
+			if (cmode > CMODE_8)
+				cmode--;
+			else
+				vmode = VMODE_640_480_60;
+		}
+	}
+
+	if (mac_vmode_to_var(vmode, cmode, &var) < 0) {
+		/* This shouldn't happen! */
+		printk("mac_vmode_to_var(%d, %d,) failed\n", vmode, cmode);
+try_again:
+		vmode = VMODE_640_480_60;
+		cmode = CMODE_8;
+		if (mac_vmode_to_var(vmode, cmode, &var) < 0) {
+			printk(KERN_ERR "controlfb: mac_vmode_to_var() failed\n");
+			return -ENXIO;
+		}
+		printk(KERN_INFO "controlfb: ");
+	}
+	printk("using video mode %d and color mode %d.\n", vmode, cmode);
+
+	vyres = (p->total_vram - CTRLFB_OFF) / (var.xres << cmode);
+	if (vyres > var.yres)
+		var.yres_virtual = vyres;
 
-	if (default_cmode == CMODE_NVRAM){
-		par->cmode = nvram_read_byte(NV_CMODE);
-		if(par->cmode < CMODE_8 || par->cmode > CMODE_32)
-			par->cmode = CMODE_8;}
-	else
-		par->cmode=default_cmode;
-	/*
-	 * Reduce the pixel size if we don't have enough VRAM.
-	 */
-	while(par->cmode > CMODE_8 && control_vram_reqd(par->vmode, par->cmode) > p->total_vram)
-		par->cmode--;
-	
-	printk("using video mode %d and color mode %d.\n", par->vmode, par->cmode);
-	
-	par->vxres = par->xres = control_reg_init[par->vmode - 1]->hres;
-	par->yres = control_reg_init[par->vmode - 1]->vres;
-	par->vyres = p->total_vram / (par->vxres << par->cmode);
-	par->xoffset = par->yoffset = 0;
-	
 	control_init_info(&p->info, p);
-	
-	par_set = 1;	/* Debug */
-	
-	control_par_to_var(par, &var);
+	currcon = -1;
 	var.activate = FB_ACTIVATE_NOW;
-	control_set_var(&var, -1, &p->info);
-	
-	p->info.flags = FBINFO_FLAG_DEFAULT;
-	if (register_framebuffer(&p->info) < 0) {
-		kfree(p);
-		return;
+
+	if (control_set_var(&var, -1, &p->info) < 0) {
+		if (vmode != VMODE_640_480_60 || cmode != CMODE_8)
+			goto try_again;
+		printk(KERN_ERR "controlfb: initilization failed\n");
+		return -ENXIO;
 	}
+
+	p->info.flags = FBINFO_FLAG_DEFAULT;
+	if (register_framebuffer(&p->info) < 0)
+		return -ENXIO;
 	
 	printk(KERN_INFO "fb%d: control display adapter\n", GET_FB_IDX(p->info.node));	
+
+	return 0;
 }
 
-#define STORE_D2(a,d) \
+#define RADACAL_WRITE(a,d) \
 	out_8(&p->cmap_regs->addr, (a)); \
-	out_8(&p->cmap_regs->d2,   (d))
+	out_8(&p->cmap_regs->dat,   (d))
 
 /* Now how about actually saying, Make it so! */
 /* Some things in here probably don't need to be done each time. */
 static void control_set_hardware(struct fb_info_control *p, struct fb_par_control *par)
 {
-	struct control_regvals	*init;
+	struct control_regvals	*r;
 	volatile struct preg	*rp;
-	int			flags, ctrl, i;
-	int			vmode, cmode;
-	
-	if(PAR_EQUAL(&p->par, par))
+	int			i, cmode;
+
+	if (PAR_EQUAL(&p->par, par)) {
+		/*
+		 * check if only xoffset or yoffset differs.
+		 * this prevents flickers in typical VT switch case.
+		 */
+		if (p->par.xoffset != par->xoffset ||
+		    p->par.yoffset != par->yoffset)
+			set_screen_start(par->xoffset, par->yoffset, p);
+			
 		return;
+	}
 	
 	p->par = *par;
-	
-	vmode = p->par.vmode;
 	cmode = p->par.cmode;
+	r = &par->regvals;
 	
-	init = control_reg_init[vmode - 1];
+	/* Turn off display */
+	out_le32(CNTRL_REG(p,ctrl), 0x400 | par->ctrl);
 	
-	if (control_vram_reqd(vmode, cmode) > 0x200000)
-		flags = 0x51;
-	else if (p->control_use_bank2)
-		flags = 0x39;
-	else
-		flags = 0x31;
-	if (vmode >= VMODE_1280_960_75 && cmode >= CMODE_16)
-		ctrl = 0x7f;
-	else
-		ctrl = 0x3b;
-
-	/* Initialize display timing registers */
-	out_le32(&p->control_regs->ctrl.r, 0x43b);
-	
-	set_control_clock(init->clock_params);
+	set_control_clock(r->clock_params);
 	
-	STORE_D2(0x20, init->radacal_ctrl[cmode]);
-	STORE_D2(0x21, p->control_use_bank2 ? 0 : 1);
-	STORE_D2(0x10, 0);
-	STORE_D2(0x11, 0);
+	RADACAL_WRITE(0x20, r->radacal_ctrl);
+	RADACAL_WRITE(0x21, p->control_use_bank2 ? 0 : 1);
+	RADACAL_WRITE(0x10, 0);
+	RADACAL_WRITE(0x11, 0);
 
 	rp = &p->control_regs->vswin;
 	for (i = 0; i < 16; ++i, ++rp)
-		out_le32(&rp->r, init->regs[i]);
+		out_le32(&rp->r, r->regs[i]);
 	
-	out_le32(&p->control_regs->pitch.r, par->vxres << cmode);
-	out_le32(&p->control_regs->mode.r, init->mode[cmode]);
-	out_le32(&p->control_regs->flags.r, flags);
-	out_le32(&p->control_regs->start_addr.r,
-	    par->yoffset * (par->vxres << cmode));
-	out_le32(&p->control_regs->reg18.r, 0x1e5);
-	out_le32(&p->control_regs->reg19.r, 0);
-
-	for (i = 0; i < 16; ++i) {
-		controlfb_setcolreg(color_table[i], default_red[i]<<8,
-				    default_grn[i]<<8, default_blu[i]<<8,
-				    0, (struct fb_info *)p);
-	}
-/* Does the above need to be here each time? -- danj */
+	out_le32(CNTRL_REG(p,pitch), par->pitch);
+	out_le32(CNTRL_REG(p,mode), r->mode);
+	out_le32(CNTRL_REG(p,vram_attr), p->vram_attr);
+	out_le32(CNTRL_REG(p,start_addr), par->yoffset * par->pitch
+		 + (par->xoffset << cmode));
+	out_le32(CNTRL_REG(p,rfrcnt), 0x1e5);
+	out_le32(CNTRL_REG(p,intr_ena), 0);
 
 	/* Turn on display */
-	out_le32(&p->control_regs->ctrl.r, ctrl);
-	
+	out_le32(CNTRL_REG(p,ctrl), par->ctrl);
+
 #ifdef CONFIG_FB_COMPAT_XPMAC
 	/* And let the world know the truth. */
 	if (!console_fb_info || console_fb_info == &p->info) {
@@ -663,12 +744,11 @@
 		display_info.width = p->par.xres;
 		display_info.depth = (cmode == CMODE_32) ? 32 :
 			((cmode == CMODE_16) ? 16 : 8);
-		display_info.pitch = p->par.vxres << p->par.cmode;
-		display_info.mode = vmode;
+		display_info.pitch = p->par.pitch;
+		display_info.mode = p->par.vmode;
 		strncpy(display_info.name, "control",
 			sizeof(display_info.name));
-		display_info.fb_address = p->frame_buffer_phys
-			 + control_reg_init[vmode-1]->offset[cmode];
+		display_info.fb_address = p->frame_buffer_phys + CTRLFB_OFF;
 		display_info.cmap_adr_address = p->cmap_regs_phys;
 		display_info.cmap_data_address = p->cmap_regs_phys + 0x30;
 		display_info.disp_reg_address = p->control_regs_phys;
@@ -677,99 +757,173 @@
 #endif /* CONFIG_FB_COMPAT_XPMAC */
 }
 
+
+/*
+ * Called from fbmem.c for probing & intializing
+ */
 int __init control_init(void)
 {
 	struct device_node *dp;
 
 	dp = find_devices("control");
-	if (dp != 0)
-		control_of_init(dp);
-	return 0;
+	if (dp != 0 && !control_of_init(dp))
+		return 0;
+
+	return -ENXIO;
+}
+
+
+/* Work out which banks of VRAM we have installed. */
+/* danj: I guess the card just ignores writes to nonexistant VRAM... */
+
+static void __init find_vram_size(struct fb_info_control *p)
+{
+	int bank1, bank2;
+
+	/*
+	 * Set VRAM in 2MB (bank 1) mode
+	 * VRAM Bank 2 will be accessible through offset 0x600000 if present
+	 * and VRAM Bank 1 will not respond at that offset even if present
+	 */
+	out_le32(CNTRL_REG(p,vram_attr), 0x31);
+
+	out_8(&p->frame_buffer[0x600000], 0xb3);
+	out_8(&p->frame_buffer[0x600001], 0x71);
+	asm volatile("eieio; dcbf 0,%0" : : "r" (&p->frame_buffer[0x600000])
+					: "memory" );
+	mb();
+	asm volatile("eieio; dcbi 0,%0" : : "r" (&p->frame_buffer[0x600000])
+					: "memory" );
+	mb();
+
+	bank2 = (in_8(&p->frame_buffer[0x600000]) == 0xb3)
+		&& (in_8(&p->frame_buffer[0x600001]) == 0x71);
+
+	/*
+	 * Set VRAM in 2MB (bank 2) mode
+	 * VRAM Bank 1 will be accessible through offset 0x000000 if present
+	 * and VRAM Bank 2 will not respond at that offset even if present
+	 */
+	out_le32(CNTRL_REG(p,vram_attr), 0x39);
+
+	out_8(&p->frame_buffer[0], 0x5a);
+	out_8(&p->frame_buffer[1], 0xc7);
+	asm volatile("eieio; dcbf 0,%0" : : "r" (&p->frame_buffer[0])
+					: "memory" );
+	mb();
+	asm volatile("eieio; dcbi 0,%0" : : "r" (&p->frame_buffer[0])
+					: "memory" );
+	mb();
+
+	bank1 = (in_8(&p->frame_buffer[0]) == 0x5a)
+		&& (in_8(&p->frame_buffer[1]) == 0xc7);
+
+	if (bank2) {
+		if (!bank1) {
+			/*
+			 * vram bank 2 only
+			 */
+			p->control_use_bank2 = 1;
+			p->vram_attr = 0x39;
+			p->frame_buffer += 0x600000;
+			p->frame_buffer_phys += 0x600000;
+		} else {
+			/*
+			 * 4 MB vram
+			 */
+			p->vram_attr = 0x51;
+		}
+	} else {
+		/*
+		 * vram bank 1 only
+		 */
+		p->vram_attr = 0x31;
+	}
+
+        p->total_vram = (bank1 + bank2) * 0x200000;
+
+	printk(KERN_INFO "controlfb: VRAM Total = %dMB "
+			"(%dMB @ bank 1, %dMB @ bank 2)\n",
+			(bank1 + bank2) << 1, bank1 << 1, bank2 << 1);
 }
 
-static void __init control_of_init(struct device_node *dp)
+
+/*
+ * find "control" and initialize
+ */
+static int __init control_of_init(struct device_node *dp)
 {
 	struct fb_info_control	*p;
-	unsigned long		addr, size;
-	int			i, bank1, bank2;
+	unsigned long		addr;
+	int			i;
 
+	if (control_fb) {
+		printk(KERN_ERR "controlfb: only one control is supported\n");
+		return -ENXIO;
+	}
 	if(dp->n_addrs != 2) {
 		printk(KERN_ERR "expecting 2 address for control (got %d)", dp->n_addrs);
-		return;
+		return -ENXIO;
 	}
 	p = kmalloc(sizeof(*p), GFP_ATOMIC);
 	if (p == 0)
-		return;
+		return -ENXIO;
+	control_fb = p;	/* save it for cleanups */
 	memset(p, 0, sizeof(*p));
 
 	/* Map in frame buffer and registers */
 	for (i = 0; i < dp->n_addrs; ++i) {
 		addr = dp->addrs[i].address;
-		size = dp->addrs[i].size;
-		/* Let's assume we can request either all or nothing */
-		if (!request_mem_region(addr, size, "controlfb")) {
-		    kfree(p);
-		    return;
-		}
-		if (size >= 0x800000) {
+		if (dp->addrs[i].size >= 0x800000) {
+			p->fb_orig_base = addr;
+			p->fb_orig_size = dp->addrs[i].size;
 			/* use the big-endian aperture (??) */
-			addr += 0x800000;
-			/* map at most 8MB for the frame buffer */
-			p->frame_buffer_phys = addr;
-			p->frame_buffer = __ioremap(addr, 0x800000, _PAGE_WRITETHRU);
+			p->frame_buffer_phys = addr + 0x800000;
 		} else {
 			p->control_regs_phys = addr;
-			p->control_regs = ioremap(addr, size);
+			p->control_regs_size = dp->addrs[i].size;
 		}
 	}
+
+	if (!p->fb_orig_base ||
+	    !request_mem_region(p->fb_orig_base,p->fb_orig_size,"controlfb")) {
+		p->fb_orig_base = 0;
+		goto error_out;
+	}
+	/* map at most 8MB for the frame buffer */
+	p->frame_buffer = __ioremap(p->frame_buffer_phys, 0x800000,
+				    _PAGE_WRITETHRU);
+
+	if (!p->control_regs_phys ||
+	    !request_mem_region(p->control_regs_phys, p->control_regs_size,
+	    "controlfb regs")) {
+		p->control_regs_phys = 0;
+		goto error_out;
+	}
+	p->control_regs = ioremap(p->control_regs_phys, p->control_regs_size);
+
 	p->cmap_regs_phys = 0xf301b000;	 /* XXX not in prom? */
-	request_mem_region(p->cmap_regs_phys, 0x1000, "controlfb cmap");
+	if (!request_mem_region(p->cmap_regs_phys, 0x1000, "controlfb cmap")) {
+		p->cmap_regs_phys = 0;
+		goto error_out;
+	}
 	p->cmap_regs = ioremap(p->cmap_regs_phys, 0x1000);
 
-	/* Work out which banks of VRAM we have installed. */
-	/* According to Andrew Fyfe <bandr@best.com>, the VRAM behaves like so: */
-	/* afyfe: observations from an 8500:
-	 * - with 2M vram in bank 1, it appears at offsets 0, 2M and 4M
-	 * - with 2M vram in bank 2, it appears only at offset 6M
-	 * - with 4M vram, it appears only as a 4M block at offset 0.
-	 */
+	if (!p->cmap_regs || !p->control_regs || !p->frame_buffer)
+		goto error_out;
 
-	/* We know there is something at 2M if there is something at 0M. */
-	out_8(&p->frame_buffer[0x200000], 0xa5);
-	out_8(&p->frame_buffer[0x200001], 0x38);
-	asm volatile("eieio; dcbi 0,%0" : : "r" (&p->frame_buffer[0x200000]) : "memory" );
+	find_vram_size(p);
+	if (!p->total_vram)
+		goto error_out;
 
-	out_8(&p->frame_buffer[0], 0x5a);
-	out_8(&p->frame_buffer[1], 0xc7);
-	asm volatile("eieio; dcbi 0,%0" : : "r" (&p->frame_buffer[0]) : "memory" );
+	if (init_control(p) < 0)
+		goto error_out;
 
-	bank1 =  (in_8(&p->frame_buffer[0x000000]) == 0x5a)
-		&& (in_8(&p->frame_buffer[0x000001]) == 0xc7);
-	bank2 =  (in_8(&p->frame_buffer[0x200000]) == 0xa5)
-		&& (in_8(&p->frame_buffer[0x200001]) == 0x38);
-
-	if(bank2 && !bank1)
-		printk(KERN_INFO "controlfb: Found memory at 2MB but not at 0!  Please contact dan@debian.org\n");
-
-	if(!bank1) {
-		out_8(&p->frame_buffer[0x600000], 0xa5);
-		out_8(&p->frame_buffer[0x600001], 0x38);
-		asm volatile("eieio; dcbi 0,%0" : : "r" (&p->frame_buffer[0x600000]) : "memory" );
-		bank2 = (in_8(&p->frame_buffer[0x600000]) == 0xa5)
-			&& (in_8(&p->frame_buffer[0x600001]) == 0x38);
-		/* If we don't have bank 1 installed, we hope we have bank 2 :-) */
-		p->control_use_bank2 = 1;
-		p->frame_buffer += 0x600000;
-		p->frame_buffer_phys += 0x600000;
-	}
-	
-	p->total_vram = (bank1 + bank2) * 0x200000;
-	
-	printk(KERN_INFO "controlfb: Memory bank 1 %s, bank 2 %s, total VRAM %dMB\n",
-		bank1 ? "present" : "absent", bank2 ? "present" : "absent",
-		2 * (bank1 + bank2));
+	return 0;
 
-	init_control(p);
+error_out:
+	control_cleanup();
+	return -ENXIO;
 }
 
 /*
@@ -781,181 +935,234 @@
 {
 	int sense;
 
-	out_le32(&p->control_regs->mon_sense.r, 7);	/* drive all lines high */
+	out_le32(CNTRL_REG(p,mon_sense), 7);	/* drive all lines high */
 	__delay(200);
-	out_le32(&p->control_regs->mon_sense.r, 077);	/* turn off drivers */
+	out_le32(CNTRL_REG(p,mon_sense), 077);	/* turn off drivers */
 	__delay(2000);
-	sense = (in_le32(&p->control_regs->mon_sense.r) & 0x1c0) << 2;
+	sense = (in_le32(CNTRL_REG(p,mon_sense)) & 0x1c0) << 2;
 
 	/* drive each sense line low in turn and collect the other 2 */
-	out_le32(&p->control_regs->mon_sense.r, 033);	/* drive A low */
+	out_le32(CNTRL_REG(p,mon_sense), 033);	/* drive A low */
 	__delay(2000);
-	sense |= (in_le32(&p->control_regs->mon_sense.r) & 0xc0) >> 2;
-	out_le32(&p->control_regs->mon_sense.r, 055);	/* drive B low */
+	sense |= (in_le32(CNTRL_REG(p,mon_sense)) & 0xc0) >> 2;
+	out_le32(CNTRL_REG(p,mon_sense), 055);	/* drive B low */
 	__delay(2000);
-	sense |= ((in_le32(&p->control_regs->mon_sense.r) & 0x100) >> 5)
-		| ((in_le32(&p->control_regs->mon_sense.r) & 0x40) >> 4);
-	out_le32(&p->control_regs->mon_sense.r, 066);	/* drive C low */
+	sense |= ((in_le32(CNTRL_REG(p,mon_sense)) & 0x100) >> 5)
+		| ((in_le32(CNTRL_REG(p,mon_sense)) & 0x40) >> 4);
+	out_le32(CNTRL_REG(p,mon_sense), 066);	/* drive C low */
 	__delay(2000);
-	sense |= (in_le32(&p->control_regs->mon_sense.r) & 0x180) >> 7;
+	sense |= (in_le32(CNTRL_REG(p,mon_sense)) & 0x180) >> 7;
 
-	out_le32(&p->control_regs->mon_sense.r, 077);	/* turn off drivers */
+	out_le32(CNTRL_REG(p,mon_sense), 077);	/* turn off drivers */
 	
 	return sense;
 }
 
-/***********************  Various translation functions  ***********************/
-#if 1
-/* This routine takes a user-supplied var, and picks the best vmode/cmode from it. */
-static int control_var_to_par(struct fb_var_screeninfo *var,
-	struct fb_par_control *par, const struct fb_info *fb_info)
-{
-	int xres = var->xres;
-	int yres = var->yres;
-	int bpp = var->bits_per_pixel;
-	struct fb_info_control *p = (struct fb_info_control *) fb_info;
+/**********************  Various translation functions  **********************/
 
-    /*
-     *  Get the video params out of 'var'. If a value doesn't fit, round it up,
-     *  if it's too big, return -EINVAL.
-     *
-     *  Suggestion: Round up in the following order: bits_per_pixel, xres,
-     *  yres, xres_virtual, yres_virtual, xoffset, yoffset, grayscale,
-     *  bitfields, horizontal timing, vertical timing.
-     */
-	/* swiped by jonh from atyfb.c */
-	if (xres <= 640 && yres <= 480)
-		par->vmode = VMODE_640_480_67;		/* 640x480, 67Hz */
-	else if (xres <= 640 && yres <= 870)
-		par->vmode = VMODE_640_870_75P;		/* 640x870, 75Hz (portrait) */
-	else if (xres <= 800 && yres <= 600)
-		par->vmode = VMODE_800_600_75;		/* 800x600, 75Hz */
-	else if (xres <= 832 && yres <= 624)
-		par->vmode = VMODE_832_624_75;		/* 832x624, 75Hz */
-	else if (xres <= 1024 && yres <= 768)
-		par->vmode = VMODE_1024_768_75;		/* 1024x768, 75Hz */
-	else if (xres <= 1152 && yres <= 870)
-		par->vmode = VMODE_1152_870_75;		/* 1152x870, 75Hz */
-	else if (xres <= 1280 && yres <= 960)
-		par->vmode = VMODE_1280_960_75;		/* 1280x960, 75Hz */
-	else if (xres <= 1280 && yres <= 1024)
-		par->vmode = VMODE_1280_1024_75;	/* 1280x1024, 75Hz */
-	else {
-		printk(KERN_ERR "Bad x/y res in var_to_par\n");
-		return -EINVAL;
-	}
+#define CONTROL_PIXCLOCK_BASE	256016
+#define CONTROL_PIXCLOCK_MIN	5000	/* ~ 200 MHz dot clock */
 
-	xres = control_reg_init[par->vmode-1]->hres;
-	yres = control_reg_init[par->vmode-1]->vres;
+/*
+ * calculate the clock paramaters to be sent to CUDA according to given
+ * pixclock in pico second.
+ */
+static int calc_clock_params(unsigned long clk, unsigned char *param)
+{
+	unsigned long p0, p1, p2, k, l, m, n, min;
 
-	par->xres = xres;
-	par->yres = yres;
+	if (clk > (CONTROL_PIXCLOCK_BASE << 3))
+		return 1;
 
-	if (var->xres_virtual <= xres)
-		par->vxres = xres;
-	else if(var->xres_virtual > xres) {
-		par->vxres = xres;
-	} else	/* NotReached at present */
-		par->vxres = (var->xres_virtual+7) & ~7;
+	p2 = ((clk << 4) < CONTROL_PIXCLOCK_BASE)? 3: 2;
+	l = clk << p2;
+	p0 = 0;
+	p1 = 0;
+	for (k = 1, min = l; k < 32; k++) {
+		unsigned long rem;
+
+		m = CONTROL_PIXCLOCK_BASE * k;
+		n = m / l;
+		rem = m % l;
+		if (n && (n < 128) && rem < min) {
+			p0 = k;
+			p1 = n;
+			min = rem;
+		}
+	}
+	if (!p0 || !p1)
+		return 1;
 
-	if (var->yres_virtual <= yres)
-		par->vyres = yres;
-	else
-		par->vyres = var->yres_virtual;
+	param[0] = p0;
+	param[1] = p1;
+	param[2] = p2;
 
-	if (var->xoffset > 0 || var->yoffset+yres > par->vyres) {
-		printk(KERN_ERR "Bad offsets in var_to_par\n");
-		return -EINVAL;
-	}
+	return 0;
+}
 
-	par->xoffset = (var->xoffset+7) & ~7;
-	par->yoffset = var->yoffset;
 
+/*
+ * This routine takes a user-supplied var, and picks the best vmode/cmode
+ * from it.
+ */
 
- 	if (bpp <= 8)
+static int control_var_to_par(struct fb_var_screeninfo *var,
+	struct fb_par_control *par, const struct fb_info *fb_info)
+{
+	int cmode, piped_diff, hstep;
+	unsigned hperiod, hssync, hsblank, hesync, heblank, piped, heq, hlfln,
+		 hserr, vperiod, vssync, vesync, veblank, vsblank, vswin, vewin;
+	unsigned long pixclock;
+	struct fb_info_control *p = (struct fb_info_control *) fb_info;
+	struct control_regvals *r = &par->regvals;
+
+	switch (var->bits_per_pixel) {
+	case 8:
 		par->cmode = CMODE_8;
-	else if (bpp <= 16)
+		if (p->total_vram > 0x200000) {
+			r->mode = 3;
+			r->radacal_ctrl = 0x20;
+			piped_diff = 13;
+		} else {
+			r->mode = 2;
+			r->radacal_ctrl = 0x10;
+			piped_diff = 9;
+		}
+		break;
+	case 15:
+	case 16:
 		par->cmode = CMODE_16;
-	else if (bpp <= 32)
+		if (p->total_vram > 0x200000) {
+			r->mode = 2;
+			r->radacal_ctrl = 0x24;
+			piped_diff = 5;
+		} else {
+			r->mode = 1;
+			r->radacal_ctrl = 0x14;
+			piped_diff = 3;
+		}
+		break;
+	case 32:
 		par->cmode = CMODE_32;
-	else {
-		printk(KERN_ERR "Bad bpp in var_to_par\n");
+		if (p->total_vram > 0x200000) {
+			r->mode = 1;
+			r->radacal_ctrl = 0x28;
+		} else {
+			r->mode = 0;
+			r->radacal_ctrl = 0x18;
+		}
+		piped_diff = 1;
+		break;
+	default:
 		return -EINVAL;
 	}
 
-	if (control_vram_reqd(par->vmode, par->cmode) > p->total_vram) {
-		printk(KERN_ERR "Too much VRAM required for vmode %d cmode %d.\n", par->vmode, par->cmode);
-		return -EINVAL;
-	}
+	/*
+	 * adjust xres and vxres so that the corresponding memory widths are
+	 * 32-byte aligned
+	 */
+	hstep = 31 >> par->cmode;
+	par->xres = (var->xres + hstep) & ~hstep;
+	par->vxres = (var->xres_virtual + hstep) & ~hstep;
+	par->xoffset = (var->xoffset + hstep) & ~hstep;
+	if (par->vxres < par->xres)
+		par->vxres = par->xres;
+	par->pitch = par->vxres << par->cmode;
 
-	/* Check if we know about the wanted video mode */
-	if (control_reg_init[par->vmode - 1] == NULL) {
-		printk(KERN_ERR "init is null in control_var_to_par().\n");
-		/* I'm not sure if control has any specific requirements --	*/
-		/* if we have a regvals struct, we're good to go?		*/
-		return -EINVAL;
-	}
+	par->yres = var->yres;
+	par->vyres = var->yres_virtual;
+	par->yoffset = var->yoffset;
+	if (par->vyres < par->yres)
+		par->vyres = par->yres;
 
-	return 0;
-}
-#else
-/* This routine takes a user-supplied var, and picks the best vmode/cmode from it. */
-static int control_var_to_par(struct fb_var_screeninfo *var,
-	struct fb_par_control *par, const struct fb_info *fb_info)
-{
-	struct fb_info_control *p = (struct fb_info_control *) fb_info;
-	
-	if(mac_var_to_vmode(var, &par->vmode, &par->cmode) != 0)
-		return -EINVAL;
-	par->xres = par->vxres = vmode_attrs[par->vmode - 1].hres;
-	par->yres = par->vyres = vmode_attrs[par->vmode - 1].vres;
-	par->xoffset = par->yoffset = 0;
-	
-	if (control_vram_reqd(par->vmode, par->cmode) > p->total_vram)
+	par->sync = var->sync;
+
+	if (par->pitch * par->vyres + CTRLFB_OFF > p->total_vram)
 		return -EINVAL;
 
-	/* Check if we know about the wanted video mode */
-	if(!control_reg_init[par->vmode-1]) {
-		/* I'm not sure if control has any specific requirements --	*/
-		/* if we have a regvals struct, we're good to go?		*/
+	if (par->xoffset + par->xres > par->vxres)
+		par->xoffset = par->vxres - par->xres;
+	if (par->yoffset + par->yres > par->vyres)
+		par->yoffset = par->vyres - par->yres;
+
+	pixclock = (var->pixclock < CONTROL_PIXCLOCK_MIN)? CONTROL_PIXCLOCK_MIN:
+		   var->pixclock;
+	if (calc_clock_params(pixclock, r->clock_params))
 		return -EINVAL;
-	}
+
+	hperiod = ((var->left_margin + par->xres + var->right_margin
+		    + var->hsync_len) >> 1) - 2;
+	hssync = hperiod + 1;
+	hsblank = hssync - (var->right_margin >> 1);
+	hesync = (var->hsync_len >> 1) - 1;
+	heblank = (var->left_margin >> 1) + hesync;
+	piped = heblank - piped_diff;
+	heq = var->hsync_len >> 2;
+	hlfln = (hperiod+2) >> 1;
+	hserr = hssync-hesync;
+	vperiod = (var->vsync_len + var->lower_margin + par->yres
+		   + var->upper_margin) << 1;
+	vssync = vperiod - 2;
+	vesync = (var->vsync_len << 1) - vperiod + vssync;
+	veblank = (var->upper_margin << 1) + vesync;
+	vsblank = vssync - (var->lower_margin << 1);
+	vswin = (vsblank+vssync) >> 1;
+	vewin = (vesync+veblank) >> 1;
+
+	r->regs[0] = vswin;
+	r->regs[1] = vsblank;
+	r->regs[2] = veblank;
+	r->regs[3] = vewin;
+	r->regs[4] = vesync;
+	r->regs[5] = vssync;
+	r->regs[6] = vperiod;
+	r->regs[7] = piped;
+	r->regs[8] = hperiod;
+	r->regs[9] = hsblank;
+	r->regs[10] = heblank;
+	r->regs[11] = hesync;
+	r->regs[12] = hssync;
+	r->regs[13] = heq;
+	r->regs[14] = hlfln;
+	r->regs[15] = hserr;
+
+	if (par->xres >= 1280 && par->cmode >= CMODE_16)
+		par->ctrl = 0x7f;
+	else
+		par->ctrl = 0x3b;
+
+	if (mac_var_to_vmode(var, &par->vmode, &cmode))
+		par->vmode = 0;
+
 	return 0;
 }
-#endif
 
-/***********  Convert hardware data in par to an fb_var_screeninfo ***********/
+
+/*
+ * Convert hardware data in par to an fb_var_screeninfo
+ */
 
 static void control_par_to_var(struct fb_par_control *par, struct fb_var_screeninfo *var)
 {
 	struct control_regints *rv;
 	
-	rv = (struct control_regints *) control_reg_init[par->vmode - 1]->regs;
+	rv = (struct control_regints *) par->regvals.regs;
 	
 	memset(var, 0, sizeof(*var));
-	var->xres = control_reg_init[par->vmode - 1]->hres;
-	var->yres = control_reg_init[par->vmode - 1]->vres;
+	var->xres = par->xres;
+	var->yres = par->yres;
 	var->xres_virtual = par->vxres;
 	var->yres_virtual = par->vyres;
 	var->xoffset = par->xoffset;
 	var->yoffset = par->yoffset;
-	var->grayscale = 0;
 	
-	if(par->cmode != CMODE_8 && par->cmode != CMODE_16 && par->cmode != CMODE_32) {
-		printk(KERN_ERR "Bad color mode in control_par_to_var()!\n");
-		par->cmode = CMODE_8;
-	}
 	switch(par->cmode) {
+	default:
 	case CMODE_8:
 		var->bits_per_pixel = 8;
-		var->red.offset = 0;
 		var->red.length = 8;
-		var->green.offset = 0;
 		var->green.length = 8;
-		var->blue.offset = 0;
 		var->blue.length = 8;
-		var->transp.offset = 0;
-		var->transp.length = 0;
 		break;
 	case CMODE_16:	/* RGB 555 */
 		var->bits_per_pixel = 16;
@@ -963,10 +1170,7 @@
 		var->red.length = 5;
 		var->green.offset = 5;
 		var->green.length = 5;
-		var->blue.offset = 0;
 		var->blue.length = 5;
-		var->transp.offset = 0;
-		var->transp.length = 0;
 		break;
 	case CMODE_32:	/* RGB 888 */
 		var->bits_per_pixel = 32;
@@ -974,67 +1178,41 @@
 		var->red.length = 8;
 		var->green.offset = 8;
 		var->green.length = 8;
-		var->blue.offset = 0;
 		var->blue.length = 8;
 		var->transp.offset = 24;
 		var->transp.length = 8;
 		break;
 	}
-	var->red.msb_right = 0;
-	var->green.msb_right = 0;
-	var->blue.msb_right = 0;
-	var->transp.msb_right = 0;
-	var->nonstd = 0;
-	var->activate = 0;
 	var->height = -1;
 	var->width = -1;
 	var->vmode = FB_VMODE_NONINTERLACED;
 
-	var->left_margin = (rv->heblank - rv->hesync)
-		<< ((par->vmode > 18) ? 2 : 1);
-	var->right_margin = (rv->hssync - rv->hsblank)
-		<< ((par->vmode > 18) ? 2 : 1);
-	var->hsync_len = (rv->hperiod + 2 - rv->hssync + rv->hesync)
-		<< ((par->vmode > 18) ? 2 : 1);
+	var->left_margin = (rv->heblank - rv->hesync) << 1;
+	var->right_margin = (rv->hssync - rv->hsblank) << 1;
+	var->hsync_len = (rv->hperiod + 2 - rv->hssync + rv->hesync) << 1;
 
 	var->upper_margin = (rv->veblank - rv->vesync) >> 1;
 	var->lower_margin = (rv->vssync - rv->vsblank) >> 1;
 	var->vsync_len = (rv->vperiod - rv->vssync + rv->vesync) >> 1;
 
-	/* Acording to macmodes.c... */
-	if((par->vmode >= 9 && par->vmode <= 12) ||
-	   (par->vmode >= 16 && par->vmode <= 18) ||
-	   (par->vmode == 20))
-	{
-		var->sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT;
-	} else {
-		var->sync = 0;          /* I suppose */
-	}
+	var->sync = par->sync;
 
-    /* The reason these are both here: with my revised margin calculations, */
-    /* these SHOULD both give the same answer for each mode.  Some day I    */
-    /* will sit down and check the rest.  Works perfectly for vmode 13.     */
-
-#if 0
-/* jonh's pixclocks...*/
-	/* no long long support in the kernel :-( */
-	/* this splittig trick will work if xres > 232 */
-	var->pixclock = 1000000000/
-	(var->left_margin+var->xres+var->right_margin+var->hsync_len);
-	var->pixclock *= 1000;
-	var->pixclock /= vmode_attrs[par->vmode-1].vfreq*
-	 (var->upper_margin+var->yres+var->lower_margin+var->vsync_len);
-#else
-/* danj's */
-	/* 10^12 * clock_params[0] / (3906400 * clock_params[1] * 2^clock_params[2]) */
-	/* (10^12 * clock_params[0] / (3906400 * clock_params[1])) >> clock_params[2] */
+	/*
+	 * 10^12 * clock_params[0] / (3906400 * clock_params[1]
+	 *			      * 2^clock_params[2])
+	 * (10^12 * clock_params[0] / (3906400 * clock_params[1]))
+	 * >> clock_params[2]
+	 */
 	/* (255990.17 * clock_params[0] / clock_params[1]) >> clock_params[2] */
-	var->pixclock = 255990 * control_reg_init[par->vmode-1]->clock_params[0];
-	var->pixclock /= control_reg_init[par->vmode-1]->clock_params[1];
-	var->pixclock >>= control_reg_init[par->vmode-1]->clock_params[2];
-#endif
+	var->pixclock = CONTROL_PIXCLOCK_BASE * par->regvals.clock_params[0];
+	var->pixclock /= par->regvals.clock_params[1];
+	var->pixclock >>= par->regvals.clock_params[2];
 }
 
+
+/*
+ * init fix according to given par
+ */
 static void control_par_to_fix(struct fb_par_control *par, struct fb_fix_screeninfo *fix,
 	struct fb_info_control *p)
 {
@@ -1044,52 +1222,41 @@
 	fix->mmio_len = sizeof(struct control_regs);
 	fix->type = FB_TYPE_PACKED_PIXELS;
 	
+	fix->xpanstep = 32 >> par->cmode;
 	fix->ypanstep = 1;
-	/*
-		fix->type_aux = 0;
-		fix->ywrapstep = 0;
-		fix->ypanstep = 0;
-		fix->xpanstep = 0;
-	*/
-
-	fix->smem_start = (p->frame_buffer_phys
-		+ control_reg_init[par->vmode-1]->offset[par->cmode]);
-	fix->smem_len = p->total_vram - control_reg_init[par->vmode-1]->offset[par->cmode];
+
+	fix->smem_start = p->frame_buffer_phys + CTRLFB_OFF;
+	fix->smem_len = p->total_vram - CTRLFB_OFF;
 	fix->visual = (par->cmode == CMODE_8) ?
 		FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_DIRECTCOLOR;
-	fix->line_length = par->vxres << par->cmode;
+	fix->line_length = par->pitch;
 }
 
-/* We never initialize any display except for p->disp.
-   And p->disp is already memset to 0.  So no memset here.
-   [Found by Takashi Oe]
-*/
+/*
+ * initialize a portion of struct display which low level driver is responsible
+ * for.
+ */
 static void control_par_to_display(struct fb_par_control *par,
   struct display *disp, struct fb_fix_screeninfo *fix, struct fb_info_control *p)
 {
-	/* memset(disp, 0, sizeof(*disp)); */
 	disp->type = fix->type;
 	disp->can_soft_blank = 1;
 	disp->scrollmode = SCROLL_YNOMOVE | SCROLL_YNOPARTIAL;
 	disp->ypanstep = fix->ypanstep;
 	disp->ywrapstep = fix->ywrapstep;
-#if 0
-		disp->type_aux = fix->type_aux;
-		disp->cmap.red = NULL;	/* ??? danj */
-		disp->cmap.green = NULL;
-		disp->cmap.blue = NULL;
-		disp->cmap.transp = NULL;
-			/* Yeah, I realize I just set 0 = 0. */
-#endif
 
 	control_par_to_var(par, &disp->var);
-	disp->screen_base = (char *) p->frame_buffer
-		 + control_reg_init[par->vmode-1]->offset[par->cmode];
+	disp->screen_base = (char *) p->frame_buffer + CTRLFB_OFF;
 	disp->visual = fix->visual;
 	disp->line_length = fix->line_length;
 	control_set_dispsw(disp, par->cmode, p);
 }
 
+
+/*
+ * our own _revc() routines since generic routines don't work for DIRECT Color
+ * devices like control
+ */
 static void control_cfb16_revc(struct display *p, int xx, int yy)
 {
     u8 *dest;
@@ -1164,6 +1331,9 @@
 };
 
 
+/*
+ * Set struct dispsw according to given cmode
+ */
 static void control_set_dispsw(struct display *disp, int cmode, struct fb_info_control *p)
 {
 	switch (cmode) {
@@ -1190,6 +1360,10 @@
 	}
 }
 
+
+/*
+ * Set misc info vars for this driver
+ */
 static void __init control_init_info(struct fb_info *info, struct fb_info_control *p)
 {
 	strcpy(info->modename, "control");
@@ -1203,7 +1377,36 @@
 	info->blank = &controlfb_blank;
 }
 
-/* Parse user speficied options (`video=controlfb:') */
+
+static void control_cleanup(void)
+{
+	struct fb_info_control	*p = control_fb;
+
+	if (!p)
+		return;
+
+	if (p->cmap_regs)
+		iounmap(p->cmap_regs);
+	if (p->control_regs)
+		iounmap(p->control_regs);
+	if (p->frame_buffer) {
+		if (p->control_use_bank2)
+			p->frame_buffer -= 0x600000;
+		iounmap(p->frame_buffer);
+	}
+	if (p->cmap_regs_phys)
+		release_mem_region(p->cmap_regs_phys, 0x1000);
+	if (p->control_regs_phys)
+		release_mem_region(p->control_regs_phys, p->control_regs_size);
+	if (p->fb_orig_base)
+		release_mem_region(p->fb_orig_base, p->fb_orig_size);
+	kfree(p);
+}
+
+
+/*
+ * Parse user speficied options (`video=controlfb:')
+ */
 void __init control_setup(char *options)
 {
 	char *this_opt;
@@ -1223,11 +1426,11 @@
 					break;
 			memcpy(fontname, this_opt + 5, i);
 			fontname[i] = 0;
-		}
-		if (!strncmp(this_opt, "vmode:", 6)) {
+		} else if (!strncmp(this_opt, "vmode:", 6)) {
 			int vmode = simple_strtoul(this_opt+6, NULL, 0);
-		if (vmode > 0 && vmode <= VMODE_MAX)
-			default_vmode = vmode;
+			if (vmode > 0 && vmode <= VMODE_MAX &&
+			    control_mac_modes[vmode - 1].m[1] >= 0)
+				default_vmode = vmode;
 		} else if (!strncmp(this_opt, "cmode:", 6)) {
 			int depth = simple_strtoul(this_opt+6, NULL, 0);
 			switch (depth) {
@@ -1252,20 +1455,3 @@
 	}
 }
 
-#if 0
-static int controlfb_pan_display(struct fb_var_screeninfo *var,
-			   struct controlfb_par *par,
-			   const struct fb_info *fb_info)
-{
-    /*
-     *  Pan (or wrap, depending on the `vmode' field) the display using the
-     *  `xoffset' and `yoffset' fields of the `var' structure.
-     *  If the values don't fit, return -EINVAL.
-     */
-
-	FUNCID;
-
-    return 0;
-}
-
-#endif
diff -u --recursive --new-file v2.4.8/linux/drivers/video/controlfb.h linux/drivers/video/controlfb.h
--- v2.4.8/linux/drivers/video/controlfb.h	Mon Dec 21 14:48:04 1998
+++ linux/drivers/video/controlfb.h	Sun Aug 12 10:51:42 2001
@@ -21,13 +21,13 @@
  * Structure of the registers for the RADACAL colormap device.
  */
 struct cmap_regs {
-	unsigned char addr;
+	unsigned char addr;	/* index for both cmap and misc registers */
 	char pad1[15];
-	unsigned char d1;
+	unsigned char crsr;	/* cursor palette */
 	char pad2[15];
-	unsigned char d2;
+	unsigned char dat;	/* RADACAL misc register data */
 	char pad3[15];
-	unsigned char lut;
+	unsigned char lut;	/* cmap data */
 	char pad4[15];
 };
 
@@ -51,26 +51,27 @@
 	struct preg vesync;	/* vert end sync */
 	struct preg vssync;	/* vert start sync */
 	struct preg vperiod;	/* vert period */
-	struct preg reg8;
+	struct preg piped;	/* pipe delay hardware cursor */
 	/* Horizontal params are in units of 2 pixels */
 	struct preg hperiod;	/* horiz period - 2 */
 	struct preg hsblank;	/* horiz start blank */
 	struct preg heblank;	/* horiz end blank */
 	struct preg hesync;	/* horiz end sync */
 	struct preg hssync;	/* horiz start sync */
-	struct preg rege;
-	struct preg regf;
-	struct preg reg10;
-	struct preg reg11;
+	struct preg heq;	/* half horiz sync len */
+	struct preg hlfln;	/* half horiz period */
+	struct preg hserr;	/* horiz period - horiz sync len */
+	struct preg cnttst;
 	struct preg ctrl;	/* display control */
 	struct preg start_addr;	/* start address: 5 lsbs zero */
 	struct preg pitch;	/* addrs diff between scan lines */
 	struct preg mon_sense;	/* monitor sense bits */
-	struct preg flags;
+	struct preg vram_attr;	/* enable vram banks */
 	struct preg mode;
-	struct preg reg18;
-	struct preg reg19;
-	struct preg res[6];
+	struct preg rfrcnt;	/* refresh count */
+	struct preg intr_ena;	/* interrupt enable */
+	struct preg intr_stat;	/* interrupt status */
+	struct preg res[5];
 };
 
 struct control_regints {
@@ -82,7 +83,7 @@
 	unsigned vesync;	/* vert end sync */
 	unsigned vssync;	/* vert start sync */
 	unsigned vperiod;	/* vert period */
-	unsigned reg8;
+	unsigned piped;		/* pipe delay hardware cursor */
 	/* Horizontal params are in units of 2 pixels */
 	/* Except, apparently, for hres > 1024 (or == 1280?) */
 	unsigned hperiod;	/* horiz period - 2 */
@@ -90,183 +91,55 @@
 	unsigned heblank;	/* horiz end blank */
 	unsigned hesync;	/* horiz end sync */
 	unsigned hssync;	/* horiz start sync */
-	unsigned rege;
-	unsigned regf;
-	unsigned reg10;
+	unsigned heq;		/* half horiz sync len */
+	unsigned hlfln;		/* half horiz period */
+	unsigned hserr;		/* horiz period - horiz sync len */
 };
 	
 /*
- * Register initialization tables for the control display.
- *
  * Dot clock rate is
  * 3.9064MHz * 2**clock_params[2] * clock_params[1] / clock_params[0].
- *
- * The values for vertical frequency (V) in the comments below
- * are the values measured using the modes under MacOS.
- *
- * Pitch is always the same as bytes per line (for these video modes at least).
  */
 struct control_regvals {
-	int	offset[3];		/* first pixel address */
-	unsigned regs[16];		/* for vswin .. reg10 */
-	unsigned char mode[3];		/* indexed by color_mode */
-	unsigned char radacal_ctrl[3];
+	unsigned regs[16];		/* for vswin .. hserr */
+	unsigned char mode;
+	unsigned char radacal_ctrl;
 	unsigned char clock_params[3];
-	int	hres;
-	int	vres;
 };
 
-/* Register values for 1280x1024, 75Hz mode (20) */
-static struct control_regvals control_reg_init_20 = {
-	{ 0x10, 0x20, 0 },
-	{ 2129, 2128, 80, 42, 4, 2130, 2132, 88,
-	  420, 411, 91, 35, 421, 18, 211, 386, },
-	{ 1, 1, 1},
-	{ 0x50, 0x64, 0x64 },
-	{ 13, 56, 3 },	/* pixel clock = 134.61MHz for V=74.81Hz */
-	1280, 1024
-};
-
-/* Register values for 1280x960, 75Hz mode (19) */
-static struct control_regvals control_reg_init_19 = {
-	{ 0x10, 0x20, 0 },
-	{ 1997, 1996, 76, 40, 4, 1998, 2000, 86,
-	  418, 409, 89, 35, 419, 18, 210, 384, },
-	{ 1, 1, 1 },
-	{ 0x50, 0x64, 0x64 },
-	{ 31, 125, 3 },	/* pixel clock = 126.01MHz for V=75.01 Hz */
-	1280, 960
-};
-
-/* Register values for 1152x870, 75Hz mode (18) */
-static struct control_regvals control_reg_init_18 = {
-	{ 0x10, 0x28, 0x50 },
-	{ 1825, 1822, 82, 43, 4, 1828, 1830, 120,
-	  726, 705, 129, 63, 727, 32, 364, 664 },
-	{ 2, 1, 1 },
-	{ 0x10, 0x14, 0x28 },
-	{ 19, 61, 3 },	/* pixel clock = 100.33MHz for V=75.31Hz */
-	1152, 870
-};
-
-/* Register values for 1024x768, 75Hz mode (17) */
-static struct control_regvals control_reg_init_17 = {
-	{ 0x10, 0x28, 0x50 },
-	{ 1603, 1600, 64, 34, 4, 1606, 1608, 120,
-	  662, 641, 129, 47, 663, 24, 332, 616 },
-	{ 2, 1, 1 },
-	{ 0x10, 0x14, 0x28 },
-	{ 11, 28, 3 },	/* pixel clock = 79.55MHz for V=74.50Hz */
-	1024, 768
-};
-
-/* Register values for 1024x768, 72Hz mode 16 (15?) */
-static struct control_regvals control_reg_init_15 = {
-	{ 0x10, 0x28, 0x50 },
-	{ 1607, 1604, 68, 39, 10, 1610, 1612, 132,
-	  670, 653, 141, 67, 671, 34, 336, 604, },
-	{ 2, 1, 1 },
-	{ 0x10, 0x14, 0x28 },
-	{ 12, 30, 3 },	/* pixel clock = 78.12MHz for V=72.12Hz */
-	1024, 768
-};
-
-/* Register values for 1024x768, 60Hz mode (14) */
-static struct control_regvals control_reg_init_14 = {
-	{ 0x10, 0x28, 0x50 },
-	{ 1607, 1604, 68, 39, 10, 1610, 1612, 132,
-	  670, 653, 141, 67, 671, 34, 336, 604, },
-	{ 2, 1, 1 },
-	{ 0x10, 0x14, 0x28 },
-	{ 15, 31, 3 },	/* pixel clock = 64.58MHz for V=59.62Hz */
-	1024, 768
-};
-
-/* Register values for 832x624, 75Hz mode (13) */
-static struct control_regvals control_reg_init_13 = {
-	{ 0x10, 0x28, 0x50 },
-	{ 1331, 1330, 82, 43, 4, 1332, 1334, 128,
-	  574, 553, 137, 31, 575, 16, 288, 544 },
-	{ 2, 1, 0 }, { 0x10, 0x14, 0x18 },
-	{ 23, 42, 3 },	/* pixel clock = 57.07MHz for V=74.27Hz */
-	832, 624
-};
-
-/* Register values for 800x600, 75Hz mode (12) */
-static struct control_regvals control_reg_init_12 = {
-	{ 0x10, 0x28, 0x50 },
-	{ 1247, 1246, 46, 25, 4, 1248, 1250, 104,
-	  526, 513, 113, 39, 527, 20, 264, 488, },
-	{ 2, 1, 0 }, { 0x10, 0x14, 0x18 },
-	{ 7, 11, 3 },	/* pixel clock = 49.11MHz for V=74.40Hz */
-	800, 600
-};
-
-/* Register values for 800x600, 72Hz mode (11) */
-static struct control_regvals control_reg_init_11 = {
-	{ 0x10, 0x28, 0x50 },
-	{ 1293, 1256, 56, 33, 10, 1330, 1332, 76,
-	  518, 485, 85, 59, 519, 30, 260, 460, },
-	{ 2, 1, 0 }, { 0x10, 0x14, 0x18 },
-	{ 17, 27, 3 },	/* pixel clock = 49.63MHz for V=71.66Hz */
-	800, 600
-};
-
-/* Register values for 800x600, 60Hz mode (10) */
-static struct control_regvals control_reg_init_10 = {
-	{ 0x10, 0x28, 0x50 },
-	{ 1293, 1256, 56, 33, 10, 1330, 1332, 76,
-	  518, 485, 85, 59, 519, 30, 260, 460, },
-	{ 2, 1, 0 }, { 0x10, 0x14, 0x18 },
-	{ 20, 53, 2 },	/* pixel clock = 41.41MHz for V=59.78Hz */
-	800, 600
-};
-
-/* Register values for 640x870, 75Hz Full Page Display (7) */
-static struct control_regvals control_reg_init_7 = {
-	{ 0x10, 0x30, 0x68 },
-	{ 0x727, 0x724, 0x58, 0x2e, 0x4, 0x72a, 0x72c, 0x40,
-	  0x19e, 0x18c, 0x4c, 0x27, 0x19f, 0x14, 0xd0, 0x178 },
-	{ 2, 1, 0 }, { 0x10, 0x14, 0x18 },
-	{ 9, 33, 2 },	/* pixel clock = 57.29MHz for V=75.01Hz */
-	640, 870
-};
-
-/* Register values for 640x480, 67Hz mode (6) */
-static struct control_regvals control_reg_init_6 = {
-	{ 0, 8, 0x10 },
-	{ 1045, 1042, 82, 43, 4, 1048, 1050, 72,
-	  430, 393, 73, 31, 431, 16, 216, 400 },
-	{ 2, 1, 0 }, { 0x10, 0x14, 0x18 },
-	{ 14, 27, 2 },	/* pixel clock = 30.13MHz for V=66.43Hz */
-	640, 480
-};
-
-/* Register values for 640x480, 60Hz mode (5) */
-static struct control_regvals control_reg_init_5 = {
-	{ 0x10, 0x28, 0x50 },
-	{ 1037, 1026, 66, 34, 2, 1048, 1050, 56,
-	  398, 385, 65, 47, 399, 24, 200, 352, },
-	{ 2, 1, 0 }, { 0x10, 0x14, 0x18 },
-	{ 23, 37, 2 },	/* pixel clock = 25.14MHz for V=59.85Hz */
-	640, 480
-};
-
-static struct control_regvals *control_reg_init[VMODE_MAX] = {
-	NULL, NULL, NULL, NULL,
-	&control_reg_init_5,
-	&control_reg_init_6,
-	&control_reg_init_7,
-	NULL, NULL,
-	&control_reg_init_10,
-	&control_reg_init_11,
-	&control_reg_init_12,
-	&control_reg_init_13,
-	&control_reg_init_14,
-	&control_reg_init_15,
-	&control_reg_init_15,
-	&control_reg_init_17,
-	&control_reg_init_18,
-	&control_reg_init_19,
-	&control_reg_init_20
+#define CTRLFB_OFF 16	/* position of pixel 0 in frame buffer */
+
+
+/*
+ * Best cmode supported by control
+ */
+struct max_cmodes {
+	int m[2];	/* 0: 2MB vram, 1: 4MB vram */
 };
+
+/*
+ * Video modes supported by macmodes.c
+ */
+static struct max_cmodes control_mac_modes[] = {
+	{{-1,-1}},	/* 512x384, 60Hz interlaced (NTSC) */
+	{{-1,-1}},	/* 512x384, 60Hz */
+	{{-1,-1}},	/* 640x480, 50Hz interlaced (PAL) */
+	{{-1,-1}},	/* 640x480, 60Hz interlaced (NTSC) */
+	{{ 2, 2}},	/* 640x480, 60Hz (VGA) */
+	{{ 2, 2}},	/* 640x480, 67Hz */
+	{{-1,-1}},	/* 640x870, 75Hz (portrait) */
+	{{-1,-1}},	/* 768x576, 50Hz (PAL full frame) */
+	{{ 2, 2}},	/* 800x600, 56Hz */
+	{{ 2, 2}},	/* 800x600, 60Hz */
+	{{ 2, 2}},	/* 800x600, 72Hz */
+	{{ 2, 2}},	/* 800x600, 75Hz */
+	{{ 1, 2}},	/* 832x624, 75Hz */
+	{{ 1, 2}},	/* 1024x768, 60Hz */
+	{{ 1, 2}},	/* 1024x768, 70Hz (or 72Hz?) */
+	{{ 1, 2}},	/* 1024x768, 75Hz (VESA) */
+	{{ 1, 2}},	/* 1024x768, 75Hz */
+	{{ 1, 2}},	/* 1152x870, 75Hz */
+	{{ 0, 1}},	/* 1280x960, 75Hz */
+	{{ 0, 1}},	/* 1280x1024, 75Hz */
+};
+
diff -u --recursive --new-file v2.4.8/linux/drivers/video/cyber2000fb.c linux/drivers/video/cyber2000fb.c
--- v2.4.8/linux/drivers/video/cyber2000fb.c	Wed Jul 25 17:10:24 2001
+++ linux/drivers/video/cyber2000fb.c	Sun Aug 12 17:37:53 2001
@@ -53,15 +53,6 @@
  */
 /*#define CFB16_IS_CFB15*/
 
-/*
- * This is the offset of the PCI space in physical memory
- */
-#ifdef CONFIG_FOOTBRIDGE
-#define PCI_PHYS_OFFSET	0x80000000
-#else
-#define	PCI_PHYS_OFFSET	0x00000000
-#endif
-
 static char			*CyberRegs;
 
 #include "cyber2000fb.h"
@@ -1074,18 +1065,18 @@
 	case 2:	/* vsync off */
     		cyber2000_grphw(0x16, 0x04);
 		break;	
-	case 1:	/* just software blanking of screen */
+	case 1:	/* soft blank */
 		cyber2000_grphw(0x16, 0x00);
-		for (i = 0; i < 256; i++) {
+		for (i = 0; i < NR_PALETTE; i++) {
 			cyber2000_outb(i, 0x3c8);
 			cyber2000_outb(0, 0x3c9);
 			cyber2000_outb(0, 0x3c9);
 			cyber2000_outb(0, 0x3c9);
 		}
 		break;
-	default: /* case 0, or anything else: unblank */
+	default: /* unblank */
 		cyber2000_grphw(0x16, 0x00);
-		for (i = 0; i < 256; i++) {
+		for (i = 0; i < NR_PALETTE; i++) {
 			cyber2000_outb(i, 0x3c8);
 			cyber2000_outb(cfb->palette[i].red, 0x3c9);
 			cyber2000_outb(cfb->palette[i].green, 0x3c9);
@@ -1323,7 +1314,7 @@
 	cyber2000_outb(0x01, 0x3cf);
 
 	/*
-	 * MCLK on the NetWinder is fixed at 75MHz
+	 * MCLK on the NetWinder and the Shark is fixed at 75MHz
 	 */
 	cfb->mclk_mult = 0xdb;
 	cfb->mclk_div  = 0x54;
@@ -1361,7 +1352,7 @@
 }
 
 static struct cfb_info * __devinit
-cyberpro_alloc_fb_info(struct pci_dev *dev, const struct pci_device_id *id)
+cyberpro_alloc_fb_info(struct pci_dev *dev, const struct pci_device_id *id, char *name)
 {
 	struct cfb_info *cfb;
 
@@ -1385,7 +1376,7 @@
 	else
 		cfb->divisors[3] = 8;
 
-	sprintf(cfb->fb.fix.id, "CyberPro%4X", id->device);
+	strcpy(cfb->fb.fix.id, name);
 
 	cfb->fb.fix.type	= FB_TYPE_PACKED_PIXELS;
 	cfb->fb.fix.type_aux	= 0;
@@ -1440,14 +1431,9 @@
 
 	mmio_base = pci_resource_start(dev, 0) + MMIO_OFFSET;
 
-	cfb->fb.fix.mmio_start = mmio_base + PCI_PHYS_OFFSET;
+	cfb->fb.fix.mmio_start = mmio_base;
 	cfb->fb.fix.mmio_len   = MMIO_SIZE;
 
-	if (!request_mem_region(mmio_base, MMIO_SIZE, "memory mapped I/O")) {
-		printk("%s: memory mapped IO in use\n", cfb->fb.fix.id);
-		return -EBUSY;
-	}
-
 	CyberRegs = ioremap(mmio_base, MMIO_SIZE);
 	if (!CyberRegs) {
 		printk("%s: unable to map memory mapped IO\n",
@@ -1465,9 +1451,6 @@
 	if (cfb && CyberRegs) {
 		iounmap(CyberRegs);
 		CyberRegs = NULL;
-
-		release_mem_region(cfb->fb.fix.mmio_start - PCI_PHYS_OFFSET,
-				   cfb->fb.fix.mmio_len);
 	}
 }
 
@@ -1481,15 +1464,9 @@
 
 	smem_base = pci_resource_start(dev, 0);
 
-	cfb->fb.fix.smem_start	= smem_base + PCI_PHYS_OFFSET;
+	cfb->fb.fix.smem_start	= smem_base;
 	cfb->fb.fix.smem_len	= smem_len;
 
-	if (!request_mem_region(smem_base, smem_len, "frame buffer")) {
-		printk("%s: frame buffer in use\n",
-		       cfb->fb.fix.id);
-		return -EBUSY;
-	}
-
 	cfb->fb.screen_base = ioremap(smem_base, smem_len);
 	if (!cfb->fb.screen_base) {
 		printk("%s: unable to map screen memory\n",
@@ -1505,9 +1482,6 @@
 	if (cfb && cfb->fb.screen_base) {
 		iounmap(cfb->fb.screen_base);
 		cfb->fb.screen_base = NULL;
-
-		release_mem_region(cfb->fb.fix.smem_start - PCI_PHYS_OFFSET,
-				   cfb->fb.fix.smem_len);
 	}
 }
 
@@ -1517,14 +1491,21 @@
 	struct cfb_info *cfb;
 	u_int h_sync, v_sync;
 	u_long smem_size;
+	char name[16];
 	int err;
 
+	sprintf(name, "CyberPro%4X", id->device);
+
 	err = pci_enable_device(dev);
 	if (err)
 		return err;
 
+	err = pci_request_regions(dev, name);
+	if (err)
+		return err;
+
 	err = -ENOMEM;
-	cfb = cyberpro_alloc_fb_info(dev, id);
+	cfb = cyberpro_alloc_fb_info(dev, id, name);
 	if (!cfb)
 		goto failed;
 
@@ -1593,6 +1574,9 @@
 	cyberpro_unmap_mmio(cfb);
 	cyberpro_free_fb_info(cfb);
 
+release:
+	pci_release_regions(dev);
+
 	return err;
 }
 
@@ -1621,6 +1605,8 @@
 		pci_set_drvdata(dev, NULL);
 		if (cfb == int_cfb_info)
 			int_cfb_info = NULL;
+
+		pci_release_regions(dev);
 	}
 }
 
diff -u --recursive --new-file v2.4.8/linux/drivers/video/fbcon-sti.c linux/drivers/video/fbcon-sti.c
--- v2.4.8/linux/drivers/video/fbcon-sti.c	Tue Dec  5 12:29:39 2000
+++ linux/drivers/video/fbcon-sti.c	Sun Aug 12 10:51:42 2001
@@ -16,7 +16,7 @@
 #include <linux/console.h>
 #include <linux/string.h>
 #include <linux/fb.h>
-#include <asm/delay.h>
+#include <linux/delay.h>
 #include <asm/types.h>
 
 #include <video/fbcon.h>
@@ -323,8 +323,12 @@
      */
 
 struct display_switch fbcon_sti = {
-	fbcon_sti_setup, fbcon_sti_bmove, fbcon_sti_clear,
-	fbcon_sti_putc, fbcon_sti_putcs, fbcon_sti_revc,
-	NULL, NULL, fbcon_sti_clear_margins,
-	FONTWIDTH(8)
+	setup:		fbcon_sti_setup, 
+	bmove:		fbcon_sti_bmove, 
+	clear:		fbcon_sti_clear,
+	putc:		fbcon_sti_putc, 
+	putcs:		fbcon_sti_putcs, 
+	revc:		fbcon_sti_revc,
+	clear_margins:	fbcon_sti_clear_margins,
+	fontwidthmask:	FONTWIDTH(8)
 };
diff -u --recursive --new-file v2.4.8/linux/drivers/video/sa1100fb.c linux/drivers/video/sa1100fb.c
--- v2.4.8/linux/drivers/video/sa1100fb.c	Wed Apr 18 11:49:12 2001
+++ linux/drivers/video/sa1100fb.c	Sun Aug 12 17:37:53 2001
@@ -1,59 +1,135 @@
 /*
- * linux/drivers/video/sa1100fb.c -- StrongARM 1100 LCD Controller Frame Buffer Device
+ *  linux/drivers/video/sa1100fb.c
  *
  *  Copyright (C) 1999 Eric A. Thomas
- *  
+ *   Based on acornfb.c Copyright (C) Russell King.
+ *
  * 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 more details.
+ * License.  See the file COPYING in the main directory of this archive for
+ * more details.
  *
- */
-
-
-/*
- *   Code Status:
+ *	        StrongARM 1100 LCD Controller Frame Buffer Driver
+ *
+ * Please direct your questions and comments on this driver to the following
+ * email address:
+ *
+ *	linux-arm-kernel@lists.arm.linux.org.uk
+ *
+ * Clean patches should be sent to the ARM Linux Patch System.  Please see the
+ * following web page for more information:
+ *
+ *	http://www.arm.linux.org.uk/developer/patches/info.shtml
+ *
+ * Thank you.
+ *
+ * Known problems:
+ *  - With the Neponset plugged into an Assabet, LCD powerdown
+ *    doesn't work (LCD stays powered up).  Therefore we shouldn't
+ *    blank the screen.
+ *  - We don't limit the CPU clock rate nor the mode selection
+ *    according to the available SDRAM bandwidth.
+ *
+ *
+ * Code Status:
  * 1999/04/01:
- * 	Driver appears to be working for Brutus 320x200x8bpp mode.  Other
- * 	resolutions are working, but only the 8bpp mode is supported.
- * 	Changes need to be made to the palette encode and decode routines
- * 	to support 4 and 16 bpp modes.  
- * 	Driver is not designed to be a module.  The FrameBuffer is statically
- * 	allocated since dynamic allocation of a 300k buffer cannot be 
- * 	guaranteed. 
- * 
+ *	- Driver appears to be working for Brutus 320x200x8bpp mode.  Other
+ *	  resolutions are working, but only the 8bpp mode is supported.
+ *	  Changes need to be made to the palette encode and decode routines
+ *	  to support 4 and 16 bpp modes.  
+ *	  Driver is not designed to be a module.  The FrameBuffer is statically
+ *	  allocated since dynamic allocation of a 300k buffer cannot be 
+ *	  guaranteed. 
+ *
  * 1999/06/17:
- * 	FrameBuffer memory is now allocated at run-time when the
- * 	driver is initialized.    
+ *	- FrameBuffer memory is now allocated at run-time when the
+ *	  driver is initialized.    
+ *
+ * 2000/04/10: Nicolas Pitre <nico@cam.org>
+ *	- Big cleanup for dynamic selection of machine type at run time.
  *
- * 2000/04/10:
- * 	Big cleanup for dynamic selection of machine type at run time.
- * 		Nicolas Pitre <nico@cam.org>
- * 
- * 2000/07/19:
- * 	Support for Bitsy aka Compaq iPAQ H3600 added.
- * 		Jamey Hicks <jamey@crl.dec.com>
- * 
- * 2000/08/07:
- * 	Resolved an issue caused by a change made to the Assabet's PLD 
- * 	earlier this year which broke the framebuffer driver for newer 
- * 	Phase 4 Assabets.  Some other parameters were changed to optimize for
- * 	the Sharp display.
- * 		Tak-Shing Chan <tchan.rd@idthk.com>
- * 		Jeff Sutherland <jsutherland@accelent.com>
- * 
- * 2000/08/09:
- * 	XP860 support added
- * 		Kunihiko IMAI <imai@vasara.co.jp>
- *
- * 2000/08/19:
- * 	Allows standard options to be passed on the kernel command line
- * 	for most common passive displays.
- * 		Mark Huang <mhuang@livetoy.com>
+ * 2000/07/19: Jamey Hicks <jamey@crl.dec.com>
+ *	- Support for Bitsy aka Compaq iPAQ H3600 added.
+ *
+ * 2000/08/07: Tak-Shing Chan <tchan.rd@idthk.com>
+ *	       Jeff Sutherland <jsutherland@accelent.com>
+ *	- Resolved an issue caused by a change made to the Assabet's PLD 
+ *	  earlier this year which broke the framebuffer driver for newer 
+ *	  Phase 4 Assabets.  Some other parameters were changed to optimize
+ *	  for the Sharp display.
+ *
+ * 2000/08/09: Kunihiko IMAI <imai@vasara.co.jp>
+ *	- XP860 support added
+ *
+ * 2000/08/19: Mark Huang <mhuang@livetoy.com>
+ *	- Allows standard options to be passed on the kernel command line
+ *	  for most common passive displays.
  *
  * 2000/08/29:
- *	s/save_flags_cli/local_irq_save/
- *      remove unneeded extra save_flags_cli in
- *       sa1100fb_enable_lcd_controller
+ *	- s/save_flags_cli/local_irq_save/
+ *	- remove unneeded extra save_flags_cli in sa1100fb_enable_lcd_controller
+ *
+ * 2000/10/10: Erik Mouw <J.A.K.Mouw@its.tudelft.nl>
+ *	- Updated LART stuff. Fixed some minor bugs.
+ *
+ * 2000/10/30: Murphy Chen <murphy@mail.dialogue.com.tw>
+ *	- Pangolin support added
+ *
+ * 2000/10/31: Roman Jordan <jor@hoeft-wessel.de>
+ *	- Huw Webpanel support added
+ *
+ * 2000/11/23: Eric Peng <ericpeng@coventive.com>
+ *	- Freebird add
+ *
+ * 2001/02/07: Jamey Hicks <jamey.hicks@compaq.com> 
+ *	       Cliff Brake <cbrake@accelent.com>
+ *	- Added PM callback
+ *
+ * 2001/05/26: <rmk@arm.linux.org.uk>
+ *	- Fix 16bpp so that (a) we use the right colours rather than some
+ *	  totally random colour depending on what was in page 0, and (b)
+ *	  we don't de-reference a NULL pointer.
+ *	- remove duplicated implementation of consistent_alloc()
+ *	- convert dma address types to dma_addr_t
+ *	- remove unused 'montype' stuff
+ *	- remove redundant zero inits of init_var after the initial
+ *	  memzero.
+ *	- remove allow_modeset (acornfb idea does not belong here)
+ *
+ * 2001/05/28: <rmk@arm.linux.org.uk>
+ *	- massive cleanup - move machine dependent data into structures
+ *	- I've left various #warnings in - if you see one, and know
+ *	  the hardware concerned, please get in contact with me.
+ *
+ * 2001/05/31: <rmk@arm.linux.org.uk>
+ *	- Fix LCCR1 HSW value, fix all machine type specifications to
+ *	  keep values in line.  (Please check your machine type specs)
+ *
+ * 2001/06/10: <rmk@arm.linux.org.uk>
+ *	- Fiddle with the LCD controller from task context only; mainly
+ *	  so that we can run with interrupts on, and sleep.
+ *	- Convert #warnings into #errors.  No pain, no gain. ;)
+ *
+ * 2001/06/14: <rmk@arm.linux.org.uk>
+ *	- Make the palette BPS value for 12bpp come out correctly.
+ *	- Take notice of "greyscale" on any colour depth.
+ *	- Make truecolor visuals use the RGB channel encoding information.
+ *
+ * 2001/07/02: <rmk@arm.linux.org.uk>
+ *	- Fix colourmap problems.
+ *
+ * 2001/07/13: <abraham@2d3d.co.za>
+ *	- Added support for the ICP LCD-Kit01 on LART. This LCD is
+ *	  manufactured by Prime View, model no V16C6448AB
+ *
+ * 2001/07/23: <rmk@arm.linux.org.uk>
+ *	- Hand merge version from handhelds.org CVS tree.  See patch
+ *	  notes for 595/1 for more information.
+ *	- Drop 12bpp (it's 16bpp with different colour register mappings).
+ *	- This hardware can not do direct colour.  Therefore we don't
+ *	  support it.
+ *
+ * 2001/07/27: <rmk@arm.linux.org.uk>
+ *	- Halve YRES on dual scan LCDs.
  */
 
 #include <linux/config.h>
@@ -62,21 +138,19 @@
 #include <linux/sched.h>
 #include <linux/errno.h>
 #include <linux/string.h>
-#include <linux/ctype.h>
-#include <linux/mm.h>
-#include <linux/tty.h>
+#include <linux/interrupt.h>
 #include <linux/slab.h>
-#include <linux/init.h>
 #include <linux/fb.h>
 #include <linux/delay.h>
-#include <linux/wrapper.h>
+#include <linux/pm.h>
+#include <linux/init.h>
+#include <linux/cpufreq.h>
 
 #include <asm/hardware.h>
 #include <asm/io.h>
 #include <asm/irq.h>
 #include <asm/mach-types.h>
 #include <asm/uaccess.h>
-#include <asm/proc/pgtable.h>
 
 #include <video/fbcon.h>
 #include <video/fbcon-mfb.h>
@@ -84,328 +158,902 @@
 #include <video/fbcon-cfb8.h>
 #include <video/fbcon-cfb16.h>
 
+/*
+ * enable this if your panel appears to have broken
+ */
+#undef CHECK_COMPAT
 
 /*
- *  Debug macros 
+ * debugging?
  */
-//#define DEBUG 
-#ifdef DEBUG
-#  define DPRINTK(fmt, args...)	printk("%s: " fmt, __FUNCTION__ , ## args)
-#else
-#  define DPRINTK(fmt, args...)
-#endif
+#define DEBUG 0
+/*
+ * Complain if VAR is out of range.
+ */
+#define DEBUG_VAR 1
 
+#undef ASSABET_PAL_VIDEO
 
-/* Memory size macros for determining required FrameBuffer size */
-#define MAX_PALETTE_NUM_ENTRIES		256
-#define MAX_PALETTE_MEM_SIZE		(MAX_PALETTE_NUM_ENTRIES * 2)
-#define MAX_PIXEL_MEM_SIZE \
-	((current_par.max_xres * current_par.max_yres * current_par.max_bpp)/8)
-#define MAX_FRAMEBUFFER_MEM_SIZE \
-	(MAX_PIXEL_MEM_SIZE + MAX_PALETTE_MEM_SIZE + 32)
-#define ALLOCATED_FB_MEM_SIZE \
-	(PAGE_ALIGN(MAX_FRAMEBUFFER_MEM_SIZE + PAGE_SIZE * 2))
+#include "sa1100fb.h"
 
-#define SA1100_PALETTE_MEM_SIZE(bpp)	(((bpp)==8?256:16)*2)
-#define SA1100_PALETTE_MODE_VAL(bpp)    (((bpp) & 0x018) << 9)
+void (*sa1100fb_blank_helper)(int blank);
+EXPORT_SYMBOL(sa1100fb_blank_helper);
 
-/* Minimum X and Y resolutions */
-#define MIN_XRES	64
-#define MIN_YRES	64
 
-/* Possible controller_state modes */
-#define LCD_MODE_DISABLED		0    // Controller is disabled and Disable Done received
-#define LCD_MODE_DISABLE_BEFORE_ENABLE	1    // Re-enable after Disable Done IRQ is received
-#define LCD_MODE_ENABLED		2    // Controller is enabled
+#ifdef CHECK_COMPAT
+static void
+sa1100fb_check_shadow(struct sa1100fb_lcd_reg *new_regs,
+			   struct fb_var_screeninfo *var, u_int pcd)
+{
+	struct sa1100fb_lcd_reg shadow;
+	int different = 0;
 
-#define SA1100_NAME	"SA1100"
-#define NR_MONTYPES	1
+	/*
+	 * These machines are good machines!
+	 */
+	if (machine_is_assabet() || machine_is_bitsy())
+		return;
 
-static inline void
-sa1100fb_assabet_set_truecolor(u_int is_true_color)
-{
-#ifdef CONFIG_SA1100_ASSABET
+	/*
+	 * The following ones are bad, bad, bad.
+	 * Please make yours good!
+	 */
+	if (machine_is_pangolin()) {
+		DPRINTK("Configuring Pangolin LCD\n");
+		shadow.lccr0 =
+		    LCCR0_LEN + LCCR0_Color + LCCR0_LDM +
+		    LCCR0_BAM + LCCR0_ERM + LCCR0_Act +
+		    LCCR0_LtlEnd + LCCR0_DMADel(0);
+		shadow.lccr1 =
+		    LCCR1_DisWdth(var->xres) + LCCR1_HorSnchWdth(64) +
+		    LCCR1_BegLnDel(160) + LCCR1_EndLnDel(24);
+		shadow.lccr2 =
+		    LCCR2_DisHght(var->yres) + LCCR2_VrtSnchWdth(7) +
+		    LCCR2_BegFrmDel(7) + LCCR2_EndFrmDel(1);
+		shadow.lccr3 =
+		    LCCR3_PixClkDiv(pcd) + LCCR3_HorSnchH +
+		    LCCR3_VrtSnchH + LCCR3_PixFlEdg + LCCR3_OutEnH;
+
+		DPRINTK("pcd = %x, PixCldDiv(pcd)=%x\n",
+			pcd, LCCR3_PixClkDiv(pcd));
+	}
+	if (machine_is_freebird()) {
+		DPRINTK("Configuring  Freebird LCD\n");
 #if 1
-	// phase 4 or newer Assabet's
-        if (is_true_color)
-		BCR_set(BCR_LCD_12RGB);
-	else
-		BCR_clear(BCR_LCD_12RGB);
+		shadow.lccr0 = 0x00000038;
+		shadow.lccr1 = 0x010108e0;
+		shadow.lccr2 = 0x0000053f;
+		shadow.lccr3 = 0x00000c20;
 #else
-	// older Assabet's
-        if (is_true_color)
-		BCR_clear(BCR_LCD_12RGB);
-	else
-		BCR_set(BCR_LCD_12RGB);
+		shadow.lccr0 =
+		    LCCR0_LEN + LCCR0_Color + LCCR0_Sngl +
+		    LCCR0_LDM + LCCR0_BAM + LCCR0_ERM + LCCR0_Pas +
+		    LCCR0_LtlEnd + LCCR0_DMADel(0);
+		/* Check ,Chester */
+		shadow.lccr1 =
+		    LCCR1_DisWdth(var->xres) + LCCR1_HorSnchWdth(5) +
+		    LCCR1_BegLnDel(61) + LCCR1_EndLnDel(9);
+		/* Check ,Chester */
+		shadow.lccr2 =
+		    LCCR2_DisHght(var->yres) + LCCR2_VrtSnchWdth(1) +
+		    LCCR2_BegFrmDel(3) + LCCR2_EndFrmDel(0);
+		/* Check ,Chester */
+		shadow.lccr3 =
+		    LCCR3_OutEnH + LCCR3_PixFlEdg + LCCR3_VrtSnchH +
+		    LCCR3_HorSnchH + LCCR3_ACBsCntOff +
+		    LCCR3_ACBsDiv(2) + LCCR3_PixClkDiv(pcd);
+#endif
+	}
+	if (machine_is_brutus()) {
+		DPRINTK("Configuring  Brutus LCD\n");
+		shadow.lccr0 =
+		    LCCR0_LEN + LCCR0_Color + LCCR0_Sngl + LCCR0_Pas +
+		    LCCR0_LtlEnd + LCCR0_LDM + LCCR0_BAM + LCCR0_ERM +
+		    LCCR0_DMADel(0);
+		shadow.lccr1 =
+		    LCCR1_DisWdth(var->xres) + LCCR1_HorSnchWdth(3) +
+		    LCCR1_BegLnDel(41) + LCCR1_EndLnDel(101);
+		shadow.lccr2 =
+		    LCCR2_DisHght(var->yres) + LCCR2_VrtSnchWdth(1) +
+		    LCCR2_BegFrmDel(0) + LCCR2_EndFrmDel(0);
+		shadow.lccr3 =
+		    LCCR3_OutEnH + LCCR3_PixRsEdg + LCCR3_VrtSnchH +
+		    LCCR3_HorSnchH + LCCR3_ACBsCntOff +
+		    LCCR3_ACBsDiv(2) + LCCR3_PixClkDiv(44);
+	}
+	if (machine_is_huw_webpanel()) {
+		DPRINTK("Configuring  HuW LCD\n");
+		shadow.lccr0 = LCCR0_LEN + LCCR0_Dual + LCCR0_LDM;
+		shadow.lccr1 = LCCR1_DisWdth(var->xres) +
+		    LCCR1_HorSnchWdth(3) +
+		    LCCR1_BegLnDel(41) + LCCR1_EndLnDel(101);
+		shadow.lccr2 = 239 + LCCR2_VrtSnchWdth(1);
+		shadow.lccr3 = 8 + LCCR3_OutEnH +
+		    LCCR3_PixRsEdg + LCCR3_VrtSnchH +
+		    LCCR3_HorSnchH + LCCR3_ACBsCntOff + LCCR3_ACBsDiv(2);
+	}
+#ifdef CONFIG_SA1100_CERF
+	if (machine_is_cerf()) {
+		DPRINTK("Configuring Cerf LCD\n");
+#if defined (CONFIG_CERF_LCD_72_A)
+		shadow.lccr0 =
+		    LCCR0_LEN + LCCR0_Color + LCCR0_Dual +
+		    LCCR0_LDM + LCCR0_BAM + LCCR0_ERM + LCCR0_Pas +
+		    LCCR0_LtlEnd + LCCR0_DMADel(0);
+		shadow.lccr1 =
+		    LCCR1_DisWdth(var->xres) + LCCR1_HorSnchWdth(5) +
+		    LCCR1_BegLnDel(61) + LCCR1_EndLnDel(9);
+		shadow.lccr2 =
+		    LCCR2_DisHght(var->yres / 2) + LCCR2_VrtSnchWdth(1) +
+		    LCCR2_BegFrmDel(3) + LCCR2_EndFrmDel(0);
+		shadow.lccr3 =
+		    LCCR3_OutEnH + LCCR3_PixRsEdg + LCCR3_VrtSnchH +
+		    LCCR3_HorSnchH + LCCR3_ACBsCntOff +
+		    LCCR3_ACBsDiv(2) + LCCR3_PixClkDiv(38);
+#elif defined (CONFIG_CERF_LCD_57_A)
+		shadow.lccr0 =
+		    LCCR0_LEN + LCCR0_Color + LCCR0_Sngl +
+		    LCCR0_LDM + LCCR0_BAM + LCCR0_ERM + LCCR0_Pas +
+		    LCCR0_LtlEnd + LCCR0_DMADel(0);
+		shadow.lccr1 =
+		    LCCR1_DisWdth(var->xres) + LCCR1_HorSnchWdth(5) +
+		    LCCR1_BegLnDel(61) + LCCR1_EndLnDel(9);
+		shadow.lccr2 =
+		    LCCR2_DisHght(var->yres) + LCCR2_VrtSnchWdth(1) +
+		    LCCR2_BegFrmDel(3) + LCCR2_EndFrmDel(0);
+		shadow.lccr3 =
+		    LCCR3_OutEnH + LCCR3_PixRsEdg + LCCR3_VrtSnchH +
+		    LCCR3_HorSnchH + LCCR3_ACBsCntOff +
+		    LCCR3_ACBsDiv(2) + LCCR3_PixClkDiv(38);
+#elif defined (CONFIG_CERF_LCD_38_A)
+		shadow.lccr0 =
+		    LCCR0_LEN + LCCR0_Color + LCCR0_Sngl +
+		    LCCR0_LDM + LCCR0_BAM + LCCR0_ERM + LCCR0_Pas +
+		    LCCR0_LtlEnd + LCCR0_DMADel(0);
+		shadow.lccr1 =
+		    LCCR1_DisWdth(var->xres) + LCCR1_HorSnchWdth(5) +
+		    LCCR1_BegLnDel(61) + LCCR1_EndLnDel(9);
+		shadow.lccr2 =
+		    LCCR2_DisHght(var->yres) + LCCR2_VrtSnchWdth(1) +
+		    LCCR2_BegFrmDel(3) + LCCR2_EndFrmDel(0);
+		shadow.lccr3 =
+		    LCCR3_OutEnH + LCCR3_PixRsEdg + LCCR3_VrtSnchH +
+		    LCCR3_HorSnchH + LCCR3_ACBsCntOff +
+		    LCCR3_ACBsDiv(2) + LCCR3_PixClkDiv(38);
+#else
+#error "Must have a CerfBoard LCD form factor selected"
+#endif
+	}
+#endif
+	if (machine_is_lart()) {
+		DPRINTK("Configuring LART LCD\n");
+#if defined LART_GREY_LCD
+		shadow.lccr0 =
+		    LCCR0_LEN + LCCR0_Mono + LCCR0_Sngl + LCCR0_Pas +
+		    LCCR0_LtlEnd + LCCR0_LDM + LCCR0_BAM + LCCR0_ERM +
+		    LCCR0_DMADel(0);
+		shadow.lccr1 =
+		    LCCR1_DisWdth(var->xres) + LCCR1_HorSnchWdth(1) +
+		    LCCR1_BegLnDel(4) + LCCR1_EndLnDel(2);
+		shadow.lccr2 =
+		    LCCR2_DisHght(var->yres) + LCCR2_VrtSnchWdth(1) +
+		    LCCR2_BegFrmDel(0) + LCCR2_EndFrmDel(0);
+		shadow.lccr3 =
+		    LCCR3_PixClkDiv(34) + LCCR3_ACBsDiv(512) +
+		    LCCR3_ACBsCntOff + LCCR3_HorSnchH + LCCR3_VrtSnchH;
+#endif
+#if defined LART_COLOR_LCD
+		shadow.lccr0 =
+		    LCCR0_LEN + LCCR0_Color + LCCR0_Sngl + LCCR0_Act +
+		    LCCR0_LtlEnd + LCCR0_LDM + LCCR0_BAM + LCCR0_ERM +
+		    LCCR0_DMADel(0);
+		shadow.lccr1 =
+		    LCCR1_DisWdth(var->xres) + LCCR1_HorSnchWdth(2) +
+		    LCCR1_BegLnDel(69) + LCCR1_EndLnDel(8);
+		shadow.lccr2 =
+		    LCCR2_DisHght(var->yres) + LCCR2_VrtSnchWdth(3) +
+		    LCCR2_BegFrmDel(14) + LCCR2_EndFrmDel(4);
+		shadow.lccr3 =
+		    LCCR3_PixClkDiv(34) + LCCR3_ACBsDiv(512) +
+		    LCCR3_ACBsCntOff + LCCR3_HorSnchL + LCCR3_VrtSnchL +
+		    LCCR3_PixFlEdg;
 #endif
+#if defined LART_VIDEO_OUT
+		shadow.lccr0 =
+		    LCCR0_LEN + LCCR0_Color + LCCR0_Sngl + LCCR0_Act +
+		    LCCR0_LtlEnd + LCCR0_LDM + LCCR0_BAM + LCCR0_ERM +
+		    LCCR0_DMADel(0);
+		shadow.lccr1 =
+		    LCCR1_DisWdth(640) + LCCR1_HorSnchWdth(95) +
+		    LCCR1_BegLnDel(40) + LCCR1_EndLnDel(24);
+		shadow.lccr2 =
+		    LCCR2_DisHght(480) + LCCR2_VrtSnchWdth(2) +
+		    LCCR2_BegFrmDel(32) + LCCR2_EndFrmDel(11);
+		shadow.lccr3 =
+		    LCCR3_PixClkDiv(8) + LCCR3_ACBsDiv(512) +
+		    LCCR3_ACBsCntOff + LCCR3_HorSnchH + LCCR3_VrtSnchH +
+		    LCCR3_PixFlEdg + LCCR3_OutEnL;
 #endif
+	}
+	if (machine_is_graphicsclient()) {
+		DPRINTK("Configuring GraphicsClient LCD\n");
+		shadow.lccr0 =
+		    LCCR0_LEN + LCCR0_Color + LCCR0_Sngl + LCCR0_Act;
+		shadow.lccr1 =
+		    LCCR1_DisWdth(var->xres) + LCCR1_HorSnchWdth(9) +
+		    LCCR1_EndLnDel(54) + LCCR1_BegLnDel(54);
+		shadow.lccr2 =
+		    LCCR2_DisHght(var->yres) + LCCR2_VrtSnchWdth(9) +
+		    LCCR2_EndFrmDel(32) + LCCR2_BegFrmDel(24);
+		shadow.lccr3 =
+		    LCCR3_PixClkDiv(10) + LCCR3_ACBsDiv(2) +
+		    LCCR3_ACBsCntOff + LCCR3_HorSnchL + LCCR3_VrtSnchL;
+	}
+	if (machine_is_omnimeter()) {
+		DPRINTK("Configuring  OMNI LCD\n");
+		shadow.lccr0 = LCCR0_LEN | LCCR0_CMS | LCCR0_DPD;
+		shadow.lccr1 =
+		    LCCR1_BegLnDel(10) + LCCR1_EndLnDel(10) +
+		    LCCR1_HorSnchWdth(1) + LCCR1_DisWdth(var->xres);
+		shadow.lccr2 = LCCR2_DisHght(var->yres);
+		shadow.lccr3 =
+		    LCCR3_ACBsDiv(0xFF) + LCCR3_PixClkDiv(44);
+//jca (GetPCD(25) << LCD3_V_PCD);
+	}
+	if (machine_is_xp860()) {
+		DPRINTK("Configuring XP860 LCD\n");
+		shadow.lccr0 =
+		    LCCR0_LEN + LCCR0_Color + LCCR0_Sngl + LCCR0_Act +
+		    LCCR0_LtlEnd + LCCR0_LDM + LCCR0_ERM + LCCR0_DMADel(0);
+		shadow.lccr1 =
+		    LCCR1_DisWdth(var->xres) +
+		    LCCR1_HorSnchWdth(var->hsync_len) +
+		    LCCR1_BegLnDel(var->left_margin) +
+		    LCCR1_EndLnDel(var->right_margin);
+		shadow.lccr2 =
+		    LCCR2_DisHght(var->yres) +
+		    LCCR2_VrtSnchWdth(var->vsync_len) +
+		    LCCR2_BegFrmDel(var->upper_margin) +
+		    LCCR2_EndFrmDel(var->lower_margin);
+		shadow.lccr3 =
+		    LCCR3_PixClkDiv(6) + LCCR3_HorSnchL + LCCR3_VrtSnchL;
+	}
+
+	/*
+	 * Ok, since we're calculating these values, we want to know
+	 * if the calculation is correct.  If you see any of these
+	 * messages _PLEASE_ report the incident to me for diagnosis,
+	 * including details about what was happening when the
+	 * messages appeared. --rmk, 30 March 2001
+	 */
+	if (shadow.lccr0 != new_regs->lccr0) {
+		printk(KERN_ERR "LCCR1 mismatch: 0x%08x != 0x%08x\n",
+			shadow.lccr1, new_regs->lccr1);
+		different = 1;
+	}
+	if (shadow.lccr1 != new_regs->lccr1) {
+		printk(KERN_ERR "LCCR1 mismatch: 0x%08x != 0x%08x\n",
+			shadow.lccr1, new_regs->lccr1);
+		different = 1;
+	}
+	if (shadow.lccr2 != new_regs->lccr2) {
+		printk(KERN_ERR "LCCR2 mismatch: 0x%08x != 0x%08x\n",
+			shadow.lccr2, new_regs->lccr2);
+		different = 1;
+	}
+	if (shadow.lccr3 != new_regs->lccr3) {
+		printk(KERN_ERR "LCCR3 mismatch: 0x%08x != 0x%08x\n",
+			shadow.lccr3, new_regs->lccr3);
+		different = 1;
+	}
+	if (different) {
+		printk(KERN_ERR "var: xres=%d hslen=%d lm=%d rm=%d\n",
+			var->xres, var->hsync_len,
+			var->left_margin, var->right_margin);
+		printk(KERN_ERR "var: yres=%d vslen=%d um=%d bm=%d\n",
+			var->yres, var->vsync_len,
+			var->upper_margin, var->lower_margin);
+
+		printk(KERN_ERR "Please report this to Russell King "
+			"<rmk@arm.linux.org.uk>\n");
+	}
+
+	DPRINTK("olccr0 = 0x%08x\n", shadow.lccr0);
+	DPRINTK("olccr1 = 0x%08x\n", shadow.lccr1);
+	DPRINTK("olccr2 = 0x%08x\n", shadow.lccr2);
+	DPRINTK("olccr3 = 0x%08x\n", shadow.lccr3);
 }
+#else
+#define sa1100fb_check_shadow(regs,var,pcd)
+#endif
+
 
-static u_char *VideoMemRegion;
-static u_char *VideoMemRegion_phys;
 
-/* Local LCD controller parameters */
-/* These can be reduced by making better use of fb_var_screeninfo parameters.  */
-/* Several duplicates exist in the two structures. */
-struct sa1100fb_par {
-	u_char		*p_screen_base;
-	u_char		*v_screen_base;
-	u_short		*p_palette_base;
-	u_short		*v_palette_base;
-	unsigned long	screen_size;
-	unsigned int	palette_size;
-	unsigned int	max_xres;
-	unsigned int	max_yres;
-	unsigned int	xres;
-	unsigned int	yres;
-	unsigned int	xres_virtual;
-	unsigned int	yres_virtual;
-	unsigned int	max_bpp;
-	unsigned int	bits_per_pixel;
-	  signed int	montype;
-	unsigned int	currcon;
-	unsigned int	visual;
-	unsigned int	allow_modeset : 1;
-	unsigned int	active_lcd : 1;
-	unsigned int	inv_4bpp : 1;
-	volatile u_char	controller_state;
+/*
+ * IMHO this looks wrong.  In 8BPP, length should be 8.
+ */
+static struct sa1100fb_rgb rgb_8 = {
+	red:	{ offset: 0,  length: 4, },
+	green:	{ offset: 0,  length: 4, },
+	blue:	{ offset: 0,  length: 4, },
+	transp:	{ offset: 0,  length: 0, },
 };
 
-/* Shadows for LCD controller registers */
-struct sa1100fb_lcd_reg {
-	Address	dbar1;
-	Address dbar2;
-	Word	lccr0;
-	Word	lccr1;
-	Word	lccr2;
-	Word	lccr3;
+static struct sa1100fb_rgb def_rgb_16 = {
+	red:	{ offset: 11, length: 5, },
+	green:	{ offset: 5,  length: 6, },
+	blue:	{ offset: 0,  length: 5, },
+	transp:	{ offset: 0,  length: 0, },
 };
 
-/* Fake monspecs to fill in fbinfo structure */
-static struct fb_monspecs monspecs __initdata = {
-	 30000, 70000, 50, 65, 0 	/* Generic */
+#ifdef CONFIG_SA1100_ASSABET
+static struct sa1100fb_mach_info assabet_info __initdata = {
+#ifdef ASSABET_PAL_VIDEO
+	pixclock:	67797,		bpp:		16,
+	xres:		640,		yres:		512,
+
+	hsync_len:	64,		vsync_len:	6,
+	left_margin:	125,		upper_margin:	70,
+	right_margin:	115,		lower_margin:	36,
+
+	sync:		0,
+
+	lccr0:		LCCR0_Color | LCCR0_Sngl | LCCR0_Act,
+	lccr3:		LCCR3_OutEnH | LCCR3_PixRsEdg |	LCCR3_ACBsDiv(512),
+#else
+	pixclock:	171521,		bpp:		16,
+	xres:		320,		yres:		240,
+
+	hsync_len:	5,		vsync_len:	1,
+	left_margin:	61,		upper_margin:	3,
+	right_margin:	9,		lower_margin:	0,
+
+	sync:		FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+
+	lccr0:		LCCR0_Color | LCCR0_Sngl | LCCR0_Act,
+	lccr3:		LCCR3_OutEnH | LCCR3_PixRsEdg |	LCCR3_ACBsDiv(2),
+#endif
 };
+#endif
 
-static struct display global_disp;	/* Initial (default) Display Settings */
-static struct fb_info fb_info;
-static struct sa1100fb_par current_par;
-static struct fb_var_screeninfo __initdata init_var = {};
-static struct sa1100fb_lcd_reg lcd_shadow;
-
-
-static int  sa1100fb_get_fix(struct fb_fix_screeninfo *fix, int con, struct fb_info *info);
-static int  sa1100fb_get_var(struct fb_var_screeninfo *var, int con, struct fb_info *info);
-static int  sa1100fb_set_var(struct fb_var_screeninfo *var, int con, struct fb_info *info);
-static int  sa1100fb_get_cmap(struct fb_cmap *cmap, int kspc, int con, struct fb_info *info);
-static int  sa1100fb_set_cmap(struct fb_cmap *cmap, int kspc, int con, struct fb_info *info);
- 
-static int  sa1100fb_switch(int con, struct fb_info *info);
-static void sa1100fb_blank(int blank, struct fb_info *info);
-static int  sa1100fb_map_video_memory(void);
-static int  sa1100fb_activate_var(struct fb_var_screeninfo *var);
-static void sa1100fb_enable_lcd_controller(void);
-static void sa1100fb_disable_lcd_controller(void);
+#ifdef CONFIG_SA1100_BITSY
+static struct sa1100fb_mach_info bitsy_info __initdata = {
+#ifdef CONFIG_IPAQ_H3100
+	pixclock:	0,		bpp:		4,
+	xres:		320,		yres:		240,
+
+	hsync_len:	26,		vsync_len:	41,
+	left_margin:	4,		upper_margin:	0,
+	right_margin:	4,		lower_margin:	0,
+
+	sync:		FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+	cmap_greyscale:	1,		cmap_static:	1,
+	cmap_inverse:	1,
+
+	lccr0:		LCCR0_Mono | LCCR0_4PixMono | LCCR0_Sngl | LCCR0_Pas,
+	lccr3:		LCCR3_OutEnH | LCCR3_PixRsEdg | LCCR3_ACBsDiv(2),
+#error FIXME
+	/*
+	 * Sorry, this should have read:
+	 * FIXME: please get rid of the PCD and PixClkDiv definitions
+	 * in favour of pixclock. --rmk
+	 */
+#else
+	pixclock:	5722222,	bpp:		16,
+	xres:		320,		yres:		240,
 
-static struct fb_ops sa1100fb_ops = {
-	owner:		THIS_MODULE,
-	fb_get_fix:	sa1100fb_get_fix,
-	fb_get_var:	sa1100fb_get_var,
-	fb_set_var:	sa1100fb_set_var,
-	fb_get_cmap:	sa1100fb_get_cmap,
-	fb_set_cmap:	sa1100fb_set_cmap,
+	hsync_len:	3,		vsync_len:	3,
+	left_margin:	12,		upper_margin:	10,
+	right_margin:	17,		lower_margin:	1,
+
+	sync:		0,
+
+	lccr0:		LCCR0_Color | LCCR0_Sngl | LCCR0_Act,
+	lccr3:		LCCR3_OutEnH | LCCR3_PixRsEdg | LCCR3_ACBsDiv(2),
+#endif
 };
 
+static struct sa1100fb_rgb bitsy_rgb_16 = {
+	red:	{ offset: 12, length: 4, },
+	green:	{ offset: 7,  length: 4, },
+	blue:	{ offset: 1,  length: 4, },
+	transp:	{ offset: 0,  length: 0, },
+};
+#endif
 
-/*
- * sa1100fb_palette_write:
- *    Write palette data to the LCD frame buffer's palette area
- */
-static inline void
-sa1100fb_palette_write(u_int regno, u_short pal)
+#ifdef CONFIG_SA1100_BRUTUS
+static struct sa1100fb_mach_info brutus_info __initdata = {
+	pixclock:	0,		bpp:		8,
+	xres:		320,		yres:		240,
+
+	hsync_len:	3,		vsync_len:	1,
+	left_margin:	41,		upper_margin:	0,
+	right_margin:	101,		lower_margin:	0,
+
+	sync:		FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+
+	lccr0:		LCCR0_Color | LCCR0_Sngl | LCCR0_Pas,
+	lccr3:		LCCR3_OutEnH | LCCR3_PixRsEdg | LCCR3_ACBsDiv(2) |
+			LCCR3_PixClkDiv(44),
+};
+#endif
+
+#ifdef CONFIG_SA1100_CERF
+static struct sa1100fb_mach_info cerf_info __initdata = {
+	pixclock:	171521,		bpp:		8,
+#if defined(CONFIG_CERF_LCD_72_A)
+	xres:		640,		yres:		480,
+	lccr0:		LCCR0_Color | LCCR0_Dual | LCCR0_Pas,
+	lccr3:		LCCR3_OutEnH | LCCR3_PixRsEdg | LCCR3_ACBsDiv(2) |
+			LCCR3_PixClkDiv(38),
+#elif defined(CONFIG_CERF_LCD_57_A)
+	xres:		320,		yres:		240,
+	lccr0:		LCCR0_Color | LCCR0_Sngl | LCCR0_Pas,
+	lccr3:		LCCR3_OutEnH | LCCR3_PixRsEdg | LCCR3_ACBsDiv(2) |
+			LCCR3_PixClkDiv(38),
+#elif defined(CONFIG_CERF_LCD_38_A)
+	xres:		240,		yres:		320,
+	lccr0:		LCCR0_Color | LCCR0_Sngl | LCCR0_Pas,
+	lccr3:		LCCR3_OutEnH | LCCR3_PixRsEdg | LCCR3_ACBsDiv(2) |
+			LCCR3_PixClkDiv(38),
+#else
+#error "Must have a CerfBoard LCD form factor selected"
+#endif
+
+	hsync_len:	5,		vsync_len:	1,
+	left_margin:	61,		upper_margin:	3,
+	right_margin:	9,		lower_margin:	0,
+
+	sync:		FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+
+};
+#endif
+
+#ifdef CONFIG_SA1100_FREEBIRD
+#warning Please check this carefully
+static struct sa1100fb_mach_info freebird_info __initdata = {
+	pixclock:	171521,		bpp:		16,
+	xres:		240,		yres:		320,
+
+	hsync_len:	3,		vsync_len:	2,
+	left_margin:	2,		upper_margin:	0,
+	right_margin:	2,		lower_margin:	0,
+
+	sync:		FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+
+	lccr0:		LCCR0_Color | LCCR0_Sngl | LCCR0_Pas,
+	lccr3:		LCCR3_OutEnH | LCCR3_PixFlEdg | LCCR3_ACBsDiv(2),
+};
+
+static struct sa1100fb_rgb freebird_rgb_16 = {
+	red:	{ offset: 8,  length: 4, },
+	green:	{ offset: 4,  length: 4, },
+	blue:	{ offset: 0,  length: 4, },
+	transp:	{ offset: 12, length: 4, },
+};
+#endif
+
+#ifdef CONFIG_SA1100_GRAPHICSCLIENT
+static struct sa1100fb_mach_info graphicsclient_info __initdata = {
+	pixclock:	0,		bpp:		8,
+	xres:		640,		yres:		480,
+
+	hsync_len:	9,		vsync_len:	9,
+	left_margin:	54,		upper_margin:	24,
+	right_margin:	54,		lower_margin:	32,
+
+	sync:		0,
+
+	lccr0:		LCCR0_Color | LCCR0_Sngl | LCCR0_Act,
+	lccr3:		LCCR3_OutEnH | LCCR3_PixRsEdg | LCCR3_ACBsDiv(2) |
+			LCCR3_PixClkDiv(10),
+};
+#endif
+
+#ifdef CONFIG_SA1100_HUW_WEBPANEL
+static struct sa1100fb_mach_info huw_webpanel_info __initdata = {
+	pixclock:	0,		bpp:		8,
+	xres:		640,		yres:		480,
+
+	hsync_len:	3,		vsync_len:	1,
+	left_margin:	41,		upper_margin:	0,
+	right_margin:	101,		lower_margin:	0,
+
+	sync:		FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+
+	lccr0:		LCCR0_Color | LCCR0_Dual | LCCR0_Pas,
+	lccr3:		LCCR3_OutEnH | LCCR3_PixRsEdg | LCCR3_ACBsDiv(2) | 8,
+#error FIXME
+	/*
+	 * FIXME: please get rid of the '| 8' in preference to an
+	 * LCCR3_PixClkDiv() version. --rmk
+	 */
+};
+#endif
+
+#ifdef LART_GREY_LCD
+static struct sa1100fb_mach_info lart_grey_info __initdata = {
+	pixclock:	150000,		bpp:		4,
+	xres:		320,		yres:		240,
+
+	hsync_len:	1,		vsync_len:	1,
+	left_margin:	4,		upper_margin:	0,
+	right_margin:	2,		lower_margin:	0,
+
+	cmap_greyscale:	1,
+	sync:		FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+
+	lccr0:		LCCR0_Mono | LCCR0_Sngl | LCCR0_Pas | LCCR0_4PixMono,
+	lccr3:		LCCR3_OutEnH | LCCR3_PixRsEdg | LCCR3_ACBsDiv(512),
+};
+#endif
+#ifdef LART_COLOR_LCD
+static struct sa1100fb_mach_info lart_color_info __initdata = {
+	pixclock:	150000,		bpp:		16,
+	xres:		320,		yres:		240,
+
+	hsync_len:	2,		vsync_len:	3,
+	left_margin:	69,		upper_margin:	14,
+	right_margin:	8,		lower_margin:	4,
+
+	sync:		0,
+
+	lccr0:		LCCR0_Color | LCCR0_Sngl | LCCR0_Act,
+	lccr3:		LCCR3_OutEnH | LCCR3_PixFlEdg | LCCR3_ACBsDiv(512),
+};
+#endif
+#ifdef LART_VIDEO_OUT
+static struct sa1100fb_mach_info lart_video_info __initdata = {
+	pixclock:	39721,		bpp:		16,
+	xres:		640,		yres:		480,
+
+	hsync_len:	95,		vsync_len:	2,
+	left_margin:	40,		upper_margin:	32,
+	right_margin:	24,		lower_margin:	11,
+
+	sync:		FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+
+	lccr0:		LCCR0_Color | LCCR0_Sngl | LCCR0_Act,
+	lccr3:		LCCR3_OutEnL | LCCR3_PixFlEdg | LCCR3_ACBsDiv(512),
+};
+#endif
+
+#ifdef LART_KIT01_LCD
+static struct sa1100fb_mach_info lart_kit01_info __initdata =
 {
-	current_par.v_palette_base[regno] = (regno ? pal : pal | 
-	                                     SA1100_PALETTE_MODE_VAL(current_par.bits_per_pixel));
-}
+	pixclock:	63291,		bpp:		16,
+	xres:		640,		yres:		480,
+
+	hsync_len:	64,		vsync_len:	3,
+	left_margin:	122,		upper_margin:	45,
+	right_margin:	10,		lower_margin:	10,
+
+	sync:		0,
+
+	lccr0:		LCCR0_Color | LCCR0_Sngl | LCCR0_Act,
+	lccr3:		LCCR3_OutEnH | LCCR3_PixFlEdg
+};
+#endif
 
+#ifdef CONFIG_SA1100_OMNIMETER
+static struct sa1100fb_mach_info omnimeter_info __initdata = {
+	pixclock:	0,		bpp:		4,
+	xres:		480,		yres:		320,
+
+	hsync_len:	1,		vsync_len:	1,
+	left_margin:	10,		upper_margin:	0,
+	right_margin:	10,		lower_margin:	0,
+
+	cmap_greyscale:	1,
+	sync:		FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+
+	lccr0:		LCCR0_Mono | LCCR0_Sngl | LCCR0_Pas | LCCR0_8PixMono,
+	lccr3:		LCCR3_OutEnH | LCCR3_PixRsEdg | LCCR3_ACBsDiv(255) |
+			LCCR3_PixClkDiv(44),
+#error FIXME: fix pixclock, ACBsDiv
+	/*
+	 * FIXME: I think ACBsDiv is wrong above - should it be 512 (disabled)?
+	 *   - rmk
+	 */
+};
+#endif
+
+#ifdef CONFIG_SA1100_PANGOLIN
+static struct sa1100fb_mach_info pangolin_info __initdata = {
+	pixclock:	341521,		bpp:		16,
+	xres:		800,		yres:		600,
+
+	hsync_len:	64,		vsync_len:	7,
+	left_margin:	160,		upper_margin:	7,
+	right_margin:	24,		lower_margin:	1,
+
+	sync:		FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+
+	lccr0:		LCCR0_Color | LCCR0_Sngl | LCCR0_Act,
+	lccr3:		LCCR3_OutEnH | LCCR3_PixFlEdg,
+};
+#endif
 
-static inline u_short
-sa1100fb_palette_encode(u_int regno, u_int red, u_int green, u_int blue, u_int trans)
+#ifdef CONFIG_SA1100_XP860
+static struct sa1100fb_mach_info xp860_info __initdata = {
+	pixclock:	0,		bpp:		8,
+	xres:		1024,		yres:		768,
+
+	hsync_len:	3,		vsync_len:	3,
+	left_margin:	3,		upper_margin:	2,
+	right_margin:	2,		lower_margin:	1,
+
+	sync:		0,
+
+	lccr0:		LCCR0_Color | LCCR0_Sngl | LCCR0_Act,
+	lccr3:		LCCR3_OutEnH | LCCR3_PixRsEdg | LCCR3_PixClkDiv(6),
+};
+#endif
+
+static struct sa1100fb_mach_info * __init
+sa1100fb_get_machine_info(struct sa1100fb_info *fbi)
 {
-	u_int pal;
+	struct sa1100fb_mach_info *inf = NULL;
 
-	if(current_par.bits_per_pixel == 4){
-		/*
-		 * RGB -> luminance is defined to be
-		 * Y =  0.299 * R + 0.587 * G + 0.114 * B
-		 */
-		pal = (19595 * red + 38470 * green + 7471 * blue) >> 28;
-		if( current_par.inv_4bpp )
-			pal = 15 - pal;
+	/*
+	 *            R        G       B       T
+	 * default  {11,5}, { 5,6}, { 0,5}, { 0,0}
+	 * bitsy    {12,4}, { 7,4}, { 1,4}, { 0,0}
+	 * freebird { 8,4}, { 4,4}, { 0,4}, {12,4}
+	 */
+#ifdef CONFIG_SA1100_ASSABET
+	if (machine_is_assabet()) {
+		inf = &assabet_info;
 	}
-	else{
-		pal   = ((red   >>  4) & 0xf00);
-		pal  |= ((green >>  8) & 0x0f0);
-		pal  |= ((blue  >> 12) & 0x00f);
+#endif
+#ifdef CONFIG_SA1100_BITSY
+	if (machine_is_bitsy()) {
+		inf = &bitsy_info;
+		fbi->rgb[RGB_16] = &bitsy_rgb_16;
 	}
-
-	return pal;
-}
-	    
-static inline u_short
-sa1100fb_palette_read(u_int regno)
-{
-	return (current_par.v_palette_base[regno] & 0x0FFF);
+#endif
+#ifdef CONFIG_SA1100_BRUTUS
+	if (machine_is_brutus()) {
+		inf = &brutus_info;
+	}
+#endif
+#ifdef CONFIG_SA1100_CERF
+	if (machine_is_cerf()) {
+		inf = &cerf_info;
+	}
+#endif
+#ifdef CONFIG_SA1100_FREEBIRD
+	if (machine_is_freebird()) {
+		inf = &freebird_info;
+		fbi->rgb[RGB_16] = &freebird_rgb16;
+	}
+#endif
+#ifdef CONFIG_SA1100_GRAPHICSCLIENT
+	if (machine_is_graphicsclient()) {
+		inf = &graphicsclient_info;
+	}
+#endif
+#ifdef CONFIG_SA1100_HUW_WEBPANEL
+	if (machine_is_huw_webpanel()) {
+		inf = &huw_webpanel_info;
+	}
+#endif
+#ifdef CONFIG_SA1100_LART
+	if (machine_is_lart()) {
+#ifdef LART_GREY_LCD
+		inf = &lart_grey_info;
+#endif
+#ifdef LART_COLOR_LCD
+		inf = &lart_color_info;
+#endif
+#ifdef LART_VIDEO_OUT
+		inf = &lart_video_info;
+#endif
+#ifdef LART_KIT01_LCD
+		inf = &lart_kit01_info;
+#endif
+	}
+#endif
+#ifdef CONFIG_SA1100_OMNIMETER
+	if (machine_is_omnimeter()) {
+		inf = &omnimeter_info;
+	}
+#endif
+#ifdef CONFIG_SA1100_PANGOLIN
+	if (machine_is_pangolin()) {
+		inf = &pangolin_info;
+	}
+#endif
+#ifdef CONFIG_SA1100_XP860
+	if (machine_is_xp860()) {
+		inf = &xp860_info;
+	}
+#endif
+	return inf;
 }
 
+static int sa1100fb_activate_var(struct fb_var_screeninfo *var, struct sa1100fb_info *);
+static void set_ctrlr_state(struct sa1100fb_info *fbi, u_int state);
 
-static void
-sa1100fb_palette_decode(u_int regno, u_int *red, u_int *green, u_int *blue, u_int *trans)
+static inline void sa1100fb_schedule_task(struct sa1100fb_info *fbi, u_int state)
 {
-	u_short pal;
+	unsigned long flags;
 
-	pal = sa1100fb_palette_read(regno);
-
-	if( current_par.bits_per_pixel == 4){
-		if( current_par.inv_4bpp )
-			pal = 15 - pal;
-		pal &= 0x000f;
-		pal |= pal << 4;
-		pal |= pal << 8;
-		*blue = *green = *red = pal;
-	}
-	else{
-		*blue   = (pal & 0x000f) << 12;
-		*green  = (pal & 0x00f0) << 8;
-		*red    = (pal & 0x0f00) << 4;
+	local_irq_save(flags);
+	/*
+	 * We need to handle two requests being made at the same time.
+	 * There are two important cases:
+	 *  1. When we are changing VT (C_REENABLE) while unblanking (C_ENABLE)
+	 *     We must perform the unblanking, which will do our REENABLE for us.
+	 *  2. When we are blanking, but immediately unblank before we have
+	 *     blanked.  We do the "REENABLE" thing here as well, just to be sure.
+	 */
+	if (fbi->task_state == C_ENABLE && state == C_REENABLE)
+		state = (u_int) -1;
+	if (fbi->task_state == C_DISABLE && state == C_ENABLE)
+		state = C_REENABLE;
+
+	if (state != (u_int)-1) {
+		fbi->task_state = state;
+		schedule_task(&fbi->task);
 	}
-        *trans  = 0;
+	local_irq_restore(flags);
 }
 
-static int
-sa1100fb_getcolreg(u_int regno, u_int *red, u_int *green, u_int *blue, u_int *trans, struct fb_info *info)
+/*
+ * Get the VAR structure pointer for the specified console
+ */
+static inline struct fb_var_screeninfo *get_con_var(struct fb_info *info, int con)
 {
-	if (regno >= current_par.palette_size)
-		return 1;
-	
-	sa1100fb_palette_decode(regno, red, green, blue, trans);
-
-	return 0;
+	struct sa1100fb_info *fbi = (struct sa1100fb_info *)info;
+	return (con == fbi->currcon || con == -1) ? &fbi->fb.var : &fb_display[con].var;
 }
 
-
-static int
-sa1100fb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, u_int trans, struct fb_info *info)
+/*
+ * Get the DISPLAY structure pointer for the specified console
+ */
+static inline struct display *get_con_display(struct fb_info *info, int con)
 {
-	u_short pal;
-
-	if (regno >= current_par.palette_size)
-		return 1;
+	struct sa1100fb_info *fbi = (struct sa1100fb_info *)info;
+	return (con < 0) ? fbi->fb.disp : &fb_display[con];
+}
 
-	pal = sa1100fb_palette_encode(regno, red, green, blue, trans);
+/*
+ * Get the CMAP pointer for the specified console
+ */
+static inline struct fb_cmap *get_con_cmap(struct fb_info *info, int con)
+{
+	struct sa1100fb_info *fbi = (struct sa1100fb_info *)info;
+	return (con == fbi->currcon || con == -1) ? &fbi->fb.cmap : &fb_display[con].cmap;
+}
 
-	sa1100fb_palette_write(regno, pal);
+static inline u_int
+chan_to_field(u_int chan, struct fb_bitfield *bf)
+{
+	chan &= 0xffff;
+	chan >>= 16 - bf->length;
+	return chan << bf->offset;
+}
 
-	return 0;
+/*
+ * Convert bits-per-pixel to a hardware palette PBS value.
+ */
+static inline u_int
+palette_pbs(struct fb_var_screeninfo *var)
+{
+	int ret = 0;
+	switch (var->bits_per_pixel) {
+#ifdef FBCON_HAS_CFB4
+	case 4:  ret = 0 << 12;	break;
+#endif
+#ifdef FBCON_HAS_CFB8
+	case 8:  ret = 1 << 12; break;
+#endif
+#ifdef FBCON_HAS_CFB16
+	case 16: ret = 2 << 12; break;
+#endif
+	}
+	return ret;
 }
 
 static int
-sa1100fb_get_cmap(struct fb_cmap *cmap, int kspc, int con,
-		 struct fb_info *info)
+sa1100fb_setpalettereg(u_int regno, u_int red, u_int green, u_int blue,
+		       u_int trans, struct fb_info *info)
 {
-	int err = 0;
+	struct sa1100fb_info *fbi = (struct sa1100fb_info *)info;
+	u_int val, ret = 1;
 
-        DPRINTK("current_par.visual=%d\n", current_par.visual);
-	if (con == current_par.currcon)
-		err = fb_get_cmap(cmap, kspc, sa1100fb_getcolreg, info);
-	else if (fb_display[con].cmap.len)
-		fb_copy_cmap(&fb_display[con].cmap, cmap, kspc ? 0 : 2);
-	else
-		fb_copy_cmap(fb_default_cmap(current_par.palette_size),
-			     cmap, kspc ? 0 : 2);
-	return err;
+	if (regno < fbi->palette_size) {
+		val = ((red >> 4) & 0xf00);
+		val |= ((green >> 8) & 0x0f0);
+		val |= ((blue >> 12) & 0x00f);
+
+		if (regno == 0)
+			val |= palette_pbs(&fbi->fb.var);
+
+		fbi->palette_cpu[regno] = val;
+		ret = 0;
+	}
+	return ret;
 }
 
 static int
-sa1100fb_set_cmap(struct fb_cmap *cmap, int kspc, int con,
-		  struct fb_info *info)
+sa1100fb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
+		   u_int trans, struct fb_info *info)
 {
-	int err = 0;
+	struct sa1100fb_info *fbi = (struct sa1100fb_info *)info;
+	struct display *disp = get_con_display(info, fbi->currcon);
+	u_int val;
+	int ret = 1;
 
-        DPRINTK("current_par.visual=%d\n", current_par.visual);
-	if (!fb_display[con].cmap.len)
-		err = fb_alloc_cmap(&fb_display[con].cmap,
-				    current_par.palette_size, 0);
-	if (!err) {
-		if (con == current_par.currcon)
-			err = fb_set_cmap(cmap, kspc, sa1100fb_setcolreg,
-					  info);
-		fb_copy_cmap(cmap, &fb_display[con].cmap, kspc ? 0 : 1);
+	/*
+	 * If inverse mode was selected, invert all the colours
+	 * rather than the register number.  The register number
+	 * is what you poke into the framebuffer to produce the
+	 * colour you requested.
+	 */
+	if (disp->inverse) {
+		red   = 0xffff - red;
+		green = 0xffff - green;
+		blue  = 0xffff - blue;
 	}
-	return err;
-}
 
-static void inline
-sa1100fb_get_par(struct sa1100fb_par *par)
-{
-	*par = current_par;
-}
+	/*
+	 * If greyscale is true, then we convert the RGB value
+	 * to greyscale no mater what visual we are using.
+	 */
+	if (fbi->fb.var.grayscale)
+		red = green = blue = (19595 * red + 38470 * green +
+					7471 * blue) >> 16;
+
+	switch (fbi->fb.disp->visual) {
+	case FB_VISUAL_TRUECOLOR:
+		/*
+		 * 12 or 16-bit True Colour.  We encode the RGB value
+		 * according to the RGB bitfield information.
+		 */
+		if (regno < 16) {
+			u16 *pal = fbi->fb.pseudo_palette;
+
+			val  = chan_to_field(red, &fbi->fb.var.red);
+			val |= chan_to_field(green, &fbi->fb.var.green);
+			val |= chan_to_field(blue, &fbi->fb.var.blue);
 
+			pal[regno] = val;
+			ret = 0;
+		}
+		break;
+
+	case FB_VISUAL_STATIC_PSEUDOCOLOR:
+	case FB_VISUAL_PSEUDOCOLOR:
+		ret = sa1100fb_setpalettereg(regno, red, green, blue, trans, info);
+		break;
+	}
+
+	return ret;
+}
 
 /*
- * sa1100fb_encode_var():
- * 	Modify var structure using values in par
+ *  sa1100fb_display_dma_period()
+ *    Calculate the minimum period (in picoseconds) between two DMA
+ *    requests for the LCD controller.
  */
-static int 
-sa1100fb_encode_var(struct fb_var_screeninfo *var,
-                    struct sa1100fb_par *par)
+static unsigned int
+sa1100fb_display_dma_period(struct fb_var_screeninfo *var)
 {
-        // Don't know if really want to zero var on entry.
-        // Look at set_var to see.  If so, may need to add extra params to par     
-//	memset(var, 0, sizeof(struct fb_var_screeninfo));
- 
-	var->xres = par->xres;
-	var->yres = par->yres;
-	var->xres_virtual = par->xres_virtual;
-	var->yres_virtual = par->yres_virtual;
+	unsigned int mem_bits_per_pixel;
 
-	var->bits_per_pixel = par->bits_per_pixel;
+	mem_bits_per_pixel = var->bits_per_pixel;
+	if (mem_bits_per_pixel == 12)
+		mem_bits_per_pixel = 16;
 
-        DPRINTK("var->bits_per_pixel=%d\n", var->bits_per_pixel);
-	switch(var->bits_per_pixel) {
-	case 2:
-	case 4:
-	case 8:
-		var->red.length	   = 4;
-		var->green         = var->red;
-		var->blue          = var->red;
-		var->transp.length = 0;
-		break;
-	case 12:          // This case should differ for Active/Passive mode  
-	case 16:
-                if (machine_is_bitsy()) {
-                        var->red.length    = 4;
-                        var->blue.length   = 4;
-                        var->green.length  = 4;
-                        var->transp.length = 0;
-                        var->red.offset    = 12;
-                        var->green.offset  = 7;
-                        var->blue.offset   = 1;
-                        var->transp.offset = 0;
-                } else {
-                        var->red.length    = 5;
-                        var->blue.length   = 5;
-                        var->green.length  = 6;
-                        var->transp.length = 0;
-                        var->red.offset    = 11;
-                        var->green.offset  = 5;
-                        var->blue.offset   = 0;
-                        var->transp.offset = 0;
-                }
-                break;
-	}
-	return 0;
+	/*
+	 * Period = pixclock * bits_per_byte * bytes_per_transfer
+	 *		/ memory_bits_per_pixel;
+	 */
+	return var->pixclock * 8 * 16 / mem_bits_per_pixel;
 }
- 
+
 /*
  *  sa1100fb_decode_var():
  *    Get the video params out of 'var'. If a value doesn't fit, round it up,
@@ -416,867 +1064,1236 @@
  *    bitfields, horizontal timing, vertical timing.
  */
 static int
-sa1100fb_decode_var(struct fb_var_screeninfo *var, 
-                    struct sa1100fb_par *par)
+sa1100fb_validate_var(struct fb_var_screeninfo *var,
+		      struct sa1100fb_info *fbi)
+{
+	int ret = -EINVAL;
+
+	if (var->xres < MIN_XRES)
+		var->xres = MIN_XRES;
+	if (var->yres < MIN_YRES)
+		var->yres = MIN_YRES;
+	if (var->xres > fbi->max_xres)
+		var->xres = fbi->max_xres;
+	if (var->yres > fbi->max_yres)
+		var->yres = fbi->max_yres;
+	var->xres_virtual =
+	    var->xres_virtual < var->xres ? var->xres : var->xres_virtual;
+	var->yres_virtual =
+	    var->yres_virtual < var->yres ? var->yres : var->yres_virtual;
+
+	DPRINTK("var->bits_per_pixel=%d\n", var->bits_per_pixel);
+	switch (var->bits_per_pixel) {
+#ifdef FBCON_HAS_CFB4
+	case 4:		ret = 0; break;
+#endif
+#ifdef FBCON_HAS_CFB8
+	case 8:		ret = 0; break;
+#endif
+#ifdef FBCON_HAS_CFB16
+	case 16:	ret = 0; break;
+#endif
+	default:
+		break;
+	}
+
+	printk(KERN_DEBUG "dma period = %d ps, clock = %d kHz",
+		sa1100fb_display_dma_period(var),
+		cpufreq_get(smp_processor_id()));
+
+	return ret;
+}
+
+static inline void sa1100fb_set_truecolor(u_int is_true_color)
+{
+	DPRINTK("true_color = %d\n", is_true_color);
+#ifdef CONFIG_SA1100_ASSABET
+	if (machine_is_assabet()) {
+#if 1
+		// phase 4 or newer Assabet's
+		if (is_true_color)
+			BCR_set(BCR_LCD_12RGB);
+		else
+			BCR_clear(BCR_LCD_12RGB);
+#else
+		// older Assabet's
+		if (is_true_color)
+			BCR_clear(BCR_LCD_12RGB);
+		else
+			BCR_set(BCR_LCD_12RGB);
+#endif
+	}
+#endif
+}
+
+static void
+sa1100fb_hw_set_var(struct fb_var_screeninfo *var, struct sa1100fb_info *fbi)
 {
-	u_long palette_mem_phys;
 	u_long palette_mem_size;
 
-	*par = current_par;
+	fbi->palette_size = var->bits_per_pixel == 8 ? 256 : 16;
+
+	palette_mem_size = fbi->palette_size * sizeof(u16);
+
+	DPRINTK("palette_mem_size = 0x%08lx\n", (u_long) palette_mem_size);
+
+	fbi->palette_cpu = (u16 *)(fbi->map_cpu + PAGE_SIZE - palette_mem_size);
+	fbi->palette_dma = fbi->map_dma + PAGE_SIZE - palette_mem_size;
+
+	fb_set_cmap(&fbi->fb.cmap, 1, sa1100fb_setcolreg, &fbi->fb);
+
+	/* Set board control register to handle new color depth */
+	sa1100fb_set_truecolor(var->bits_per_pixel >= 16);
+
+#ifdef CONFIG_SA1100_OMNIMETER
+#error Do we have to do this here?   We already do it at init time.
+	if (machine_is_omnimeter())
+		SetLCDContrast(DefaultLCDContrast);
+#endif
+
+	sa1100fb_activate_var(var, fbi);
+
+	fbi->palette_cpu[0] = (fbi->palette_cpu[0] &
+					 0xcfff) | palette_pbs(var);
+
+}
+
+/*
+ * sa1100fb_set_var():
+ *	Set the user defined part of the display for the specified console
+ */
+static int
+sa1100fb_set_var(struct fb_var_screeninfo *var, int con, struct fb_info *info)
+{
+	struct sa1100fb_info *fbi = (struct sa1100fb_info *)info;
+	struct fb_var_screeninfo *dvar = get_con_var(&fbi->fb, con);
+	struct display *display = get_con_display(&fbi->fb, con);
+	int err, chgvar = 0, rgbidx;
+
+	DPRINTK("set_var\n");
 
-	if ((par->xres = var->xres) < MIN_XRES)
-		par->xres = MIN_XRES; 
-	if ((par->yres = var->yres) < MIN_YRES)
-		par->yres = MIN_YRES;
-	if (par->xres > current_par.max_xres)
-		par->xres = current_par.max_xres;
-	if (par->yres > current_par.max_yres)
-		par->yres = current_par.max_yres; 
-	par->xres_virtual = 
-		var->xres_virtual < par->xres ? par->xres : var->xres_virtual;
-        par->yres_virtual = 
-		var->yres_virtual < par->yres ? par->yres : var->yres_virtual;
-        par->bits_per_pixel = var->bits_per_pixel;
+	/*
+	 * Decode var contents into a par structure, adjusting any
+	 * out of range values.
+	 */
+	err = sa1100fb_validate_var(var, fbi);
+	if (err)
+		return err;
+
+	if (var->activate & FB_ACTIVATE_TEST)
+		return 0;
+
+	if ((var->activate & FB_ACTIVATE_MASK) != FB_ACTIVATE_NOW)
+		return -EINVAL;
+
+	if (dvar->xres != var->xres)
+		chgvar = 1;
+	if (dvar->yres != var->yres)
+		chgvar = 1;
+	if (dvar->xres_virtual != var->xres_virtual)
+		chgvar = 1;
+	if (dvar->yres_virtual != var->yres_virtual)
+		chgvar = 1;
+	if (dvar->bits_per_pixel != var->bits_per_pixel)
+		chgvar = 1;
+	if (con < 0)
+		chgvar = 0;
 
-        DPRINTK("par->bits_per_pixel=%d\n", par->bits_per_pixel);
-	switch (par->bits_per_pixel) {
+	switch (var->bits_per_pixel) {
 #ifdef FBCON_HAS_CFB4
-        case 4:
-		par->visual = FB_VISUAL_PSEUDOCOLOR;
-		par->palette_size = 16; 
-                break;
+	case 4:
+		if (fbi->cmap_static)
+			display->visual	= FB_VISUAL_STATIC_PSEUDOCOLOR;
+		else
+			display->visual	= FB_VISUAL_PSEUDOCOLOR;
+		display->line_length	= var->xres / 2;
+		display->dispsw		= &fbcon_cfb4;
+		rgbidx			= RGB_8;
+		break;
 #endif
 #ifdef FBCON_HAS_CFB8
 	case 8:
-		par->visual = FB_VISUAL_PSEUDOCOLOR;
-		par->palette_size = 256; 
+		if (fbi->cmap_static)
+			display->visual	= FB_VISUAL_STATIC_PSEUDOCOLOR;
+		else
+			display->visual	= FB_VISUAL_PSEUDOCOLOR;
+		display->line_length	= var->xres;
+		display->dispsw		= &fbcon_cfb8;
+		rgbidx			= RGB_8;
 		break;
 #endif
 #ifdef FBCON_HAS_CFB16
-	case 16:  /* RGB 565 */
-		par->visual = FB_VISUAL_TRUECOLOR;
-		par->palette_size = 0; 
+	case 16:
+		display->visual		= FB_VISUAL_TRUECOLOR;
+		display->line_length	= var->xres * 2;
+		display->dispsw		= &fbcon_cfb16;
+		display->dispsw_data	= fbi->fb.pseudo_palette;
+		rgbidx			= RGB_16;
 		break;
 #endif
 	default:
+		rgbidx = 0;
+		display->dispsw = &fbcon_dummy;
+		break;
+	}
+
+	display->screen_base	= fbi->screen_cpu;
+	display->next_line	= display->line_length;
+	display->type		= fbi->fb.fix.type;
+	display->type_aux	= fbi->fb.fix.type_aux;
+	display->ypanstep	= fbi->fb.fix.ypanstep;
+	display->ywrapstep	= fbi->fb.fix.ywrapstep;
+	display->can_soft_blank	= 1;
+	display->inverse	= fbi->cmap_inverse;
+
+	*dvar			= *var;
+	dvar->activate		&= ~FB_ACTIVATE_ALL;
+
+	/*
+	 * Copy the RGB parameters for this display
+	 * from the machine specific parameters.
+	 */
+	dvar->red		= fbi->rgb[rgbidx]->red;
+	dvar->green		= fbi->rgb[rgbidx]->green;
+	dvar->blue		= fbi->rgb[rgbidx]->blue;
+	dvar->transp		= fbi->rgb[rgbidx]->transp;
+
+	DPRINTK("RGBT length = %d:%d:%d:%d\n",
+		dvar->red.length, dvar->green.length, dvar->blue.length,
+		dvar->transp.length);
+
+	DPRINTK("RGBT offset = %d:%d:%d:%d\n",
+		dvar->red.offset, dvar->green.offset, dvar->blue.offset,
+		dvar->transp.offset);
+
+	/*
+	 * Update the old var.  The fbcon drivers still use this.
+	 * Once they are using fbi->fb.var, this can be dropped.
+	 */
+	display->var = *dvar;
+
+	/*
+	 * If we are setting all the virtual consoles, also set the
+	 * defaults used to create new consoles.
+	 */
+	if (var->activate & FB_ACTIVATE_ALL)
+		fbi->fb.disp->var = *dvar;
+
+	/*
+	 * If the console has changed and the console has defined
+	 * a changevar function, call that function.
+	 */
+	if (chgvar && info && fbi->fb.changevar)
+		fbi->fb.changevar(con);
+
+	/* If the current console is selected, activate the new var. */
+	if (con != fbi->currcon)
+		return 0;
+
+	sa1100fb_hw_set_var(dvar, fbi);
+
+	return 0;
+}
+
+static int
+__do_set_cmap(struct fb_cmap *cmap, int kspc, int con,
+	      struct fb_info *info)
+{
+	struct sa1100fb_info *fbi = (struct sa1100fb_info *)info;
+	struct fb_cmap *dcmap = get_con_cmap(info, con);
+	int err = 0;
+
+	if (con == -1)
+		con = fbi->currcon;
+
+	/* no colormap allocated? (we always have "this" colour map allocated) */
+	if (con >= 0)
+		err = fb_alloc_cmap(&fb_display[con].cmap, fbi->palette_size, 0);
+
+	if (!err && con == fbi->currcon)
+		err = fb_set_cmap(cmap, kspc, sa1100fb_setcolreg, info);
+
+	if (!err)
+		fb_copy_cmap(cmap, dcmap, kspc ? 0 : 1);
+
+	return err;
+}
+
+static int
+sa1100fb_set_cmap(struct fb_cmap *cmap, int kspc, int con,
+		  struct fb_info *info)
+{
+	struct display *disp = get_con_display(info, con);
+
+	if (disp->visual == FB_VISUAL_TRUECOLOR ||
+	    disp->visual == FB_VISUAL_STATIC_PSEUDOCOLOR)
 		return -EINVAL;
+
+	return __do_set_cmap(cmap, kspc, con, info);
+}
+
+static int
+sa1100fb_get_fix(struct fb_fix_screeninfo *fix, int con, struct fb_info *info)
+{
+	struct display *display = get_con_display(info, con);
+
+	*fix = info->fix;
+
+	fix->line_length = display->line_length;
+	fix->visual	 = display->visual;
+	return 0;
+}
+
+static int
+sa1100fb_get_var(struct fb_var_screeninfo *var, int con, struct fb_info *info)
+{
+	*var = *get_con_var(info, con);
+	return 0;
+}
+
+static int
+sa1100fb_get_cmap(struct fb_cmap *cmap, int kspc, int con, struct fb_info *info)
+{
+	struct fb_cmap *dcmap = get_con_cmap(info, con);
+	fb_copy_cmap(dcmap, cmap, kspc ? 0 : 2);
+	return 0;
+}
+
+static struct fb_ops sa1100fb_ops = {
+	owner:		THIS_MODULE,
+	fb_get_fix:	sa1100fb_get_fix,
+	fb_get_var:	sa1100fb_get_var,
+	fb_set_var:	sa1100fb_set_var,
+	fb_get_cmap:	sa1100fb_get_cmap,
+	fb_set_cmap:	sa1100fb_set_cmap,
+};
+
+/*
+ *  sa1100fb_switch():       
+ *	Change to the specified console.  Palette and video mode
+ *      are changed to the console's stored parameters.
+ *
+ *	Uh oh, this can be called from a tasklet (IRQ)
+ */
+static int sa1100fb_switch(int con, struct fb_info *info)
+{
+	struct sa1100fb_info *fbi = (struct sa1100fb_info *)info;
+	struct display *disp;
+	struct fb_cmap *cmap;
+
+	DPRINTK("con=%d info->modename=%s\n", con, fbi->fb.modename);
+
+	if (con == fbi->currcon)
+		return 0;
+
+	if (fbi->currcon >= 0) {
+		disp = fb_display + fbi->currcon;
+
+		/*
+		 * Save the old colormap and video mode.
+		 */
+		disp->var = fbi->fb.var;
+
+		if (disp->cmap.len)
+			fb_copy_cmap(&fbi->fb.cmap, &disp->cmap, 0);
 	}
 
-	palette_mem_size = SA1100_PALETTE_MEM_SIZE(par->bits_per_pixel);
-	palette_mem_phys = (u_long)VideoMemRegion_phys + PAGE_SIZE - palette_mem_size;
-	par->p_palette_base = (u_short *)palette_mem_phys;
-        par->v_palette_base = (u_short *)((u_long)VideoMemRegion + PAGE_SIZE - palette_mem_size);
-	par->p_screen_base  = (u_char *)((u_long)VideoMemRegion_phys + PAGE_SIZE); 
-	par->v_screen_base  = (u_char *)((u_long)VideoMemRegion      + PAGE_SIZE); 
-
-	DPRINTK("p_palette_base = 0x%08lx\n",(u_long)par->p_palette_base);
-	DPRINTK("v_palette_base = 0x%08lx\n",(u_long)par->v_palette_base);
-	DPRINTK("palette_size = 0x%08lx\n",(u_long)par->palette_size);
-	DPRINTK("palette_mem_size = 0x%08lx\n",(u_long)palette_mem_size);
-	DPRINTK("p_screen_base  = 0x%08lx\n",(u_long)par->p_screen_base);
-	DPRINTK("v_screen_base  = 0x%08lx\n",(u_long)par->v_screen_base);
-	DPRINTK("VideoMemRegion = 0x%08lx\n",(u_long)VideoMemRegion);
-	DPRINTK("VideoMemRegion_phys = 0x%08lx\n",(u_long)VideoMemRegion_phys);
+	fbi->currcon = con;
+	disp = fb_display + con;
+
+	/*
+	 * Make sure that our colourmap contains 256 entries.
+	 */
+	fb_alloc_cmap(&fbi->fb.cmap, 256, 0);
+
+	if (disp->cmap.len)
+		cmap = &disp->cmap;
+	else
+		cmap = fb_default_cmap(1 << disp->var.bits_per_pixel);
+
+	fb_copy_cmap(cmap, &fbi->fb.cmap, 0);
+
+	fbi->fb.var = disp->var;
+	fbi->fb.var.activate = FB_ACTIVATE_NOW;
+
+	sa1100fb_set_var(&fbi->fb.var, con, info);
+	return 0;
+}
+
+/*
+ * Formal definition of the VESA spec:
+ *  On
+ *  	This refers to the state of the display when it is in full operation
+ *  Stand-By
+ *  	This defines an optional operating state of minimal power reduction with
+ *  	the shortest recovery time
+ *  Suspend
+ *  	This refers to a level of power management in which substantial power
+ *  	reduction is achieved by the display.  The display can have a longer 
+ *  	recovery time from this state than from the Stand-by state
+ *  Off
+ *  	This indicates that the display is consuming the lowest level of power
+ *  	and is non-operational. Recovery from this state may optionally require
+ *  	the user to manually power on the monitor
+ *
+ *  Now, the fbdev driver adds an additional state, (blank), where they
+ *  turn off the video (maybe by colormap tricks), but don't mess with the
+ *  video itself: think of it semantically between on and Stand-By.
+ *
+ *  So here's what we should do in our fbdev blank routine:
+ *
+ *  	VESA_NO_BLANKING (mode 0)	Video on,  front/back light on
+ *  	VESA_VSYNC_SUSPEND (mode 1)  	Video on,  front/back light off
+ *  	VESA_HSYNC_SUSPEND (mode 2)  	Video on,  front/back light off
+ *  	VESA_POWERDOWN (mode 3)		Video off, front/back light off
+ *
+ *  This will match the matrox implementation.
+ */
+/*
+ * sa1100fb_blank():
+ *	Blank the display by setting all palette values to zero.  Note, the 
+ * 	12 and 16 bpp modes don't really use the palette, so this will not
+ *      blank the display in all modes.  
+ */
+static void sa1100fb_blank(int blank, struct fb_info *info)
+{
+	struct sa1100fb_info *fbi = (struct sa1100fb_info *)info;
+	int i;
+
+	DPRINTK("sa1100fb_blank: blank=%d info->modename=%s\n", blank,
+		fbi->fb.modename);
+
+	switch (blank) {
+	case VESA_POWERDOWN:
+	case VESA_VSYNC_SUSPEND:
+	case VESA_HSYNC_SUSPEND:
+		if (fbi->fb.disp->visual == FB_VISUAL_PSEUDOCOLOR ||
+		    fbi->fb.disp->visual == FB_VISUAL_STATIC_PSEUDOCOLOR)
+			for (i = 0; i < fbi->palette_size; i++)
+				sa1100fb_setpalettereg(i, 0, 0, 0, 0, info);
+		sa1100fb_schedule_task(fbi, C_DISABLE);
+		if (sa1100fb_blank_helper)
+			sa1100fb_blank_helper(blank);
+		break;
+
+	case VESA_NO_BLANKING:
+		if (sa1100fb_blank_helper)
+			sa1100fb_blank_helper(blank);
+		if (fbi->fb.disp->visual == FB_VISUAL_PSEUDOCOLOR ||
+		    fbi->fb.disp->visual == FB_VISUAL_STATIC_PSEUDOCOLOR)
+			fb_set_cmap(&fbi->fb.cmap, 1, sa1100fb_setcolreg, info);
+		sa1100fb_schedule_task(fbi, C_ENABLE);
+	}
+}
+
+static int sa1100fb_updatevar(int con, struct fb_info *info)
+{
+	DPRINTK("entered\n");
+	return 0;
+}
+
+/*
+ * Calculate the PCD value from the clock rate (in picoseconds).
+ * We take account of the PPCR clock setting.
+ */
+static inline int get_pcd(unsigned int pixclock)
+{
+	unsigned int pcd;
 
-	return 0;
+	if (pixclock) {
+		pcd = get_cclk_frequency() * pixclock;
+		pcd /= 10000000;
+		pcd += 1;	/* make up for integer math truncations */
+	} else {
+		/*
+		 * People seem to be missing this message.  Make it big.
+		 * Make it stand out.  Make sure people see it.
+		 */
+		printk(KERN_WARNING "******************************************************\n");
+		printk(KERN_WARNING "**            ZERO PIXEL CLOCK DETECTED             **\n");
+		printk(KERN_WARNING "** You are using a zero pixclock.  This means that  **\n");
+		printk(KERN_WARNING "** clock scaling will not be able to adjust your    **\n");
+		printk(KERN_WARNING "** your timing parameters appropriately, and the    **\n");
+		printk(KERN_WARNING "** bandwidth calculations will fail to work.  This  **\n");
+		printk(KERN_WARNING "** will shortly become an error condition, which    **\n");
+		printk(KERN_WARNING "** will prevent your LCD display working.  Please   **\n");
+		printk(KERN_WARNING "** send your patches in as soon as possible to shut **\n");
+		printk(KERN_WARNING "** this message up.                                 **\n");
+		printk(KERN_WARNING "******************************************************\n");
+		pcd = 0;
+	}
+	return pcd;
 }
 
-static int
-sa1100fb_get_var(struct fb_var_screeninfo *var, int con, struct fb_info *info)
+/*
+ * sa1100fb_activate_var():
+ *	Configures LCD Controller based on entries in var parameter.  Settings are      
+ *      only written to the controller if changes were made.  
+ */
+static int sa1100fb_activate_var(struct fb_var_screeninfo *var, struct sa1100fb_info *fbi)
 {
-	struct sa1100fb_par par;
+	struct sa1100fb_lcd_reg new_regs;
+	u_int half_screen_size, yres, pcd = get_pcd(var->pixclock);
+	u_long flags;
+
+	DPRINTK("Configuring SA1100 LCD\n");
+
+	DPRINTK("var: xres=%d hslen=%d lm=%d rm=%d\n",
+		var->xres, var->hsync_len,
+		var->left_margin, var->right_margin);
+	DPRINTK("var: yres=%d vslen=%d um=%d bm=%d\n",
+		var->yres, var->vsync_len,
+		var->upper_margin, var->lower_margin);
+
+#if DEBUG_VAR
+	if (var->xres < 16        || var->xres > 1024)
+		printk(KERN_ERR "%s: invalid xres %d\n",
+			fbi->fb.fix.id, var->xres);
+	if (var->hsync_len < 1    || var->hsync_len > 64)
+		printk(KERN_ERR "%s: invalid hsync_len %d\n",
+			fbi->fb.fix.id, var->hsync_len);
+	if (var->left_margin < 1  || var->left_margin > 255)
+		printk(KERN_ERR "%s: invalid left_margin %d\n",
+			fbi->fb.fix.id, var->left_margin);
+	if (var->right_margin < 1 || var->right_margin > 255)
+		printk(KERN_ERR "%s: invalid right_margin %d\n",
+			fbi->fb.fix.id, var->right_margin);
+	if (var->yres < 1         || var->yres > 1024)
+		printk(KERN_ERR "%s: invalid yres %d\n",
+			fbi->fb.fix.id, var->yres);
+	if (var->vsync_len < 1    || var->vsync_len > 64)
+		printk(KERN_ERR "%s: invalid vsync_len %d\n",
+			fbi->fb.fix.id, var->vsync_len);
+	if (var->upper_margin < 0 || var->upper_margin > 255)
+		printk(KERN_ERR "%s: invalid upper_margin %d\n",
+			fbi->fb.fix.id, var->upper_margin);
+	if (var->lower_margin < 0 || var->lower_margin > 255)
+		printk(KERN_ERR "%s: invalid lower_margin %d\n",
+			fbi->fb.fix.id, var->lower_margin);
+#endif
+
+	new_regs.lccr0 = fbi->lccr0 |
+		LCCR0_LEN | LCCR0_LDM | LCCR0_BAM |
+		LCCR0_ERM | LCCR0_LtlEnd | LCCR0_DMADel(0);
+
+	new_regs.lccr1 =
+		LCCR1_DisWdth(var->xres) +
+		LCCR1_HorSnchWdth(var->hsync_len) +
+		LCCR1_BegLnDel(var->left_margin) +
+		LCCR1_EndLnDel(var->right_margin);
+
+	/*
+	 * If we have a dual scan LCD, then we need to halve
+	 * the YRES parameter.
+	 */
+	yres = var->yres;
+	if (fbi->lccr0 & LCCR0_Dual)
+		yres /= 2;
+
+	new_regs.lccr2 =
+		LCCR2_DisHght(yres) +
+		LCCR2_VrtSnchWdth(var->vsync_len) +
+		LCCR2_BegFrmDel(var->upper_margin) +
+		LCCR2_EndFrmDel(var->lower_margin);
+
+	new_regs.lccr3 = fbi->lccr3 |
+		(var->sync & FB_SYNC_HOR_HIGH_ACT ? LCCR3_HorSnchH : LCCR3_HorSnchL) |
+		(var->sync & FB_SYNC_VERT_HIGH_ACT ? LCCR3_VrtSnchH : LCCR3_VrtSnchL) |
+		LCCR3_ACBsCntOff;
+
+	if (pcd)
+		new_regs.lccr3 |= LCCR3_PixClkDiv(pcd);
+
+	sa1100fb_check_shadow(&new_regs, var, pcd);
+
+	DPRINTK("nlccr0 = 0x%08x\n", new_regs.lccr0);
+	DPRINTK("nlccr1 = 0x%08x\n", new_regs.lccr1);
+	DPRINTK("nlccr2 = 0x%08x\n", new_regs.lccr2);
+	DPRINTK("nlccr3 = 0x%08x\n", new_regs.lccr3);
+
+	half_screen_size = var->bits_per_pixel;
+	half_screen_size = half_screen_size * var->xres * var->yres / 16;
+
+	/* Update shadow copy atomically */
+	local_irq_save(flags);
+	fbi->dbar1 = fbi->palette_dma;
+	fbi->dbar2 = fbi->screen_dma + half_screen_size;
+
+	fbi->reg_lccr0 = new_regs.lccr0;
+	fbi->reg_lccr1 = new_regs.lccr1;
+	fbi->reg_lccr2 = new_regs.lccr2;
+	fbi->reg_lccr3 = new_regs.lccr3;
+	local_irq_restore(flags);
 
-        DPRINTK("con=%d\n", con);
-	if (con == -1) {
-		sa1100fb_get_par(&par);
-		sa1100fb_encode_var(var, &par);
-	} else
-		*var = fb_display[con].var;
+	/*
+	 * Only update the registers if the controller is enabled
+	 * and something has changed.
+	 */
+	if ((LCCR0 != fbi->reg_lccr0)       || (LCCR1 != fbi->reg_lccr1) ||
+	    (LCCR2 != fbi->reg_lccr2)       || (LCCR3 != fbi->reg_lccr3) ||
+	    (DBAR1 != (Address) fbi->dbar1) || (DBAR2 != (Address) fbi->dbar2))
+		sa1100fb_schedule_task(fbi, C_REENABLE);
 
 	return 0;
 }
 
 /*
- * sa1100fb_set_var():
- *	Set the user defined part of the display for the specified console
+ * NOTE!  The following functions are purely helpers for set_ctrlr_state.
+ * Do not call them directly; set_ctrlr_state does the correct serialisation
+ * to ensure that things happen in the right way 100% of time time.
+ *	-- rmk
  */
-static int
-sa1100fb_set_var(struct fb_var_screeninfo *var, int con, struct fb_info *info)
+
+/*
+ * FIXME: move LCD power stuff into sa1100fb_power_up_lcd()
+ * Also, I'm expecting that the backlight stuff should
+ * be handled differently.
+ */
+static void sa1100fb_backlight_on(struct sa1100fb_info *fbi)
 {
-	struct display *display;
-	int err, chgvar = 0;
-	struct sa1100fb_par par;
+	DPRINTK("backlight on\n");
 
-	if (con >= 0)
-		display = &fb_display[con]; /* Display settings for console */
-	else
-		display = &global_disp;     /* Default display settings */
+#ifdef CONFIG_SA1100_FREEBIRD
+#error FIXME
+	if (machine_is_freebird()) {
+		BCR_set(BCR_FREEBIRD_LCD_PWR | BCR_FREEBIRD_LCD_DISP);
+	}
+#endif
+#ifdef CONFIG_SA1100_FREEBIRD
+	if (machine_is_freebird()) {
+		/* Turn on backlight ,Chester */
+		BCR_set(BCR_FREEBIRD_LCD_BACKLIGHT);
+	}
+#endif
+#ifdef CONFIG_SA1100_HUW_WEBPANEL
+#error FIXME
+	if (machine_is_huw_webpanel()) {
+		BCR_set(BCR_CCFL_POW + BCR_PWM_BACKLIGHT);
+		set_current_state(TASK_UNINTERRUPTIBLE);
+		schedule_task(200 * HZ / 1000);
+		BCR_set(BCR_TFT_ENA);
+	}
+#endif
+#ifdef CONFIG_SA1100_OMNIMETER
+	if (machine_is_omnimeter())
+		LEDBacklightOn();
+#endif
+#ifdef CONFIG_SA1100_BITSY
+	/* what rmk said --dneuer */
+#endif
+}
 
-	/* Decode var contents into a par structure, adjusting any */
-	/* out of range values. */
-	if ((err = sa1100fb_decode_var(var, &par)))
-		return err;
-	// Store adjusted par values into var structure
-	sa1100fb_encode_var(var, &par);
-       
-	if ((var->activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_TEST)
-		return 0;
-	else if (((var->activate & FB_ACTIVATE_MASK) != FB_ACTIVATE_NOW) && 
-		 ((var->activate & FB_ACTIVATE_MASK) != FB_ACTIVATE_NXTOPEN))
-		return -EINVAL;
+/*
+ * FIXME: move LCD power stuf into sa1100fb_power_down_lcd()
+ * Also, I'm expecting that the backlight stuff should
+ * be handled differently.
+ */
+static void sa1100fb_backlight_off(struct sa1100fb_info *fbi)
+{
+	DPRINTK("backlight off\n");
 
-	if (con >= 0) {
-		if ((display->var.xres != var->xres) ||
-		    (display->var.yres != var->yres) ||
-		    (display->var.xres_virtual != var->xres_virtual) ||
-		    (display->var.yres_virtual != var->yres_virtual) ||
-		    (display->var.sync != var->sync)                 ||
-                    (display->var.bits_per_pixel != var->bits_per_pixel) ||
-		    (memcmp(&display->var.red, &var->red, sizeof(var->red))) ||
-		    (memcmp(&display->var.green, &var->green, sizeof(var->green))) ||
-		    (memcmp(&display->var.blue, &var->blue, sizeof(var->blue)))) 
-			chgvar = 1;
-	}
-
-	display->var = *var;
-	display->screen_base	= par.v_screen_base;
-	display->visual		= par.visual;
-	display->type		= FB_TYPE_PACKED_PIXELS;
-	display->type_aux	= 0;
-	display->ypanstep	= 0;
-	display->ywrapstep	= 0;
-	display->line_length	= 
-	display->next_line      = (var->xres * var->bits_per_pixel) / 8;
+#ifdef CONFIG_SA1100_FREEBIRD
+#error FIXME
+	if (machine_is_freebird()) {
+		BCR_clear(BCR_FREEBIRD_LCD_PWR | BCR_FREEBIRD_LCD_DISP
+			  /*| BCR_FREEBIRD_LCD_BACKLIGHT */ );
+	}
+#endif
+#ifdef CONFIG_SA1100_OMNIMETER
+	if (machine_is_omnimeter())
+		LEDBacklightOff();
+#endif
+#ifdef CONFIG_SA1100_BITSY
+	/* what rmk said --dneuer */
+#endif
+}
 
-	display->can_soft_blank	= 1;
-	display->inverse	= 0;
+static void sa1100fb_power_up_lcd(struct sa1100fb_info *fbi)
+{
+	DPRINTK("LCD power on\n");
 
-	switch (display->var.bits_per_pixel) {
-#ifdef FBCON_HAS_CFB4
-        case 4:
-		display->dispsw = &fbcon_cfb4;
-		break;
+#if defined(CONFIG_SA1100_ASSABET) && !defined(ASSABET_PAL_VIDEO)
+	if (machine_is_assabet())
+		BCR_set(BCR_LCD_ON);
 #endif
-#ifdef FBCON_HAS_CFB8
-	case 8: 
-		display->dispsw = &fbcon_cfb8;
-		break;
+#ifdef CONFIG_SA1100_HUW_WEBPANEL
+	if (machine_is_huw_webpanel())
+		BCR_clear(BCR_TFT_NPWR);
 #endif
-#ifdef FBCON_HAS_CFB16
-	case 16:
-		display->dispsw = &fbcon_cfb16;
-		break;
+#ifdef CONFIG_SA1100_OMNIMETER
+	if (machine_is_omnimeter())
+		LCDPowerOn();
 #endif
-	default:
-		display->dispsw = &fbcon_dummy;
-		break;
+#ifdef CONFIG_SA1100_BITSY
+	if (machine_is_bitsy()) {
+		set_bitsy_egpio(EGPIO_BITSY_LCD_ON |
+				EGPIO_BITSY_LCD_PCI |
+				EGPIO_BITSY_LCD_5V_ON |
+				EGPIO_BITSY_LVDD_ON);
 	}
+#endif
+}
 
-	/* If the console has changed and the console has defined */
-	/* a changevar function, call that function. */
-	if (chgvar && info && info->changevar)
-		info->changevar(con);
-
-        /* If the current console is selected and it's not truecolor, 
-	 *  update the palette 
-	 */
-	if ((con == current_par.currcon) &&
-	    (current_par.visual != FB_VISUAL_TRUECOLOR)) {
-		struct fb_cmap *cmap;
-		
-		current_par = par;
-		if (display->cmap.len)
-			cmap = &display->cmap;
-		else
-			cmap = fb_default_cmap(current_par.palette_size);
+static void sa1100fb_power_down_lcd(struct sa1100fb_info *fbi)
+{
+	DPRINTK("LCD power off\n");
 
-		fb_set_cmap(cmap, 1, sa1100fb_setcolreg, info);
+#if defined(CONFIG_SA1100_ASSABET) && !defined(ASSABET_PAL_VIDEO)
+	if (machine_is_assabet())
+		BCR_clear(BCR_LCD_ON);
+#endif
+#ifdef CONFIG_SA1100_HUW_WEBPANEL
+	// dont forget to set the control lines to zero (?)
+	if (machine_is_huw_webpanel())
+		BCR_set(BCR_TFT_NPWR);
+#endif
+#ifdef CONFIG_SA1100_BITSY
+	if (machine_is_bitsy()) {
+		clr_bitsy_egpio(EGPIO_BITSY_LCD_ON |
+				EGPIO_BITSY_LCD_PCI |
+				EGPIO_BITSY_LCD_5V_ON |
+				EGPIO_BITSY_LVDD_ON);
 	}
-
-	/* If the current console is selected, activate the new var. */
-	if (con == current_par.currcon)
-		sa1100fb_activate_var(var);
-	
-	return 0;
+#endif
 }
 
-static int
-sa1100fb_updatevar(int con, struct fb_info *info)
+static void sa1100fb_setup_gpio(struct sa1100fb_info *fbi)
 {
-	DPRINTK("entered\n");
-	return 0;
-}
+	u_int mask = 0;
 
-static int
-sa1100fb_get_fix(struct fb_fix_screeninfo *fix, int con, struct fb_info *info)
-{
-	struct display *display;
+	/*
+	 * Enable GPIO<9:2> for LCD use if:
+	 *  1. Active display, or
+	 *  2. Color Dual Passive display
+	 *
+	 * see table 11.8 on page 11-27 in the SA1100 manual
+	 *   -- Erik.
+	 *
+	 * SA1110 spec update nr. 25 says we can and should
+	 * clear LDD15 to 12 for 4 or 8bpp modes with active
+	 * panels.  
+	 */
+	if ((fbi->reg_lccr0 & LCCR0_CMS) == LCCR0_Color &&
+	    (fbi->reg_lccr0 & (LCCR0_Dual|LCCR0_Act)) != 0) {
+		mask = GPIO_LDD11 | GPIO_LDD10 | GPIO_LDD9  | GPIO_LDD8;
+
+		if (fbi->fb.var.bits_per_pixel > 8 ||
+		    (fbi->reg_lccr0 & (LCCR0_Dual|LCCR0_Act)) == LCCR0_Dual)
+			mask |= GPIO_LDD15 | GPIO_LDD14 | GPIO_LDD13 | GPIO_LDD12;
 
-	memset(fix, 0, sizeof(struct fb_fix_screeninfo));
-	strcpy(fix->id, SA1100_NAME);
+	}
 
-	if (con >= 0)
-	{
-		DPRINTK("Using console specific display for con=%d\n",con);
-		display = &fb_display[con];  /* Display settings for console */
+#ifdef CONFIG_SA1100_FREEBIRD
+#error Please contact <rmk@arm.linux.org.uk> about this
+	if (machine_is_freebird()) {
+		/* Color single passive */
+		mask |= GPIO_LDD15 | GPIO_LDD14 | GPIO_LDD13 | GPIO_LDD12 |
+			GPIO_LDD11 | GPIO_LDD10 | GPIO_LDD9  | GPIO_LDD8;
 	}
-	else
-		display = &global_disp;      /* Default display settings */
+#endif
+#ifdef CONFIG_SA1100_CERF
+#error Please contact <rmk@arm.linux.org.uk> about this
+	if (machine_is_cerf()) {
+		/* GPIO15 is used as a bypass for 3.8" displays */
+		mask |= GPIO_GPIO15;
+
+		/* FIXME: why is this? The Cerf's display doesn't seem
+		 * to be dual scan or active. I just leave it here,
+		 * but in my opinion this is definitively wrong.
+		 *  -- Erik <J.A.K.Mouw@its.tudelft.nl>
+		 */
 
-	fix->smem_start	 = (unsigned long)current_par.p_screen_base;
-	fix->smem_len	 = current_par.screen_size;
-	fix->type	 = display->type;
-	fix->type_aux	 = display->type_aux;
-	fix->xpanstep	 = 0;
-	fix->ypanstep	 = display->ypanstep;
-	fix->ywrapstep	 = display->ywrapstep;
-	fix->visual	 = display->visual;
-	fix->line_length = display->line_length;
-	fix->accel	 = FB_ACCEL_NONE;
+		/* REPLY: Umm.. Well to be honest, the 5.7" LCD which
+		 * this was used for does not use these pins, but
+		 * apparently all hell breaks loose if they are not
+		 * set on the Cerf, so we decided to leave them in ;)
+		 *  -- Daniel Chemko <dchemko@intrinsyc.com>
+		 */
+		/* color {dual/single} passive */
+		mask |= GPIO_LDD15 | GPIO_LDD14 | GPIO_LDD13 | GPIO_LDD12 |
+			GPIO_LDD11 | GPIO_LDD10 | GPIO_LDD9  | GPIO_LDD8;
+	}
+#endif
 
-	return 0;
+	if (mask) {
+		GPDR |= mask;
+		GAFR |= mask;
+	}
 }
 
-
-static void
-__init sa1100fb_init_fbinfo(void)
+static void sa1100fb_enable_controller(struct sa1100fb_info *fbi)
 {
-	strcpy(fb_info.modename, SA1100_NAME);
-	strcpy(fb_info.fontname, "Acorn8x8");
-
-	fb_info.node		= -1;
-	fb_info.flags		= FBINFO_FLAG_DEFAULT;
-	fb_info.fbops		= &sa1100fb_ops;
-        fb_info.monspecs	= monspecs;
-	fb_info.disp		= &global_disp;
-	fb_info.changevar	= NULL;
-	fb_info.switch_con	= sa1100fb_switch;
-	fb_info.updatevar	= sa1100fb_updatevar;
-	fb_info.blank		= sa1100fb_blank;
-
-	/*
-	 * setup initial parameters
-	 */
-	memset(&init_var, 0, sizeof(init_var));
-
-	init_var.transp.length	= 0;
-	init_var.nonstd		= 0;
-	init_var.activate	= FB_ACTIVATE_NOW;
-	init_var.xoffset	= 0;
-	init_var.yoffset	= 0;
-	init_var.height		= -1;
-	init_var.width		= -1;
-	init_var.vmode		= FB_VMODE_NONINTERLACED;
+	DPRINTK("Enabling LCD controller\n");
 
-	if (machine_is_assabet()) {
-		current_par.max_xres	= 320;
-		current_par.max_yres	= 240;
-		current_par.max_bpp	= 16;
-		init_var.red.length	= 5;				
-		init_var.green.length	= 6;
-		init_var.blue.length	= 5;
-		init_var.grayscale	= 0;
-		init_var.sync		= 0;
-		init_var.pixclock	= 171521;
-	} else if (machine_is_cerf()) {
-		current_par.max_xres	= 320;
-		current_par.max_yres	= 240;
-		current_par.max_bpp	= 8;
-		init_var.red.length	= 4;				
-		init_var.green.length	= 4;
-		init_var.blue.length	= 4;
-		init_var.grayscale	= 0;
-		init_var.sync		= 0;
-		init_var.pixclock	= 171521;
-	} else if (machine_is_pangolin()) {
-		current_par.max_xres	= 1024;
-		current_par.max_yres	= 768;
-		current_par.max_bpp	= 16;
-		init_var.red.length	= 5;
-		init_var.green.length	= 6;
-		init_var.blue.length	= 5;
-		init_var.grayscale	= 0;
-		init_var.sync		= 0;	
-		init_var.pixclock	= 15400;
-	} else if (machine_is_bitsy()) {
-		current_par.max_xres	= 320;
-		current_par.max_yres	= 240;
-		current_par.max_bpp	= 16;
-		init_var.red.length	= 4;
-		init_var.green.length	= 4;
-		init_var.blue.length	= 4;
-		init_var.red.offset	= 12;
-		init_var.green.offset	= 7;
-		init_var.blue.offset	= 1;
-		init_var.grayscale	= 0;
-	} else if (machine_is_brutus()) {
-		current_par.max_xres	= 320;
-		current_par.max_yres	= 240;
-		current_par.max_bpp	= 8;
-		init_var.red.length	= 4;				
-		init_var.green		= init_var.red;
-		init_var.blue		= init_var.red;
-		init_var.sync		= 0;
-	} else if (machine_is_lart()) {
-		current_par.max_xres	= 320;
-		current_par.max_yres	= 240;
-		current_par.max_bpp	= 4;
-		init_var.red.length	= 4;				
-		init_var.green		= init_var.red;
-		init_var.blue		= init_var.red;
-		init_var.grayscale	= 1;
-		init_var.pixclock	= 150000;	
-		init_var.sync		= 0;
-	} else if (machine_is_graphicsclient()) {
-		current_par.max_xres	= 640;
-		current_par.max_yres	= 480;
-		current_par.max_bpp	= 8;
-		init_var.red.length	= 4;				
-		init_var.green		= init_var.red;
-		init_var.blue		= init_var.red;
-		init_var.sync		= 0;
-	} else if (machine_is_xp860()) {
-		current_par.max_xres	= 1024;
-		current_par.max_yres	= 768;
-
-		current_par.max_bpp	= 8;
-		init_var.red.length	= 4;
-		init_var.green		= init_var.red;
-		init_var.blue		= init_var.red;
-
-		init_var.hsync_len	= 4;
-		init_var.left_margin	= 3;
-		init_var.right_margin	= 2;
-
-		init_var.vsync_len	= 3;
-		init_var.upper_margin	= 2;
-		init_var.lower_margin	= 1;
-		
-	}
-
-	current_par.p_palette_base	= NULL;
-	current_par.v_palette_base	= NULL;
-	current_par.p_screen_base	= NULL;
-	current_par.v_screen_base	= NULL;
-	current_par.palette_size	= MAX_PALETTE_NUM_ENTRIES;
-	current_par.screen_size		= MAX_PIXEL_MEM_SIZE;
-	current_par.montype		= -1;
-	current_par.currcon		= -1;
-	current_par.allow_modeset	=  1;
-	current_par.controller_state	= LCD_MODE_DISABLED;
-
-	init_var.xres			= current_par.max_xres;
-	init_var.yres			= current_par.max_yres;
-	init_var.xres_virtual		= init_var.xres;
-	init_var.yres_virtual		= init_var.yres;
-	init_var.bits_per_pixel		= current_par.max_bpp;
-			
-}
+	/*
+	 * Make sure the mode bits are present in the first palette entry
+	 */
+	fbi->palette_cpu[0] &= 0xcfff;
+	fbi->palette_cpu[0] |= palette_pbs(&fbi->fb.var);
 
+	/* Sequence from 11.7.10 */
+	LCCR3 = fbi->reg_lccr3;
+	LCCR2 = fbi->reg_lccr2;
+	LCCR1 = fbi->reg_lccr1;
+	LCCR0 = fbi->reg_lccr0 & ~LCCR0_LEN;
+	DBAR1 = (Address) fbi->dbar1;
+	DBAR2 = (Address) fbi->dbar2;
+	LCCR0 |= LCCR0_LEN;
+
+#ifdef CONFIG_SA1100_GRAPHICSCLIENT
+#error Where is GPIO24 set as an output?  Can we fit this in somewhere else?
+	if (machine_is_graphicsclient()) {
+		// From ADS doc again...same as disable
+		set_current_state(TASK_UNINTERRUPTIBLE);
+		schedule_timeout(20 * HZ / 1000);
+		GPSR |= GPIO_GPIO24;
+	}
+#endif
 
+	DPRINTK("DBAR1 = %p\n", DBAR1);
+	DPRINTK("DBAR2 = %p\n", DBAR2);
+	DPRINTK("LCCR0 = 0x%08x\n", LCCR0);
+	DPRINTK("LCCR1 = 0x%08x\n", LCCR1);
+	DPRINTK("LCCR2 = 0x%08x\n", LCCR2);
+	DPRINTK("LCCR3 = 0x%08x\n", LCCR3);
+}
 
-/*
- * sa1100fb_map_video_memory():
- *      Allocates the DRAM memory for the frame buffer.  This buffer is  
- *	remapped into a non-cached, non-buffered, memory region to  
- *      allow palette and pixel writes to occur without flushing the 
- *      cache.  Once this area is remapped, all virtual memory
- *      access to the video memory should occur at the new region.
- */
-static int
-__init sa1100fb_map_video_memory(void)
+static void sa1100fb_disable_controller(struct sa1100fb_info *fbi)
 {
-	u_int  required_pages;
-	u_int  extra_pages;
-	u_int  order;
-        struct page *page;
-        char   *allocated_region;
+	DECLARE_WAITQUEUE(wait, current);
 
-	if (VideoMemRegion != NULL)
-		return -EINVAL;
+	DPRINTK("Disabling LCD controller\n");
 
-	DPRINTK("-1-");
+#ifdef CONFIG_SA1100_GRAPHICSCLIENT
+#error Where is GPIO24 set as an output?  Can we fit this in somewhere else?
+	if (machine_is_graphicsclient()) {
+		/*
+		 * From ADS internal document:
+		 *  GPIO24 should be LOW at least 10msec prior to disabling
+		 *  the LCD interface.
+		 *
+		 * We'll wait 20msec.
+		 */
+		GPCR |= GPIO_GPIO24;
+		set_current_state(TASK_UNINTERRUPTIBLE);
+		schedule_timeout(20 * HZ / 1000);
+	}
+#endif
+#ifdef CONFIG_SA1100_HUW_WEBPANEL
+#error Move me into sa1100fb_power_up_lcd and/or sa1100fb_backlight_on
+	if (machine_is_huw_webpanel()) {
+		// dont forget to set the control lines to zero (?)
+		DPRINTK("ShutDown HuW LCD controller\n");
+		BCR_clear(BCR_TFT_ENA + BCR_CCFL_POW + BCR_PWM_BACKLIGHT);
+	}
+#endif
 
-	/* Find order required to allocate enough memory for framebuffer */
-	required_pages = ALLOCATED_FB_MEM_SIZE >> PAGE_SHIFT;
-        for (order = 0 ; required_pages >> order ; order++) {;}
-        extra_pages = (1 << order) - required_pages;
-
-        if ((allocated_region = 
-             (char *)__get_free_pages(GFP_KERNEL | GFP_DMA, order)) == NULL)
-           return -ENOMEM;
-
-        VideoMemRegion = (u_char *)allocated_region + (extra_pages << PAGE_SHIFT); 
-        VideoMemRegion_phys = (u_char *)__virt_to_phys((u_long)VideoMemRegion);
-
-	/* Free all pages that we don't need but were given to us because */
-	/* __get_free_pages() works on powers of 2. */
-	for (;extra_pages;extra_pages--)
-          free_page((u_int)allocated_region + ((extra_pages-1) << PAGE_SHIFT));
-
-        /* Set reserved flag for fb memory to allow it to be remapped into */
-        /* user space by the common fbmem driver using remap_page_range(). */
-	for(page = virt_to_page(VideoMemRegion); 
-	    page < virt_to_page(VideoMemRegion + ALLOCATED_FB_MEM_SIZE); page++)
-	  mem_map_reserve(page);
-
-	/* Remap the fb memory to a non-buffered, non-cached region */
-	VideoMemRegion = (u_char *)__ioremap((u_long)VideoMemRegion_phys,
-					     ALLOCATED_FB_MEM_SIZE,
-					     L_PTE_PRESENT  |
-					     L_PTE_YOUNG    |
-					     L_PTE_DIRTY    |
-					     L_PTE_WRITE);
-	return (VideoMemRegion == NULL ? -EINVAL : 0);
-}
-
-static const int frequency[16] = {
-	59000000,
-        73700000,
-        88500000,
-        103200000,
-        118000000,
-        132700000,
-        147500000,
-        162200000,
-        176900000,
-        191700000,
-        206400000, 
-	230000000,
-	245000000,
-	260000000,
-	275000000,
-	290000000
-};
+	add_wait_queue(&fbi->ctrlr_wait, &wait);
+	set_current_state(TASK_UNINTERRUPTIBLE);
 
+	LCSR = 0xffffffff;	/* Clear LCD Status Register */
+	LCCR0 &= ~LCCR0_LDM;	/* Enable LCD Disable Done Interrupt */
+	enable_irq(IRQ_LCD);	/* Enable LCD IRQ */
+	LCCR0 &= ~LCCR0_LEN;	/* Disable LCD Controller */
+
+	schedule_timeout(20 * HZ / 1000);
+	current->state = TASK_RUNNING;
+	remove_wait_queue(&fbi->ctrlr_wait, &wait);
+}
 
-static inline int get_pcd(unsigned int pixclock)
+/*
+ *  sa1100fb_handle_irq: Handle 'LCD DONE' interrupts.
+ */
+static void sa1100fb_handle_irq(int irq, void *dev_id, struct pt_regs *regs)
 {
-	unsigned int pcd = 0;
+	struct sa1100fb_info *fbi = dev_id;
+	unsigned int lcsr = LCSR;
 
-	if (machine_is_assabet() | machine_is_pangolin()) {
-		pcd = frequency[PPCR & 0xf] / 1000;
-		pcd *= pixclock / 1000;
-		pcd = pcd / 1000000;
-		pcd++; /* make up for integer math truncations */
+	if (lcsr & LCSR_LDD) {
+		LCCR0 |= LCCR0_LDM;
+		wake_up(&fbi->ctrlr_wait);
 	}
-	return pcd;
-}
 
+	LCSR = lcsr;
+}
 
 /*
- * sa1100fb_activate_var():
- *	Configures LCD Controller based on entries in var parameter.  Settings are      
- *      only written to the controller if changes were made.  
+ * This function must be called from task context only, since it will
+ * sleep when disabling the LCD controller, or if we get two contending
+ * processes trying to alter state.
  */
-static int
-sa1100fb_activate_var(struct fb_var_screeninfo *var)
-{						       
-	u_long	flags;
-	int pcd = get_pcd(var->pixclock);
-
-	DPRINTK("Configuring  SA1100 LCD\n");
+static void set_ctrlr_state(struct sa1100fb_info *fbi, u_int state)
+{
+	u_int old_state;
 
-	if (current_par.p_palette_base == NULL)
-		return -EINVAL;
+	down(&fbi->ctrlr_sem);
 
-	DPRINTK("activating\n");
+	old_state = fbi->state;
 
-	/* Disable interrupts and save status */
-	local_irq_save(flags);		// disable the interrupts and save flags
+	switch (state) {
+	case C_DISABLE_CLKCHANGE:
+		/*
+		 * Disable controller for clock change.  If the
+		 * controller is already disabled, then do nothing.
+		 */
+		if (old_state != C_DISABLE) {
+			fbi->state = state;
+			sa1100fb_disable_controller(fbi);
+		}
+		break;
 
-	/* Reset the LCD Controller's DMA address if it has changed */
-  	lcd_shadow.dbar1 = (Address)current_par.p_palette_base;
-	lcd_shadow.dbar2 = (Address)(current_par.p_screen_base + (current_par.xres * current_par.yres * current_par.bits_per_pixel / 8 / 2));
+	case C_DISABLE:
+		/*
+		 * Disable controller
+		 */
+		if (old_state != C_DISABLE) {
+			fbi->state = state;
 
-	DPRINTK("Configuring xres = %d, yres = %d\n",var->xres, var->yres);
+			sa1100fb_backlight_off(fbi);
+			if (old_state != C_DISABLE_CLKCHANGE)
+				sa1100fb_disable_controller(fbi);
+			sa1100fb_power_down_lcd(fbi);
+		}
+		break;
 
-	if (machine_is_assabet()) {
-		DPRINTK("Configuring  Assabet LCD\n");
-		lcd_shadow.lccr0 = 
-			LCCR0_LEN + LCCR0_Color + LCCR0_Sngl + 
-			LCCR0_LDM + LCCR0_BAM + LCCR0_ERM + LCCR0_Act +
-			LCCR0_LtlEnd + LCCR0_DMADel(0);
-		lcd_shadow.lccr1 = 
-			LCCR1_DisWdth(var->xres) + LCCR1_HorSnchWdth(6) + 
-			LCCR1_BegLnDel(61) + LCCR1_EndLnDel(9);
-		lcd_shadow.lccr2 = 
-			LCCR2_DisHght(var->yres) + LCCR2_VrtSnchWdth(1) + 
-			LCCR2_BegFrmDel(3) + LCCR2_EndFrmDel(0);
-		lcd_shadow.lccr3 = 
-			LCCR3_OutEnH + LCCR3_PixFlEdg + LCCR3_VrtSnchH + 
-			LCCR3_HorSnchH + LCCR3_ACBsCntOff + 
-			LCCR3_ACBsDiv(2) + LCCR3_PixClkDiv(pcd);
-
-		/* Set board control register to handle new color depth */
-		sa1100fb_assabet_set_truecolor(var->bits_per_pixel >= 16);
-	} else if (machine_is_pangolin()) {
-		DPRINTK("Configuring Pangolin LCD\n");
-		lcd_shadow.lccr0 = 
-			LCCR0_LEN + LCCR0_Color + LCCR0_LDM +
-			LCCR0_BAM + LCCR0_ERM + LCCR0_Act +
-			LCCR0_LtlEnd + LCCR0_DMADel(0);
-		lcd_shadow.lccr1 = 
-			LCCR1_DisWdth(var->xres) + LCCR1_HorSnchWdth(63) + 
-			LCCR1_BegLnDel(127) + LCCR1_EndLnDel(127);
-		lcd_shadow.lccr2 = 
-			LCCR2_DisHght(var->yres) + LCCR2_VrtSnchWdth(2) + 
-			LCCR2_BegFrmDel(18) + LCCR2_EndFrmDel(18);
-		lcd_shadow.lccr3 = 
-			LCCR3_PixClkDiv(pcd) + LCCR3_HorSnchH +
-			LCCR3_VrtSnchH + LCCR3_OutEnH;
-		DPRINTK("pcd = %d\n", pcd);
-		DPRINTK("LCCR1_DisWdth(var->xres) = 0x%x\n",
-			LCCR1_DisWdth(var->xres));
-		DPRINTK("LCCR2_DisHght(var->yres) = 0x%x\n",
-			LCCR2_DisHght(var->yres));
-	} else if (machine_is_bitsy()) {
-		DPRINTK("Configuring  Bitsy LCD\n");
-		lcd_shadow.lccr0 = LCCR0_LEN + LCCR0_Color + LCCR0_Sngl + LCCR0_Act +
-				   LCCR0_LtlEnd + LCCR0_LDM + LCCR0_BAM + LCCR0_ERM + 
-				   LCCR0_DMADel(0);
-		lcd_shadow.lccr1 = LCCR1_DisWdth( var->xres ) +
-				   LCCR1_HorSnchWdth( 4 ) +
-				   LCCR1_BegLnDel( 0xC ) +
-				   LCCR1_EndLnDel( 0x11 );
-		lcd_shadow.lccr2 = LCCR2_DisHght( var->yres + 1 ) +
-				   LCCR2_VrtSnchWdth( 3 )+
-				   LCCR2_BegFrmDel( 10 ) +
-				   LCCR2_EndFrmDel( 1 );
-		lcd_shadow.lccr3 = (/* PCD */ 0x10
-                                    | /* ACB */ 0
-                                    | /* API */ 0
-                                    | LCCR3_VrtSnchL
-                                    | LCCR3_HorSnchL);
-	} else if (machine_is_brutus()) {
- 		DPRINTK("Configuring  Brutus LCD\n");
- 		lcd_shadow.lccr0 = 
- 			LCCR0_LEN + LCCR0_Color + LCCR0_Sngl + LCCR0_Pas + 
- 			LCCR0_LtlEnd + LCCR0_LDM + LCCR0_BAM + LCCR0_ERM + 
- 			LCCR0_DMADel(0);
- 		lcd_shadow.lccr1 = 
- 			LCCR1_DisWdth(var->xres) + LCCR1_HorSnchWdth(4) + 
- 			LCCR1_BegLnDel(41) + LCCR1_EndLnDel(101);
- 		lcd_shadow.lccr2 = 
- 			LCCR2_DisHght(var->yres) + LCCR2_VrtSnchWdth(1) + 
- 			LCCR2_BegFrmDel(0) + LCCR2_EndFrmDel(0);
- 		lcd_shadow.lccr3 = 
- 			LCCR3_OutEnH + LCCR3_PixFlEdg + LCCR3_VrtSnchH + 
- 			LCCR3_HorSnchH + LCCR3_ACBsCntOff + 
- 			LCCR3_ACBsDiv(2) + LCCR3_PixClkDiv(44);
-	} else if (machine_is_cerf()) {
-		DPRINTK("Configuring Cerf LCD\n");
-		lcd_shadow.lccr0 = 
-			LCCR0_LEN + LCCR0_Color + LCCR0_Sngl + 
-			LCCR0_LDM + LCCR0_BAM + LCCR0_ERM + LCCR0_Pas +
-			LCCR0_LtlEnd + LCCR0_DMADel(0);
-		lcd_shadow.lccr1 = 
-			LCCR1_DisWdth(var->xres) + LCCR1_HorSnchWdth(6) + 
-			LCCR1_BegLnDel(61) + LCCR1_EndLnDel(9);
-		lcd_shadow.lccr2 = 
-			LCCR2_DisHght(var->yres) + LCCR2_VrtSnchWdth(1) + 
-			LCCR2_BegFrmDel(3) + LCCR2_EndFrmDel(0);
-		lcd_shadow.lccr3 = 
-			LCCR3_OutEnH + LCCR3_PixFlEdg + LCCR3_VrtSnchH + 
-			LCCR3_HorSnchH + LCCR3_ACBsCntOff + 
-			LCCR3_ACBsDiv(2) + LCCR3_PixClkDiv(38);
-	} else if (machine_is_lart()) {
-		DPRINTK("Configuring LART LCD\n");
-		lcd_shadow.lccr0 = 
-			LCCR0_LEN + LCCR0_Mono + LCCR0_Sngl + LCCR0_Pas +
-			LCCR0_LtlEnd + LCCR0_LDM + LCCR0_BAM + LCCR0_ERM + 
-			LCCR0_DMADel(0);
-		lcd_shadow.lccr1 = 
-			LCCR1_DisWdth(var->xres) + LCCR1_HorSnchWdth(2) +
-			LCCR1_BegLnDel(4) + LCCR1_EndLnDel(2);
-		lcd_shadow.lccr2 = 
-			LCCR2_DisHght(var->yres) + LCCR2_VrtSnchWdth(1) +
-			LCCR2_BegFrmDel(0) + LCCR2_EndFrmDel(0);
-		lcd_shadow.lccr3 = 
-			LCCR3_PixClkDiv(34) + LCCR3_ACBsDiv(512) +
-			LCCR3_ACBsCntOff + LCCR3_HorSnchH + LCCR3_VrtSnchH;
-	} else if (machine_is_graphicsclient()) {
-		DPRINTK("Configuring GraphicsClient LCD\n");
-		lcd_shadow.lccr0 = 
-			LCCR0_LEN + LCCR0_Color + LCCR0_Sngl + LCCR0_Act;
-		lcd_shadow.lccr1 = 
-			LCCR1_DisWdth(var->xres) + LCCR1_HorSnchWdth(10) +
-			LCCR1_EndLnDel(81) + LCCR1_BegLnDel(81);
-		lcd_shadow.lccr2 = 
-			LCCR2_DisHght(var->yres) + LCCR2_VrtSnchWdth(9) + 
-			LCCR2_EndFrmDel (20) + LCCR2_BegFrmDel(20);
-		lcd_shadow.lccr3 = 
-			LCCR3_PixClkDiv(6) + LCCR3_ACBsDiv(2) + 
-			LCCR3_ACBsCntOff + LCCR3_HorSnchL + LCCR3_VrtSnchL;
-	} else if (machine_is_xp860()) {
-		DPRINTK("Configuring XP860 LCD\n");
-		lcd_shadow.lccr0 = 
-			LCCR0_LEN + LCCR0_Color + LCCR0_Sngl + LCCR0_Act +
-			LCCR0_LtlEnd + LCCR0_LDM + LCCR0_ERM +
-			LCCR0_DMADel(0);
-		lcd_shadow.lccr1 = 
-			LCCR1_DisWdth(var->xres) + 
-			LCCR1_HorSnchWdth(var->hsync_len) +
-			LCCR1_BegLnDel(var->left_margin) +
-			LCCR1_EndLnDel(var->right_margin);
-		lcd_shadow.lccr2 = 
-			LCCR2_DisHght(var->yres) + 
-			LCCR2_VrtSnchWdth(var->vsync_len) +
-			LCCR2_BegFrmDel(var->upper_margin) +
-			LCCR2_EndFrmDel(var->lower_margin);
-		lcd_shadow.lccr3 = 
-			LCCR3_PixClkDiv(6) +
-			LCCR3_HorSnchL + LCCR3_VrtSnchL;
-	}
+	case C_ENABLE_CLKCHANGE:
+		/*
+		 * Enable the controller after clock change.  Only
+		 * do this if we were disabled for the clock change.
+		 */
+		if (old_state == C_DISABLE_CLKCHANGE) {
+			fbi->state = C_ENABLE;
+			sa1100fb_enable_controller(fbi);
+		}
+		break;
 
-	/* Restore interrupt status */
-	local_irq_restore(flags);
+	case C_REENABLE:
+		/*
+		 * Re-enable the controller only if it was already
+		 * enabled.  This is so we reprogram the control
+		 * registers.
+		 */
+		if (old_state == C_ENABLE) {
+			sa1100fb_disable_controller(fbi);
+			sa1100fb_setup_gpio(fbi);
+			sa1100fb_enable_controller(fbi);
+		}
+		break;
 
-	if (( LCCR0 != lcd_shadow.lccr0 ) ||
-	    ( LCCR1 != lcd_shadow.lccr1 ) ||
-	    ( LCCR2 != lcd_shadow.lccr2 ) ||
-            ( LCCR3 != lcd_shadow.lccr3 ) ||
-	    ( DBAR1 != lcd_shadow.dbar1 ) ||
-	    ( DBAR2 != lcd_shadow.dbar2 ))
-	{
-		sa1100fb_enable_lcd_controller();
+	case C_ENABLE:
+		/*
+		 * Power up the LCD screen, enable controller, and
+		 * turn on the backlight.
+		 */
+		if (old_state != C_ENABLE) {
+			fbi->state = C_ENABLE;
+			sa1100fb_setup_gpio(fbi);
+			sa1100fb_power_up_lcd(fbi);
+			sa1100fb_enable_controller(fbi);
+			sa1100fb_backlight_on(fbi);
+		}
+		break;
 	}
-
-  	return 0;
+	up(&fbi->ctrlr_sem);
 }
 
-
 /*
- *  sa1100fb_inter_handler():
- *	Interrupt handler for LCD controller.  Processes disable done interrupt (LDD)
- *      to reenable controller if controller was disabled to change register values.
+ * Our LCD controller task (which is called when we blank or unblank)
+ * via keventd.
  */
-static void sa1100fb_inter_handler(int irq, void *dev_id, struct pt_regs *regs)
+static void sa1100fb_task(void *dummy)
 {
-        if (LCSR & LCSR_LDD) {
-                int controller_state = current_par.controller_state;
-	        /* Disable Done Flag is set */
-		LCCR0 |= LCCR0_LDM;	      /* Mask LCD Disable Done Interrupt */
-		current_par.controller_state = LCD_MODE_DISABLED;
-		if (controller_state == LCD_MODE_DISABLE_BEFORE_ENABLE) {
-		        DPRINTK("sa1100fb_inter_handler: re-enabling LCD controller\n");
-			sa1100fb_enable_lcd_controller();
-		} else {
-			/*
-			 * Second half of sa1100fb_disable_lcd_controller()
-			 */
-			if (machine_is_assabet()) {
-#ifdef CONFIG_SA1100_ASSABET
-				BCR_clear(BCR_LCD_ON);
-#endif
-			} else if (machine_is_bitsy()) {
-#ifdef CONFIG_SA1100_BITSY
-		                if (current_par.controller_state != LCD_MODE_DISABLE_BEFORE_ENABLE)
-		                        clr_bitsy_egpio(EGPIO_BITSY_LCD_ON | EGPIO_BITSY_LCD_PCI | EGPIO_BITSY_LCD_5V_ON | EGPIO_BITSY_LVDD_ON);
-#endif
-			}
-		}
-	}
-	LCSR = 0;		      /* Clear LCD Status Register */
-}
+	struct sa1100fb_info *fbi = dummy;
+	u_int state = xchg(&fbi->task_state, -1);
 
+	set_ctrlr_state(fbi, state);
+}
 
+#ifdef CONFIG_CPU_FREQ
 /*
- *  sa1100fb_disable_lcd_controller():
- *    	Disables LCD controller by and enables LDD interrupt.  The controller_state
- *      is not changed until the LDD interrupt is received to indicate the current
- *      frame has completed.  Platform specific hardware disabling is also included.
+ * Calculate the minimum DMA period over all displays that we own.
+ * This, together with the SDRAM bandwidth defines the slowest CPU
+ * frequency that can be selected.
  */
-static void sa1100fb_disable_lcd_controller(void)
+static unsigned int sa1100fb_min_dma_period(struct sa1100fb_info *fbi)
 {
-        DPRINTK("Disabling LCD controller\n");
+	unsigned int min_period = (unsigned int)-1;
+	int i;
 
-	/* Exit if already LCD disabled, or LDD IRQ unmasked */
-	if ((current_par.controller_state == LCD_MODE_DISABLED) ||
-	    (!(LCCR0 & LCCR0_LDM))) {
-		DPRINTK("LCD already disabled\n");
-		return;
+	for (i = 0; i < MAX_NR_CONSOLES; i++) {
+		unsigned int period;
+
+		/*
+		 * Do we own this display?
+		 */
+		if (fb_display[i].fb_info != &fbi->fb)
+			continue;
+
+		/*
+		 * Ok, calculate its DMA period
+		 */
+		period = sa1100fb_display_dma_period(get_con_var(fbi, i));
+		if (period < min_period)
+			min_period = period;
 	}
 
-	LCSR = 0;	/* Clear LCD Status Register */
-	LCCR0 &= ~(LCCR0_LDM);	/* Enable LCD Disable Done Interrupt */
-	enable_irq(IRQ_LCD);	      /* Enable LCD IRQ */
-	LCCR0 &= ~(LCCR0_LEN);	/* Disable LCD Controller */
+	return min_period;
 }
 
 /*
- *  sa1100fb_enable_lcd_controller():
- *    	Enables LCD controller.  If the controller is already enabled, it is first disabled.
- *      This forces all changes to the LCD controller registers to be done when the 
- *      controller is disabled.  Platform specific hardware enabling is also included.
+ * CPU clock speed change handler.  We need to adjust the LCD timing
+ * parameters when the CPU clock is adjusted by the power management
+ * subsystem.
  */
-static void sa1100fb_enable_lcd_controller(void)
+static int
+sa1100fb_clkchg_notifier(struct notifier_block *nb, unsigned long val,
+			 void *data)
 {
-	u_long	flags;
-
-	local_irq_save(flags);		
+	struct sa1100fb_info *fbi = TO_INF(nb, clockchg);
+	struct cpufreq_minmax *mm = data;
+	u_int pcd;
+
+	switch (val) {
+	case CPUFREQ_MINMAX:
+		printk(KERN_DEBUG "min dma period: %d ps, old clock %d kHz, "
+			"new clock %d kHz\n", sa1100fb_min_dma_period(fbi),
+			mm->cur_freq, mm->new_freq);
+		/* todo: fill in min/max values */
+		break;
 
-        /* Disable controller before changing parameters */
-	if (current_par.controller_state == LCD_MODE_ENABLED) 	{
-		current_par.controller_state = LCD_MODE_DISABLE_BEFORE_ENABLE;
-		sa1100fb_disable_lcd_controller();
-	} else {
-		DPRINTK("Enabling LCD controller\n");
+	case CPUFREQ_PRECHANGE:
+		set_ctrlr_state(fbi, C_DISABLE_CLKCHANGE);
+		break;
 
-		/* Make sure the mode bits are present in the first palette entry */
-		current_par.v_palette_base[0] &= 0x0FFF; 	           
-		current_par.v_palette_base[0] |= SA1100_PALETTE_MODE_VAL(current_par.bits_per_pixel);
-
-		/* Enable GPIO<9:2> for LCD usage if dual-scan */
-		if (lcd_shadow.lccr0 & LCCR0_SDS) {
-		  GPDR |= 0x3fc;
-		  GAFR |= 0x3fc;
-		}
+	case CPUFREQ_POSTCHANGE:
+		pcd = get_pcd(fbi->fb.var.pixclock);
+		fbi->reg_lccr3 = (fbi->reg_lccr3 & ~0xff) | LCCR3_PixClkDiv(pcd);
+		set_ctrlr_state(fbi, C_ENABLE_CLKCHANGE);
+		break;
+	}
+	return 0;
+}
+#endif
 
-		/* Sequence from 11.7.10 */
-		LCCR3 = lcd_shadow.lccr3;
-		LCCR2 = lcd_shadow.lccr2;
-		LCCR1 = lcd_shadow.lccr1;
-		LCCR0 = lcd_shadow.lccr0 & ~LCCR0_LEN;
-		DBAR1 = lcd_shadow.dbar1;
-		DBAR2 = lcd_shadow.dbar2;
-		LCCR0 |= LCCR0_LEN;
+#ifdef CONFIG_PM
+/*
+ * Power management hook.  Note that we won't be called from IRQ context,
+ * unlike the blank functions above, so we may sleep.
+ */
+static int
+sa1100fb_pm_callback(struct pm_dev *pm_dev, pm_request_t req, void *data)
+{
+	struct sa1100fb_info *fbi = pm_dev->data;
 
-		if (machine_is_assabet()) {
-#ifdef CONFIG_SA1100_ASSABET
-			BCR_set(BCR_LCD_ON);
-#endif
-		} else if (machine_is_bitsy()) {
-#ifdef CONFIG_SA1100_BITSY
-                  set_bitsy_egpio(EGPIO_BITSY_LCD_ON | EGPIO_BITSY_LCD_PCI | EGPIO_BITSY_LCD_5V_ON | EGPIO_BITSY_LVDD_ON);
-			DPRINTK("DBAR1=%p\n", DBAR1);
-			DPRINTK("LCCR0=%x\n", LCCR0);
-			DPRINTK("LCCR1=%x\n", LCCR1);
-			DPRINTK("LCCR2=%x\n", LCCR2);
-			DPRINTK("LCCR3=%x\n", LCCR3);
-#endif
-		}
+	DPRINTK("pm_callback: %d\n", req);
 
-		current_par.controller_state = LCD_MODE_ENABLED;
+	if (req == PM_SUSPEND || req == PM_RESUME) {
+		int state = (int)data;
 
+		if (state == 0) {
+			/* Enter D0. */
+			set_ctrlr_state(fbi, C_ENABLE);
+		} else {
+			/* Enter D1-D3.  Disable the LCD controller.  */
+			set_ctrlr_state(fbi, C_DISABLE);
+		}
 	}
-	/* Restore interrupt status */
-	local_irq_restore(flags);
+	DPRINTK("done\n");
+	return 0;
 }
+#endif
 
 /*
- * sa1100fb_blank():
- *	Blank the display by setting all palette values to zero.  Note, the 
- * 	12 and 16 bpp modes don't really use the palette, so this will not
- *      blank the display in all modes.  
+ * sa1100fb_map_video_memory():
+ *      Allocates the DRAM memory for the frame buffer.  This buffer is  
+ *	remapped into a non-cached, non-buffered, memory region to  
+ *      allow palette and pixel writes to occur without flushing the 
+ *      cache.  Once this area is remapped, all virtual memory
+ *      access to the video memory should occur at the new region.
  */
-static void
-sa1100fb_blank(int blank, struct fb_info *info)
+static int __init sa1100fb_map_video_memory(struct sa1100fb_info *fbi)
 {
-	int i;
+	/*
+	 * We reserve one page for the palette, plus the size
+	 * of the framebuffer.
+	 */
+	fbi->map_size = PAGE_ALIGN(fbi->fb.fix.smem_len + PAGE_SIZE);
+	fbi->map_cpu = consistent_alloc(GFP_KERNEL, fbi->map_size,
+					&fbi->map_dma);
 
-  	DPRINTK("blank=%d info->modename=%s\n", blank, info->modename);
-	if (blank) {
-                if (current_par.visual != FB_VISUAL_TRUECOLOR)
-		for (i = 0; i < current_par.palette_size; i++)
-			sa1100fb_palette_write(i, sa1100fb_palette_encode(i, 0, 0, 0, 0));
-		sa1100fb_disable_lcd_controller();
-	}
-	else {
-                if (current_par.visual != FB_VISUAL_TRUECOLOR)
-		sa1100fb_set_cmap(&fb_display[current_par.currcon].cmap, 1, 
-		                  current_par.currcon, info); 
-		sa1100fb_enable_lcd_controller();
+	if (fbi->map_cpu) {
+		fbi->screen_cpu = fbi->map_cpu + PAGE_SIZE;
+		fbi->screen_dma = fbi->map_dma + PAGE_SIZE;
+		fbi->fb.fix.smem_start = fbi->screen_dma;
 	}
-	/* TODO: Bitsy support for blanking display */
+
+	return fbi->map_cpu ? 0 : -ENOMEM;
 }
 
+/* Fake monspecs to fill in fbinfo structure */
+static struct fb_monspecs monspecs __initdata = {
+	30000, 70000, 50, 65, 0	/* Generic */
+};
 
-/*
- *  sa1100fb_switch():       
- *	Change to the specified console.  Palette and video mode
- *      are changed to the console's stored parameters. 
- */
-static int
-sa1100fb_switch(int con, struct fb_info *info)
-{
 
-  	DPRINTK("con=%d info->modename=%s\n", con, info->modename);
-        if (current_par.visual != FB_VISUAL_TRUECOLOR) {
-                struct fb_cmap *cmap;
-		if (current_par.currcon >= 0) {
-			// Get the colormap for the selected console 
-			cmap = &fb_display[current_par.currcon].cmap;
-			
-			if (cmap->len)
-				fb_get_cmap(cmap, 1, sa1100fb_getcolreg, info);
-		}
-        }
+static struct sa1100fb_info * __init sa1100fb_init_fbinfo(void)
+{
+	struct sa1100fb_mach_info *inf;
+	struct sa1100fb_info *fbi;
 
-	current_par.currcon = con;
-	fb_display[con].var.activate = FB_ACTIVATE_NOW;
-	DPRINTK("fb_display[%d].var.activate=%x\n", con, fb_display[con].var.activate);
-	sa1100fb_set_var(&fb_display[con].var, con, info);
-	current_par.v_palette_base[0] = (current_par.v_palette_base[0] &
-		0xcfff) | SA1100_PALETTE_MODE_VAL(current_par.bits_per_pixel);
+	fbi = kmalloc(sizeof(struct sa1100fb_info) + sizeof(struct display) +
+		      sizeof(u16) * 16, GFP_KERNEL);
+	if (!fbi)
+		return NULL;
+
+	memset(fbi, 0, sizeof(struct sa1100fb_info) + sizeof(struct display));
+
+	fbi->currcon		= -1;
+
+	strcpy(fbi->fb.fix.id, SA1100_NAME);
+
+	fbi->fb.fix.type	= FB_TYPE_PACKED_PIXELS;
+	fbi->fb.fix.type_aux	= 0;
+	fbi->fb.fix.xpanstep	= 0;
+	fbi->fb.fix.ypanstep	= 0;
+	fbi->fb.fix.ywrapstep	= 0;
+	fbi->fb.fix.accel	= FB_ACCEL_NONE;
+
+	fbi->fb.var.nonstd	= 0;
+	fbi->fb.var.activate	= FB_ACTIVATE_NOW;
+	fbi->fb.var.height	= -1;
+	fbi->fb.var.width	= -1;
+	fbi->fb.var.accel_flags	= 0;
+	fbi->fb.var.vmode	= FB_VMODE_NONINTERLACED;
+
+	strcpy(fbi->fb.modename, SA1100_NAME);
+	strcpy(fbi->fb.fontname, "Acorn8x8");
+
+	fbi->fb.fbops		= &sa1100fb_ops;
+	fbi->fb.changevar	= NULL;
+	fbi->fb.switch_con	= sa1100fb_switch;
+	fbi->fb.updatevar	= sa1100fb_updatevar;
+	fbi->fb.blank		= sa1100fb_blank;
+	fbi->fb.flags		= FBINFO_FLAG_DEFAULT;
+	fbi->fb.node		= -1;
+	fbi->fb.monspecs	= monspecs;
+	fbi->fb.disp		= (struct display *)(fbi + 1);
+	fbi->fb.pseudo_palette	= (void *)(fbi->fb.disp + 1);
+
+	fbi->rgb[RGB_8]		= &rgb_8;
+	fbi->rgb[RGB_16]	= &def_rgb_16;
+
+	inf = sa1100fb_get_machine_info(fbi);
+
+	fbi->max_xres			= inf->xres;
+	fbi->fb.var.xres		= inf->xres;
+	fbi->fb.var.xres_virtual	= inf->xres;
+	fbi->max_yres			= inf->yres;
+	fbi->fb.var.yres		= inf->yres;
+	fbi->fb.var.yres_virtual	= inf->yres;
+	fbi->max_bpp			= inf->bpp;
+	fbi->fb.var.bits_per_pixel	= inf->bpp;
+	fbi->fb.var.pixclock		= inf->pixclock;
+	fbi->fb.var.hsync_len		= inf->hsync_len;
+	fbi->fb.var.left_margin		= inf->left_margin;
+	fbi->fb.var.right_margin	= inf->right_margin;
+	fbi->fb.var.vsync_len		= inf->vsync_len;
+	fbi->fb.var.upper_margin	= inf->upper_margin;
+	fbi->fb.var.lower_margin	= inf->lower_margin;
+	fbi->fb.var.sync		= inf->sync;
+	fbi->fb.var.grayscale		= inf->cmap_greyscale;
+	fbi->cmap_inverse		= inf->cmap_inverse;
+	fbi->cmap_static		= inf->cmap_static;
+	fbi->lccr0			= inf->lccr0;
+	fbi->lccr3			= inf->lccr3;
+	fbi->state			= C_DISABLE;
+	fbi->task_state			= (u_char)-1;
+	fbi->fb.fix.smem_len		= fbi->max_xres * fbi->max_yres *
+					  fbi->max_bpp / 8;
+
+	init_waitqueue_head(&fbi->ctrlr_wait);
+	INIT_TQUEUE(&fbi->task, sa1100fb_task, fbi);
+	init_MUTEX(&fbi->ctrlr_sem);
 
-	return 0;
+	return fbi;
 }
 
-
 int __init sa1100fb_init(void)
 {
+	struct sa1100fb_info *fbi;
 	int ret;
 
-	sa1100fb_init_fbinfo();
+	fbi = sa1100fb_init_fbinfo();
+	ret = -ENOMEM;
+	if (!fbi)
+		goto failed;
 
 	/* Initialize video memory */
-	if ((ret = sa1100fb_map_video_memory()) != 0)
-		return ret;
+	ret = sa1100fb_map_video_memory(fbi);
+	if (ret)
+		goto failed;
+
+	ret = request_irq(IRQ_LCD, sa1100fb_handle_irq, SA_INTERRUPT,
+			  fbi->fb.fix.id, fbi);
+	if (ret) {
+		printk(KERN_ERR "sa1100fb: failed in request_irq: %d\n", ret);
+		goto failed;
+	}
 
-	if (current_par.montype < 0 || current_par.montype > NR_MONTYPES)
-		current_par.montype = 1;
+#if defined(CONFIG_SA1100_ASSABET) && defined(ASSABET_PAL_VIDEO)
+	if (machine_is_assabet())
+		BCR_clear(BCR_LCD_ON);
+#endif
 
-	if (request_irq(IRQ_LCD, sa1100fb_inter_handler, SA_INTERRUPT, "SA1100 LCD", NULL) != 0) {
-		printk(KERN_ERR "sa1100fb: failed in request_irq\n");
-		return -EBUSY;
+#ifdef CONFIG_SA1100_FREEBIRD
+#error Please move this into sa1100fb_power_up_lcd
+	if (machine_is_freebird()) {
+		BCR_set(BCR_FREEBIRD_LCD_DISP);
+		mdelay(20);
+		BCR_set(BCR_FREEBIRD_LCD_PWR);
+		mdelay(20);
 	}
-	DPRINTK("sa1100fb: request_irq succeeded\n");
-	disable_irq(IRQ_LCD);
+#endif
 
-	if (machine_is_assabet()) {
-		GPDR |= 0x3fc;
-		GAFR |= 0x3fc;
-		sa1100fb_assabet_set_truecolor(current_par.visual ==
-					       FB_VISUAL_TRUECOLOR);
-	} else if (machine_is_pangolin()) {
-		GPDR |= 0x3fc;
-		GAFR |= 0x3fc;
-	} else if (machine_is_bitsy()) {
-		GPDR = (GPIO_LDD15 | GPIO_LDD14 | GPIO_LDD13 | GPIO_LDD12 | GPIO_LDD11 | GPIO_LDD10 | GPIO_LDD9 | GPIO_LDD8);
-		GAFR |= (GPIO_LDD15 | GPIO_LDD14 | GPIO_LDD13 | GPIO_LDD12 | GPIO_LDD11 | GPIO_LDD10 | GPIO_LDD9 | GPIO_LDD8);
-	} else if (machine_is_cerf()) {
-		GPDR |= 0x3fc;
-		GAFR |= 0x3fc;
-	} else if (machine_is_xp860()) {
-		GPDR |= 0x3fc;
-		GAFR |= 0x3fc;
-	}
-
-	if (sa1100fb_set_var(&init_var, -1, &fb_info))
-		current_par.allow_modeset = 0;
-	sa1100fb_decode_var(&init_var, &current_par);
+	sa1100fb_set_var(&fbi->fb.var, -1, &fbi->fb);
+
+	ret = register_framebuffer(&fbi->fb);
+	if (ret < 0)
+		goto failed;
+
+#ifdef CONFIG_PM
+	/*
+	 * Note that the console registers this as well, but we want to
+	 * power down the display prior to sleeping.
+	 */
+	fbi->pm = pm_register(PM_SYS_DEV, PM_SYS_VGA, sa1100fb_pm_callback);
+	if (fbi->pm)
+		fbi->pm->data = fbi;
+#endif
+#ifdef CONFIG_CPU_FREQ
+	fbi->clockchg.notifier_call = sa1100fb_clkchg_notifier;
+	cpufreq_register_notifier(&fbi->clockchg);
+#endif
 
-	register_framebuffer(&fb_info);
+	/*
+	 * Ok, now enable the LCD controller
+	 */
+	set_ctrlr_state(fbi, C_ENABLE);
 
 	/* This driver cannot be unloaded at the moment */
 	MOD_INC_USE_COUNT;
 
 	return 0;
+
+failed:
+	if (fbi)
+		kfree(fbi);
+	return ret;
 }
 
 int __init sa1100fb_setup(char *options)
 {
+#if 0
 	char *this_opt;
 
 	if (!options || !*options)
@@ -1285,24 +2302,33 @@
 	for (this_opt = strtok(options, ","); this_opt;
 	     this_opt = strtok(NULL, ",")) {
 
-	  if (!strncmp(this_opt, "bpp:", 4))
- 	    current_par.max_bpp = simple_strtoul(this_opt+4, NULL, 0);
-
-	  if (!strncmp(this_opt, "lccr0:", 6))
-	    lcd_shadow.lccr0 = simple_strtoul(this_opt+6, NULL, 0);
-	  if (!strncmp(this_opt, "lccr1:", 6)) {
-	    lcd_shadow.lccr1 = simple_strtoul(this_opt+6, NULL, 0);
-	    current_par.max_xres = (lcd_shadow.lccr1 & 0x3ff) + 16;
-	  }
-	  if (!strncmp(this_opt, "lccr2:", 6)) {
-	    lcd_shadow.lccr2 = simple_strtoul(this_opt+6, NULL, 0);
-	    current_par.max_yres = (lcd_shadow.lccr0 & LCCR0_SDS) ? 
-	      ((lcd_shadow.lccr2 & 0x3ff) + 1) * 2 :
-	      ((lcd_shadow.lccr2 & 0x3ff) + 1);
-	  }
-	  if (!strncmp(this_opt, "lccr3:", 6))
-	    lcd_shadow.lccr3 = simple_strtoul(this_opt+6, NULL, 0);
+		if (!strncmp(this_opt, "bpp:", 4))
+			current_par.max_bpp =
+			    simple_strtoul(this_opt + 4, NULL, 0);
+
+		if (!strncmp(this_opt, "lccr0:", 6))
+			lcd_shadow.lccr0 =
+			    simple_strtoul(this_opt + 6, NULL, 0);
+		if (!strncmp(this_opt, "lccr1:", 6)) {
+			lcd_shadow.lccr1 =
+			    simple_strtoul(this_opt + 6, NULL, 0);
+			current_par.max_xres =
+			    (lcd_shadow.lccr1 & 0x3ff) + 16;
+		}
+		if (!strncmp(this_opt, "lccr2:", 6)) {
+			lcd_shadow.lccr2 =
+			    simple_strtoul(this_opt + 6, NULL, 0);
+			current_par.max_yres =
+			    (lcd_shadow.
+			     lccr0 & LCCR0_SDS) ? ((lcd_shadow.
+						    lccr2 & 0x3ff) +
+						   1) *
+			    2 : ((lcd_shadow.lccr2 & 0x3ff) + 1);
+		}
+		if (!strncmp(this_opt, "lccr3:", 6))
+			lcd_shadow.lccr3 =
+			    simple_strtoul(this_opt + 6, NULL, 0);
 	}
+#endif
 	return 0;
 }
-
diff -u --recursive --new-file v2.4.8/linux/drivers/video/sa1100fb.h linux/drivers/video/sa1100fb.h
--- v2.4.8/linux/drivers/video/sa1100fb.h	Wed Dec 31 16:00:00 1969
+++ linux/drivers/video/sa1100fb.h	Sun Aug 12 17:37:53 2001
@@ -0,0 +1,147 @@
+/*
+ * linux/drivers/video/sa1100fb.h
+ *    -- StrongARM 1100 LCD Controller Frame Buffer Device
+ *
+ *  Copyright (C) 1999 Eric A. Thomas
+ *   Based on acornfb.c Copyright (C) Russell King.
+ *  
+ * 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 more details.
+ */
+
+/*
+ * These are the bitfields for each
+ * display depth that we support.
+ */
+struct sa1100fb_rgb {
+	struct fb_bitfield	red;
+	struct fb_bitfield	green;
+	struct fb_bitfield	blue;
+	struct fb_bitfield	transp;
+};
+
+/*
+ * This structure describes the machine which we are running on.
+ */
+struct sa1100fb_mach_info {
+	u_long		pixclock;
+
+	u_short		xres;
+	u_short		yres;
+
+	u_char		bpp;
+	u_char		hsync_len;
+	u_char		left_margin;
+	u_char		right_margin;
+
+	u_char		vsync_len;
+	u_char		upper_margin;
+	u_char		lower_margin;
+	u_char		sync;
+
+	u_int		cmap_greyscale:1,
+			cmap_inverse:1,
+			cmap_static:1,
+			unused:29;
+
+	u_int		lccr0;
+	u_int		lccr3;
+};
+
+/* Shadows for LCD controller registers */
+struct sa1100fb_lcd_reg {
+	Word lccr0;
+	Word lccr1;
+	Word lccr2;
+	Word lccr3;
+};
+
+#define RGB_8	(0)
+#define RGB_16	(1)
+#define NR_RGB	2
+
+struct sa1100fb_info {
+	struct fb_info		fb;
+	signed int		currcon;
+
+	struct sa1100fb_rgb	*rgb[NR_RGB];
+
+	u_int			max_bpp;
+	u_int			max_xres;
+	u_int			max_yres;
+
+	/*
+	 * These are the addresses we mapped
+	 * the framebuffer memory region to.
+	 */
+	dma_addr_t		map_dma;
+	u_char *		map_cpu;
+	u_int			map_size;
+
+	u_char *		screen_cpu;
+	dma_addr_t		screen_dma;
+	u16 *			palette_cpu;
+	dma_addr_t		palette_dma;
+	u_int			palette_size;
+
+	dma_addr_t		dbar1;
+	dma_addr_t		dbar2;
+
+	u_int			lccr0;
+	u_int			lccr3;
+	u_int			cmap_inverse:1,
+				cmap_static:1,
+				unused:30;
+
+	u_int			reg_lccr0;
+	u_int			reg_lccr1;
+	u_int			reg_lccr2;
+	u_int			reg_lccr3;
+
+	volatile u_char		state;
+	volatile u_char		task_state;
+	struct semaphore	ctrlr_sem;
+	wait_queue_head_t	ctrlr_wait;
+	struct tq_struct	task;
+
+#ifdef CONFIG_PM
+	struct pm_dev		*pm;
+#endif
+#ifdef CONFIG_CPU_FREQ
+	struct notifier_block	clockchg;
+#endif
+};
+
+#define __type_entry(ptr,type,member) ((type *)((char *)(ptr)-offsetof(type,member)))
+
+#define TO_INF(ptr,member)	__type_entry(ptr,struct sa1100fb_info,member)
+
+#define SA1100_PALETTE_MODE_VAL(bpp)    (((bpp) & 0x018) << 9)
+
+/*
+ * These are the actions for set_ctrlr_state
+ */
+#define C_DISABLE		(0)
+#define C_ENABLE		(1)
+#define C_DISABLE_CLKCHANGE	(2)
+#define C_ENABLE_CLKCHANGE	(3)
+#define C_REENABLE		(4)
+
+#define SA1100_NAME	"SA1100"
+
+/*
+ *  Debug macros 
+ */
+#if DEBUG
+#  define DPRINTK(fmt, args...)	printk("%s: " fmt, __FUNCTION__ , ## args)
+#else
+#  define DPRINTK(fmt, args...)
+#endif
+
+/*
+ * Minimum X and Y resolutions
+ */
+#define MIN_XRES	64
+#define MIN_YRES	64
+
diff -u --recursive --new-file v2.4.8/linux/drivers/video/sis/sis_main.c linux/drivers/video/sis/sis_main.c
--- v2.4.8/linux/drivers/video/sis/sis_main.c	Fri May  4 15:10:17 2001
+++ linux/drivers/video/sis/sis_main.c	Sun Aug 12 10:51:42 2001
@@ -8,7 +8,6 @@
  *
  */
 
-#define EXPORT_SYMTAB
 #undef  SISFBDEBUG
 
 #include <linux/config.h>
diff -u --recursive --new-file v2.4.8/linux/drivers/video/sticon-bmode.c linux/drivers/video/sticon-bmode.c
--- v2.4.8/linux/drivers/video/sticon-bmode.c	Fri Feb  9 11:30:23 2001
+++ linux/drivers/video/sticon-bmode.c	Sun Aug 12 10:51:42 2001
@@ -473,8 +473,9 @@
 		offset++;
 		dest++;
 	}
-	__flush_dcache_range(dest, count);
-	__flush_icache_range(dest, count);
+
+	flush_kernel_dcache_range((unsigned long)dest, count);
+	flush_icache_range((unsigned long)dest, dest + count);
 }
 
 static void dump_sti_rom(struct sti_rom *rom)
diff -u --recursive --new-file v2.4.8/linux/drivers/video/sticore.c linux/drivers/video/sticore.c
--- v2.4.8/linux/drivers/video/sticore.c	Fri Feb  9 11:30:23 2001
+++ linux/drivers/video/sticore.c	Sun Aug 12 10:51:42 2001
@@ -208,8 +208,9 @@
 		offset++;
 		dest++;
 	}
-	__flush_dcache_range((unsigned long) dest, count);
-	__flush_icache_range((unsigned long) dest, count);
+
+	flush_kernel_dcache_range((unsigned long)dest, count);
+	flush_icache_range((unsigned long)dest, dest + count);
 }
 
 static void dump_sti_rom(struct sti_rom *rom)
diff -u --recursive --new-file v2.4.8/linux/drivers/video/tdfxfb.c linux/drivers/video/tdfxfb.c
--- v2.4.8/linux/drivers/video/tdfxfb.c	Wed Jul 25 17:10:24 2001
+++ linux/drivers/video/tdfxfb.c	Sun Aug 12 10:51:42 2001
@@ -19,6 +19,11 @@
  * (proper acceleration, 24 bpp, hardware cursor) and bug fixes by Attila
  * Kesmarki. Thanks guys!
  * 
+ * Voodoo1 and Voodoo2 support aren't relevant to this driver as they
+ * behave very differently from the Voodoo3/4/5. For anyone wanting to
+ * use frame buffer on the Voodoo1/2, see the sstfb driver (which is
+ * located at http://www.sourceforge.net/projects/sstfb).
+ *
  * While I _am_ grateful to 3Dfx for releasing the specs for Banshee,
  * I do wish the next version is a bit more complete. Without the XF86
  * patches I couldn't have gotten even this far... for instance, the
@@ -32,9 +37,6 @@
  * TODO:
  * - support for 16/32 bpp needs fixing (funky bootup penguin)
  * - multihead support (basically need to support an array of fb_infos)
- * - banshee and voodoo3 now supported -- any others? afaik, the original
- *   voodoo was a 3d-only card, so we won't consider that. what about
- *   voodoo2?
  * - support other architectures (PPC, Alpha); does the fact that the VGA
  *   core can be accessed only thru I/O (not memory mapped) complicate
  *   things?
@@ -385,12 +387,6 @@
 			   int kspc, 
 			   int con,
 			   struct fb_info* info);
-static int tdfxfb_ioctl(struct inode* inode, 
-			struct file* file, 
-			u_int cmd,
-			u_long arg, 
-			int con, 
-			struct fb_info* info);
 
 /*
  *  Interface to the low level console driver
@@ -464,6 +460,12 @@
 void tdfxfb_setup(char *options, 
 		  int *ints);
 
+/*
+ * PCI driver prototypes
+ */
+static int tdfxfb_probe(struct pci_dev *pdev, const struct pci_device_id *id);
+static void tdfxfb_remove(struct pci_dev *pdev);
+
 static int currcon = 0;
 
 static struct fb_ops tdfxfb_ops = {
@@ -474,9 +476,30 @@
 	fb_get_cmap:	tdfxfb_get_cmap,
 	fb_set_cmap:	tdfxfb_set_cmap,
 	fb_pan_display:	tdfxfb_pan_display,
-	fb_ioctl:	tdfxfb_ioctl,
 };
 
+static struct pci_device_id tdfxfb_id_table[] __devinitdata = {
+	{ PCI_VENDOR_ID_3DFX, PCI_DEVICE_ID_3DFX_BANSHEE,
+	  PCI_ANY_ID, PCI_ANY_ID, PCI_BASE_CLASS_DISPLAY << 16,
+	  0xff0000, 0 },
+	{ PCI_VENDOR_ID_3DFX, PCI_DEVICE_ID_3DFX_VOODOO3,
+	  PCI_ANY_ID, PCI_ANY_ID, PCI_BASE_CLASS_DISPLAY << 16,
+	  0xff0000, 0 },
+	{ PCI_VENDOR_ID_3DFX, PCI_DEVICE_ID_3DFX_VOODOO5,
+	  PCI_ANY_ID, PCI_ANY_ID, PCI_BASE_CLASS_DISPLAY << 16,
+	  0xff0000, 0 },
+	{ 0, }
+};
+
+static struct pci_driver tdfxfb_driver = {
+	name:		"tdfxfb",
+	id_table:	tdfxfb_id_table,
+	probe:		tdfxfb_probe,
+	remove:		tdfxfb_remove,
+};
+
+MODULE_DEVICE_TABLE(pci, tdfxfb_id_table);
+
 struct mode {
   char* name;
   struct fb_var_screeninfo var;
@@ -1865,170 +1888,160 @@
    return 0;
 }
 
-static int tdfxfb_ioctl(struct inode *inode, 
-			struct file *file, 
-			u_int cmd,
-			u_long arg, 
-			int con, 
-			struct fb_info *fb) {
-/* These IOCTLs ar just for testing only... 
-   switch (cmd) {
-    case 0x4680: 
-      nowrap=nopan=0;
-      return 0;
-    case 0x4681:
-      nowrap=nopan=1;
-      return 0;
-   }*/
-   return -EINVAL;
-}
+/**
+ * 	tdfxfb_probe - Device Initializiation
+ * 	
+ * 	@pdev:	PCI Device to initialize
+ * 	@id:	PCI Device ID
+ *
+ * 	Initializes and allocates resources for PCI device @pdev.
+ *
+ */
+static int __devinit tdfxfb_probe(struct pci_dev *pdev,
+				  const struct pci_device_id *id)
+{
+	struct fb_var_screeninfo var;
+	char *name = NULL;
 
-int __init tdfxfb_init(void) {
-  struct pci_dev *pdev = NULL;
-  struct fb_var_screeninfo var;
-  
-  while ((pdev = pci_find_device(PCI_VENDOR_ID_3DFX, PCI_ANY_ID, pdev))) {
-    if(((pdev->class >> 16) == PCI_BASE_CLASS_DISPLAY) &&
-       ((pdev->device == PCI_DEVICE_ID_3DFX_BANSHEE) ||
-	(pdev->device == PCI_DEVICE_ID_3DFX_VOODOO3) ||
-	(pdev->device == PCI_DEVICE_ID_3DFX_VOODOO5))) {
-      char *name = NULL;
-
-      fb_info.dev   = pdev->device;
-      switch (pdev->device) {
-      case PCI_DEVICE_ID_3DFX_BANSHEE:
-	fb_info.max_pixclock = BANSHEE_MAX_PIXCLOCK;
-	name = "Banshee";
-	break;
-      case PCI_DEVICE_ID_3DFX_VOODOO3:
-	fb_info.max_pixclock = VOODOO3_MAX_PIXCLOCK;
-	name = "Voodoo3";
-	break;
-      case PCI_DEVICE_ID_3DFX_VOODOO5:
-	fb_info.max_pixclock = VOODOO5_MAX_PIXCLOCK;
-	name = "Voodoo5";
-	break;
-      }
-      fb_info.regbase_phys = pci_resource_start(pdev, 0);
-      fb_info.regbase_size = 1 << 24;
-      fb_info.regbase_virt = ioremap_nocache(fb_info.regbase_phys, 1 << 24);
-      if(!fb_info.regbase_virt) {
-	printk("fb: Can't remap %s register area.\n", name);
-	return -ENXIO;
-      }
+	fb_info.dev = pdev->device;
+	
+	switch (pdev->device) {
+		case PCI_DEVICE_ID_3DFX_BANSHEE:
+			fb_info.max_pixclock = BANSHEE_MAX_PIXCLOCK;
+			name = "Banshee";
+			break;
+		case PCI_DEVICE_ID_3DFX_VOODOO3:
+			fb_info.max_pixclock = VOODOO3_MAX_PIXCLOCK;
+			name = "Voodoo3";
+			break;
+		case PCI_DEVICE_ID_3DFX_VOODOO5:
+			fb_info.max_pixclock = VOODOO5_MAX_PIXCLOCK;
+			name = "Voodoo5";
+			break;
+	}
+	
+	fb_info.regbase_phys = pci_resource_start(pdev, 0);
+	fb_info.regbase_size = 1 << 24;
+	fb_info.regbase_virt = ioremap_nocache(fb_info.regbase_phys, 1 << 24);
+	
+	if (!fb_info.regbase_virt) {
+		printk(KERN_WARNING "fb: Can't remap %s register area.\n", name);
+		return -ENXIO;
+	}
       
-      fb_info.bufbase_phys = pci_resource_start (pdev, 1);
-      if(!(fb_info.bufbase_size = do_lfb_size())) {
-	iounmap(fb_info.regbase_virt);
-	printk("fb: Can't count %s memory.\n", name);
-	return -ENXIO;
-      }
-      fb_info.bufbase_virt = ioremap_nocache(fb_info.bufbase_phys, fb_info.bufbase_size);
-      if(!fb_info.regbase_virt) {
-	printk("fb: Can't remap %s framebuffer.\n", name);
-	iounmap(fb_info.regbase_virt);
-	return -ENXIO;
-      }
+	fb_info.bufbase_phys = pci_resource_start (pdev, 1);
+	
+	if (!(fb_info.bufbase_size = do_lfb_size())) {
+		iounmap(fb_info.regbase_virt);
+		printk(KERN_WARNING "fb: Can't count %s memory.\n", name);
+		return -ENXIO;
+	}
+	
+	fb_info.bufbase_virt = ioremap_nocache(fb_info.bufbase_phys,
+					       fb_info.bufbase_size);
+					       
+	if (!fb_info.regbase_virt) {
+		printk(KERN_WARNING "fb: Can't remap %s framebuffer.\n", name);
+		iounmap(fb_info.regbase_virt);
+		return -ENXIO;
+	}
 
-      fb_info.iobase = pci_resource_start (pdev, 2);
+	fb_info.iobase = pci_resource_start (pdev, 2);
       
-      printk("fb: %s memory = %ldK\n", name, fb_info.bufbase_size >> 10);
+	printk("fb: %s memory = %ldK\n", name, fb_info.bufbase_size >> 10);
 
 #ifdef CONFIG_MTRR
-       if (!nomtrr) {
-          fb_info.mtrr_idx = mtrr_add(fb_info.bufbase_phys, fb_info.bufbase_size,
-	  			      MTRR_TYPE_WRCOMB, 1);
-	    printk("fb: MTRR's  turned on\n");
-       }
+	if (!nomtrr) {
+		fb_info.mtrr_idx = mtrr_add(fb_info.bufbase_phys,
+					    fb_info.bufbase_size,
+					    MTRR_TYPE_WRCOMB, 1);
+		printk(KERN_INFO "fb: MTRR's turned on\n");
+	}
 #endif
 
-      /* clear framebuffer memory */
-      memset_io(fb_info.bufbase_virt, 0, fb_info.bufbase_size);
-      currcon = -1;
-      if (!nohwcursor) tdfxfb_hwcursor_init();
+	/* clear framebuffer memory */
+	memset_io(fb_info.bufbase_virt, 0, fb_info.bufbase_size);
+	currcon = -1;
+
+	if (!nohwcursor)
+		tdfxfb_hwcursor_init();
        
-      init_timer(&fb_info.cursor.timer);
-      fb_info.cursor.timer.function = do_flashcursor; 
-      fb_info.cursor.timer.data = (unsigned long)(&fb_info);
-      fb_info.cursor.state = CM_ERASE;
-      spin_lock_init(&fb_info.DAClock);
+	init_timer(&fb_info.cursor.timer);
+	fb_info.cursor.timer.function = do_flashcursor; 
+	fb_info.cursor.timer.data = (unsigned long)(&fb_info);
+	fb_info.cursor.state = CM_ERASE;
+	spin_lock_init(&fb_info.DAClock);
        
-      strcpy(fb_info.fb_info.modename, "3Dfx "); 
-      strcat(fb_info.fb_info.modename, name);
-      fb_info.fb_info.changevar  = NULL;
-      fb_info.fb_info.node       = -1;
-      fb_info.fb_info.fbops      = &tdfxfb_ops;
-      fb_info.fb_info.disp       = &fb_info.disp;
-      strcpy(fb_info.fb_info.fontname, fontname);
-      fb_info.fb_info.switch_con = &tdfxfb_switch_con;
-      fb_info.fb_info.updatevar  = &tdfxfb_updatevar;
-      fb_info.fb_info.blank      = &tdfxfb_blank;
-      fb_info.fb_info.flags      = FBINFO_FLAG_DEFAULT;
-      
-      memset(&var, 0, sizeof(var));
-      if(!mode_option || 
-	 !fb_find_mode(&var, &fb_info.fb_info, mode_option, NULL, 0, NULL, 8))
-	var = default_mode[0].var;
-      
-      if(noaccel) var.accel_flags &= ~FB_ACCELF_TEXT;
-      else var.accel_flags |= FB_ACCELF_TEXT;
-      
-      if(tdfxfb_decode_var(&var, &fb_info.default_par, &fb_info)) {
-	/* ugh -- can't use the mode from the mode db. (or command line),
-	   so try the default */
-
-	printk("tdfxfb: "
-	       "can't decode the supplied video mode, using default\n");
-
-	var = default_mode[0].var;
-	if(noaccel) var.accel_flags &= ~FB_ACCELF_TEXT;
-	else var.accel_flags |= FB_ACCELF_TEXT;
+	strcpy(fb_info.fb_info.modename, "3Dfx "); 
+	strcat(fb_info.fb_info.modename, name);
+	fb_info.fb_info.changevar  = NULL;
+	fb_info.fb_info.node       = -1;
+	fb_info.fb_info.fbops      = &tdfxfb_ops;
+	fb_info.fb_info.disp       = &fb_info.disp;
+	strcpy(fb_info.fb_info.fontname, fontname);
+	fb_info.fb_info.switch_con = &tdfxfb_switch_con;
+	fb_info.fb_info.updatevar  = &tdfxfb_updatevar;
+	fb_info.fb_info.blank      = &tdfxfb_blank;
+	fb_info.fb_info.flags      = FBINFO_FLAG_DEFAULT;
       
-	if(tdfxfb_decode_var(&var, &fb_info.default_par, &fb_info)) {
-	  /* this is getting really bad!... */
-	  printk("tdfxfb: can't decode default video mode\n");
-	  return -ENXIO;
+	memset(&var, 0, sizeof(var));
+	
+	if (!mode_option || !fb_find_mode(&var, &fb_info.fb_info,
+					  mode_option, NULL, 0, NULL, 8))
+		var = default_mode[0].var;
+
+	noaccel ? (var.accel_flags &= ~FB_ACCELF_TEXT) :
+		  (var.accel_flags |=  FB_ACCELF_TEXT) ;
+
+	if (tdfxfb_decode_var(&var, &fb_info.default_par, &fb_info)) {
+		/* 
+		 * ugh -- can't use the mode from the mode db. (or command
+		 * line), so try the default
+		 */
+
+		printk(KERN_NOTICE "tdfxfb: can't decode the supplied video mode, using default\n");
+
+		var = default_mode[0].var;
+
+		noaccel ? (var.accel_flags &= ~FB_ACCELF_TEXT) :
+			  (var.accel_flags |=  FB_ACCELF_TEXT) ;
+
+		if (tdfxfb_decode_var(&var, &fb_info.default_par, &fb_info)) {
+			/* this is getting really bad!... */
+			printk(KERN_WARNING "tdfxfb: can't decode default video mode\n");
+			return -ENXIO;
+		}
 	}
-      }
-      
-      fb_info.disp.screen_base    = fb_info.bufbase_virt;
-      fb_info.disp.var            = var;
-      
-      if(tdfxfb_set_var(&var, -1, &fb_info.fb_info)) {
-	printk("tdfxfb: can't set default video mode\n");
-	return -ENXIO;
-      }
-      
-      if(register_framebuffer(&fb_info.fb_info) < 0) {
-	printk("tdfxfb: can't register framebuffer\n");
-	return -ENXIO;
-      }
 
-      printk("fb%d: %s frame buffer device\n", 
-	     GET_FB_IDX(fb_info.fb_info.node),
-	     fb_info.fb_info.modename);
+	fb_info.disp.screen_base = fb_info.bufbase_virt;
+	fb_info.disp.var         = var;
       
-      /* FIXME: module cannot be unloaded */
-      /* verify tdfxfb_exit before removing this */
-      MOD_INC_USE_COUNT;
-      
-      return 0;
-    }
-  }
+	if (tdfxfb_set_var(&var, -1, &fb_info.fb_info)) {
+		printk(KERN_WARNING "tdfxfb: can't set default video mode\n");
+		return -ENXIO;
+	}
 
-  /* hmm, no frame suitable buffer found ... */
-  return -ENXIO;
+	if (register_framebuffer(&fb_info.fb_info) < 0) {
+		printk(KERN_WARNING "tdfxfb: can't register framebuffer\n");
+		return -ENXIO;
+	}
+
+	printk(KERN_INFO "fb%d: %s frame buffer device\n", 
+	     GET_FB_IDX(fb_info.fb_info.node), fb_info.fb_info.modename);
+      
+  	return 0;
 }
 
 /**
- *	tdfxfb_exit - Driver cleanup
+ *	tdfxfb_remove - Device removal
+ *
+ * 	@pdev:	PCI Device to cleanup
  *
- *	Releases all resources allocated during the
- *	course of the driver's lifetime.
+ *	Releases all resources allocated during the course of the driver's
+ *	lifetime for the PCI device @pdev.
  *
- *	FIXME - do results of fb_alloc_cmap need disposal?
  */
-static void __exit tdfxfb_exit (void)
+static void __devexit tdfxfb_remove(struct pci_dev *pdev)
 {
 	unregister_framebuffer(&fb_info.fb_info);
 	del_timer_sync(&fb_info.cursor.timer);
@@ -2036,7 +2049,7 @@
 #ifdef CONFIG_MTRR
        if (!nomtrr) {
           mtrr_del(fb_info.mtrr_idx, fb_info.bufbase_phys, fb_info.bufbase_size);
-	    printk("fb: MTRR's  turned off\n");
+	    printk("fb: MTRR's turned off\n");
        }
 #endif
 
@@ -2044,6 +2057,16 @@
 	iounmap(fb_info.bufbase_virt);
 }
 
+int __init tdfxfb_init(void)
+{
+	return pci_module_init(&tdfxfb_driver);
+}
+
+static void __exit tdfxfb_exit(void)
+{
+	pci_unregister_driver(&tdfxfb_driver);
+}
+
 MODULE_AUTHOR("Hannu Mallat <hmallat@cc.hut.fi>");
 MODULE_DESCRIPTION("3Dfx framebuffer device driver");
 
@@ -2212,7 +2235,9 @@
 			    unsigned        transp,
 			    struct fb_info* info) {
    struct fb_info_tdfx* i = (struct fb_info_tdfx*)info;
+#ifdef FBCON_HAS_CFB8   
    u32 rgbcol;
+#endif
    if (regno >= i->current_par.cmap_len) return 1;
    
    i->palette[regno].red    = red;
diff -u --recursive --new-file v2.4.8/linux/fs/adfs/file.c linux/fs/adfs/file.c
--- v2.4.8/linux/fs/adfs/file.c	Wed Sep 27 13:41:33 2000
+++ linux/fs/adfs/file.c	Sun Aug 12 10:56:56 2001
@@ -29,6 +29,7 @@
 #include "adfs.h"
 
 struct file_operations adfs_file_operations = {
+	llseek:		generic_file_llseek,
 	read:		generic_file_read,
 	mmap:		generic_file_mmap,
 	fsync:		file_fsync,
diff -u --recursive --new-file v2.4.8/linux/fs/affs/file.c linux/fs/affs/file.c
--- v2.4.8/linux/fs/affs/file.c	Wed Jul 25 17:10:24 2001
+++ linux/fs/affs/file.c	Sun Aug 12 10:56:56 2001
@@ -45,6 +45,7 @@
 static int affs_file_release(struct inode *inode, struct file *filp);
 
 struct file_operations affs_file_operations = {
+	llseek:		generic_file_llseek,
 	read:		generic_file_read,
 	write:		affs_file_write,
 	mmap:		generic_file_mmap,
diff -u --recursive --new-file v2.4.8/linux/fs/bfs/file.c linux/fs/bfs/file.c
--- v2.4.8/linux/fs/bfs/file.c	Mon Dec  4 19:02:45 2000
+++ linux/fs/bfs/file.c	Sun Aug 12 10:56:56 2001
@@ -19,6 +19,7 @@
 #endif
 
 struct file_operations bfs_file_operations = {
+	llseek: generic_file_llseek,
 	read:	generic_file_read,
 	write:	generic_file_write,
 	mmap:	generic_file_mmap,
diff -u --recursive --new-file v2.4.8/linux/fs/coda/file.c linux/fs/coda/file.c
--- v2.4.8/linux/fs/coda/file.c	Wed Apr 25 16:18:54 2001
+++ linux/fs/coda/file.c	Sun Aug 12 10:56:56 2001
@@ -236,6 +236,7 @@
 }
 
 struct file_operations coda_file_operations = {
+	llseek:		generic_file_llseek,
 	read:		generic_file_read,
 	write:		coda_file_write,
 	mmap:		generic_file_mmap,
diff -u --recursive --new-file v2.4.8/linux/fs/fat/cache.c linux/fs/fat/cache.c
--- v2.4.8/linux/fs/fat/cache.c	Thu May 24 15:36:33 2001
+++ linux/fs/fat/cache.c	Sun Aug 12 10:56:56 2001
@@ -15,8 +15,6 @@
 #include <linux/stat.h>
 #include <linux/fat_cvf.h>
 
-#include "msbuffer.h"
-
 #if 0
 #  define PRINTK(x) printk x
 #else
diff -u --recursive --new-file v2.4.8/linux/fs/fat/file.c linux/fs/fat/file.c
--- v2.4.8/linux/fs/fat/file.c	Thu May 24 15:36:33 2001
+++ linux/fs/fat/file.c	Sun Aug 12 10:56:56 2001
@@ -6,8 +6,6 @@
  *  regular file handling primitives for fat-based filesystems
  */
 
-#define ASC_LINUX_VERSION(V, P, S)	(((V) * 65536) + ((P) * 256) + (S))
-#include <linux/version.h>
 #include <linux/sched.h>
 #include <linux/locks.h>
 #include <linux/fs.h>
@@ -22,15 +20,11 @@
 #include <asm/uaccess.h>
 #include <asm/system.h>
 
-#include "msbuffer.h"
-
-#define MIN(a,b) (((a) < (b)) ? (a) : (b))
-#define MAX(a,b) (((a) > (b)) ? (a) : (b))
-
 #define PRINTK(x)
 #define Printk(x) printk x
 
 struct file_operations fat_file_operations = {
+	llseek:		generic_file_llseek,
 	read:		fat_file_read,
 	write:		fat_file_write,
 	mmap:		generic_file_mmap,
@@ -73,7 +67,7 @@
 		return -EIO;
 	}
 	if (!(iblock % MSDOS_SB(inode->i_sb)->cluster_size)) {
-		if (fat_add_cluster(inode))
+		if (fat_add_cluster(inode) < 0)
 			return -ENOSPC;
 	}
 	MSDOS_I(inode)->mmu_private += sb->s_blocksize;
diff -u --recursive --new-file v2.4.8/linux/fs/fat/inode.c linux/fs/fat/inode.c
--- v2.4.8/linux/fs/fat/inode.c	Sun Aug 12 13:28:00 2001
+++ linux/fs/fat/inode.c	Sun Aug 12 12:39:02 2001
@@ -154,15 +154,19 @@
 
 void fat_delete_inode(struct inode *inode)
 {
-	lock_kernel();
-	inode->i_size = 0;
-	fat_truncate(inode);
-	unlock_kernel();
+	if (!is_bad_inode(inode)) {
+		lock_kernel();
+		inode->i_size = 0;
+		fat_truncate(inode);
+		unlock_kernel();
+	}
 	clear_inode(inode);
 }
 
 void fat_clear_inode(struct inode *inode)
 {
+	if (is_bad_inode(inode))
+		return;
 	lock_kernel();
 	spin_lock(&fat_inode_lock);
 	fat_cache_inval_inode(inode);
@@ -372,6 +376,7 @@
 	inode->i_uid = sbi->options.fs_uid;
 	inode->i_gid = sbi->options.fs_gid;
 	inode->i_version = ++event;
+	inode->i_generation = 0;
 	inode->i_mode = (S_IRWXUGO & ~sbi->options.fs_umask) | S_IFDIR;
 	inode->i_op = sbi->dir_ops;
 	inode->i_fop = &fat_dir_operations;
@@ -403,12 +408,123 @@
 	inode->i_nlink = fat_subdirs(inode)+2;
 }
 
+/*
+ * a FAT file handle with fhtype 3 is
+ *  0/  i_ino - for fast, reliable lookup if still in the cache
+ *  1/  i_generation - to see if i_ino is still valid
+ *          bit 0 == 0 iff directory
+ *  2/  i_location - if ino has changed, but still in cache
+ *  3/  i_logstart - to semi-verify inode found at i_location
+ *  4/  parent->i_logstart - maybe used to hunt for the file on disc
+ *
+ */
+struct dentry *fat_fh_to_dentry(struct super_block *sb, __u32 *fh,
+				int len, int fhtype, int parent)
+{
+	struct inode *inode = NULL;
+	struct list_head *lp;
+	struct dentry *result;
+
+	if (fhtype != 3)
+		return NULL;
+	if (len < 5)
+		return NULL;
+	if (parent)
+		return NULL; /* We cannot find the parent,
+				It better just *be* there */
+
+	inode = iget(sb, fh[0]);
+	if (!inode || is_bad_inode(inode) ||
+	    inode->i_generation != fh[1]) {
+		if (inode) iput(inode);
+		inode = NULL;
+	}
+	if (!inode) {
+		/* try 2 - see if i_location is in F-d-c
+		 * require i_logstart to be the same
+		 * Will fail if you truncate and then re-write
+		 */
+
+		inode = fat_iget(sb, fh[2]);
+		if (inode && MSDOS_I(inode)->i_logstart != fh[3]) {
+			iput(inode);
+			inode = NULL;
+		}
+	}
+	if (!inode) {
+		/* For now, do nothing
+		 * What we could do is:
+		 * follow the file starting at fh[4], and record
+		 * the ".." entry, and the name of the fh[2] entry.
+		 * The follow the ".." file finding the next step up.
+		 * This way we build a path to the root of
+		 * the tree. If this works, we lookup the path and so
+		 * get this inode into the cache.
+		 * Finally try the fat_iget lookup again
+		 * If that fails, then weare totally out of luck
+		 * But all that is for another day
+		 */
+	}
+	if (!inode)
+		return ERR_PTR(-ESTALE);
+
+	
+	/* now to find a dentry.
+	 * If possible, get a well-connected one
+	 *
+	 * Given the way that we found the inode, it *MUST* be
+	 * well-connected, but it is easiest to just copy the
+	 * code.
+	 */
+	spin_lock(&dcache_lock);
+	for (lp = inode->i_dentry.next; lp != &inode->i_dentry ; lp=lp->next) {
+		result = list_entry(lp,struct dentry, d_alias);
+		if (! (result->d_flags & DCACHE_NFSD_DISCONNECTED)) {
+			dget_locked(result);
+			result->d_vfs_flags |= DCACHE_REFERENCED;
+			spin_unlock(&dcache_lock);
+			iput(inode);
+			return result;
+		}
+	}
+	spin_unlock(&dcache_lock);
+	result = d_alloc_root(inode);
+	if (result == NULL) {
+		iput(inode);
+		return ERR_PTR(-ENOMEM);
+	}
+	result->d_flags |= DCACHE_NFSD_DISCONNECTED;
+	return result;
+
+		
+}
+
+int fat_dentry_to_fh(struct dentry *de, __u32 *fh, int *lenp, int needparent)
+{
+	int len = *lenp;
+	struct inode *inode =  de->d_inode;
+	
+	if (len < 5)
+		return 255; /* no room */
+	*lenp = 5;
+	fh[0] = inode->i_ino;
+	fh[1] = inode->i_generation;
+	fh[2] = MSDOS_I(inode)->i_location;
+	fh[3] = MSDOS_I(inode)->i_logstart;
+	fh[4] = MSDOS_I(de->d_parent->d_inode)->i_logstart;
+	return 3;
+}
+
 static struct super_operations fat_sops = { 
 	write_inode:	fat_write_inode,
 	delete_inode:	fat_delete_inode,
 	put_super:	fat_put_super,
 	statfs:		fat_statfs,
 	clear_inode:	fat_clear_inode,
+
+	read_inode:	make_bad_inode,
+	fh_to_dentry:	fat_fh_to_dentry,
+	dentry_to_fh:	fat_dentry_to_fh,
 };
 
 /*
@@ -767,7 +883,10 @@
 	inode->i_uid = sbi->options.fs_uid;
 	inode->i_gid = sbi->options.fs_gid;
 	inode->i_version = ++event;
+	inode->i_generation = CURRENT_TIME;
+	
 	if ((de->attr & ATTR_DIR) && !IS_FREE(de->name)) {
+		inode->i_generation &= ~1;
 		inode->i_mode = MSDOS_MKMODE(de->attr,S_IRWXUGO &
 		    ~sbi->options.fs_umask) | S_IFDIR;
 		inode->i_op = sbi->dir_ops;
@@ -798,6 +917,7 @@
 			}
 		MSDOS_I(inode)->mmu_private = inode->i_size;
 	} else { /* not a directory */
+		inode->i_generation |= 1;
 		inode->i_mode = MSDOS_MKMODE(de->attr,
 		    ((IS_NOEXEC(inode) || 
 		      (sbi->options.showexec &&
diff -u --recursive --new-file v2.4.8/linux/fs/hfs/file.c linux/fs/hfs/file.c
--- v2.4.8/linux/fs/hfs/file.c	Tue Feb 13 14:13:45 2001
+++ linux/fs/hfs/file.c	Sun Aug 12 10:56:56 2001
@@ -32,6 +32,7 @@
 /*================ Global variables ================*/
 
 struct file_operations hfs_file_operations = {
+	llseek:		generic_file_llseek,
 	read:		hfs_file_read,
 	write:		hfs_file_write,
 	mmap:		generic_file_mmap,
diff -u --recursive --new-file v2.4.8/linux/fs/hfs/file_cap.c linux/fs/hfs/file_cap.c
--- v2.4.8/linux/fs/hfs/file_cap.c	Tue Feb 13 14:13:45 2001
+++ linux/fs/hfs/file_cap.c	Sun Aug 12 10:56:56 2001
@@ -26,7 +26,8 @@
 #include <linux/hfs_fs.h>
 
 /*================ Forward declarations ================*/
-
+static loff_t      cap_info_llseek(struct file *, loff_t,
+				   int);
 static hfs_rwret_t cap_info_read(struct file *, char *,
 				 hfs_rwarg_t, loff_t *);
 static hfs_rwret_t cap_info_write(struct file *, const char *,
@@ -45,6 +46,7 @@
 /*================ Global variables ================*/
 
 struct file_operations hfs_cap_info_operations = {
+	llseek:		cap_info_llseek,
 	read:		cap_info_read,
 	write:		cap_info_write,
 	fsync:		file_fsync,
@@ -83,6 +85,29 @@
 	hfs_put_nl(hfs_m_to_htime(entry->create_date), meta->fi_ctime);
 	hfs_put_nl(hfs_m_to_htime(entry->modify_date), meta->fi_mtime);
 	hfs_put_nl(CURRENT_TIME,                       meta->fi_utime);
+}
+
+static loff_t cap_info_llseek(struct file *file, loff_t offset, int origin)
+{
+	long long retval;
+
+	switch (origin) {
+		case 2:
+			offset += file->f_dentry->d_inode->i_size;
+			break;
+		case 1:
+			offset += file->f_pos;
+	}
+	retval = -EINVAL;
+	if (offset>=0 && offset<=HFS_FORK_MAX) {
+		if (offset != file->f_pos) {
+			file->f_pos = offset;
+			file->f_reada = 0;
+			file->f_version = ++event;
+		}
+		retval = offset;
+	}
+	return retval;
 }
 
 /*
diff -u --recursive --new-file v2.4.8/linux/fs/hfs/file_hdr.c linux/fs/hfs/file_hdr.c
--- v2.4.8/linux/fs/hfs/file_hdr.c	Tue Feb 13 14:13:45 2001
+++ linux/fs/hfs/file_hdr.c	Sun Aug 12 10:56:56 2001
@@ -39,13 +39,14 @@
 #define PRODOSI_AUXTYPE_DIR 0x0200
 
 /*================ Forward declarations ================*/
-
+static loff_t      hdr_llseek(struct file *, loff_t, int);
 static hfs_rwret_t hdr_read(struct file *, char *, hfs_rwarg_t, loff_t *);
 static hfs_rwret_t hdr_write(struct file *, const char *,
 			     hfs_rwarg_t, loff_t *);
 /*================ Global variables ================*/
 
 struct file_operations hfs_hdr_operations = {
+	llseek:		hdr_llseek,
 	read:		hdr_read,
 	write:		hdr_write,
 	fsync:		file_fsync,
@@ -340,6 +341,29 @@
 		entry->backup_date = tmp;
 		hfs_cat_mark_dirty(entry);
 	}
+}
+
+loff_t hdr_llseek(struct file *file, loff_t offset, int origin)
+{
+	long long retval;
+
+	switch (origin) {
+		case 2:
+			offset += file->f_dentry->d_inode->i_size;
+			break;
+		case 1:
+			offset += file->f_pos;
+	}
+	retval = -EINVAL;
+	if (offset>=0 && offset<file->f_dentry->d_inode->i_size) {
+		if (offset != file->f_pos) {
+			file->f_pos = offset;
+			file->f_reada = 0;
+			file->f_version = ++event;
+		}
+		retval = offset;
+	}
+	return retval;
 }
 
 /*
diff -u --recursive --new-file v2.4.8/linux/fs/hpfs/file.c linux/fs/hpfs/file.c
--- v2.4.8/linux/fs/hpfs/file.c	Fri Dec 29 14:07:57 2000
+++ linux/fs/hpfs/file.c	Sun Aug 12 17:37:53 2001
@@ -11,6 +11,8 @@
 #include <linux/smp_lock.h>
 #include "hpfs_fn.h"
 
+#define BLOCKS(size) (((size) + 511) >> 9)
+
 /* HUH? */
 int hpfs_open(struct inode *i, struct file *f)
 {
@@ -46,7 +48,7 @@
 	unsigned n, disk_secno;
 	struct fnode *fnode;
 	struct buffer_head *bh;
-	if (((inode->i_size + 511) >> 9) <= file_secno) return 0;
+	if (BLOCKS(inode->u.hpfs_i.mmu_private) <= file_secno) return 0;
 	n = file_secno - inode->i_hpfs_file_sec;
 	if (n < inode->i_hpfs_n_secs) return inode->i_hpfs_disk_sec + n;
 	if (!(fnode = hpfs_map_fnode(inode->i_sb, inode->i_ino, &bh))) return 0;
diff -u --recursive --new-file v2.4.8/linux/fs/hpfs/inode.c linux/fs/hpfs/inode.c
--- v2.4.8/linux/fs/hpfs/inode.c	Mon Jan 22 10:40:47 2001
+++ linux/fs/hpfs/inode.c	Sun Aug 12 17:37:53 2001
@@ -12,6 +12,7 @@
 
 static struct file_operations hpfs_file_ops =
 {
+	llseek:		generic_file_llseek,
 	read:		generic_file_read,
 	write:		hpfs_file_write,
 	mmap:		generic_file_mmap,
diff -u --recursive --new-file v2.4.8/linux/fs/isofs/inode.c linux/fs/isofs/inode.c
--- v2.4.8/linux/fs/isofs/inode.c	Wed Apr 18 11:49:13 2001
+++ linux/fs/isofs/inode.c	Sun Aug 12 10:56:56 2001
@@ -744,7 +744,7 @@
 		if (! s->u.isofs_sb.s_nls_iocharset) {
 			/* Fail only if explicit charset specified */
 			if (opt.iocharset)
-				goto out_freebh;
+				goto out_unlock;
 			s->u.isofs_sb.s_nls_iocharset = load_nls_default();
 		}
 	}
@@ -752,6 +752,7 @@
 	s->s_op = &isofs_sops;
 	s->u.isofs_sb.s_mapping = opt.map;
 	s->u.isofs_sb.s_rock = (opt.rock == 'y' ? 2 : 0);
+	s->u.isofs_sb.s_rock_offset = -1; /* initial offset, will guess until SP is found*/
 	s->u.isofs_sb.s_cruft = opt.cruft;
 	s->u.isofs_sb.s_unhide = opt.unhide;
 	s->u.isofs_sb.s_uid = opt.uid;
diff -u --recursive --new-file v2.4.8/linux/fs/isofs/joliet.c linux/fs/isofs/joliet.c
--- v2.4.8/linux/fs/isofs/joliet.c	Fri Feb  9 11:29:44 2001
+++ linux/fs/isofs/joliet.c	Sun Aug 12 10:56:56 2001
@@ -10,6 +10,7 @@
 #include <linux/nls.h>
 #include <linux/slab.h>
 #include <linux/iso_fs.h>
+#include <asm/unaligned.h>
 
 /*
  * Convert Unicode 16 to UTF8 or ASCII.
@@ -17,15 +18,15 @@
 static int
 uni16_to_x8(unsigned char *ascii, u16 *uni, int len, struct nls_table *nls)
 {
-	wchar_t *ip;
+	wchar_t *ip, ch;
 	unsigned char *op;
 
 	ip = uni;
 	op = ascii;
 
-	while (*ip && len) {
+	while ((ch = get_unaligned(ip)) && len) {
 		int llen;
-		wchar_t ch = be16_to_cpu(*ip);
+		ch = be16_to_cpu(ch);
 		if ((llen = nls->uni2char(ch, op, NLS_MAX_CHARSET_SIZE)) > 0)
 			op += llen;
 		else
diff -u --recursive --new-file v2.4.8/linux/fs/isofs/rock.c linux/fs/isofs/rock.c
--- v2.4.8/linux/fs/isofs/rock.c	Fri Feb  9 11:29:44 2001
+++ linux/fs/isofs/rock.c	Sun Aug 12 10:56:56 2001
@@ -31,8 +31,8 @@
    use fields that is compatible with Rock Ridge */
 #define CHECK_SP(FAIL)	       			\
       if(rr->u.SP.magic[0] != 0xbe) FAIL;	\
-      if(rr->u.SP.magic[1] != 0xef) FAIL;
-
+      if(rr->u.SP.magic[1] != 0xef) FAIL;       \
+      inode->i_sb->u.isofs_sb.s_rock_offset=rr->u.SP.skip;
 /* We define a series of macros because each function must do exactly the
    same thing in certain places.  We use the macros to ensure that everything
    is done correctly */
@@ -50,7 +50,14 @@
   {LEN= sizeof(struct iso_directory_record) + DE->name_len[0];	\
   if(LEN & 1) LEN++;						\
   CHR = ((unsigned char *) DE) + LEN;				\
-  LEN = *((unsigned char *) DE) - LEN;}
+  LEN = *((unsigned char *) DE) - LEN;                          \
+  if (inode->i_sb->u.isofs_sb.s_rock_offset!=-1)                \
+  {                                                             \
+     LEN-=inode->i_sb->u.isofs_sb.s_rock_offset;                \
+     CHR+=inode->i_sb->u.isofs_sb.s_rock_offset;                \
+     if (LEN<0) LEN=0;                                          \
+  }                                                             \
+}                                     
 
 #define MAYBE_CONTINUE(LABEL,DEV) \
   {if (buffer) kfree(buffer); \
@@ -220,8 +227,8 @@
   return 0;
 }
 
-int parse_rock_ridge_inode(struct iso_directory_record * de,
-			   struct inode * inode){
+int parse_rock_ridge_inode_internal(struct iso_directory_record * de,
+			            struct inode * inode,int regard_xa){
   int len;
   unsigned char * chr;
   int symlink_len = 0;
@@ -230,6 +237,13 @@
   if (!inode->i_sb->u.isofs_sb.s_rock) return 0;
 
   SETUP_ROCK_RIDGE(de, chr, len);
+  if (regard_xa)
+   {
+     chr+=14;
+     len-=14;
+     if (len<0) len=0;
+   };
+   
  repeat:
   {
     int cnt, sig;
@@ -416,7 +430,7 @@
 			 * If there is another SL record, and this component
 			 * record isn't continued, then add a slash.
 			 */
-			if ((rr->u.SL.flags & 1) && !(oldslp->flags & 1))
+			if ((!rootflag) && (rr->u.SL.flags & 1) && !(oldslp->flags & 1))
 				*rpnt++='/';
 			break;
 		}
@@ -431,6 +445,20 @@
 	return rpnt;
 }
 
+int parse_rock_ridge_inode(struct iso_directory_record * de,
+			   struct inode * inode)
+{
+   int result=parse_rock_ridge_inode_internal(de,inode,0);
+   /* if rockridge flag was reset and we didn't look for attributes
+    * behind eventual XA attributes, have a look there */
+   if ((inode->i_sb->u.isofs_sb.s_rock_offset==-1)
+       &&(inode->i_sb->u.isofs_sb.s_rock==2))
+     {
+	printk(KERN_DEBUG"scanning for RockRidge behind XA attributes\n");
+	result=parse_rock_ridge_inode_internal(de,inode,14);
+     };
+   return result;
+};
 
 /* readpage() for symlinks: reads symlink contents into the page and either
    makes it uptodate and returns 0 or returns error (-EIO) */
diff -u --recursive --new-file v2.4.8/linux/fs/jffs/inode-v23.c linux/fs/jffs/inode-v23.c
--- v2.4.8/linux/fs/jffs/inode-v23.c	Tue Jul  3 17:08:21 2001
+++ linux/fs/jffs/inode-v23.c	Sun Aug 12 10:52:29 2001
@@ -157,7 +157,7 @@
 		D1(printk (KERN_NOTICE "jffs_put_super(): Telling gc thread to die.\n"));
 		send_sig(SIGKILL, c->gc_task, 1);
 	}
-	down (&c->gc_thread_sem);
+	wait_for_completion(&c->gc_thread_comp);
 
 	D1(printk (KERN_NOTICE "jffs_put_super(): Successfully waited on thread.\n"));
 
diff -u --recursive --new-file v2.4.8/linux/fs/jffs/intrep.c linux/fs/jffs/intrep.c
--- v2.4.8/linux/fs/jffs/intrep.c	Fri Feb  9 11:29:44 2001
+++ linux/fs/jffs/intrep.c	Sun Aug 12 10:52:29 2001
@@ -3008,7 +3008,7 @@
 
 	current->session = 1;
 	current->pgrp = 1;
-	init_MUTEX_LOCKED(&c->gc_thread_sem); /* barrier */ 
+	init_completion(&c->gc_thread_comp); /* barrier */ 
 	spin_lock_irq(&current->sigmask_lock);
 	siginitsetinv (&current->blocked, sigmask(SIGHUP) | sigmask(SIGKILL) | sigmask(SIGSTOP) | sigmask(SIGCONT));
 	recalc_sigpending(current);
@@ -3055,7 +3055,7 @@
 				D1(printk("jffs_garbage_collect_thread(): SIGKILL received.\n"));
 				c->gc_task = NULL;
 				unlock_kernel();
-				up_and_exit(&c->gc_thread_sem, 0);
+				complete_and_exit(&c->gc_thread_comp, 0);
 			}
 		}
 
diff -u --recursive --new-file v2.4.8/linux/fs/msdos/namei.c linux/fs/msdos/namei.c
--- v2.4.8/linux/fs/msdos/namei.c	Wed Apr 18 11:49:12 2001
+++ linux/fs/msdos/namei.c	Sun Aug 12 11:13:59 2001
@@ -17,8 +17,6 @@
 
 #include <asm/uaccess.h>
 
-#include "../fat/msbuffer.h"
-
 #define MSDOS_DEBUG 0
 #define PRINTK(x)
 
diff -u --recursive --new-file v2.4.8/linux/fs/ncpfs/file.c linux/fs/ncpfs/file.c
--- v2.4.8/linux/fs/ncpfs/file.c	Fri Feb  9 11:29:44 2001
+++ linux/fs/ncpfs/file.c	Sun Aug 12 11:13:59 2001
@@ -284,6 +284,7 @@
 
 struct file_operations ncp_file_operations =
 {
+	llseek:		generic_file_llseek,
 	read:		ncp_file_read,
 	write:		ncp_file_write,
 	ioctl:		ncp_ioctl,
diff -u --recursive --new-file v2.4.8/linux/fs/nfs/file.c linux/fs/nfs/file.c
--- v2.4.8/linux/fs/nfs/file.c	Tue May 22 09:26:06 2001
+++ linux/fs/nfs/file.c	Sun Aug 12 17:37:53 2001
@@ -42,6 +42,7 @@
 static int  nfs_file_release(struct inode *, struct file *);
 
 struct file_operations nfs_file_operations = {
+	llseek:		generic_file_llseek,
 	read:		nfs_file_read,
 	write:		nfs_file_write,
 	mmap:		nfs_file_mmap,
diff -u --recursive --new-file v2.4.8/linux/fs/nfsd/nfs3xdr.c linux/fs/nfsd/nfs3xdr.c
--- v2.4.8/linux/fs/nfsd/nfs3xdr.c	Tue Jul  3 17:08:21 2001
+++ linux/fs/nfsd/nfs3xdr.c	Sun Aug 12 12:39:02 2001
@@ -160,11 +160,6 @@
 {
 	struct inode	*inode = dentry->d_inode;
 
-	if (!inode) {
-		printk("nfsd: NULL inode in %s:%d", __FILE__, __LINE__);
-		return NULL;
-	}
-
 	*p++ = htonl(nfs3_ftypes[(inode->i_mode & S_IFMT) >> 12]);
 	*p++ = htonl((u32) inode->i_mode);
 	*p++ = htonl((u32) inode->i_nlink);
@@ -515,9 +510,8 @@
 nfs3svc_encode_attrstat(struct svc_rqst *rqstp, u32 *p,
 					struct nfsd3_attrstat *resp)
 {
-	if (resp->status == 0
-	 && !(p = encode_fattr3(rqstp, p, resp->fh.fh_dentry)))
-		return 0;
+	if (resp->status == 0)
+		p = encode_fattr3(rqstp, p, resp->fh.fh_dentry);
 	return xdr_ressize_check(rqstp, p);
 }
 
@@ -526,8 +520,7 @@
 nfs3svc_encode_wccstat(struct svc_rqst *rqstp, u32 *p,
 					struct nfsd3_attrstat *resp)
 {
-	if (!(p = encode_wcc_data(rqstp, p, &resp->fh)))
-		return 0;
+	p = encode_wcc_data(rqstp, p, &resp->fh);
 	return xdr_ressize_check(rqstp, p);
 }
 
diff -u --recursive --new-file v2.4.8/linux/fs/nfsd/nfsfh.c linux/fs/nfsd/nfsfh.c
--- v2.4.8/linux/fs/nfsd/nfsfh.c	Wed Jul 25 17:10:24 2001
+++ linux/fs/nfsd/nfsfh.c	Sun Aug 12 16:08:02 2001
@@ -41,7 +41,7 @@
  * the name matching the specified inode number.
  */
 static int filldir_one(void * __buf, const char * name, int len,
-			off_t pos, ino_t ino, unsigned int d_type)
+			loff_t pos, ino_t ino, unsigned int d_type)
 {
 	struct nfsd_getdents_callback *buf = __buf;
 	struct qstr *qs = buf->name;
@@ -611,7 +611,7 @@
 						!(exp->ex_flags & NFSEXP_NOSUBTREECHECK));
 		}
 		if (IS_ERR(dentry)) {
-			if (PTR_ERR(dentry) != EINVAL)
+			if (PTR_ERR(dentry) != -EINVAL)
 				error = nfserrno(PTR_ERR(dentry));
 			goto out;
 		}
diff -u --recursive --new-file v2.4.8/linux/fs/nfsd/nfsxdr.c linux/fs/nfsd/nfsxdr.c
--- v2.4.8/linux/fs/nfsd/nfsxdr.c	Thu Feb  8 19:38:38 2001
+++ linux/fs/nfsd/nfsxdr.c	Sun Aug 12 12:39:02 2001
@@ -137,8 +137,7 @@
 encode_fattr(struct svc_rqst *rqstp, u32 *p, struct inode *inode)
 {
 	int type = (inode->i_mode & S_IFMT);
-	if (!inode)
-		return 0;
+
 	*p++ = htonl(nfs_ftypes[type >> 12]);
 	*p++ = htonl((u32) inode->i_mode);
 	*p++ = htonl((u32) inode->i_nlink);
@@ -335,8 +334,7 @@
 nfssvc_encode_attrstat(struct svc_rqst *rqstp, u32 *p,
 					struct nfsd_attrstat *resp)
 {
-	if (!(p = encode_fattr(rqstp, p, resp->fh.fh_dentry->d_inode)))
-		return 0;
+	p = encode_fattr(rqstp, p, resp->fh.fh_dentry->d_inode);
 	return xdr_ressize_check(rqstp, p);
 }
 
@@ -344,9 +342,8 @@
 nfssvc_encode_diropres(struct svc_rqst *rqstp, u32 *p,
 					struct nfsd_diropres *resp)
 {
-	if (!(p = encode_fh(p, &resp->fh))
-	 || !(p = encode_fattr(rqstp, p, resp->fh.fh_dentry->d_inode)))
-		return 0;
+	p = encode_fh(p, &resp->fh);
+	p = encode_fattr(rqstp, p, resp->fh.fh_dentry->d_inode);
 	return xdr_ressize_check(rqstp, p);
 }
 
@@ -363,8 +360,7 @@
 nfssvc_encode_readres(struct svc_rqst *rqstp, u32 *p,
 					struct nfsd_readres *resp)
 {
-	if (!(p = encode_fattr(rqstp, p, resp->fh.fh_dentry->d_inode)))
-		return 0;
+	p = encode_fattr(rqstp, p, resp->fh.fh_dentry->d_inode);
 	*p++ = htonl(resp->count);
 	p += XDR_QUADLEN(resp->count);
 
diff -u --recursive --new-file v2.4.8/linux/fs/partitions/Config.in linux/fs/partitions/Config.in
--- v2.4.8/linux/fs/partitions/Config.in	Sun Aug 12 13:28:00 2001
+++ linux/fs/partitions/Config.in	Sun Aug 12 11:13:59 2001
@@ -41,7 +41,7 @@
 	"$CONFIG_SGI_IP27" != "y" ]; then
       define_bool CONFIG_MSDOS_PARTITION y
    fi
-   if [ "$CONFIG_AMIGA" = "y" -o "CONFIG_AFFS_FS" = "y" ]; then
+   if [ "$CONFIG_AMIGA" = "y" -o "$CONFIG_AFFS_FS" = "y" ]; then
       define_bool CONFIG_AMIGA_PARTITION y
    fi
    if [ "$CONFIG_MAC" = "y" ]; then
diff -u --recursive --new-file v2.4.8/linux/fs/partitions/ldm.h linux/fs/partitions/ldm.h
--- v2.4.8/linux/fs/partitions/ldm.h	Sun Aug 12 13:28:00 2001
+++ linux/fs/partitions/ldm.h	Sun Aug 12 19:03:02 2001
@@ -80,21 +80,22 @@
 #define TOC_BITMAP1		"config"	/* Names of the two defined */
 #define TOC_BITMAP2		"log"		/* bitmaps in the TOCBLOCK. */
 
-/* Borrowed from msdos.c */
-#define SYS_IND(p)		(get_unaligned(&p->sys_ind))
-#define NR_SECTS(p)		({ __typeof__(p->nr_sects) __a =	\
-					get_unaligned(&p->nr_sects);	\
-					le32_to_cpu(__a);		\
-				})
-#define START_SECT(p)		({ __typeof__(p->start_sect) __a =	\
-					get_unaligned(&p->start_sect);	\
-					le32_to_cpu(__a);		\
-				})
-
 /* Most numbers we deal with are big-endian and won't be aligned. */
 #define BE16(x)			((u16)be16_to_cpu(get_unaligned((u16*)(x))))
 #define BE32(x)			((u32)be32_to_cpu(get_unaligned((u32*)(x))))
 #define BE64(x)			((u64)be64_to_cpu(get_unaligned((u64*)(x))))
+
+/* Borrowed from msdos.c. */
+#define SYS_IND(p)		(get_unaligned(&(p)->sys_ind))
+#define NR_SECTS(p)		({ __typeof__((p)->nr_sects) __a =	\
+					get_unaligned(&(p)->nr_sects);	\
+					le32_to_cpu(__a);		\
+				})
+
+#define START_SECT(p)		({ __typeof__((p)->start_sect) __a =	\
+					get_unaligned(&(p)->start_sect);\
+					le32_to_cpu(__a);		\
+				})
 
 /* In memory LDM database structures. */
 
diff -u --recursive --new-file v2.4.8/linux/fs/qnx4/README linux/fs/qnx4/README
--- v2.4.8/linux/fs/qnx4/README	Mon Jan 10 14:19:46 2000
+++ linux/fs/qnx4/README	Sun Aug 12 11:13:59 2001
@@ -5,5 +5,5 @@
 Credits :
 
 Richard "Scuba" A. Frowijn     <scuba@wxs.nl>
-Frank "Jedi/Sector One" Denis  <j@4u.net>
+Frank "Jedi/Sector One" Denis  <j@pureftpd.org>
 Anders Larsen                  <al@alarsen.net> (Maintainer)
diff -u --recursive --new-file v2.4.8/linux/fs/qnx4/file.c linux/fs/qnx4/file.c
--- v2.4.8/linux/fs/qnx4/file.c	Sat Feb 26 20:33:07 2000
+++ linux/fs/qnx4/file.c	Sun Aug 12 11:13:59 2001
@@ -24,6 +24,7 @@
  */
 struct file_operations qnx4_file_operations =
 {
+	llseek:			generic_file_llseek,
 	read:			generic_file_read,
 #ifdef CONFIG_QNX4FS_RW
 	write:			generic_file_write,
diff -u --recursive --new-file v2.4.8/linux/fs/readdir.c linux/fs/readdir.c
--- v2.4.8/linux/fs/readdir.c	Mon Dec 11 13:45:42 2000
+++ linux/fs/readdir.c	Sun Aug 12 14:59:08 2001
@@ -122,7 +122,7 @@
 	int count;
 };
 
-static int fillonedir(void * __buf, const char * name, int namlen, off_t offset,
+static int fillonedir(void * __buf, const char * name, int namlen, loff_t offset,
 		      ino_t ino, unsigned int d_type)
 {
 	struct readdir_callback * buf = (struct readdir_callback *) __buf;
@@ -183,7 +183,7 @@
 	int error;
 };
 
-static int filldir(void * __buf, const char * name, int namlen, off_t offset,
+static int filldir(void * __buf, const char * name, int namlen, loff_t offset,
 		   ino_t ino, unsigned int d_type)
 {
 	struct linux_dirent * dirent;
@@ -261,7 +261,7 @@
 	int error;
 };
 
-static int filldir64(void * __buf, const char * name, int namlen, off_t offset,
+static int filldir64(void * __buf, const char * name, int namlen, loff_t offset,
 		     ino_t ino, unsigned int d_type)
 {
 	struct linux_dirent64 * dirent, d;
diff -u --recursive --new-file v2.4.8/linux/fs/smbfs/file.c linux/fs/smbfs/file.c
--- v2.4.8/linux/fs/smbfs/file.c	Tue Jul  3 17:08:21 2001
+++ linux/fs/smbfs/file.c	Sun Aug 12 11:13:59 2001
@@ -376,6 +376,7 @@
 
 struct file_operations smb_file_operations =
 {
+	llseek:		generic_file_llseek,
 	read:		smb_file_read,
 	write:		smb_file_write,
 	ioctl:		smb_ioctl,
diff -u --recursive --new-file v2.4.8/linux/fs/sysv/file.c linux/fs/sysv/file.c
--- v2.4.8/linux/fs/sysv/file.c	Tue Jul  3 17:08:21 2001
+++ linux/fs/sysv/file.c	Sun Aug 12 17:37:53 2001
@@ -21,6 +21,7 @@
  * the coh filesystem.
  */
 struct file_operations sysv_file_operations = {
+	llseek:		generic_file_llseek,
 	read:		generic_file_read,
 	write:		generic_file_write,
 	mmap:		generic_file_mmap,
diff -u --recursive --new-file v2.4.8/linux/fs/ufs/file.c linux/fs/ufs/file.c
--- v2.4.8/linux/fs/ufs/file.c	Sat Feb 26 20:33:08 2000
+++ linux/fs/ufs/file.c	Sun Aug 12 17:37:53 2001
@@ -71,11 +71,13 @@
  * We have mostly NULL's here: the current defaults are ok for
  * the ufs filesystem.
  */
+ 
 struct file_operations ufs_file_operations = {
 	llseek:		ufs_file_lseek,
 	read:		generic_file_read,
 	write:		generic_file_write,
 	mmap:		generic_file_mmap,
+	open:           generic_file_open,
 };
 
 struct inode_operations ufs_file_inode_operations = {
diff -u --recursive --new-file v2.4.8/linux/fs/umsdos/namei.c linux/fs/umsdos/namei.c
--- v2.4.8/linux/fs/umsdos/namei.c	Fri Feb  9 11:29:44 2001
+++ linux/fs/umsdos/namei.c	Sun Aug 12 11:13:59 2001
@@ -491,7 +491,7 @@
 		goto out;
 	}
 
-	len = strlen (symname);
+	len = strlen (symname) + 1;
 	ret = block_symlink(dentry->d_inode, symname, len);
 	if (ret < 0)
 		goto out_unlink;
diff -u --recursive --new-file v2.4.8/linux/include/asm-alpha/cache.h linux/include/asm-alpha/cache.h
--- v2.4.8/linux/include/asm-alpha/cache.h	Mon Jul 31 11:44:18 2000
+++ linux/include/asm-alpha/cache.h	Sun Aug 12 10:38:47 2001
@@ -7,7 +7,7 @@
 #include <linux/config.h>
 
 /* Bytes per L1 (data) cache line. */
-#if defined(CONFIG_ALPHA_GENERIC) || defined(CONFIG_ALPHA_EV6)
+#if defined(CONFIG_ALPHA_GENERIC) || defined(CONFIG_ALPHA_EV6) || defined(CONFIG_ALPHA_EV67)
 # define L1_CACHE_BYTES     64
 # define L1_CACHE_SHIFT     6
 #else
diff -u --recursive --new-file v2.4.8/linux/include/asm-alpha/console.h linux/include/asm-alpha/console.h
--- v2.4.8/linux/include/asm-alpha/console.h	Mon Jun 19 17:59:33 2000
+++ linux/include/asm-alpha/console.h	Sun Aug 12 10:51:41 2001
@@ -22,8 +22,8 @@
 #define CCB_GET_ENV		0x22
 #define CCB_SAVE_ENV		0x23
 
-#define CCB_PSWITCH            0x30
-#define CCB_BIOS_EMUL          0x32
+#define CCB_PSWITCH		0x30
+#define CCB_BIOS_EMUL		0x32
 
 /*
  * Environment variable numbers
@@ -51,6 +51,8 @@
 extern long callback_close(long unit);
 extern long callback_read(long channel, long count, const char *buf, long lbn);
 extern long callback_getenv(long id, const char *buf, unsigned long buf_size);
+extern long callback_setenv(long id, const char *buf, unsigned long buf_size);
+extern long callback_save_env(void);
 
 extern int srm_fixup(unsigned long new_callback_addr,
 		     unsigned long new_hwrpb_addr);
diff -u --recursive --new-file v2.4.8/linux/include/asm-alpha/irq.h linux/include/asm-alpha/irq.h
--- v2.4.8/linux/include/asm-alpha/irq.h	Mon Jun 19 17:59:33 2000
+++ linux/include/asm-alpha/irq.h	Sun Aug 12 10:38:47 2001
@@ -43,6 +43,7 @@
 # define NR_IRQS	40
 
 #elif defined(CONFIG_ALPHA_DP264) || \
+      defined(CONFIG_ALPHA_SHARK) || \
       defined(CONFIG_ALPHA_EIGER)
 # define NR_IRQS	64
 
diff -u --recursive --new-file v2.4.8/linux/include/asm-alpha/keyboard.h linux/include/asm-alpha/keyboard.h
--- v2.4.8/linux/include/asm-alpha/keyboard.h	Mon Oct 11 14:40:01 1999
+++ linux/include/asm-alpha/keyboard.h	Sun Aug 12 11:13:59 2001
@@ -22,6 +22,7 @@
 			   char raw_mode);
 extern char pckbd_unexpected_up(unsigned char keycode);
 extern void pckbd_leds(unsigned char leds);
+extern int pckbd_rate(struct kbd_repeat *rep);
 extern void pckbd_init_hw(void);
 extern unsigned char pckbd_sysrq_xlate[128];
 
@@ -30,6 +31,7 @@
 #define kbd_translate		pckbd_translate
 #define kbd_unexpected_up	pckbd_unexpected_up
 #define kbd_leds		pckbd_leds
+#define kbd_rate               pckbd_rate
 #define kbd_init_hw		pckbd_init_hw
 #define kbd_sysrq_xlate		pckbd_sysrq_xlate
 
diff -u --recursive --new-file v2.4.8/linux/include/asm-alpha/pgtable.h linux/include/asm-alpha/pgtable.h
--- v2.4.8/linux/include/asm-alpha/pgtable.h	Thu May 24 15:20:18 2001
+++ linux/include/asm-alpha/pgtable.h	Sun Aug 12 10:38:47 2001
@@ -178,7 +178,8 @@
 #error "EV6-only feature in a generic kernel"
 #endif
 #if defined(CONFIG_ALPHA_GENERIC) || \
-    (defined(CONFIG_ALPHA_EV6) && !defined(USE_48_BIT_KSEG))
+    ((defined(CONFIG_ALPHA_EV6) || defined(CONFIG_ALPHA_EV67)) && \
+     !defined(USE_48_BIT_KSEG))
 #define PHYS_TWIDDLE(phys) \
   ((((phys) & 0xc0000000000UL) == 0x40000000000UL) \
   ? ((phys) ^= 0xc0000000000UL) : (phys))
diff -u --recursive --new-file v2.4.8/linux/include/asm-alpha/system.h linux/include/asm-alpha/system.h
--- v2.4.8/linux/include/asm-alpha/system.h	Thu May 24 15:20:18 2001
+++ linux/include/asm-alpha/system.h	Sun Aug 12 10:38:47 2001
@@ -192,7 +192,7 @@
 #ifdef CONFIG_ALPHA_EV5
 #define implver() IMPLVER_EV5
 #endif
-#ifdef CONFIG_ALPHA_EV6
+#if defined(CONFIG_ALPHA_EV6) || defined(CONFIG_ALPHA_EV67)
 #define implver() IMPLVER_EV6
 #endif
 #endif
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-anakin/dma.h linux/include/asm-arm/arch-anakin/dma.h
--- v2.4.8/linux/include/asm-arm/arch-anakin/dma.h	Wed Dec 31 16:00:00 1969
+++ linux/include/asm-arm/arch-anakin/dma.h	Sun Aug 12 11:14:00 2001
@@ -0,0 +1,20 @@
+/*
+ *  linux/include/asm-arm/arch-anakin/dma.h
+ *
+ *  Copyright (C) 2001 Aleph One Ltd. for Acunia N.V.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ *  Changelog:
+ *   09-Apr-2001 W/TTC	Created
+ */
+
+#ifndef __ASM_ARCH_DMA_H
+#define __ASM_ARCH_DMA_H
+
+#define MAX_DMA_ADDRESS		0xffffffff
+#define MAX_DMA_CHANNELS	0
+
+#endif
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-anakin/hardware.h linux/include/asm-arm/arch-anakin/hardware.h
--- v2.4.8/linux/include/asm-arm/arch-anakin/hardware.h	Wed Dec 31 16:00:00 1969
+++ linux/include/asm-arm/arch-anakin/hardware.h	Sun Aug 12 11:14:00 2001
@@ -0,0 +1,69 @@
+/*
+ *  linux/include/asm-arm/arch-anakin/hardware.h
+ *
+ *  Copyright (C) 2001 Aleph One Ltd. for Acunia N.V.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ *  Changelog:
+ *   10-Apr-2001 TTC	Created
+ */
+
+#ifndef __ASM_ARCH_HARDWARE_H
+#define __ASM_ARCH_HARDWARE_H
+
+/*
+ * Memory map
+ */
+#define SRAM_START		0x00000000
+#define SRAM_SIZE		0x00100000
+#define SRAM_BASE		0xdf000000
+
+#define SDRAM_START		0x20000000
+#define SDRAM_SIZE		0x04000000
+#define SDRAM_BASE		0xc0000000
+
+#define IO_START		0x40000000
+#define IO_SIZE			0x00100000
+#define IO_BASE			0xe0000000
+
+#define FLASH_START		0x60000000
+#define FLASH_SIZE		0x00080000
+#define FLASH_BASE		0xe8000000
+
+#define VGA_START		0x80000000
+#define VGA_SIZE		0x0002db40
+#define VGA_BASE		0xf0000000
+
+/*
+ * IO map
+ */
+#define IO_CONTROLLER		0x00000
+#define INTERRUPT_CONTROLLER	0x02000
+#define UART0			0x04000
+#define UART1			0x06000
+#define UART2			0x08000
+#define CODEC			0x0a000
+#define UART4			0x0c000
+#define UART3			0x0e000
+#define DISPLAY_CONTROLLER	0x10000
+#define DAB			0x12000
+#define STATE_CONTROLLER	0x14000
+#define CAN			0x23000
+#define COMPACTFLASH		0x24000
+
+/*
+ * Use SRAM for D-cache flush
+ */
+#define FLUSH_BASE_PHYS		SRAM_START
+#define FLUSH_BASE		SRAM_BASE
+#define UNCACHEABLE_ADDR	(SRAM_BASE + 0x10000)
+
+/*
+ * Use SDRAM for memory
+ */
+#define MEM_SIZE		SDRAM_SIZE
+
+#endif
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-anakin/ide.h linux/include/asm-arm/arch-anakin/ide.h
--- v2.4.8/linux/include/asm-arm/arch-anakin/ide.h	Wed Dec 31 16:00:00 1969
+++ linux/include/asm-arm/arch-anakin/ide.h	Sun Aug 12 11:14:00 2001
@@ -0,0 +1,56 @@
+/*
+ * linux/include/asm-arm/arch-anakin/ide.h
+ *
+ * Copyright 2001 Blue Mug Inc. for Acunia N.V.
+ *
+ * 08-jun-2001: Initial clone of arch-sa1100/ide.h by Jon McClintock
+ *              (jonm@bluemug.com).
+ */
+ 
+#include <linux/config.h>
+#include <asm/irq.h>
+#include <asm/hardware.h>
+
+/*
+ * Set up a hw structure for a specified data port, control port and IRQ.
+ * This should follow whatever the default interface uses.
+ */
+static __inline__ void
+ide_init_hwif_ports(hw_regs_t *hw, int data_port, int ctrl_port, int *irq)
+{
+	ide_ioreg_t reg;
+	int i;
+	int regincr = 4;
+	
+	memset(hw, 0, sizeof(*hw));
+
+	reg = (ide_ioreg_t)data_port;
+
+	for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) {
+		hw->io_ports[i] = reg;
+		reg += regincr;
+	}
+	
+	hw->io_ports[IDE_CONTROL_OFFSET] = (ide_ioreg_t) ctrl_port;
+	
+	if (irq)
+		*irq = 0;
+}
+
+
+/*
+ * This registers the standard ports for this architecture with the IDE
+ * driver.
+ */
+static __inline__ void
+ide_init_default_hwifs(void)
+{
+    hw_regs_t hw;
+
+    ide_init_hwif_ports(&hw, IO_BASE + COMPACTFLASH, 
+    			IO_BASE + COMPACTFLASH + IDE_CONTROL_OFFSET, NULL);
+    hw.irq = IRQ_COMPACTFLASH;
+    ide_register_hw(&hw, NULL);
+}
+
+
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-anakin/io.h linux/include/asm-arm/arch-anakin/io.h
--- v2.4.8/linux/include/asm-arm/arch-anakin/io.h	Wed Dec 31 16:00:00 1969
+++ linux/include/asm-arm/arch-anakin/io.h	Sun Aug 12 11:14:00 2001
@@ -0,0 +1,35 @@
+/*
+ *  linux/include/asm-arm/arch-anakin/io.h
+ *
+ *  Copyright (C) 2001 Aleph One Ltd. for Acunia N.V.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ *  Changelog:
+ *   10-Apr-2001 TTC	Created
+ */
+
+#ifndef __ASM_ARM_ARCH_IO_H
+#define __ASM_ARM_ARCH_IO_H
+
+
+#define IO_SPACE_LIMIT		0xffffffff
+
+#define __io(a)			a
+#define __arch_getw(a)		(*(volatile unsigned short *) (a))
+#define __arch_putw(b, a)	(*(volatile unsigned short *) (a) = (b))
+
+#define iomem_valid_addr(i, s)	1
+#define iomem_to_phys(i)	i
+
+/*
+ * We don't support ins[lb]/outs[lb].  Make them fault.
+ */
+#define __raw_readsb(p,d,l)	do { *(int *)0 = 0; } while (0)
+#define __raw_readsl(p,d,l)	do { *(int *)0 = 0; } while (0)
+#define __raw_writesb(p,d,l)	do { *(int *)0 = 0; } while (0)
+#define __raw_writesl(p,d,l)	do { *(int *)0 = 0; } while (0)
+
+#endif
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-anakin/irq.h linux/include/asm-arm/arch-anakin/irq.h
--- v2.4.8/linux/include/asm-arm/arch-anakin/irq.h	Wed Dec 31 16:00:00 1969
+++ linux/include/asm-arm/arch-anakin/irq.h	Sun Aug 12 11:14:00 2001
@@ -0,0 +1,19 @@
+/*
+ *  linux/include/asm-arm/arch-anakin/irq.h
+ *
+ *  Copyright (C) 2001 Aleph One Ltd. for Acunia N.V.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ *  Changelog:
+ *   10-Apr-2001 TTC	Created
+ */
+
+#ifndef __ASM_ARCH_IRQ_H
+#define __ASM_ARCH_IRQ_H
+
+#define fixup_irq(i)		i
+
+#endif
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-anakin/irqs.h linux/include/asm-arm/arch-anakin/irqs.h
--- v2.4.8/linux/include/asm-arm/arch-anakin/irqs.h	Wed Dec 31 16:00:00 1969
+++ linux/include/asm-arm/arch-anakin/irqs.h	Sun Aug 12 11:14:00 2001
@@ -0,0 +1,33 @@
+/*
+ *  linux/include/asm-arm/arch-anakin/irqs.h
+ *
+ *  Copyright (C) 2001 Aleph One Ltd. for Acunia N.V.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ *  Changelog:
+ *   10-Apr-2001 TTC	Created
+ */
+
+#ifndef __ASM_ARCH_IRQS_H
+#define __ASM_ARCH_IRQS_H
+
+#define NR_IRQS			16
+
+#define IRQ_UART0		0
+#define IRQ_UART1		1
+#define IRQ_UART2		2
+#define IRQ_TICK		3
+#define IRQ_CODEC		4
+#define IRQ_UART4		5
+#define IRQ_TOUCHSCREEN		6
+#define IRQ_UART3		7
+#define IRQ_FIFO		8
+#define IRQ_CAN			9
+#define IRQ_COMPACTFLASH	10
+#define IRQ_BOSH		12
+#define IRQ_ANAKIN		15
+
+#endif
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-anakin/keyboard.h linux/include/asm-arm/arch-anakin/keyboard.h
--- v2.4.8/linux/include/asm-arm/arch-anakin/keyboard.h	Wed Dec 31 16:00:00 1969
+++ linux/include/asm-arm/arch-anakin/keyboard.h	Sun Aug 12 11:14:00 2001
@@ -0,0 +1,29 @@
+/*
+ *  linux/include/asm-arm/arch-anakin/keyboard.h
+ *
+ *  Copyright (C) 2001 Aleph One Ltd. for Acunia N.V.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ *  Changelog:
+ *   11-Apr-2001 TTC	Created
+ */
+
+#ifndef __ASM_ARCH_KEYBOARD_H
+#define __ASM_ARCH_KEYBOARD_H
+
+#define kbd_setkeycode(s, k)	(-EINVAL)
+#define kbd_getkeycode(s)	(-EINVAL)
+#define kbd_translate(s, k, r)	0
+#define kbd_unexpected_up(k)	0
+#define kbd_leds(l)
+#define kbd_init_hw()
+#define kbd_sysrq_xlate		((int *) 0)
+#define kbd_disable_irq()
+#define kbd_enable_irq()
+
+#define SYSRQ_KEY		0x54
+
+#endif
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-anakin/memory.h linux/include/asm-arm/arch-anakin/memory.h
--- v2.4.8/linux/include/asm-arm/arch-anakin/memory.h	Wed Dec 31 16:00:00 1969
+++ linux/include/asm-arm/arch-anakin/memory.h	Sun Aug 12 11:14:00 2001
@@ -0,0 +1,36 @@
+/*
+ *  linux/include/asm-arm/arch-anakin/memory.h
+ *
+ *  Copyright (C) 2001 Aleph One Ltd. for Acunia N.V.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ *  Changelog:
+ *   09-Apr-2001 TTC	Created
+ */
+
+#ifndef __ASM_ARCH_MEMORY_H
+#define __ASM_ARCH_MEMORY_H
+
+#define TASK_SIZE		(3u * 1024 * 1024 * 1024)
+#define TASK_SIZE_26		(64u * 1024 * 1024)
+#define TASK_UNMAPPED_BASE	(1u * 1024 * 1024 * 1024)
+
+#define PAGE_OFFSET		0xc0000000
+#define PHYS_OFFSET		0x20000000
+
+#define __virt_to_phys(a)	((a) - PAGE_OFFSET + PHYS_OFFSET)
+#define __phys_to_virt(a)	((a) + PAGE_OFFSET - PHYS_OFFSET)
+#define __virt_to_bus(a)	__virt_to_phys(a)
+#define __bus_to_virt(a)	__phys_to_virt(a)
+
+#define __virt_to_phys__is_a_macro
+#define __phys_to_virt__is_a_macro
+#define __virt_to_bus__is_a_macro
+#define __bus_to_virt__is_a_macro
+
+#define PHYS_TO_NID(addr)	(0)
+
+#endif
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-anakin/param.h linux/include/asm-arm/arch-anakin/param.h
--- v2.4.8/linux/include/asm-arm/arch-anakin/param.h	Wed Dec 31 16:00:00 1969
+++ linux/include/asm-arm/arch-anakin/param.h	Sun Aug 12 11:14:00 2001
@@ -0,0 +1,21 @@
+/*
+ *  linux/include/asm-arm/arch-anakin/param.h
+ *
+ *  Copyright (C) 2001 Aleph One Ltd. for Acunia N.V.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ *  Changelog:
+ *   11-Apr-2001 TTC	Created
+ */
+
+#ifndef __ASM_ARCH_PARAM_H
+#define __ASM_ARCH_PARAM_H
+
+/*
+ * Reserved for future use
+ */
+
+#endif
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-anakin/serial.h linux/include/asm-arm/arch-anakin/serial.h
--- v2.4.8/linux/include/asm-arm/arch-anakin/serial.h	Wed Dec 31 16:00:00 1969
+++ linux/include/asm-arm/arch-anakin/serial.h	Sun Aug 12 11:14:00 2001
@@ -0,0 +1,30 @@
+/*
+ *  linux/include/asm-arm/arch-anakin/serial.h
+ *
+ *  Copyright (C) 2001 Aleph One Ltd. for Acunia N.V.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ *  Changelog:
+ *   11-Apr-2001 TTC	Created
+ */
+
+#ifndef __ASM_ARCH_SERIAL_H
+#define __ASM_ARCH_SERIAL_H
+
+#include <asm/io.h>
+#include <asm/irq.h>
+
+/*
+ * UART3 and UART4 are not supported yet
+ */
+#define RS_TABLE_SIZE		3
+#define STD_SERIAL_PORT_DEFNS	\
+	{ 0, 0, IO_BASE + UART0, IRQ_UART0, 0 }, \
+	{ 0, 0, IO_BASE + UART1, IRQ_UART1, 0 }, \
+	{ 0, 0, IO_BASE + UART2, IRQ_UART2, 0 }
+#define EXTRA_SERIAL_PORT_DEFNS
+
+#endif
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-anakin/serial_reg.h linux/include/asm-arm/arch-anakin/serial_reg.h
--- v2.4.8/linux/include/asm-arm/arch-anakin/serial_reg.h	Wed Dec 31 16:00:00 1969
+++ linux/include/asm-arm/arch-anakin/serial_reg.h	Sun Aug 12 11:14:00 2001
@@ -0,0 +1,65 @@
+/*
+ *  linux/include/asm-arm/arch-anakin/serial_reg.h
+ *
+ *  Copyright (C) 2001 Aleph One Ltd. for Acunia N.V.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ *  Changelog:
+ *   09-Apr-2001 TTC	Created
+ */
+
+#ifndef ASM_ARCH_SERIAL_REG_H
+#define ASM_ARCH_SERIAL_REG_H
+
+/*
+ * Serial registers (other than tx/rx)
+ */
+
+/*
+ * [UARTx + 0x10]
+ */
+#define RXRELEASE		(1 << 0)
+#define TXEMPTY			(1 << 1)
+#define CTS			(1 << 2)
+#define PRESCALER		(31 << 3)
+#define SETBAUD(baud)		((230400 / (baud) - 1) << 3)
+#define GETBAUD(prescaler)	(230400 / (((prescaler) >> 3) + 1))
+
+
+/*
+ * [UARTx + 0x18]
+ */
+#define IRQENABLE		(1 << 0)
+#define SENDREQUEST		(1 << 1)
+#define RTS			(1 << 2)
+#define DTR			(1 << 3)
+#define DCD			(1 << 4)
+#define BLOCKRX			(1 << 5)
+#define PARITY			(3 << 6)
+#define SETPARITY(parity)	((parity) << 6)
+#define GETPARITY(parity)	((parity) >> 6)
+#define NONEPARITY              (0)
+#define ODDPARITY               (1)
+#define EVENPARITY              (2)
+
+/*
+ * [UARTx + 0x1c]
+ */
+#define TX			(1 << 0)
+#define RX			(1 << 1)
+#define OVERRUN			(1 << 2)
+
+/*
+ * [UARTx + 0x20]
+ */
+#define SETBREAK		(1 << 0)
+
+/*
+ * Software interrupt register
+ */
+#define TXENABLE		(1 << 0)
+
+#endif 
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-anakin/system.h linux/include/asm-arm/arch-anakin/system.h
--- v2.4.8/linux/include/asm-arm/arch-anakin/system.h	Wed Dec 31 16:00:00 1969
+++ linux/include/asm-arm/arch-anakin/system.h	Sun Aug 12 11:14:00 2001
@@ -0,0 +1,29 @@
+/*
+ *  linux/include/asm-arm/arch-anakin/system.h
+ *
+ *  Copyright (C) 2001 Aleph One Ltd. for Acunia N.V.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ *  Changelog:
+ *   11-Apr-2001 TTC	Created
+ *   04-May-2001 W/PB	Removed cpu_do_idle()
+ */
+
+#ifndef __ASM_ARCH_SYSTEM_H
+#define __ASM_ARCH_SYSTEM_H
+
+static inline void
+arch_idle(void)
+{
+}
+
+static inline void
+arch_reset(char mode)
+{
+	cpu_reset(0);
+}
+
+#endif
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-anakin/time.h linux/include/asm-arm/arch-anakin/time.h
--- v2.4.8/linux/include/asm-arm/arch-anakin/time.h	Wed Dec 31 16:00:00 1969
+++ linux/include/asm-arm/arch-anakin/time.h	Sun Aug 12 11:14:00 2001
@@ -0,0 +1,31 @@
+/*
+ *  linux/include/asm-arm/arch-anakin/time.h
+ *
+ *  Copyright (C) 2001 Aleph One Ltd. for Acunia N.V.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ *  Changelog:
+ *   10-Apr-2001 TTC	Created
+ */
+
+#ifndef __ASM_ARCH_TIME_H
+#define __ASM_ARCH_TIME_H
+
+static void
+anakin_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+{
+	do_timer(regs);
+}
+
+static inline void
+setup_timer(void)
+{
+	timer_irq.handler = anakin_timer_interrupt;
+	timer_irq.flags = SA_INTERRUPT;
+	setup_arm_irq(IRQ_TICK, &timer_irq);
+}
+
+#endif
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-anakin/timex.h linux/include/asm-arm/arch-anakin/timex.h
--- v2.4.8/linux/include/asm-arm/arch-anakin/timex.h	Wed Dec 31 16:00:00 1969
+++ linux/include/asm-arm/arch-anakin/timex.h	Sun Aug 12 11:14:00 2001
@@ -0,0 +1,22 @@
+/*
+ *  linux/include/asm-arm/arch-anakin/timex.h
+ *
+ *  Copyright (C) 2001 Aleph One Ltd. for Acunia N.V.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ *  Changelog:
+ *   09-Apr-2001 TTC	Created
+ */
+
+#ifndef __ASM_ARCH_TIMEX_H
+#define __ASM_ARCH_TIMEX_H
+
+/*
+ * Timex specification for Anakin
+ */
+#define CLOCK_TICK_RATE		(1000 / 8)
+
+#endif
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-anakin/uncompress.h linux/include/asm-arm/arch-anakin/uncompress.h
--- v2.4.8/linux/include/asm-arm/arch-anakin/uncompress.h	Wed Dec 31 16:00:00 1969
+++ linux/include/asm-arm/arch-anakin/uncompress.h	Sun Aug 12 11:14:00 2001
@@ -0,0 +1,57 @@
+/*
+ *  linux/include/asm-arm/arch-anakin/uncompress.h
+ *
+ *  Copyright (C) 2001 Aleph One Ltd. for Acunia N.V.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ *  Changelog:
+ *   10-Apr-2001 TTC	Created
+ */
+
+#ifndef __ASM_ARCH_UNCOMPRESS_H
+#define __ASM_ARCH_UNCOMPRESS_H
+
+#include <asm/io.h>
+#include <asm/arch/serial_reg.h>
+
+#ifndef CONFIG_ANAKIN_DEFAULT_BAUDRATE
+#define CONFIG_ANAKIN_DEFAULT_BAUDRATE	9600
+#endif
+
+static inline void
+putc(int c)
+{
+	while (!(__raw_readl(IO_START + UART0 + 0x10) & TXEMPTY));
+	__raw_writel(c, IO_START + UART0 + 0x14);
+	__raw_writel(__raw_readl(IO_START + UART0 + 0x18)
+			| SENDREQUEST, IO_START + UART0 + 0x18);
+}
+
+static void
+puts(const char *s)
+{
+	int c;
+
+	while ((c = *s++)) {
+		putc(c);
+		if (c == '\n') putc('\r');
+	}
+}
+
+static void
+arch_decomp_setup(void)
+{
+	__raw_writel(__raw_readl(IO_START + UART0 + 0x10) & ~PRESCALER
+			| SETBAUD(CONFIG_ANAKIN_DEFAULT_BAUDRATE),
+			IO_START + UART0 + 0x10);
+	__raw_writel(__raw_readl(IO_START + UART0 + 0x18) & ~(IRQENABLE
+			| RTS | DTR | BLOCKRX | PARITY),
+			IO_START + UART0 + 0x18);
+}
+
+#define arch_decomp_wdog()
+
+#endif
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-anakin/vmalloc.h linux/include/asm-arm/arch-anakin/vmalloc.h
--- v2.4.8/linux/include/asm-arm/arch-anakin/vmalloc.h	Wed Dec 31 16:00:00 1969
+++ linux/include/asm-arm/arch-anakin/vmalloc.h	Sun Aug 12 11:14:00 2001
@@ -0,0 +1,26 @@
+/*
+ *  linux/include/asm-arm/arch-anakin/vmalloc.h
+ *
+ *  Copyright (C) 2001 Aleph One Ltd. for Acunia N.V.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ *  Changelog:
+ *   09-Apr-2001 TTC	Created
+ */
+
+#ifndef __ASM_ARCH_VMALLOC_H
+#define __ASM_ARCH_VMALLOC_H
+
+/*
+ * VMALLOC_ARCH_OFFSET must be set to VMALLOC_OFFSET (check
+ * linux/arch/arm/kernel/traps.c)
+ */
+#define VMALLOC_ARCH_OFFSET	(8 * 1024 * 1024)
+#define VMALLOC_VMADDR(a)	((unsigned int) (a))
+#define VMALLOC_START		((VMALLOC_VMADDR(high_memory) + VMALLOC_ARCH_OFFSET) & ~(VMALLOC_ARCH_OFFSET - 1))
+#define VMALLOC_END		(PAGE_OFFSET + 0x10000000)
+
+#endif
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-arc/hardware.h linux/include/asm-arm/arch-arc/hardware.h
--- v2.4.8/linux/include/asm-arm/arch-arc/hardware.h	Thu Apr 12 12:20:31 2001
+++ linux/include/asm-arm/arch-arc/hardware.h	Sun Aug 12 11:14:00 2001
@@ -69,7 +69,6 @@
 #define IOEB_MONTYPE		(IOEB_BASE + 0x70)
 #endif
 
-#define IO_EC_IOC4_BASE		0x8009c000
 #define IO_EC_IOC_BASE		0x80090000
 #define IO_EC_MEMC_BASE		0x80000000
 
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-arc/io.h linux/include/asm-arm/arch-arc/io.h
--- v2.4.8/linux/include/asm-arm/arch-arc/io.h	Thu Feb  8 16:32:44 2001
+++ linux/include/asm-arm/arch-arc/io.h	Sun Aug 12 11:14:00 2001
@@ -71,7 +71,7 @@
  * Dynamic IO functions - let the compiler
  * optimize the expressions
  */
-extern __inline__ void __outb (unsigned int value, unsigned int port)
+static inline void __outb (unsigned int value, unsigned int port)
 {
 	unsigned long temp;
 	__asm__ __volatile__(
@@ -84,7 +84,7 @@
 	: "cc");
 }
 
-extern __inline__ void __outw (unsigned int value, unsigned int port)
+static inline void __outw (unsigned int value, unsigned int port)
 {
 	unsigned long temp;
 	__asm__ __volatile__(
@@ -97,7 +97,7 @@
 	: "cc");
 }
 
-extern __inline__ void __outl (unsigned int value, unsigned int port)
+static inline void __outl (unsigned int value, unsigned int port)
 {
 	unsigned long temp;
 	__asm__ __volatile__(
@@ -111,7 +111,7 @@
 }
 
 #define DECLARE_DYN_IN(sz,fnsuffix,instr)					\
-extern __inline__ unsigned sz __in##fnsuffix (unsigned int port)		\
+static inline unsigned sz __in##fnsuffix (unsigned int port)		\
 {										\
 	unsigned long temp, value;						\
 	__asm__ __volatile__(							\
@@ -125,7 +125,7 @@
 	return (unsigned sz)value;						\
 }
 
-extern __inline__ unsigned int __ioaddr (unsigned int port)			\
+static inline unsigned int __ioaddr (unsigned int port)			\
 {										\
 	if (__PORT_PCIO(port))							\
 		return (unsigned int)(PCIO_BASE + (port << 2));			\
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-arc/memory.h linux/include/asm-arm/arch-arc/memory.h
--- v2.4.8/linux/include/asm-arm/arch-arc/memory.h	Mon Nov 27 17:07:59 2000
+++ linux/include/asm-arm/arch-arc/memory.h	Sun Aug 12 11:14:00 2001
@@ -50,4 +50,6 @@
 #define __bus_to_virt__is_a_macro
 #define __bus_to_virt(x)	(x)
 
+#define PHYS_TO_NID(addr)	(0)
+
 #endif
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-arc/system.h linux/include/asm-arm/arch-arc/system.h
--- v2.4.8/linux/include/asm-arm/arch-arc/system.h	Thu Apr 12 12:20:31 2001
+++ linux/include/asm-arm/arch-arc/system.h	Sun Aug 12 11:14:00 2001
@@ -13,7 +13,7 @@
 	while (!current->need_resched && !hlt_counter);
 }
 
-extern __inline__ void arch_reset(char mode)
+static inline void arch_reset(char mode)
 {
 	/*
 	 * copy branch instruction to reset location and call it
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-arc/time.h linux/include/asm-arm/arch-arc/time.h
--- v2.4.8/linux/include/asm-arm/arch-arc/time.h	Mon Sep 18 15:15:22 2000
+++ linux/include/asm-arm/arch-arc/time.h	Sun Aug 12 11:14:00 2001
@@ -24,7 +24,7 @@
 /*
  * Set up timer interrupt.
  */
-extern __inline__ void setup_timer(void)
+static inline void setup_timer(void)
 {
 	ioctime_init();
 
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-cl7500/io.h linux/include/asm-arm/arch-cl7500/io.h
--- v2.4.8/linux/include/asm-arm/arch-cl7500/io.h	Thu Feb  8 16:32:44 2001
+++ linux/include/asm-arm/arch-cl7500/io.h	Sun Aug 12 11:14:00 2001
@@ -68,7 +68,7 @@
  * Dynamic IO functions - let the compiler
  * optimize the expressions
  */
-extern __inline__ void __outb (unsigned int value, unsigned int port)
+static inline void __outb (unsigned int value, unsigned int port)
 {
 	unsigned long temp;
 	__asm__ __volatile__(
@@ -81,7 +81,7 @@
 	: "cc");
 }
 
-extern __inline__ void __outw (unsigned int value, unsigned int port)
+static inline void __outw (unsigned int value, unsigned int port)
 {
 	unsigned long temp;
 	__asm__ __volatile__(
@@ -94,7 +94,7 @@
 	: "cc");
 }
 
-extern __inline__ void __outl (unsigned int value, unsigned int port)
+static inline void __outl (unsigned int value, unsigned int port)
 {
 	unsigned long temp;
 	__asm__ __volatile__(
@@ -108,7 +108,7 @@
 }
 
 #define DECLARE_DYN_IN(sz,fnsuffix,instr)					\
-extern __inline__ unsigned sz __in##fnsuffix (unsigned int port)		\
+static inline unsigned sz __in##fnsuffix (unsigned int port)		\
 {										\
 	unsigned long temp, value;						\
 	__asm__ __volatile__(							\
@@ -122,7 +122,7 @@
 	return (unsigned sz)value;						\
 }
 
-extern __inline__ unsigned int __ioaddr (unsigned int port)			\
+static inline unsigned int __ioaddr (unsigned int port)			\
 {										\
 	if (__PORT_PCIO(port))							\
 		return (unsigned int)(PCIO_BASE + (port << 2));			\
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-cl7500/memory.h linux/include/asm-arm/arch-cl7500/memory.h
--- v2.4.8/linux/include/asm-arm/arch-cl7500/memory.h	Mon Nov 27 17:07:59 2000
+++ linux/include/asm-arm/arch-cl7500/memory.h	Sun Aug 12 11:14:00 2001
@@ -46,4 +46,6 @@
 #define __bus_to_virt__is_a_macro
 #define __bus_to_virt(x) __phys_to_virt(x)
 
+#define PHYS_TO_NID(addr)	(0)
+
 #endif
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-cl7500/time.h linux/include/asm-arm/arch-cl7500/time.h
--- v2.4.8/linux/include/asm-arm/arch-cl7500/time.h	Thu Apr 12 12:20:31 2001
+++ linux/include/asm-arm/arch-cl7500/time.h	Sun Aug 12 11:14:00 2001
@@ -29,7 +29,7 @@
 /*
  * Set up timer interrupt.
  */
-extern __inline__ void setup_timer(void)
+static inline void setup_timer(void)
 {
 	extern void ioctime_init(void);
 	ioctime_init();
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-ebsa110/memory.h linux/include/asm-arm/arch-ebsa110/memory.h
--- v2.4.8/linux/include/asm-arm/arch-ebsa110/memory.h	Thu Apr 12 12:20:31 2001
+++ linux/include/asm-arm/arch-ebsa110/memory.h	Sun Aug 12 11:14:00 2001
@@ -48,4 +48,6 @@
 #define __bus_to_virt__is_a_macro
 #define __bus_to_virt(x)	(x)
 
+#define PHYS_TO_NID(addr)	(0)
+
 #endif
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-ebsa110/time.h linux/include/asm-arm/arch-ebsa110/time.h
--- v2.4.8/linux/include/asm-arm/arch-ebsa110/time.h	Thu Apr 12 12:20:31 2001
+++ linux/include/asm-arm/arch-ebsa110/time.h	Sun Aug 12 11:14:00 2001
@@ -33,7 +33,7 @@
 /*
  * Set up timer interrupt.
  */
-extern __inline__ void setup_timer(void)
+static inline void setup_timer(void)
 {
 	ebsa110_setup_timer();
 
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-ebsa285/io.h linux/include/asm-arm/arch-ebsa285/io.h
--- v2.4.8/linux/include/asm-arm/arch-ebsa285/io.h	Wed Jul 25 17:10:25 2001
+++ linux/include/asm-arm/arch-ebsa285/io.h	Sun Aug 12 11:14:00 2001
@@ -25,14 +25,14 @@
 #define __mem_isa(a)		(PCIMEM_BASE + (unsigned long)(a))
 #else
 
-extern __inline__ unsigned long ___mem_pci(unsigned long a)
+static inline unsigned long ___mem_pci(unsigned long a)
 {
 	if (a <= 0xc0000000 || a >= 0xe0000000)
 		BUG();
 	return a;
 }
 
-extern __inline__ unsigned long ___mem_isa(unsigned long a)
+static inline unsigned long ___mem_isa(unsigned long a)
 {
 	if (a >= 16*1048576)
 		BUG();
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-ebsa285/memory.h linux/include/asm-arm/arch-ebsa285/memory.h
--- v2.4.8/linux/include/asm-arm/arch-ebsa285/memory.h	Mon Nov 27 17:07:59 2000
+++ linux/include/asm-arm/arch-ebsa285/memory.h	Sun Aug 12 11:14:00 2001
@@ -80,4 +80,6 @@
 #define __phys_to_virt__is_a_macro
 #define __phys_to_virt(ppage) ((unsigned long)(ppage) + PAGE_OFFSET)
 
+#define PHYS_TO_NID(addr)	(0)
+
 #endif
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-ebsa285/system.h linux/include/asm-arm/arch-ebsa285/system.h
--- v2.4.8/linux/include/asm-arm/arch-ebsa285/system.h	Wed May 16 15:25:16 2001
+++ linux/include/asm-arm/arch-ebsa285/system.h	Sun Aug 12 11:14:00 2001
@@ -35,7 +35,7 @@
 slow_out:
 }
 
-extern __inline__ void arch_reset(char mode)
+static inline void arch_reset(char mode)
 {
 	if (mode == 's') {
 		/*
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-ebsa285/time.h linux/include/asm-arm/arch-ebsa285/time.h
--- v2.4.8/linux/include/asm-arm/arch-ebsa285/time.h	Mon Sep 18 15:15:23 2000
+++ linux/include/asm-arm/arch-ebsa285/time.h	Sun Aug 12 11:14:00 2001
@@ -199,7 +199,7 @@
 /*
  * Set up timer interrupt.
  */
-extern __inline__ void setup_timer(void)
+static inline void setup_timer(void)
 {
 	int irq;
 
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-integrator/memory.h linux/include/asm-arm/arch-integrator/memory.h
--- v2.4.8/linux/include/asm-arm/arch-integrator/memory.h	Fri Mar  2 18:38:39 2001
+++ linux/include/asm-arm/arch-integrator/memory.h	Sun Aug 12 11:14:00 2001
@@ -58,4 +58,6 @@
 #define __bus_to_virt__is_a_macro
 #define __bus_to_virt(x)	(x - INTEGRATOR_HDR0_SDRAM_BASE + PAGE_OFFSET)
 
+#define PHYS_TO_NID(addr)	(0)
+
 #endif
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-integrator/system.h linux/include/asm-arm/arch-integrator/system.h
--- v2.4.8/linux/include/asm-arm/arch-integrator/system.h	Fri Mar  2 18:38:39 2001
+++ linux/include/asm-arm/arch-integrator/system.h	Sun Aug 12 11:14:00 2001
@@ -32,7 +32,7 @@
 	cpu_do_idle(0);
 }
 
-extern __inline__ void arch_reset(char mode)
+static inline void arch_reset(char mode)
 {
 	unsigned int hdr_ctrl =	(IO_ADDRESS(INTEGRATOR_HDR_BASE) + INTEGRATOR_HDR_CTRL_OFFSET);
 	unsigned int val;
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-integrator/time.h linux/include/asm-arm/arch-integrator/time.h
--- v2.4.8/linux/include/asm-arm/arch-integrator/time.h	Fri Mar  2 18:38:39 2001
+++ linux/include/asm-arm/arch-integrator/time.h	Sun Aug 12 11:14:00 2001
@@ -113,7 +113,7 @@
 /*
  * Set up timer interrupt, and return the current time in seconds.
  */
-extern __inline__ void setup_timer(void)
+static inline void setup_timer(void)
 {
 	volatile TimerStruct_t *timer0 = (volatile TimerStruct_t *)TIMER0_VA_BASE;
 	volatile TimerStruct_t *timer1 = (volatile TimerStruct_t *)TIMER1_VA_BASE;
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-l7200/io.h linux/include/asm-arm/arch-l7200/io.h
--- v2.4.8/linux/include/asm-arm/arch-l7200/io.h	Thu Apr 12 12:20:31 2001
+++ linux/include/asm-arm/arch-l7200/io.h	Sun Aug 12 11:14:00 2001
@@ -29,7 +29,7 @@
 #define __arch_getb(a)          (*(volatile unsigned char *)(a))
 #define __arch_getl(a)          (*(volatile unsigned int  *)(a))
 
-extern __inline__ unsigned int __arch_getw(unsigned long a)
+static inline unsigned int __arch_getw(unsigned long a)
 {
 	unsigned int value;
 	__asm__ __volatile__("ldr%?h    %0, [%1, #0]    @ getw"
@@ -41,7 +41,7 @@
 #define __arch_putb(v,a)        (*(volatile unsigned char *)(a) = (v))
 #define __arch_putl(v,a)        (*(volatile unsigned int  *)(a) = (v))
 
-extern __inline__ void __arch_putw(unsigned int value, unsigned long a)
+static inline void __arch_putw(unsigned int value, unsigned long a)
 {
         __asm__ __volatile__("str%?h    %0, [%1, #0]    @ putw"
                 : : "r" (value), "r" (a));
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-l7200/memory.h linux/include/asm-arm/arch-l7200/memory.h
--- v2.4.8/linux/include/asm-arm/arch-l7200/memory.h	Mon Nov 27 17:07:59 2000
+++ linux/include/asm-arm/arch-l7200/memory.h	Sun Aug 12 11:14:00 2001
@@ -47,4 +47,6 @@
 #define __bus_to_virt__is_a_macro
 #define __bus_to_virt(x) __phys_to_virt(x)
 
+#define PHYS_TO_NID(addr)	(0)
+
 #endif
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-l7200/system.h linux/include/asm-arm/arch-l7200/system.h
--- v2.4.8/linux/include/asm-arm/arch-l7200/system.h	Thu Apr 12 12:20:31 2001
+++ linux/include/asm-arm/arch-l7200/system.h	Sun Aug 12 11:14:00 2001
@@ -18,7 +18,7 @@
 	*(unsigned long *)(IO_BASE + 0x50004) = 1;	/* idle mode */
 }
 
-extern inline void arch_reset(char mode)
+static inline void arch_reset(char mode)
 {
 	if (mode == 's') {
 		cpu_reset(0);
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-l7200/time.h linux/include/asm-arm/arch-l7200/time.h
--- v2.4.8/linux/include/asm-arm/arch-l7200/time.h	Thu Apr 12 12:20:31 2001
+++ linux/include/asm-arm/arch-l7200/time.h	Sun Aug 12 11:14:00 2001
@@ -52,7 +52,7 @@
 /*
  * Set up RTC timer interrupt, and return the current time in seconds.
  */
-extern __inline__ void setup_timer(void)
+static inline void setup_timer(void)
 {
 	RTC_RTCC = 0;				/* Clear interrupt */
 
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-nexuspci/io.h linux/include/asm-arm/arch-nexuspci/io.h
--- v2.4.8/linux/include/asm-arm/arch-nexuspci/io.h	Thu Feb  8 16:32:44 2001
+++ linux/include/asm-arm/arch-nexuspci/io.h	Sun Aug 12 11:14:00 2001
@@ -18,7 +18,7 @@
 #define __mem_isa(a)		(PCIMEM_BASE + (unsigned long)(a))
 #else
 
-extern __inline__ unsigned long ___mem_pci(unsigned long a)
+static inline unsigned long ___mem_pci(unsigned long a)
 {
 	/* PCI addresses must have been ioremapped */
 	if (a <= 0xc0000000 || a >= 0xe0000000)
@@ -26,7 +26,7 @@
 	return a;
 }
 
-extern __inline__ unsigned long ___mem_isa(unsigned long a)
+static inline unsigned long ___mem_isa(unsigned long a)
 {
 	if (a >= 16*1048576)
 		BUG();
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-nexuspci/memory.h linux/include/asm-arm/arch-nexuspci/memory.h
--- v2.4.8/linux/include/asm-arm/arch-nexuspci/memory.h	Mon Nov 27 17:07:59 2000
+++ linux/include/asm-arm/arch-nexuspci/memory.h	Sun Aug 12 11:14:00 2001
@@ -43,4 +43,6 @@
 #define __bus_to_virt__is_a_macro
 #define __bus_to_virt(x) ((unsigned long)(x) + PAGE_OFFSET - BUS_OFFSET)
 
+#define PHYS_TO_NID(addr)	(0)
+
 #endif
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-nexuspci/time.h linux/include/asm-arm/arch-nexuspci/time.h
--- v2.4.8/linux/include/asm-arm/arch-nexuspci/time.h	Mon Sep 18 15:15:23 2000
+++ linux/include/asm-arm/arch-nexuspci/time.h	Sun Aug 12 11:14:00 2001
@@ -43,7 +43,7 @@
 	do_timer(regs);	
 }
 
-extern __inline__ void setup_timer(void)
+static inline void setup_timer(void)
 {
 	int tick = 3686400 / 16 / 2 / 100;
 
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-rpc/io.h linux/include/asm-arm/arch-rpc/io.h
--- v2.4.8/linux/include/asm-arm/arch-rpc/io.h	Thu Feb  8 16:32:44 2001
+++ linux/include/asm-arm/arch-rpc/io.h	Sun Aug 12 11:14:00 2001
@@ -70,7 +70,7 @@
 /*
  * Dynamic IO functions.
  */
-extern __inline__ void __outb (unsigned int value, unsigned int port)
+static inline void __outb (unsigned int value, unsigned int port)
 {
 	unsigned long temp;
 	__asm__ __volatile__(
@@ -83,7 +83,7 @@
 	: "cc");
 }
 
-extern __inline__ void __outw (unsigned int value, unsigned int port)
+static inline void __outw (unsigned int value, unsigned int port)
 {
 	unsigned long temp;
 	__asm__ __volatile__(
@@ -96,7 +96,7 @@
 	: "cc");
 }
 
-extern __inline__ void __outl (unsigned int value, unsigned int port)
+static inline void __outl (unsigned int value, unsigned int port)
 {
 	unsigned long temp;
 	__asm__ __volatile__(
@@ -110,7 +110,7 @@
 }
 
 #define DECLARE_DYN_IN(sz,fnsuffix,instr)					\
-extern __inline__ unsigned sz __in##fnsuffix (unsigned int port)		\
+static inline unsigned sz __in##fnsuffix (unsigned int port)		\
 {										\
 	unsigned long temp, value;						\
 	__asm__ __volatile__(							\
@@ -124,7 +124,7 @@
 	return (unsigned sz)value;						\
 }
 
-extern __inline__ unsigned int __ioaddr (unsigned int port)			\
+static inline unsigned int __ioaddr (unsigned int port)			\
 {										\
 	if (__PORT_PCIO(port))							\
 		return (unsigned int)(PCIO_BASE + (port << 2));			\
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-rpc/memory.h linux/include/asm-arm/arch-rpc/memory.h
--- v2.4.8/linux/include/asm-arm/arch-rpc/memory.h	Mon Nov 27 17:07:59 2000
+++ linux/include/asm-arm/arch-rpc/memory.h	Sun Aug 12 11:14:00 2001
@@ -50,4 +50,6 @@
 #define __bus_to_virt__is_a_macro
 #define __bus_to_virt(x) __phys_to_virt(x)
 
+#define PHYS_TO_NID(addr)	(0)
+
 #endif
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-rpc/system.h linux/include/asm-arm/arch-rpc/system.h
--- v2.4.8/linux/include/asm-arm/arch-rpc/system.h	Thu Apr 12 12:20:31 2001
+++ linux/include/asm-arm/arch-rpc/system.h	Sun Aug 12 11:14:00 2001
@@ -33,7 +33,7 @@
 slow_out:
 }
 
-extern __inline__ void arch_reset(char mode)
+static inline void arch_reset(char mode)
 {
 	iomd_writeb(0, IOMD_ROMCR0);
 
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-rpc/time.h linux/include/asm-arm/arch-rpc/time.h
--- v2.4.8/linux/include/asm-arm/arch-rpc/time.h	Mon Sep 18 15:15:23 2000
+++ linux/include/asm-arm/arch-rpc/time.h	Sun Aug 12 11:14:00 2001
@@ -24,7 +24,7 @@
 /*
  * Set up timer interrupt.
  */
-extern __inline__ void setup_timer(void)
+static inline void setup_timer(void)
 {
 	ioctime_init();
 
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-sa1100/SA-1100.h linux/include/asm-arm/arch-sa1100/SA-1100.h
--- v2.4.8/linux/include/asm-arm/arch-sa1100/SA-1100.h	Thu Apr 12 12:20:31 2001
+++ linux/include/asm-arm/arch-sa1100/SA-1100.h	Sun Aug 12 17:36:24 2001
@@ -455,6 +455,17 @@
 #define _Ser3UTSR0	_UTSR0 (3)	/* Ser. port 3 UART Status Reg. 0  */
 #define _Ser3UTSR1	_UTSR1 (3)	/* Ser. port 3 UART Status Reg. 1  */
 
+/*
+ * Register offsets
+ */
+#define UTCR0		0x00
+#define UTCR1		0x04
+#define UTCR2		0x08
+#define UTCR3		0x0c
+#define UTDR		0x14
+#define UTSR0		0x1c
+#define UTSR1		0x20
+
 #if LANGUAGE == C
 
 #define Ser1UTCR0	        	/* Ser. port 1 UART Control Reg. 0 */ \
@@ -1917,6 +1928,7 @@
                 	(0xA0000010 + (Nb)*4)
 #define _MSC0   	_MSC (0)	/*  Static memory Control reg. 0   */
 #define _MSC1   	_MSC (1)	/*  Static memory Control reg. 1   */
+#define _MSC2		0xA000002C	/*  Static memory Control reg. 2, not contiguous   */
 
 #if LANGUAGE == C
                 	        	/* Memory system:                  */
@@ -1925,6 +1937,7 @@
                 	((volatile Word *) io_p2v (_MSC (0)))
 #define MSC0    	(MSC [0])	/*  Static memory Control reg. 0   */
 #define MSC1    	(MSC [1])	/*  Static memory Control reg. 1   */
+#define MSC2    	(*(volatile Word *) io_p2v (_MSC2))	/*  Static memory Control reg. 2   */
 
 #elif LANGUAGE == Assembly
 
@@ -2748,10 +2761,10 @@
 #define LCCR1_DisWdth(Pixel)    	/*  Display Width [16..1024 pix.]  */ \
                 	(((Pixel) - 16)/16 << FShft (LCCR1_PPL))
 #define LCCR1_HSW	Fld (6, 10)	/* Horizontal Synchronization      */
-                	        	/* pulse Width - 2 [Tpix] (L_LCLK) */
+                	        	/* pulse Width - 1 [Tpix] (L_LCLK) */
 #define LCCR1_HorSnchWdth(Tpix) 	/*  Horizontal Synchronization     */ \
-                	        	/*  pulse Width [2..65 Tpix]       */ \
-                	(((Tpix) - 2) << FShft (LCCR1_HSW))
+                	        	/*  pulse Width [1..64 Tpix]       */ \
+                	(((Tpix) - 1) << FShft (LCCR1_HSW))
 #define LCCR1_ELW	Fld (8, 16)	/* End-of-Line pixel clock Wait    */
                 	        	/* count - 1 [Tpix]                */
 #define LCCR1_EndLnDel(Tpix)    	/*  End-of-Line Delay              */ \
@@ -2825,8 +2838,8 @@
 #define LCCR3_HorSnchL	(LCCR3_HSP*1)	/*  Horizontal Synchronization     */
                 	        	/*  pulse active Low               */
 #define LCCR3_PCP	0x00400000	/* Pixel Clock Polarity (L_PCLK)   */
-#define LCCR3_PixFlEdg	(LCCR3_PCP*0)	/*  Pixel clock Falling-Edge       */
-#define LCCR3_PixRsEdg	(LCCR3_PCP*1)	/*  Pixel clock Rising-Edge        */
+#define LCCR3_PixRsEdg	(LCCR3_PCP*0)	/*  Pixel clock Rising-Edge        */
+#define LCCR3_PixFlEdg	(LCCR3_PCP*1)	/*  Pixel clock Falling-Edge       */
 #define LCCR3_OEP	0x00800000	/* Output Enable Polarity (L_BIAS, */
                 	        	/* active display mode)            */
 #define LCCR3_OutEnH	(LCCR3_OEP*0)	/*  Output Enable active High      */
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-sa1100/SA-1111.h linux/include/asm-arm/arch-sa1100/SA-1111.h
--- v2.4.8/linux/include/asm-arm/arch-sa1100/SA-1111.h	Thu Feb  8 16:32:44 2001
+++ linux/include/asm-arm/arch-sa1100/SA-1111.h	Sun Aug 12 11:14:00 2001
@@ -231,7 +231,7 @@
 #define SACR2_DREC	(1<<3)
 #define SACR2_DRPL	(1<<4)
 #define SACR2_ENLBF	(1<<5)
-#define SACR2_RESET	(1<<5)
+#define SACR2_RESET	(1<<6)
 
 #define SASR0_TNF	(1<<0)
 #define SASR0_RNE	(1<<1)
@@ -447,8 +447,8 @@
 #define _MSECR      _SA1111( 0x0C00 )
 #define _MSESTAT    _SA1111( 0x0C04 )
 #define _MSEDATA    _SA1111( 0x0C08 )
-#define _MSECLKDIV  _SA1111( 0x0C10 )
-#define _MSEPRECNT  _SA1111( 0x0C14 )
+#define _MSECLKDIV  _SA1111( 0x0C0C )
+#define _MSEPRECNT  _SA1111( 0x0C10 )
 
 #if ( LANGUAGE == C )
 
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-sa1100/assabet.h linux/include/asm-arm/arch-sa1100/assabet.h
--- v2.4.8/linux/include/asm-arm/arch-sa1100/assabet.h	Thu Apr 12 12:20:31 2001
+++ linux/include/asm-arm/arch-sa1100/assabet.h	Sun Aug 12 17:36:24 2001
@@ -31,8 +31,14 @@
 #define BCR_BASE  0xf1000000
 #define BCR (*(volatile unsigned int *)(BCR_BASE))
 
-#define BCR_DB1110	(0x00A07410)
-#define BCR_DB1111	(0x00A074E2)
+#define BCR_DB1110 \
+	(BCR_SPK_OFF  | BCR_QMUTE     | BCR_LED_GREEN  | BCR_LED_RED   | \
+	 BCR_RS232EN  | BCR_LCD_12RGB | BCR_IRDA_MD0)
+
+#define BCR_DB1111 \
+	(BCR_SPK_OFF  | BCR_QMUTE     | BCR_LED_GREEN  | BCR_LED_RED   | \
+	 BCR_RS232EN  | BCR_LCD_12RGB | BCR_CF_BUS_OFF | BCR_STEREO_LB | \
+	 BCR_IRDA_MD1 | BCR_CF_RST)
 
 #define BCR_CF_PWR	(1<<0)	/* Compact Flash Power (1 = 3.3v, 0 = off) */
 #define BCR_CF_RST	(1<<1)	/* Compact Flash Reset (1 = power up reset) */
@@ -67,6 +73,18 @@
 #define BCR_clear( x )	BCR = (BCR_value &= ~(x))
 #endif
 
+#define BSR_BASE	0xf1000000
+#define BSR (*(volatile unsigned int*)(BSR_BASE))
+
+#define BSR_RS232_VALID	(1 << 24)
+#define BSR_COM_DCD	(1 << 25)
+#define BSR_COM_CTS	(1 << 26)
+#define BSR_COM_DSR	(1 << 27)
+#define BSR_RAD_CTS	(1 << 28)
+#define BSR_RAD_DSR	(1 << 29)
+#define BSR_RAD_DCD	(1 << 30)
+#define BSR_RAD_RI	(1 << 31)
+
 
 /* GPIOs for which the generic definition doesn't say much */
 #define GPIO_RADIO_IRQ		GPIO_GPIO (14)	/* Radio interrupt request  */
@@ -106,8 +124,8 @@
 #define NEPONSET_USAR_IRQ	MISC_IRQ1
 
 #define NEPONSET_CPLD_BASE      (0x10000000)
-#define Nep_p2v( x )            ((x) - NEPONSET_CPLD_BASE + 0xf0000000)
-#define Nep_v2p( x )            ((x) - 0xf0000000 + NEPONSET_CPLD_BASE)
+#define Nep_p2v( x )            ((x) - NEPONSET_CPLD_BASE + 0xf3000000)
+#define Nep_v2p( x )            ((x) - 0xf3000000 + NEPONSET_CPLD_BASE)
 
 #define _IRR                    0x10000024      /* Interrupt Reason Register */
 #define _AUD_CTL                0x100000c0      /* Audio controls (RW)       */
@@ -143,6 +161,18 @@
 
 #define AUD_SEL_1341            (1<<0)
 #define AUD_MUTE_1341           (1<<1)
+
+#define MDM_CTL0_RTS1		(1 << 0)
+#define MDM_CTL0_DTR1		(1 << 1)
+#define MDM_CTL0_RTS2		(1 << 2)
+#define MDM_CTL0_DTR2		(1 << 3)
+
+#define MDM_CTL1_CTS1		(1 << 0)
+#define MDM_CTL1_DSR1		(1 << 1)
+#define MDM_CTL1_DCD1		(1 << 2)
+#define MDM_CTL1_CTS2		(1 << 3)
+#define MDM_CTL1_DSR2		(1 << 4)
+#define MDM_CTL1_DCD2		(1 << 5)
 
 #define NCR_GP01_OFF		(1<<0)
 #define NCR_TP_PWR_EN		(1<<1)
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-sa1100/bitsy.h linux/include/asm-arm/arch-sa1100/bitsy.h
--- v2.4.8/linux/include/asm-arm/arch-sa1100/bitsy.h	Thu Apr 12 12:20:31 2001
+++ linux/include/asm-arm/arch-sa1100/bitsy.h	Sun Aug 12 11:14:00 2001
@@ -1,50 +1,79 @@
+/*
+*
+* Definitions for H3600 Handheld Computer
+*
+* Copyright 2000 Compaq Computer Corporation.
+*
+* Use consistent with the GNU GPL is permitted,
+* provided that this copyright notice is
+* preserved in its entirety in all copies and derived works.
+*
+* COMPAQ COMPUTER CORPORATION MAKES NO WARRANTIES, EXPRESSED OR IMPLIED,
+* AS TO THE USEFULNESS OR CORRECTNESS OF THIS CODE OR ITS
+* FITNESS FOR ANY PARTICULAR PURPOSE.
+*
+* Author: Jamey Hicks.
+*
+*/
+
 #ifndef _INCLUDE_BITSY_H_
 #define _INCLUDE_BITSY_H_
 
-#define GPIO_BITSY_NPOWER_BUTTON    GPIO_GPIO (0)
-#define GPIO_BITSY_ACTION_BUTTON    GPIO_GPIO (18)
+#define GPIO_BITSY_NPOWER_BUTTON	GPIO_GPIO (0)
+#define GPIO_BITSY_ACTION_BUTTON	GPIO_GPIO (18)
 
-#define GPIO_BITSY_PCMCIA_CD0  GPIO_GPIO (17)
-#define GPIO_BITSY_PCMCIA_CD1  GPIO_GPIO (10)
-#define GPIO_BITSY_PCMCIA_IRQ0 GPIO_GPIO (21)
-#define GPIO_BITSY_PCMCIA_IRQ1 GPIO_GPIO (11)
+#define GPIO_BITSY_PCMCIA_CD0		GPIO_GPIO (17)
+#define GPIO_BITSY_PCMCIA_CD1		GPIO_GPIO (10)
+#define GPIO_BITSY_PCMCIA_IRQ0		GPIO_GPIO (21)
+#define GPIO_BITSY_PCMCIA_IRQ1		GPIO_GPIO (11)
 
 /* audio sample rate clock generator */
-#define GPIO_BITSY_CLK_SET0    GPIO_GPIO (12)
-#define GPIO_BITSY_CLK_SET1    GPIO_GPIO (13)
-/* UDA1341 L3 Interface */
-#define GPIO_BITSY_L3_DATA     GPIO_GPIO (14)
-#define GPIO_BITSY_L3_CLOCK    GPIO_GPIO (16)
-#define GPIO_BITSY_L3_MODE     GPIO_GPIO (15)
-
+#define GPIO_BITSY_CLK_SET0		GPIO_GPIO (12)
+#define GPIO_BITSY_CLK_SET1		GPIO_GPIO (13)
 
+/* UDA1341 L3 Interface */
+#define GPIO_BITSY_L3_DATA		GPIO_GPIO (14)
+#define GPIO_BITSY_L3_CLOCK		GPIO_GPIO (16)
+#define GPIO_BITSY_L3_MODE		GPIO_GPIO (15)
+
+#define GPIO_BITSY_OPT_LOCK		GPIO_GPIO (22)
+#define GPIO_BITSY_OPT_IRQ		GPIO_GPIO (24)
+#define GPIO_BITSY_OPT_DET		GPIO_GPIO (27)
+
+#define GPIO_BITSY_COM_DCD		GPIO_GPIO (23)
+#define GPIO_BITSY_COM_CTS		GPIO_GPIO (25)
+#define GPIO_BITSY_COM_RTS		GPIO_GPIO (26)
 
 #define IRQ_GPIO_BITSY_NPOWER_BUTTON    IRQ_GPIO0
 #define IRQ_GPIO_BITSY_ACTION_BUTTON    IRQ_GPIO18
 #define IRQ_GPIO_BITSY_PCMCIA_CD0	IRQ_GPIO17
 #define IRQ_GPIO_BITSY_PCMCIA_CD1	IRQ_GPIO10
 #define IRQ_GPIO_BITSY_PCMCIA_IRQ0	IRQ_GPIO21
-#define IRQ_GPIO_BITSY_PCMCIA_IRQ1	IRQ_GPIO22
-
-#define EGPIO_BITSY_VPP_ON      (1 << 0)
-#define EGPIO_BITSY_CARD_RESET  (1 << 1)    /* reset the attached pcmcia/compactflash card.  active high. */
-#define EGPIO_BITSY_OPT_RESET   (1 << 2)    /* reset the attached option pack.  active high. */
-#define EGPIO_BITSY_CODEC_NRESET (1 << 3)   /* reset the onboard UDA1341.  active low. */
-#define EGPIO_BITSY_OPT_NVRAM_ON (1 << 4)   /* apply power to optionpack nvram, active high. */
-#define EGPIO_BITSY_OPT_ON       (1 << 5)   /* full power to option pack.  active high. */
-#define EGPIO_BITSY_LCD_ON       (1 << 6)   /* enable 3.3V to LCD.  active high. */
-#define EGPIO_BITSY_RS232_ON     (1 << 7)   /* UART3 transceiver force on.  Active high. */
-#define EGPIO_BITSY_LCD_PCI      (1 << 8)   /* LCD control IC enable.  active high. */
-#define EGPIO_BITSY_IR_ON        (1 << 9)   /* apply power to IR module.  active high. */
-#define EGPIO_BITSY_AUD_AMP_ON   (1 << 10)  /* apply power to audio power amp.  active high. */
-#define EGPIO_BITSY_AUD_PWR_ON   (1 << 11)  /* apply poewr to reset of audio circuit.  active high. */
-#define EGPIO_BITSY_QMUTE        (1 << 12)  /* mute control for onboard UDA1341.  active high. */
-#define EGPIO_BITSY_IR_FSEL      (1 << 13)  /* IR speed select: 1->fast, 0->slow */
-#define EGPIO_BITSY_LCD_5V_ON    (1 << 14)  /* enable 5V to LCD. active high. */
-#define EGPIO_BITSY_LVDD_ON      (1 << 15)  /* enable 9V and -6.5V to LCD. */
+#define IRQ_GPIO_BITSY_PCMCIA_IRQ1	IRQ_GPIO11
+#define IRQ_GPIO_BITSY_OPT_IRQ		IRQ_GPIO24
+#define IRQ_GPIO_BITSY_OPT_DET		IRQ_GPIO27
+#define IRQ_GPIO_BITSY_COM_DCD          IRQ_GPIO23
+#define IRQ_GPIO_BITSY_COM_CTS          IRQ_GPIO25
+
+#define EGPIO_BITSY_VPP_ON		(1 << 0)
+#define EGPIO_BITSY_CARD_RESET		(1 << 1)  /* reset the attached pcmcia/compactflash card.  active high. */
+#define EGPIO_BITSY_OPT_RESET		(1 << 2)  /* reset the attached option pack.  active high. */
+#define EGPIO_BITSY_CODEC_NRESET	(1 << 3)  /* reset the onboard UDA1341.  active low. */
+#define EGPIO_BITSY_OPT_NVRAM_ON	(1 << 4)  /* apply power to optionpack nvram, active high. */
+#define EGPIO_BITSY_OPT_ON		(1 << 5)  /* full power to option pack.  active high. */
+#define EGPIO_BITSY_LCD_ON       	(1 << 6)  /* enable 3.3V to LCD.  active high. */
+#define EGPIO_BITSY_RS232_ON		(1 << 7)  /* UART3 transceiver force on.  Active high. */
+#define EGPIO_BITSY_LCD_PCI		(1 << 8)  /* LCD control IC enable.  active high. */
+#define EGPIO_BITSY_IR_ON		(1 << 9)  /* apply power to IR module.  active high. */
+#define EGPIO_BITSY_AUD_AMP_ON		(1 << 10) /* apply power to audio power amp.  active high. */
+#define EGPIO_BITSY_AUD_PWR_ON		(1 << 11) /* apply poewr to reset of audio circuit.  active high. */
+#define EGPIO_BITSY_QMUTE		(1 << 12) /* mute control for onboard UDA1341.  active high. */
+#define EGPIO_BITSY_IR_FSEL		(1 << 13) /* IR speed select: 1->fast, 0->slow */
+#define EGPIO_BITSY_LCD_5V_ON		(1 << 14) /* enable 5V to LCD. active high. */
+#define EGPIO_BITSY_LVDD_ON		(1 << 15) /* enable 9V and -6.5V to LCD. */
 
 #ifndef __ASSEMBLY__
-#define BITSY_EGPIO  (*(volatile int *)0xf0000000)
+#define BITSY_EGPIO	(*(volatile int *)0xf0000000)
 extern void clr_bitsy_egpio(unsigned long x);
 extern void set_bitsy_egpio(unsigned long x);
 #endif
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-sa1100/dma.h linux/include/asm-arm/arch-sa1100/dma.h
--- v2.4.8/linux/include/asm-arm/arch-sa1100/dma.h	Thu Apr 12 12:20:31 2001
+++ linux/include/asm-arm/arch-sa1100/dma.h	Sun Aug 12 11:14:00 2001
@@ -86,9 +86,9 @@
 
 
 /* SA1100 DMA API */
-extern int sa1100_request_dma( dmach_t *channel, const char *device_id );
+extern int sa1100_request_dma( dmach_t *channel, const char *device_id,
+			       dma_device_t device );
 extern int sa1100_dma_set_callback( dmach_t channel, dma_callback_t cb );
-extern int sa1100_dma_set_device( dmach_t channel, dma_device_t device );
 extern int sa1100_dma_set_spin( dmach_t channel, dma_addr_t addr, int size );
 extern int sa1100_dma_queue_buffer( dmach_t channel, void *buf_id,
 				    dma_addr_t data, int size );
@@ -97,11 +97,23 @@
 extern int sa1100_dma_resume( dmach_t channel );
 extern int sa1100_dma_flush_all( dmach_t channel );
 extern void sa1100_free_dma( dmach_t channel );
+extern int sa1100_dma_sleep( dmach_t channel );
+extern int sa1100_dma_wakeup( dmach_t channel );
 
 /* Sa1111 DMA interface (all but registration uses the above) */
 extern int sa1111_sac_request_dma( dmach_t *channel, const char *device_id,
 				   unsigned int direction );
 extern int sa1111_check_dma_bug( dma_addr_t addr );
 
+#ifdef CONFIG_SA1111
+static inline void
+__arch_adjust_zones(int node, unsigned long *size, unsigned long *holes)
+{
+	size[1] = size[0] - 256;
+	size[0] = 256;
+}
+
+#define arch_adjust_zones(node,size,holes) __arch_adjust_zones(node,size,holes)
+#endif
 
 #endif /* _ASM_ARCH_DMA_H */
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-sa1100/flexanet.h linux/include/asm-arm/arch-sa1100/flexanet.h
--- v2.4.8/linux/include/asm-arm/arch-sa1100/flexanet.h	Wed Dec 31 16:00:00 1969
+++ linux/include/asm-arm/arch-sa1100/flexanet.h	Sun Aug 12 11:14:00 2001
@@ -0,0 +1,71 @@
+/*
+ * linux/include/asm-arm/arch-sa1100/flexanet.h
+ *
+ * Created 2001/05/04 by Jordi Colomer <jco@ict.es>
+ *
+ * This file contains the hardware specific definitions for FlexaNet
+ *
+ */
+
+#ifndef __ASM_ARCH_HARDWARE_H
+#error "include <asm/hardware.h> instead"
+#endif
+
+
+/* Board Control Register (virtual address) */
+#define BCR_PHYS  0x10000000
+#define BCR_VIRT  0xf0000000
+#define BCR (*(volatile unsigned int *)(BCR_VIRT))
+
+/* Power-up value */
+#define BCR_POWERUP	0x00000000
+
+/* Mandatory bits */
+#define BCR_LED_GREEN	(1<<0)	/* General-purpose green LED (1 = on) */
+#define BCR_GUI_NRST	(1<<4)	/* GUI board reset (0 = reset) */
+
+/* Board Status Register (virtual address) */
+#define BSR_BASE  BCR_BASE
+#define BSR (*(volatile unsigned int *)(BSR_BASE))
+
+
+#ifndef __ASSEMBLY__
+extern unsigned long BCR_value;	/* Image of the BCR */
+#define BCR_set( x )	BCR = (BCR_value |= (x))
+#define BCR_clear( x )	BCR = (BCR_value &= ~(x))
+#endif
+
+
+/* GPIOs for which the generic definition doesn't say much */
+#define GPIO_GUI_IRQ		GPIO_GPIO (23)	/* IRQ from GUI board (i.e., UCB1300) */
+#define GPIO_ETH_IRQ		GPIO_GPIO (24)	/* IRQ from Ethernet controller */
+#define GPIO_LED_RED		GPIO_GPIO (26)	/* General-purpose red LED */
+
+/* IRQ sources from GPIOs */
+#define IRQ_GPIO_GUI		IRQ_GPIO23
+#define IRQ_GPIO_ETH		IRQ_GPIO24
+
+/* On-Board Ethernet */
+#define _FHH_ETH_IOBASE		0x18000000	/* I/O base (physical addr) */
+#define _FHH_ETH_MMBASE		0x18800000	/* Attribute-memory base */
+#define FHH_ETH_SIZE		0x01000000	/* total size */
+#define FHH_ETH_VIRT		0xF1000000	/* Ethernet virtual address */
+
+#define FHH_ETH_p2v( x )	((x) - _FHH_ETH_IOBASE + FHH_ETH_VIRT)
+#define FHH_ETH_v2p( x )	((x) - FHH_ETH_VIRT + _FHH_ETH_IOBASE)
+
+#define FHH_ETH_IOBASE		FHH_ETH_p2v(_FHH_ETH_IOBASE) /* Virtual base addr */
+#define FHH_ETH_MMBASE		FHH_ETH_p2v(_FHH_ETH_MMBASE)
+
+
+/* Types of GUI */
+#ifndef __ASSEMBLY__
+extern unsigned long GUI_type;
+#endif
+
+#define FHH_GUI_ERROR		0xFFFFFFFF
+#define FHH_GUI_NONE		0x0000000F
+#define FHH_GUI_TYPE_0		0
+#define FHH_GUI_TYPE_1		1
+#define FHH_GUI_TYPE_2		2
+
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-sa1100/freebird.h linux/include/asm-arm/arch-sa1100/freebird.h
--- v2.4.8/linux/include/asm-arm/arch-sa1100/freebird.h	Wed Dec 31 16:00:00 1969
+++ linux/include/asm-arm/arch-sa1100/freebird.h	Sun Aug 12 11:14:00 2001
@@ -0,0 +1,69 @@
+/*
+ *
+ */
+
+#ifndef __ASM_ARCH_HARDWARE_H
+#error "include <asm/hardware.h> instead"
+#endif
+
+
+/* Board Control Register */
+
+#define BCR_BASE  0xf0000000
+#define BCR (*(volatile unsigned int *)(BCR_BASE))
+
+#define BCR_DB1110	(0x00A07410)
+
+
+#define BCR_FREEBIRD_AUDIO_PWR	(1<<0)	/* Audio Power (1 = on, 0 = off) */
+#define BCR_FREEBIRD_LCD_PWR		(1<<1)	/* LCD Power (1 = on) */
+#define BCR_FREEBIRD_CODEC_RST	(1<<2)	/* 0 = Holds UCB1300, ADI7171, and UDA1341 in reset */
+#define BCR_FREEBIRD_IRDA_FSEL	(1<<3)	/* IRDA Frequency select (0 = SIR, 1 = MIR/ FIR) */
+#define BCR_FREEBIRD_IRDA_MD0	(1<<4)	/* Range/Power select */
+#define BCR_FREEBIRD_IRDA_MD1	(1<<5)	/* Range/Power select */
+#define BCR_FREEBIRD_LCD_DISP	(1<<7)	/* LCD display (1 = on, 0 = off */
+#define BCR_FREEBIRD_LCD_BACKLIGHT	(1<<16)	/* LCD backlight ,1=on */
+#define BCR_FREEBIRD_LCD_LIGHT_INC	(1<<17)	/* LCD backlight brightness */
+#define BCR_FREEBIRD_LCD_LIGHT_DU	(1<<18)	/* LCD backlight brightness */
+#define BCR_FREEBIRD_LCD_INC			(1<<19)	/* LCD contrast  */
+#define BCR_FREEBIRD_LCD_DU			(1<<20)	/* LCD contrast */
+#define BCR_FREEBIRD_QMUTE			(1<<21)	/* Quick Mute */
+#define BCR_FREEBIRD_ALARM_LED		(1<<22)	/* ALARM LED control */
+#define BCR_FREEBIRD_SPK_OFF	(1<<23)	/* 1 = Speaker amplifier power off */
+
+#ifndef __ASSEMBLY__
+extern unsigned long BCR_value;
+#define BCR_set( x )	BCR = (BCR_value |= (x))
+#define BCR_clear( x )	BCR = (BCR_value &= ~(x))
+#endif
+
+
+/* GPIOs for which the generic definition doesn't say much */
+#define GPIO_FREEBIRD_NPOWER_BUTTON		GPIO_GPIO(0)
+#define GPIO_FREEBIRD_APP1_BUTTON		GPIO_GPIO(1)
+#define GPIO_FREEBIRD_APP2_BUTTON		GPIO_GPIO(2)
+#define GPIO_FREEBIRD_APP3_BUTTOM		GPIO_GPIO(3)
+#define GPIO_FREEBIRD_UCB1300			GPIO_GPIO(4)
+
+#define GPIO_FREEBIRD_EXPWR				GPIO_GPIO(8)
+#define GPIO_FREEBIRD_CHARGING			GPIO_GPIO(9)
+#define GPIO_FREEBIRD_RAMD				GPIO_GPIO(14)
+#define GPIO_FREEBIRD_L3_DATA			GPIO_GPIO(15)
+#define GPIO_FREEBIRD_L3_MODE			GPIO_GPIO(17)
+#define GPIO_FREEBIRD_L3_CLOCK			GPIO_GPIO(18)
+#define GPIO_FREEBIRD_STEREO_64FS_CLK	GPIO_GPIO(10)
+
+#define GPIO_FREEBIRD_CF_CD				GPIO_GPIO(22)
+#define GPIO_FREEBIRD_CF_IRQ			GPIO_GPIO(21)
+#define GPIO_FREEBIRD_CF_BVD			GPIO_GPIO(25)
+
+#define IRQ_GPIO_FREEBIRD_NPOWER_BUTTON	IRQ_GPIO0
+#define IRQ_GPIO_FREEBIRD_APP1_BUTTON	IRQ_GPIO1
+#define IRQ_GPIO_FREEBIRD_APP2_BUTTON	IRQ_GPIO2
+#define IRQ_GPIO_FREEBIRD_APP3_BUTTON	IRQ_GPIO3
+#define IRQ_GPIO_FREEBIRD_UCB1300_IRQ	IRQ_GPIO4
+
+#define IRQ_GPIO_FREEBIRD_CF_IRQ		IRQ_GPIO21
+#define IRQ_GPIO_FREEBIRD_CF_CD			IRQ_GPIO22
+#define IRQ_GPIO_FREEBIRD_CF_BVD		IRQ_GPIO25
+
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-sa1100/hardware.h linux/include/asm-arm/arch-sa1100/hardware.h
--- v2.4.8/linux/include/asm-arm/arch-sa1100/hardware.h	Thu Feb  8 16:32:44 2001
+++ linux/include/asm-arm/arch-sa1100/hardware.h	Sun Aug 12 11:14:00 2001
@@ -73,6 +73,12 @@
 #define GPIO_BOTH_EDGES         3
 #ifndef __ASSEMBLY__
 extern void set_GPIO_IRQ_edge( int gpio_mask, int edge_mask );
+
+/*
+ * Return the current CPU clock frequency in units of 100kHz
+ */
+extern unsigned short get_cclk_frequency(void);
+
 #endif
 
 
@@ -90,6 +96,24 @@
 #define machine_has_neponset()	(0)
 #endif
 
+
+#ifdef CONFIG_SA1100_HUW_WEBPANEL
+#include "huw_webpanel.h"
+#endif
+
+#ifdef CONFIG_SA1100_PFS168
+#include "pfs168.h"
+#endif
+
+
+#ifdef CONFIG_SA1100_YOPY
+#include "yopy.h"
+#endif
+
+#ifdef CONFIG_SA1100_FREEBIRD
+#include "freebird.h"
+#endif
+
 #ifdef CONFIG_SA1100_CERF
 #include "cerf.h"
 #endif
@@ -102,10 +126,33 @@
 #include "bitsy.h"
 #endif
 
+#ifdef CONFIG_SA1100_ITSY
+#include "itsy.h"
+#endif
+
 #if defined(CONFIG_SA1100_GRAPHICSCLIENT)
 #include "graphicsclient.h"
 #endif
 
+#if defined(CONFIG_SA1100_OMNIMETER)
+#include "omnimeter.h"
+#endif
+
+#if defined(CONFIG_SA1100_JORNADA720)
+#include "jornada720.h"
+#endif
+
+#if defined(CONFIG_SA1100_PLEB)
+#include "pleb.h"
+#endif
+
+#if defined(CONFIG_SA1100_LART)
+#include "lart.h"
+#endif
+
+#ifdef CONFIG_SA1100_SIMPAD
+#include "simpad.h"
+#endif
 
 #ifdef CONFIG_SA1101
 
@@ -121,6 +168,17 @@
 
 #endif
 
+#if defined(CONFIG_SA1100_OMNIMETER)
+#include "omnimeter.h"
+#endif
+
+#if defined(CONFIG_SA1100_JORNADA720)
+#include "jornada720.h"
+#endif
+
+#if defined(CONFIG_SA1100_FLEXANET)
+#include "flexanet.h"
+#endif
 
 #ifdef CONFIG_SA1111
 
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-sa1100/huw_webpanel.h linux/include/asm-arm/arch-sa1100/huw_webpanel.h
--- v2.4.8/linux/include/asm-arm/arch-sa1100/huw_webpanel.h	Wed Dec 31 16:00:00 1969
+++ linux/include/asm-arm/arch-sa1100/huw_webpanel.h	Sun Aug 12 11:14:00 2001
@@ -0,0 +1,49 @@
+/*
+ * linux/include/asm-arm/arch-sa1100/huw_webpanel.h
+ *
+ * based of assabet.h
+ *
+ * This file contains the hardware specific definitions for HUW_Webpanel
+ *
+ * 2000/11/13 Roman Jordan <jor@hoeft-wessel.de>
+ */
+
+#ifndef __ASM_ARCH_HARDWARE_H
+#error "include <asm/hardware.h> instead"
+#endif
+
+/* System Configuration Register flags */
+
+#define SCR_SDRAM_LOW	(1<<2)	/* SDRAM size (low bit) */
+#define SCR_SDRAM_HIGH	(1<<3)	/* SDRAM size (high bit) */
+#define SCR_FLASH_LOW	(1<<4)	/* Flash size (low bit) */
+#define SCR_FLASH_HIGH	(1<<5)	/* Flash size (high bit) */
+#define SCR_GFX		(1<<8)	/* Graphics Accelerator (0 = present) */
+#define SCR_SA1111	(1<<9)	/* Neponset (0 = present) */
+
+#define SCR_INIT	-1
+
+
+/* Board Control Register */
+
+#define BCR_BASE  0xf1000000
+#define BCR (*(volatile unsigned int *)(BCR_BASE))
+
+#define BCR_PSIO_DTR1      (1<<29)
+#define BCR_TFT_NPWR       (1<<28)
+#define BCR_PSIO_DTR3      (1<<27)
+#define BCR_TFT_ENA        (1<<26)
+#define BCR_CCFL_POW       (1<<25)
+#define BCR_PSIO_RTS1      (1<<24)
+#define BCR_PWM_BACKLIGHT  (1<<23)
+
+
+#ifndef __ASSEMBLY__
+extern unsigned long SCR_value;
+extern unsigned long BCR_value;
+#define BCR_set( x )	BCR = (BCR_value |= (x))
+#define BCR_clear( x )	BCR = (BCR_value &= ~(x))
+#endif
+
+
+
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-sa1100/ide.h linux/include/asm-arm/arch-sa1100/ide.h
--- v2.4.8/linux/include/asm-arm/arch-sa1100/ide.h	Thu Feb  8 16:32:44 2001
+++ linux/include/asm-arm/arch-sa1100/ide.h	Sun Aug 12 17:36:24 2001
@@ -112,15 +112,15 @@
         hw_regs_t hw;
 
         /* Enable GPIO as interrupt line */
-        GPDR &= ~GPIO_GPIO1;
-        set_GPIO_IRQ_edge(GPIO_GPIO1, GPIO_RISING_EDGE);
+        GPDR &= ~LART_GPIO_IDE;
+        set_GPIO_IRQ_edge(LART_GPIO_IDE, GPIO_RISING_EDGE);
         
         /* set PCMCIA interface timing */
         MECR = 0x00060006;
 
         /* init the interface */
 	ide_init_hwif_ports(&hw, PCMCIA_IO_0_BASE + 0x0000, PCMCIA_IO_0_BASE + 0x1000, NULL);
-        hw.irq = IRQ_GPIO1;
+        hw.irq = LART_IRQ_IDE;
         ide_register_hw(&hw, NULL);
 #endif
     }
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-sa1100/irq.h linux/include/asm-arm/arch-sa1100/irq.h
--- v2.4.8/linux/include/asm-arm/arch-sa1100/irq.h	Fri Mar  2 11:12:06 2001
+++ linux/include/asm-arm/arch-sa1100/irq.h	Sun Aug 12 11:14:00 2001
@@ -1,449 +1,13 @@
 /*
  * linux/include/asm-arm/arch-sa1100/irq.h
- *
- * Copyright (C) 1996-1999 Russell king
- * Copyright (C) 1999 Hugo Fiennes
- *
- * Changelog:
- *   22-08-1998	RMK	Restructured IRQ routines
- *   06-01-1999	HBF	SA1100 twiddles
- *   12-02-1999	NP	added ICCR
- *   17-02-1999	NP	empeg henry ugly hacks now in a separate file ;)
- *   11-08-1999	PD	SA1101 support added
- *   25-09-1999	RMK	Merged into main ARM tree, cleaned up
- *   12-05-2000 NP	IRQ dispatcher handler for GPIOs 11 to 27.
- *   26-05-2000 JD	SA-1111 support added
- *   01-06-2000 NP	GraphicsClient external IRQ dispatcher
- *   09-10-2000 NP	Fixed lost interrupts on GPIOs 11 to 27.
+ * 
+ * Author: Nicolas Pitre
  */
-#include <linux/config.h>
-#include <asm/irq.h>
-#include <asm/hardware.h>
-#include <asm/mach-types.h>
 
 #define fixup_irq(x)	(x)
 
-/* 
- * We don't need to ACK IRQs on the SA1100 unless they're GPIOs
- * this is for internal IRQs i.e. from 11 to 31.
- */
-
-static void sa1100_mask_irq(unsigned int irq)
-{
-	ICMR &= ~(1 << irq);
-}
-
-static void sa1100_unmask_irq(unsigned int irq)
-{
-	ICMR |= (1 << irq);
-}
-
-/*
- * SA1100 GPIO edge detection for IRQs.
- */
-extern int GPIO_IRQ_rising_edge;
-extern int GPIO_IRQ_falling_edge;
-
-/*
- * GPIO IRQs must be acknoledged.  This is for IRQs from 0 to 10.
- */
-
-static void sa1100_mask_and_ack_GPIO0_10_irq(unsigned int irq)
-{
-	ICMR &= ~(1 << irq);
-	GEDR = (1 << irq);
-}
-
-static void sa1100_mask_GPIO0_10_irq(unsigned int irq)
-{
-	ICMR &= ~(1 << irq);
-}
-
-static void sa1100_unmask_GPIO0_10_irq(unsigned int irq)
-{
-	GRER = (GRER & ~(1 << irq)) | (GPIO_IRQ_rising_edge & (1 << irq));
-	GFER = (GFER & ~(1 << irq)) | (GPIO_IRQ_falling_edge & (1 << irq));
-	ICMR |= (1 << irq);
-}
-
-/* 
- * Install handler for GPIO 11-27 edge detect interrupts
- */
-
-void do_IRQ(int irq, struct pt_regs * regs);
-
-static int GPIO_11_27_enabled;		/* enabled i.e. unmasked GPIO IRQs */
-static int GPIO_11_27_spurious;		/* GPIOs that triggered when masked */
-
-static void sa1100_GPIO11_27_demux(int irq, void *dev_id, 
-				   struct pt_regs *regs)
-{
-	int i, spurious;
-
-	while( (irq = (GEDR & 0xfffff800)) ){
-		/*
-		 * We don't want to clear GRER/GFER when the corresponding
-		 * IRQ is masked because we could miss a level transition
-		 * i.e. an IRQ which need servicing as soon as it is 
-		 * unmasked.  However, such situation should happen only
-		 * during the loop below.  Thus all IRQs which aren't 
-		 * enabled at this point are considered spurious.  Those 
-		 * are cleared but only de-activated if they happen twice.
-		 */
-		spurious = irq & ~GPIO_11_27_enabled;
-		if (spurious) {
-			GEDR = spurious;
-			GRER &= ~(spurious & GPIO_11_27_spurious);
-			GFER &= ~(spurious & GPIO_11_27_spurious);
-			GPIO_11_27_spurious |= spurious;
-			irq ^= spurious;
-			if (!irq) continue;
-		}
-
-		for (i = 11; i <= 27; ++i) {
-			if (irq & (1<<i)) {
-				do_IRQ( IRQ_GPIO_11_27(i), regs );
-			}
-		}
-	}
-}
-
-static struct irqaction GPIO11_27_irq = {
-	name:		"GPIO 11-27",
-	handler:	sa1100_GPIO11_27_demux,
-	flags:		SA_INTERRUPT
-};                                                                              
-
-static void sa1100_mask_and_ack_GPIO11_27_irq(unsigned int irq)
-{
-	int mask = (1 << GPIO_11_27_IRQ(irq));
-	GPIO_11_27_spurious &= ~mask;
-	GPIO_11_27_enabled &= ~mask;
-	GEDR = mask;
-}
-
-static void sa1100_mask_GPIO11_27_irq(unsigned int irq)
-{
-	int mask = (1 << GPIO_11_27_IRQ(irq));
-	GPIO_11_27_spurious &= ~mask;
-	GPIO_11_27_enabled &= ~mask;
-}
-
-static void sa1100_unmask_GPIO11_27_irq(unsigned int irq)
-{
-	int mask = (1 << GPIO_11_27_IRQ(irq));
-	if (GPIO_11_27_spurious & mask) {
-		/* 
-		 * We don't want to miss an interrupt that would have occurred
-		 * while it was masked.  Simulate it if it is the case.
-		 */
-		int state = GPLR;
-		if (((state & GPIO_IRQ_rising_edge) | 
-		     (~state & GPIO_IRQ_falling_edge)) & mask) {
-			do_IRQ(irq, NULL);
-			/* we are being called again from do_IRQ() so ... */
-			return;
-		}
-	}
-	GPIO_11_27_enabled |= mask;
-	GRER = (GRER & ~mask) | (GPIO_IRQ_rising_edge & mask);
-	GFER = (GFER & ~mask) | (GPIO_IRQ_falling_edge & mask);
-}
-
-
-#if defined(CONFIG_SA1111)
-
-/* 
- * Install handler for SA1111 IRQ handler.
- */
-
-static void sa1111_IRQ_demux( int irq, void *dev_id, struct pt_regs *regs )
-{
-	int i;
-	unsigned long stat0, stat1;
-
-	for(;;) {
-		stat0 = INTSTATCLR0, stat1 = INTSTATCLR1;
-		if( !stat0 && !stat1 ) break;
-		if( stat0 )
-			for( i = 0; i < 32; i++ )
-				if( stat0 & (1<<i) )
-					do_IRQ( SA1111_IRQ(i), regs );
-
-		if( stat1 )
-			for( i = 32; i < 55; i++ )
-				if( stat1 & (1<<(i-32)) )
-					do_IRQ( SA1111_IRQ(i), regs );
-	}
-}
-
-static struct irqaction sa1111_irq = {
-	name:		"SA1111",
-	handler:	sa1111_IRQ_demux,
-	flags:		SA_INTERRUPT
-};
-
-static void sa1111_mask_and_ack_lowirq(unsigned int irq)
-{
-	unsigned int mask = 1 << (irq - SA1111_IRQ(0));
-
-	//INTEN0 &= ~mask;
-	INTSTATCLR0 = mask;
-}
-
-static void sa1111_mask_and_ack_highirq(unsigned int irq)
-{
-	unsigned int mask = 1 << (irq - SA1111_IRQ(32));
-
-	//INTEN1 &= ~mask;
-	INTSTATCLR1 = mask;
-}
-
-static void sa1111_mask_lowirq(unsigned int irq)
-{
-	//INTEN0 &= ~(1 << (irq - SA1111_IRQ(0)));
-}
-
-static void sa1111_mask_highirq(unsigned int irq)
-{
-	//INTEN1 &= ~(1 << (irq - SA1111_IRQ(32)));
-}
-
-static void sa1111_unmask_lowirq(unsigned int irq)
-{
-	INTEN0 |= 1 << (irq - SA1111_IRQ(0));
-}
-
-static void sa1111_unmask_highirq(unsigned int irq)
-{
-	INTEN1 |= 1 << ((irq - SA1111_IRQ(32)));
-}
-
-#endif  /* CONFIG_SA1111 */
-
-
-#ifdef CONFIG_ASSABET_NEPONSET
-
-/* 
- * Install handler for Neponset IRQ.  Yes, yes... we are way down the IRQ
- * cascade which is not good for IRQ latency, but the hardware has been
- * designed that way...
- */
-
-static void neponset_IRQ_demux( int irq, void *dev_id, struct pt_regs *regs )
-{
-	int irr;
-
-	for(;;){
-		irr = IRR & (IRR_ETHERNET | IRR_USAR | IRR_SA1111);
-		/* Let's have all active IRQ bits high.
-		 * Note: there is a typo in the Neponset user's guide 
-		 * for the SA1111 IRR level.
-		 */
-		irr ^= (IRR_ETHERNET | IRR_USAR);
-		if (!irr) break;
-
-		if( irr & IRR_ETHERNET )
-			do_IRQ(NEPONSET_ETHERNET_IRQ, regs);
-
-		if( irr & IRR_USAR )
-			do_IRQ(NEPONSET_USAR_IRQ, regs);
-
-		if( irr & IRR_SA1111 )	
-			sa1111_IRQ_demux(irq, dev_id, regs);
-	}
-}
-
-static struct irqaction neponset_irq = {
-	name:		"Neponset",
-	handler:	neponset_IRQ_demux,
-	flags:		SA_INTERRUPT
-};                                                                              
-
-#endif
-
-
-#if defined(CONFIG_SA1100_GRAPHICSCLIENT)
-
 /*
- * IRQ handler for the ThinClient/GraphicsClient external IRQ controller
+ * This prototype is required for cascading of multiplexed interrupts.
+ * Since it doesn't exist elsewhere, we'll put it here for now.
  */
-
-static void ADS_IRQ_demux( int irq, void *dev_id, struct pt_regs *regs )
-{
-	int irq, i;
-
-	while( (irq = ADS_INT_ST1 | (ADS_INT_ST2 << 8)) ){
-		for( i = 0; i < 16; i++ )
-			if( irq & (1<<i) )
-				do_IRQ( ADS_EXT_IRQ(i), regs );
-	}
-}
-
-static struct irqaction ADS_ext_irq = {
-	name:		"ADS_ext_IRQ",
-	handler:	ADS_IRQ_demux,
-	flags:		SA_INTERRUPT
-};
-
-static void ADS_mask_and_ack_irq0(unsigned int irq)
-{
-	int mask = (1 << (irq - ADS_EXT_IRQ(0)));
-	ADS_INT_EN1 &= ~mask;
-	ADS_INT_ST1 = mask;
-}
-
-static void ADS_mask_irq0(unsigned int irq)
-{
-	ADS_INT_ST1 = (1 << (irq - ADS_EXT_IRQ(0)));
-}
-
-static void ADS_unmask_irq0(unsigned int irq)
-{
-	ADS_INT_EN1 |= (1 << (irq - ADS_EXT_IRQ(0)));
-}
-
-static void ADS_mask_and_ack_irq1(unsigned int irq)
-{
-	int mask = (1 << (irq - ADS_EXT_IRQ(8)));
-	ADS_INT_EN2 &= ~mask;
-	ADS_INT_ST2 = mask;
-}
-
-static void ADS_mask_irq1(unsigned int irq)
-{
-	ADS_INT_ST2 = (1 << (irq - ADS_EXT_IRQ(8)));
-}
-
-static void ADS_unmask_irq1(unsigned int irq)
-{
-	ADS_INT_EN2 |= (1 << (irq - ADS_EXT_IRQ(8)));
-}
-
-#endif
-
-
-static __inline__ void irq_init_irq(void)
-{
-	int irq;
-
-	/* disable all IRQs */
-	ICMR = 0;
-
-	/* all IRQs are IRQ, not FIQ */
-	ICLR = 0;
-
-	/* clear all GPIO edge detects */
-	GFER = 0;
-	GRER = 0;
-	GEDR = -1;
-
-	/*
-	 * Whatever the doc says, this has to be set for the wait-on-irq
-	 * instruction to work... on a SA1100 rev 9 at least.
-	 */
-	ICCR = 1;
-
-	for (irq = 0; irq <= 10; irq++) {
-		irq_desc[irq].valid	= 1;
-		irq_desc[irq].probe_ok	= 1;
-		irq_desc[irq].mask_ack	= sa1100_mask_and_ack_GPIO0_10_irq;
-		irq_desc[irq].mask	= sa1100_mask_GPIO0_10_irq;
-		irq_desc[irq].unmask	= sa1100_unmask_GPIO0_10_irq;
-	}
-
-	for (irq = 11; irq <= 31; irq++) {
-		irq_desc[irq].valid	= 1;
-		irq_desc[irq].probe_ok	= 0;
-		irq_desc[irq].mask_ack	= sa1100_mask_irq;
-		irq_desc[irq].mask	= sa1100_mask_irq;
-		irq_desc[irq].unmask	= sa1100_unmask_irq;
-	}
-
-	for (irq = 32; irq <= 48; irq++) {
-		irq_desc[irq].valid	= 1;
-		irq_desc[irq].probe_ok	= 1;
-		irq_desc[irq].mask_ack	= sa1100_mask_and_ack_GPIO11_27_irq;
-		irq_desc[irq].mask	= sa1100_mask_GPIO11_27_irq;
-		irq_desc[irq].unmask	= sa1100_unmask_GPIO11_27_irq;
-	}
-	setup_arm_irq( IRQ_GPIO11_27, &GPIO11_27_irq );
-
-#ifdef CONFIG_SA1111
-	if( machine_is_assabet() && machine_has_neponset() ){
-
-		/* disable all IRQs */
-		INTEN0 = 0;
-		INTEN1 = 0;
-
-		/* detect on rising edge */
-		INTPOL0 = 0;
-		INTPOL1 = 0;
-
-		/* clear all IRQs */
-		INTSTATCLR0 = -1;
-		INTSTATCLR1 = -1;
-
-		for (irq = SA1111_IRQ(0); irq <= SA1111_IRQ(26); irq++) {
-			irq_desc[irq].valid	= 1;
-			irq_desc[irq].probe_ok	= 1;
-			irq_desc[irq].mask_ack	= sa1111_mask_and_ack_lowirq;
-			irq_desc[irq].mask	= sa1111_mask_lowirq;
-			irq_desc[irq].unmask	= sa1111_unmask_lowirq;
-		}
-		for (irq = SA1111_IRQ(32); irq <= SA1111_IRQ(54); irq++) {
-		  	irq_desc[irq].valid	= 1;
-			irq_desc[irq].probe_ok	= 1;
-			irq_desc[irq].mask_ack	= sa1111_mask_and_ack_highirq;
-			irq_desc[irq].mask	= sa1111_mask_highirq;
-			irq_desc[irq].unmask	= sa1111_unmask_highirq;
-		}
-
-		if( machine_has_neponset() ){
-			/* setup extra Neponset IRQs */
-			irq = NEPONSET_ETHERNET_IRQ;
-		  	irq_desc[irq].valid	= 1;
-			irq_desc[irq].probe_ok	= 1;
-			irq = NEPONSET_USAR_IRQ;
-		  	irq_desc[irq].valid	= 1;
-			irq_desc[irq].probe_ok	= 1;
-			set_GPIO_IRQ_edge( GPIO_NEP_IRQ, GPIO_RISING_EDGE );
-			setup_arm_irq( IRQ_GPIO_NEP_IRQ, &neponset_irq );
-		}else{
-			/* for pure SA1111 designs to come (currently unused) */
-			set_GPIO_IRQ_edge( 0, GPIO_RISING_EDGE );
-			setup_arm_irq( -1, &sa1111_irq );
-		}
-	}
-#endif
-
-#if defined(CONFIG_SA1100_GRAPHICSCLIENT)
-	if( machine_is_graphicsclient() ){
-		/* disable all IRQs */
-		ADS_INT_EN1 = 0;
-		ADS_INT_EN2 = 0;
-		/* clear all IRQs */
-		ADS_INT_ST1 = 0xff;
-		ADS_INT_ST2 = 0xff;
-
-		for (irq = ADS_EXT_IRQ(0); irq <= ADS_EXT_IRQ(7); irq++) {
-			irq_desc[irq].valid	= 1;
-			irq_desc[irq].probe_ok	= 1;
-			irq_desc[irq].mask_ack	= ADS_mask_and_ack_irq0;
-			irq_desc[irq].mask	= ADS_mask_irq0;
-			irq_desc[irq].unmask	= ADS_unmask_irq0;
-		}
-		for (irq = ADS_EXT_IRQ(8); irq <= ADS_EXT_IRQ(15); irq++) {
-			irq_desc[irq].valid	= 1;
-			irq_desc[irq].probe_ok	= 1;
-			irq_desc[irq].mask_ack	= ADS_mask_and_ack_irq1;
-			irq_desc[irq].mask	= ADS_mask_irq1;
-			irq_desc[irq].unmask	= ADS_unmask_irq1;
-		}
-		GPDR &= ~GPIO_GPIO0;
-		set_GPIO_IRQ_edge(GPIO_GPIO0, GPIO_FALLING_EDGE);
-		setup_arm_irq( IRQ_GPIO0, &ADS_ext_irq );
-	}
-#endif
-
-}
+extern void do_IRQ(int irq, struct pt_regs *regs);
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-sa1100/itsy.h linux/include/asm-arm/arch-sa1100/itsy.h
--- v2.4.8/linux/include/asm-arm/arch-sa1100/itsy.h	Wed Dec 31 16:00:00 1969
+++ linux/include/asm-arm/arch-sa1100/itsy.h	Sun Aug 12 11:14:00 2001
@@ -0,0 +1,5 @@
+#ifndef _INCLUDE_ITSY_H_
+#define _INCLUDE_ITSY_H_
+
+
+#endif
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-sa1100/jornada720.h linux/include/asm-arm/arch-sa1100/jornada720.h
--- v2.4.8/linux/include/asm-arm/arch-sa1100/jornada720.h	Wed Dec 31 16:00:00 1969
+++ linux/include/asm-arm/arch-sa1100/jornada720.h	Sun Aug 12 11:14:00 2001
@@ -0,0 +1,28 @@
+/*
+ * linux/include/asm-arm/arch-sa1100/jornada720.h
+ *
+ * Created 2000/11/29 by John Ankcorn <jca@lcs.mit.edu>
+ *
+ * This file contains the hardware specific definitions for HP Jornada 720
+ *
+ */
+
+#ifndef __ASM_ARCH_HARDWARE_H
+#error "include <asm/hardware.h> instead"
+#endif
+
+#define SA1111_BASE             (0x40000000)
+
+#define GPIO_JORNADA720_KEYBOARD	GPIO_GPIO(0)
+#define GPIO_JORNADA720_MOUSE		GPIO_GPIO(9)
+
+#define GPIO_JORNADA720_KEYBOARD_IRQ	IRQ_GPIO0
+#define GPIO_JORNADA720_MOUSE_IRQ		IRQ_GPIO9
+
+#ifndef __ASSEMBLY__
+
+void jornada720_mcu_init(void);
+void jornada_contrast(int arg_contrast);
+void jornada720_battery(void);
+int jornada720_getkey(unsigned char *data, int size);
+#endif
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-sa1100/keyboard.h linux/include/asm-arm/arch-sa1100/keyboard.h
--- v2.4.8/linux/include/asm-arm/arch-sa1100/keyboard.h	Thu Apr 12 12:20:31 2001
+++ linux/include/asm-arm/arch-sa1100/keyboard.h	Sun Aug 12 11:14:00 2001
@@ -52,7 +52,18 @@
 #define kbd_disable_irq         gc_kbd_disable_irq
 #define kbd_sysrq_xlate         gc_kbd_sysrq_xlate
 
-#elif defined(CONFIG_SA1111)   /*@@@@@*/
+#elif CONFIG_SA1100_BITSY
+
+#define kbd_setkeycode(x...)    (-ENOSYS)
+#define kbd_getkeycode(x...)    (-ENOSYS)
+#define kbd_translate(sc_,kc_,rm_)	((*(kc_)=(sc_)),1)
+#define kbd_unexpected_up(x...) (1)
+#define kbd_leds(x...)		do { } while (0)
+#define kbd_init_hw(x...)	do { } while (0)
+#define kbd_enable_irq(x...)	do { } while (0)
+#define kbd_disable_irq(x...)	do { } while (0)
+
+#elif 0 //defined(CONFIG_SA1111)   /*@@@@@*/
 
 #define KEYBOARD_IRQ           TPRXINT
 #define DISABLE_KBD_DURING_INTERRUPTS  0
@@ -158,7 +169,7 @@
 
 /* needed if MAGIC_SYSRQ is enabled for serial console */
 #ifndef SYSRQ_KEY
-#define SYSRQ_KEY		-1
+#define SYSRQ_KEY		((unsigned char)(-1))
 #define kbd_sysrq_xlate         ((unsigned char *)NULL)
 #endif
 
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-sa1100/lart.h linux/include/asm-arm/arch-sa1100/lart.h
--- v2.4.8/linux/include/asm-arm/arch-sa1100/lart.h	Wed Dec 31 16:00:00 1969
+++ linux/include/asm-arm/arch-sa1100/lart.h	Sun Aug 12 17:36:24 2001
@@ -0,0 +1,13 @@
+#ifndef _INCLUDE_LART_H
+#define _INCLUDE_LART_H
+
+#define LART_GPIO_ETH0			GPIO_GPIO0
+#define LART_IRQ_ETH0			IRQ_GPIO0
+
+#define LART_GPIO_IDE			GPIO_GPIO1
+#define LART_IRQ_IDE			IRQ_GPIO1
+
+#define LART_GPIO_UCB1200		GPIO_GPIO18
+#define LART_IRQ_UCB1200		IRQ_GPIO18
+
+#endif
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-sa1100/memory.h linux/include/asm-arm/arch-sa1100/memory.h
--- v2.4.8/linux/include/asm-arm/arch-sa1100/memory.h	Thu Feb  8 16:32:44 2001
+++ linux/include/asm-arm/arch-sa1100/memory.h	Sun Aug 12 11:14:00 2001
@@ -1,12 +1,13 @@
 /*
  * linux/include/asm-arm/arch-sa1100/memory.h
  *
- * Copyright (c) 1999 Nicolas Pitre <nico@cam.org>
+ * Copyright (C) 1999-2000 Nicolas Pitre <nico@cam.org>
  */
 
 #ifndef __ASM_ARCH_MEMORY_H
 #define __ASM_ARCH_MEMORY_H
 
+#include <linux/config.h>
 
 /*
  * Task size: 3GB
@@ -53,5 +54,75 @@
 #define __bus_to_virt__is_a_macro
 #define __virt_to_bus(x)	 __virt_to_phys(x)
 #define __bus_to_virt(x)	 __phys_to_virt(x)
+
+#ifdef CONFIG_DISCONTIGMEM
+/*
+ * Because of the wide memory address space between physical RAM banks on the 
+ * SA1100, it's much convenient to use Linux's NUMA support to implement our 
+ * memory map representation.  Assuming all memory nodes have equal access 
+ * characteristics, we then have generic discontigous memory support.
+ *
+ * Of course, all this isn't mandatory for SA1100 implementations with only
+ * one used memory bank.  For those, simply undefine CONFIG_DISCONTIGMEM.
+ *
+ * The nodes are matched with the physical memory bank addresses which are 
+ * incidentally the same as virtual addresses.
+ * 
+ * 	node 0:  0xc0000000 - 0xc7ffffff
+ * 	node 1:  0xc8000000 - 0xcfffffff
+ * 	node 2:  0xd0000000 - 0xd7ffffff
+ * 	node 3:  0xd8000000 - 0xdfffffff
+ */
+
+#define NR_NODES	4
+
+/*
+ * Given a kernel address, find the home node of the underlying memory.
+ */
+#define KVADDR_TO_NID(addr) \
+		(((unsigned long)(addr) - 0xc0000000) >> 27)
+
+/*
+ * Given a physical address, convert it to a node id.
+ */
+#define PHYS_TO_NID(addr) KVADDR_TO_NID(__phys_to_virt(addr))
+
+/*
+ * Given a kaddr, ADDR_TO_MAPBASE finds the owning node of the memory
+ * and returns the mem_map of that node.
+ */
+#define ADDR_TO_MAPBASE(kaddr) \
+			NODE_MEM_MAP(KVADDR_TO_NID((unsigned long)(kaddr)))
+
+/*
+ * Given a kaddr, LOCAL_MEM_MAP finds the owning node of the memory
+ * and returns the index corresponding to the appropriate page in the
+ * node's mem_map.
+ */
+#define LOCAL_MAP_NR(kvaddr) \
+	(((unsigned long)(kvaddr) & 0x07ffffff) >> PAGE_SHIFT)
+
+/*
+ * Given a kaddr, virt_to_page returns a pointer to the corresponding 
+ * mem_map entry.
+ */
+#define virt_to_page(kaddr) \
+	(ADDR_TO_MAPBASE(kaddr) + LOCAL_MAP_NR(kaddr))
+
+/*
+ * VALID_PAGE returns a non-zero value if given page pointer is valid.
+ * This assumes all node's mem_maps are stored within the node they refer to.
+ */
+#define VALID_PAGE(page) \
+({ unsigned int node = KVADDR_TO_NID(page); \
+   ( (node < NR_NODES) && \
+     ((unsigned)((page) - NODE_MEM_MAP(node)) < NODE_DATA(node)->node_size) ); \
+})
+
+#else
+
+#define PHYS_TO_NID(addr)	(0)
+
+#endif
 
 #endif
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-sa1100/mmzone.h linux/include/asm-arm/arch-sa1100/mmzone.h
--- v2.4.8/linux/include/asm-arm/arch-sa1100/mmzone.h	Thu Apr 12 12:20:31 2001
+++ linux/include/asm-arm/arch-sa1100/mmzone.h	Wed Dec 31 16:00:00 1969
@@ -1,63 +0,0 @@
-/*
- * linux/include/asm-arm/arch-sa1100/mmzone.h
- *
- * (C) 1999-2000, Nicolas Pitre <nico@cam.org>
- * (inspired by Kanoj Sarcar's code)
- *
- * Because of the wide memory address space between physical RAM banks on the 
- * SA1100, it's much convenient to use Linux's NUMA support to implement our 
- * memory map representation.  Assuming all memory nodes have equal access 
- * characteristics, we then have generic discontigous memory support.
- *
- * Of course, all this isn't mandatory for SA1100 implementations with only
- * one used memory bank.  For those, simply undefine CONFIG_DISCONTIGMEM.
- *
- * The nodes are matched with the physical memory bank addresses which are 
- * incidentally the same as virtual addresses.
- * 
- * 	node 0:  0xc0000000 - 0xc7ffffff
- * 	node 1:  0xc8000000 - 0xcfffffff
- * 	node 2:  0xd0000000 - 0xd7ffffff
- * 	node 3:  0xd8000000 - 0xdfffffff
- */
-
-#define NR_NODES	4
-
-/*
- * Given a kernel address, find the home node of the underlying memory.
- */
-#define KVADDR_TO_NID(addr) \
-		(((unsigned long)(addr) - 0xc0000000) >> 27)
-
-/*
- * Given a kaddr, ADDR_TO_MAPBASE finds the owning node of the memory
- * and returns the mem_map of that node.
- */
-#define ADDR_TO_MAPBASE(kaddr) \
-			NODE_MEM_MAP(KVADDR_TO_NID((unsigned long)(kaddr)))
-
-/*
- * Given a kaddr, LOCAL_MEM_MAP finds the owning node of the memory
- * and returns the index corresponding to the appropriate page in the
- * node's mem_map.
- */
-#define LOCAL_MAP_NR(kvaddr) \
-	(((unsigned long)(kvaddr) & 0x07ffffff) >> PAGE_SHIFT)
-
-/*
- * Given a kaddr, virt_to_page returns a pointer to the corresponding 
- * mem_map entry.
- */
-#define virt_to_page(kaddr) \
-	(ADDR_TO_MAPBASE(kaddr) + LOCAL_MAP_NR(kaddr))
-
-/*
- * VALID_PAGE returns a non-zero value if given page pointer is valid.
- * This assumes all node's mem_maps are stored within the node they refer to.
- */
-#define VALID_PAGE(page) \
-({ unsigned int node = KVADDR_TO_NID(page); \
-   ( (node < NR_NODES) && \
-     ((unsigned)((page) - NODE_MEM_MAP(node)) < NODE_DATA(node)->node_size) ); \
-})
-
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-sa1100/omnimeter.h linux/include/asm-arm/arch-sa1100/omnimeter.h
--- v2.4.8/linux/include/asm-arm/arch-sa1100/omnimeter.h	Wed Dec 31 16:00:00 1969
+++ linux/include/asm-arm/arch-sa1100/omnimeter.h	Sun Aug 12 11:14:00 2001
@@ -0,0 +1,84 @@
+/* -*- Mode: c++ -*-
+ *
+ *  Copyright 2000 Massachusetts Institute of Technology
+ *
+ *  Permission to use, copy, modify, distribute, and sell this software and its
+ *  documentation for any purpose is hereby granted without fee, provided that
+ *  the above copyright notice appear in all copies and that both that
+ *  copyright notice and this permission notice appear in supporting
+ *  documentation, and that the name of M.I.T. not be used in advertising or
+ *  publicity pertaining to distribution of the software without specific,
+ *  written prior permission.  M.I.T. makes no representations about the
+ *  suitability of this software for any purpose.  It is provided "as is"
+ *  without express or implied warranty.
+ *
+ */
+
+#ifndef OMNIMETER_H
+#define OMNIMETER_H
+// use the address of the second socket for both sockets
+// (divide address space in half and use offsets to wrap second card accesses back to start of address space)
+// Following values for programming Cirrus Logic chip
+#define Socket1Base 0x40
+
+#define SocketMemoryWindowLen    (0x00400000)
+#define Socket0MemoryWindowStart (0x00800000)
+#define Socket1MemoryWindowStart (Socket0MemoryWindowStart + SocketMemoryWindowLen)
+
+#define SocketIOWindowLen        (0x00008000)
+#define Socket1IOWindowStart     (SocketIOWindowLen)
+#define Socket1IOWindowOffset    (0x00010000 - Socket1IOWindowStart)
+
+// Following values for run-time access
+
+//#define PCCardBase     (0xe4000000) //jca (0x30000000)
+//#define PCCardBase     (0x30000000)
+#define PCCardBase     (0xe0000000)  //jag
+
+#define PCCard0IOBase (PCCardBase)
+//#define PCCard0AttrBase (0xec000000) //jca (PCCardBase + 0x08000000)
+#define PCCard0AttrBase (0xe8000000)
+//#define PCCard0AttrBase (PCCardBase + 0x08000000)
+//#define PCCard0MemBase (0xf4000000) //jca (PCCardBase + 0x0C000000)
+//#define PCCard0MemBase (PCCardBase + 0x0C000000)
+#define PCCard0MemBase (0xf0000000)
+
+//#define PCCard1IOBase (PCCardBase + SocketIOWindowLen)  //jag
+#define PCCard1IOBase (0xe4000000)
+//#define PCCard1AttrBase (0xec000000 + SocketMemoryWindowLen)  //jag
+#define PCCard1AttrBase (0xec000000)
+//#define PCCard1MemBase (0xf4000000 + SocketMemoryWindowLen)  //jag
+#define PCCard1MemBase (0xf4000000)
+
+#define PCCardIndexRegister (PCCard0IOBase + 0x000003E0) //altered
+#define PCCardDataRegister  (PCCardIndexRegister + 1)
+
+/* interrupts */
+#define PIN_cardInt2	13
+#define PIN_cardInt1	5
+
+void SMBOn(unsigned char SMBaddress);
+void SetSMB(unsigned char SMBaddress, unsigned int dacValue);
+
+#define GPIO_key6	0x00040000
+#define GPIO_scl	0x01000000  // output,   SMB clock
+#define GPIO_sda	0x02000000  // bidirect, SMB data
+#define SMB_LCDVEE 0x2C
+#define DefaultLCDContrast	16
+
+#define LEDBacklightOn()	ClearGPIOpin(GPIO_key6)
+#define LEDBacklightOff()	SetGPIOpin(GPIO_key6)
+#define LCDPowerOn()			SMBOn(SMB_LCDVEE)
+#define LCDPowerOff()			SMBOff(SMB_LCDVEE)
+#define SetLCDContrast(d)		SetSMB(SMB_LCDVEE, d)
+#define WritePort32(port,value) (port = (value))
+#define ReadPort32(port) (port)
+#define SetGPIOpin(pin)		WritePort32(GPSR,pin)
+#define ClearGPIOpin(pin)	WritePort32(GPCR,pin)
+
+void jcaoutb(long p, unsigned char data);
+unsigned char jcainb(long p);
+void jcaoutw(long p, unsigned short data);
+unsigned short jcainw_p(long p);
+
+#endif
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-sa1100/pfs168.h linux/include/asm-arm/arch-sa1100/pfs168.h
--- v2.4.8/linux/include/asm-arm/arch-sa1100/pfs168.h	Wed Dec 31 16:00:00 1969
+++ linux/include/asm-arm/arch-sa1100/pfs168.h	Sun Aug 12 11:14:00 2001
@@ -0,0 +1,77 @@
+/*
+ * linux/include/asm-arm/arch-sa1100/pfs168.h
+ *
+ * Created 2000/06/05 by Nicolas Pitre <nico@cam.org>
+ *
+ * This file contains the hardware specific definitions for PFS-168
+ *
+ */
+
+#ifndef __ASM_ARCH_HARDWARE_H
+#error "include <asm/hardware.h> instead"
+#endif
+
+
+/* GPIOs for which the generic definition doesn't say much */
+#define GPIO_RADIO_IRQ		GPIO_GPIO (14)	/* Radio interrupt request  */
+#define GPIO_L3_I2C_SDA		GPIO_GPIO (15)	/* L3 and SMB control ports */
+#define GPIO_PS_MODE_SYNC	GPIO_GPIO (16)	/* Power supply mode/sync   */
+#define GPIO_L3_MODE		GPIO_GPIO (17)	/* L3 mode signal with LED  */
+#define GPIO_L3_I2C_SCL		GPIO_GPIO (18)	/* L3 and I2C control ports */
+#define GPIO_STEREO_64FS_CLK	GPIO_GPIO (19)	/* SSP UDA1341 clock input  */
+#define GPIO_CF_IRQ		GPIO_GPIO (21)	/* CF IRQ   */
+#define GPIO_MBGNT		GPIO_GPIO (21)	/* 1111 MBGNT */
+#define GPIO_CF_CD		GPIO_GPIO (22)	/* CF CD */
+#define GPIO_MBREQ		GPIO_GPIO (22)	/* 1111 MBREQ */
+#define GPIO_UCB1300_IRQ	GPIO_GPIO (23)	/* UCB GPIO and touchscreen */
+#define GPIO_CF_BVD2		GPIO_GPIO (24)	/* CF BVD */
+#define GPIO_GFX_IRQ		GPIO_GPIO (24)	/* Graphics IRQ */
+#define GPIO_CF_BVD1		GPIO_GPIO (25)	/* CF BVD */
+#define GPIO_NEP_IRQ		GPIO_GPIO (25)	/* Neponset IRQ */
+#define GPIO_BATT_LOW		GPIO_GPIO (26)	/* Low battery */
+#define GPIO_RCLK		GPIO_GPIO (26)	/* CCLK/2  */
+
+#define IRQ_GPIO_CF_IRQ		IRQ_GPIO21
+#define IRQ_GPIO_CF_CD		IRQ_GPIO22
+#define IRQ_GPIO_MBREQ		IRQ_GPIO22
+#define IRQ_GPIO_UCB1300_IRQ	IRQ_GPIO23
+#define IRQ_GPIO_CF_BVD2	IRQ_GPIO24
+#define IRQ_GPIO_CF_BVD1	IRQ_GPIO25
+#define IRQ_GPIO_NEP_IRQ	IRQ_GPIO25
+
+
+/*
+ * PFS-168 definitions:
+ */
+
+#define SA1111_BASE             (0x40000000)
+
+#ifndef __ASSEMBLY__
+#define machine_has_neponset() (0)
+
+#define PFS168_COM5_VBASE		(*((volatile unsigned char *)(0xf0000000UL)))
+#define PFS168_COM6_VBASE		(*((volatile unsigned char *)(0xf0001000UL)))
+#define PFS168_SYSC1RTS			(*((volatile unsigned char *)(0xf0002000UL)))
+#define PFS168_SYSLED			(*((volatile unsigned char *)(0xf0003000UL)))
+#define PFS168_SYSDTMF			(*((volatile unsigned char *)(0xf0004000UL)))
+#define PFS168_SYSLCDDE			(*((volatile unsigned char *)(0xf0005000UL)))
+#define PFS168_SYSC1DSR			(*((volatile unsigned char *)(0xf0006000UL)))
+#define PFS168_SYSC3TEN			(*((volatile unsigned char *)(0xf0007000UL)))
+#define PFS168_SYSCTLA			(*((volatile unsigned char *)(0xf0008000UL)))
+#define PFS168_SYSCTLB			(*((volatile unsigned char *)(0xf0009000UL)))
+#define PFS168_ETH_VBASE		(*((volatile unsigned char *)(0xf000a000UL)))
+#endif
+
+#define PFS168_SYSLCDDE_STNDE		(1<<0)	/* CSTN display enable/disable (1/0) */
+#define PFS168_SYSLCDDE_DESEL		(1<<0)	/* Active/Passive (1/0) display enable mode */
+
+#define PFS168_SYSCTLA_BKLT		(1<<0)	/* LCD backlight invert on/off (1/0) */
+#define PFS168_SYSCTLA_RLY		(1<<1)	/* Relay on/off (1/0) */
+#define PFS168_SYSCTLA_PXON		(1<<2)	/* Opto relay connect/disconnect 1/0) */
+#define PFS168_SYSCTLA_IRDA_FSEL	(1<<3)	/* IRDA Frequency select (0 = SIR, 1 = MIR/ FIR) */
+
+#define PFS168_SYSCTLB_MG1		(1<<0)	/* Motion detector gain select */
+#define PFS168_SYSCTLB_MG0		(1<<1)	/* Motion detector gain select */
+#define PFS168_SYSCTLB_IRDA_MD1		(1<<2)	/* Range/Power select */
+#define PFS168_SYSCTLB_IRDA_MD0		(1<<3)	/* Range/Power select */
+#define PFS168_SYSCTLB_IRDA_MD_MASK	(PFS168_SYSCTLB_IRDA_MD1|PFS168_SYSCTLB_IRDA_MD0)
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-sa1100/pleb.h linux/include/asm-arm/arch-sa1100/pleb.h
--- v2.4.8/linux/include/asm-arm/arch-sa1100/pleb.h	Wed Dec 31 16:00:00 1969
+++ linux/include/asm-arm/arch-sa1100/pleb.h	Sun Aug 12 11:14:00 2001
@@ -0,0 +1,21 @@
+/*
+ * linux/include/asm-arm/arch-sa1100/pleb.h
+ *
+ * Created 2000/12/08 by Daniel Potts <danielp@cse.unsw.edu.au>
+ *
+ * This file contains the hardware specific definitions for the
+ * PLEB board. http://www.cse.unsw.edu.au/~pleb
+ */
+
+#ifndef _INCLUDE_PLEB_H_
+#define _INCLUDE_PLEB_H_
+
+#define PLEB_ETH0_P		(0x20000300)	/* Ethernet 0 in PCMCIA0 IO */
+#define PLEB_ETH0_V		(0xf6000300)
+
+#define GPIO_ETH0_IRQ		GPIO_GPIO (21)
+#define GPIO_ETH0_EN		GPIO_GPIO (26)
+
+#define IRQ_GPIO_ETH0_IRQ	IRQ_GPIO21
+
+#endif
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-sa1100/serial_reg.h linux/include/asm-arm/arch-sa1100/serial_reg.h
--- v2.4.8/linux/include/asm-arm/arch-sa1100/serial_reg.h	Wed Oct 20 16:29:08 1999
+++ linux/include/asm-arm/arch-sa1100/serial_reg.h	Wed Dec 31 16:00:00 1969
@@ -1,79 +0,0 @@
-/*
- * include/asm/arch/serial_reg.h
- *
- * Redistribution of this file is permitted under the terms of the GNU 
- * Public License (GPL)
- * 
- * These are the SA1100 UART port assignments, expressed as long index 
- * of the base address.
- */
-
-#ifndef ASM_ARCH_SERIAL_REG_H
-#define ASM_ARCH_SERIAL_REG_H
-
-
-/*
- * Register index.
- */
-#define UTCR0 		0	/* 0x00 UART_LCR  Line control register */
-#define UTCR1 		1	/* 0x04 UART_DLLSB */
-#define UTCR2 		2	/* 0x08 UART_DLMSB */
-#define UTCR3 		3	/* 0x0c UART_IER */
-#define UTDR 		5	/* 0x14 UART_RX, UART_TX */
-#define UTSR0 		7	/* 0x1c */
-#define UTSR1 		8	/* 0x20 UART_LSR  Line Status register */
-
-#define UART_RX 	UTDR		/* Receive port, read only */
-#define UART_TX 	UTDR		/* transmit port, write only */
-
-#if 0
-/*
- * Line control register flags
- */
-#define UTCR0_PE 	1		/* Parity enable */
-#define UTCR0_EP 	2		/* Even parity */
-#define UTCR0_SB 	4		/* Stop bit */
-#define UTCR0_DB 	8		/* Data bits in transmission (0 = 7, 1 = 8) */
-
-#define UTCR0_OES	UTCR0_EP
-#define UTCR0_SBS	UTCR0_SB
-#define UTCR0_DSS	UTCR0_DB
-#define UTCR0_SCE	16		/* Sample clock enable */
-#define UTCR0_RCE	32		/* Receive clock edge select */
-#define UTCR0_TCE	64		/* Transmit clock edge select */
-
-
-/*
- * Line status bits.
- */
-#define UTSR1_TBY 	1		/* transmitter busy flag */
-#define UTSR1_RNE 	2		/* receiver not empty (LSR_DR) */
-#define UTSR1_TNF 	4		/* transmit fifo non full */
-#define UTSR1_PRE 	8		/* parity read error (LSR_PE) */
-#define UTSR1_FRE 	16		/* framing error (LSR_FE) */
-#define UTSR1_ROR 	32		/* receive fifo overrun (LSR_OE) */
-
-#define UTSR1_ERROR 	(UTSR1_PRE | UTSR1_FRE | UTSR1_ROR)  /* LSR_ERROR */
-
-
-#define UTSR0_TFS 	1		/* transmit fifo service request */
-#define UTSR0_RFS 	2		/* receive fifo service request */
-#define UTSR0_RID	4		/* receiver idle */
-#define UTSR0_RBB 	8		/* receiver begin of break */
-#define UTSR0_REB 	16		/* receiver end of break */
-#define UTSR0_EIF 	32		/* error in fifo */
-
-
-/*
- * Interrupt enable register (IER)
- */
-#define UTCR3_RXE 	1		/* Receiver enable */
-#define UTCR3_TXE 	2		/* Transmit enable */
-#define UTCR3_BRK 	4		/* Break */
-#define UTCR3_RIM 	8		/* Receive FIFO interrupt mask (IER_RDA) */
-#define UTCR3_TIM 	16		/* Transmit FIFO interrupt mask (IER_THRE) */
-#define UTCR3_LBM 	32		/* Loop Back Mode */
-
-#endif 
-
-#endif /* ASM_ARCH_SERIAL_REG_H */
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-sa1100/simpad.h linux/include/asm-arm/arch-sa1100/simpad.h
--- v2.4.8/linux/include/asm-arm/arch-sa1100/simpad.h	Wed Dec 31 16:00:00 1969
+++ linux/include/asm-arm/arch-sa1100/simpad.h	Sun Aug 12 17:36:24 2001
@@ -0,0 +1,108 @@
+/*
+ * linux/include/asm-arm/arch-sa1100/trizeps.h
+ *
+ * based of assabet.h same as HUW_Webpanel
+ *
+ * This file contains the hardware specific definitions for Trizeps
+ *
+ * 2001/03/14 Peter Lueg <peter.lueg@dsa-ac.de>
+ */
+
+#ifndef SIMPAD_H
+#define SIMPAD_H
+
+
+#ifndef __ASM_ARCH_HARDWARE_H
+#error "include <asm/hardware.h> instead"
+#endif
+
+/* System Configuration Register flags */
+
+#define SCR_SDRAM_LOW	(1<<2)	/* SDRAM size (low bit) */
+#define SCR_SDRAM_HIGH	(1<<3)	/* SDRAM size (high bit) */
+#define SCR_FLASH_LOW	(1<<4)	/* Flash size (low bit) */
+#define SCR_FLASH_HIGH	(1<<5)	/* Flash size (high bit) */
+#define SCR_GFX		(1<<8)	/* Graphics Accelerator (0 = present) */
+#define SCR_SA1111	(1<<9)	/* Neponset (0 = present) */
+
+#define SCR_INIT	-1
+
+#define GPIO_UART1_RTS	GPIO_GPIO14
+#define GPIO_UART1_DTR	GPIO_GPIO7
+#define GPIO_UART1_CTS	GPIO_GPIO8
+#define GPIO_UART1_DCD	GPIO_GPIO23
+#define GPIO_UART1_DSR	GPIO_GPIO6
+
+#define GPIO_UART3_RTS	GPIO_GPIO12
+#define GPIO_UART3_DTR	GPIO_GPIO16
+#define GPIO_UART3_CTS	GPIO_GPIO13
+#define GPIO_UART3_DCD	GPIO_GPIO18
+#define GPIO_UART3_DSR	GPIO_GPIO17
+
+#define IRQ_UART1_CTS	IRQ_GPIO15
+#define IRQ_UART1_DCD	GPIO_GPIO23
+#define IRQ_UART1_DSR	GPIO_GPIO6
+#define IRQ_UART3_CTS	GPIO_GPIO13
+#define IRQ_UART3_DCD	GPIO_GPIO18
+#define IRQ_UART3_DSR	GPIO_GPIO17
+
+#define GPIO_UCB1300_IRQ	GPIO_GPIO (22)	/* UCB GPIO and touchscreen */
+#define IRQ_GPIO_UCB1300_IRQ IRQ_GPIO22
+
+#define SA1100_UART1_EXT \
+  (struct huw_irq_desc){GPIO_UART1_CTS, IRQ_UART1_CTS, \
+                        GPIO_UART1_DCD, IRQ_UART1_DCD, \
+                        GPIO_UART1_DSR, IRQ_UART1_DSR}
+#define SA1100_UART3_EXT \
+  (struct huw_irq_desc){GPIO_UART3_CTS, IRQ_UART3_CTS, \
+                        GPIO_UART3_DCD, IRQ_UART3_DCD, \
+                        GPIO_UART3_DSR, IRQ_UART3_DSR}
+
+
+/*---  PCMCIA  ---*/
+#define GPIO_CF_CD              GPIO_GPIO24
+#define GPIO_CF_IRQ             GPIO_GPIO1
+#define IRQ_GPIO_CF_IRQ         IRQ_GPIO1
+#define IRQ_GPIO_CF_CD          IRQ_GPIO24
+
+// CS3 Latch is write only, a shadow is neccessary
+
+#define CS3BUSTYPE unsigned volatile long
+#define CS3_BASE        0xf1000000
+
+#define VCC_5V_EN       0x0001
+#define VCC_3V_EN       0x0002
+#define EN1             0x0004
+#define EN0             0x0008
+#define DISPLAY_ON      0x0010
+#define PCMCIA_BUFF_DIS 0x0020
+#define MQ_RESET        0x0040
+#define PCMCIA_RESET    0x0080
+#define DECT_POWER_ON   0x0100
+#define IRDA_SD         0x0200
+#define RS232_ON        0x0400
+#define SD_MEDIAQ       0x0800
+#define LED2_ON         0x1000
+#define IRDA_MODE       0x2000
+#define ENABLE_5V       0x4000
+#define RESET_SIMCARD   0x8000
+
+#define RS232_ENABLE    0x0440
+#define PCMCIAMASK      0x402f
+
+#ifndef __ASSEMBLY__
+static long cs3_shadow;
+void init_simpad_cs3();
+void PCMCIA_setbit(int value);
+void PCMCIA_clearbit(int value);
+#endif
+
+#endif // SIMPAD_H
+
+
+
+
+
+
+
+
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-sa1100/system.h linux/include/asm-arm/arch-sa1100/system.h
--- v2.4.8/linux/include/asm-arm/arch-sa1100/system.h	Thu Apr 12 12:20:31 2001
+++ linux/include/asm-arm/arch-sa1100/system.h	Sun Aug 12 11:14:00 2001
@@ -18,7 +18,7 @@
 
 #else
 
-extern inline void arch_reset(char mode)
+static inline void arch_reset(char mode)
 {
 	if (mode == 's') {
 		/* Jump into ROM at address 0 */
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-sa1100/time.h linux/include/asm-arm/arch-sa1100/time.h
--- v2.4.8/linux/include/asm-arm/arch-sa1100/time.h	Mon Jun 19 17:59:35 2000
+++ linux/include/asm-arm/arch-sa1100/time.h	Sun Aug 12 11:14:00 2001
@@ -5,11 +5,47 @@
  * Twiddles  (C) 1999 	Hugo Fiennes <hugo@empeg.com>
  * 
  * 2000/03/29 (C) Nicolas Pitre <nico@cam.org>
- *	Rewritten: big cleanup, much simpler, better HZ acuracy.
+ *	Rewritten: big cleanup, much simpler, better HZ accuracy.
  *
  */
 
 
+#define RTC_DEF_DIVIDER		32768 - 1
+#define RTC_DEF_TRIM            0
+
+static unsigned long __init sa1100_get_rtc_time(void)
+{
+	/*
+	 * According to the manual we should be able to let RTTR be zero
+	 * and then a default diviser for a 32.768KHz clock is used.
+	 * Apparently this doesn't work, at least for my SA1110 rev 5.
+	 * If the clock divider is uninitialized then reset it to the
+	 * default value to get the 1Hz clock.
+	 */
+	if (RTTR == 0) {
+		RTTR = RTC_DEF_DIVIDER + (RTC_DEF_TRIM << 16);
+		printk(KERN_WARNING "Warning: uninitialized Real Time Clock\n");
+		/* The current RTC value probably doesn't make sense either */
+		RCNR = 0;
+		return 0;
+	}
+	return RCNR;
+}
+
+static int sa1100_set_rtc(void)
+{
+	unsigned long current_time = xtime.tv_sec;
+
+	if (RTSR & RTSR_ALE) {
+		/* make sure not to forward the clock over an alarm */
+		unsigned long alarm = RTAR;
+		if (current_time >= alarm && alarm >= RCNR)
+			return -ERESTARTSYS;
+	}
+	RCNR = current_time;
+	return 0;
+}
+
 /* IRQs are disabled before entering here from do_gettimeofday() */
 static unsigned long sa1100_gettimeoffset (void)
 {
@@ -27,7 +63,6 @@
 	return usec;
 }
 
-
 static void sa1100_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 {
 	long flags;
@@ -41,6 +76,7 @@
 	 */
 	do {
 		do_leds();
+		do_set_rtc();
 		save_flags_cli( flags );
 		do_timer(regs);
 		OSSR = OSSR_M0;  /* Clear match on timer 0 */
@@ -49,10 +85,11 @@
 	} while( (signed long)(next_match - OSCR) <= 0 );
 }
 
-
-extern inline void setup_timer (void)
+static inline void setup_timer (void)
 {
 	gettimeoffset = sa1100_gettimeoffset;
+	set_rtc = sa1100_set_rtc;
+	xtime.tv_sec = sa1100_get_rtc_time();
 	timer_irq.handler = sa1100_timer_interrupt;
 	OSMR0 = 0;		/* set initial match at 0 */
 	OSSR = 0xf;		/* clear status on all timers */
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-sa1100/uncompress.h linux/include/asm-arm/arch-sa1100/uncompress.h
--- v2.4.8/linux/include/asm-arm/arch-sa1100/uncompress.h	Thu Feb  8 16:32:44 2001
+++ linux/include/asm-arm/arch-sa1100/uncompress.h	Sun Aug 12 11:14:00 2001
@@ -7,7 +7,6 @@
  */
 
 #include "hardware.h"
-#include "serial_reg.h"
 
 #include <asm/mach-types.h>
 
@@ -22,36 +21,41 @@
  * The following code assumes the serial port has already been
  * initialized by the bootloader or such...
  */
+
+#define UART(x)		(*(volatile unsigned long *)(serial_port + (x)))
+
 static void puts( const char *s )
 {
-	volatile unsigned long *serial_port;
+	unsigned long serial_port;
 
 	if (machine_is_assabet()) {
 		if( machine_has_neponset() )
-			serial_port = (unsigned long *)_Ser3UTCR0;
+			serial_port = _Ser3UTCR0;
 		else
-			serial_port = (unsigned long *)_Ser1UTCR0;
+			serial_port = _Ser1UTCR0;
 	} else if (machine_is_brutus()||machine_is_nanoengine() ||
-		machine_is_pangolin())
-		serial_port = (unsigned long *)_Ser1UTCR0;
+		   machine_is_pangolin() || machine_is_freebird() ||
+		   machine_is_pfs168() || machine_is_flexanet())
+		serial_port = _Ser1UTCR0;
 	else if (machine_is_empeg() || machine_is_bitsy() ||
 		 machine_is_victor() || machine_is_lart() ||
-		 machine_is_sherman() )
-		serial_port = (unsigned long *)_Ser3UTCR0;
+		 machine_is_sherman() || machine_is_yopy() ||
+		 machine_is_huw_webpanel() || machine_is_itsy() )
+		serial_port = _Ser3UTCR0;
 	else
 		return;
 
 	for (; *s; s++) {
 		/* wait for space in the UART's transmiter */
-		while (!(serial_port[UTSR1] & UTSR1_TNF));
+		while (!(UART(UTSR1) & UTSR1_TNF));
 
 		/* send the character out. */
-		serial_port[UART_TX] = *s;
+		UART(UTDR) = *s;
 
 		/* if a LF, also do CR... */
 		if (*s == 10) {
-			while (!(serial_port[UTSR1] & UTSR1_TNF));
-			serial_port[UART_TX] = 13;
+			while (!(UART(UTSR1) & UTSR1_TNF));
+			UART(UTDR) = 13;
 		}
 	}
 }
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-sa1100/yopy.h linux/include/asm-arm/arch-sa1100/yopy.h
--- v2.4.8/linux/include/asm-arm/arch-sa1100/yopy.h	Wed Dec 31 16:00:00 1969
+++ linux/include/asm-arm/arch-sa1100/yopy.h	Sun Aug 12 11:14:00 2001
@@ -0,0 +1,127 @@
+#ifndef __ASM_ARCH_YOPY_H__
+#define __ASM_ARCH_YOPY_H__
+
+/******************************************************************************
+ * Memory mappings
+ ******************************************************************************/
+
+/* Flash memories */
+#define YOPY_FLASH0_BASE_P	(0x00000000)	/* CS0 */
+#define YOPY_FLASH0_BASE_V	(0xe8000000)
+#define YOPY_FLASH0_BASE	YOPY_FLASH0_BASE_V
+#define YOPY_FLASH0_SIZE	(0x04000000)	/* map 64MB */
+
+#define YOPY_FLASH1_BASE_P	(0x08000000)	/* CS1 */
+#define YOPY_FLASH1_BASE_V	(YOPY_FLASH0_BASE_V + YOPY_FLASH0_SIZE)
+#define YOPY_FLASH1_BASE	YOPY_FLASH1_BASE_V
+#define YOPY_FLASH1_SIZE	(0x04000000)	/* map 64MB */
+
+/* LCD Controller */
+#define YOPY_LCD_IO_BASE_P	(0x48000000)	/* CS5 */
+#define YOPY_LCD_IO_BASE_V	(0xf0000000)
+
+#define YOPY_LCD_IO_BASE	YOPY_LCD_IO_BASE_V
+#define YOPY_LCD_IO_RANGE	(0x00208000)
+
+/* Extended GPIO */
+#define YOPY_EGPIO_BASE_P	(0x10000000)	/* CS2 */
+#define YOPY_EGPIO_BASE_V	(0xf1000000)
+
+#define YOPY_EGPIO_BASE		YOPY_EGPIO_BASE_V
+#define YOPY_EGPIO_RANGE	4
+
+#define YOPY_EGPIO		(*((volatile Word *)YOPY_EGPIO_BASE))
+
+
+/******************************************************************************
+ * GPIO assignements
+ ******************************************************************************/
+
+#define GPIO_UCB1200_IRQ	GPIO_GPIO0
+#define GPIO_UCB1200_RESET	GPIO_GPIO22
+
+#define GPIO_CF_IREQ		GPIO_GPIO2
+#define GPIO_CF_CD		GPIO_GPIO3
+#define GPIO_CF_BVD1		GPIO_GPIO4
+#define GPIO_CF_BVD2		GPIO_GPIO5
+#define GPIO_CF_CSEL		GPIO_GPIO6
+#define GPIO_CF_READY		GPIO_CF_IREQ
+#define GPIO_CF_STSCHG		GPIO_CF_BVD1
+#define GPIO_CF_SPKR		GPIO_CF_BVD2
+
+#define GPIO_MASK(io)		(1 << (io))
+
+#define GPIO_YOPY_PLL_ML	PPC_LDD7
+#define GPIO_YOPY_PLL_MC	PPC_L_LCLK
+#define GPIO_YOPY_PLL_MD	PPC_L_FCLK
+
+#define GPIO_YOPY_L3_MODE	PPC_LDD4
+#define GPIO_YOPY_L3_CLOCK	PPC_LDD5
+#define GPIO_YOPY_L3_DATA	PPC_LDD6
+
+#define GPIO_CF_RESET		0
+#define GPIO_CLKDIV_CLR1	1
+#define GPIO_CLKDIV_CLR2	2
+#define GPIO_SPEAKER_MUTE	5
+#define GPIO_CF_POWER		8
+#define GPIO_AUDIO_OPAMP_POWER	11
+#define GPIO_AUDIO_CODEC_POWER	12
+#define GPIO_AUDIO_POWER	13
+
+#define GPIO_IRDA_POWER		PPC_L_PCLK
+#define GPIO_IRDA_FIR		PPC_LDD0
+
+#ifndef __ASSEMBLY__
+extern int yopy_gpio_test(unsigned int gpio);
+extern void yopy_gpio_set(unsigned int gpio, int level);
+#endif
+
+
+/******************************************************************************
+ * IRQ assignements
+ ******************************************************************************/
+
+/* for our old drivers */
+#define IRQ_SP0_UDC	13
+#define IRQ_SP1_SDLC	14
+#define IRQ_SP1_UART	15
+#define IRQ_SP2_ICP	16
+#define IRQ_SP2_UART	16
+#define IRQ_SP3_UART	17
+#define IRQ_SP4_MCP	18
+#define IRQ_SP4_SSP	19
+#define IRQ_RTC_HZ	30
+#define IRQ_RTC_ALARM	31
+
+/* GPIO interrupts */
+#define IRQ_GPIO_UCB1200_IRQ	IRQ_GPIO0
+
+#define IRQ_CF_IREQ		IRQ_GPIO2
+#define IRQ_CF_CD		IRQ_GPIO3
+#define IRQ_CF_BVD1		IRQ_GPIO4
+#define IRQ_CF_BVD2		IRQ_GPIO5
+
+#define IRQ_UART_CTS		IRQ_GPIO7
+#define IRQ_UART_DCD		IRQ_GPIO8
+#define IRQ_UART_DSR		IRQ_GPIO9
+
+#define IRQ_FLASH_STATUS	IRQ_GPIO23
+
+#define IRQ_BUTTON_POWER	IRQ_GPIO1
+#define IRQ_BUTTON_UP		IRQ_GPIO14
+#define IRQ_BUTTON_DOWN		IRQ_GPIO15
+#define IRQ_BUTTON_LEFT		IRQ_GPIO16
+#define IRQ_BUTTON_RIGHT	IRQ_GPIO17
+#define IRQ_BUTTON_SHOT0	IRQ_GPIO18
+#define IRQ_BUTTON_SHOT1	IRQ_GPIO20
+#define IRQ_BUTTON_PIMS		IRQ_UCB1200_IO1
+#define IRQ_BUTTON_MP3		IRQ_UCB1200_IO2
+#define IRQ_BUTTON_RECORD	IRQ_UCB1200_IO3
+#define IRQ_BUTTON_PREV		IRQ_UCB1200_IO4
+#define IRQ_BUTTON_SELECT	IRQ_UCB1200_IO5
+#define IRQ_BUTTON_NEXT		IRQ_UCB1200_IO6
+#define IRQ_BUTTON_CANCEL	IRQ_UCB1200_IO7
+#define IRQ_BUTTON_REMOTE	IRQ_UCB1200_IO8
+
+
+#endif
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-shark/dma.h linux/include/asm-arm/arch-shark/dma.h
--- v2.4.8/linux/include/asm-arm/arch-shark/dma.h	Thu Apr 12 12:20:31 2001
+++ linux/include/asm-arm/arch-shark/dma.h	Sun Aug 12 11:14:00 2001
@@ -14,5 +14,17 @@
 #define MAX_DMA_CHANNELS	8
 #define DMA_ISA_CASCADE         4
 
+static inline void __arch_adjust_zones(int node, unsigned long *zone_size, unsigned long *zhole_size) 
+{
+  if (node != 0) return;
+  /* Only the first 4 MB (=1024 Pages) are usable for DMA */
+  zone_size[1] = zone_size[0] - 1024;
+  zone_size[0] = 1024;
+  zhole_size[1] = zhole_size[0];
+  zhole_size[0] = 0;
+}
+
+#define arch_adjust_zones(node,size,holes) __arch_adjust_zones(node,size,holes)
+
 #endif /* _ASM_ARCH_DMA_H */
 
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-shark/io.h linux/include/asm-arm/arch-shark/io.h
--- v2.4.8/linux/include/asm-arm/arch-shark/io.h	Thu Apr 12 12:20:31 2001
+++ linux/include/asm-arm/arch-shark/io.h	Sun Aug 12 11:14:00 2001
@@ -11,7 +11,8 @@
 #ifndef __ASM_ARM_ARCH_IO_H
 #define __ASM_ARM_ARCH_IO_H
 
-#define __arch_ioremap(off,size,nocache) __ioremap(off,size,0)
+#define iomem_valid_addr(off,sz)	(1)
+#define iomem_to_phys(off)		(off)
 
 #define IO_SPACE_LIMIT 0xffffffff
 
@@ -28,7 +29,7 @@
  * optimize the expressions
  */
 #define DECLARE_DYN_OUT(fnsuffix,instr)						\
-extern __inline__ void __out##fnsuffix (unsigned int value, unsigned int port)	\
+static inline void __out##fnsuffix (unsigned int value, unsigned int port)	\
 {										\
 	unsigned long temp;							\
 	__asm__ __volatile__(							\
@@ -42,7 +43,7 @@
 }
 
 #define DECLARE_DYN_IN(sz,fnsuffix,instr)					\
-extern __inline__ unsigned sz __in##fnsuffix (unsigned int port)		\
+static inline unsigned sz __in##fnsuffix (unsigned int port)		\
 {										\
 	unsigned long temp, value;						\
 	__asm__ __volatile__(							\
@@ -56,7 +57,7 @@
 	return (unsigned sz)value;						\
 }
 
-extern __inline__ unsigned int __ioaddr (unsigned int port)			\
+static inline unsigned int __ioaddr (unsigned int port)			\
 {										\
 	if (__PORT_PCIO(port))							\
 		return (unsigned int)(PCIO_BASE + (port));			\
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-shark/memory.h linux/include/asm-arm/arch-shark/memory.h
--- v2.4.8/linux/include/asm-arm/arch-shark/memory.h	Thu Apr 12 12:20:31 2001
+++ linux/include/asm-arm/arch-shark/memory.h	Sun Aug 12 11:14:00 2001
@@ -38,4 +38,6 @@
 #define __bus_to_virt__is_a_macro
 #define __bus_to_virt(x)	__phys_to_virt(x)
 
+#define PHYS_TO_NID(addr)	(0)
+
 #endif
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-shark/time.h linux/include/asm-arm/arch-shark/time.h
--- v2.4.8/linux/include/asm-arm/arch-shark/time.h	Thu Apr 12 12:20:31 2001
+++ linux/include/asm-arm/arch-shark/time.h	Sun Aug 12 11:14:00 2001
@@ -46,7 +46,7 @@
 /*
  * Set up timer interrupt, and return the current time in seconds.
  */
-extern __inline__ void setup_timer(void)
+static inline void setup_timer(void)
 {
         struct rtc_time r_time;
         unsigned long flags;
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-tbox/io.h linux/include/asm-arm/arch-tbox/io.h
--- v2.4.8/linux/include/asm-arm/arch-tbox/io.h	Thu Feb  8 16:32:44 2001
+++ linux/include/asm-arm/arch-tbox/io.h	Sun Aug 12 11:14:00 2001
@@ -15,7 +15,7 @@
 /*
  * Generic virtual read/write
  */
-extern __inline__ unsigned int __arch_getw(unsigned long a)
+static inline unsigned int __arch_getw(unsigned long a)
 {
 	unsigned int value;
 	__asm__ __volatile__("ldr%?h	%0, [%1, #0]	@ getw"
@@ -24,7 +24,7 @@
 	return value;
 }
 
-extern __inline__ void __arch_putw(unsigned int value, unsigned long a)
+static inline void __arch_putw(unsigned int value, unsigned long a)
 {
 	__asm__ __volatile__("str%?h	%0, [%1, #0]	@ putw"
 		: : "r" (value), "r" (a));
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-tbox/memory.h linux/include/asm-arm/arch-tbox/memory.h
--- v2.4.8/linux/include/asm-arm/arch-tbox/memory.h	Mon Nov 27 17:07:59 2000
+++ linux/include/asm-arm/arch-tbox/memory.h	Sun Aug 12 11:14:00 2001
@@ -41,4 +41,6 @@
 #define __bus_to_virt__is_a_macro
 #define __bus_to_virt(x)	__phys_to_virt(x)
 
+#define PHYS_TO_NID(addr)	(0)
+
 #endif
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/arch-tbox/time.h linux/include/asm-arm/arch-tbox/time.h
--- v2.4.8/linux/include/asm-arm/arch-tbox/time.h	Thu Apr 12 12:20:31 2001
+++ linux/include/asm-arm/arch-tbox/time.h	Sun Aug 12 11:14:00 2001
@@ -29,7 +29,7 @@
 	do_timer(regs);
 }
 
-extern __inline__ void setup_timer (void)
+static inline void setup_timer (void)
 {
 	/*
 	 * Default the date to 1 Jan 1970 0:0:0
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/atomic.h linux/include/asm-arm/atomic.h
--- v2.4.8/linux/include/asm-arm/atomic.h	Mon Sep 18 15:15:23 2000
+++ linux/include/asm-arm/atomic.h	Sun Aug 12 11:14:00 2001
@@ -85,7 +85,7 @@
 	return result;
 }
 
-extern __inline__ int atomic_add_negative(int i, volatile atomic_t *v)
+static inline int atomic_add_negative(int i, volatile atomic_t *v)
 {
 	unsigned long flags;
 	int result;
@@ -106,6 +106,12 @@
 	*addr &= ~mask;
 	__restore_flags(flags);
 }
+
+/* Atomic operations are already serializing on ARM */
+#define smp_mb__before_atomic_dec()	barrier()
+#define smp_mb__after_atomic_dec()	barrier()
+#define smp_mb__before_atomic_inc()	barrier()
+#define smp_mb__after_atomic_inc()	barrier()
 
 #endif
 #endif
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/bitops.h linux/include/asm-arm/bitops.h
--- v2.4.8/linux/include/asm-arm/bitops.h	Tue Jul  3 17:08:21 2001
+++ linux/include/asm-arm/bitops.h	Sun Aug 12 11:14:00 2001
@@ -86,7 +86,7 @@
 /*
  * This routine doesn't need to be atomic.
  */
-extern __inline__ int test_bit(int nr, const void * addr)
+static inline int test_bit(int nr, const void * addr)
 {
     return ((unsigned char *) addr)[nr >> 3] & (1U << (nr & 7));
 }	
@@ -95,7 +95,7 @@
  * ffz = Find First Zero in word. Undefined if no zero exists,
  * so code should check against ~0UL first..
  */
-extern __inline__ unsigned long ffz(unsigned long word)
+static inline unsigned long ffz(unsigned long word)
 {
 	int k;
 
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/checksum.h linux/include/asm-arm/checksum.h
--- v2.4.8/linux/include/asm-arm/checksum.h	Mon Sep 18 15:15:23 2000
+++ linux/include/asm-arm/checksum.h	Sun Aug 12 11:14:00 2001
@@ -149,7 +149,7 @@
 __csum_ipv6_magic(struct in6_addr *saddr, struct in6_addr *daddr, __u32 len,
 		__u32 proto, unsigned int sum);
 
-extern __inline__ unsigned short int
+static inline unsigned short int
 csum_ipv6_magic(struct in6_addr *saddr, struct in6_addr *daddr, __u32 len,
 		unsigned short proto, unsigned int sum)
 {
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/delay.h linux/include/asm-arm/delay.h
--- v2.4.8/linux/include/asm-arm/delay.h	Tue Jan 20 16:39:42 1998
+++ linux/include/asm-arm/delay.h	Sun Aug 12 11:14:00 2001
@@ -21,7 +21,7 @@
  */
 extern void udelay(unsigned long usecs);
 
-extern __inline__ unsigned long muldiv(unsigned long a, unsigned long b, unsigned long c)
+static inline unsigned long muldiv(unsigned long a, unsigned long b, unsigned long c)
 {
 	return a * b / c;
 }
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/dma.h linux/include/asm-arm/dma.h
--- v2.4.8/linux/include/asm-arm/dma.h	Mon Sep 18 15:15:23 2000
+++ linux/include/asm-arm/dma.h	Sun Aug 12 11:14:00 2001
@@ -24,14 +24,14 @@
 
 extern spinlock_t  dma_spin_lock;
 
-extern __inline__ unsigned long claim_dma_lock(void)
+static inline unsigned long claim_dma_lock(void)
 {
 	unsigned long flags;
 	spin_lock_irqsave(&dma_spin_lock, flags);
 	return flags;
 }
 
-extern __inline__ void release_dma_lock(unsigned long flags)
+static inline void release_dma_lock(unsigned long flags)
 {
 	spin_unlock_irqrestore(&dma_spin_lock, flags);
 }
@@ -127,6 +127,10 @@
 extern int isa_dma_bridge_buggy;
 #else
 #define isa_dma_bridge_buggy    (0)
+#endif
+
+#ifndef arch_adjust_zones
+#define arch_adjust_zones(node,size,holes)
 #endif
 
 #endif /* _ARM_DMA_H */
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/floppy.h linux/include/asm-arm/floppy.h
--- v2.4.8/linux/include/asm-arm/floppy.h	Mon Sep 18 15:15:23 2000
+++ linux/include/asm-arm/floppy.h	Sun Aug 12 11:14:00 2001
@@ -69,7 +69,7 @@
 /*
  * Someday, we'll automatically detect which drives are present...
  */
-extern __inline__ void fd_scandrives (void)
+static inline void fd_scandrives (void)
 {
 #if 0
 	int floppy, drive_count;
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/hardirq.h linux/include/asm-arm/hardirq.h
--- v2.4.8/linux/include/asm-arm/hardirq.h	Wed Jul 25 17:10:25 2001
+++ linux/include/asm-arm/hardirq.h	Sun Aug 12 11:14:00 2001
@@ -10,6 +10,7 @@
 	unsigned int __local_irq_count;
 	unsigned int __local_bh_count;
 	unsigned int __syscall_count;
+	struct task_struct * __ksoftirqd_task; /* waitqueue is too large */
 } ____cacheline_aligned irq_cpustat_t;
 
 #include <linux/irq_cpustat.h>	/* Standard mappings for irq_cpustat_t above */
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/hardware/pci_v3.h linux/include/asm-arm/hardware/pci_v3.h
--- v2.4.8/linux/include/asm-arm/hardware/pci_v3.h	Fri Mar  2 18:38:39 2001
+++ linux/include/asm-arm/hardware/pci_v3.h	Sun Aug 12 11:14:00 2001
@@ -4,7 +4,7 @@
  *  Internal header file PCI V3 chip
  *
  *  Copyright (C) ARM Limited
- *  Copyright (C) 2000 Deep Blue Solutions Ltd.
+ *  Copyright (C) 2000-2001 Deep Blue Solutions Ltd.
  *
  * 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
@@ -124,25 +124,59 @@
 #define V3_PCI_MAP_M_REG_EN             (1 << 1)
 #define V3_PCI_MAP_M_ENABLE             (1 << 0)
 
-/*  9 => 512M window size
+/*
+ *  LB_BASE0,1 register bits (Local bus -> PCI)
  */
-#define V3_PCI_MAP_M_ADR_SIZE_512M      0x00000090
-/*  A => 1024M window size
- */
-#define V3_PCI_MAP_M_ADR_SIZE_1024M     0x000000A0      
+#define V3_LB_BASE_ADR_BASE		0xfff00000
+#define V3_LB_BASE_SWAP			(3 << 8)
+#define V3_LB_BASE_ADR_SIZE		(15 << 4)
+#define V3_LB_BASE_PREFETCH		(1 << 3)
+#define V3_LB_BASE_ENABLE		(1 << 0)
+
+#define V3_LB_BASE_ADR_SIZE_1MB		(0 << 4)
+#define V3_LB_BASE_ADR_SIZE_2MB		(1 << 4)
+#define V3_LB_BASE_ADR_SIZE_4MB		(2 << 4)
+#define V3_LB_BASE_ADR_SIZE_8MB		(3 << 4)
+#define V3_LB_BASE_ADR_SIZE_16MB	(4 << 4)
+#define V3_LB_BASE_ADR_SIZE_32MB	(5 << 4)
+#define V3_LB_BASE_ADR_SIZE_64MB	(6 << 4)
+#define V3_LB_BASE_ADR_SIZE_128MB	(7 << 4)
+#define V3_LB_BASE_ADR_SIZE_256MB	(8 << 4)
+#define V3_LB_BASE_ADR_SIZE_512MB	(9 << 4)
+#define V3_LB_BASE_ADR_SIZE_1GB		(10 << 4)
+#define V3_LB_BASE_ADR_SIZE_2GB		(11 << 4)
+
+#define v3_addr_to_lb_base(a)	((a) & V3_LB_BASE_ADR_BASE)
+
+/*
+ *  LB_MAP0,1 register bits (Local bus -> PCI)
+ */
+#define V3_LB_MAP_MAP_ADR		0xfff0
+#define V3_LB_MAP_TYPE			(7 << 1)
+#define V3_LB_MAP_AD_LOW_EN		(1 << 0)
+
+#define V3_LB_MAP_TYPE_IACK		(0 << 1)
+#define V3_LB_MAP_TYPE_IO		(1 << 1)
+#define V3_LB_MAP_TYPE_MEM		(3 << 1)
+#define V3_LB_MAP_TYPE_CONFIG		(5 << 1)
+#define V3_LB_MAP_TYPE_MEM_MULTIPLE	(6 << 1)
+
+#define v3_addr_to_lb_map(a)	(((a) >> 16) & V3_LB_MAP_MAP_ADR)
+
+/*
+ *  LB_BASE2 register bits (Local bus -> PCI IO)
+ */
+#define V3_LB_BASE2_ADR_BASE		0xff00
+#define V3_LB_BASE2_SWAP		(3 << 6)
+#define V3_LB_BASE2_ENABLE		(1 << 0)
 
-/*  LB_BASE register bits (Local bus -> PCI)
- */
-#define V3_LB_BASE_M_MAP_ADR            0xFFF00000
-#define V3_LB_BASE_M_SWAP               (3 << 8)
-#define V3_LB_BASE_M_ADR_SIZE           0x000000F0
-#define V3_LB_BASE_M_PREFETCH           (1 << 3)
-#define V3_LB_BASE_M_ENABLE             (1 << 0)
+#define v3_addr_to_lb_base2(a)	(((a) >> 16) & V3_LB_BASE2_ADR_BASE)
 
-/*  LB_MAP register bits (Local bus -> PCI)
+/*
+ *  LB_MAP2 register bits (Local bus -> PCI IO)
  */
-#define V3_LB_MAP_M_MAP_ADR             0xFFF0
-#define V3_LB_MAP_M_TYPE                0x000E
-#define V3_LB_MAP_M_AD_LOW_EN           (1 << 0)
+#define V3_LB_MAP2_MAP_ADR		0xff00
+
+#define v3_addr_to_lb_map2(a)	(((a) >> 16) & V3_LB_MAP2_MAP_ADR)
 
 #endif
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/io.h linux/include/asm-arm/io.h
--- v2.4.8/linux/include/asm-arm/io.h	Tue Jul  3 17:08:21 2001
+++ linux/include/asm-arm/io.h	Sun Aug 12 11:14:00 2001
@@ -31,11 +31,40 @@
  * read/writes.  We define __arch_*[bl] here, and leave __arch_*w
  * to the architecture specific code.
  */
-#define __arch_getb(a)		(*(volatile unsigned char *)(a))
-#define __arch_getl(a)		(*(volatile unsigned int  *)(a))
+#define __arch_getb(a)			(*(volatile unsigned char *)(a))
+#define __arch_getl(a)			(*(volatile unsigned int  *)(a))
 
-#define __arch_putb(v,a)	(*(volatile unsigned char *)(a) = (v))
-#define __arch_putl(v,a)	(*(volatile unsigned int  *)(a) = (v))
+#define __arch_putb(v,a)		(*(volatile unsigned char *)(a) = (v))
+#define __arch_putl(v,a)		(*(volatile unsigned int  *)(a) = (v))
+
+extern void __raw_writesb(unsigned int addr, void *data, int bytelen);
+extern void __raw_writesw(unsigned int addr, void *data, int wordlen);
+extern void __raw_writesl(unsigned int addr, void *data, int longlen);
+
+extern void __raw_readsb(unsigned int addr, void *data, int bytelen);
+extern void __raw_readsw(unsigned int addr, void *data, int wordlen);
+extern void __raw_readsl(unsigned int addr, void *data, int longlen);
+
+#define __raw_writeb(v,a)		__arch_putb(v,a)
+#define __raw_writew(v,a)		__arch_putw(v,a)
+#define __raw_writel(v,a)		__arch_putl(v,a)
+
+#define __raw_readb(a)			__arch_getb(a)
+#define __raw_readw(a)			__arch_getw(a)
+#define __raw_readl(a)			__arch_getl(a)
+
+/*
+ * The compiler seems to be incapable of optimising constants
+ * properly.  Spell it out to the compiler in some cases.
+ * These are only valid for small values of "off" (< 1<<12)
+ */
+#define __raw_base_writeb(val,base,off)	__arch_base_putb(val,base,off)
+#define __raw_base_writew(val,base,off)	__arch_base_putw(val,base,off)
+#define __raw_base_writel(val,base,off)	__arch_base_putl(val,base,off)
+
+#define __raw_base_readb(base,off)	__arch_base_getb(base,off)
+#define __raw_base_readw(base,off)	__arch_base_getw(base,off)
+#define __raw_base_readl(base,off)	__arch_base_getl(base,off)
 
 /*
  * Now, pick up the machine-defined IO definitions
@@ -43,18 +72,26 @@
 #include <asm/arch/io.h>
 
 /*
- * IO definitions.  We define {out,in}[bwl] if __io is defined by
- * the machine.  Otherwise, these definitions are left for the
- * machine specific header files to pick up.
+ * IO definitions.  We define {out,in,outs,ins}[bwl] if __io is
+ * defined by the machine.  Otherwise, these definitions are left
+ * for the machine specific header files to pick up.
  */
 #ifdef __io
-#define outb(v,p)			__arch_putb(v,__io(p))
-#define outw(v,p)			__arch_putw(v,__io(p))
-#define outl(v,p)			__arch_putl(v,__io(p))
-
-#define inb(p)				__arch_getb(__io(p))
-#define inw(p)				__arch_getw(__io(p))
-#define inl(p)				__arch_getl(__io(p))
+#define outb(v,p)			__raw_writeb(v,__io(p))
+#define outw(v,p)			__raw_writew(v,__io(p))
+#define outl(v,p)			__raw_writel(v,__io(p))
+
+#define inb(p)				__raw_readb(__io(p))
+#define inw(p)				__raw_readw(__io(p))
+#define inl(p)				__raw_readl(__io(p))
+
+#define outsb(p,d,l)			__raw_writesb(__io(p),d,l)
+#define outsw(p,d,l)			__raw_writesw(__io(p),d,l)
+#define outsl(p,d,l)			__raw_writesl(__io(p),d,l)
+
+#define insb(p,d,l)			__raw_readsb(__io(p),d,l)
+#define insw(p,d,l)			__raw_readsw(__io(p),d,l)
+#define insl(p,d,l)			__raw_readsl(__io(p),d,l)
 #endif
 
 #define outb_p(val,port)		outb((val),(port))
@@ -64,13 +101,6 @@
 #define inw_p(port)			inw((port))
 #define inl_p(port)			inl((port))
 
-extern void outsb(unsigned int port, const void *from, int len);
-extern void outsw(unsigned int port, const void *from, int len);
-extern void outsl(unsigned int port, const void *from, int len);
-extern void insb(unsigned int port, void *from, int len);
-extern void insw(unsigned int port, void *from, int len);
-extern void insl(unsigned int port, void *from, int len);
-
 #define outsb_p(port,from,len)		outsb(port,from,len)
 #define outsw_p(port,from,len)		outsw(port,from,len)
 #define outsl_p(port,from,len)		outsl(port,from,len)
@@ -121,27 +151,6 @@
 extern void *consistent_alloc(int gfp, size_t size, dma_addr_t *handle);
 extern void consistent_free(void *vaddr, size_t size, dma_addr_t handle);
 extern void consistent_sync(void *vaddr, size_t size, int rw);
-
-#define __raw_writeb(v,a)		__arch_putb(v,a)
-#define __raw_writew(v,a)		__arch_putw(v,a)
-#define __raw_writel(v,a)		__arch_putl(v,a)
-
-#define __raw_readb(a)			__arch_getb(a)
-#define __raw_readw(a)			__arch_getw(a)
-#define __raw_readl(a)			__arch_getl(a)
-
-/*
- * The compiler seems to be incapable of optimising constants
- * properly.  Spell it out to the compiler in some cases.
- * These are only valid for small values of "off" (< 1<<12)
- */
-#define __raw_base_writeb(val,base,off)	__arch_base_putb(val,base,off)
-#define __raw_base_writew(val,base,off)	__arch_base_putw(val,base,off)
-#define __raw_base_writel(val,base,off)	__arch_base_putl(val,base,off)
-
-#define __raw_base_readb(base,off)	__arch_base_getb(base,off)
-#define __raw_base_readw(base,off)	__arch_base_getw(base,off)
-#define __raw_base_readl(base,off)	__arch_base_getl(base,off)
 
 /*
  * String version of IO memory access ops:
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/keyboard.h linux/include/asm-arm/keyboard.h
--- v2.4.8/linux/include/asm-arm/keyboard.h	Mon Sep 18 15:15:23 2000
+++ linux/include/asm-arm/keyboard.h	Sun Aug 12 17:36:24 2001
@@ -23,6 +23,12 @@
 
 #include <asm/arch/keyboard.h>
 
+#ifndef kbd_rate
+struct kbd_repeat;
+
+extern int kbd_rate(struct kbd_repeat *rate) __attribute__((weak));
+#endif
+
 #endif /* __KERNEL__ */
 
 #endif /* __ASM_ARM_KEYBOARD_H */
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/mach/amba_kmi.h linux/include/asm-arm/mach/amba_kmi.h
--- v2.4.8/linux/include/asm-arm/mach/amba_kmi.h	Fri Mar  2 18:38:39 2001
+++ linux/include/asm-arm/mach/amba_kmi.h	Sun Aug 12 11:14:00 2001
@@ -27,6 +27,7 @@
 	u_char			last_tx;
 	u_char			resend_count;
 	u_short			res;
+	u_char			present;
 	wait_queue_head_t	wait_q;
 	void			(*rx)(struct kmi_info *, u_int val,
 				      struct pt_regs *regs);
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/mach/arch.h linux/include/asm-arm/mach/arch.h
--- v2.4.8/linux/include/asm-arm/mach/arch.h	Thu Feb  8 16:32:44 2001
+++ linux/include/asm-arm/mach/arch.h	Sun Aug 12 11:14:00 2001
@@ -12,15 +12,13 @@
  * The size of struct machine_desc
  *   (for assembler code)
  */
-#define SIZEOF_MACHINE_DESC	56
+#define SIZEOF_MACHINE_DESC	48
 
 #ifndef __ASSEMBLY__
 
 extern void setup_initrd(unsigned int start, unsigned int size);
 extern void setup_ramdisk(int doload, int prompt, int start, unsigned int rd_sz);
 
-struct tagtable;
-
 struct machine_desc {
 	/*
 	 * Note! The first four elements are used
@@ -41,8 +39,6 @@
 	unsigned int		reserve_lp1 :1;	/* never has lp1	*/
 	unsigned int		reserve_lp2 :1;	/* never has lp2	*/
 	unsigned int		soft_reboot :1;	/* soft reboot		*/
-	const struct tagtable *	tagtable;	/* tag table		*/
-	int			tagsize;	/* tag table size	*/
 	void			(*fixup)(struct machine_desc *,
 					 struct param_struct *, char **,
 					 struct meminfo *);
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/mach/pci.h linux/include/asm-arm/mach/pci.h
--- v2.4.8/linux/include/asm-arm/mach/pci.h	Wed Jul 25 17:10:25 2001
+++ linux/include/asm-arm/mach/pci.h	Sun Aug 12 11:14:00 2001
@@ -30,3 +30,5 @@
 extern u8 no_swizzle(struct pci_dev *dev, u8 *pin);
 extern void __init dc21285_setup_resources(struct resource **resource);
 extern void __init dc21285_init(void *sysdata);
+extern void __init via82c505_init(void *sysdata);
+
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/mach/serial_sa1100.h linux/include/asm-arm/mach/serial_sa1100.h
--- v2.4.8/linux/include/asm-arm/mach/serial_sa1100.h	Wed Dec 31 16:00:00 1969
+++ linux/include/asm-arm/mach/serial_sa1100.h	Sun Aug 12 11:14:00 2001
@@ -0,0 +1,37 @@
+/*
+ *  linux/include/asm-arm/mach/serial_sa1100.h
+ *
+ *  Author: Nicolas Pitre
+ *
+ * Moved to include/asm-arm/mach and changed lots, Russell King
+ *
+ * Low level machine dependent UART functions.
+ */
+#include <linux/config.h>
+
+struct uart_port;
+struct uart_info;
+
+/*
+ * This is a temporary structure for registering these
+ * functions; it is intended to be discarded after boot.
+ */
+struct sa1100_port_fns {
+	void	(*set_mctrl)(struct uart_port *, u_int);
+	int	(*get_mctrl)(struct uart_port *);
+	void	(*enable_ms)(struct uart_port *);
+	void	(*pm)(struct uart_port *, u_int, u_int);
+	int	(*open)(struct uart_port *, struct uart_info *);
+	void	(*close)(struct uart_port *, struct uart_info *);
+};
+
+#if defined(CONFIG_SERIAL_SA1100) && !defined(CONFIG_SERIAL_SA1100_OLD)
+void sa1100_register_uart_fns(struct sa1100_port_fns *fns);
+void sa1100_register_uart(int idx, int port);
+#else
+#define sa1100_register_uart_fns(fns) do { } while (0)
+#define sa1100_register_uart(idx,port) do { } while (0)
+#endif
+
+void sa1100_uart1_altgpio(void);
+
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/memory.h linux/include/asm-arm/memory.h
--- v2.4.8/linux/include/asm-arm/memory.h	Mon Sep 18 15:15:24 2000
+++ linux/include/asm-arm/memory.h	Sun Aug 12 11:14:00 2001
@@ -16,12 +16,12 @@
 
 #include <asm/arch/memory.h>
 
-extern __inline__ unsigned long virt_to_phys(volatile void *x)
+static inline unsigned long virt_to_phys(volatile void *x)
 {
 	return __virt_to_phys((unsigned long)(x));
 }
 
-extern __inline__ void *phys_to_virt(unsigned long x)
+static inline void *phys_to_virt(unsigned long x)
 {
 	return (void *)(__phys_to_virt((unsigned long)(x)));
 }
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/mmzone.h linux/include/asm-arm/mmzone.h
--- v2.4.8/linux/include/asm-arm/mmzone.h	Thu Apr 12 12:20:31 2001
+++ linux/include/asm-arm/mmzone.h	Sun Aug 12 11:14:00 2001
@@ -25,6 +25,6 @@
  */
 #define NODE_MEM_MAP(nid)	(NODE_DATA(nid)->node_mem_map)
 
-#include <asm/arch/mmzone.h>
+#include <asm/arch/memory.h>
 
 #endif
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/page.h linux/include/asm-arm/page.h
--- v2.4.8/linux/include/asm-arm/page.h	Sun Aug 13 09:54:15 2000
+++ linux/include/asm-arm/page.h	Sun Aug 12 11:14:00 2001
@@ -69,7 +69,7 @@
 #define PAGE_BUG(page)	__bug(__FILE__, __LINE__, page)
 
 /* Pure 2^n version of get_order */
-extern __inline__ int get_order(unsigned long size)
+static inline int get_order(unsigned long size)
 {
 	int order;
 
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/pci.h linux/include/asm-arm/pci.h
--- v2.4.8/linux/include/asm-arm/pci.h	Tue Jul  3 17:08:21 2001
+++ linux/include/asm-arm/pci.h	Sun Aug 12 11:14:00 2001
@@ -5,12 +5,12 @@
 
 #include <asm/arch/hardware.h>
 
-extern inline void pcibios_set_master(struct pci_dev *dev)
+static inline void pcibios_set_master(struct pci_dev *dev)
 {
 	/* No special bus mastering setup handling */
 }
 
-extern inline void pcibios_penalize_isa_irq(int irq)
+static inline void pcibios_penalize_isa_irq(int irq)
 {
 	/* We don't do dynamic PCI IRQ allocation */
 }
@@ -37,20 +37,21 @@
  * References to the memory and mappings associated with cpu_addr/dma_addr
  * past this call are illegal.
  */
-extern inline void
+static inline void
 pci_free_consistent(struct pci_dev *hwdev, size_t size, void *vaddr,
 		    dma_addr_t dma_handle)
 {
 	consistent_free(vaddr, size, dma_handle);
 }
 
+#if !defined(CONFIG_SA1111)
 /* Map a single buffer of the indicated size for DMA in streaming mode.
  * The 32-bit bus address to use is returned.
  *
  * Once the device is given the dma address, the device owns this memory
  * until either pci_unmap_single or pci_dma_sync_single is performed.
  */
-extern inline dma_addr_t
+static inline dma_addr_t
 pci_map_single(struct pci_dev *hwdev, void *ptr, size_t size, int direction)
 {
 	consistent_sync(ptr, size, direction);
@@ -64,11 +65,19 @@
  * After this call, reads by the cpu to the buffer are guarenteed to see
  * whatever the device wrote there.
  */
-extern inline void
+static inline void
 pci_unmap_single(struct pci_dev *hwdev, dma_addr_t dma_addr, size_t size, int direction)
 {
 	/* nothing to do */
 }
+#else
+/* for SA1111 these functions are "magic" and relocate buffers */
+extern dma_addr_t pci_map_single(struct pci_dev *hwdev,
+				 void *ptr, size_t size, int direction);
+extern void pci_unmap_single(struct pci_dev *hwdev,
+			     dma_addr_t dma_addr,
+			     size_t size, int direction);
+#endif
 
 /* Map a set of buffers described by scatterlist in streaming
  * mode for DMA.  This is the scather-gather version of the
@@ -85,7 +94,7 @@
  * Device ownership issues as mentioned above for pci_map_single are
  * the same here.
  */
-extern inline int
+static inline int
 pci_map_sg(struct pci_dev *hwdev, struct scatterlist *sg, int nents, int direction)
 {
 	int i;
@@ -102,7 +111,7 @@
  * Again, cpu read rules concerning calls here are the same as for
  * pci_unmap_single() above.
  */
-extern inline void
+static inline void
 pci_unmap_sg(struct pci_dev *hwdev, struct scatterlist *sg, int nents, int direction)
 {
 	/* nothing to do */
@@ -117,7 +126,7 @@
  * next point you give the PCI dma address back to the card, the
  * device again owns the buffer.
  */
-extern inline void
+static inline void
 pci_dma_sync_single(struct pci_dev *hwdev, dma_addr_t dma_handle, size_t size, int direction)
 {
 	consistent_sync(bus_to_virt(dma_handle), size, direction);
@@ -129,7 +138,7 @@
  * The same as pci_dma_sync_single but for a scatter-gather list,
  * same rules and usage.
  */
-extern inline void
+static inline void
 pci_dma_sync_sg(struct pci_dev *hwdev, struct scatterlist *sg, int nelems, int direction)
 {
 	int i;
@@ -143,7 +152,7 @@
  * only drive the low 24-bits during PCI bus mastering, then
  * you would pass 0x00ffffff as the mask to this function.
  */
-extern inline int pci_dma_supported(struct pci_dev *hwdev, dma_addr_t mask)
+static inline int pci_dma_supported(struct pci_dev *hwdev, dma_addr_t mask)
 {
 	return 1;
 }
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/pgalloc.h linux/include/asm-arm/pgalloc.h
--- v2.4.8/linux/include/asm-arm/pgalloc.h	Thu Apr 12 12:20:31 2001
+++ linux/include/asm-arm/pgalloc.h	Sun Aug 12 11:14:00 2001
@@ -53,7 +53,7 @@
 #define __pgd_next(pgd) (((unsigned long *)pgd)[1])
 #define __pte_next(pte)	(((unsigned long *)pte)[0])
 
-extern __inline__ pgd_t *get_pgd_fast(void)
+static inline pgd_t *get_pgd_fast(void)
 {
 	unsigned long *ret;
 
@@ -66,7 +66,7 @@
 	return (pgd_t *)ret;
 }
 
-extern __inline__ void free_pgd_fast(pgd_t *pgd)
+static inline void free_pgd_fast(pgd_t *pgd)
 {
 	__pgd_next(pgd) = (unsigned long) pgd_quicklist;
 	pgd_quicklist = (unsigned long *) pgd;
@@ -86,7 +86,7 @@
 	return (pte_t *)ret;
 }
 
-extern __inline__ void free_pte_fast(pte_t *pte)
+static inline void free_pte_fast(pte_t *pte)
 {
 	__pte_next(pte) = (unsigned long) pte_quicklist;
 	pte_quicklist = (unsigned long *) pte;
@@ -123,7 +123,7 @@
 extern pgd_t *get_pgd_slow(struct mm_struct *mm);
 extern void free_pgd_slow(pgd_t *pgd);
 
-extern __inline__ pgd_t *pgd_alloc(struct mm_struct *mm)
+static inline pgd_t *pgd_alloc(struct mm_struct *mm)
 {
 	pgd_t *pgd;
 
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/pgtable.h linux/include/asm-arm/pgtable.h
--- v2.4.8/linux/include/asm-arm/pgtable.h	Thu Apr 12 12:20:31 2001
+++ linux/include/asm-arm/pgtable.h	Sun Aug 12 11:14:00 2001
@@ -105,7 +105,7 @@
  * Conversion functions: convert a page and protection to a page entry,
  * and a page entry and page directory to the page they refer to.
  */
-extern __inline__ pte_t mk_pte_phys(unsigned long physpage, pgprot_t pgprot)
+static inline pte_t mk_pte_phys(unsigned long physpage, pgprot_t pgprot)
 {
 	pte_t pte;
 	pte_val(pte) = physpage | pgprot_val(pgprot);
@@ -151,7 +151,7 @@
 
 #include <asm/proc/pgtable.h>
 
-extern __inline__ pte_t pte_modify(pte_t pte, pgprot_t newprot)
+static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
 {
 	pte_val(pte) = (pte_val(pte) & _PAGE_CHG_MASK) | pgprot_val(newprot);
 	return pte;
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/proc-armo/cache.h linux/include/asm-arm/proc-armo/cache.h
--- v2.4.8/linux/include/asm-arm/proc-armo/cache.h	Thu Apr 12 12:20:31 2001
+++ linux/include/asm-arm/proc-armo/cache.h	Sun Aug 12 11:14:00 2001
@@ -45,7 +45,7 @@
 /*
  * The following handle the weird MEMC chip
  */
-extern __inline__ void memc_update_all(void)
+static inline void memc_update_all(void)
 {
 	struct task_struct *p;
 
@@ -66,7 +66,7 @@
 		processor._set_pgd(mm->pgd);
 }
 
-extern __inline__ void
+static inline void
 memc_clear(struct mm_struct *mm, struct page *page)
 {
 	cpu_memc_update_entry(mm->pgd, (unsigned long) page_address(page), 0);
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/proc-armo/pgtable.h linux/include/asm-arm/proc-armo/pgtable.h
--- v2.4.8/linux/include/asm-arm/proc-armo/pgtable.h	Thu Apr 12 12:20:31 2001
+++ linux/include/asm-arm/proc-armo/pgtable.h	Sun Aug 12 11:14:00 2001
@@ -77,17 +77,17 @@
 #define pte_dirty(pte)			(!(pte_val(pte) & _PAGE_CLEAN))
 #define pte_young(pte)			(!(pte_val(pte) & _PAGE_OLD))
 
-extern inline pte_t pte_wrprotect(pte_t pte)    { pte_val(pte) |= _PAGE_READONLY;  return pte; }
-extern inline pte_t pte_rdprotect(pte_t pte)    { pte_val(pte) |= _PAGE_NOT_USER;  return pte; }
-extern inline pte_t pte_exprotect(pte_t pte)    { pte_val(pte) |= _PAGE_NOT_USER;  return pte; }
-extern inline pte_t pte_mkclean(pte_t pte)      { pte_val(pte) |= _PAGE_CLEAN;     return pte; }
-extern inline pte_t pte_mkold(pte_t pte)        { pte_val(pte) |= _PAGE_OLD;       return pte; }
+static inline pte_t pte_wrprotect(pte_t pte)    { pte_val(pte) |= _PAGE_READONLY;  return pte; }
+static inline pte_t pte_rdprotect(pte_t pte)    { pte_val(pte) |= _PAGE_NOT_USER;  return pte; }
+static inline pte_t pte_exprotect(pte_t pte)    { pte_val(pte) |= _PAGE_NOT_USER;  return pte; }
+static inline pte_t pte_mkclean(pte_t pte)      { pte_val(pte) |= _PAGE_CLEAN;     return pte; }
+static inline pte_t pte_mkold(pte_t pte)        { pte_val(pte) |= _PAGE_OLD;       return pte; }
 
-extern inline pte_t pte_mkwrite(pte_t pte)      { pte_val(pte) &= ~_PAGE_READONLY; return pte; }
-extern inline pte_t pte_mkread(pte_t pte)       { pte_val(pte) &= ~_PAGE_NOT_USER; return pte; }
-extern inline pte_t pte_mkexec(pte_t pte)       { pte_val(pte) &= ~_PAGE_NOT_USER; return pte; }
-extern inline pte_t pte_mkdirty(pte_t pte)      { pte_val(pte) &= ~_PAGE_CLEAN;    return pte; }
-extern inline pte_t pte_mkyoung(pte_t pte)      { pte_val(pte) &= ~_PAGE_OLD;      return pte; }
+static inline pte_t pte_mkwrite(pte_t pte)      { pte_val(pte) &= ~_PAGE_READONLY; return pte; }
+static inline pte_t pte_mkread(pte_t pte)       { pte_val(pte) &= ~_PAGE_NOT_USER; return pte; }
+static inline pte_t pte_mkexec(pte_t pte)       { pte_val(pte) &= ~_PAGE_NOT_USER; return pte; }
+static inline pte_t pte_mkdirty(pte_t pte)      { pte_val(pte) &= ~_PAGE_CLEAN;    return pte; }
+static inline pte_t pte_mkyoung(pte_t pte)      { pte_val(pte) &= ~_PAGE_OLD;      return pte; }
 
 #define pte_alloc_kernel        pte_alloc
 
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/proc-armo/system.h linux/include/asm-arm/proc-armo/system.h
--- v2.4.8/linux/include/asm-arm/proc-armo/system.h	Tue Jul  3 17:08:21 2001
+++ linux/include/asm-arm/proc-armo/system.h	Sun Aug 12 11:14:00 2001
@@ -14,7 +14,7 @@
 
 #define vectors_base()	(0)
 
-extern __inline__ unsigned long __xchg(unsigned long x, volatile void *ptr, int size)
+static inline unsigned long __xchg(unsigned long x, volatile void *ptr, int size)
 {
 	extern void __bad_xchg(volatile void *, int);
 
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/proc-armo/uaccess.h linux/include/asm-arm/proc-armo/uaccess.h
--- v2.4.8/linux/include/asm-arm/proc-armo/uaccess.h	Mon Sep 18 15:15:24 2000
+++ linux/include/asm-arm/proc-armo/uaccess.h	Sun Aug 12 11:14:00 2001
@@ -25,7 +25,7 @@
 
 extern uaccess_t uaccess_user, uaccess_kernel;
 
-extern __inline__ void set_fs (mm_segment_t fs)
+static inline void set_fs (mm_segment_t fs)
 {
 	current->addr_limit = fs;
 	current->thread.uaccess = fs == USER_DS ? &uaccess_user : &uaccess_kernel;
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/proc-armv/cache.h linux/include/asm-arm/proc-armv/cache.h
--- v2.4.8/linux/include/asm-arm/proc-armv/cache.h	Thu Apr 12 12:20:31 2001
+++ linux/include/asm-arm/proc-armv/cache.h	Sun Aug 12 17:36:24 2001
@@ -10,6 +10,12 @@
 #include <asm/mman.h>
 
 /*
+ * This flag is used to indicate that the page pointed to by a pte
+ * is dirty and requires cleaning before returning it to the user.
+ */
+#define PG_dcache_dirty PG_arch_1
+
+/*
  * Cache handling for 32-bit ARM processors.
  *
  * Note that on ARM, we have a more accurate specification than that
@@ -54,6 +60,33 @@
 /*
  * This flushes back any buffered write data.  We have to clean the entries
  * in the cache for this page.  This does not invalidate either I or D caches.
+ *
+ * Called from:
+ * 1. mm/filemap.c:filemap_nopage
+ * 2. mm/filemap.c:filemap_nopage
+ *    [via do_no_page - ok]
+ *
+ * 3. mm/memory.c:break_cow
+ *    [copy_cow_page doesn't do anything to the cache; insufficient cache
+ *     handling.  Need to add flush_dcache_page() here]
+ *
+ * 4. mm/memory.c:do_swap_page
+ *    [read_swap_cache_async doesn't do anything to the cache: insufficient
+ *     cache handling.  Need to add flush_dcache_page() here]
+ *
+ * 5. mm/memory.c:do_anonymous_page
+ *    [zero page, never written by kernel - ok]
+ *
+ * 6. mm/memory.c:do_no_page
+ *    [we will be calling update_mmu_cache, which will catch on PG_dcache_dirty]
+ *
+ * 7. mm/shmem.c:shmem_nopage
+ * 8. mm/shmem.c:shmem_nopage
+ *    [via do_no_page - ok]
+ *
+ * 9. fs/exec.c:put_dirty_page
+ *    [we call flush_dcache_page prior to this, which will flush out the
+ *     kernel virtual addresses from the dcache - ok]
  */
 static __inline__ void flush_page_to_ram(struct page *page)
 {
@@ -69,10 +102,28 @@
 #define flush_dcache_range(_s,_e)	cpu_cache_clean_invalidate_range((_s),(_e),0)
 
 /*
- * FIXME: We currently clean the dcache for this page.  Should we
- * also invalidate the Dcache?  And what about the Icache? -- rmk
+ * flush_dcache_page is used when the kernel has written to the page
+ * cache page at virtual address page->virtual.
+ *
+ * If this page isn't mapped (ie, page->mapping = NULL), or it has
+ * userspace mappings (page->mapping->i_mmap or page->mapping->i_mmap_shared)
+ * then we _must_ always clean + invalidate the dcache entries associated
+ * with the kernel mapping.
+ *
+ * Otherwise we can defer the operation, and clean the cache when we are
+ * about to change to user space.  This is the same method as used on SPARC64.
+ * See update_mmu_cache for the user space part.
  */
-#define flush_dcache_page(page)		cpu_dcache_clean_page(page_address(page))
+static inline void flush_dcache_page(struct page *page)
+{
+	if (page->mapping && !(page->mapping->i_mmap) &&
+	     !(page->mapping->i_mmap_shared))
+		set_bit(PG_dcache_dirty, &page->flags);
+	else {
+		unsigned long virt = (unsigned long)page_address(page);
+		cpu_cache_clean_invalidate_range(virt, virt + PAGE_SIZE, 0);
+	}
+}
 
 #define clean_dcache_entry(_s)		cpu_dcache_clean_entry((unsigned long)(_s))
 
@@ -84,11 +135,31 @@
 		cpu_icache_invalidate_range((_s), (_e));		\
 	} while (0)
 
-#define flush_icache_page(vma,pg)					\
-	do {								\
-		if ((vma)->vm_flags & PROT_EXEC)			\
-			cpu_icache_invalidate_page(page_address(pg));	\
-	} while (0)
+/*
+ * This function is misnamed IMHO.  There are three places where it
+ * is called, each of which is preceded immediately by a call to
+ * flush_page_to_ram:
+ *
+ *  1. kernel/ptrace.c:access_one_page
+ *     called after we have written to the kernel view of a user page.
+ *     The user page has been expundged from the cache by flush_cache_page.
+ *     [we don't need to do anything here if we add a call to
+ *      flush_dcache_page]
+ *
+ *  2. mm/memory.c:do_swap_page
+ *     called after we have (possibly) written to the kernel view of a
+ *     user page, which has previously been removed (ie, has been through
+ *     the swap cache).
+ *     [if the flush_page_to_ram() conditions are satisfied, then ok]
+ *
+ *  3. mm/memory.c:do_no_page
+ *     [if the flush_page_to_ram() conditions are satisfied, then ok]
+ *
+ * Invalidating the icache at the kernels virtual page isn't really
+ * going to do us much good, since we wouldn't have executed any
+ * instructions there.
+ */
+#define flush_icache_page(vma,pg)	do { } while (0)
 
 /*
  * Old ARM MEMC stuff.  This supports the reversed mapping handling that
@@ -156,7 +227,8 @@
 	} while (0)
 
 /*
- * 32-bit ARM Processors don't have any MMU cache
+ * if PG_dcache_dirty is set for the page, we need to ensure that any
+ * cache entries for the kernels virtual memory range are written
+ * back to the page.
  */
-#define update_mmu_cache(vma,address,pte) do { } while (0)
-
+extern void update_mmu_cache(struct vm_area_struct *vma, unsigned long addr, pte_t pte);
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/proc-armv/pgtable.h linux/include/asm-arm/proc-armv/pgtable.h
--- v2.4.8/linux/include/asm-arm/proc-armv/pgtable.h	Thu Apr 12 12:20:31 2001
+++ linux/include/asm-arm/proc-armv/pgtable.h	Sun Aug 12 11:14:00 2001
@@ -145,7 +145,7 @@
 #define pte_young(pte)			(pte_val(pte) & L_PTE_YOUNG)
 
 #define PTE_BIT_FUNC(fn,op)			\
-extern inline pte_t pte_##fn(pte_t pte) { pte_val(pte) op; return pte; }
+static inline pte_t pte_##fn(pte_t pte) { pte_val(pte) op; return pte; }
 
 /*PTE_BIT_FUNC(rdprotect, &= ~L_PTE_USER);*/
 /*PTE_BIT_FUNC(mkread,    |= L_PTE_USER);*/
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/proc-armv/system.h linux/include/asm-arm/proc-armv/system.h
--- v2.4.8/linux/include/asm-arm/proc-armv/system.h	Tue Jul  3 17:08:21 2001
+++ linux/include/asm-arm/proc-armv/system.h	Sun Aug 12 11:14:00 2001
@@ -157,7 +157,7 @@
 #define swp_is_buggy
 #endif
 
-extern __inline__ unsigned long __xchg(unsigned long x, volatile void *ptr, int size)
+static inline unsigned long __xchg(unsigned long x, volatile void *ptr, int size)
 {
 	extern void __bad_xchg(volatile void *, int);
 	unsigned long ret;
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/proc-armv/uaccess.h linux/include/asm-arm/proc-armv/uaccess.h
--- v2.4.8/linux/include/asm-arm/proc-armv/uaccess.h	Thu Apr 12 12:20:31 2001
+++ linux/include/asm-arm/proc-armv/uaccess.h	Sun Aug 12 11:14:00 2001
@@ -14,7 +14,7 @@
 #define KERNEL_DS	0x00000000
 #define USER_DS		PAGE_OFFSET
 
-extern __inline__ void set_fs (mm_segment_t fs)
+static inline void set_fs (mm_segment_t fs)
 {
 	current->addr_limit = fs;
 
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/processor.h linux/include/asm-arm/processor.h
--- v2.4.8/linux/include/asm-arm/processor.h	Thu Apr 12 12:20:31 2001
+++ linux/include/asm-arm/processor.h	Sun Aug 12 11:14:00 2001
@@ -83,22 +83,14 @@
 /*
  * Return saved PC of a blocked thread.
  */
-extern __inline__ unsigned long thread_saved_pc(struct thread_struct *t)
+static inline unsigned long thread_saved_pc(struct thread_struct *t)
 {
 	return t->save ? pc_pointer(t->save->pc) : 0;
 }
 
-extern __inline__ unsigned long get_css_fp(struct thread_struct *t)
+static inline unsigned long get_css_fp(struct thread_struct *t)
 {
 	return t->save ? t->save->fp : 0;
-}
-
-asmlinkage void ret_from_sys_call(void) __asm__("ret_from_sys_call");
-
-extern __inline__ void init_thread_css(struct context_save_struct *save)
-{
-	*save = INIT_CSS;
-	save->pc |= (unsigned long)ret_from_sys_call;
 }
 
 /* Forward declaration, a strange C thing */
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/semaphore.h linux/include/asm-arm/semaphore.h
--- v2.4.8/linux/include/asm-arm/semaphore.h	Tue Apr 17 17:19:30 2001
+++ linux/include/asm-arm/semaphore.h	Sun Aug 12 11:14:00 2001
@@ -42,7 +42,7 @@
 #define DECLARE_MUTEX(name)		__DECLARE_SEMAPHORE_GENERIC(name,1)
 #define DECLARE_MUTEX_LOCKED(name)	__DECLARE_SEMAPHORE_GENERIC(name,0)
 
-extern inline void sema_init(struct semaphore *sem, int val)
+static inline void sema_init(struct semaphore *sem, int val)
 {
 	atomic_set(&sem->count, val);
 	sem->sleepers = 0;
@@ -79,7 +79,7 @@
  * This is ugly, but we want the default case to fall through.
  * "__down" is the actual routine that waits...
  */
-extern inline void down(struct semaphore * sem)
+static inline void down(struct semaphore * sem)
 {
 #if WAITQUEUE_DEBUG
 	CHECK_MAGIC(sem->__magic);
@@ -92,7 +92,7 @@
  * This is ugly, but we want the default case to fall through.
  * "__down_interruptible" is the actual routine that waits...
  */
-extern inline int down_interruptible (struct semaphore * sem)
+static inline int down_interruptible (struct semaphore * sem)
 {
 #if WAITQUEUE_DEBUG
 	CHECK_MAGIC(sem->__magic);
@@ -101,7 +101,7 @@
 	return __down_op_ret(sem, __down_interruptible_failed);
 }
 
-extern inline int down_trylock(struct semaphore *sem)
+static inline int down_trylock(struct semaphore *sem)
 {
 #if WAITQUEUE_DEBUG
 	CHECK_MAGIC(sem->__magic);
@@ -116,7 +116,7 @@
  * The default case (no contention) will result in NO
  * jumps for both down() and up().
  */
-extern inline void up(struct semaphore * sem)
+static inline void up(struct semaphore * sem)
 {
 #if WAITQUEUE_DEBUG
 	CHECK_MAGIC(sem->__magic);
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/setup.h linux/include/asm-arm/setup.h
--- v2.4.8/linux/include/asm-arm/setup.h	Thu Apr 12 12:20:31 2001
+++ linux/include/asm-arm/setup.h	Sun Aug 12 11:14:00 2001
@@ -10,6 +10,13 @@
  *  Structure passed to kernel to tell it about the
  *  hardware it's running on.  See linux/Documentation/arm/Setup
  *  for more info.
+ *
+ * NOTE:
+ *  This file contains two ways to pass information from the boot
+ *  loader to the kernel. The old struct param_struct is deprecated,
+ *  but it will be kept in the kernel for 5 years from now
+ *  (2001). This will allow boot loaders to convert to the new struct
+ *  tag way.
  */
 #ifndef __ASMARM_SETUP_H
 #define __ASMARM_SETUP_H
@@ -25,6 +32,7 @@
  */
 #define COMMAND_LINE_SIZE 1024
 
+/* This is the old deprecated way to pass parameters to the kernel */
 struct param_struct {
     union {
 	struct {
@@ -53,7 +61,7 @@
 	    unsigned long system_rev;		/* 76 */
 	    unsigned long system_serial_low;	/* 80 */
 	    unsigned long system_serial_high;	/* 84 */
-	    unsigned long mem_fclk_21285;       /* 88 */ 
+	    unsigned long mem_fclk_21285;       /* 88 */
 	} s;
 	char unused[256];
     } u1;
@@ -67,9 +75,13 @@
     char commandline[COMMAND_LINE_SIZE];
 };
 
+
+
 /*
- * New idea - a list of tagged entries
+ * The new way of passing information: a list of tagged entries
  */
+
+/* The list ends with an ATAG_NONE node. */
 #define ATAG_NONE	0x00000000
 
 struct tag_header {
@@ -77,6 +89,7 @@
 	u32 tag;
 };
 
+/* The list must start with an ATAG_CORE node */
 #define ATAG_CORE	0x54410001
 
 struct tag_core {
@@ -85,13 +98,15 @@
 	u32 rootdev;
 };
 
+/* it is allowed to have multiple ATAG_MEM nodes */
 #define ATAG_MEM		0x54410002
 
 struct tag_mem32 {
 	u32	size;
-	u32	start;
+	u32	start;	/* physical start address */
 };
 
+/* VGA text type displays */
 #define ATAG_VIDEOTEXT	0x54410003
 
 struct tag_videotext {
@@ -106,21 +121,24 @@
 	u16		video_points;
 };
 
+/* describes how the ramdisk will be used in kernel */
 #define ATAG_RAMDISK	0x54410004
 
 struct tag_ramdisk {
-	u32 flags;		/* b0 = load, b1 = prompt */
-	u32 size;
-	u32 start;
+	u32 flags;	/* bit 0 = load, bit 1 = prompt */
+	u32 size;	/* decompressed ramdisk size */
+	u32 start;	/* starting block of floppy-based RAM disk image */
 };
 
+/* describes where the compressed ramdisk image lives */
 #define ATAG_INITRD	0x54410005
 
 struct tag_initrd {
-	u32 start;
-	u32 size;
+	u32 start;	/* physical start address */
+	u32 size;	/* size of compressed ramdisk image */
 };
 
+/* board serial number. "64 bits should be enough for everybody" */
 #define ATAG_SERIAL	0x54410006
 
 struct tag_serialnr {
@@ -128,12 +146,16 @@
 	u32 high;
 };
 
+/* board revision */
 #define ATAG_REVISION	0x54410007
 
 struct tag_revision {
 	u32 rev;
 };
 
+/* initial values for vesafb-type framebuffers. see struct screen_info
+ * in include/linux/tty.h
+ */
 #define ATAG_VIDEOLFB	0x54410008
 
 struct tag_videolfb {
@@ -153,12 +175,14 @@
 	u8		rsvd_pos;
 };
 
+/* command line: \0 terminated string */
 #define ATAG_CMDLINE	0x54410009
 
 struct tag_cmdline {
-	char	cmdline[1];
+	char	cmdline[1];	/* this is the minimum size */
 };
 
+/* acorn RiscPC specific information */
 #define ATAG_ACORN	0x41000101
 
 struct tag_acorn {
@@ -168,6 +192,7 @@
 	u8 adfsdrives;
 };
 
+/* footbridge memory clock, see arch/arm/mach-footbridge/arch.c */
 #define ATAG_MEMCLK	0x41000402
 
 struct tag_memclk {
@@ -203,6 +228,20 @@
 	u32 tag;
 	int (*parse)(const struct tag *);
 };
+
+#define __tag __attribute__((unused, __section__(".taglist")))
+#define __tagtable(tag, fn) \
+static struct tagtable __tagtable_##fn __tag = { tag, fn }
+
+#define tag_member_present(tag,member)				\
+	((unsigned long)(&((struct tag *)0L)->member + 1)	\
+		<= (tag)->hdr.size * 4)
+
+#define tag_next(t)	((struct tag *)((u32 *)(t) + (t)->hdr.size))
+#define tag_size(type)	((sizeof(struct tag_header) + sizeof(struct type)) >> 2)
+
+#define for_each_tag(t,base)		\
+	for (t = base; t->hdr.size; t = tag_next(t))
 
 /*
  * Memory map description
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/siginfo.h linux/include/asm-arm/siginfo.h
--- v2.4.8/linux/include/asm-arm/siginfo.h	Wed May 24 18:38:26 2000
+++ linux/include/asm-arm/siginfo.h	Sun Aug 12 11:14:00 2001
@@ -216,7 +216,7 @@
 #ifdef __KERNEL__
 #include <linux/string.h>
 
-extern inline void copy_siginfo(siginfo_t *to, siginfo_t *from)
+static inline void copy_siginfo(siginfo_t *to, siginfo_t *from)
 {
 	if (from->si_code < 0)
 		memcpy(to, from, sizeof(siginfo_t));
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/smplock.h linux/include/asm-arm/smplock.h
--- v2.4.8/linux/include/asm-arm/smplock.h	Thu Mar 23 12:50:09 2000
+++ linux/include/asm-arm/smplock.h	Sun Aug 12 11:14:00 2001
@@ -38,13 +38,13 @@
  * so we only need to worry about other
  * CPU's.
  */
-extern __inline__ void lock_kernel(void)
+static inline void lock_kernel(void)
 {
 	if (!++current->lock_depth)
 		spin_lock(&kernel_flag);
 }
 
-extern __inline__ void unlock_kernel(void)
+static inline void unlock_kernel(void)
 {
 	if (--current->lock_depth < 0)
 		spin_unlock(&kernel_flag);
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/softirq.h linux/include/asm-arm/softirq.h
--- v2.4.8/linux/include/asm-arm/softirq.h	Wed Jul 25 17:10:25 2001
+++ linux/include/asm-arm/softirq.h	Sun Aug 12 11:14:00 2001
@@ -11,7 +11,6 @@
 
 #define local_bh_disable()	cpu_bh_disable(smp_processor_id())
 #define __local_bh_enable()	__cpu_bh_enable(smp_processor_id())
-#define __cpu_raise_softirq(cpu,nr) set_bit((nr), &softirq_pending(cpu))
 
 #define in_softirq()		(local_bh_count(smp_processor_id()) != 0)
 
@@ -21,5 +20,7 @@
 	if (!--*ptr && ptr[-2])						\
 		__asm__("bl%? __do_softirq": : : "lr");/* out of line */\
 } while (0)
+
+#define __cpu_raise_softirq(cpu, nr) __set_bit(nr, &softirq_pending(cpu))
 
 #endif	/* __ASM_SOFTIRQ_H */
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/uaccess.h linux/include/asm-arm/uaccess.h
--- v2.4.8/linux/include/asm-arm/uaccess.h	Wed May 16 15:25:16 2001
+++ linux/include/asm-arm/uaccess.h	Sun Aug 12 11:14:00 2001
@@ -39,7 +39,7 @@
 
 #define access_ok(type,addr,size)	(__range_ok(addr,size) == 0)
 
-extern __inline__ int verify_area(int type, const void * addr, unsigned long size)
+static inline int verify_area(int type, const void * addr, unsigned long size)
 {
 	return access_ok(type, addr, size) ? 0 : -EFAULT;
 }
@@ -129,7 +129,7 @@
 
 #define strlen_user(s)	strnlen_user(s, ~0UL >> 1)
 
-extern __inline__ long strnlen_user(const char *s, long n)
+static inline long strnlen_user(const char *s, long n)
 {
 	unsigned long res = 0;
 
diff -u --recursive --new-file v2.4.8/linux/include/asm-arm/unistd.h linux/include/asm-arm/unistd.h
--- v2.4.8/linux/include/asm-arm/unistd.h	Thu Apr 12 12:20:31 2001
+++ linux/include/asm-arm/unistd.h	Sun Aug 12 11:14:00 2001
@@ -1,3 +1,15 @@
+/*
+ *  linux/include/asm-arm/unistd.h
+ *
+ *  Copyright (C) 2001 Russell King
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Please forward _all_ changes to this file to rmk@arm.linux.org.uk,
+ * no matter what the change is.  Thanks!
+ */
 #ifndef __ASM_ARM_UNISTD_H
 #define __ASM_ARM_UNISTD_H
 
@@ -82,7 +94,7 @@
 #define __NR_sigpending			(__NR_SYSCALL_BASE+ 73)
 #define __NR_sethostname		(__NR_SYSCALL_BASE+ 74)
 #define __NR_setrlimit			(__NR_SYSCALL_BASE+ 75)
-#define __NR_old_getrlimit		(__NR_SYSCALL_BASE+ 76)	/* Back compat 2GB limited rlimit */
+#define __NR_getrlimit			(__NR_SYSCALL_BASE+ 76)	/* Back compat 2GB limited rlimit */
 #define __NR_getrusage			(__NR_SYSCALL_BASE+ 77)
 #define __NR_gettimeofday		(__NR_SYSCALL_BASE+ 78)
 #define __NR_settimeofday		(__NR_SYSCALL_BASE+ 79)
@@ -197,7 +209,7 @@
 					/* 188 reserved */
 					/* 189 reserved */
 #define __NR_vfork			(__NR_SYSCALL_BASE+190)
-#define __NR_getrlimit			(__NR_SYSCALL_BASE+191)	/* SuS compliant getrlimit */
+#define __NR_ugetrlimit			(__NR_SYSCALL_BASE+191)	/* SuS compliant getrlimit */
 #define __NR_mmap2			(__NR_SYSCALL_BASE+192)
 #define __NR_truncate64			(__NR_SYSCALL_BASE+193)
 #define __NR_ftruncate64		(__NR_SYSCALL_BASE+194)
@@ -228,6 +240,15 @@
 #define __NR_mincore			(__NR_SYSCALL_BASE+219)
 #define __NR_madvise			(__NR_SYSCALL_BASE+220)
 #define __NR_fcntl64			(__NR_SYSCALL_BASE+221)
+
+/*
+ * The following SWIs are ARM private.
+ */
+#define __ARM_NR_BASE			(__NR_SYSCALL_BASE+0x0f0000)
+#define __ARM_NR_breakpoint		(__ARM_NR_BASE+1)
+#define __ARM_NR_cacheflush		(__ARM_NR_BASE+2)
+#define __ARM_NR_usr26			(__ARM_NR_BASE+3)
+#define __ARM_NR_usr32			(__ARM_NR_BASE+4)
 
 #define __sys2(x) #x
 #define __sys1(x) __sys2(x)
diff -u --recursive --new-file v2.4.8/linux/include/asm-i386/apicdef.h linux/include/asm-i386/apicdef.h
--- v2.4.8/linux/include/asm-i386/apicdef.h	Fri Aug 18 09:30:51 2000
+++ linux/include/asm-i386/apicdef.h	Sun Aug 12 11:13:59 2001
@@ -33,6 +33,8 @@
 #define			APIC_ALL_CPUS		0xFF
 #define		APIC_DFR	0xE0
 #define		APIC_SPIV	0xF0
+#define			APIC_SPIV_FOCUS_DISABLED	(1<<9)
+#define			APIC_SPIV_APIC_ENABLED		(1<<8)
 #define		APIC_ISR	0x100
 #define		APIC_TMR	0x180
 #define 	APIC_IRR	0x200
diff -u --recursive --new-file v2.4.8/linux/include/asm-i386/io.h linux/include/asm-i386/io.h
--- v2.4.8/linux/include/asm-i386/io.h	Sun Aug 12 13:28:00 2001
+++ linux/include/asm-i386/io.h	Sun Aug 12 19:01:43 2001
@@ -135,6 +135,11 @@
 	return __va(address);
 }
 
+/*
+ * Change "struct page" to physical address.
+ */
+#define page_to_phys(page)	((page - mem_map) << PAGE_SHIFT)
+
 extern void * __ioremap(unsigned long offset, unsigned long size, unsigned long flags);
 
 static inline void * ioremap (unsigned long offset, unsigned long size)
@@ -159,6 +164,7 @@
  */
 #define virt_to_bus virt_to_phys
 #define bus_to_virt phys_to_virt
+#define page_to_bus page_to_phys
 
 /*
  * readX/writeX() are used to access memory mapped devices. On some
diff -u --recursive --new-file v2.4.8/linux/include/asm-i386/keyboard.h linux/include/asm-i386/keyboard.h
--- v2.4.8/linux/include/asm-i386/keyboard.h	Tue Aug  7 12:51:54 2001
+++ linux/include/asm-i386/keyboard.h	Sun Aug 12 19:03:20 2001
@@ -15,6 +15,7 @@
 
 #include <linux/kernel.h>
 #include <linux/ioport.h>
+#include <linux/kd.h>
 #include <asm/io.h>
 
 #define KEYBOARD_IRQ			1
@@ -26,7 +27,9 @@
 			   char raw_mode);
 extern char pckbd_unexpected_up(unsigned char keycode);
 extern void pckbd_leds(unsigned char leds);
+extern int pckbd_rate(struct kbd_repeat *rep);
 extern void pckbd_init_hw(void);
+extern void pckbd_pm_resume(void);
 extern unsigned char pckbd_sysrq_xlate[128];
 
 #define kbd_setkeycode		pckbd_setkeycode
@@ -34,6 +37,7 @@
 #define kbd_translate		pckbd_translate
 #define kbd_unexpected_up	pckbd_unexpected_up
 #define kbd_leds		pckbd_leds
+#define kbd_rate		pckbd_rate
 #define kbd_init_hw		pckbd_init_hw
 #define kbd_sysrq_xlate		pckbd_sysrq_xlate
 
diff -u --recursive --new-file v2.4.8/linux/include/asm-i386/page.h linux/include/asm-i386/page.h
--- v2.4.8/linux/include/asm-i386/page.h	Sun Aug 12 13:28:00 2001
+++ linux/include/asm-i386/page.h	Sun Aug 12 19:01:26 2001
@@ -117,7 +117,6 @@
 #define virt_to_page(kaddr)	(mem_map + (__pa(kaddr) >> PAGE_SHIFT))
 #define VALID_PAGE(page)	((page - mem_map) < max_mapnr)
 
-
 #endif /* __KERNEL__ */
 
 #endif /* _I386_PAGE_H */
diff -u --recursive --new-file v2.4.8/linux/include/asm-m68k/keyboard.h linux/include/asm-m68k/keyboard.h
--- v2.4.8/linux/include/asm-m68k/keyboard.h	Tue Dec  5 12:43:48 2000
+++ linux/include/asm-m68k/keyboard.h	Sun Aug 12 11:13:59 2001
@@ -14,6 +14,7 @@
 #ifdef __KERNEL__
 
 #include <linux/config.h>
+#include <linux/kd.h>
 #include <asm/machdep.h>
 
 #ifdef CONFIG_Q40
@@ -56,6 +57,7 @@
 
 #define kbd_init_hw		mach_keyb_init
 #define kbd_translate		mach_kbd_translate
+#define kbd_rate		mach_kbdrate
 
 #define kbd_sysrq_xlate		mach_sysrq_xlate
 
diff -u --recursive --new-file v2.4.8/linux/include/asm-ppc/init.h linux/include/asm-ppc/init.h
--- v2.4.8/linux/include/asm-ppc/init.h	Mon May 21 15:02:06 2001
+++ linux/include/asm-ppc/init.h	Sun Aug 12 12:43:26 2001
@@ -1,5 +1,5 @@
 /*
- * BK Id: SCCS/s.init.h 1.5 05/17/01 18:14:24 cort
+ * BK Id: SCCS/s.init.h 1.8 07/06/01 09:19:30 trini
  */
 #ifdef __KERNEL__
 #ifndef _PPC_INIT_H
@@ -24,12 +24,6 @@
 #define __chrpfunc(__argchrp) \
 	__argchrp __chrp; \
 	__argchrp
-
-#define __apus __attribute__ ((__section__ (".text.apus")))
-#define __apusdata __attribute__ ((__section__ (".data.apus")))
-#define __apusfunc(__argapus) \
-	__argapus __apus; \
-	__argapus
 
 /* this is actually just common chrp/pmac code, not OF code -- Cort */
 #define __openfirmware __attribute__ ((__section__ (".text.openfirmware")))
diff -u --recursive --new-file v2.4.8/linux/include/asm-ppc/prom.h linux/include/asm-ppc/prom.h
--- v2.4.8/linux/include/asm-ppc/prom.h	Tue Jul  3 17:08:21 2001
+++ linux/include/asm-ppc/prom.h	Sun Aug 12 12:43:26 2001
@@ -1,5 +1,5 @@
 /*
- * BK Id: SCCS/s.prom.h 1.14 06/13/01 15:28:43 paulus
+ * BK Id: SCCS/s.prom.h 1.16 07/25/01 14:11:37 trini
  */
 /*
  * Definitions for talking to the Open Firmware PROM on
@@ -79,7 +79,6 @@
 extern struct device_node *find_path_device(const char *path);
 extern struct device_node *find_compatible_devices(const char *type,
 						   const char *compat);
-extern struct device_node *find_phandle(phandle);
 extern struct device_node *find_all_nodes(void);
 extern int device_is_compatible(struct device_node *device, const char *);
 extern int machine_is_compatible(const char *compat);
diff -u --recursive --new-file v2.4.8/linux/include/asm-ppc/types.h linux/include/asm-ppc/types.h
--- v2.4.8/linux/include/asm-ppc/types.h	Mon May 21 15:02:06 2001
+++ linux/include/asm-ppc/types.h	Sun Aug 12 12:43:26 2001
@@ -1,5 +1,5 @@
 /*
- * BK Id: SCCS/s.types.h 1.5 05/17/01 18:14:26 cort
+ * BK Id: SCCS/s.types.h 1.8 07/07/01 13:37:26 paulus
  */
 #ifndef _PPC_TYPES_H
 #define _PPC_TYPES_H
@@ -47,9 +47,14 @@
 /* DMA addresses are 32-bits wide */
 typedef u32 dma_addr_t;
 
+#endif /* __KERNEL__ */
+
+/*
+ * XXX allowed outside of __KERNEL__ for now, until glibc gets
+ * a proper set of asm headers of its own.  -- paulus
+ */
 typedef unsigned short umode_t;
 
-#endif /* __KERNEL__ */
 #endif /* __ASSEMBLY__ */
 
 #endif
diff -u --recursive --new-file v2.4.8/linux/include/asm-s390/softirq.h linux/include/asm-s390/softirq.h
--- v2.4.8/linux/include/asm-s390/softirq.h	Sun Aug 12 13:28:00 2001
+++ linux/include/asm-s390/softirq.h	Sun Aug 12 11:13:59 2001
@@ -17,30 +17,26 @@
 #include <asm/hardirq.h>
 #include <asm/lowcore.h>
 
-#define local_bh_disable()			\
-do {						\
-	local_bh_count(smp_processor_id())++;	\
-	barrier();				\
-} while (0)
+#define __cpu_bh_enable(cpu) \
+		do { barrier(); local_bh_count(cpu)--; } while (0)
+#define cpu_bh_disable(cpu) \
+		do { local_bh_count(cpu)++; barrier(); } while (0)
 
-#define __local_bh_enable()			\
-do {						\
-	barrier();				\
-	local_bh_count(smp_processor_id())--;	\
-} while (0)
+#define local_bh_disable()      cpu_bh_disable(smp_processor_id())
+#define __local_bh_enable()     __cpu_bh_enable(smp_processor_id())
+
+#define in_softirq() (local_bh_count(smp_processor_id()) != 0)
 
-#define local_bh_enable()				\
-do {							\
-	if (!--local_bh_count(smp_processor_id())	\
-	    && softirq_pending(smp_processor_id())) {	\
-		do_softirq();				\
-		__sti();				\
-	}						\
+#define local_bh_enable()			          	        \
+do {							                \
+	unsigned int *ptr = &local_bh_count(smp_processor_id());        \
+	barrier();                                                      \
+	if (!--*ptr)							\
+		if (softirq_pending(smp_processor_id()))		\
+			do_softirq();					\
 } while (0)
 
 #define __cpu_raise_softirq(cpu, nr) (softirq_pending(cpu) |= (1<<nr))
-
-#define in_softirq() (local_bh_count(smp_processor_id()) != 0)
 
 #endif	/* __ASM_SOFTIRQ_H */
 
diff -u --recursive --new-file v2.4.8/linux/include/asm-s390x/softirq.h linux/include/asm-s390x/softirq.h
--- v2.4.8/linux/include/asm-s390x/softirq.h	Sun Aug 12 13:28:01 2001
+++ linux/include/asm-s390x/softirq.h	Sun Aug 12 11:13:59 2001
@@ -17,30 +17,26 @@
 #include <asm/hardirq.h>
 #include <asm/lowcore.h>
 
-#define local_bh_disable()			\
-do {						\
-	local_bh_count(smp_processor_id())++;	\
-	barrier();				\
-} while (0)
+#define __cpu_bh_enable(cpu) \
+		do { barrier(); local_bh_count(cpu)--; } while (0)
+#define cpu_bh_disable(cpu) \
+		do { local_bh_count(cpu)++; barrier(); } while (0)
 
-#define __local_bh_enable()			\
-do {						\
-	barrier();				\
-	local_bh_count(smp_processor_id())--;	\
-} while (0)
+#define local_bh_disable()      cpu_bh_disable(smp_processor_id())
+#define __local_bh_enable()     __cpu_bh_enable(smp_processor_id())
+
+#define in_softirq() (local_bh_count(smp_processor_id()) != 0)
 
-#define local_bh_enable()				\
-do {							\
-	if (!--local_bh_count(smp_processor_id())	\
-	    && softirq_pending(smp_processor_id())) {	\
-		do_softirq();				\
-		__sti();				\
-	}						\
+#define local_bh_enable()			          	        \
+do {							                \
+	unsigned int *ptr = &local_bh_count(smp_processor_id());        \
+	barrier();                                                      \
+	if (!--*ptr)							\
+		if (softirq_pending(smp_processor_id()))		\
+			do_softirq();					\
 } while (0)
 
 #define __cpu_raise_softirq(cpu, nr) (softirq_pending(cpu) |= (1<<nr))
-
-#define in_softirq() (local_bh_count(smp_processor_id()) != 0)
 
 #endif	/* __ASM_SOFTIRQ_H */
 
diff -u --recursive --new-file v2.4.8/linux/include/asm-sparc64/mmu_context.h linux/include/asm-sparc64/mmu_context.h
--- v2.4.8/linux/include/asm-sparc64/mmu_context.h	Sun Aug 12 13:28:01 2001
+++ linux/include/asm-sparc64/mmu_context.h	Sun Aug 12 11:23:32 2001
@@ -1,4 +1,4 @@
-/* $Id: mmu_context.h,v 1.48 2001/08/03 06:18:52 davem Exp $ */
+/* $Id: mmu_context.h,v 1.49 2001/08/09 21:10:20 davem Exp $ */
 #ifndef __SPARC64_MMU_CONTEXT_H
 #define __SPARC64_MMU_CONTEXT_H
 
@@ -23,7 +23,6 @@
 #define CTX_FIRST_VERSION	((1UL << CTX_VERSION_SHIFT) + 1UL)
 #define CTX_VALID(__ctx)	\
 	 (!(((__ctx) ^ tlb_context_cache) & CTX_VERSION_MASK))
-#define CTX_NEVER_WAS_VALID(__ctx) ((__ctx) == 0UL)
 #define CTX_HWBITS(__ctx)	((__ctx) & ~CTX_VERSION_MASK)
 
 extern void get_new_mmu_context(struct mm_struct *mm);
diff -u --recursive --new-file v2.4.8/linux/include/linux/ac97_codec.h linux/include/linux/ac97_codec.h
--- v2.4.8/linux/include/linux/ac97_codec.h	Tue Aug  7 12:51:20 2001
+++ linux/include/linux/ac97_codec.h	Sun Aug 12 19:04:26 2001
@@ -152,8 +152,7 @@
 	int dev_mixer; 
 	int type;
 
-	/* codec specific init/reset routines, used mainly for 4 or 6 channel support */
-	int  (*codec_init)  (struct ac97_codec *codec);
+	struct ac97_ops *codec_ops;
 
 	/* controller specific lower leverl ac97 accessing routines */
 	u16  (*codec_read)  (struct ac97_codec *codec, u8 reg);
@@ -182,6 +181,20 @@
 
 	/* Software Modem interface */
 	int  (*modem_ioctl)(struct ac97_codec *codec, unsigned int cmd, unsigned long arg);
+};
+
+/*
+ *	Operation structures for each known AC97 chip
+ */
+ 
+struct ac97_ops
+{
+	/* Initialise */
+	int (*init)(struct ac97_codec *c);
+	/* Amplifier control */
+	int (*amplifier)(struct ac97_codec *codec, int on);
+	/* Digital mode control */
+	int (*digital)(struct ac97_codec *codec, int format);
 };
 
 extern int ac97_read_proc (char *page_out, char **start, off_t off,
diff -u --recursive --new-file v2.4.8/linux/include/linux/fs.h linux/include/linux/fs.h
--- v2.4.8/linux/include/linux/fs.h	Sun Aug 12 13:28:01 2001
+++ linux/include/linux/fs.h	Sun Aug 12 19:01:27 2001
@@ -763,7 +763,7 @@
  * This allows the kernel to read directories into kernel space or
  * to have different dirent layouts depending on the binary type.
  */
-typedef int (*filldir_t)(void *, const char *, int, off_t, ino_t, unsigned);
+typedef int (*filldir_t)(void *, const char *, int, loff_t, ino_t, unsigned);
 
 struct block_device_operations {
 	int (*open) (struct inode *, struct file *);
@@ -1344,6 +1344,7 @@
 extern ssize_t generic_file_read(struct file *, char *, size_t, loff_t *);
 extern ssize_t generic_file_write(struct file *, const char *, size_t, loff_t *);
 extern void do_generic_file_read(struct file *, loff_t *, read_descriptor_t *, read_actor_t);
+extern loff_t no_llseek(struct file *file, loff_t offset, int origin);
 extern loff_t generic_file_llseek(struct file *file, loff_t offset, int origin);
 extern ssize_t generic_read_dir(struct file *, char *, size_t, loff_t *);
 
diff -u --recursive --new-file v2.4.8/linux/include/linux/i2o.h linux/include/linux/i2o.h
--- v2.4.8/linux/include/linux/i2o.h	Sun Aug 12 13:28:01 2001
+++ linux/include/linux/i2o.h	Sun Aug 12 11:13:59 2001
@@ -78,6 +78,7 @@
  */	 	
 struct i2o_pci
 {
+	struct pci_dev *pdev;	/* PCI device */
 	int irq;
 	int queue_buggy:1;	/* Don't send a lot of messages */
 	int short_req:1;	/* Use small block sizes	*/
@@ -126,6 +127,11 @@
 	u32 mem_phys;				/* MFA physical */
 	
 	int battery:1;				/* Has a battery backup */
+	int io_alloc:1;				/* An I/O resource was allocated */
+	int mem_alloc:1;			/* A memory resource was allocated */
+	
+	struct resource io_resource;		/* I/O resource allocated to the IOP */
+	struct resource mem_resource;		/* Mem resource allocated to the IOP */
 
 	struct proc_dir_entry* proc_entry;	/* /proc dir */
 
diff -u --recursive --new-file v2.4.8/linux/include/linux/iso_fs_sb.h linux/include/linux/iso_fs_sb.h
--- v2.4.8/linux/include/linux/iso_fs_sb.h	Wed Aug 26 09:54:41 1998
+++ linux/include/linux/iso_fs_sb.h	Sun Aug 12 10:56:56 2001
@@ -13,6 +13,7 @@
 	
 	unsigned char s_high_sierra; /* A simple flag */
 	unsigned char s_mapping;
+	int           s_rock_offset; /* offset of SUSP fields within SU area */
 	unsigned char s_rock;
 	unsigned char s_joliet_level;
 	unsigned char s_utf8;
diff -u --recursive --new-file v2.4.8/linux/include/linux/jffs.h linux/include/linux/jffs.h
--- v2.4.8/linux/include/linux/jffs.h	Wed Aug  9 14:06:12 2000
+++ linux/include/linux/jffs.h	Sun Aug 12 10:52:29 2001
@@ -22,6 +22,8 @@
 
 #define JFFS_VERSION_STRING "1.0"
 
+#include <linux/completion.h>
+
 /* This is a magic number that is used as an identification number for
    this file system.  It is written to the super_block structure.  */
 #define JFFS_MAGIC_SB_BITMASK 0x07c0  /* 1984 */
@@ -185,7 +187,7 @@
 	struct jffs_delete_list *delete_list; /* Track deleted files.  */
 	pid_t thread_pid;		/* GC thread's PID */
 	struct task_struct *gc_task;	/* GC task struct */
-	struct semaphore gc_thread_sem; /* GC thread exit mutex */
+	struct completion gc_thread_comp; /* GC thread exit mutex */
 	__u32 gc_minfree_threshold;	/* GC trigger thresholds */
 	__u32 gc_maxdirty_threshold;
 };
diff -u --recursive --new-file v2.4.8/linux/include/linux/kernel.h linux/include/linux/kernel.h
--- v2.4.8/linux/include/linux/kernel.h	Tue Jul  3 17:08:22 2001
+++ linux/include/linux/kernel.h	Sun Aug 12 10:52:29 2001
@@ -45,14 +45,14 @@
 #define FASTCALL(x)	x
 #endif
 
-struct semaphore;
+struct completion;
 
 extern struct notifier_block *panic_notifier_list;
 NORET_TYPE void panic(const char * fmt, ...)
 	__attribute__ ((NORET_AND format (printf, 1, 2)));
 NORET_TYPE void do_exit(long error_code)
 	ATTRIB_NORET;
-NORET_TYPE void up_and_exit(struct semaphore *, long)
+NORET_TYPE void complete_and_exit(struct completion *, long)
 	ATTRIB_NORET;
 extern int abs(int);
 extern unsigned long simple_strtoul(const char *,char **,unsigned int);
diff -u --recursive --new-file v2.4.8/linux/include/linux/major.h linux/include/linux/major.h
--- v2.4.8/linux/include/linux/major.h	Thu Apr 12 12:20:31 2001
+++ linux/include/linux/major.h	Sun Aug 12 11:13:59 2001
@@ -176,4 +176,18 @@
 	return SCSI_BLK_MAJOR(m);
 }
 
+/*
+ * Tests for IDE devices
+ */
+#define IDE_DISK_MAJOR(M)	((M) == IDE0_MAJOR || (M) == IDE1_MAJOR || \
+				(M) == IDE2_MAJOR || (M) == IDE3_MAJOR || \
+				(M) == IDE4_MAJOR || (M) == IDE5_MAJOR || \
+				(M) == IDE6_MAJOR || (M) == IDE7_MAJOR || \
+				(M) == IDE8_MAJOR || (M) == IDE9_MAJOR)
+
+static __inline__ int ide_blk_major(int m)
+{
+	return IDE_DISK_MAJOR(m);
+}
+
 #endif
diff -u --recursive --new-file v2.4.8/linux/include/linux/netdevice.h linux/include/linux/netdevice.h
--- v2.4.8/linux/include/linux/netdevice.h	Sun Aug 12 13:28:01 2001
+++ linux/include/linux/netdevice.h	Sun Aug 12 19:01:52 2001
@@ -344,7 +344,7 @@
 #define NETIF_F_HW_CSUM		8	/* Can checksum all the packets. */
 #define NETIF_F_DYNALLOC	16	/* Self-dectructable device. */
 #define NETIF_F_HIGHDMA		32	/* Can DMA to high memory. */
-#define NETIF_F_FRAGLIST	1	/* Scatter/gather IO. */
+#define NETIF_F_FRAGLIST	64	/* Scatter/gather IO. */
 
 	/* Called after device is detached from network. */
 	void			(*uninit)(struct net_device *dev);
diff -u --recursive --new-file v2.4.8/linux/include/linux/pci_ids.h linux/include/linux/pci_ids.h
--- v2.4.8/linux/include/linux/pci_ids.h	Sun Aug 12 13:28:01 2001
+++ linux/include/linux/pci_ids.h	Sun Aug 12 11:13:59 2001
@@ -348,6 +348,8 @@
 #define PCI_DEVICE_ID_AMD_SCSI		0x2020
 #define PCI_DEVICE_ID_AMD_FE_GATE_7006	0x7006
 #define PCI_DEVICE_ID_AMD_FE_GATE_7007	0x7007
+#define PCI_DEVICE_ID_AMD_FE_GATE_700C	0x700C
+#define PCI_DEVIDE_ID_AMD_FE_GATE_700D	0x700D
 #define PCI_DEVICE_ID_AMD_FE_GATE_700E	0x700E
 #define PCI_DEVICE_ID_AMD_FE_GATE_700F	0x700F
 #define PCI_DEVICE_ID_AMD_COBRA_7400	0x7400
@@ -572,6 +574,7 @@
 #define PCI_DEVICE_ID_PROMISE_20246	0x4d33
 #define PCI_DEVICE_ID_PROMISE_20262	0x4d38
 #define PCI_DEVICE_ID_PROMISE_20268	0x4d68
+#define PCI_DEVICE_ID_PROMISE_20268R    0x6268
 #define PCI_DEVICE_ID_PROMISE_5300	0x5300
 
 #define PCI_VENDOR_ID_N9		0x105d
@@ -1041,8 +1044,8 @@
 #define PCI_DEVICE_ID_SERVERWORKS_LE	  0x0009
 #define PCI_DEVICE_ID_SERVERWORKS_CIOB30  0x0010
 #define PCI_DEVICE_ID_SERVERWORKS_CMIC_HE 0x0011
-#define PCI_DEVICE_ID_SERVERWORKS_CSB5	  0x0201
 #define PCI_DEVICE_ID_SERVERWORKS_OSB4	  0x0200
+#define PCI_DEVICE_ID_SERVERWORKS_CSB5	  0x0201
 #define PCI_DEVICE_ID_SERVERWORKS_OSB4IDE 0x0211
 #define PCI_DEVICE_ID_SERVERWORKS_CSB5IDE 0x0212
 #define PCI_DEVICE_ID_SERVERWORKS_OSB4USB 0x0220
@@ -1441,6 +1444,9 @@
 #define PCI_VENDOR_ID_ZOLTRIX		0x15b0
 #define PCI_DEVICE_ID_ZOLTRIX_2BD0	0x2bd0 
 
+#define PCI_VENDOR_ID_PDC		0x15e9
+#define PCI_DEVICE_ID_PDC_1841		0x1841
+
 #define PCI_VENDOR_ID_SYMPHONY		0x1c1c
 #define PCI_DEVICE_ID_SYMPHONY_101	0x0001
 
@@ -1502,6 +1508,7 @@
 #define PCI_DEVICE_ID_INTEL_82430	0x0486
 #define PCI_DEVICE_ID_INTEL_82434	0x04a3
 #define PCI_DEVICE_ID_INTEL_I960	0x0960
+#define PCI_DEVICE_ID_INTEL_82562ET	0x1031
 #define PCI_DEVICE_ID_INTEL_82559ER	0x1209
 #define PCI_DEVICE_ID_INTEL_82092AA_0	0x1221
 #define PCI_DEVICE_ID_INTEL_82092AA_1	0x1222
diff -u --recursive --new-file v2.4.8/linux/include/linux/raid/md.h linux/include/linux/raid/md.h
--- v2.4.8/linux/include/linux/raid/md.h	Tue Aug  7 12:51:06 2001
+++ linux/include/linux/raid/md.h	Sun Aug 12 19:03:03 2001
@@ -36,6 +36,7 @@
 #include <linux/locks.h>
 #include <linux/kernel_stat.h>
 #include <asm/io.h>
+#include <linux/completion.h>
 
 #include <linux/raid/md_compatible.h>
 /*
diff -u --recursive --new-file v2.4.8/linux/include/linux/raid/md_k.h linux/include/linux/raid/md_k.h
--- v2.4.8/linux/include/linux/raid/md_k.h	Sun Aug 12 13:28:01 2001
+++ linux/include/linux/raid/md_k.h	Sun Aug 12 12:39:02 2001
@@ -323,7 +323,7 @@
 	void			*data;
 	md_wait_queue_head_t	wqueue;
 	unsigned long           flags;
-	struct semaphore	*sem;
+	struct completion	*event;
 	struct task_struct	*tsk;
 	const char		*name;
 } mdk_thread_t;
@@ -364,6 +364,31 @@
 	if (condition)	 						\
 		break;							\
 	__wait_event_lock_irq(wq, condition, lock);			\
+} while (0)
+
+
+#define __wait_disk_event(wq, condition) 				\
+do {									\
+	wait_queue_t __wait;						\
+	init_waitqueue_entry(&__wait, current);				\
+									\
+	add_wait_queue(&wq, &__wait);					\
+	for (;;) {							\
+		set_current_state(TASK_UNINTERRUPTIBLE);		\
+		if (condition)						\
+			break;						\
+		run_task_queue(&tq_disk);				\
+		schedule();						\
+	}								\
+	current->state = TASK_RUNNING;					\
+	remove_wait_queue(&wq, &__wait);				\
+} while (0)
+
+#define wait_disk_event(wq, condition) 					\
+do {									\
+	if (condition)	 						\
+		break;							\
+	__wait_disk_event(wq, condition);				\
 } while (0)
 
 #endif 
diff -u --recursive --new-file v2.4.8/linux/include/linux/raid/raid1.h linux/include/linux/raid/raid1.h
--- v2.4.8/linux/include/linux/raid/raid1.h	Mon Dec 11 13:20:08 2000
+++ linux/include/linux/raid/raid1.h	Sun Aug 12 12:39:02 2001
@@ -42,7 +42,10 @@
 	 */
 	struct buffer_head	*freebh;
 	int			freebh_cnt;	/* how many are on the list */
+	int			freebh_blocked;
 	struct raid1_bh		*freer1;
+	int			freer1_blocked;
+	int			freer1_cnt;
 	struct raid1_bh		*freebuf; 	/* each bh_req has a page allocated */
 	md_wait_queue_head_t	wait_buffer;
 
diff -u --recursive --new-file v2.4.8/linux/include/linux/serio.h linux/include/linux/serio.h
--- v2.4.8/linux/include/linux/serio.h	Thu Apr 12 12:20:31 2001
+++ linux/include/linux/serio.h	Sun Aug 12 11:13:59 2001
@@ -2,7 +2,7 @@
 #define _SERIO_H
 
 /*
- * $Id: serio.h,v 1.8 2000/07/17 10:42:14 vojtech Exp $
+ * $Id: serio.h,v 1.11 2001/05/29 02:58:50 jsimmons Exp $
  *
  * Copyright (C) 1999 Vojtech Pavlik
  *
@@ -104,6 +104,10 @@
 #define SERIO_GUNZE	0x1c
 #define SERIO_IFORCE	0x1d
 #define SERIO_STINGER	0x1e
+#define SERIO_NEWTON	0x1f
+#define SERIO_STOWAWAY	0x20
+#define SERIO_H3600	0x21
+#define SERIO_PS2SER	0x22
 
 #define SERIO_ID	0xff00UL
 #define SERIO_EXTRA	0xff0000UL
diff -u --recursive --new-file v2.4.8/linux/include/linux/swap.h linux/include/linux/swap.h
--- v2.4.8/linux/include/linux/swap.h	Sun Aug 12 13:28:01 2001
+++ linux/include/linux/swap.h	Sun Aug 12 19:01:27 2001
@@ -116,9 +116,7 @@
 extern wait_queue_head_t kreclaimd_wait;
 extern int page_launder(int, int);
 extern int free_shortage(void);
-extern int total_free_shortage(void);
 extern int inactive_shortage(void);
-extern int total_inactive_shortage(void);
 extern void wakeup_kswapd(void);
 extern int try_to_free_pages(unsigned int gfp_mask);
 
diff -u --recursive --new-file v2.4.8/linux/include/net/irda/smc-ircc.h linux/include/net/irda/smc-ircc.h
--- v2.4.8/linux/include/net/irda/smc-ircc.h	Mon Dec 11 12:59:41 2000
+++ linux/include/net/irda/smc-ircc.h	Sun Aug 12 11:13:59 2001
@@ -154,22 +154,12 @@
 #define IRCC_1152                  0x80
 #define IRCC_CRC                   0x40
 
-struct smc_chip {
-	char *name;
-	unsigned char entr1;
-	unsigned char entr2;
-	unsigned char cid_index;
-	unsigned char cid_value;
-	int (*probe)(struct smc_chip *chip, chipio_t *info);
-};
-typedef struct smc_chip smc_chip_t;
-
 /* Private data for each instance */
 struct ircc_cb {
 	struct net_device *netdev;     /* Yes! we are some kind of netdevice */
 	struct irlap_cb    *irlap; /* The link layer we are binded to */
 	
-	chipio_t io;               /* IrDA controller information */
+	chipio_t *io;               /* IrDA controller information */
 	iobuff_t tx_buff;          /* Transmit buffer */
 	iobuff_t rx_buff;          /* Receive buffer */
 
diff -u --recursive --new-file v2.4.8/linux/include/net/irda/vlsi_ir.h linux/include/net/irda/vlsi_ir.h
--- v2.4.8/linux/include/net/irda/vlsi_ir.h	Wed Dec 31 16:00:00 1969
+++ linux/include/net/irda/vlsi_ir.h	Sun Aug 12 11:13:59 2001
@@ -0,0 +1,576 @@
+
+/*********************************************************************
+ *
+ *	vlsi_ir.h:	VLSI82C147 PCI IrDA controller driver for Linux
+ *
+ *	Version:	0.1, Aug 6, 2001
+ *
+ *	Copyright (c) 2001 Martin Diehl
+ *
+ *	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., 59 Temple Place, Suite 330, Boston, 
+ *	MA 02111-1307 USA
+ *
+ ********************************************************************/
+
+#ifndef IRDA_VLSI_FIR_H
+#define IRDA_VLSI_FIR_H
+
+/* ================================================================ */
+
+/* non-standard PCI registers */
+
+enum vlsi_pci_regs {
+	VLSI_PCI_CLKCTL		= 0x40,		/* chip clock input control */
+	VLSI_PCI_MSTRPAGE	= 0x41,		/* addr [31:24] for all busmaster cycles */
+	VLSI_PCI_IRMISC		= 0x42		/* mainly legacy UART related */
+};
+
+/* ------------------------------------------ */
+
+/* VLSI_PCI_CLKCTL: Clock Control Register (u8, rw) */
+
+/* Three possible clock sources: either on-chip 48MHz PLL or
+ * external clock applied to EXTCLK pin. External clock may
+ * be either 48MHz or 40MHz, which is indicated by XCKSEL.
+ * CLKSTP controls whether the selected clock source gets
+ * connected to the IrDA block.
+ *
+ * On my HP OB-800 the BIOS sets external 40MHz clock as source
+ * when IrDA enabled and I've never detected any PLL lock success.
+ * Apparently the 14.31818MHz OSC input required for the PLL to work
+ * is not connected and the 40MHz EXTCLK is provided externally.
+ * At least this is what makes the driver working for me.
+ */
+
+enum vlsi_pci_clkctl {
+
+	/* PLL control */
+
+	CLKCTL_NO_PD		= 0x04,		/* PD# (inverted power down) signal,
+						 * i.e. PLL is powered, if PD_INV is set */
+	CLKCTL_LOCK		= 0x40,		/* (ro) set, if PLL is locked */
+
+	/* clock source selection */
+
+	CLKCTL_EXTCLK		= 0x20,		/* set to select external clock input */
+	CLKCTL_XCKSEL		= 0x10,		/* set to indicate 40MHz EXTCLK, not 48MHz */
+
+	/* IrDA block control */
+
+	CLKCTL_CLKSTP		= 0x80,		/* set to disconnect from selected clock source */
+	CLKCTL_WAKE		= 0x08		/* set to enable wakeup feature: whenever IR activity
+						 * is detected, PD_INV gets set and CLKSTP cleared */
+};
+
+/* ------------------------------------------ */
+
+/* VLSI_PCI_MSTRPAGE: Master Page Register (u8, rw) and busmastering stuff */
+
+#define DMA_MASK_USED_BY_HW	0xffffffff
+#define DMA_MASK_MSTRPAGE	0x00ffffff
+#define MSTRPAGE_VALUE		(DMA_MASK_MSTRPAGE >> 24)
+
+
+	/* PCI busmastering is somewhat special for this guy - in short:
+	 *
+	 * We select to operate using MSTRPAGE=0 fixed, use ISA DMA
+	 * address restrictions to make the PCI BM api aware of this,
+	 * but ensure the hardware is dealing with real 32bit access.
+	 *
+	 * In detail:
+	 * The chip executes normal 32bit busmaster cycles, i.e.
+	 * drives all 32 address lines. These addresses however are
+	 * composed of [0:23] taken from various busaddr-pointers
+	 * and [24:31] taken from the MSTRPAGE register in the VLSI82C147
+	 * config space. Therefore _all_ busmastering must be
+	 * targeted to/from one single 16MB (busaddr-) superpage!
+	 * The point is to make sure all the allocations for memory
+	 * locations with busmaster access (ring descriptors, buffers)
+	 * are indeed bus-mappable to the same 16MB range (for x86 this
+	 * means they must reside in the same 16MB physical memory address
+	 * range). The only constraint we have which supports "several objects
+	 * mappable to common 16MB range" paradigma, is the old ISA DMA
+	 * restriction to the first 16MB of physical address range.
+	 * Hence the approach here is to enable PCI busmaster support using
+	 * the correct 32bit dma-mask used by the chip. Afterwards the device's
+	 * dma-mask gets restricted to 24bit, which must be honoured by all
+	 * allocations for memory areas to be exposed to the chip.
+	 *
+	 * Note:
+	 * Don't be surprised to get "Setting latency timer..." messages every
+	 * time when PCI busmastering is enabled for the chip.
+	 * The chip has its PCI latency timer RO fixed at 0 - which is not a
+	 * problem here, because it is never requesting _burst_ transactions.
+	 */
+
+/* ------------------------------------------ */
+
+/* VLSI_PCIIRMISC: IR Miscellaneous Register (u8, rw) */
+
+/* leagcy UART emulation - not used by this driver - would require:
+ * (see below for some register-value definitions)
+ *
+ *	- IRMISC_UARTEN must be set to enable UART address decoding
+ *	- IRMISC_UARTSEL configured
+ *	- IRCFG_MASTER must be cleared
+ *	- IRCFG_SIR must be set
+ *	- IRENABLE_IREN must be asserted 0->1 (and hence IRENABLE_SIR_ON)
+ */
+
+enum vlsi_pci_irmisc {
+
+	/* IR transceiver control */
+
+	IRMISC_IRRAIL		= 0x40,		/* (ro?) IR rail power indication (and control?)
+						 * 0=3.3V / 1=5V. Probably set during power-on?
+						 * Not touched by driver */
+	IRMISC_IRPD		= 0x08,		/* transceiver power down, if set */
+
+	/* legacy UART control */
+
+	IRMISC_UARTTST		= 0x80,		/* UART test mode - "always write 0" */
+	IRMISC_UARTEN		= 0x04,		/* enable UART address decoding */
+
+	/* bits [1:0] IRMISC_UARTSEL to select legacy UART address */
+
+	IRMISC_UARTSEL_3f8	= 0x00,
+	IRMISC_UARTSEL_2f8	= 0x01,
+	IRMISC_UARTSEL_3e8	= 0x02,
+	IRMISC_UARTSEL_2e8	= 0x03
+};
+
+
+/* ================================================================ */
+
+/* registers mapped to 32 byte PCI IO space */
+
+/* note: better access all registers at the indicated u8/u16 size
+ *	 although some of them contain only 1 byte of information.
+ *	 some of them (particaluarly PROMPT and IRCFG) ignore
+ *	 access when using the wrong addressing mode!
+ */
+
+enum vlsi_pio_regs {
+	VLSI_PIO_IRINTR		= 0x00,		/* interrupt enable/request (u8, rw) */
+	VLSI_PIO_RINGPTR	= 0x02,		/* rx/tx ring pointer (u16, ro) */
+	VLSI_PIO_RINGBASE	= 0x04,		/* [23:10] of ring address (u16, rw) */
+	VLSI_PIO_RINGSIZE	= 0x06,		/* rx/tx ring size (u16, rw) */
+	VLSI_PIO_PROMPT		= 0x08, 	/* triggers ring processing (u16, wo) */
+						/* 0x0a-0x0f: reserved, duplicated UART regs */
+	VLSI_PIO_IRCFG		= 0x10,		/* configuration select (u16, rw) */
+	VLSI_PIO_SIRFLAG	= 0x12,		/* BOF/EOF for filtered SIR (u16, ro) */
+	VLSI_PIO_IRENABLE	= 0x14,		/* enable and status register (u16, rw/ro) */
+	VLSI_PIO_PHYCTL		= 0x16,		/* physical layer current status (u16, ro) */
+	VLSI_PIO_NPHYCTL	= 0x18,		/* next physical layer select (u16, rw) */
+	VLSI_PIO_MAXPKT		= 0x1a,		/* [11:0] max len for packet receive (u16, rw) */
+	VLSI_PIO_RCVBCNT	= 0x1c		/* current receive-FIFO byte count (u16, ro) */
+						/* 0x1e-0x1f: reserved, duplicated UART regs */
+};
+
+/* ------------------------------------------ */
+
+/* VLSI_PIO_IRINTR: Interrupt Register (u8, rw) */
+
+/* enable-bits:
+ *		1 = enable / 0 = disable
+ * interrupt condition bits:
+ * 		set according to corresponding interrupt source
+ *		(regardless of the state of the enable bits)
+ *		enable bit status indicated whether interrupt gets raised
+ *		write-to-clear
+ * note: RPKTINT and TPKTINT behave different in legacy UART mode (which we don't use :-)
+ */
+
+enum vlsi_pio_irintr {
+	IRINTR_ACTEN	= 0x80,	/* activity interrupt enable */
+	IRINTR_ACTIVITY	= 0x40,	/* activity monitor (traffic detected) */
+	IRINTR_RPKTEN	= 0x20,	/* receive packet interrupt enable*/
+	IRINTR_RPKTINT	= 0x10,	/* rx-packet transfered from fifo to memory finished */
+	IRINTR_TPKTEN	= 0x08,	/* transmit packet interrupt enable */
+	IRINTR_TPKTINT	= 0x04,	/* last bit of tx-packet+crc shifted to ir-pulser */
+	IRINTR_OE_EN	= 0x02,	/* UART rx fifo overrun error interrupt enable */
+	IRINTR_OE_INT	= 0x01	/* UART rx fifo overrun error (read LSR to clear) */
+};
+
+/* we use this mask to check whether the (shared PCI) interrupt is ours */
+
+#define IRINTR_INT_MASK		(IRINTR_ACTIVITY|IRINTR_RPKTINT|IRINTR_TPKTINT)
+
+/* ------------------------------------------ */
+
+/* VLSI_PIO_RINGPTR: Ring Pointer Read-Back Register (u16, ro) */
+
+#define MAX_RING_DESCR		64	/* tx, rx rings may contain up to 64 descr each */
+
+/* _both_ ring pointers are indices relative to the _entire_ rx,tx-ring!
+ * i.e. the referenced descriptor is located
+ * at RINGBASE + PTR * sizeof(descr) for rx and tx
+ * therefore, the tx-pointer has offset by MAX_RING_DESCR
+ */
+
+#define RINGPTR_RX_MASK		(MAX_RING_DESCR-1)
+#define RINGPTR_TX_MASK		((MAX_RING_DESCR|(MAX_RING_DESCR-1))<<8)
+
+#define RINGPTR_GET_RX(p)	((p)&RINGPTR_RX_MASK)
+#define RINGPTR_GET_TX(p)	(((p)&RINGPTR_TX_MASK)>>8)
+
+/* ------------------------------------------ */
+
+/* VLSI_PIO_RINGBASE: Ring Pointer Base Address Register (u16, ro) */
+
+/* Contains [23:10] part of the ring base (bus-) address
+ * which must be 1k-alinged. [31:24] is taken from
+ * VLSI_PCI_MSTRPAGE above.
+ * The controler initiates non-burst PCI BM cycles to
+ * fetch and update the descriptors in the ring.
+ * Once fetched, the descriptor remains cached onchip
+ * until it gets closed and updated due to the ring
+ * processing state machine.
+ * The entire ring area is split in rx and tx areas with each
+ * area consisting of 64 descriptors of 8 bytes each.
+ * The rx(tx) ring is located at ringbase+0 (ringbase+8*64).
+ */
+
+#define BUS_TO_RINGBASE(p)	(((p)>>10)&0x3fff)
+
+/* ------------------------------------------ */
+
+/* VLSI_PIO_RINGSIZE: Ring Size Register (u16, rw) */
+
+/* bit mask to indicate the ring size to be used for rx and tx.
+ * 	possible values		encoded bits
+ *		 4		   0000
+ *		 8		   0001
+ *		16		   0011
+ *		32		   0111
+ *		64		   1111
+ * located at [15:12] for tx and [11:8] for rx ([7:0] unused)
+ *
+ * note: probably a good idea to have IRCFG_MSTR cleared when writing
+ *	 this so the state machines are stopped and the RINGPTR is reset!
+ */
+
+#define SIZE_TO_BITS(num)		((((num)-1)>>2)&0x0f)
+#define TX_RX_TO_RINGSIZE(tx,rx)	((SIZE_TO_BITS(tx)<<12)|(SIZE_TO_BITS(rx)<<8))
+#define RINGSIZE_TO_RXSIZE(rs)		((((rs)&0x0f00)>>6)+4)
+#define RINGSIZE_TO_TXSIZE(rs)		((((rs)&0xf000)>>10)+4)
+
+
+/* ------------------------------------------ */
+
+/* VLSI_PIO_PROMPT: Ring Prompting Register (u16, write-to-start) */
+
+/* writing any value kicks the ring processing state machines
+ * for both tx, rx rings.
+ * currently enabled rings (according to IRENABLE_ENTXST, IRENABLE_ENRXST
+ * status reporting - see below) are considered as follows:
+ * 	- active rings (currently owning an active descriptor)
+ *	  ignore the prompt and continue
+ *	- idle rings fetch the next descr from the ring and start
+ *	  their processing
+ */
+
+/* ------------------------------------------ */
+
+/* VLSI_PIO_IRCFG: IR Config Register (u16, rw) */
+
+/* notes:
+ *	- not more than one SIR/MIR/FIR bit must be set at any time
+ *	- SIR, MIR, FIR and CRC16 select the configuration which will
+ *	  be applied now/next time if/when IRENABLE_IREN is _cleared_ (see below)
+ *	- besides allowing the PCI interface to execute busmaster cycles
+ *	  and therefore the ring SM to operate, the MSTR bit has side-effects:
+ *	  when MSTR is cleared, the RINGPTR's get reset and the legacy UART mode
+ *	  (in contrast to busmaster access mode) gets enabled.
+ *	- clearing ENRX or setting ENTX while data is received may stall the
+ *	  receive fifo until ENRX reenabled _and_ another packet arrives
+ *	- SIRFILT means the chip performs the required unwrapping of hardware
+ *	  headers (XBOF's, BOF/EOF) and un-escaping in the _receive_ direction.
+ *	  Only the resulting IrLAP payload is copied to the receive buffers -
+ *	  but with the 16bit FCS still encluded. Question remains, whether it
+ *	  was already checked or we should do it before passing the packet to IrLAP?
+ */
+
+enum vlsi_pio_ircfg {
+	IRCFG_LOOP	= 0x4000,	/* enable loopback test mode */
+	IRCFG_ENTX	= 0x1000,	/* transmit enable */
+	IRCFG_ENRX	= 0x0800,	/* receive enable */
+	IRCFG_MSTR	= 0x0400,	/* master enable */
+	IRCFG_RXANY	= 0x0200,	/* receive any packet */
+	IRCFG_CRC16	= 0x0080,	/* 16bit (not 32bit) CRC select for MIR/FIR */
+	IRCFG_FIR	= 0x0040,	/* FIR 4PPM encoding mode enable */
+	IRCFG_MIR	= 0x0020,	/* MIR HDLC encoding mode enable */
+	IRCFG_SIR	= 0x0010,	/* SIR encoding mode enable */
+	IRCFG_SIRFILT	= 0x0008,	/* enable SIR decode filter (receiver unwrapping) */
+	IRCFG_SIRTEST	= 0x0004,	/* allow SIR decode filter when not in SIR mode */
+	IRCFG_TXPOL	= 0x0002,	/* invert tx polarity when set */
+	IRCFG_RXPOL	= 0x0001	/* invert rx polarity when set */
+};
+
+/* ------------------------------------------ */
+
+/* VLSI_PIO_SIRFLAG: SIR Flag Register (u16, ro) */
+
+/* register contains hardcoded BOF=0xc0 at [7:0] and EOF=0xc1 at [15:8]
+ * which is used for unwrapping received frames in SIR decode-filter mode
+ */
+
+/* ------------------------------------------ */
+
+/* VLSI_PIO_IRENABLE: IR Enable Register (u16, rw/ro) */
+
+/* notes:
+ *	- IREN acts as gate for latching the configured IR mode information
+ *	  from IRCFG and IRPHYCTL when IREN=reset and applying them when
+ *	  IREN gets set afterwards.
+ *	- ENTXST reflects IRCFG_ENTX
+ *	- ENRXST = IRCFG_ENRX && (!IRCFG_ENTX || IRCFG_LOOP)
+ */
+
+enum vlsi_pio_irenable {
+	IRENABLE_IREN		= 0x8000,  /* enable IR phy and gate mode config (rw) */
+	IRENABLE_CFGER		= 0x4000,  /* mode configuration error (ro) */
+	IRENABLE_FIR_ON		= 0x2000,  /* FIR on status (ro) */
+	IRENABLE_MIR_ON		= 0x1000,  /* MIR on status (ro) */
+	IRENABLE_SIR_ON		= 0x0800,  /* SIR on status (ro) */
+	IRENABLE_ENTXST		= 0x0400,  /* transmit enable status (ro) */
+	IRENABLE_ENRXST		= 0x0200,  /* Receive enable status (ro) */
+	IRENABLE_CRC16_ON	= 0x0100   /* 16bit (not 32bit) CRC enabled status (ro) */
+};
+
+#define	  IRENABLE_MASK	    0xff00  /* Read mask */
+
+
+/* ------------------------------------------ */
+
+/* VLSI_PIO_PHYCTL: IR Physical Layer Current Control Register (u16, ro) */
+
+
+/* read-back of the currently applied physical layer status.
+ * applied from VLSI_PIO_NPHYCTL at rising edge of IRENABLE_IREN
+ * contents identical to VLSI_PIO_NPHYCTL (see below)
+ */
+
+
+
+/* ------------------------------------------ */
+
+
+/* VLSI_PIO_NPHYCTL: IR Physical Layer Next Control Register (u16, rw) */
+
+/* latched during IRENABLE_IREN=0 and applied at 0-1 transition
+ *
+ * consists of BAUD[15:10], PLSWID[9:5] and PREAMB[4:0] bits defined as follows:
+ *
+ * SIR-mode:	BAUD = (115.2kHz / baudrate) - 1
+ *		PLSWID = (pulsetime * freq / (BAUD+1)) - 1
+ *			where pulsetime is the requested IrPHY pulse width
+ *			and freq is 8(16)MHz for 40(48)MHz primary input clock
+ *		PREAMB: dont care for SIR
+ *
+ *		The nominal SIR pulse width is 3/16 bit time so we have PLSWID=12
+ *		fixed for all SIR speeds at 40MHz input clock (PLSWID=24 at 48MHz).
+ *		IrPHY also allows shorter pulses down to the nominal pulse duration
+ *		at 115.2kbaud (minus some tolerance) which is 1.41 usec.
+ *		Using the expression PLSWID = 12/(BAUD+1)-1 (multiplied by to for 48MHz)
+ *		we get the minimum acceptable PLSWID values according to the VLSI
+ *		specification, which provides 1.5 usec pulse width for all speeds (except
+ *		for 2.4kbaud getting 6usec). This is well inside IrPHY v1.3 specs and
+ *		reduces the transceiver power which drains the battery. At 9.6kbaud for
+ *		example this makes more than 90% battery power saving!
+ *
+ * MIR-mode:	BAUD = 0
+ *		PLSWID = 9(10) for 40(48) MHz input clock
+ *			to get nominal MIR pulse width
+ *		PREAMB = 1
+ *
+ * FIR-mode:	BAUD = 0
+ *		PLSWID: dont care
+ *		PREAMB = 15
+ */
+
+#define BWP_TO_PHYCTL(B,W,P)	((((B)&0x3f)<<10) | (((W)&0x1f)<<5) | (((P)&0x1f)<<0))
+#define BAUD_BITS(br)		((115200/br)-1)
+
+static inline unsigned
+calc_width_bits(unsigned baudrate, unsigned widthselect, unsigned clockselect)
+{
+	unsigned	tmp;
+
+	if (widthselect)	/* nominal 3/16 puls width */
+		return (clockselect) ? 12 : 24;
+
+	tmp = ((clockselect) ? 12 : 24) / (BAUD_BITS(baudrate)+1);
+
+	/* intermediate result of integer division needed here */
+
+	return (tmp>0) ? (tmp-1) : 0;
+}
+
+
+#define PHYCTL_SIR(br,ws,cs)	BWP_TO_PHYCTL(BAUD_BITS(br),calc_width_bits((br),(ws),(cs)),0)
+#define PHYCTL_MIR(cs)		BWP_TO_PHYCTL(0,((cs)?9:10),1)
+#define PHYCTL_FIR		BWP_TO_PHYCTL(0,0,15)
+
+/* quite ugly, I know. But implementing these calculations here avoids
+ * having magic numbers in the code and allows some playing with pulsewidths
+ * without risk to violate the standards.
+ * FWIW, here is the table for reference:
+ *
+ * baudrate	BAUD	min-PLSWID	nom-PLSWID	PREAMB
+ *     2400	  47	   0(0)		   12(24)	   0
+ *     9600	  11	   0(0)		   12(24)	   0
+ *    19200	   5	   1(2)		   12(24)	   0
+ *    38400	   2	   3(6)	           12(24)	   0
+ *    57600	   1	   5(10)	   12(24)	   0
+ *   115200	   0	  11(22)	   12(24)	   0
+ *	MIR	   0	    -		    9(10)	   1
+ *	FIR	   0        -               0		  15
+ *
+ * note: x(y) means x-value for 40MHz / y-value for 48MHz primary input clock
+ */
+
+/* ------------------------------------------ */
+
+
+/* VLSI_PIO_MAXPKT: Maximum Packet Length register (u16, rw) */
+
+/* specifies the maximum legth (up to 4096 bytes), which a
+ * received frame may have - i.e. the size of the corresponding
+ * receive buffers. For simplicity we use the same length for
+ * receive and submit buffers. Therefore we use 3k to have
+ * enough space for a lot of XBOF's and escapes we may need at
+ * some point when wrapping MTU=2048 sized packets for transmission.
+ */
+
+#define MAX_PACKET_LENGTH	3172
+
+
+/* ------------------------------------------ */
+
+
+/* VLSI_PIO_RCVBCNT: Receive Byte Count Register (u16, ro) */
+
+/* recive packet counter gets incremented on every non-filtered
+ * byte which was put in the receive fifo and reset for each
+ * new packet. Used to decide whether we are just in the middle
+ * of receiving receiving
+ */
+
+#define RCVBCNT_MASK	0x0fff
+
+/* ================================================================ */
+
+
+/* descriptors for rx/tx ring
+ *
+ * accessed by hardware - don't change!
+ *
+ * the descriptor is owned by hardware, when the ACTIVE status bit
+ * is set and nothing (besides reading status to test the bit)
+ * shall be done. The bit gets cleared by hw, when the descriptor
+ * gets closed. Premature reaping of descriptors owned be the chip
+ * can be achieved by disabling IRCFG_MSTR
+ *
+ * Attention: Writing addr overwrites status!
+ *
+ * ### FIXME: we depend on endianess here
+ */
+
+struct ring_descr {
+	volatile u16	rd_count;	/* tx/rx count [11:0] */
+	u16		reserved;
+	union {
+		u32	addr;		/* [23:0] of the buffer's busaddress */
+		struct {
+			u8		addr_res[3];
+			volatile u8	status;		/* descriptor status */
+		} rd_s;
+	} rd_u;
+};
+
+#define rd_addr		rd_u.addr
+#define rd_status	rd_u.rd_s.status
+
+
+/* ring descriptor status bits */
+
+#define RD_STAT_ACTIVE		0x80	/* descriptor owned by hw (both TX,RX) */
+
+/* TX ring descriptor status */
+
+#define	TX_STAT_DISCRC		0x40	/* do not send CRC (for SIR) */
+#define	TX_STAT_BADCRC		0x20	/* force a bad CRC */
+#define	TX_STAT_PULSE		0x10	/* send indication pulse after this frame (MIR/FIR) */
+#define	TX_STAT_FRCEUND		0x08	/* force underrun */
+#define	TX_STAT_CLRENTX		0x04	/* clear ENTX after this frame */
+#define	TX_STAT_UNDRN		0x01	/* TX fifo underrun (probably PCI problem) */
+
+/* RX ring descriptor status */
+
+#define RX_STAT_PHYERR		0x40	/* physical encoding error */
+#define RX_STAT_CRCERR		0x20	/* CRC error (MIR/FIR) */
+#define RX_STAT_LENGTH		0x10	/* frame exceeds buffer length */
+#define RX_STAT_OVER		0x08	/* RX fifo overrun (probably PCI problem) */
+#define RX_STAT_SIRBAD		0x04	/* EOF missing: BOF follows BOF (SIR, filtered) */
+
+
+#define RX_STAT_ERROR		0x7c	/* any error in frame */
+
+
+/* ------------------------------------------ */
+
+/* contains the objects we've put into the ring descriptors
+ * static buffers for now - probably skb's later
+ */
+
+struct ring_entry {
+	struct sk_buff	*skb;
+	void		*head;
+};
+
+/* ------------------------------------------ */
+
+/* our compound VLSI-PCI-IRDA device information */
+
+typedef struct vlsi_irda_dev {
+	struct pci_dev		*pdev;
+	struct net_device_stats	stats;
+
+	struct irlap_cb		*irlap;
+
+	struct qos_info		qos;
+
+	unsigned		mode;
+	int			baud, new_baud;
+
+	dma_addr_t		busaddr;
+
+	struct ring_descr	*ring_hw;
+
+	struct ring_entry	*ring_buf;
+
+	unsigned		tx_mask, rx_mask;
+
+	unsigned		tx_put, tx_get, rx_put, rx_get;
+
+	spinlock_t		lock;
+	
+} vlsi_irda_dev_t;
+
+/********************************************************/
+
+#endif /* IRDA_VLSI_FIR_H */
+
diff -u --recursive --new-file v2.4.8/linux/ipc/util.c linux/ipc/util.c
--- v2.4.8/linux/ipc/util.c	Mon Feb 19 10:18:18 2001
+++ linux/ipc/util.c	Sun Aug 12 17:37:53 2001
@@ -75,7 +75,7 @@
 		ids->size = 0;
 	}
 	ids->ary = SPIN_LOCK_UNLOCKED;
-	for(i=0;i<size;i++)
+	for(i=0;i<ids->size;i++)
 		ids->entries[i].p = NULL;
 }
 
diff -u --recursive --new-file v2.4.8/linux/kernel/exit.c linux/kernel/exit.c
--- v2.4.8/linux/kernel/exit.c	Fri May  4 14:44:06 2001
+++ linux/kernel/exit.c	Sun Aug 12 10:52:29 2001
@@ -9,6 +9,7 @@
 #include <linux/interrupt.h>
 #include <linux/smp_lock.h>
 #include <linux/module.h>
+#include <linux/completion.h>
 #include <linux/tty.h>
 #ifdef CONFIG_BSD_PROCESS_ACCT
 #include <linux/acct.h>
@@ -473,10 +474,10 @@
 	goto fake_volatile;
 }
 
-NORET_TYPE void up_and_exit(struct semaphore *sem, long code)
+NORET_TYPE void complete_and_exit(struct completion *comp, long code)
 {
-	if (sem)
-		up(sem);
+	if (comp)
+		complete(comp);
 	
 	do_exit(code);
 }
diff -u --recursive --new-file v2.4.8/linux/kernel/ksyms.c linux/kernel/ksyms.c
--- v2.4.8/linux/kernel/ksyms.c	Sun Aug 12 13:28:01 2001
+++ linux/kernel/ksyms.c	Sun Aug 12 17:35:38 2001
@@ -177,6 +177,7 @@
 EXPORT_SYMBOL(invalidate_inode_pages);
 EXPORT_SYMBOL(truncate_inode_pages);
 EXPORT_SYMBOL(fsync_dev);
+EXPORT_SYMBOL(fsync_no_super);
 EXPORT_SYMBOL(permission);
 EXPORT_SYMBOL(vfs_permission);
 EXPORT_SYMBOL(inode_setattr);
@@ -242,6 +243,8 @@
 EXPORT_SYMBOL(vfs_rename);
 EXPORT_SYMBOL(vfs_statfs);
 EXPORT_SYMBOL(generic_read_dir);
+EXPORT_SYMBOL(generic_file_llseek);
+EXPORT_SYMBOL(no_llseek);
 EXPORT_SYMBOL(__pollwait);
 EXPORT_SYMBOL(poll_freewait);
 EXPORT_SYMBOL(ROOT_DEV);
@@ -429,7 +432,7 @@
 EXPORT_SYMBOL(iomem_resource);
 
 /* process management */
-EXPORT_SYMBOL(up_and_exit);
+EXPORT_SYMBOL(complete_and_exit);
 EXPORT_SYMBOL(__wake_up);
 EXPORT_SYMBOL(wake_up_process);
 EXPORT_SYMBOL(sleep_on);
diff -u --recursive --new-file v2.4.8/linux/kernel/module.c linux/kernel/module.c
--- v2.4.8/linux/kernel/module.c	Tue May  1 16:05:00 2001
+++ linux/kernel/module.c	Sun Aug 12 11:13:59 2001
@@ -39,7 +39,7 @@
 extern const char __start___kallsyms[] __attribute__ ((weak));
 extern const char __stop___kallsyms[] __attribute__ ((weak));
 
-static struct module kernel_module =
+struct module kernel_module =
 {
 	size_of_struct:		sizeof(struct module),
 	name: 			"",
diff -u --recursive --new-file v2.4.8/linux/mm/page_alloc.c linux/mm/page_alloc.c
--- v2.4.8/linux/mm/page_alloc.c	Sun Aug 12 13:28:01 2001
+++ linux/mm/page_alloc.c	Sun Aug 12 12:23:58 2001
@@ -448,7 +448,7 @@
 		 * to give up than to deadlock the kernel looping here.
 		 */
 		if (gfp_mask & __GFP_WAIT) {
-			if (!order || total_free_shortage()) {
+			if (!order || free_shortage()) {
 				int progress = try_to_free_pages(gfp_mask);
 				if (progress || (gfp_mask & __GFP_FS))
 					goto try_again;
diff -u --recursive --new-file v2.4.8/linux/mm/vmscan.c linux/mm/vmscan.c
--- v2.4.8/linux/mm/vmscan.c	Sun Aug 12 13:28:01 2001
+++ linux/mm/vmscan.c	Sun Aug 12 15:18:16 2001
@@ -24,6 +24,14 @@
 
 #include <asm/pgalloc.h>
 
+/*
+ * The "priority" of VM scanning is how much of the queues we
+ * will scan in one go. A value of 6 for DEF_PRIORITY implies
+ * that we'll scan 1/64th of the queues ("queue_length >> 6")
+ * during a normal aging round.
+ */
+#define DEF_PRIORITY (6)
+
 #define MAX(a,b) ((a) > (b) ? (a) : (b))
 
 static inline void age_page_up(struct page *page)
@@ -65,23 +73,6 @@
 	return (inactive > (zone->size / 3));
 }
 
-static unsigned int zone_inactive_shortage(zone_t *zone) 
-{
-	unsigned int sum;
-
-	if (!zone->size)
-		return 0;
-
-	sum = zone->pages_high;
-	sum -= zone->inactive_dirty_pages;
-	sum -= zone->inactive_clean_pages;
-	sum -= zone->free_pages;
-	
-	if (sum > 0)
-		return sum;
-	return 0;
-}
-
 static unsigned int zone_free_plenty(zone_t *zone)
 {
 	unsigned int free;
@@ -92,17 +83,6 @@
 	return free > zone->pages_high*2;
 }
 
-static unsigned int zone_free_shortage(zone_t *zone)
-{
-	unsigned int free;
-
-	free = zone->free_pages;
-	free += zone->inactive_clean_pages;
-
-	return zone->size && free < zone->pages_low;
-}
-
-
 /* mm->page_table_lock is held. mmap_sem is not held */
 static void try_to_swap_out(struct mm_struct * mm, struct vm_area_struct* vma, unsigned long address, pte_t * page_table, struct page *page)
 {
@@ -444,7 +424,7 @@
 		}
 
 		/* OK, remove the page from the caches. */
-                if (PageSwapCache(page)) {
+		if (PageSwapCache(page)) {
 			__delete_from_swap_cache(page);
 			goto found_page;
 		}
@@ -494,8 +474,8 @@
  * have a page before it can continue with its allocation, we'll
  * do synchronous page flushing in that case.
  *
- * This code is heavily inspired by the FreeBSD source code. Thanks
- * go out to Matthew Dillon.
+ * This code used to be heavily inspired by the FreeBSD source code. 
+ * Thanks go out to Matthew Dillon.
  */
 #define MAX_LAUNDER 		(4 * (1 << page_cluster))
 #define CAN_DO_FS		(gfp_mask & __GFP_FS)
@@ -512,7 +492,7 @@
 
 dirty_page_rescan:
 	spin_lock(&pagemap_lru_lock);
-	maxscan = nr_inactive_dirty_pages;
+	maxscan = nr_inactive_dirty_pages >> DEF_PRIORITY;
 	while ((page_lru = inactive_dirty_list.prev) != &inactive_dirty_list &&
 				maxscan-- > 0) {
 		page = list_entry(page_lru, struct page, lru);
@@ -654,13 +634,6 @@
 			UnlockPage(page);
 			page_cache_release(page);
 
-			/* 
-			 * If we're freeing buffer cache pages, stop when
-			 * we've got enough free memory.
-			 */
-			if (freed_page && !total_free_shortage())
-				break;
-
 			continue;
 		} else if (page->mapping && !PageDirty(page)) {
 			/*
@@ -698,7 +671,7 @@
 	 * loads, flush out the dirty pages before we have to wait on
 	 * IO.
 	 */
-	if (CAN_DO_IO && !launder_loop && total_free_shortage()) {
+	if (CAN_DO_IO && !launder_loop && free_shortage()) {
 		launder_loop = 1;
 		/* If we cleaned pages, never do synchronous IO. */
 		if (cleaned_pages)
@@ -717,12 +690,11 @@
 /**
  * refill_inactive_scan - scan the active list and find pages to deactivate
  * @priority: the priority at which to scan
- * @target: number of pages to deactivate, zero for background aging
  *
  * This function will scan a portion of the active list to find
  * unused pages, those pages will then be moved to the inactive list.
  */
-int refill_inactive_scan(zone_t *zone, unsigned int priority, int target)
+static int refill_inactive_scan(unsigned int priority)
 {
 	struct list_head * page_lru;
 	struct page * page;
@@ -730,13 +702,6 @@
 	int page_active = 0;
 	int nr_deactivated = 0;
 
-	/*
-	 * When we are background aging, we try to increase the page aging
-	 * information in the system.
-	 */
-	if (!target)
-		maxscan = nr_active_pages >> 4;
-
 	/* Take the lock while messing with the list... */
 	spin_lock(&pagemap_lru_lock);
 	while (maxscan-- > 0 && (page_lru = active_list.prev) != &active_list) {
@@ -794,10 +759,7 @@
 			list_del(page_lru);
 			list_add(page_lru, &active_list);
 		} else {
-			if (!zone || (zone && (zone == page->zone)))
-				nr_deactivated++;
-			if (target && nr_deactivated >= target)
-				break;
+			nr_deactivated++;
 		}
 	}
 	spin_unlock(&pagemap_lru_lock);
@@ -806,99 +768,73 @@
 }
 
 /*
- * Check if we have are low on free pages globally.
- */
-int free_shortage(void)
-{
-	int freeable = nr_free_pages() + nr_inactive_clean_pages();
-	int freetarget = freepages.high;
-
-	/* Are we low on free pages globally? */
-	if (freeable < freetarget)
-		return freetarget - freeable;
-	return 0;
-}
-
-/*
- *
  * Check if there are zones with a severe shortage of free pages,
  * or if all zones have a minor shortage.
  */
-int total_free_shortage(void)
+int free_shortage(void)
 {
-	int sum = 0;
-	pg_data_t *pgdat = pgdat_list;
-
-	/* Do we have a global free shortage? */
-	if((sum = free_shortage()))
-		return sum;
+	pg_data_t *pgdat;
+	unsigned int global_free = 0;
+	unsigned int global_target = freepages.high;
 
-	/* If not, are we very low on any particular zone? */
+	/* Are we low on free pages anywhere? */
+	pgdat = pgdat_list;
 	do {
 		int i;
 		for(i = 0; i < MAX_NR_ZONES; i++) {
 			zone_t *zone = pgdat->node_zones+ i;
+			unsigned int free;
+
+			if (!zone->size)
+				continue;
+
+			free = zone->free_pages;
+			free += zone->inactive_clean_pages;
 
-			sum += zone_free_shortage(zone);
+			/* Local shortage? */
+			if (free < zone->pages_low)
+				return 1;
+
+			global_free += free;
 		}
 		pgdat = pgdat->node_next;
 	} while (pgdat);
 
-	return sum;
-
+	/* Global shortage? */
+	return global_free < global_target;
 }
 
 /*
- * How many inactive pages are we short globally?
- */
-int inactive_shortage(void)
-{
-	int shortage = 0;
-
-	/* Is the inactive dirty list too small? */
-
-	shortage += freepages.high;
-	shortage += inactive_target;
-	shortage -= nr_free_pages();
-	shortage -= nr_inactive_clean_pages();
-	shortage -= nr_inactive_dirty_pages;
-
-	if (shortage > 0)
-		return shortage;
-	return 0;
-}
-/*
  * Are we low on inactive pages globally or in any zone?
  */
-int total_inactive_shortage(void)
+int inactive_shortage(void)
 {
-	int shortage = 0;
-	pg_data_t *pgdat = pgdat_list;
-
-	if((shortage = inactive_shortage()))
-		return shortage;
-
-	shortage = 0;	
+	pg_data_t *pgdat;
+	unsigned int global_target = freepages.high + inactive_target;
+	unsigned int global_incative = 0;
 
+	pgdat = pgdat_list;
 	do {
 		int i;
 		for(i = 0; i < MAX_NR_ZONES; i++) {
-			int zone_shortage;
-			zone_t *zone = pgdat->node_zones+ i;
+			zone_t *zone = pgdat->node_zones + i;
+			unsigned int inactive;
 
-			if (!zone->size)
-				continue;
-			zone_shortage = zone->pages_high;
-			zone_shortage -= zone->inactive_dirty_pages;
-			zone_shortage -= zone->inactive_clean_pages;
-			zone_shortage -= zone->free_pages;
-			if (zone_shortage > 0)
-				shortage += zone_shortage;
+			inactive  = zone->inactive_dirty_pages;
+			inactive += zone->inactive_clean_pages;
+			inactive += zone->free_pages;
+
+			/* Local shortage? */
+			if (inactive < zone->pages_high)
+				return 1;
+
+			global_incative += inactive;
 		}
 		pgdat = pgdat->node_next;
 	} while (pgdat);
 
-	return shortage;
+	/* Global shortage? */
+	return global_incative < global_target;
 }
 
 /*
@@ -917,23 +853,16 @@
  * deactivate too many pages. To achieve this we simply do less work
  * when called from a user process.
  */
-#define DEF_PRIORITY (6)
-static int refill_inactive_global(unsigned int gfp_mask, int user)
+
+static int refill_inactive(unsigned int gfp_mask)
 {
-	int count, start_count, maxtry;
+	int progress = 0, maxtry;
 
-	if (user) {
-		count = (1 << page_cluster);
-		maxtry = 6;
-	} else {
-		count = inactive_shortage();
-		maxtry = 1 << DEF_PRIORITY;
-	}
+	maxtry = 1 << DEF_PRIORITY;
 
-	start_count = count;
 	do {
 		if (current->need_resched) {
-			__set_current_state(TASK_RUNNING);
+			 __set_current_state(TASK_RUNNING);
 			schedule();
 			if (!inactive_shortage())
 				return 1;
@@ -942,72 +871,16 @@
 		/* Walk the VM space for a bit.. */
 		swap_out(DEF_PRIORITY, gfp_mask);
 
-		count -= refill_inactive_scan(NULL, DEF_PRIORITY, count);
-		if (count <= 0)
-			goto done;
+		/* ..and refill the inactive list */
+		progress += refill_inactive_scan(DEF_PRIORITY);
 
 		if (--maxtry <= 0)
-				return 0;
-		
+			break;
 	} while (inactive_shortage());
 
-done:
-	return (count < start_count);
-}
-
-static int refill_inactive_zone(zone_t *zone, unsigned int gfp_mask, int user) 
-{
-	int count, start_count, maxtry; 
-	
-	count = start_count = zone_inactive_shortage(zone);
-
-	maxtry = (1 << DEF_PRIORITY);
-
-	do {
-		swap_out(DEF_PRIORITY, gfp_mask);
-
-		count -= refill_inactive_scan(zone, DEF_PRIORITY, count);
-
-		if (count <= 0)
-			goto done;
-
-		if (--maxtry <= 0)
-			return 0;
-
-	} while(zone_inactive_shortage(zone));
-done:
-	return (count < start_count);
+	return progress;
 }
 
-
-static int refill_inactive(unsigned int gfp_mask, int user) 
-{
-	int type = 0, ret = 0;
-	pg_data_t *pgdat = pgdat_list;
-	/*
-	 * First do a global scan if there is a 
-	 * global shortage.
-	 */
-	if (inactive_shortage())
-		ret += refill_inactive_global(gfp_mask, user);
-
-	/*
-	 * Then check if there is any specific zone 
-	 * with a shortage and try to refill it if
-	 * so.
-	 */
-	for (type = 0; type < MAX_NR_ZONES; type++) {
-		zone_t *zone = pgdat->node_zones + type;
-		
-		if (zone_inactive_shortage(zone)) 
-			ret += refill_inactive_zone(zone, gfp_mask, user);
-	} 
-
-	return ret;
-}
-
-#define DEF_PRIORITY (6)
-
 static int do_try_to_free_pages(unsigned int gfp_mask, int user)
 {
 	int ret = 0;
@@ -1030,7 +903,8 @@
 	 * If needed, we move pages from the active list
 	 * to the inactive list.
 	 */
-	ret += refill_inactive(gfp_mask, user);
+	if (inactive_shortage()) 
+		ret += refill_inactive(gfp_mask);
 
 	/* 	
 	 * Reclaim unused slab cache if memory is low.
@@ -1085,7 +959,7 @@
 		static long recalc = 0;
 
 		/* If needed, try to free some memory. */
-		if (total_inactive_shortage() || total_free_shortage()) 
+		if (inactive_shortage() || free_shortage()) 
 			do_try_to_free_pages(GFP_KSWAPD, 0);
 
 		/* Once a second ... */
@@ -1096,7 +970,7 @@
 			recalculate_vm_stats();
 
 			/* Do background page aging. */
-			refill_inactive_scan(NULL, DEF_PRIORITY, 0);
+			refill_inactive_scan(DEF_PRIORITY);
 		}
 
 		run_task_queue(&tq_disk);
@@ -1112,7 +986,7 @@
 		 * We go to sleep for one second, but if it's needed
 		 * we'll be woken up earlier...
 		 */
-		if (!total_free_shortage() || !total_inactive_shortage()) {
+		if (!free_shortage() || !inactive_shortage()) {
 			interruptible_sleep_on_timeout(&kswapd_wait, HZ);
 		/*
 		 * If we couldn't free enough memory, we see if it was
diff -u --recursive --new-file v2.4.8/linux/net/atm/common.c linux/net/atm/common.c
--- v2.4.8/linux/net/atm/common.c	Sun Aug 12 13:28:01 2001
+++ linux/net/atm/common.c	Sun Aug 12 11:13:59 2001
@@ -210,7 +210,7 @@
 
 	if ((vpi != ATM_VPI_UNSPEC && vpi != ATM_VPI_ANY &&
 	    vpi >> dev->ci_range.vpi_bits) || (vci != ATM_VCI_UNSPEC &&
-	    vci != ATM_VCI_ANY && vci > dev->ci_range.vci_bits))
+	    vci != ATM_VCI_ANY && vci >> dev->ci_range.vci_bits))
 		return -EINVAL;
 	if (vci > 0 && vci < ATM_NOT_RSV_VCI && !capable(CAP_NET_BIND_SERVICE))
 		return -EPERM;
diff -u --recursive --new-file v2.4.8/linux/net/ipv4/ip_output.c linux/net/ipv4/ip_output.c
--- v2.4.8/linux/net/ipv4/ip_output.c	Sun Aug 12 13:28:01 2001
+++ linux/net/ipv4/ip_output.c	Sun Aug 12 11:23:32 2001
@@ -5,7 +5,7 @@
  *
  *		The Internet Protocol (IP) output module.
  *
- * Version:	$Id: ip_output.c,v 1.96 2001/08/03 22:20:39 davem Exp $
+ * Version:	$Id: ip_output.c,v 1.97 2001/08/09 17:53:40 davem Exp $
  *
  * Authors:	Ross Biro, <bir7@leland.Stanford.Edu>
  *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
@@ -37,6 +37,7 @@
  *					and more readibility. 
  *		Marc Boucher	:	When call_out_firewall returns FW_QUEUE,
  *					silently drop skb instead of failing with -EPERM.
+ *		Detlev Wengorz	:	Copy protocol for fragments.
  */
 
 #include <asm/uaccess.h>
@@ -805,6 +806,8 @@
 		skb_put(skb2, len + hlen);
 		skb2->nh.raw = skb2->data;
 		skb2->h.raw = skb2->data + hlen;
+		skb2->protocol = skb->protocol;
+		skb2->security = skb->security;
 
 		/*
 		 *	Charge the memory for the fragment to any owner
diff -u --recursive --new-file v2.4.8/linux/net/wanrouter/wanmain.c linux/net/wanrouter/wanmain.c
--- v2.4.8/linux/net/wanrouter/wanmain.c	Tue Jul  3 17:08:22 2001
+++ linux/net/wanrouter/wanmain.c	Sun Aug 12 11:13:59 2001
@@ -48,7 +48,7 @@
 #include <linux/errno.h>	/* return codes */
 #include <linux/kernel.h>
 #include <linux/module.h>	/* support for loadable modules */
-#include <linux/malloc.h>	/* kmalloc(), kfree() */
+#include <linux/slab.h>	/* kmalloc(), kfree() */
 #include <linux/mm.h>		/* verify_area(), etc. */
 #include <linux/string.h>	/* inline mem*, str* functions */
 
diff -u --recursive --new-file v2.4.8/linux/net/wanrouter/wanproc.c linux/net/wanrouter/wanproc.c
--- v2.4.8/linux/net/wanrouter/wanproc.c	Tue Jul  3 17:08:22 2001
+++ linux/net/wanrouter/wanproc.c	Sun Aug 12 11:13:59 2001
@@ -25,7 +25,7 @@
 #include <linux/stddef.h>	/* offsetof(), etc. */
 #include <linux/errno.h>	/* return codes */
 #include <linux/kernel.h>
-#include <linux/malloc.h>	/* kmalloc(), kfree() */
+#include <linux/slab.h>	/* kmalloc(), kfree() */
 #include <linux/mm.h>		/* verify_area(), etc. */
 #include <linux/string.h>	/* inline mem*, str* functions */
 #include <asm/byteorder.h>	/* htons(), etc. */
@@ -1039,7 +1039,7 @@
  *	No /proc - output stubs
  */
 
-__initfunc(int wanrouter_proc_init(void))
+int __init wanrouter_proc_init(void)
 {
 	return 0;
 }
