Index: oldkernel/linux/MAINTAINERS diff -u linux/MAINTAINERS:1.1.1.1 linux/MAINTAINERS:1.2 --- linux/MAINTAINERS:1.1.1.1 Wed May 31 12:33:48 2000 +++ linux/MAINTAINERS Fri Jul 7 15:36:41 2000 @@ -304,6 +304,13 @@ L: linux-eata@i-connect.net, linux-scsi@vger.rutgers.edu S: Maintained +EMU10K1 SOUND DRIVER +P: Rui Sousa +M: rsousa@grad.physics.sunysb.edu +L: emu10k1-devel@opensource.creative.com +W: http://opensource.creative.com/ +S: Maintained + ETHEREXPRESS-16 NETWORK DRIVER P: Philip Blundell M: Philip.Blundell@pobox.com Index: oldkernel/linux/Makefile diff -u linux/Makefile:1.3 linux/Makefile:1.4 --- linux/Makefile:1.3 Thu Jun 1 17:59:28 2000 +++ linux/Makefile Fri Jul 7 15:36:41 2000 @@ -1,7 +1,7 @@ VERSION = 2 PATCHLEVEL = 2 SUBLEVEL = 14 -EXTRAVERSION = -5.0.14 +EXTRAVERSION = -12.ext3.14smp ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/) Index: oldkernel/linux/3w-xxxx/driver/Makefile diff -u /dev/null linux/3w-xxxx/driver/Makefile:1.1 --- /dev/null Mon Jul 31 21:15:04 2000 +++ linux/3w-xxxx/driver/Makefile Fri Jul 7 16:34:57 2000 @@ -0,0 +1,13 @@ +CC = /usr/bin/gcc + +CFLAGS = -c -D__KERNEL__=1 -DMODULE -Wall -Wstrict-prototypes -I. -O2 -fomit-frame-pointer + +OBJS = 3w-xxxx + +3w-xxxx.o:3w-xxxx.c 3w-xxxx.h + $(CC) $(CFLAGS) -o 3w-xxxx.o 3w-xxxx.c + +all: $(OBJS) + +clean: + rm -rf 3w-xxxx.o *~ Index: oldkernel/linux/Documentation/Changes diff -u linux/Documentation/Changes:1.1.1.1 linux/Documentation/Changes:1.2 --- linux/Documentation/Changes:1.1.1.1 Wed May 31 12:33:53 2000 +++ linux/Documentation/Changes Fri Jul 7 15:36:41 2000 @@ -651,9 +651,9 @@ ftp://ftp.mathematik.th-darmstadt.de/pub/linux/okir/dontuse/nfs-server-2.2beta40.tar.gz ftp://linux.nrao.edu/mirrors/fb0429.mathematik.th-darmstadt.de/pub/linux/okir/dontuse/nfs-server-2.2beta40.tar.gz -The kernel-level 1.4.7 release: -ftp://ftp.varesearch.com/pub/support/hjl/knfsd/knfsd-1.4.7.tar.gz -ftp://ftp.kernel.org/pub/linux/devel/gcc/knfsd-1.4.7.tar.gz + +The kernel-level nfs-utils-0.1.6 release: +ftp://nfs.sourceforge.net/pub/nfs/nfs-utils-0.1.6.tar.gz Net-tools ========= Index: oldkernel/linux/Documentation/Configure.help diff -u linux/Documentation/Configure.help:1.10 linux/Documentation/Configure.help:1.11 --- linux/Documentation/Configure.help:1.10 Thu Jun 1 17:28:49 2000 +++ linux/Documentation/Configure.help Fri Jul 7 15:36:41 2000 @@ -704,6 +704,16 @@ say M here and read Documentation/modules.txt. The module will be called DAC960.o. +3ware Storage Controller support +CONFIG_BLK_DEV_3WARE + This driver adds support for 3ware Storage Controller. See + readme.3ware for further information about this driver. + + If you want to compile the driver as a module ( = code which can be + inserted in and removed from the running kernel whenever you want), + say M here and read Documentation/modules.txt. The module will be + called 3w-xxxx.o. + Parallel port IDE device support CONFIG_PARIDE There are many external CD-ROM and disk devices that connect through @@ -1698,14 +1708,6 @@ is required to make use of the new PIII 128bit XMM registers. It is safe to leave this enabled all the time. -Enable CPU Specific (MMX/MMX2) Optimizations -CONFIG_X86_CPU_OPTIMIZATIONS - This enables use of the MMX registers and 128bit MMX2 registers on CPUs - that can support the new instructions (Pentium/AMD K6 or newer). In - order to support the Pentium III 128 bit XMM registers you must enable - both this and PII/PIII Extended Fast FPU save support. It is safe to - leave this enabled all the time. - VGA text console CONFIG_VGA_CONSOLE Saying Y here will allow you to use Linux in text mode through a @@ -4213,8 +4215,8 @@ synchronous data transfers frequency CONFIG_SCSI_NCR53C8XX_SYNC - The SCSI Parallel Interface-2 Standard defines 4 classes of transfer - rates: FAST-5, FAST-10, FAST-20 and FAST-40. The numbers are + The SCSI Parallel Interface-2 Standard defines 5 classes of transfer + rates: FAST-5, FAST-10, FAST-20, FAST-40 and FAST-80. The numbers are respectively the maximum data transfer rates in mega-transfers per second for each class. For example, a FAST-20 Wide 16 device is able to transfer data at 20 million 16 bit packets per second for a total @@ -4222,9 +4224,9 @@ You may specify 0 if you want to only use asynchronous data transfers. This is the safest and slowest option. Otherwise, specify - a value between 5 and 40, depending on the capability of your SCSI + a value between 5 and 80, depending on the capability of your SCSI controller. The higher the number, the faster the data transfer. - Note that 40 should normally be ok since the driver decreases the + Note that 80 should normally be ok since the driver decreases the value automatically according to the controller's capabilities. Your answer to this question is ignored for controllers with NVRAM, @@ -4235,7 +4237,7 @@ second). The normal answer therefore is not to go with the default but to - select the maximum value 40 allowing the driver to use the maximum + select the maximum value 80 allowing the driver to use the maximum value supported by each controller. If this causes problems with your SCSI devices, you should come back and decrease the value. @@ -4253,6 +4255,36 @@ The normal answer therefore is N; try Y only if you encounter SCSI related problems. +perform integrity check +CONFIG_SCSI_NCR53C8XX_INTEGRITY_CHECK + If you say Y here, the driver will verify the transmission + characteristics of the SCSI bus using the basic and enhanced + tests defined by the T10/98-235 and 99-242r2 specifications. + The basic test compares the response to Inquiry commands at + asynchronous, narrow and the maximum settings. The enhanced + test utilizes devices internal buffer to perform a series of + write, read and compare tests using high-stress test patterns. + Errors in the compare will result in a reduced transmission rate. + Ultra 3 support requires this option to be enabled. This option + requires the incomplete driver option to be enabled as well. + + Note: Devices that are not fully SCSI compliant may behave badly with + the enhanced test. If this happens, disable the integrity check + using the command line option bushck:4 and send an email + with details to pam.delaney@lsil.com. + +enable immediate arbitration +CONFIG_SCSI_NCR53C8XX_IARB + This option is only supported by the SYM53C8XX driver. + SYMBIOS 53C8XX chips are able to arbitrate for the SCSI BUS as soon + as they have detected an expected disconnection (BUS FREE PHASE). + Enabling this option makes the SCSI initiator (adapter) very unfair + with regards to SCSI BUS arbitration. If you think that this feature + can improve your application or are interested in evaluating it, + please read first the README.ncr53c8xx file. + + The normal answer for this option is N. + not allow targets to disconnect CONFIG_SCSI_NCR53C8XX_NO_DISCONNECT This option is only provided for safety if you suspect some SCSI @@ -4286,7 +4318,8 @@ CONFIG_SCSI_NCR53C8XX_MAX_TAGS This option allows you to specify the maximum number of commands that can be queued to any device, when tagged command queuing is - possible. The default value is 32. Minimum is 2, maximum is 64. + possible. The default value is 32. Minimum is 2, maximum is 64 for + the generic NCR53C8XX driver and 255 for the SYM53C8XX driver. Modern hard disks are able to support 64 tags and even more, but do not seem to be faster when more than 32 tags are being used. @@ -7544,31 +7577,33 @@ NFS server support CONFIG_NFSD - If you want your Linux box to act as a NFS *server*, so that other + If you want your Linux box to act as an NFS *server*, so that other computers on your local network which support NFS can access certain directories on your box transparently, you have two options: you can use the self-contained user space program nfsd, in which case you - should say N here, or you can say Y and use this new experimental - kernel based NFS server. The advantage of the kernel based solution - is that it is faster; it might not be completely stable yet, though. + should say N here, or you can say Y and use the kernel based NFS + server. The kernel based solution is faster and is now the recommended + solution: no further development is occurring on the userspace server and + support of it may be discontinued in future. In either case, you will need support software; the respective locations are given in the file Documentation/Changes in the NFS section. - Please read the NFS-HOWTO, available via FTP (user: anonymous) from - ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. + Please read the NFS-HOWTO, available from + http://www.linuxdoc.org/HOWTO/NFS-HOWTO.html . + The NFS server is also available as a module ( = code which can be inserted in and removed from the running kernel whenever you want). The module is called nfsd.o. If you want to compile it as a module, say M here and read Documentation/modules.txt. If unsure, say N. -Emulate Sun NFS daemon -CONFIG_NFSD_SUN - If you would like for the server to allow clients to access - directories that are mount points on the local filesystem (this is - how nfsd behaves on Sun systems), say yes here. If unsure, say N. +Provide NFSv3 server support (EXPERIMENTAL) +CONFIG_NFSD_V3 + If you would like to include the NFSv3 server was well as the NFSv2 + server, say Y here. File locking, via the NLMv4 protocol, is now + supported. If unsure, say N. OS/2 HPFS filesystem support (read only) CONFIG_HPFS_FS @@ -10191,6 +10226,11 @@ be able to use its on-board audio. Read Documentation/sound/visws for more info on this driver's capabilities. +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! or SB PCI512. + Ensoniq ES1370 based PCI sound cards CONFIG_SOUND_ES1370 Say Y or M if you have a PCI sound card utilizing the Ensoniq @@ -10267,11 +10307,6 @@ Say Y or M if you have a sound system driven by ESS's Maestro line of PCI sound chips. These include the Maestro 1, Maestro 2, and Maestro 2E. See Documentation/sound/Maestro for more details. - -EMU10K1 derived boards -CONFIG_SOUND_EMU10k1 - Say Y or M if you have a Creative SBLive! sound card, as this - is the only card currently supported by this driver. Are you using a crosscompiler CONFIG_CROSSCOMPILE Index: oldkernel/linux/Documentation/README.DAC960 diff -u linux/Documentation/README.DAC960:1.2 linux/Documentation/README.DAC960:1.3 --- linux/Documentation/README.DAC960:1.2 Wed May 31 14:57:57 2000 +++ linux/Documentation/README.DAC960 Fri Jul 7 15:36:41 2000 @@ -1,11 +1,11 @@ - Mylex DAC960/DAC1100 PCI RAID Controller Driver for Linux + Linux Driver for Mylex DAC960/AcceleRAID/eXtremeRAID PCI RAID Controllers - Version 2.2.5 for Linux 2.2.14 - Version 2.0.5 for Linux 2.0.38 + Version 2.2.6 for Linux 2.2.15 + Version 2.4.6 for Linux 2.4.0 PRODUCTION RELEASE - 23 January 2000 + 31 May 2000 Leonard N. Zubkoff Dandelion Digital @@ -18,30 +18,35 @@ Mylex, Inc. designs and manufactures a variety of high performance PCI RAID controllers. Mylex Corporation is located at 34551 Ardenwood Blvd., Fremont, -California 94555, USA and can be reached at 510/796-6100 or on the World Wide -Web at http://www.mylex.com. Mylex RAID Technical Support can be reached by -electronic mail at support@mylex.com (for eXtremeRAID 1100 and older DAC960 -models) or techsup@mylex.com (for AcceleRAID models), by voice at 510/608-2400, -or by FAX at 510/745-7715. Contact information for offices in Europe and Japan -is available on the Web site. +California 94555, USA and can be reached at 510.796.6100 or on the World Wide +Web at http://www.mylex.com. Mylex Technical Support can be reached by +electronic mail at support@mylex.com, by voice at 510.608.2400, or by FAX at +510.745.7715. Contact information for offices in Europe and Japan is available +on their Web site. The latest information on Linux support for DAC960 PCI RAID Controllers, as well as the most recent release of this driver, will always be available from my Linux Home Page at URL "http://www.dandelion.com/Linux/". The Linux DAC960 -driver supports all current DAC960 PCI family controllers including the -AcceleRAID models, as well as the eXtremeRAID 1100; see below for a complete -list. For simplicity, in most places this documentation refers to DAC960 -generically rather than explicitly listing all the models. - -Bug reports should be sent via electronic mail to "lnz@dandelion.com". Please -include with the bug report the complete configuration messages reported by the -driver at startup, along with any subsequent system messages relevant to the -controller's operation, and a detailed description of your system's hardware -configuration. - -Please consult the DAC960 RAID controller documentation for detailed -information regarding installation and configuration of the controllers. This -document primarily provides information specific to the Linux DAC960 support. +driver supports all current Mylex PCI RAID controllers including the new +eXtremeRAID 2000/3000 and AcceleRAID 352/170 models which have an entirely new +firmware interface from the older eXtremeRAID 1100, AcceleRAID 150/200/250, and +DAC960PJ/PG/PU/PD/PL. See below for a complete controller list as well as +minimum firmware version requirements. For simplicity, in most places this +documentation refers to DAC960 generically rather than explicitly listing all +the supported models. + +Driver bug reports should be sent via electronic mail to "lnz@dandelion.com". +Please include with the bug report the complete configuration messages reported +by the driver at startup, along with any subsequent system messages relevant to +the controller's operation, and a detailed description of your system's +hardware configuration. Driver bugs are actually quite rare; if you encounter +problems with disks being marked offline, for example, please contact Mylex +Technical Support as the problem is related to the hardware configuration +rather than the Linux driver. + +Please consult the RAID controller documentation for detailed information +regarding installation and configuration of the controllers. This document +primarily provides information specific to the Linux support. DRIVER FEATURES @@ -60,16 +65,18 @@ from Linux while the system is operational. The DAC960 driver is architected to support up to 8 controllers per system. -Each DAC960 controller can support up to 15 disk drives per channel, for a -maximum of 45 drives on a three channel controller. The drives installed on a -controller are divided into one or more "Drive Groups", and then each Drive -Group is subdivided further into 1 to 32 "Logical Drives". Each Logical Drive -has a specific RAID Level and caching policy associated with it, and it appears -to Linux as a single block device. Logical Drives are further subdivided into -up to 7 partitions through the normal Linux and PC disk partitioning schemes. -Logical Drives are also known as "System Drives", and Drive Groups are also -called "Packs". Both terms are in use in the Mylex documentation; I have -chosen to standardize on the more generic "Logical Drive" and "Drive Group". +Each DAC960 parallel SCSI controller can support up to 15 disk drives per +channel, for a maximum of 60 drives on a four channel controller; the fibre +channel eXtremeRAID 3000 controller supports up to 125 disk drives per loop for +a total of 250 drives. The drives installed on a controller are divided into +one or more "Drive Groups", and then each Drive Group is subdivided further +into 1 to 32 "Logical Drives". Each Logical Drive has a specific RAID Level +and caching policy associated with it, and it appears to Linux as a single +block device. Logical Drives are further subdivided into up to 7 partitions +through the normal Linux and PC disk partitioning schemes. Logical Drives are +also known as "System Drives", and Drive Groups are also called "Packs". Both +terms are in use in the Mylex documentation; I have chosen to standardize on +the more generic "Logical Drive" and "Drive Group". DAC960 RAID disk devices are named in the style of the Device File System (DEVFS). The device corresponding to Logical Drive D on Controller C is @@ -82,19 +89,41 @@ Drive and 3 bits for the partition. - SUPPORTED DAC960/DAC1100 PCI RAID CONTROLLERS + SUPPORTED DAC960/AcceleRAID/eXtremeRAID PCI RAID CONTROLLERS -The following list comprises the supported DAC960 and DAC1100 PCI RAID -Controllers as of the date of this document. It is recommended that anyone -purchasing a Mylex PCI RAID Controller not in the following table contact the -author beforehand to verify that it is or will be supported. The eXtremeRAID -2000, eXtremeRAID 3000, and AcceleRAID 352 have an entirely new firmware -interface and are not yet supported by this driver. +The following list comprises the supported DAC960, AcceleRAID, and eXtremeRAID +PCI RAID Controllers as of the date of this document. It is recommended that +anyone purchasing a Mylex PCI RAID Controller not in the following table +contact the author beforehand to verify that it is or will be supported. + +eXtremeRAID 3000 + 1 Wide Ultra-2/LVD SCSI channel + 2 External Fibre FC-AL channels + 233MHz StrongARM SA 110 Processor + 64 Bit 33MHz PCI (backward compatible with 32 Bit PCI slots) + 32MB/64MB ECC SDRAM Memory + +eXtremeRAID 2000 + 4 Wide Ultra-160 LVD SCSI channels + 233MHz StrongARM SA 110 Processor + 64 Bit 33MHz PCI (backward compatible with 32 Bit PCI slots) + 32MB/64MB ECC SDRAM Memory +AcceleRAID 352 + 2 Wide Ultra-160 LVD SCSI channels + 100MHz Intel i960RN RISC Processor + 64 Bit 33MHz PCI (backward compatible with 32 Bit PCI slots) + 32MB/64MB ECC SDRAM Memory + +AcceleRAID 170 + 1 Wide Ultra-160 LVD SCSI channel + 100MHz Intel i960RM RISC Processor + 16MB/32MB/64MB ECC SDRAM Memory + eXtremeRAID 1100 (DAC1164P) 3 Wide Ultra-2/LVD SCSI channels 233MHz StrongARM SA 110 Processor - 64 Bit PCI (backward compatible with 32 Bit PCI slots) + 64 Bit 33MHz PCI (backward compatible with 32 Bit PCI slots) 16MB/32MB/64MB Parity SDRAM Memory with Battery Backup AcceleRAID 250 (DAC960PTL1) @@ -135,6 +164,9 @@ Intel i960 RISC Processor 2MB/4MB/8MB/16MB/32MB DRAM Memory +For the eXtremeRAID 2000/3000 and AcceleRAID 352/170, firmware version 6.00-01 +or above is required. + For the eXtremeRAID 1100, firmware version 5.06-0-52 or above is required. For the AcceleRAID 250, 200, and 150, firmware version 4.06-0-57 or above is @@ -165,16 +197,16 @@ DRIVER INSTALLATION -This distribution was prepared for Linux kernel version 2.2.14 or 2.0.38. +This distribution was prepared for Linux kernel version 2.2.15 or 2.4.0. To install the DAC960 RAID driver, you may use the following commands, replacing "/usr/src" with wherever you keep your Linux kernel source tree: cd /usr/src - tar -xvzf DAC960-2.2.5.tar.gz (or DAC960-2.0.5.tar.gz) + tar -xvzf DAC960-2.2.6.tar.gz (or DAC960-2.4.6.tar.gz) mv README.DAC960 linux/Documentation mv DAC960.[ch] linux/drivers/block - patch -p0 < DAC960.patch (driver 2.0.5 only) + patch -p0 < DAC960.patch cd linux make config make depend Index: oldkernel/linux/Documentation/README.ext3 diff -u /dev/null linux/Documentation/README.ext3:1.1 --- /dev/null Mon Jul 31 21:15:04 2000 +++ linux/Documentation/README.ext3 Fri Jul 7 16:18:17 2000 @@ -0,0 +1,321 @@ +Journaling for ext2fs, alpha release 0.0.2d + +Released 22 March, 2000 +Stephen Tweedie + + +*** Nobody accepts any responsibility if the use of this code damages +*** your filesystem, corrupts data, creates a black hole or turns you +*** into a sperm whale. If I had a lawyer he'd probably have told me to +*** say this. You have been warned. + + +Changes in this release +----------------------- + +in 0.0.2d: + +Port forward to 2.2.15pre15 + +Fixed a missing lock_journal in journal_forget() (this could potentially +confuse the transaction engine when doing deletes under heavy memory +pressure). + +Merged in a small directory IO error handling fix from ext2 + +Included Andrea Arcangeli's elevator IO scheduling changes. This should +improve the performance of ext3 on non-SCSI devices substantially. + + +in 0.0.2c: + +Lots of fixes to the way we set the filesystem's NEEDS_RECOVERY flag. +It should basically get this right now. This flag is the thing that +prevents you from accidentally running e2fsck on a filesystem which +still needs kernel attention after a crash or unclean shutdown. + +Fixed releasing of the journal inode when unmounting a readonly ext3 +filesystem. + + +in 0.0.2b: + +Fixed a lockup when the VFS is trying to reclaim dirty inodes + + +in 0.0.2a: + +Fixed a nasty bug in truncate. If truncate overflowed the +transaction, the transaction state machine could get seriously +confused. + +0.0.2: + +Bug fixes. Lots of bug fixes. Buckets of them. + +It works on >1K blocksize filesystems. It recovers reliably. It +survives log wraps properly during recovery. mknod() works properly: it +will no longer turn /dev into a socket if used on your root filesystem. + +This one survives under load quite happily. A 50-client dbench run +completes reliably. + +So basically, this is the first usable ext3 release. + +Note that there are two major places where the implementation is not +complete: clean handling of all errors (in particular out-of-memory and +IO errors), and performance (there is still a lot of debugging code in +place, and all data is journaled as part of the testing cycle). But it +is usable: I've been running it on all of my laptop's filesystems for +over a week now. + + +Future Milestones +----------------- + +0.0.3 to deal gracefully with memory or disk failures. +0.0.4 to deal with metadata-only journaling +0.0.5 to disable the extra debugging code and add performance tuning +0.1 to be released once all of that is solid. + + +Introduction +------------ + +What is journaling? + + * It means you don't have to fsck after a crash. Basically. + +What works? + + * Journaling to a journal file on the journaled filesystem + + * Automatic recover when the filesystem is remounted + + * All VFS operations (including quota) should be journaled + + * Add data updates are also journaled + + +What is left to be done? + + * Journaling of metadata only. Currently everything is journaled, + incuding data, resulting in a performance drop as all data gets + written twice. + + Journaling of metadata only is supported but is not enabled. It + turns out to involve several extra complications in the journaling + buffer state, so I'm testing the simpler case first to get that + reliable on its own. + + * Journaling to an off-filesystem device, eg. NVRam + + * Automatic reclamation of unlink but still-referenced files on + reboot + + * Error recovery. You will see that the source is marked quite + carefully where there are potential IO or memory allocation errors + which can disrupt things, but the code to respond to that (either + to remount the fs readonly or to abort and panic) remains to be + added. + + * Decent documentation! + + * A few internal cleanups: migrating the extra buffer_head fields to + a separate jfs_buffer_info field in particular. + + * e2fsprogs tools. e2fsck needs to know about the journal (but see + below). + +How to apply +------------ + +This README should have come with two diffs for kernel version +linux-2.2.15pre15: + + -rw-rw-r-- 1 sct sct 218556 Mar 23 18:19 linux-2.2.15pre15.kdb.diff + -rw-rw-r-- 1 sct sct 369304 Mar 23 18:25 linux-2.2.15pre15.ext3.diff + +and for the "2.2.14-5" kernel distributed with Red Hat 6.2: + + -rw-rw-r-- 1 sct sct 369443 Mar 29 20:12 linux-2.2.14-5.ext3.diff + -rw-rw-r-- 1 sct sct 218645 Mar 29 20:06 linux-2.2.14-5.kdb.diff + +as well as an incremental diff to take ext3-0.0.2c up to 0.0.2d if you +would rather continue running ext3 on an existing (Red Hat 6.1 or +linux-2.2.13) kernel: + + -rw-rw-r-- 1 sct sct 18512 Mar 22 15:38 0.0.2c-to-0.0.2d.diff + +The first diff of each set is copy of SGI's kdb kernel debugger patches. +Apply this first if you want kdb. The second patch is the ext3 +filesystem. If you apply this without the kdb diff, you will get a +couple of rejects (the ext3 diff includes a kdb module for interrogating +jfs data structures) --- ignore those. + +If you can't apply kernel patches, stop reading this now. Right now! + +Now, configure the kernel, saying YES to "Enable Second extended fs +development code" (I *assume* you want it!), and build it. + + +What next? +---------- + +Now, you want to make a journaled filesystem (recommended) or journal an +existing one (for the exceptionally stupid/brave). Great. Go right +ahead, make a new ext2 filesystem if you need to, and mount the +filesystem you want to journal. (Except see below for special +instructions for the root filesystem). + +Be aware that the jfs patch does _not_ change the ext2 code. Rather, it +makes a copy of ext2 called ext3, and all the fancy footwork takes place +in that. You don't have to run ext3 on all your valuable filesystems: +just use it on the throwaway ones. + +Now, create a journal file. I don't know how big it should be yet: the +rules of thumb have yet to be established! However, try (say) 2MB for a +small filesystem on a 486; maybe up to 30MB on a big 18G 10krpm Cheetah. +Or whatever you want. You need at least 1024 blocks for the journal, so +on a filesystem with a blocksize of 4k the minimum journal is 4MB. + +You'll need to make sure that the file is preallocated, so use something +like: + + dd if=/dev/zero of=/mnt/sparefs/journal.dat bs=1k count=10000 + +assuming you want a 10MB journal on a 1k ext2 filesystem mounted on +/mnt/sparefs. You need to find the journal inode's inode number, too: + + ls -i /mnt/sparefs/journal.dat + +For a newly created filesystem, this will probably show + + 12 journal.dat + +OK, 12 is the expected number for a clean fs. You might want to do a +"chmod 400 journal.dat" right now to make sure that nobody will be +able to poke around in the journal once it is running (don't worry, +ext3 will be able to write to the journal even if you specify a +read-only access mode for the file). + +Now, umount as ext2. Take a deep breath. Now mount as ext3, giving it +the inode number of the file to be created as a journal: + + mount -t ext3 /dev/sdb2 /mnt/sparefs -o journal=12 + +Bingo. That's it. Enjoy! + +Note: The "-o journal=" bit is only necessary when creating a new +journal the first time you mount a filesystem as ext3. Do _not_ add +it to /etc/fstab: it will do no good at all there. + +Warning: the journaling will get _seriously_ confused if you try to +delete the journal file. Future versions of ext3 will protect this +automatically, but for now you probably want to make it into an +immutable file to guard it: + + chattr +i /mnt/sparefs/journal.dat + +Setting the immutable bit will not prevent the filesystem from writing +to the journal internally, but it will stop any other processes from +modifying or removing the journal. + + +Creating a journal on your root filesystem +------------------------------------------ + +How do you add the "-o journal=" to the mount options for the +root filesystem? Obviously, / gets mounted for you by the kernel, so +you can't add it on the mount command. However, the ext3 comes with a +new kernel boot option, "rootflags=", which lets you specify any +options you want to be used when / is mounted. + +To create the journal on your root filesystem, then, you want to boot +once with the rootflags option. When creating the journal, it is also +important to mount the root in read-write mode. So, the kernel +command line options you want to add will look like this: + + rw rootflags=journal=12 + +if your journal.dat is inode number 12. If you are using LILO as your +boot loader, you can either specify these options at the boot prompt, +or you can force LILO to add new temporary kernel options just for the +next boot only: if the LILO kernel image is called "ext3", then you +can run + + /sbin/lilo -R ext3 rw rootflags=journal=12 + +and reboot to get the kernel to build your journal on the root +filesystem. + + +How to fsck +----------- + +Right now, e2fsck will reject an uncleanly unmounted ext3 partition. +However, if you umount an ext3 filesystem cleanly, you can fsck it using +a version of fsck which understands the journal flags: you'll want +e2fsprogs-1.17 or later, which you can get from the ext2 web pages at + + http://web.mit.edu/tytso/www/linux/ext2.html + +You can now run e2fsck quite happily on the filesystem, *as long as the +filesystem was unmounted cleanly*. If it wasn't, then you'll need to +get the kernel code to recover the journal from the disk by mounting the +filesystem (even a readonly mount will cause a journal recovery to +happen) and umounting it again (or, for the root filesystem, remounting +it readonly with "mount -o remount,ro /"). + +However, the whole point is that you don't HAVE to run e2fsck after a +crash, right? + + + +How to move back from ext3 to ext2 +---------------------------------- + +It's quite easy. If you unmount an ext3 filesystem cleanly, then you +can remount it as ext2 without any other commands. If you crash and are +left with an unclean ext3 filesystem, on the other hand, the filesystem +will prevent you from mounting it as ext2: it is not safe to mount it +until you have recovered the journal, and the only way to do that for +now is to mount it as ext3. + +However, if for any reason you do have an ext3 filesystem which you want +to convert permanently back to ext2, whether it was cleanly unmounted or +not, you can use "debugfs" from e2fsprogs-1.17 or later to do it. +First, run debugfs and open the filesystem (the -w flag means open for +write, and the -f flag forces it to open the filesystem even if there +are unknown journal flags set): + + [root@sarek /root]# debugfs + debugfs 1.18, 11-Nov-1999 for EXT2 FS 0.5b, 95/08/09 + debugfs: open -f -w /dev/sdb1 + +Now, use "features" to see which feature bits are set on the filesystem: + + debugfs: features + Filesystem features: has_journal filetype sparse_super + +We want to clear the journal bits, then we can quit: + + debugfs: features -has_journal -needs_recovery + Filesystem features: filetype sparse_super + debugfs: quit + [root@sarek /root]# debugfs + +That's it! + + +Known Bugs +---------- + +Lots of stuff is missing, in particular the ext3-aware fsck tools with +built-in filesystem recovery. All of the other bugs are currently +unknown. Good luck finding them. + + + +Enjoy. +--Stephen. Index: oldkernel/linux/Documentation/readme.3ware diff -u /dev/null linux/Documentation/readme.3ware:1.1 --- /dev/null Mon Jul 31 21:15:04 2000 +++ linux/Documentation/readme.3ware Fri Jul 7 16:18:17 2000 @@ -0,0 +1,270 @@ +Linux Installation Instructions (Beta release) + +The following instructions describe how to install Red Hat Linux 6.1 so +that you can boot your system off a disk or disk array installed on the +3ware controller. + +If you are installing the controller on a system that already has linux +installed on a unit connected to the system, follow the instructions in +Appendix A: Installing the controller on systems that boot from another +device. + +If you are installing the controller using a kit downloaded from the +3ware website, your must first create a 3ware linux software diskette +using the instructions in Appendix B: Creating a 3ware linux software +diskette from a www.3ware.com download kit. + +Materials required: +· 3ware Software Installation diskette (contains driver, 3DM utility, + and driver source code) +· Red Hat 6.1 boot diskette +· Red Hat 6.1 Linux Installation CD-ROM + +Set the boot order using the BIOS Setup utility +1. Using your system’s BIOS Setup utility, set your floppy drive (i.e. +removable device) as first device in the boot order since you will be using +floppy diskette to install linux. + +2. Since you will be booting off of the 3ware controller once the linux +installation is complete, make the controller the second device in the boot +order in preparation for future booting. If you have other bootable devices +installed in your system, it is particularly important that the controller +precedes them in the boot order. + +Note: There have been test systems where an IDE drive connected to the +motherboard interfered with using the 3ware controller as a boot device. +Disconnecting the IDE drive when installing linux will eliminate this problem. +After linux is installed, the drive can be reconnected. We are investigating +a better solution. + +Create disk arrays using the BIOS utility +1. During the boot phase, wait until you see a message similar to the +following appear: + +3ware Storage Controller BIOS 1.02 + +Port 0 Maxtor DiamondMax Plus 6800 20.5 GB +Port 1 Maxtor DiamondMax Plus 6800 20.5 GB +Port 2 Maxtor DiamondMax Plus 6800 20.5 GB +Port 3 Maxtor DiamondMax Plus 6800 20.5 GB + +*** Press to access 3ware Configuration Screen *** + +2. As soon as it appears, press ALT-3 to bring up the 3ware Disk Array +Configuration utility. + +3. Use the Disk Array Configuration utility to create disk arrays as +needed. For detailed instructions, see the Using the 3ware Disk Array +Configuration Utility section of the 3ware Storage Controller User Guide. +You may use either a disk array or independent (individual) disk as your boot +device. + +Boot the system with both the Linux diskette and CD + +1. Insert Linux Boot Disk into the floppy drive, and insert the Red Hat +Linux Installation CD into the CD-ROM. + +2. Restart your computer. + +3. When the Welcome to Red Hat 6.1 screen appears, type expert at the +boot prompt. + + boot: expert + +Install the driver +1. After loading a number of files, you will be asked to Insert your driver +disk. Remove the boot diskette from the floppy, insert the 3ware linux driver +diskette, and press OK. + +2. Select the proper language and keyboard types for your locality. + +3. If asked for what type of media, select Local CD-ROM since you are +installing from CD-ROM. +4. When asked if you would like to specify a special device driver, select +Add Device, and press Return. +5. When asked what kind of device you would like to add, select SCSI. +6. Scroll down the list and select the 3ware Storage Controller. +7. The system will inform you that it has found a 3ware Storage Controller. +8. Installing the driver will conclude with a message: I have found the +following devices in your system and should list the 3ware Storage Controller. +Unless you have other third party devices to install in your system, select Done. + +Complete the normal linux installation + +Continue with the Red Hat Linux 6.1 installation. Refer to the Red Hat +documentation for questions or problems. +Install the 3DM disk management utility + +The 3DM utility allows you to view status and version information about your +3ware storage controller. When a window is left open with 3DM running, it +can also alert you when a disk array needs maintenance by beeping and displaying +alert messages. + +1. Insert the 3ware Software Installation diskette for Linux into the floppy +drive. + +2. Mount the floppy drive: + +mount -t msdos /dev/fd0 /mnt/floppy + +3. Copy the 3DM executable file into a directory on your system, such as /usr/local/bin. + +cp /mnt/floppy/3dm /usr/local/bin + +4. Unmount the floppy drive. + +umount /mnt/floppy + +5. Ensure that 3DM has executable permissions. If not, change the permissions with + +chmod u+x /usr/local/bin/3dm + +6. Login as root on the system console and run 3DM from a terminal window: + +/usr/local/bin/3dm + +7. To run 3DM in quiet mode where it does not beep on disk failure: + +/usr/local/bin/3dm -q + +8. To capture output in a log file. + +/usr/local/bin/3dm > logfile + + +If you have any questions, please feel free to visit our website at www.3ware.com +or call us at 877-88-3ware (877-883-9273) or direct at (650) 614 - 3439. + + +Appendix A + +Installing the controller on systems that boot from another device. +Materials required: +· 3ware software diskette (contains 3ware driver and 3DM management utility) + +Create disk arrays using the BIOS utility +1. During the boot phase, wait until you see a message similar to the +following appear: + +3ware Storage Controller BIOS 1.02 + +Port 0 Maxtor DiamondMax Plus 6800 20.5 GB +Port 1 Maxtor DiamondMax Plus 6800 20.5 GB +Port 2 Maxtor DiamondMax Plus 6800 20.5 GB +Port 3 Maxtor DiamondMax Plus 6800 20.5 GB + +*** Press to access 3ware Configuration Screen *** + +2. As soon as it appears, press ALT-3 to bring up the 3ware Disk Array +Configuration utility (Figure 3). + +3. Use the Disk Array Configuration utility to create disk arrays as +needed. For detailed instructions, see the Using the 3ware Disk Array +Configuration Utility section of the 3ware Storage Controller User Guide. +You may use either a disk array or independent (individual) disk as your +boot device. Install the driver. + +Case 1: Your system runs Red Hat 6.1 (Kernel 2.2.12-20) + +1. Mount the floppy drive and copy the driver file into a working directory. + +mount -t msdos /dev/fd0 /mnt/floppy +cp /mnt/floppy/3w-xxxx.o /lib/modules/2.2.12-20/scsi +/sbin/insmod /lib/modules/2.2.12-20/scsi/3w-xxxx.o + + +Case 2: Your system runs Red Hat 6.1 (Kernel 2.2.12-20) and is an SMP system (multi-processor) + +1. Mount the floppy drive and copy the driver file into a working directory. + +mount -t msdos /dev/fd0 /mnt/floppy +cp /mnt/floppy/3w-xxxx.smp /lib/modules/2.2.12-20/scsi/3w-xxxx.o +/sbin/insmod /lib/modules/2.2.12-20/scsi/3w-xxxx.o + + +Case 3: Your system runs a version that is NOT Red Hat 6.1 (Kernel 2.2.12-20) + +1. Mount the floppy drive and copy the driver source file into a working +directory, compile and load it. + +cd workingdir +mount -t msdos /dev/fd0 /mnt/floppy +cp /mnt/floppy/3w-xxxx.tgz . +tar zxf 3w-xxxx.tgz +cd driver +make +/sbin/insmod 3w-xxxx.o + +Note: If you are using an SMP linux system, modify the Makefile to include +the flag -D_SMP_ + +Install the 3DM disk management utility + +The 3DM utility allows you to view status and version information about your +3ware storage controller. When a window is left open with 3DM running, it can +also alert you when a disk array needs maintenance by beeping and displaying +alert messages. + +1. Insert the 3ware Software Installation diskette for Linux into the +floppy drive. + +2. Mount the floppy drive: + +mount -t msdos /dev/fd0 /mnt/floppy + +3. Copy the 3DM executable file into a directory on your system, such as /usr/local/bin. + +cp /mnt/floppy/3dm /usr/local/bin + +4. Unmount the floppy drive. + +umount /mnt/floppy + +5. Ensure that 3DM has executable permissions. If not, change the +permissions with + +chmod u+x /usr/local/bin/3dm + +6. Login as root on the system console and run 3DM from a terminal window: + +/usr/local/bin/3dm + +7. To run 3DM in quiet mode where it does not beep on disk failure: + +/usr/local/bin/3dm -q + +8. To capture output in a log file. + +/usr/local/bin/3dm > logfile + + + +Appendix B +Creating a 3ware software diskette for linux from a www.3ware.com download kit + +From www.3ware.com, download the linux software kit. + +If the file was downloaded onto a linux system, insert a blank floppy diskette +and issue the following commands: + +unzip filename.zip +cd driver +mkfs -t msdos /dev/fd0 +mount -t msdos /dev/fd0 /mnt/floppy +cp * /mnt/floppy +ummount /mnt/floppy + +Where filename is the base name of the file downloaded (e.g. linux_driver.zip) + +If the file was downloaded onto a Windows system insert a blank floppy diskette +and issue the following commands: + +pkunzip -d filename.zip (or use WinZip) +cd driver +format a: +copy * a: + +Where filename is the base name of the file downloaded (e.g. linux_driver.zip) + + + Index: oldkernel/linux/arch/alpha/config.in diff -u linux/arch/alpha/config.in:1.1.1.1 linux/arch/alpha/config.in:1.2 --- linux/arch/alpha/config.in:1.1.1.1 Wed May 31 12:33:53 2000 +++ linux/arch/alpha/config.in Fri Jul 7 15:36:41 2000 @@ -157,7 +157,7 @@ -o "$CONFIG_ALPHA_NORITAKE" = "y" -o "$CONFIG_ALPHA_PC164" = "y" \ -o "$CONFIG_ALPHA_LX164" = "y" -o "$CONFIG_ALPHA_SX164" = "y" \ -o "$CONFIG_ALPHA_DP264" = "y" -o "$CONFIG_ALPHA_RAWHIDE" = "y" \ - -o "$CONFIG_ALPHA_EIGER" = "y" ] + -o "$CONFIG_ALPHA_EIGER" = "y" -o "$CONFIG_ALPHA_NAUTILUS" = "y" ] then bool 'Use SRM as bootloader' CONFIG_ALPHA_SRM if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then Index: oldkernel/linux/arch/alpha/kernel/alpha_ksyms.c diff -u linux/arch/alpha/kernel/alpha_ksyms.c:1.1.1.1 linux/arch/alpha/kernel/alpha_ksyms.c:1.2 --- linux/arch/alpha/kernel/alpha_ksyms.c:1.1.1.1 Wed May 31 12:33:53 2000 +++ linux/arch/alpha/kernel/alpha_ksyms.c Fri Jul 7 15:36:41 2000 @@ -54,6 +54,7 @@ EXPORT_SYMBOL(disable_irq_nosync); EXPORT_SYMBOL(screen_info); EXPORT_SYMBOL(perf_irq); +EXPORT_SYMBOL(init_mm); /* platform dependent support */ EXPORT_SYMBOL(_inb); @@ -160,6 +161,7 @@ EXPORT_SYMBOL(flush_tlb_mm); EXPORT_SYMBOL(flush_tlb_page); EXPORT_SYMBOL(flush_tlb_range); +EXPORT_SYMBOL(smp_imb); EXPORT_SYMBOL(cpu_data); EXPORT_SYMBOL(cpu_number_map); EXPORT_SYMBOL(global_bh_lock); Index: oldkernel/linux/arch/alpha/kernel/smp.c diff -u linux/arch/alpha/kernel/smp.c:1.1.1.1 linux/arch/alpha/kernel/smp.c:1.2 --- linux/arch/alpha/kernel/smp.c:1.1.1.1 Wed May 31 12:33:53 2000 +++ linux/arch/alpha/kernel/smp.c Fri Jul 7 15:36:41 2000 @@ -839,6 +839,22 @@ } static void +ipi_imb(void *ignored) +{ + imb(); +} + +void +smp_imb(void) +{ + /* Must wait other processors to flush their icache before continue. */ + if (smp_call_function(ipi_imb, NULL, 1, 1)) + printk(KERN_CRIT "smp_imb: timed out\n"); + + imb(); +} + +static void ipi_flush_tlb_all(void *ignored) { tbia(); Index: oldkernel/linux/arch/alpha/kernel/sys_nautilus.c diff -u linux/arch/alpha/kernel/sys_nautilus.c:1.2 linux/arch/alpha/kernel/sys_nautilus.c:1.3 --- linux/arch/alpha/kernel/sys_nautilus.c:1.2 Thu Jun 1 15:17:55 2000 +++ linux/arch/alpha/kernel/sys_nautilus.c Fri Jul 7 15:36:41 2000 @@ -69,6 +69,11 @@ { STANDARD_INIT_IRQ_PROLOG; + if (alpha_using_srm) { + alpha_mv.device_interrupt = srm_device_interrupt; + alpha_mv.kill_arch = generic_kill_arch; + } + enable_irq(2); /* enable cascade */ disable_irq(8); } @@ -111,7 +116,7 @@ case LINUX_REBOOT_CMD_RESTART: { int v; - irongate_hose_write_config_byte(0, 0x07<<3, 0x43, &v, 0); + irongate_hose_read_config_byte(0, 0x07<<3, 0x43, &v, 0); irongate_hose_write_config_byte(0, 0x07<<3, 0x43, v | 0x80, 0); outb(1, 0x92); outb(0, 0x92); Index: oldkernel/linux/arch/i386/config.in diff -u linux/arch/i386/config.in:1.4 linux/arch/i386/config.in:1.5 --- linux/arch/i386/config.in:1.4 Thu Jun 1 17:06:03 2000 +++ linux/arch/i386/config.in Fri Jul 7 15:36:41 2000 @@ -33,10 +33,9 @@ fi if [ "$CONFIG_M686FX" = "y" -o "$CONFIG_M686" = "y" ]; then define_bool CONFIG_X86_GOOD_APIC y - bool 'Disable the PII/PIII Serial Number at bootup' CONFIG_X86_PN_OFF - bool 'Enable PII/PIII Extended/Fast FPU save and restore support' CONFIG_X86_FX - bool 'Enable CPU Specific (MMX/MMX2) Optimization Functions' CONFIG_X86_CPU_OPTIMIZATIONS fi +bool 'Disable the PII/PIII Serial Number at bootup' CONFIG_X86_PN_OFF +bool 'Enable PII/PIII Extended/Fast FPU save and restore support' CONFIG_X86_FX bool 'Math emulation' CONFIG_MATH_EMULATION bool 'MTRR (Memory Type Range Register) support' CONFIG_MTRR bool 'Symmetric multi-processing support' CONFIG_SMP Index: oldkernel/linux/arch/i386/defconfig diff -u linux/arch/i386/defconfig:1.3 linux/arch/i386/defconfig:1.4 --- linux/arch/i386/defconfig:1.3 Thu Jun 1 15:05:19 2000 +++ linux/arch/i386/defconfig Fri Jul 7 15:36:41 2000 @@ -5,41 +5,36 @@ # # Code maturity level options # -# CONFIG_EXPERIMENTAL is not set +CONFIG_EXPERIMENTAL=y # # Processor type and features # -# CONFIG_M386 is not set +CONFIG_M386=y # CONFIG_M486 is not set # CONFIG_M586 is not set # CONFIG_M586TSC is not set -CONFIG_M686=y -CONFIG_X86_WP_WORKS_OK=y -CONFIG_X86_INVLPG=y -CONFIG_X86_BSWAP=y -CONFIG_X86_POPAD_OK=y -CONFIG_X86_TSC=y -CONFIG_X86_GOOD_APIC=y +# CONFIG_M686 is not set CONFIG_X86_PN_OFF=y CONFIG_X86_FX=y -CONFIG_X86_CPU_OPTIMIZATIONS=y -# CONFIG_MATH_EMULATION is not set -# CONFIG_MTRR is not set -CONFIG_SMP=y +# CONFIG_X86_CPU_OPTIMIZATIONS is not set CONFIG_1GB=y # CONFIG_2GB is not set +CONFIG_MATH_EMULATION=y +CONFIG_MTRR=y +CONFIG_SMP=y # # Loadable module support # CONFIG_MODULES=y -# CONFIG_MODVERSIONS is not set -# CONFIG_KMOD is not set +CONFIG_MODVERSIONS=y +CONFIG_KMOD=y # # General setup # +CONFIG_BIGMEM=y CONFIG_NET=y CONFIG_PCI=y # CONFIG_PCI_GOBIOS is not set @@ -48,24 +43,38 @@ CONFIG_PCI_BIOS=y CONFIG_PCI_DIRECT=y CONFIG_PCI_QUIRKS=y +# CONFIG_PCI_OPTIMIZE is not set CONFIG_PCI_OLD_PROC=y # CONFIG_MCA is not set # CONFIG_VISWS is not set CONFIG_X86_IO_APIC=y CONFIG_X86_LOCAL_APIC=y CONFIG_SYSVIPC=y -# CONFIG_BSD_PROCESS_ACCT is not set +CONFIG_BSD_PROCESS_ACCT=y CONFIG_SYSCTL=y -CONFIG_BINFMT_AOUT=y +CONFIG_BINFMT_AOUT=m CONFIG_BINFMT_ELF=y -CONFIG_BINFMT_MISC=y -# CONFIG_PARPORT is not set -# CONFIG_APM is not set +CONFIG_BINFMT_MISC=m +CONFIG_BINFMT_JAVA=m +CONFIG_PARPORT=m +CONFIG_PARPORT_PC=m +# CONFIG_PARPORT_OTHER is not set +CONFIG_APM=y +# CONFIG_APM_IGNORE_USER_SUSPEND is not set +# CONFIG_APM_DO_ENABLE is not set +# CONFIG_APM_CPU_IDLE is not set +# CONFIG_APM_DISPLAY_BLANK is not set +CONFIG_APM_POWER_OFF=y +# CONFIG_APM_IGNORE_MULTIPLE_SUSPEND is not set +# CONFIG_APM_IGNORE_SUSPEND_BOUNCE is not set +CONFIG_APM_RTC_IS_GMT=y +# CONFIG_APM_ALLOW_INTS is not set # # Plug and Play support # -# CONFIG_PNP is not set +CONFIG_PNP=y +CONFIG_PNP_PARPORT=m # # Block devices @@ -78,70 +87,157 @@ # # CONFIG_BLK_DEV_HD_IDE is not set CONFIG_BLK_DEV_IDEDISK=y -CONFIG_BLK_DEV_IDECD=y -# 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=y -# CONFIG_BLK_DEV_CMD640_ENHANCED is not set -CONFIG_BLK_DEV_RZ1000=y +CONFIG_BLK_DEV_IDECD=m +CONFIG_BLK_DEV_IDETAPE=m +CONFIG_BLK_DEV_IDEFLOPPY=m +CONFIG_BLK_DEV_IDESCSI=m +# CONFIG_BLK_DEV_CMD640 is not set +# CONFIG_BLK_DEV_RZ1000 is not set CONFIG_BLK_DEV_IDEPCI=y CONFIG_BLK_DEV_IDEDMA=y # CONFIG_BLK_DEV_OFFBOARD is not set CONFIG_IDEDMA_AUTO=y +# CONFIG_BLK_DEV_OPTI621 is not set +# CONFIG_BLK_DEV_TRM290 is not set +# CONFIG_BLK_DEV_NS87415 is not set +# CONFIG_BLK_DEV_VIA82C586 is not set +# CONFIG_BLK_DEV_CMD646 is not set # CONFIG_IDE_CHIPSETS is not set # # Additional Block Devices # -# CONFIG_BLK_DEV_LOOP is not set -# CONFIG_BLK_DEV_NBD is not set -CONFIG_BLK_DEV_MD=y +CONFIG_BLK_DEV_LOOP=m +CONFIG_BLK_DEV_NBD=m +# CONFIG_BLK_DEV_MD is not set CONFIG_AUTODETECT_RAID=y -CONFIG_MD_TRANSLUCENT=y -CONFIG_MD_LINEAR=y -CONFIG_MD_STRIPED=y -CONFIG_MD_MIRRORING=y -CONFIG_MD_RAID5=y -CONFIG_MD_BOOT=y -CONFIG_BLK_DEV_HSM=y -# CONFIG_BLK_DEV_RAM is not set -# CONFIG_BLK_DEV_XD is not set -CONFIG_PARIDE_PARPORT=y -# CONFIG_PARIDE is not set +CONFIG_MD_LINEAR=m +CONFIG_MD_STRIPED=m +CONFIG_MD_MIRRORING=m +CONFIG_MD_RAID5=m +# CONFIG_MD_TRANSLUCENT is not set +# CONFIG_MD_HSM is not set +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_INITRD=y +CONFIG_BLK_DEV_XD=m +CONFIG_BLK_DEV_DAC960=y +CONFIG_BLK_DEV_3WARE=y +CONFIG_PARIDE_PARPORT=m +CONFIG_PARIDE=m + +# +# Parallel IDE high-level drivers +# +CONFIG_PARIDE_PD=m +CONFIG_PARIDE_PCD=m +CONFIG_PARIDE_PF=m +CONFIG_PARIDE_PT=m +CONFIG_PARIDE_PG=m + +# +# Parallel IDE protocol modules +# +CONFIG_PARIDE_ATEN=m +CONFIG_PARIDE_BPCK=m +CONFIG_PARIDE_COMM=m +CONFIG_PARIDE_DSTR=m +CONFIG_PARIDE_FIT2=m +CONFIG_PARIDE_FIT3=m +CONFIG_PARIDE_EPAT=m +CONFIG_PARIDE_EPIA=m +CONFIG_PARIDE_FRIQ=m +CONFIG_PARIDE_FRPW=m +CONFIG_PARIDE_KBIC=m +CONFIG_PARIDE_KTTI=m +CONFIG_PARIDE_ON20=m +CONFIG_PARIDE_ON26=m +CONFIG_BLK_CPQ_DA=m # CONFIG_BLK_DEV_HD is not set # # Networking options # CONFIG_PACKET=y -# CONFIG_NETLINK is not set -# CONFIG_FIREWALL is not set -# CONFIG_FILTER is not set +CONFIG_NETLINK=y +CONFIG_RTNETLINK=y +CONFIG_NETLINK_DEV=y +CONFIG_FIREWALL=y +CONFIG_FILTER=y 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 is not set +CONFIG_IP_FIREWALL=y +CONFIG_IP_FIREWALL_NETLINK=y +CONFIG_NETLINK_DEV=y +CONFIG_IP_TRANSPARENT_PROXY=y +CONFIG_IP_MASQUERADE=y + +# +# Protocol-specific masquerading support will be built as modules. +# +# CONFIG_IP_MASQUERADE_UDP_LOOSE is not set +CONFIG_IP_MASQUERADE_ICMP=y + +# +# Protocol-specific masquerading support will be built as modules. +# +CONFIG_IP_MASQUERADE_MOD=y +CONFIG_IP_MASQUERADE_IPAUTOFW=m +CONFIG_IP_MASQUERADE_IPPORTFW=m +CONFIG_IP_MASQUERADE_MFW=m +CONFIG_IP_MASQUERADE_VS=y +CONFIG_IP_MASQUERADE_VS_TAB_BITS=12 +CONFIG_IP_MASQUERADE_VS_RR=m +CONFIG_IP_MASQUERADE_VS_WRR=m +CONFIG_IP_MASQUERADE_VS_LC=m +CONFIG_IP_MASQUERADE_VS_WLC=m # 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_SYN_COOKIES is not set +CONFIG_NET_IPIP=m +CONFIG_NET_IPGRE=m +CONFIG_NET_IPGRE_BROADCAST=y +# CONFIG_IP_MROUTE is not set +CONFIG_IP_ALIAS=y +# CONFIG_ARPD is not set +CONFIG_SYN_COOKIES=y # # (it is safe to leave these untouched) # -# CONFIG_INET_RARP is not set +CONFIG_INET_RARP=m CONFIG_SKB_LARGE=y +# CONFIG_IPV6 is not set # # # -# CONFIG_IPX is not set -# CONFIG_ATALK is not set +CONFIG_IPX=m +# CONFIG_IPX_INTERN is not set +# CONFIG_SPX is not set +CONFIG_ATALK=m +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_BRIDGE is not set +# CONFIG_LLC is not set +# CONFIG_ECONET is not set +CONFIG_WAN_ROUTER=m +# CONFIG_NET_FASTROUTE is not set +# CONFIG_NET_HW_FLOWCONTROL is not set +# CONFIG_CPU_IS_SLOW is not set + +# +# QoS and/or fair queueing +# +# CONFIG_NET_SCHED is not set # +# Telephony Support +# +CONFIG_PHONE=m +CONFIG_PHONE_IXJ=m + +# # SCSI support # CONFIG_SCSI=y @@ -150,102 +246,241 @@ # SCSI support type (disk, tape, CD-ROM) # CONFIG_BLK_DEV_SD=y -# CONFIG_CHR_DEV_ST is not set -# CONFIG_BLK_DEV_SR is not set -# CONFIG_CHR_DEV_SG is not set +CONFIG_CHR_DEV_ST=y +CONFIG_BLK_DEV_SR=y +CONFIG_BLK_DEV_SR_VENDOR=y +CONFIG_CHR_DEV_SG=m # # Some SCSI devices (e.g. CD jukebox) support multiple LUNs # -CONFIG_SCSI_MULTI_LUN=y +# CONFIG_SCSI_MULTI_LUN is not set CONFIG_SCSI_CONSTANTS=y -# CONFIG_SCSI_LOGGING is not set +CONFIG_SCSI_LOGGING=y # # SCSI low-level drivers # -# CONFIG_SCSI_7000FASST is not set -# CONFIG_SCSI_ACARD is not set -# CONFIG_SCSI_AHA152X is not set -# CONFIG_SCSI_AHA1542 is not set -# CONFIG_SCSI_AHA1740 is not set -# CONFIG_SCSI_AIC7XXX 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_DTC3280 is not set -# CONFIG_SCSI_EATA is not set +CONFIG_SCSI_7000FASST=m +CONFIG_SCSI_ACARD=m +CONFIG_SCSI_AHA152X=m +CONFIG_SCSI_AHA1542=m +CONFIG_SCSI_AHA1740=m +CONFIG_SCSI_AIC7XXX=y +CONFIG_AIC7XXX_TCQ_ON_BY_DEFAULT=y +CONFIG_AIC7XXX_CMDS_PER_DEVICE=8 +CONFIG_AIC7XXX_PROC_STATS=y +CONFIG_AIC7XXX_RESET_DELAY=5 +CONFIG_SCSI_IPS=m +CONFIG_SCSI_ADVANSYS=m +CONFIG_SCSI_IN2000=m +CONFIG_SCSI_AM53C974=m +CONFIG_SCSI_MEGARAID=m +CONFIG_SCSI_BUSLOGIC=m +# CONFIG_SCSI_OMIT_FLASHPOINT is not set +CONFIG_SCSI_DTC3280=m +CONFIG_SCSI_EATA=y +CONFIG_SCSI_EATA_TAGGED_QUEUE=y +# CONFIG_SCSI_EATA_LINKED_COMMANDS is not set +CONFIG_SCSI_EATA_MAX_TAGS=16 # CONFIG_SCSI_EATA_DMA is not set -# CONFIG_SCSI_EATA_PIO is not set -# CONFIG_SCSI_FUTURE_DOMAIN is not set -# CONFIG_SCSI_GDTH is not set -# CONFIG_SCSI_GENERIC_NCR5380 is not set -# CONFIG_SCSI_INITIO is not set -# CONFIG_SCSI_INIA100 is not set -# CONFIG_SCSI_NCR53C406A is not set -# CONFIG_SCSI_SYM53C416 is not set -# CONFIG_SCSI_NCR53C7xx is not set -# CONFIG_SCSI_NCR53C8XX is not set +CONFIG_SCSI_EATA_PIO=m +CONFIG_SCSI_FUTURE_DOMAIN=m +CONFIG_SCSI_GDTH=y +CONFIG_SCSI_GENERIC_NCR5380=m +# CONFIG_SCSI_GENERIC_NCR53C400 is not set +CONFIG_SCSI_G_NCR5380_PORT=y +# CONFIG_SCSI_G_NCR5380_MEM is not set +CONFIG_SCSI_INITIO=m +CONFIG_SCSI_INIA100=m +CONFIG_SCSI_PPA=m +CONFIG_SCSI_IMM=m +# CONFIG_SCSI_IZIP_EPP16 is not set +# CONFIG_SCSI_IZIP_SLOW_CTR is not set +CONFIG_SCSI_NCR53C406A=m +CONFIG_SCSI_SYM53C416=m +CONFIG_SCSI_SIM710=m +CONFIG_SCSI_SIM710=m +CONFIG_SCSI_NCR53C7xx=m +CONFIG_SCSI_SIM710=m +# CONFIG_SCSI_NCR53C7xx_sync is not set +CONFIG_SCSI_SIM710=m +CONFIG_SCSI_NCR53C7xx_FAST=y +CONFIG_SCSI_SIM710=m +CONFIG_SCSI_NCR53C7xx_DISCONNECT=y +CONFIG_SCSI_NCR53C8XX=y CONFIG_SCSI_SYM53C8XX=y -CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS=4 +CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS=8 CONFIG_SCSI_NCR53C8XX_MAX_TAGS=32 -CONFIG_SCSI_NCR53C8XX_SYNC=20 -# CONFIG_SCSI_NCR53C8XX_PROFILE is not set +CONFIG_SCSI_NCR53C8XX_SYNC=80 +CONFIG_SCSI_NCR53C8XX_PROFILE=y # CONFIG_SCSI_NCR53C8XX_IOMAPPED is not set -# CONFIG_SCSI_NCR53C8XX_PQS_PDS is not set -# CONFIG_SCSI_PAS16 is not set -# CONFIG_SCSI_PCI2000 is not set -# CONFIG_SCSI_PCI2220I is not set -# CONFIG_SCSI_PSI240I is not set -# CONFIG_SCSI_QLOGIC_FAS is not set -# CONFIG_SCSI_QLOGIC_ISP is not set -# CONFIG_SCSI_QLOGIC_FC is not set -# CONFIG_SCSI_SEAGATE is not set -# CONFIG_SCSI_DC390T is not set -# CONFIG_SCSI_T128 is not set -# CONFIG_SCSI_U14_34F is not set -# CONFIG_SCSI_ULTRASTOR is not set +CONFIG_SCSI_NCR53C8XX_SYMBIOS_COMPAT=y +CONFIG_SCSI_NCR53C8XX_PQS_PDS=y +# CONFIG_SCSI_NCR53C8XX_IARB is not set +CONFIG_SCSI_NCR53C8XX_INTEGRITY_CHECK=y +CONFIG_SCSI_PAS16=m +CONFIG_SCSI_PCI2000=m +CONFIG_SCSI_PCI2220I=m +CONFIG_SCSI_PSI240I=m +CONFIG_SCSI_QLOGIC_FAS=m +CONFIG_SCSI_QLOGIC_ISP=m +CONFIG_SCSI_QLOGIC_FC=m +CONFIG_SCSI_SEAGATE=m +CONFIG_SCSI_DC390T=m +# CONFIG_SCSI_DC390T_NOGENSUPP is not set +CONFIG_SCSI_T128=m +CONFIG_SCSI_U14_34F=m +# CONFIG_SCSI_U14_34F_LINKED_COMMANDS is not set +CONFIG_SCSI_U14_34F_MAX_TAGS=8 +CONFIG_SCSI_ULTRASTOR=m +CONFIG_SCSI_DEBUG=m # # Network device support # CONFIG_NETDEVICES=y + +# +# ARCnet devices +# # CONFIG_ARCNET is not set CONFIG_DUMMY=m -# CONFIG_EQUALIZER is not set +CONFIG_BONDING=m +CONFIG_EQUALIZER=m +CONFIG_ETHERTAP=m +CONFIG_NET_SB1000=m + +# +# 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_NET_ISA is not set +CONFIG_NET_VENDOR_3COM=y +CONFIG_EL1=m +CONFIG_EL2=m +CONFIG_ELPLUS=m +CONFIG_EL16=m +CONFIG_EL3=m +CONFIG_3C515=m +CONFIG_BC90X=m +CONFIG_VORTEX=m +CONFIG_LANCE=m +CONFIG_NET_VENDOR_SMC=y +CONFIG_WD80x3=m +CONFIG_ULTRA=m +CONFIG_ULTRA32=m +CONFIG_SMC9194=m +CONFIG_NET_VENDOR_RACAL=y +CONFIG_NI5010=m +CONFIG_NI52=m +CONFIG_NI65=m +CONFIG_RTL8139=m +CONFIG_NET_ISA=y +CONFIG_AT1700=m +CONFIG_E2100=m +CONFIG_DEPCA=m +CONFIG_EWRK3=m +CONFIG_EEXPRESS=m +CONFIG_EEXPRESS_PRO=m +CONFIG_FMV18X=m +CONFIG_HPLAN_PLUS=m +CONFIG_HPLAN=m +CONFIG_HP100=m +CONFIG_ETH16I=m +CONFIG_NE2000=m +# CONFIG_SEEQ8005 is not set +CONFIG_SK_G16=y CONFIG_NET_EISA=y -# CONFIG_PCNET32 is not set -# CONFIG_APRICOT is not set -# CONFIG_CS89x0 is not set -# CONFIG_DE4X5 is not set -# CONFIG_DEC_ELCP is not set -# CONFIG_DGRS is not set +CONFIG_PCNET32=m +CONFIG_AC3200=m +CONFIG_APRICOT=m +CONFIG_CS89x0=m +CONFIG_DM9102=m +CONFIG_DE4X5=m +CONFIG_DEC_ELCP=y +# CONFIG_DEC_ELCP_OLD is not set +CONFIG_DGRS=m CONFIG_EEXPRESS_PRO100=y -# CONFIG_NE2K_PCI is not set -# CONFIG_TLAN is not set -# CONFIG_VIA_RHINE is not set -# CONFIG_NET_POCKET is not set -# CONFIG_FDDI is not set -# CONFIG_DLCI is not set -# CONFIG_PPP is not set -# CONFIG_SLIP is not set -# CONFIG_NET_RADIO is not set -# CONFIG_TR is not set -# CONFIG_HOSTESS_SV11 is not set -# CONFIG_COSA is not set -# CONFIG_SEALEVEL_4021 is not set -# CONFIG_RCPCI is not set -# CONFIG_WAN_DRIVERS is not set -# CONFIG_LAPBETHER is not set -# CONFIG_X25_ASY is not set +CONFIG_LNE390=m +CONFIG_NE3210=m +CONFIG_NE2K_PCI=m +CONFIG_TLAN=m +CONFIG_VIA_RHINE=m +CONFIG_SIS900=m +CONFIG_ES3210=m +CONFIG_EPIC100=m +# CONFIG_ZNET is not set +CONFIG_NET_POCKET=y +CONFIG_ATP=y +CONFIG_DE600=m +CONFIG_DE620=m + +# +# Ethernet (1000 Mbit) +# +CONFIG_ACENIC=m +CONFIG_HAMACHI=m +CONFIG_YELLOWFIN=m +CONFIG_SK98LIN=m +CONFIG_FDDI=y +# CONFIG_DEFXX is not set +# CONFIG_HIPPI is not set + +# +# Appletalk devices +# +CONFIG_LTPC=m +CONFIG_COPS=m +CONFIG_COPS_DAYNA=y +CONFIG_COPS_TANGENT=y +CONFIG_IPDDP=m +CONFIG_IPDDP_ENCAP=y +CONFIG_IPDDP_DECAP=y +CONFIG_PLIP=m +CONFIG_PPP=m + +# +# CCP compressors for PPP are only built as modules. +# +CONFIG_SLIP=m +CONFIG_SLIP_COMPRESSED=y +CONFIG_SLIP_SMART=y +CONFIG_SLIP_MODE_SLIP6=y +CONFIG_NET_RADIO=y +CONFIG_STRIP=m +CONFIG_WAVELAN=m +CONFIG_ARLAN=m + +# +# Token ring devices +# +CONFIG_TR=y +CONFIG_IBMTR=m +CONFIG_IBMOL=m +CONFIG_SKTR=m +CONFIG_NET_FC=y +CONFIG_IPHASE5526=m +CONFIG_RCPCI=m +CONFIG_SHAPER=m + +# +# Wan interfaces +# +CONFIG_HOSTESS_SV11=m +CONFIG_COSA=m +CONFIG_SEALEVEL_4021=m +# CONFIG_COMX is not set +CONFIG_DLCI=m +CONFIG_DLCI_COUNT=24 +CONFIG_DLCI_MAX=8 +CONFIG_SDLA=m +CONFIG_WAN_DRIVERS=y +CONFIG_VENDOR_SANGOMA=m +CONFIG_WANPIPE_CARDS=4 +# CONFIG_WANPIPE_FR is not set +CONFIG_WANPIPE_PPP=y +CONFIG_WANPIPE_CHDLC=y +CONFIG_SBNI=m # # Amateur Radio support @@ -254,18 +489,133 @@ # # IrDA subsystem support +# +CONFIG_IRDA=m + +# +# IrDA protocols +# +CONFIG_IRLAN=m +CONFIG_IRCOMM=m +CONFIG_IRLPT=m +CONFIG_IRLPT_CLIENT=m +CONFIG_IRLPT_SERVER=m +CONFIG_IRDA_OPTIONS=y + +# +# IrDA options +# +CONFIG_IRDA_CACHE_LAST_LSAP=y +CONFIG_IRDA_FAST_RR=y +# CONFIG_IRDA_DEBUG is not set +CONFIG_IRDA_COMPRESSION=y + +# +# IrDA compressors +# +CONFIG_IRDA_DEFLATE=m + +# +# Infrared-port device drivers +# + +# +# SIR device drivers # -# CONFIG_IRDA is not set +CONFIG_IRTTY_SIR=m +CONFIG_IRPORT_SIR=m # +# FIR device drivers +# +CONFIG_NSC_FIR=m +CONFIG_WINBOND_FIR=m +CONFIG_SHARP_FIR=m +CONFIG_TOSHIBA_FIR=m +CONFIG_SMC_IRCC_FIR=m + +# +# Dongle support +# +CONFIG_DONGLE=y +CONFIG_ESI_DONGLE=m +CONFIG_ACTISYS_DONGLE=m +CONFIG_TEKRAM_DONGLE=m +CONFIG_GIRBIL_DONGLE=m +CONFIG_LITELINK_DONGLE=m + +# # ISDN subsystem # -# CONFIG_ISDN is not set +CONFIG_ISDN=m +CONFIG_ISDN_PPP=y +CONFIG_ISDN_PPP_VJ=y +CONFIG_ISDN_MPP=y +CONFIG_ISDN_AUDIO=y +# CONFIG_ISDN_TTY_FAX is not set +# CONFIG_ISDN_DIVERSION is not set +CONFIG_ISDN_DRV_ICN=m +CONFIG_ISDN_DRV_LOOP=m +CONFIG_ISDN_DRV_PCBIT=m +CONFIG_ISDN_DRV_HISAX=m +CONFIG_HISAX_EURO=y +CONFIG_DE_AOC=y +# CONFIG_HISAX_NO_SENDCOMPLETE is not set +# CONFIG_HISAX_NO_LLC is not set +CONFIG_HISAX_1TR6=y +CONFIG_HISAX_16_0=y +CONFIG_HISAX_16_3=y +CONFIG_HISAX_TELESPCI=y +CONFIG_HISAX_S0BOX=y +CONFIG_HISAX_AVM_A1=y +CONFIG_HISAX_FRITZPCI=y +CONFIG_HISAX_AVM_A1_PCMCIA=y +CONFIG_HISAX_ELSA=y +CONFIG_HISAX_IX1MICROR2=y +CONFIG_HISAX_DIEHLDIVA=y +CONFIG_HISAX_ASUSCOM=y +CONFIG_HISAX_TELEINT=y +CONFIG_HISAX_HFCS=y +CONFIG_HISAX_SEDLBAUER=y +CONFIG_HISAX_SPORTSTER=y +CONFIG_HISAX_MIC=y +CONFIG_HISAX_NETJET=y +CONFIG_HISAX_NICCY=y +CONFIG_HISAX_ISURF=y +CONFIG_HISAX_HSTSAPHIR=y +CONFIG_HISAX_BKM_A4T=y +CONFIG_HISAX_SCT_QUADRO=y +CONFIG_HISAX_GAZEL=y +CONFIG_HISAX_HFC_PCI=y +CONFIG_HISAX_W6692=y +# CONFIG_ISDN_DRV_SC is not set +# CONFIG_ISDN_DRV_ACT2000 is not set +# CONFIG_ISDN_DRV_EICON is not set +CONFIG_ISDN_DRV_AVMB1=m +CONFIG_ISDN_DRV_AVMB1_B1ISA=y +CONFIG_ISDN_DRV_AVMB1_B1PCI=y +CONFIG_ISDN_DRV_AVMB1_T1ISA=y +# CONFIG_ISDN_DRV_AVMB1_B1PCMCIA is not set +CONFIG_ISDN_DRV_AVMB1_T1PCI=y +CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON=y # # Old CD-ROM drivers (not SCSI, not IDE) # -# CONFIG_CD_NO_IDESCSI is not set +CONFIG_CD_NO_IDESCSI=y +CONFIG_AZTCD=m +CONFIG_GSCD=m +CONFIG_SBPCD=m +CONFIG_MCD=m +CONFIG_MCD_IRQ=11 +CONFIG_MCD_BASE=300 +CONFIG_MCDX=m +CONFIG_OPTCD=m +CONFIG_CM206=m +CONFIG_SJCD=m +CONFIG_ISP16_CDI=m +CONFIG_CDU31A=m +CONFIG_CDU535=m # # Character devices @@ -273,98 +623,402 @@ CONFIG_VT=y CONFIG_VT_CONSOLE=y CONFIG_SERIAL=y -# CONFIG_SERIAL_CONSOLE is not set -# CONFIG_SERIAL_EXTENDED is not set -# CONFIG_SERIAL_NONSTANDARD is not set +CONFIG_SERIAL_CONSOLE=y +CONFIG_SERIAL_EXTENDED=y +CONFIG_SERIAL_MANY_PORTS=y +CONFIG_SERIAL_SHARE_IRQ=y +# CONFIG_SERIAL_DETECT_IRQ is not set +CONFIG_SERIAL_MULTIPORT=y +# CONFIG_HUB6 is not set +CONFIG_SERIAL_NONSTANDARD=y +CONFIG_COMPUTONE=m +CONFIG_ROCKETPORT=m +CONFIG_CYCLADES=m +# CONFIG_CYZ_INTR is not set +CONFIG_DIGIEPCA=m +CONFIG_ESPSERIAL=m +CONFIG_MOXA_INTELLIO=m +CONFIG_MOXA_SMARTIO=m +CONFIG_ISI=m +CONFIG_RISCOM8=m +CONFIG_SPECIALIX=m +CONFIG_SPECIALIX_RTSCTS=y +CONFIG_SX=m +CONFIG_STALDRV=y +CONFIG_STALLION=m +CONFIG_ISTALLION=m +CONFIG_SYNCLINK=m +CONFIG_N_HDLC=m CONFIG_UNIX98_PTYS=y CONFIG_UNIX98_PTY_COUNT=256 +CONFIG_PRINTER=m +CONFIG_PRINTER_READBACK=y CONFIG_MOUSE=y # # Mice # -# CONFIG_ATIXL_BUSMOUSE is not set -# CONFIG_BUSMOUSE is not set -# CONFIG_MS_BUSMOUSE is not set +CONFIG_ATIXL_BUSMOUSE=m +CONFIG_BUSMOUSE=m +CONFIG_MS_BUSMOUSE=m CONFIG_PSMOUSE=y -CONFIG_82C710_MOUSE=y -# CONFIG_PC110_PAD is not set +CONFIG_82C710_MOUSE=m +CONFIG_PC110_PAD=m + +# +# Joysticks +# +CONFIG_JOYSTICK=m +CONFIG_JOY_ANALOG=m +CONFIG_JOY_ASSASSIN=m +CONFIG_JOY_GRAVIS=m +CONFIG_JOY_LOGITECH=m +CONFIG_JOY_SIDEWINDER=m +CONFIG_JOY_THRUSTMASTER=m +CONFIG_JOY_CREATIVE=m +CONFIG_JOY_LIGHTNING=m +CONFIG_JOY_PCI=m +CONFIG_JOY_MAGELLAN=m +CONFIG_JOY_SPACEORB=m +CONFIG_JOY_SPACEBALL=m +CONFIG_JOY_WARRIOR=m +CONFIG_JOY_CONSOLE=m +CONFIG_JOY_DB9=m +CONFIG_JOY_TURBOGRAFX=m # CONFIG_QIC02_TAPE is not set -# CONFIG_WATCHDOG is not set -# CONFIG_NVRAM is not set -# CONFIG_RTC is not set +CONFIG_IPMI_KCS=m +CONFIG_WATCHDOG=y # -# Video For Linux +# Watchdog Cards # -# CONFIG_VIDEO_DEV is not set +CONFIG_IPMI_KCS=m +# CONFIG_WATCHDOG_NOWAYOUT is not set +CONFIG_WDT=m +CONFIG_WDT_501=y +CONFIG_WDT_501_FAN=y +CONFIG_SOFT_WATCHDOG=m +CONFIG_PCWATCHDOG=m +CONFIG_ACQUIRE_WDT=m +# CONFIG_MIXCOMWD is not set +CONFIG_NVRAM=m +CONFIG_RTC=y + +# +# I2C support +# +CONFIG_I2C=m +CONFIG_I2C_ALGOBIT=m +CONFIG_I2C_PHILIPSPAR=m +CONFIG_I2C_ELV=m +CONFIG_I2C_VELLEMAN=m +CONFIG_I2C_ALGOPCF=m +CONFIG_I2C_ELEKTOR=m +CONFIG_I2C_MAINBOARD=m +CONFIG_I2C_ALI15X3=m +CONFIG_I2C_HYDRA=m +CONFIG_I2C_PIIX4=m +CONFIG_I2C_VIA=m +CONFIG_I2C_ISA=m +CONFIG_I2C_CHARDEV=m + +# +# Hardware sensors support +# +CONFIG_SENSORS=m +CONFIG_SENSORS_ADM1021=m +CONFIG_SENSORS_ADM9240=m +CONFIG_SENSORS_GL518SM=m +CONFIG_SENSORS_LM75=m +CONFIG_SENSORS_LM78=m +CONFIG_SENSORS_LM80=m +CONFIG_SENSORS_SIS5595=m +CONFIG_SENSORS_W83781D=m +CONFIG_SENSORS_OTHER=m +CONFIG_SENSORS_EEPROM=m +CONFIG_SENSORS_LTC1710=m + +# +# AGP support +# +CONFIG_AGP=m +CONFIG_AGP_INTEL=y +CONFIG_AGP_I810=y +CONFIG_AGP_VIA=y +CONFIG_AGP_AMD=y +CONFIG_AGP_SIS=y +CONFIG_AGP_ALI=y # -# Joystick support +# Video For Linux # -# CONFIG_JOYSTICK is not set -# CONFIG_DTLK is not set +CONFIG_VIDEO_DEV=m +CONFIG_RADIO_RTRACK=m +CONFIG_RADIO_RTRACK2=m +CONFIG_RADIO_AZTECH=m +CONFIG_RADIO_CADET=m +CONFIG_RADIO_MIROPCM20=m +CONFIG_RADIO_GEMTEK=m +CONFIG_RADIO_TRUST=m +CONFIG_VIDEO_BT848=m +CONFIG_VIDEO_BWQCAM=m +CONFIG_VIDEO_CQCAM=m +CONFIG_VIDEO_PMS=m +CONFIG_VIDEO_SAA5249=m +CONFIG_RADIO_SF16FMI=m +CONFIG_RADIO_TYPHOON=m +CONFIG_RADIO_TYPHOON_PROC_FS=y +CONFIG_RADIO_ZOLTRIX=m +CONFIG_VIDEO_ZORAN=m +CONFIG_VIDEO_BUZ=m +CONFIG_DTLK=m # # Ftape, the floppy tape device driver # -# CONFIG_FTAPE is not set +CONFIG_FTAPE=m +CONFIG_ZFTAPE=m +CONFIG_ZFT_DFLT_BLK_SZ=10240 # +# The compressor will be built as a module only! +# +CONFIG_ZFT_COMPRESSOR=m +CONFIG_FT_NR_BUFFERS=3 +CONFIG_FT_PROC_FS=y +CONFIG_FT_NORMAL_DEBUG=y +# CONFIG_FT_FULL_DEBUG is not set +# CONFIG_FT_NO_TRACE is not set +# CONFIG_FT_NO_TRACE_AT_ALL is not set + +# +# Hardware configuration +# +CONFIG_FT_STD_FDC=y +# CONFIG_FT_MACH2 is not set +# CONFIG_FT_PROBE_FC10 is not set +# CONFIG_FT_ALT_FDC is not set +CONFIG_FT_FDC_THR=8 +CONFIG_FT_FDC_MAX_RATE=2000 + +# +# ONLY for DEC Alpha architectures +# +CONFIG_FT_ALPHA_CLOCK=0 + +# # Filesystems # -# CONFIG_QUOTA is not set -CONFIG_AUTOFS_FS=y -# CONFIG_AFFS_FS is not set -# CONFIG_HFS_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_QUOTA=y +CONFIG_AUTOFS_FS=m +CONFIG_ADFS_FS=m +CONFIG_AFFS_FS=m +CONFIG_HFS_FS=m +CONFIG_FAT_FS=y +CONFIG_MSDOS_FS=m +CONFIG_UMSDOS_FS=m +CONFIG_VFAT_FS=y CONFIG_ISO9660_FS=y -# CONFIG_JOLIET is not set -# CONFIG_MINIX_FS is not set -# CONFIG_NTFS_FS is not set -# CONFIG_HPFS_FS is not set +CONFIG_JOLIET=y +CONFIG_MINIX_FS=m +CONFIG_NTFS_FS=m +CONFIG_NTFS_RW=y +CONFIG_HPFS_FS=m CONFIG_PROC_FS=y CONFIG_DEVPTS_FS=y -# CONFIG_ROMFS_FS is not set +CONFIG_QNX4FS_FS=m +# CONFIG_QNX4FS_RW is not set +CONFIG_ROMFS_FS=m CONFIG_EXT2_FS=y -# CONFIG_SYSV_FS is not set -# CONFIG_UFS_FS is not set +CONFIG_EXT3_FS=y +CONFIG_EXT3_FS_JFS_CHECK=y +CONFIG_SYSV_FS=m +CONFIG_UFS_FS=m +# CONFIG_UFS_FS_WRITE is not set +CONFIG_EFS_FS=m +CONFIG_SGI_PARTITION=y # # Network File Systems # -# CONFIG_CODA_FS is not set -CONFIG_NFS_FS=y -# CONFIG_NFSD_SUN is not set -CONFIG_SUNRPC=y -CONFIG_LOCKD=y -# CONFIG_SMB_FS is not set -# CONFIG_NCP_FS is not set +CONFIG_CODA_FS=m +CONFIG_NFS_FS=m +CONFIG_NFSD=m +CONFIG_NFSD_SUN=y +CONFIG_SUNRPC=m +CONFIG_LOCKD=m +CONFIG_NFSD_V3=y +CONFIG_NFS_V3=y +CONFIG_SMB_FS=m +CONFIG_NCP_FS=m +CONFIG_NCPFS_PACKET_SIGNING=y +CONFIG_NCPFS_IOCTL_LOCKING=y +CONFIG_NCPFS_STRONG=y +CONFIG_NCPFS_NFS_NS=y +CONFIG_NCPFS_OS2_NS=y +CONFIG_NCPFS_SMALLDOS=y +CONFIG_NCPFS_MOUNT_SUBDIR=y +CONFIG_NCPFS_NLS=y +CONFIG_NCPFS_EXTRAS=y # # Partition Types # -# CONFIG_BSD_DISKLABEL is not set -# CONFIG_MAC_PARTITION is not set -# CONFIG_SMD_DISKLABEL is not set -# CONFIG_SOLARIS_X86_PARTITION is not set -# CONFIG_NLS is not set +CONFIG_BSD_DISKLABEL=y +CONFIG_MAC_PARTITION=y +CONFIG_SMD_DISKLABEL=y +CONFIG_SOLARIS_X86_PARTITION=y +CONFIG_UNIXWARE_DISKLABEL=y +CONFIG_NLS=y + +# +# Native Language Support +# +CONFIG_NLS_CODEPAGE_437=m +CONFIG_NLS_CODEPAGE_737=m +CONFIG_NLS_CODEPAGE_775=m +CONFIG_NLS_CODEPAGE_850=m +CONFIG_NLS_CODEPAGE_852=m +CONFIG_NLS_CODEPAGE_855=m +CONFIG_NLS_CODEPAGE_857=m +CONFIG_NLS_CODEPAGE_860=m +CONFIG_NLS_CODEPAGE_861=m +CONFIG_NLS_CODEPAGE_862=m +CONFIG_NLS_CODEPAGE_863=m +CONFIG_NLS_CODEPAGE_864=m +CONFIG_NLS_CODEPAGE_865=m +CONFIG_NLS_CODEPAGE_866=m +CONFIG_NLS_CODEPAGE_869=m +CONFIG_NLS_CODEPAGE_874=m +CONFIG_NLS_ISO8859_1=m +CONFIG_NLS_ISO8859_2=m +CONFIG_NLS_ISO8859_3=m +CONFIG_NLS_ISO8859_4=m +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_14=m +CONFIG_NLS_ISO8859_15=m +CONFIG_NLS_KOI8_R=m # # Console drivers # CONFIG_VGA_CONSOLE=y -# CONFIG_VIDEO_SELECT is not set +CONFIG_VIDEO_SELECT=y +CONFIG_MDA_CONSOLE=m +# CONFIG_FB is not set +CONFIG_DUMMY_CONSOLE=y +CONFIG_FB_PM2=m +CONFIG_FB_VESA=y +# CONFIG_FB_VGA16 is not set +CONFIG_VIDEO_SELECT=y +CONFIG_FB_MATROX=m +CONFIG_FB_MATROX_MILLENIUM=y +CONFIG_FB_MATROX_MYSTIQUE=y +CONFIG_FB_MATROX_G100=y +CONFIG_FB_MATROX_MULTIHEAD=y +CONFIG_FB_ATY=m +# CONFIG_FB_VIRTUAL is not set +# CONFIG_FBCON_ADVANCED is not set +CONFIG_FBCON_CFB8=y +CONFIG_FBCON_CFB16=y +CONFIG_FBCON_CFB24=y +CONFIG_FBCON_CFB32=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_CMPCI=m +CONFIG_SOUND_CMPCI_FM=y +CONFIG_SOUND_CMPCI_MIDI=y +CONFIG_SOUND_ES1370=m +CONFIG_SOUND_ES1371=m +CONFIG_SOUND_MAESTRO=m +CONFIG_SOUND_EMU10K1=m +CONFIG_SOUND_ESSSOLO1=m +CONFIG_SOUND_SONICVIBES=m +CONFIG_SOUND_MSNDCLAS=m +# CONFIG_MSNDCLAS_HAVE_BOOT is not set +CONFIG_MSNDCLAS_INIT_FILE="/etc/sound/msndinit.bin" +CONFIG_MSNDCLAS_PERM_FILE="/etc/sound/msndperm.bin" +CONFIG_SOUND_MSNDPIN=m +# CONFIG_MSNDPIN_HAVE_BOOT is not set +CONFIG_MSNDPIN_INIT_FILE="/etc/sound/pndspini.bin" +CONFIG_MSNDPIN_PERM_FILE="/etc/sound/pndsperm.bin" +CONFIG_SOUND_OSS=m +CONFIG_SOUND_PAS=m +CONFIG_SOUND_SB=m +CONFIG_SOUND_GUS=m +CONFIG_GUS16=y +CONFIG_GUSMAX=y +CONFIG_SOUND_MPU401=m +CONFIG_SOUND_PSS=m +# CONFIG_PSS_MIXER is not set +CONFIG_SOUND_MSS=m +CONFIG_SOUND_SSCAPE=m +CONFIG_SOUND_TRIX=m +CONFIG_SOUND_VIA82CXXX=m +CONFIG_SOUND_MAD16=m +CONFIG_MAD16_OLDCARD=y +CONFIG_SOUND_WAVEFRONT=m +CONFIG_SOUND_CS4232=m +CONFIG_SOUND_OPL3SA2=m +CONFIG_SOUND_MAUI=m +CONFIG_SOUND_SGALAXY=m +CONFIG_SOUND_AD1816=m +CONFIG_SOUND_OPL3SA1=m +CONFIG_SOUND_SOFTOSS=m +CONFIG_SOUND_YM3812=m +CONFIG_SOUND_VMIDI=m +CONFIG_SOUND_UART6850=m +CONFIG_SOUND_NM256=m + +# +# Additional low level sound drivers +# +CONFIG_LOWLEVEL_SOUND=y +CONFIG_ACI_MIXER=m +CONFIG_VIDEO_MSP3400=m +CONFIG_AWE32_SYNTH=m +CONFIG_AEDSP16=m +CONFIG_AEDSP16_BASE=220 +CONFIG_MPU_BASE=330 + +# +# SC-6600 Audio Cards have no jumper switches at all +# +CONFIG_SC6600=y + +# +# SC-6600 specific configuration +# +CONFIG_SC6600_JOY=y +CONFIG_SC6600_CDROM=4 +CONFIG_SC6600_CDROMBASE=0 +CONFIG_AEDSP16_SBPRO=y + +# +# Audio Excel DSP 16 [Sound Blaster Pro] +# +CONFIG_AEDSP16_BASE=220 +CONFIG_AEDSP16_SB_IRQ=5 +CONFIG_AEDSP16_SB_DMA=0 +CONFIG_AEDSP16_MPU401=y + +# +# Audio Excel DSP 16 [MPU-401] # -# CONFIG_SOUND is not set +CONFIG_AEDSP16_MPU_IRQ=5 # # Kernel hacking # -# CONFIG_MAGIC_SYSRQ is not set +CONFIG_MAGIC_SYSRQ=y Index: oldkernel/linux/arch/i386/kdb/modules/kdbm_jfs.c diff -u /dev/null linux/arch/i386/kdb/modules/kdbm_jfs.c:1.1 --- /dev/null Mon Jul 31 21:15:04 2000 +++ linux/arch/i386/kdb/modules/kdbm_jfs.c Fri Jul 7 16:34:57 2000 @@ -0,0 +1,308 @@ +#include +#include +#include +#include +#include + +#define FETCH(dest, source) \ +do { \ + int i; \ + unsigned char *p = (unsigned char *)(dest); \ + \ + for (i=0; i= NR_LIST) + return "*INVALID*"; + return bh_listnames[list]; +} + +const char *jfs_listname(int list) +{ + if (list >= BJ_Types) + return "*INVALID*"; + return jfs_listnames[list]; +} + +const char *transaction_state(int state) +{ + static char statenum[16]; + if (state > T_FINISHED) { + sprintf(statenum, "[%d]", state); + return statenum; + } + return statenames[state]; +} + +const char *bh_state(int state) +{ + char *result=" "; + int i = 0; + do { + if (state & (1<= 0); + return result; +} + + +int +kdbm_bh(int argc, const char **argv, const char **envp, struct pt_regs *regs) +{ + struct buffer_head bh; + unsigned long addr; + long offset=0; + int nextarg; + int diag; + + if (argc != 1) + return KDB_ARGCOUNT; + + nextarg = 1; + diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); + if (diag) + return diag; + + addr += offset; + + FETCH(&bh, addr); + + kdb_printf("struct buffer_head 0x%lx for %d bytes\n", addr, sizeof(bh)); + kdb_printf(" dev = %-11s blk = 0x%08lx size = 0x%04lx\n", + kdevname(bh.b_dev), bh.b_blocknr, bh.b_size); + kdb_printf(" data = %p\n", bh.b_data); + kdb_printf(" list = %-3d (%-11s) state = %7s count = %-5d\n", + bh.b_list, bh_listname(bh.b_list), + bh_state(bh.b_state), + bh.b_count); + kdb_printf(" jlist = %-3d (%-11s) transaction = %p\n", + bh.b_jlist, jfs_listname(bh.b_jlist), bh.b_transaction); + kdb_printf(" frozen data = %p cp_transaction = %p\n", + bh.b_frozen_data, bh.b_cp_transaction); + kdb_printf(" committed data = %p next_transaction = %p\n", + bh.b_committed_data, bh.b_next_transaction); + return 0; +} + +int +kdbm_bhi(int argc, const char **argv, const char **envp, struct pt_regs *regs) +{ + show_buffers(); + return 0; +} + + +static void show_journal(journal_t *journal, unsigned long where) +{ + kdb_printf("journal at %08lx for %d bytes:\n", where, sizeof(*journal)); + + kdb_printf(" State: "); + if (journal->j_flags & JFS_UNMOUNT) + kdb_printf("Unmount "); + if (journal->j_flags & JFS_SYNC) + kdb_printf("Sync "); + if (journal->j_locked) + kdb_printf("Locked "); + kdb_printf("\n"); + + kdb_printf(" Log head: %ld Tail: %ld Free: %ld " + "Valid: %ld to %ld (+%d)\n", + journal->j_head, journal->j_tail, journal->j_free, + journal->j_first, journal->j_last, journal->j_maxlen); + + kdb_printf(" Transactions IDs:\n"); + kdb_printf(" Oldest: %-8ld Next: %-8ld\n", + journal->j_tail_sequence, + journal->j_transaction_sequence); + kdb_printf(" Committed: %-8ld Req commit: %-8ld\n", + journal->j_commit_sequence, + journal->j_commit_request); + kdb_printf("\n"); +} + +static void show_transaction_brief(transaction_t *transaction, + unsigned long where, + const char *kind) +{ + kdb_printf("%s%s at %08lx for %d bytes:\n", + kind ? kind : "", kind ? " transaction" : "Transaction", + where, sizeof(*transaction)); + + kdb_printf(" ID: %-5ld State: %9s " + "Buffers: %-5d Log at: %-5ld\n", + transaction->t_tid, transaction_state(transaction->t_state), + transaction->t_nr_buffers, transaction->t_log_start); + kdb_printf(" Updates: %-5d Credits: %-5d\n", + transaction->t_updates, transaction->t_outstanding_credits); +} + +static void show_transaction_list(unsigned long where, const char *kind, + unsigned long offset) +{ + unsigned long bp, first, count=0; + + if (!where) + return; + + first = where; + + do { + FETCH(&bp, where+offset); + where = bp; + count++; + } while (bp != first); + + kdb_printf (" %9s list: %5ld buffers\n", kind, count); +} + +#define SHOW_BUFS(bh, kind, field) \ +do { \ + unsigned long offset, bp; \ + bp = (unsigned long) (bh); \ + offset = ((char *) &((struct buffer_head *)(bp))->field) - \ + ((char *) (bp)); \ + show_transaction_list((bp), kind, offset); \ +} while (0) + +static void show_transaction_full(transaction_t *transaction, + unsigned long where, + const char *kind) +{ + show_transaction_brief(transaction, where, kind); + + SHOW_BUFS(transaction->t_datalist, "Data", b_tnext); + SHOW_BUFS(transaction->t_buffers, "Metadata", b_tnext); + SHOW_BUFS(transaction->t_forget, "Forget", b_tnext); + SHOW_BUFS(transaction->t_checkpoint_list, "Checkpoint",b_cpnext); + SHOW_BUFS(transaction->t_iobuf_list, "Iobuf", b_tnext); + SHOW_BUFS(transaction->t_shadow_list, "Shadow", b_tnext); + SHOW_BUFS(transaction->t_log_list, "Log", b_tnext); +} + +int +kdbm_jfs(int argc, const char **argv, const char **envp, struct pt_regs *regs) +{ + journal_t journal; + transaction_t transaction; + unsigned long jaddr, taddr; + + long offset=0; + int nextarg; + int diag; + + if (argc != 1) + return KDB_ARGCOUNT; + + nextarg = 1; + diag = kdbgetaddrarg(argc, argv, &nextarg, &jaddr, &offset, NULL,regs); + if (diag) + return diag; + + jaddr += offset; + + FETCH(&journal, jaddr); + show_journal(&journal, jaddr); + + taddr = (unsigned long) journal.j_running_transaction; + if (taddr) { + FETCH(&transaction, taddr); + show_transaction_brief(&transaction, taddr, "Running"); + } + + taddr = (unsigned long) journal.j_committing_transaction; + if (taddr) { + FETCH(&transaction, taddr); + show_transaction_brief(&transaction, taddr, "Committing"); + } + + taddr = (unsigned long) journal.j_checkpoint_transactions; + if (taddr) do { + FETCH(&transaction, taddr); + show_transaction_brief(&transaction, taddr, "Checkpointed"); + taddr = (unsigned long) transaction.t_cpnext; + } while (taddr != (unsigned long) journal.j_checkpoint_transactions); + + return 0; +} + +int +kdbm_tr(int argc, const char **argv, const char **envp, struct pt_regs *regs) +{ + transaction_t transaction; + unsigned long taddr; + + long offset=0; + int nextarg; + int diag; + + if (argc != 1) + return KDB_ARGCOUNT; + + nextarg = 1; + diag = kdbgetaddrarg(argc, argv, &nextarg, &taddr, &offset, NULL,regs); + if (diag) + return diag; + + taddr += offset; + + FETCH(&transaction, taddr); + show_transaction_full(&transaction, taddr, NULL); + + return 0; +} + +int +init_module(void) +{ + kdb_register("bh", kdbm_bh, "", "Display buffer_head", 0); + kdb_register("bhi", kdbm_bhi, "", "Summarise buffer_head info", 0); + kdb_register("jfs", kdbm_jfs, "", "Display journal_t", 0); + kdb_register("tr", kdbm_tr, "", "Display transaction_t", 0); + + return 0; +} + +void +cleanup_module(void) +{ + kdb_unregister("bh"); + kdb_unregister("bhi"); + kdb_unregister("jfs"); + kdb_unregister("tr"); +} Index: oldkernel/linux/arch/i386/kernel/bios32.c diff -u linux/arch/i386/kernel/bios32.c:1.2 linux/arch/i386/kernel/bios32.c:1.3 --- linux/arch/i386/kernel/bios32.c:1.2 Thu Jun 1 14:11:18 2000 +++ linux/arch/i386/kernel/bios32.c Fri Jul 7 15:36:41 2000 @@ -1,7 +1,7 @@ /* * bios32.c - Low-Level PCI Access * - * $Id: bios32.c,v 1.1.1.1 2000/05/31 19:33:53 ccr Exp $ + * $Id: bios32.c,v 1.48 1998/09/26 08:06:55 mj Exp $ * * Copyright 1993, 1994 Drew Eckhardt * Visionary Computing Index: oldkernel/linux/arch/i386/kernel/entry.S diff -u linux/arch/i386/kernel/entry.S:1.2 linux/arch/i386/kernel/entry.S:1.3 --- linux/arch/i386/kernel/entry.S:1.2 Thu Jun 1 15:03:08 2000 +++ linux/arch/i386/kernel/entry.S Fri Jul 7 15:36:41 2000 @@ -562,21 +562,13 @@ .long SYMBOL_NAME(sys_ni_syscall) /* streams1 */ .long SYMBOL_NAME(sys_ni_syscall) /* streams2 */ .long SYMBOL_NAME(sys_vfork) /* 190 */ - .long SYMBOL_NAME(sys_ni_syscall) - .long SYMBOL_NAME(sys_mmap2) - .long SYMBOL_NAME(sys_truncate64) - .long SYMBOL_NAME(sys_ftruncate64) - .long SYMBOL_NAME(sys_stat64) /* 195 */ - .long SYMBOL_NAME(sys_lstat64) - .long SYMBOL_NAME(sys_fstat64) - /* * NOTE!! This doesn't have to be exact - we just have * to make sure we have _enough_ of the "sys_ni_syscall" * entries. Don't panic if you notice that this hasn't * been shrunk every time we add a new system call. */ - .rept NR_syscalls-197 + .rept NR_syscalls-190 .long SYMBOL_NAME(sys_ni_syscall) .endr Index: oldkernel/linux/arch/i386/kernel/i386_ksyms.c diff -u linux/arch/i386/kernel/i386_ksyms.c:1.2 linux/arch/i386/kernel/i386_ksyms.c:1.3 --- linux/arch/i386/kernel/i386_ksyms.c:1.2 Thu Jun 1 15:05:19 2000 +++ linux/arch/i386/kernel/i386_ksyms.c Fri Jul 7 15:36:41 2000 @@ -119,13 +119,3 @@ #ifdef CONFIG_VT EXPORT_SYMBOL(screen_info); #endif - -#ifdef CONFIG_X86_CPU_OPTIMIZATIONS -EXPORT_SYMBOL(best_memcpy); -EXPORT_SYMBOL(best_memset); -EXPORT_SYMBOL(best_copy_to_user); -EXPORT_SYMBOL(best_copy_from_user); -EXPORT_SYMBOL(__best_copy_to_user); -EXPORT_SYMBOL(__best_copy_from_user); -#endif - Index: oldkernel/linux/arch/i386/kernel/mtrr.c diff -u linux/arch/i386/kernel/mtrr.c:1.1.1.1 linux/arch/i386/kernel/mtrr.c:1.2 --- linux/arch/i386/kernel/mtrr.c:1.1.1.1 Wed May 31 12:33:53 2000 +++ linux/arch/i386/kernel/mtrr.c Fri Jul 7 15:36:41 2000 @@ -139,41 +139,41 @@ Changed locking to spin with reschedule. Made use of new . v1.28 - 19990201 Zoltan Boszormenyi + 19990201 Zoltán Böszörményi Extended the driver to be able to use Cyrix style ARRs. 19990204 Richard Gooch Restructured Cyrix support. v1.29 - 19990204 Zoltan Boszormenyi + 19990204 Zoltán Böszörményi Refined ARR support: enable MAPEN in set_mtrr_prepare() and disable MAPEN in set_mtrr_done(). 19990205 Richard Gooch Minor cleanups. v1.30 - 19990208 Zoltan Boszormenyi + 19990208 Zoltán Böszörményi Protect plain 6x86s (and other processors without the Page Global Enable feature) against accessing CR4 in set_mtrr_prepare() and set_mtrr_done(). 19990210 Richard Gooch Turned and into function pointers. v1.31 - 19990212 Zoltan Boszormenyi + 19990212 Zoltán Böszörményi Major rewrite of cyrix_arr_init(): do not touch ARRs, leave them as the BIOS have set them up. Enable usage of all 8 ARRs. Avoid multiplications by 3 everywhere and other code clean ups/speed ups. - 19990213 Zoltan Boszormenyi + 19990213 Zoltán Böszörményi Set up other Cyrix processors identical to the boot cpu. Since Cyrix don't support Intel APIC, this is l'art pour l'art. Weigh ARRs by size: If size <= 32M is given, set up ARR# we were given. If size > 32M is given, set up ARR7 only if it is free, fail otherwise. - 19990214 Zoltan Boszormenyi + 19990214 Zoltán Böszörményi Also check for size >= 256K if we are to set up ARR7, mtrr_add() returns the value it gets from set_mtrr() - 19990218 Zoltan Boszormenyi + 19990218 Zoltán Böszörményi Remove Cyrix "coma bug" workaround from here. Moved to linux/arch/i386/kernel/setup.c and linux/include/asm-i386/bugs.h @@ -187,7 +187,7 @@ 19990305 Richard Gooch Temporarily disable AMD support now MTRR capability flag is set. v1.32 - 19990308 Zoltan Boszormenyi + 19990308 Zoltán Böszörményi Adjust my changes (19990212-19990218) to Richard Gooch's latest changes. (19990228-19990305) v1.33 @@ -197,7 +197,7 @@ Support K6-II/III based on Alan Cox's patches. v1.34 19990511 Bart Hartgers - Support Centaur C6 MCR's. + Support Centaur C6 MCRs. 19990512 Richard Gooch Minor cleanups. v1.35 @@ -210,6 +210,9 @@ 19990819 Alan Cox Tested Zoltan's changes on a pre production Athlon - 100% success. Fixed one fall through check to be Intel only. + 19991116 Bart Hartgers + Changed Centaur/IDT WinChip support to include WinChip 2. + (WC 2 kindly provided by IDT). */ #include @@ -464,9 +467,9 @@ static void intel_get_mtrr (unsigned int reg, unsigned long *base, unsigned long *size, mtrr_type *type) { - unsigned long dummy, mask_lo, base_lo; + unsigned long mask_lo, mask_hi, base_lo, base_hi; - rdmsr (MTRRphysMask_MSR(reg), mask_lo, dummy); + rdmsr (MTRRphysMask_MSR(reg), mask_lo, mask_hi); if ((mask_lo & 0x800) == 0) { /* Invalid (i.e. free) range. */ *base = 0; @@ -475,20 +478,17 @@ return; } - rdmsr(MTRRphysBase_MSR(reg), base_lo, dummy); + rdmsr(MTRRphysBase_MSR(reg), base_lo, base_hi); - /* We ignore the extra address bits (32-35). If someone wants to - run x86 Linux on a machine with >4GB memory, this will be the - least of their problems. */ + /* Work out the shifted address mask. */ + mask_lo = 0xff000000 | mask_hi << (32 - PAGE_SHIFT) + | mask_lo >> PAGE_SHIFT; - /* Clean up mask_lo so it gives the real address mask. */ - mask_lo = (mask_lo & 0xfffff000UL); /* This works correctly if size is a power of two, i.e. a contiguous range. */ - *size = ~(mask_lo - 1); - - *base = (base_lo & 0xfffff000UL); - *type = (base_lo & 0xff); + *size = -mask_lo; + *base = base_hi << (32 - PAGE_SHIFT) | base_lo >> PAGE_SHIFT; + *type = base_lo & 0xff; } /* End Function intel_get_mtrr */ static void cyrix_get_arr (unsigned int reg, unsigned long *base, @@ -513,13 +513,13 @@ /* Enable interrupts if it was enabled previously */ __restore_flags (flags); shift = ((unsigned char *) base)[1] & 0x0f; - *base &= 0xfffff000UL; + *base >>= PAGE_SHIFT; /* Power of two, at least 4K on ARR0-ARR6, 256K on ARR7 * Note: shift==0xf means 4G, this is unsupported. */ if (shift) - *size = (reg < 7 ? 0x800UL : 0x20000UL) << shift; + *size = (reg < 7 ? 0x1UL : 0x40UL) << (shift - 1); else *size = 0; @@ -552,7 +552,7 @@ /* Upper dword is region 1, lower is region 0 */ if (reg == 1) low = high; /* The base masks off on the right alignment */ - *base = low & 0xFFFE0000; + *base = (low & 0xFFFE0000) >> PAGE_SHIFT; *type = 0; if (low & 1) *type = MTRR_TYPE_UNCACHABLE; if (low & 2) *type = MTRR_TYPE_WRCOMB; @@ -577,22 +577,35 @@ * *128K ... */ low = (~low) & 0x1FFFC; - *size = (low + 4) << 15; + *size = (low + 4) << (15 - PAGE_SHIFT); return; } /* End Function amd_get_mtrr */ -static struct +static struct CENTAUR_MCR_CTX { - unsigned long high; - unsigned long low; -} centaur_mcr[8]; + unsigned type_bits[MTRR_NUM_TYPES]; + struct { + u32 low; + u32 high; + } mcr[8]; +} *centaur_ctx=NULL; static void centaur_get_mcr (unsigned int reg, unsigned long *base, unsigned long *size, mtrr_type *type) { - *base = centaur_mcr[reg].high & 0xfffff000; - *size = (~(centaur_mcr[reg].low & 0xfffff000))+1; - *type = MTRR_TYPE_WRCOMB; /* If it is there, it is write-combining */ + unsigned i; + u32 tb; + tb = centaur_ctx->mcr[reg].low & 0xfff; + *base = centaur_ctx->mcr[reg].high >> PAGE_SHIFT; + *size = -(centaur_ctx->mcr[reg].low & 0xfffff000) >> PAGE_SHIFT; + if (*size) { + for( i=0; itype_bits[i]==tb) { + *type = (mtrr_type) i; + return; + } + *size = 0; + } } /* End Function centaur_get_mcr */ static void (*get_mtrr) (unsigned int reg, unsigned long *base, @@ -621,8 +634,10 @@ } else { - wrmsr (MTRRphysBase_MSR (reg), base | type, 0); - wrmsr (MTRRphysMask_MSR (reg), ~(size - 1) | 0x800, 0); + wrmsr (MTRRphysBase_MSR (reg), base << PAGE_SHIFT | type, + (base & 0xf00000) >> (32 - PAGE_SHIFT)); + wrmsr (MTRRphysMask_MSR (reg), -size << PAGE_SHIFT | 0x800, + (-size & 0xf00000) >> (32 - PAGE_SHIFT)); } if (do_safe) set_mtrr_done (&ctxt); } /* End Function intel_set_mtrr_up */ @@ -636,7 +651,9 @@ arr = CX86_ARR_BASE + (reg << 1) + reg; /* avoid multiplication by 3 */ /* count down from 32M (ARR0-ARR6) or from 2G (ARR7) */ - size >>= (reg < 7 ? 12 : 18); + if (reg >= 7) + size >>= 6; + size &= 0x7fff; /* make sure arr_size <= 14 */ for(arr_size = 0; size; arr_size++, size >>= 1); @@ -657,6 +674,7 @@ } if (do_safe) set_mtrr_prepare (&ctxt); + base <<= PAGE_SHIFT; setCx86(arr, ((unsigned char *) &base)[3]); setCx86(arr+1, ((unsigned char *) &base)[2]); setCx86(arr+2, (((unsigned char *) &base)[1]) | arr_size); @@ -676,34 +694,36 @@ [RETURNS] Nothing. */ { - u32 low, high; + u32 regs[2]; struct set_mtrr_context ctxt; if (do_safe) set_mtrr_prepare (&ctxt); /* * Low is MTRR0 , High MTRR 1 */ - rdmsr (0xC0000085, low, high); + rdmsr (0xC0000085, regs[0], regs[1]); /* * Blank to disable */ if (size == 0) - *(reg ? &high : &low) = 0; + regs[reg] = 0; else - /* Set the register to the base (already shifted for us), the - type (off by one) and an inverted bitmask of the size - The size is the only odd bit. We are fed say 512K - We invert this and we get 111 1111 1111 1011 but - if you subtract one and invert you get the desired - 111 1111 1111 1100 mask - */ - *(reg ? &high : &low)=(((~(size-1))>>15)&0x0001FFFC)|base|(type+1); + /* Set the register to the base, the type (off by one) and an + inverted bitmask of the size The size is the only odd + bit. We are fed say 512K We invert this and we get 111 1111 + 1111 1011 but if you subtract one and invert you get the + desired 111 1111 1111 1100 mask + + But ~(x - 1) == ~x + 1 == -x. Two's complement rocks! */ + regs[reg] = (-size>>(15-PAGE_SHIFT) & 0x0001FFFC) + | (base<type_bits[type]; } - centaur_mcr[reg].high = high; - centaur_mcr[reg].low = low; + centaur_ctx->mcr[reg].high = high; + centaur_ctx->mcr[reg].low = low; + wrmsr (0x110 + reg, low, high); + if (do_safe) set_mtrr_done( &ctxt ); } /* End Function centaur_set_mtrr_up */ @@ -1023,7 +1045,7 @@ for (i = 0; i < max; ++i) { (*get_mtrr) (i, &lbase, &lsize, <ype); - if (lsize < 1) return i; + if (lsize == 0) return i; } return -ENOSPC; } /* End Function generic_get_free_region */ @@ -1040,7 +1062,7 @@ unsigned long lbase, lsize; /* If we are to set up a region >32M then look at ARR7 immediately */ - if (size > 0x2000000UL) { + if (size > 0x2000UL) { cyrix_get_arr (7, &lbase, &lsize, <ype); if (lsize < 1) return 7; /* else try ARR0-ARR6 first */ @@ -1048,11 +1070,11 @@ for (i = 0; i < 7; i++) { cyrix_get_arr (i, &lbase, &lsize, <ype); - if (lsize < 1) return i; + if (lsize == 0) return i; } /* ARR0-ARR6 isn't free, try ARR7 but its size must be at least 256K */ cyrix_get_arr (i, &lbase, &lsize, <ype); - if ((lsize < 1) && (size >= 0x40000)) return i; + if ((lsize == 0) && (size >= 0x40)) return i; } return -ENOSPC; } /* End Function cyrix_get_free_region */ @@ -1078,6 +1100,12 @@ unsigned long lbase, lsize, last; if ( !(boot_cpu_data.x86_capability & X86_FEATURE_MTRR) ) return -ENODEV; + if (type >= MTRR_NUM_TYPES) + { + printk ("mtrr: type: %u illegal\n", type); + return -EINVAL; + } + switch (boot_cpu_data.x86_vendor) { case X86_VENDOR_AMD: @@ -1105,7 +1133,7 @@ /* Fall through */ case X86_VENDOR_CYRIX: case X86_VENDOR_CENTAUR: - if ( (base & 0xfff) || (size & 0xfff) ) + if ( (base & (PAGE_SIZE - 1)) || (size & (PAGE_SIZE - 1)) ) { printk ("mtrr: size and base must be multiples of 4 kiB\n"); printk ("mtrr: size: %lx base: %lx\n", size, base); @@ -1113,13 +1141,12 @@ } if (boot_cpu_data.x86_vendor == X86_VENDOR_CENTAUR) { - if (type != MTRR_TYPE_WRCOMB) - { - printk ("mtrr: only write-combining is supported\n"); + if (centaur_ctx->type_bits[type]==0) { + printk ("mtrr: type not supported\n"); return -EINVAL; } } - else if (base + size < 0x100000) + else if (base + size < 0x100000) /* Not Centaur */ { printk ("mtrr: cannot set region below 1 MiB (0x%lx,0x%lx)\n", base, size); @@ -1141,11 +1168,12 @@ return -EINVAL; /*break;*/ } - if (type >= MTRR_NUM_TYPES) - { - printk ("mtrr: type: %u illegal\n", type); - return -EINVAL; - } + + /* For all CPU types, the checks above should have ensured that + base and size are page aligned */ + base >>= PAGE_SHIFT; + size >>= PAGE_SHIFT; + /* If the type is WC, check that this processor supports it */ if ( (type == MTRR_TYPE_WRCOMB) && !have_wrcomb () ) { @@ -1165,16 +1193,18 @@ if ( (base < lbase) || (base + size > lbase + lsize) ) { spin_unlock (&main_lock); - printk ("mtrr: 0x%lx,0x%lx overlaps existing 0x%lx,0x%lx\n", + printk ("mtrr: 0x%lx000,0x%lx000 overlaps existing" + " 0x%lx000,0x%lx000\n", base, size, lbase, lsize); return -EINVAL; } /* New region is enclosed by an existing region */ if (ltype != type) { - if (type == MTRR_TYPE_UNCACHABLE) continue; + if ((boot_cpu_data.x86_vendor != X86_VENDOR_CENTAUR) && + (type == MTRR_TYPE_UNCACHABLE)) continue; spin_unlock (&main_lock); - printk ( "mtrr: type mismatch for %lx,%lx old: %s new: %s\n", + printk ( "mtrr: type mismatch for %lx000,%lx000 old: %s new: %s\n", base, size, attrib_to_str (ltype), attrib_to_str (type) ); return -EINVAL; } @@ -1214,6 +1244,7 @@ unsigned long lbase, lsize; if ( !(boot_cpu_data.x86_capability & X86_FEATURE_MTRR) ) return -ENODEV; + max = get_num_var_ranges (); spin_lock_reschedule (&main_lock); if (reg < 0) @@ -1222,7 +1253,8 @@ for (i = 0; i < max; ++i) { (*get_mtrr) (i, &lbase, &lsize, <ype); - if ( (lbase == base) && (lsize == size) ) + if (lbase < 0x100000 && lbase << PAGE_SHIFT == base + && lsize < 0x100000 && lsize << PAGE_SHIFT == size) { reg = i; break; @@ -1231,7 +1263,7 @@ if (reg < 0) { spin_unlock (&main_lock); - printk ("mtrr: no MTRR for %lx,%lx found\n", base, size); + printk ("mtrr: no MTRR for %lx000,%lx000 found\n", base, size); return -EINVAL; } } @@ -1412,7 +1444,16 @@ return -EFAULT; if ( gentry.regnum >= get_num_var_ranges () ) return -EINVAL; (*get_mtrr) (gentry.regnum, &gentry.base, &gentry.size, &type); - gentry.type = type; + + /* Hide entries that go above 4GB */ + if (gentry.base + gentry.size > 0x100000 || gentry.size == 0x100000) + gentry.base = gentry.size = gentry.type = 0; + else { + gentry.base <<= PAGE_SHIFT; + gentry.size <<= PAGE_SHIFT; + gentry.type = type; + } + if ( copy_to_user ( (void *) arg, &gentry, sizeof gentry) ) return -EFAULT; break; @@ -1504,24 +1545,24 @@ for (i = 0; i < max; i++) { (*get_mtrr) (i, &base, &size, &type); - if (size < 1) usage_table[i] = 0; + if (size == 0) usage_table[i] = 0; else { - if (size < 0x100000) + if (size < 0x100000 >> PAGE_SHIFT) { - /* 1MB */ - factor = 'k'; - size >>= 10; + /* less than 1MB */ + factor = 'K'; + size <<= PAGE_SHIFT - 10; } else { factor = 'M'; - size >>= 20; + size >>= 20 - PAGE_SHIFT; } sprintf (ascii_buffer + ascii_buf_bytes, - "reg%02i: base=0x%08lx (%4liMB), size=%4li%cB: %s, count=%d\n", - i, base, base>>20, size, factor, + "reg%02i: base=0x%05lx000 (%4liMB), size=%4li%cB: %s, count=%d\n", + i, base, base >> (20 - PAGE_SHIFT), size, factor, attrib_to_str (type), usage_table[i]); ascii_buf_bytes += strlen (ascii_buffer + ascii_buf_bytes); } @@ -1652,7 +1693,51 @@ { unsigned i; struct set_mtrr_context ctxt; - + u32 low,high; + u32 mcr_ctrl_value; + unsigned mcr_type; + /* Deduce the MCR traits type for this processor. + * The documentation of the WinChip 2 suggests that we can read the + * MCR_CTRL register for all WinChips, but this hangs on my C6. + * -> Work around this. + */ + if ((boot_cpu_data.x86 == 5) && (boot_cpu_data.x86_model == 4)) { + /* C6 */ + mcr_type = 0; + } else { + rdmsr (0x120, low, high ); + mcr_type = (low>>17)&0x7; + } + centaur_ctx = kmalloc( sizeof( struct CENTAUR_MCR_CTX ), GFP_KERNEL ); + if (centaur_ctx == NULL) { + printk("mtrr: Could not allocate memory. Disabling MTRR.\n"); + boot_cpu_data.x86_capability &= ~X86_FEATURE_MTRR; + return; + } + for( i=0; itype_bits[i] = 0; + } + switch( mcr_type ) { + case 0: + centaur_ctx->type_bits[ MTRR_TYPE_WRCOMB ] = 0x0f; + centaur_ctx->type_bits[ MTRR_TYPE_WRBACK ] = 0x1f; + mcr_ctrl_value = 0x01f0001f; + break; + case 1: + centaur_ctx->type_bits[ MTRR_TYPE_UNCACHABLE ] = 0x02; + centaur_ctx->type_bits[ MTRR_TYPE_WRCOMB ] = 0x13; + centaur_ctx->type_bits[ MTRR_TYPE_WRTHROUGH ] = 0x11; + centaur_ctx->type_bits[ MTRR_TYPE_WRBACK ] = 0x19; + mcr_ctrl_value = 0x01f2005f; + break; + default: + kfree( centaur_ctx ); + centaur_ctx = NULL; + printk ("mtrr: Centaur MCR traits version %u not supported. " + "Disabling MTRR.\n", mcr_type); + boot_cpu_data.x86_capability &= ~X86_FEATURE_MTRR; + return; + } set_mtrr_prepare (&ctxt); /* Unfortunately, MCR's are read-only, so there is no way to * find out what the bios might have done. @@ -1661,14 +1746,16 @@ * This way we are sure that the centaur_mcr array contains the actual * values. The disadvantage is that any BIOS tweaks are thus undone. */ + /* switch off MCR's first */ + wrmsr (0x120, 0, 0 ); for (i = 0; i < 8; ++i) { - centaur_mcr[i].high = 0; - centaur_mcr[i].low = 0; + centaur_ctx->mcr[i].high = 0; + centaur_ctx->mcr[i].low = 0; wrmsr (0x110 + i , 0, 0); } /* Throw the main write-combining switch... */ - wrmsr (0x120, 0x01f0001f, 0); + wrmsr (0x120, mcr_ctrl_value, 0); set_mtrr_done (&ctxt); } /* End Function centaur_mcr_init */ Index: oldkernel/linux/arch/i386/kernel/setup.c diff -u linux/arch/i386/kernel/setup.c:1.5 linux/arch/i386/kernel/setup.c:1.6 --- linux/arch/i386/kernel/setup.c:1.5 Thu Jun 1 17:04:06 2000 +++ linux/arch/i386/kernel/setup.c Fri Jul 7 15:36:41 2000 @@ -427,7 +427,7 @@ i386_endbase += PAGE_OFFSET; } -#define VMALLOC_RESERVE (64 << 20) /* 64MB for vmalloc */ +#define VMALLOC_RESERVE (128 << 20) /* 64MB for vmalloc */ #define MAXMEM ((unsigned long)(-PAGE_OFFSET-VMALLOC_RESERVE)) #ifdef CONFIG_BIGMEM @@ -835,8 +835,8 @@ { X86_VENDOR_INTEL, 6, { "Pentium Pro A-step", "Pentium Pro", NULL, "Pentium II (Klamath)", NULL, "Pentium II (Deschutes)", "Mobile Pentium II", - "Pentium III (Katmai)", "Pentium III (Coppermine)", NULL, NULL, - NULL, NULL, NULL, NULL, NULL }}, + "Pentium III (Katmai)", "Pentium III (Coppermine)", NULL, + "Pentium III (Cascades)", NULL, NULL, NULL, NULL, NULL }}, { X86_VENDOR_AMD, 4, { NULL, NULL, NULL, "486 DX/2", NULL, NULL, NULL, "486 DX/2-WB", "486 DX/4", "486 DX/4-WB", NULL, NULL, NULL, NULL, "Am5x86-WT", @@ -898,24 +898,26 @@ c->x86_cache_size = 0; break; - case 0x41: + case 0x41: /* 4-way 128 */ c->x86_cache_size = 128; break; - case 0x42: - case 0x82: /*Detect 256-Kbyte cache on Coppermine*/ + case 0x42: /* 4-way 256 */ + case 0x82: /* 8-way 256 */ c->x86_cache_size = 256; break; - case 0x43: + case 0x43: /* 4-way 512*/ c->x86_cache_size = 512; break; - case 0x44: + case 0x44: /* 4-way 1024 */ + case 0x84: /* 8-way 1024 */ c->x86_cache_size = 1024; break; - case 0x45: + case 0x45: /* 4-way 2048 */ + case 0x85: /* 8-way 2048 */ c->x86_cache_size = 2048; break; Index: oldkernel/linux/arch/i386/kernel/signal.c diff -u linux/arch/i386/kernel/signal.c:1.3 linux/arch/i386/kernel/signal.c:1.4 --- linux/arch/i386/kernel/signal.c:1.3 Thu Jun 1 17:04:57 2000 +++ linux/arch/i386/kernel/signal.c Fri Jul 7 15:36:41 2000 @@ -154,11 +154,21 @@ static inline int restore_i387_hard(struct _fpstate *buf) { + int err = 0; struct task_struct *tsk = current; - clear_fpu(tsk); - return i387_user_to_hard(&tsk->tss.i387.hard, - (struct user_i387_struct *)buf); + /* make sure the base fpu info is in the task struct */ + err = i387_user_to_hard(&tsk->tss.i387.hard, + (struct user_i387_struct *)buf); + if (err) { + /* + * Oops, we didn't get a valid FPU image back, wipe out + * our current FPU context to force an finit at the next + * DNA + */ + tsk->used_math = 0; + } + return err; } static inline int restore_i387(struct _fpstate *buf) @@ -172,7 +182,6 @@ else err = restore_i387_soft(¤t->tss.i387.soft, buf); #endif - current->used_math = 1; return err; } @@ -315,7 +324,7 @@ unlazy_fpu(tsk); err = i387_hard_to_user((struct user_i387_struct *)buf, &tsk->tss.i387.hard); - i387_get_swd(status, tsk->tss.i387.hard); + i387_get_swd(tsk->tss.i387.hard, status); err |= put_user(status, &buf->status); if (err) return -1; @@ -326,11 +335,6 @@ { if (!current->used_math) return 0; - - /* This will cause a "finit" to be triggered by the next - attempted FPU operation by the 'current' process. - */ - current->used_math = 0; #ifndef CONFIG_MATH_EMULATION return save_i387_hard(buf); Index: oldkernel/linux/arch/i386/kernel/sys_i386.c diff -u linux/arch/i386/kernel/sys_i386.c:1.2 linux/arch/i386/kernel/sys_i386.c:1.3 --- linux/arch/i386/kernel/sys_i386.c:1.2 Thu Jun 1 15:03:08 2000 +++ linux/arch/i386/kernel/sys_i386.c Fri Jul 7 15:36:41 2000 @@ -41,43 +41,6 @@ return error; } -/* common code for old and new mmaps */ -static inline long do_mmap2( - unsigned long addr, unsigned long len, - unsigned long prot, unsigned long flags, - unsigned long fd, unsigned long pgoff) -{ - int error = -EBADF; - struct file * file = NULL; - - flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); - if (!(flags & MAP_ANONYMOUS)) { - file = fget(fd); - if (!file) - goto out; - } - - down(¤t->mm->mmap_sem); - lock_kernel(); - - error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); - - unlock_kernel(); - up(¤t->mm->mmap_sem); - - if (file) - fput(file); -out: - return error; -} - -asmlinkage long sys_mmap2(unsigned long addr, unsigned long len, - unsigned long prot, unsigned long flags, - unsigned long fd, unsigned long pgoff) -{ - return do_mmap2(addr, len, prot, flags, fd, pgoff); -} - /* * Perform the select(nd, in, out, ex, tv) and mmap() system * calls. Linux/i386 didn't use to be able to handle more than @@ -96,19 +59,30 @@ asmlinkage int old_mmap(struct mmap_arg_struct *arg) { + int error = -EFAULT; + struct file * file = NULL; struct mmap_arg_struct a; - int err = -EFAULT; if (copy_from_user(&a, arg, sizeof(a))) - goto out; + return -EFAULT; - err = -EINVAL; - if (a.offset & ~PAGE_MASK) - goto out; + down(¤t->mm->mmap_sem); + lock_kernel(); + if (!(a.flags & MAP_ANONYMOUS)) { + error = -EBADF; + file = fget(a.fd); + if (!file) + goto out; + } + a.flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); - err = do_mmap2(a.addr, a.len, a.prot, a.flags, a.fd, a.offset >> PAGE_SHIFT); + error = do_mmap(file, a.addr, a.len, a.prot, a.flags, a.offset); + if (file) + fput(file); out: - return err; + unlock_kernel(); + up(¤t->mm->mmap_sem); + return error; } extern asmlinkage int sys_select(int, fd_set *, fd_set *, fd_set *, struct timeval *); Index: oldkernel/linux/arch/i386/kernel/traps.c diff -u linux/arch/i386/kernel/traps.c:1.3 linux/arch/i386/kernel/traps.c:1.4 --- linux/arch/i386/kernel/traps.c:1.3 Thu Jun 1 17:01:59 2000 +++ linux/arch/i386/kernel/traps.c Fri Jul 7 15:36:41 2000 @@ -20,6 +20,7 @@ #include #include #include +#include #ifdef CONFIG_MCA #include @@ -33,7 +34,6 @@ #include #include #include -#include #include @@ -536,9 +536,7 @@ * (this will also clear the error) */ task = current; - i387_save_hard(task->tss.i387); - task->flags &= ~PF_USEDFPU; - stts(); + save_fpu(task); task->tss.trap_no = 16; task->tss.error_code = 0; force_sig(SIGFPE, task); @@ -569,44 +567,18 @@ asmlinkage void math_state_restore(struct pt_regs regs) { __asm__ __volatile__("clts"); /* Allow maths ops (or we recurse) */ - /* - * If we have either of the kernel FPU use states set in the - * fpustate variable, then this will be a kernel math trap. - * Otherwise, this is userspace trying to use the FPU. - */ - if(current->tss.x86_fpustate & X86_FPUSTATE_KERN_ANY) { - load_default_mxcsr(); /* we don't ever mess with this in - kernel space, so just make sure - we have a reasonable one so we - don't start taking unmasked - exceptions by accident */ - if(current->tss.mmx_reg_space != NULL) - __asm__("movq 0x00(%0), %%mm0\n\t" - "movq 0x08(%0), %%mm1\n\t" - "movq 0x10(%0), %%mm2\n\t" - "movq 0x18(%0), %%mm3\n\t" - :: "r" (current->tss.mmx_reg_space)); - if(current->tss.kni_reg_space != NULL) - __asm__("movups 0x00(%0), %%xmm0\n\t" - "movups 0x10(%0), %%xmm1\n\t" - "movups 0x20(%0), %%xmm2\n\t" - "movups 0x30(%0), %%xmm3\n\t" - :: "r" (current->tss.kni_reg_space)); - } else if(current->tss.x86_fpustate & X86_FPUSTATE_USER_SAVED) { - i387_restore_hard(current->tss.i387); - current->tss.x86_fpustate = 0; - } else if(current->used_math) { + if(current->used_math) i387_restore_hard(current->tss.i387); - current->flags|=PF_USEDFPU; /* make switch_to() work */ - } else { + else + { /* * Our first FPU usage, clean the chip. */ __asm__("fninit"); load_default_mxcsr(); current->used_math = 1; - current->flags|=PF_USEDFPU; /* make switch_to() work */ } + current->flags|=PF_USEDFPU; /* So we fnsave on switch_to() */ } #ifndef CONFIG_MATH_EMULATION Index: oldkernel/linux/arch/i386/lib/Makefile diff -u linux/arch/i386/lib/Makefile:1.2 linux/arch/i386/lib/Makefile:1.3 --- linux/arch/i386/lib/Makefile:1.2 Thu Jun 1 15:05:19 2000 +++ linux/arch/i386/lib/Makefile Fri Jul 7 15:36:42 2000 @@ -9,8 +9,4 @@ L_OBJS = checksum.o old-checksum.o semaphore.o delay.o \ usercopy.o getuser.o putuser.o -ifeq ($(CONFIG_X86_CPU_OPTIMIZATIONS),y) - L_OBJS += best_function.o simd.o -endif - include $(TOPDIR)/Rules.make Index: oldkernel/linux/arch/i386/mm/init.c diff -u linux/arch/i386/mm/init.c:1.4 linux/arch/i386/mm/init.c:1.5 --- linux/arch/i386/mm/init.c:1.4 Thu Jun 1 17:04:06 2000 +++ linux/arch/i386/mm/init.c Fri Jul 7 15:36:42 2000 @@ -35,6 +35,40 @@ extern void show_net_buffers(void); extern unsigned long init_smp_mappings(unsigned long); +#ifdef CONFIG_BLK_DEV_INITRD + +extern unsigned long initrd_end,initrd_start; + +static void __init relocate_initrd(unsigned long mem_start,unsigned long mem_end) +{ + unsigned long initrd_size = initrd_end - initrd_start; + unsigned long dest; + + if(!initrd_start || initrd_start >= initrd_end) + return; + if(mem_start > initrd_start) { + printk(KERN_CRIT "initrd already destroyed by paging_init!\n"); + return; + } + + dest = ((mem_end - initrd_size) & PAGE_MASK); + printk(KERN_WARNING "relocating initrd image:\n"); + printk(KERN_WARNING " initrd_start:0x%08lx initrd_end:0x%08lx\n", + initrd_start, initrd_end); + printk(KERN_WARNING " mem_start:0x%08lx mem_end:0x%08lx\n", + mem_start, mem_end); + printk(KERN_WARNING " initrd_size:0x%08lx dest:0x%08lx\n", + initrd_size, dest); + + if((initrd_end < dest) && + (initrd_start > mem_start)) { + __memcpy((void *)dest,(void *)initrd_start,initrd_size); + initrd_start = dest; + initrd_end = initrd_start + initrd_size; + } +} +#endif + void __bad_pte_kernel(pmd_t *pmd) { printk("Bad pmd in pte_alloc: %08lx\n", pmd_val(*pmd)); @@ -327,8 +361,11 @@ #ifndef CONFIG_BIGMEM return free_area_init(start_mem, end_mem); #else - kmap_init(); /* run after fixmap_init */ - return free_area_init(start_mem, bigmem_end + PAGE_OFFSET); +#ifdef CONFIG_BLK_DEV_INITRD + relocate_initrd(start_mem,end_mem); +#endif + kmap_init(); + return(free_area_init(start_mem,bigmem_end + PAGE_OFFSET)); #endif } Index: oldkernel/linux/arch/mips/baget/vacserial.c diff -u linux/arch/mips/baget/vacserial.c:1.1.1.1 linux/arch/mips/baget/vacserial.c:1.2 --- linux/arch/mips/baget/vacserial.c:1.1.1.1 Wed May 31 12:33:53 2000 +++ linux/arch/mips/baget/vacserial.c Fri Jul 7 15:36:42 2000 @@ -2162,7 +2162,7 @@ done: if (off >= len+begin) return 0; - *start = page + (begin-off); + *start = page + (off-begin); return ((count < begin+len-off) ? count : begin+len-off); } Index: oldkernel/linux/arch/ppc/8xx_io/uart.c diff -u linux/arch/ppc/8xx_io/uart.c:1.1.1.1 linux/arch/ppc/8xx_io/uart.c:1.2 --- linux/arch/ppc/8xx_io/uart.c:1.1.1.1 Wed May 31 12:33:53 2000 +++ linux/arch/ppc/8xx_io/uart.c Fri Jul 7 15:36:42 2000 @@ -2050,7 +2050,7 @@ done: if (off >= len+begin) return 0; - *start = page + (begin-off); + *start = page + (off-begin); return ((count < begin+len-off) ? count : begin+len-off); } Index: oldkernel/linux/arch/sparc/config.in diff -u linux/arch/sparc/config.in:1.3 linux/arch/sparc/config.in:1.4 --- linux/arch/sparc/config.in:1.3 Thu Jun 1 15:44:43 2000 +++ linux/arch/sparc/config.in Fri Jul 7 15:36:42 2000 @@ -85,10 +85,13 @@ bool 'Multiple devices driver support' CONFIG_BLK_DEV_MD if [ "$CONFIG_BLK_DEV_MD" = "y" ]; then + bool 'Autodetect RAID partitions' CONFIG_AUTODETECT_RAID tristate ' Linear (append) mode' CONFIG_MD_LINEAR tristate ' RAID-0 (striping) mode' CONFIG_MD_STRIPED tristate ' RAID-1 (mirroring) mode' CONFIG_MD_MIRRORING tristate ' RAID-4/RAID-5 mode' CONFIG_MD_RAID5 + tristate ' Translucent mode' CONFIG_MD_TRANSLUCENT + tristate ' Hierarchical Storage Management support' CONFIG_MD_HSM fi tristate 'RAM disk support' CONFIG_BLK_DEV_RAM Index: oldkernel/linux/arch/sparc/defconfig diff -u linux/arch/sparc/defconfig:1.3 linux/arch/sparc/defconfig:1.4 --- linux/arch/sparc/defconfig:1.3 Thu Jun 1 15:44:43 2000 +++ linux/arch/sparc/defconfig Fri Jul 7 15:36:42 2000 @@ -88,10 +88,13 @@ # CONFIG_BLK_DEV_FD=y CONFIG_BLK_DEV_MD=y +CONFIG_AUTODETECT_RAID=y CONFIG_MD_LINEAR=m CONFIG_MD_STRIPED=m CONFIG_MD_MIRRORING=m CONFIG_MD_RAID5=m +# CONFIG_MD_TRANSLUCENT is not set +# CONFIG_MD_HSM is not set CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_INITRD=y CONFIG_BLK_DEV_LOOP=m Index: oldkernel/linux/arch/sparc/kernel/sys_sparc.c diff -u linux/arch/sparc/kernel/sys_sparc.c:1.2 linux/arch/sparc/kernel/sys_sparc.c:1.3 --- linux/arch/sparc/kernel/sys_sparc.c:1.2 Thu Jun 1 15:03:08 2000 +++ linux/arch/sparc/kernel/sys_sparc.c Fri Jul 7 15:36:42 2000 @@ -176,9 +176,9 @@ } /* Linux version of mmap */ -asmlinkage unsigned long do_mmap2(unsigned long addr, unsigned long len, +asmlinkage unsigned long sys_mmap(unsigned long addr, unsigned long len, unsigned long prot, unsigned long flags, unsigned long fd, - unsigned long pgoff) + unsigned long off) { struct file * file = NULL; unsigned long retval = -EBADF; @@ -211,7 +211,7 @@ goto out_putf; flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); - retval = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); + retval = do_mmap(file, addr, len, prot, flags, off); out_putf: if (file) @@ -222,22 +222,6 @@ return retval; } -asmlinkage unsigned long sys_mmap2(unsigned long addr, unsigned long len, - unsigned long prot, unsigned long flags, unsigned long fd, - unsigned long pgoff) -{ - /* Make sure the shift for mmap2 is constant (12), no matter what PAGE_SIZE - we have. */ - return do_mmap2(addr, len, prot, flags, fd, pgoff >> (PAGE_SHIFT - 12)); -} - -asmlinkage unsigned long sys_mmap(unsigned long addr, unsigned long len, - unsigned long prot, unsigned long flags, unsigned long fd, - unsigned long off) -{ - return do_mmap2(addr, len, prot, flags, fd, off >> PAGE_SHIFT); -} - /* we come to here via sys_nis_syscall so it can setup the regs argument */ asmlinkage unsigned long c_sys_nis_syscall (struct pt_regs *regs) @@ -251,6 +235,13 @@ show_regs (regs); #endif unlock_kernel(); + return -ENOSYS; +} + +/* We don't want to warn about LFS syscalls which are defined in our headers */ +asmlinkage unsigned long +sys_lfs_syscall (void) +{ return -ENOSYS; } Index: oldkernel/linux/arch/sparc/kernel/systbls.S diff -u linux/arch/sparc/kernel/systbls.S:1.2 linux/arch/sparc/kernel/systbls.S:1.3 --- linux/arch/sparc/kernel/systbls.S:1.2 Thu Jun 1 15:03:08 2000 +++ linux/arch/sparc/kernel/systbls.S Fri Jul 7 15:36:42 2000 @@ -1,4 +1,4 @@ -/* $Id: systbls.S,v 1.88 1999/12/21 14:09:06 jj Exp $ +/* $Id: systbls.S,v 1.83.2.1 1999/09/22 11:37:27 jj Exp $ * systbls.S: System call entry point tables for OS compatibility. * The native Linux system call table lives here also. * @@ -29,12 +29,12 @@ /*40*/ .long sys_newlstat, sys_dup, sys_pipe, sys_times, sys_nis_syscall /*45*/ .long sys_umount, sys_setgid, sys_getgid, sys_signal, sys_geteuid /*50*/ .long sys_getegid, sys_acct, sys_nis_syscall, sys_nis_syscall, sys_ioctl -/*55*/ .long sys_reboot, sys_mmap2, sys_symlink, sys_readlink, sys_execve -/*60*/ .long sys_umask, sys_chroot, sys_newfstat, sys_fstat64, sys_getpagesize +/*55*/ .long sys_reboot, sys_lfs_syscall, sys_symlink, sys_readlink, sys_execve +/*60*/ .long sys_umask, sys_chroot, sys_newfstat, sys_lfs_syscall, sys_getpagesize /*65*/ .long sys_msync, sys_vfork, sys_pread, sys_pwrite, sys_nis_syscall /*70*/ .long sys_nis_syscall, sys_mmap, sys_nis_syscall, sys_munmap, sys_mprotect -/*75*/ .long sys_nis_syscall, sys_vhangup, sys_truncate64, sys_nis_syscall, sys_getgroups -/*80*/ .long sys_setgroups, sys_getpgrp, sys_nis_syscall, sys_setitimer, sys_ftruncate64 +/*75*/ .long sys_nis_syscall, sys_vhangup, sys_lfs_syscall, sys_nis_syscall, sys_getgroups +/*80*/ .long sys_setgroups, sys_getpgrp, sys_nis_syscall, sys_setitimer, sys_lfs_syscall /*85*/ .long sys_swapon, sys_getitimer, sys_nis_syscall, sys_sethostname, sys_nis_syscall /*90*/ .long sys_dup2, sys_nis_syscall, sys_fcntl, sys_select, sys_nis_syscall /*95*/ .long sys_fsync, sys_setpriority, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall @@ -44,8 +44,8 @@ /*115*/ .long sys_nis_syscall, sys_gettimeofday, sys_getrusage, sys_nis_syscall, sys_getcwd /*120*/ .long sys_readv, sys_writev, sys_settimeofday, sys_fchown, sys_fchmod /*125*/ .long sys_nis_syscall, sys_setreuid, sys_setregid, sys_rename, sys_truncate -/*130*/ .long sys_ftruncate, sys_flock, sys_lstat64, sys_nis_syscall, sys_nis_syscall -/*135*/ .long sys_nis_syscall, sys_mkdir, sys_rmdir, sys_utimes, sys_stat64 +/*130*/ .long sys_ftruncate, sys_flock, sys_lfs_syscall, sys_nis_syscall, sys_nis_syscall +/*135*/ .long sys_nis_syscall, sys_mkdir, sys_rmdir, sys_utimes, sys_lfs_syscall /*140*/ .long sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_getrlimit /*145*/ .long sys_setrlimit, sys_nis_syscall, sys_prctl, sys_pciconfig_read, sys_pciconfig_write /*150*/ .long sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_poll, sys_nis_syscall Index: oldkernel/linux/arch/sparc/lib/muldi3.S diff -u linux/arch/sparc/lib/muldi3.S:1.1 linux/arch/sparc/lib/muldi3.S:1.2 --- linux/arch/sparc/lib/muldi3.S:1.1 Thu Jun 1 15:12:09 2000 +++ linux/arch/sparc/lib/muldi3.S Fri Jul 7 15:36:42 2000 @@ -1,4 +1,4 @@ -/* $Id: muldi3.S,v 1.1 2000/06/01 22:12:09 ccr Exp $ +/* $Id: muldi3.S,v 1.2 2000/07/07 22:36:42 sflory Exp $ * muldi3.S: GCC emits these for certain drivers playing * with long longs. * Index: oldkernel/linux/arch/sparc/mm/srmmu.c diff -u linux/arch/sparc/mm/srmmu.c:1.2 linux/arch/sparc/mm/srmmu.c:1.3 --- linux/arch/sparc/mm/srmmu.c:1.2 Thu Jun 1 15:44:43 2000 +++ linux/arch/sparc/mm/srmmu.c Fri Jul 7 15:36:42 2000 @@ -2424,7 +2424,15 @@ BTFIXUPSET_CALL(set_pte, srmmu_set_pte_nocache_swift, BTFIXUPCALL_NORM); BTFIXUPSET_CALL(init_new_context, swift_init_new_context, BTFIXUPCALL_NORM); +#if 1 + /* If granular flushes are ever cured and reenabled in + * swift.S, revert this setting back to non-global iommu + * cache flushes. -DaveM + */ + flush_page_for_dma_global = 1; +#else flush_page_for_dma_global = 0; +#endif /* Are you now convinced that the Swift is one of the * biggest VLSI abortions of all time? Bravo Fujitsu! Index: oldkernel/linux/arch/sparc/mm/swift.S diff -u linux/arch/sparc/mm/swift.S:1.1.1.1 linux/arch/sparc/mm/swift.S:1.2 --- linux/arch/sparc/mm/swift.S:1.1.1.1 Wed May 31 12:33:53 2000 +++ linux/arch/sparc/mm/swift.S Fri Jul 7 15:36:42 2000 @@ -41,10 +41,10 @@ swift_flush_page_to_ram: sethi %hi(0x2000), %o0 1: subcc %o0, 0x10, %o0 - sta %g0, [%o0] ASI_M_TXTC_TAG + add %o0, %o0, %o1 sta %g0, [%o0] ASI_M_DATAC_TAG bne 1b - nop + sta %g0, [%o1] ASI_M_TXTC_TAG retl nop #else Index: oldkernel/linux/arch/sparc64/config.in diff -u linux/arch/sparc64/config.in:1.5 linux/arch/sparc64/config.in:1.6 --- linux/arch/sparc64/config.in:1.5 Thu Jun 1 16:59:06 2000 +++ linux/arch/sparc64/config.in Fri Jul 7 15:36:42 2000 @@ -97,10 +97,13 @@ bool 'Multiple devices driver support' CONFIG_BLK_DEV_MD if [ "$CONFIG_BLK_DEV_MD" = "y" ]; then + bool 'Autodetect RAID partitions' CONFIG_AUTODETECT_RAID tristate ' Linear (append) mode' CONFIG_MD_LINEAR tristate ' RAID-0 (striping) mode' CONFIG_MD_STRIPED tristate ' RAID-1 (mirroring) mode' CONFIG_MD_MIRRORING tristate ' RAID-4/RAID-5 mode' CONFIG_MD_RAID5 + tristate ' Translucent mode' CONFIG_MD_TRANSLUCENT + tristate ' Hierarchical Storage Management support' CONFIG_MD_HSM fi tristate 'RAM disk support' CONFIG_BLK_DEV_RAM Index: oldkernel/linux/arch/sparc64/defconfig diff -u linux/arch/sparc64/defconfig:1.5 linux/arch/sparc64/defconfig:1.6 --- linux/arch/sparc64/defconfig:1.5 Thu Jun 1 16:59:06 2000 +++ linux/arch/sparc64/defconfig Fri Jul 7 15:36:42 2000 @@ -107,10 +107,13 @@ # CONFIG_BLK_DEV_FD=y CONFIG_BLK_DEV_MD=y +CONFIG_AUTODETECT_RAID=y CONFIG_MD_LINEAR=m CONFIG_MD_STRIPED=m CONFIG_MD_MIRRORING=m CONFIG_MD_RAID5=m +# CONFIG_MD_TRANSLUCENT is not set +# CONFIG_MD_HSM is not set CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_INITRD=y CONFIG_BLK_DEV_LOOP=m Index: oldkernel/linux/arch/sparc64/kernel/entry.S diff -u linux/arch/sparc64/kernel/entry.S:1.1.1.1 linux/arch/sparc64/kernel/entry.S:1.2 --- linux/arch/sparc64/kernel/entry.S:1.1.1.1 Wed May 31 12:33:53 2000 +++ linux/arch/sparc64/kernel/entry.S Fri Jul 7 15:36:42 2000 @@ -945,7 +945,17 @@ nop ldx [%g6 + AOFF_task_tss + AOFF_thread_pcr_reg], %o7 wr %g0, %o7, %pcr - wr %g0, %g0, %pic + + /* Blackbird errata workaround. See commentary in + * smp.c:smp_percpu_timer_interrupt() for more + * information. + */ + ba,pt %xcc, 99f + nop + .align 64 +99: wr %g0, %g0, %pic + rd %pic, %g0 + 1: b,pt %xcc, ret_sys_call ldx [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_I0], %o0 sparc_exit: rdpr %otherwin, %g1 Index: oldkernel/linux/arch/sparc64/kernel/head.S diff -u linux/arch/sparc64/kernel/head.S:1.1.1.1 linux/arch/sparc64/kernel/head.S:1.2 --- linux/arch/sparc64/kernel/head.S:1.1.1.1 Wed May 31 12:33:53 2000 +++ linux/arch/sparc64/kernel/head.S Fri Jul 7 15:36:42 2000 @@ -262,7 +262,16 @@ /* Setup "Linux Current Register", thanks Sun 8-) */ wr %g0, 0x1, %pcr - wr %g6, 0x0, %pic + + /* Blackbird errata workaround. See commentary in + * smp.c:smp_percpu_timer_interrupt() for more + * information. + */ + ba,pt %xcc, 99f + nop + .align 64 +99: wr %g6, %g0, %pic + rd %pic, %g0 #endif mov 1, %g5 Index: oldkernel/linux/arch/sparc64/kernel/irq.c diff -u linux/arch/sparc64/kernel/irq.c:1.1.1.1 linux/arch/sparc64/kernel/irq.c:1.2 --- linux/arch/sparc64/kernel/irq.c:1.1.1.1 Wed May 31 12:33:53 2000 +++ linux/arch/sparc64/kernel/irq.c Fri Jul 7 15:36:42 2000 @@ -1230,7 +1230,7 @@ void init_timers(void (*cfunc)(int, void *, struct pt_regs *), unsigned long *clock) { - unsigned long flags; + unsigned long pstate; extern unsigned long timer_tick_offset; int node, err; #ifdef __SMP__ @@ -1253,31 +1253,57 @@ prom_halt(); } - save_and_cli(flags); + /* Guarentee that the following sequences execute + * uninterrupted. + */ + __asm__ __volatile__("rdpr %%pstate, %0\n\t" + "wrpr %0, %1, %%pstate" + : "=r" (pstate) + : "i" (PSTATE_IE)); /* Set things up so user can access tick register for profiling - * purposes. + * purposes. Also workaround BB_ERRATA_1 by doing a dummy + * read back of %tick after writing it. */ __asm__ __volatile__(" sethi %%hi(0x80000000), %%g1 - sllx %%g1, 32, %%g1 - rd %%tick, %%g2 + ba,pt %%xcc, 1f + sllx %%g1, 32, %%g1 + .align 64 + 1: rd %%tick, %%g2 add %%g2, 6, %%g2 andn %%g2, %%g1, %%g2 wrpr %%g2, 0, %%tick -" : /* no outputs */ + rdpr %%tick, %%g0" + : /* no outputs */ : /* no inputs */ : "g1", "g2"); + /* Workaround for Spitfire Errata (#54 I think??), I discovered + * this via Sun BugID 4008234, mentioned in Solaris-2.5.1 patch + * number 103640. + * + * On Blackbird writes to %tick_cmpr can fail, the + * workaround seems to be to execute the wr instruction + * at the start of an I-cache line, and perform a dummy + * read back from %tick_cmpr right after writing to it. -DaveM + */ __asm__ __volatile__(" rd %%tick, %%g1 - add %%g1, %0, %%g1 - wr %%g1, 0x0, %%tick_cmpr" + ba,pt %%xcc, 1f + add %%g1, %0, %%g1 + .align 64 + 1: wr %%g1, 0x0, %%tick_cmpr + rd %%tick_cmpr, %%g0" : /* no outputs */ : "r" (timer_tick_offset) : "g1"); + + /* Restore PSTATE_IE. */ + __asm__ __volatile__("wrpr %0, 0x0, %%pstate" + : /* no outputs */ + : "r" (pstate)); - restore_flags(flags); sti(); } Index: oldkernel/linux/arch/sparc64/kernel/ptrace.c diff -u linux/arch/sparc64/kernel/ptrace.c:1.1.1.1 linux/arch/sparc64/kernel/ptrace.c:1.2 --- linux/arch/sparc64/kernel/ptrace.c:1.1.1.1 Wed May 31 12:33:53 2000 +++ linux/arch/sparc64/kernel/ptrace.c Fri Jul 7 15:36:42 2000 @@ -120,16 +120,14 @@ static __inline__ void write_user_long(unsigned long kvaddr, unsigned long val) { - __asm__ __volatile__("stxa %0, [%1] %2" - : /* no outputs */ - : "r" (val), "r" (__pa(kvaddr)), "i" (ASI_PHYS_USE_EC)); + *(unsigned long *)kvaddr = val; + flush_dcache_page(kvaddr & PAGE_MASK); } static __inline__ void write_user_int(unsigned long kvaddr, unsigned int val) { - __asm__ __volatile__("stwa %0, [%1] %2" - : /* no outputs */ - : "r" (val), "r" (__pa(kvaddr)), "i" (ASI_PHYS_USE_EC)); + *(unsigned int *)kvaddr = val; + flush_dcache_page(kvaddr & PAGE_MASK); } static inline unsigned long get_long(struct task_struct * tsk, @@ -164,11 +162,6 @@ pgaddr = page + (addr & ~PAGE_MASK); write_user_long(pgaddr, data); - - __asm__ __volatile__(" - membar #StoreStore - flush %0 -" : : "r" (pgaddr & ~7) : "memory"); } /* we're bypassing pagetables, so we have to set the dirty bit ourselves */ /* this should also re-instate whatever read-only mode there was before */ @@ -209,11 +202,6 @@ pgaddr = page + (addr & ~PAGE_MASK); write_user_int(pgaddr, data); - - __asm__ __volatile__(" - membar #StoreStore - flush %0 -" : : "r" (pgaddr & ~7) : "memory"); } /* we're bypassing pagetables, so we have to set the dirty bit ourselves */ /* this should also re-instate whatever read-only mode there was before */ Index: oldkernel/linux/arch/sparc64/kernel/setup.c diff -u linux/arch/sparc64/kernel/setup.c:1.1.1.1 linux/arch/sparc64/kernel/setup.c:1.2 --- linux/arch/sparc64/kernel/setup.c:1.1.1.1 Wed May 31 12:33:53 2000 +++ linux/arch/sparc64/kernel/setup.c Fri Jul 7 15:36:42 2000 @@ -160,9 +160,17 @@ } if ((va >= KERNBASE) && (va < (KERNBASE + (4 * 1024 * 1024)))) { + /* Spitfire Errata #32 workaround */ + __asm__ __volatile__("stxa %0, [%1] %2\n\t" + "flush %%g6" + : /* No outputs */ + : "r" (0), + "r" (PRIMARY_CONTEXT), "i" (ASI_DMMU)); + /* * Locked down tlb entry 63. */ + tte = spitfire_get_dtlb_data(63); res = PROM_TRUE; goto done; Index: oldkernel/linux/arch/sparc64/kernel/smp.c diff -u linux/arch/sparc64/kernel/smp.c:1.1.1.1 linux/arch/sparc64/kernel/smp.c:1.2 --- linux/arch/sparc64/kernel/smp.c:1.1.1.1 Wed May 31 12:33:53 2000 +++ linux/arch/sparc64/kernel/smp.c Fri Jul 7 15:36:42 2000 @@ -119,6 +119,7 @@ __initfunc(void smp_callin(void)) { int cpuid = hard_smp_processor_id(); + unsigned long pstate; inherit_locked_prom_mappings(0); @@ -127,18 +128,37 @@ cpu_probe(); - /* Master did this already, now is the time for us to do it. */ + /* Guarentee that the following sequences execute + * uninterrupted. + */ + __asm__ __volatile__("rdpr %%pstate, %0\n\t" + "wrpr %0, %1, %%pstate" + : "=r" (pstate) + : "i" (PSTATE_IE)); + + /* Set things up so user can access tick register for profiling + * purposes. Also workaround BB_ERRATA_1 by doing a dummy + * read back of %tick after writing it. + */ __asm__ __volatile__(" sethi %%hi(0x80000000), %%g1 - sllx %%g1, 32, %%g1 - rd %%tick, %%g2 + ba,pt %%xcc, 1f + sllx %%g1, 32, %%g1 + .align 64 +1: rd %%tick, %%g2 add %%g2, 6, %%g2 andn %%g2, %%g1, %%g2 wrpr %%g2, 0, %%tick -" : /* no outputs */ + rdpr %%tick, %%g0" + : /* no outputs */ : /* no inputs */ : "g1", "g2"); + /* Restore PSTATE_IE. */ + __asm__ __volatile__("wrpr %0, 0x0, %%pstate" + : /* no outputs */ + : "r" (pstate)); + smp_setup_percpu_timer(); __sti(); @@ -280,6 +300,13 @@ smp_processor_id(), data0, data1, data2, target); #endif again: + /* Ok, this is the real Spitfire Errata #54. + * One must read back from a UDB internal register + * after writes to the UDB interrupt dispatch, but + * before the membar Sync for that write. + * So we use the high UDB control register (ASI 0x7f, + * ADDR 0x20) for the dummy read. -DaveM + */ __asm__ __volatile__(" wrpr %0, %1, %%pstate wr %%g0, %2, %%asi @@ -288,10 +315,14 @@ stxa %5, [0x60] %%asi membar #Sync stxa %%g0, [%6] %%asi + membar #Sync + mov 0x20, %%g1 + ldxa [%%g1] 0x7f, %%g0 membar #Sync" : /* No outputs */ : "r" (pstate), "i" (PSTATE_IE), "i" (ASI_UDB_INTR_W), - "r" (data0), "r" (data1), "r" (data2), "r" (target)); + "r" (data0), "r" (data1), "r" (data2), "r" (target) + : "g1"); /* NOTE: PSTATE_IE is still clear. */ stuck = 100000; @@ -589,7 +620,7 @@ void smp_percpu_timer_interrupt(struct pt_regs *regs) { - unsigned long compare, tick; + unsigned long compare, tick, pstate; int cpu = smp_processor_id(); int user = user_mode(regs); @@ -655,27 +686,87 @@ prof_counter(cpu) = prof_multiplier(cpu); } + /* Guarentee that the following sequences execute + * uninterrupted. + */ + __asm__ __volatile__("rdpr %%pstate, %0\n\t" + "wrpr %0, %1, %%pstate" + : "=r" (pstate) + : "i" (PSTATE_IE)); + + /* Workaround for Spitfire Errata (#54 I think??), I discovered + * this via Sun BugID 4008234, mentioned in Solaris-2.5.1 patch + * number 103640. + * + * On Blackbird writes to %tick_cmpr can fail, the + * workaround seems to be to execute the wr instruction + * at the start of an I-cache line, and perform a dummy + * read back from %tick_cmpr right after writing to it. -DaveM + * + * Just to be anal we add a workaround for Spitfire + * Errata 50 by preventing pipeline bypasses on the + * final read of the %tick register into a compare + * instruction. The Errata 50 description states + * that %tick is not prone to this bug, but I am not + * taking any chances. + */ __asm__ __volatile__("rd %%tick_cmpr, %0\n\t" - "add %0, %2, %0\n\t" - "wr %0, 0x0, %%tick_cmpr\n\t" - "rd %%tick, %1" + "ba,pt %%xcc, 1f\n\t" + " add %0, %2, %0\n\t" + ".align 64\n" + "1: wr %0, 0x0, %%tick_cmpr\n\t" + "rd %%tick_cmpr, %%g0\n\t" + "rd %%tick, %1\n\t" + "mov %1, %1" : "=&r" (compare), "=r" (tick) : "r" (current_tick_offset)); + + /* Restore PSTATE_IE. */ + __asm__ __volatile__("wrpr %0, 0x0, %%pstate" + : /* no outputs */ + : "r" (pstate)); } while (tick >= compare); } __initfunc(static void smp_setup_percpu_timer(void)) { int cpu = smp_processor_id(); + unsigned long pstate; prof_counter(cpu) = prof_multiplier(cpu) = 1; + + /* Guarentee that the following sequences execute + * uninterrupted. + */ + __asm__ __volatile__("rdpr %%pstate, %0\n\t" + "wrpr %0, %1, %%pstate" + : "=r" (pstate) + : "i" (PSTATE_IE)); + + /* Workaround for Spitfire Errata (#54 I think??), I discovered + * this via Sun BugID 4008234, mentioned in Solaris-2.5.1 patch + * number 103640. + * + * On Blackbird writes to %tick_cmpr can fail, the + * workaround seems to be to execute the wr instruction + * at the start of an I-cache line, and perform a dummy + * read back from %tick_cmpr right after writing to it. -DaveM + */ + __asm__ __volatile__(" + rd %%tick, %%g1 + ba,pt %%xcc, 1f + add %%g1, %0, %%g1 + .align 64 + 1: wr %%g1, 0x0, %%tick_cmpr + rd %%tick_cmpr, %%g0" + : /* no outputs */ + : "r" (current_tick_offset) + : "g1"); - __asm__ __volatile__("rd %%tick, %%g1\n\t" - "add %%g1, %0, %%g1\n\t" - "wr %%g1, 0x0, %%tick_cmpr" + /* Restore PSTATE_IE. */ + __asm__ __volatile__("wrpr %0, 0x0, %%pstate" : /* no outputs */ - : "r" (current_tick_offset) - : "g1"); + : "r" (pstate)); } __initfunc(void smp_tick_init(void)) Index: oldkernel/linux/arch/sparc64/kernel/sparc64_ksyms.c diff -u linux/arch/sparc64/kernel/sparc64_ksyms.c:1.3 linux/arch/sparc64/kernel/sparc64_ksyms.c:1.4 --- linux/arch/sparc64/kernel/sparc64_ksyms.c:1.3 Thu Jun 1 15:03:08 2000 +++ linux/arch/sparc64/kernel/sparc64_ksyms.c Fri Jul 7 15:36:42 2000 @@ -82,7 +82,6 @@ extern int sys32_ioctl(unsigned int fd, unsigned int cmd, u32 arg); extern int (*handle_mathemu)(struct pt_regs *, struct fpustate *); extern void VISenter(void); -extern long sparc32_open(const char * filename, int flags, int mode); extern void bcopy (const char *, char *, int); extern int __ashrdi3(int, int); @@ -164,6 +163,8 @@ EXPORT_SYMBOL_PRIVATE(flushw_user); +EXPORT_SYMBOL(flush_dcache_page); + EXPORT_SYMBOL(mstk48t02_regs); EXPORT_SYMBOL(request_fast_irq); EXPORT_SYMBOL(sparc_alloc_io); @@ -267,7 +268,6 @@ EXPORT_SYMBOL(prom_cpu_nodes); EXPORT_SYMBOL(sys_ioctl); EXPORT_SYMBOL(sys32_ioctl); -EXPORT_SYMBOL(sparc32_open); EXPORT_SYMBOL(move_addr_to_kernel); EXPORT_SYMBOL(move_addr_to_user); #endif Index: oldkernel/linux/arch/sparc64/kernel/sys32.S diff -u linux/arch/sparc64/kernel/sys32.S:1.3 linux/arch/sparc64/kernel/sys32.S:1.4 --- linux/arch/sparc64/kernel/sys32.S:1.3 Thu Jun 1 15:44:43 2000 +++ linux/arch/sparc64/kernel/sys32.S Fri Jul 7 15:36:42 2000 @@ -1,4 +1,4 @@ -/* $Id: sys32.S,v 1.9 1999/12/21 14:09:18 jj Exp $ +/* $Id: sys32.S,v 1.8.2.1 2000/01/24 11:36:55 jj Exp $ * sys32.S: I-cache tricks for 32-bit compatability layer simple * conversions. * @@ -60,12 +60,3 @@ sethi %hi(sys_bdflush), %g1 jmpl %g1 + %lo(sys_bdflush), %g0 sra %o1, 0, %o1 - - .align 32 - .globl sys32_mmap2 -sys32_mmap2: - srl %o4, 0, %o4 - sethi %hi(sys_mmap), %g1 - srl %o5, 0, %o5 - jmpl %g1 + %lo(sys_mmap), %g0 - sllx %o5, 12, %o5 Index: oldkernel/linux/arch/sparc64/kernel/sys_sparc.c diff -u linux/arch/sparc64/kernel/sys_sparc.c:1.1.1.1 linux/arch/sparc64/kernel/sys_sparc.c:1.2 --- linux/arch/sparc64/kernel/sys_sparc.c:1.1.1.1 Wed May 31 12:33:53 2000 +++ linux/arch/sparc64/kernel/sys_sparc.c Fri Jul 7 15:36:42 2000 @@ -214,6 +214,13 @@ return -ENOSYS; } +/* We don't want to warn about LFS syscalls which are defined in our headers */ +asmlinkage unsigned long +sys_lfs_syscall (void) +{ + return -ENOSYS; +} + /* #define DEBUG_SPARC_BREAKPOINT */ asmlinkage void Index: oldkernel/linux/arch/sparc64/kernel/sys_sparc32.c diff -u linux/arch/sparc64/kernel/sys_sparc32.c:1.3 linux/arch/sparc64/kernel/sys_sparc32.c:1.4 --- linux/arch/sparc64/kernel/sys_sparc32.c:1.3 Thu Jun 1 15:44:43 2000 +++ linux/arch/sparc64/kernel/sys_sparc32.c Fri Jul 7 15:36:42 2000 @@ -579,30 +579,6 @@ return err; } -static inline int get_flock64(struct flock *kfl, struct flock32_64 *ufl) -{ - int err; - - err = get_user(kfl->l_type, &ufl->l_type); - err |= __get_user(kfl->l_whence, &ufl->l_whence); - err |= __get_user(kfl->l_start, &ufl->l_start); - err |= __get_user(kfl->l_len, &ufl->l_len); - err |= __get_user(kfl->l_pid, &ufl->l_pid); - return err; -} - -static inline int put_flock64(struct flock *kfl, struct flock32_64 *ufl) -{ - int err; - - err = __put_user(kfl->l_type, &ufl->l_type); - err |= __put_user(kfl->l_whence, &ufl->l_whence); - err |= __put_user(kfl->l_start, &ufl->l_start); - err |= __put_user(kfl->l_len, &ufl->l_len); - err |= __put_user(kfl->l_pid, &ufl->l_pid); - return err; -} - extern asmlinkage long sys_fcntl(unsigned int fd, unsigned int cmd, unsigned long arg); asmlinkage long sys32_fcntl(unsigned int fd, unsigned int cmd, unsigned long arg) @@ -621,31 +597,10 @@ old_fs = get_fs(); set_fs (KERNEL_DS); ret = sys_fcntl(fd, cmd, (unsigned long)&f); set_fs (old_fs); - if (f.l_start >= 0x7fffffffUL || - f.l_len >= 0x7fffffffUL || - f.l_start + f.l_len >= 0x7fffffffUL) - return -EOVERFLOW; if(put_flock(&f, (struct flock32 *)arg)) return -EFAULT; return ret; } - case F_GETLK64: - case F_SETLK64: - case F_SETLKW64: - { - struct flock f; - mm_segment_t old_fs; - long ret; - - if(get_flock64(&f, (struct flock32_64 *)arg)) - return -EFAULT; - old_fs = get_fs(); set_fs (KERNEL_DS); - ret = sys_fcntl(fd, cmd + F_GETLK - F_GETLK64, (unsigned long)&f); - set_fs (old_fs); - if(put_flock64(&f, (struct flock32_64 *)arg)) - return -EFAULT; - return ret; - } default: return sys_fcntl(fd, cmd, (unsigned long)arg); } @@ -762,25 +717,6 @@ return ret; } -extern asmlinkage long sys_truncate(const char * path, unsigned long length); -extern asmlinkage long sys_ftruncate(unsigned int fd, unsigned long length); - -asmlinkage int sys32_truncate64(const char * path, unsigned long high, unsigned long low) -{ - if ((int)high < 0) - return -EINVAL; - else - return sys_truncate(path, (high << 32) | low); -} - -asmlinkage int sys32_ftruncate64(unsigned int fd, unsigned long high, unsigned long low) -{ - if ((int)high < 0) - return -EINVAL; - else - return sys_ftruncate(fd, (high << 32) | low); -} - extern asmlinkage int sys_utime(char * filename, struct utimbuf * times); struct utimbuf32 { @@ -3752,6 +3688,10 @@ case NFSCTL_GETFH: err = nfs_getfh32_trans(karg, arg32); break; + case NFSCTL_LOCKD: + /* No arguments, no translations... */ + err = 0; + break; default: err = -EINVAL; break; @@ -4078,37 +4018,4 @@ ret = -EFAULT; return ret; -} - -/* This is just a version for 32-bit applications which does - * not force O_LARGEFILE on. - */ - -asmlinkage long sparc32_open(const char * filename, int flags, int mode) -{ - char * tmp; - int fd, error; - - tmp = getname(filename); - fd = PTR_ERR(tmp); - if (!IS_ERR(tmp)) { - lock_kernel(); - fd = get_unused_fd(); - if (fd >= 0) { - struct file * f = filp_open(tmp, flags, mode); - error = PTR_ERR(f); - if (IS_ERR(f)) - goto out_error; - fd_install(fd, f); - } -out: - unlock_kernel(); - putname(tmp); - } - return fd; - -out_error: - put_unused_fd(fd); - fd = error; - goto out; } Index: oldkernel/linux/arch/sparc64/kernel/sys_sunos32.c diff -u linux/arch/sparc64/kernel/sys_sunos32.c:1.3 linux/arch/sparc64/kernel/sys_sunos32.c:1.4 --- linux/arch/sparc64/kernel/sys_sunos32.c:1.3 Thu Jun 1 15:44:43 2000 +++ linux/arch/sparc64/kernel/sys_sunos32.c Fri Jul 7 15:36:42 2000 @@ -1296,15 +1296,13 @@ return rval; } -extern asmlinkage long sparc32_open(const char * filename, int flags, int mode); - asmlinkage int sunos_open(u32 filename, int flags, int mode) { int ret; lock_kernel(); current->personality |= PER_BSD; - ret = sparc32_open ((char *)A(filename), flags, mode); + ret = sys_open ((char *)A(filename), flags, mode); unlock_kernel(); return ret; } Index: oldkernel/linux/arch/sparc64/kernel/systbls.S diff -u linux/arch/sparc64/kernel/systbls.S:1.3 linux/arch/sparc64/kernel/systbls.S:1.4 --- linux/arch/sparc64/kernel/systbls.S:1.3 Thu Jun 1 15:44:43 2000 +++ linux/arch/sparc64/kernel/systbls.S Fri Jul 7 15:36:42 2000 @@ -1,4 +1,4 @@ -/* $Id: systbls.S,v 1.62 2000/01/04 23:54:43 davem Exp $ +/* $Id: systbls.S,v 1.53.2.3 2000/01/24 22:14:40 davem Exp $ * systbls.S: System call entry point tables for OS compatibility. * The native Linux system call table lives here also. * @@ -20,9 +20,9 @@ .globl sys_call_table32 sys_call_table32: /*0*/ .word sys_nis_syscall, sparc_exit, sys_fork, sys_read, sys_write -/*5*/ .word sparc32_open, sys_close, sys32_wait4, sys_creat, sys_link -/*10*/ .word sys_unlink, sunos_execv, sys_chdir, sys32_chown, sys32_mknod -/*15*/ .word sys32_chmod, sys32_lchown, sparc_brk, sys_perfctr, sys32_lseek +/*5*/ .word sys_open, sys_close, sys32_wait4, sys_creat, sys_link +/*10*/ .word sys_unlink, sunos_execv, sys_chdir, sys32_chown16, sys32_mknod +/*15*/ .word sys32_chmod, sys32_lchown16, sparc_brk, sys_perfctr, sys32_lseek /*20*/ .word sys_getpid, sys_capget, sys_capset, sys_setuid, sys_getuid /*25*/ .word sys_time, sys_ptrace, sys_alarm, sys32_sigaltstack, sys32_pause /*30*/ .word sys32_utime, sys_nis_syscall, sys_nis_syscall, sys_access, sys_nice @@ -30,12 +30,12 @@ /*40*/ .word sys32_newlstat, sys_dup, sys_pipe, sys32_times, sys_nis_syscall .word sys_umount, sys_setgid, sys_getgid, sys_signal, sys_geteuid /*50*/ .word sys_getegid, sys_acct, sys_nis_syscall, sys_nis_syscall, sys32_ioctl - .word sys_reboot, sys32_mmap2, sys_symlink, sys_readlink, sys32_execve -/*60*/ .word sys_umask, sys_chroot, sys32_newfstat, sys_fstat64, sys_getpagesize + .word sys_reboot, sys_lfs_syscall, sys_symlink, sys_readlink, sys32_execve +/*60*/ .word sys_umask, sys_chroot, sys32_newfstat, sys_lfs_syscall, sys_getpagesize .word sys_msync, sys_vfork, sys32_pread, sys32_pwrite, sys_nis_syscall /*70*/ .word sys_nis_syscall, sys32_mmap, sys_nis_syscall, sys_munmap, sys_mprotect - .word sys_nis_syscall, sys_vhangup, sys32_truncate64, sys_nis_syscall, sys32_getgroups -/*80*/ .word sys32_setgroups, sys_getpgrp, sys_nis_syscall, sys32_setitimer, sys32_ftruncate64 + .word sys_nis_syscall, sys_vhangup, sys_lfs_syscall, sys_nis_syscall, sys32_getgroups +/*80*/ .word sys32_setgroups, sys_getpgrp, sys_nis_syscall, sys32_setitimer, sys_lfs_syscall .word sys_swapon, sys32_getitimer, sys_nis_syscall, sys_sethostname, sys_nis_syscall /*90*/ .word sys_dup2, sys_nis_syscall, sys32_fcntl, sys32_select, sys_nis_syscall .word sys_fsync, sys_setpriority, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall @@ -45,8 +45,8 @@ .word sys_nis_syscall, sys32_gettimeofday, sys32_getrusage, sys_nis_syscall, sys_getcwd /*120*/ .word sys32_readv, sys32_writev, sys32_settimeofday, sys32_fchown16, sys_fchmod .word sys_nis_syscall, sys32_setreuid, sys32_setregid, sys_rename, sys_truncate -/*130*/ .word sys_ftruncate, sys_flock, sys_lstat64, sys_nis_syscall, sys_nis_syscall - .word sys_nis_syscall, sys_mkdir, sys_rmdir, sys32_utimes, sys_stat64 +/*130*/ .word sys_ftruncate, sys_flock, sys_lfs_syscall, sys_nis_syscall, sys_nis_syscall + .word sys_nis_syscall, sys_mkdir, sys_rmdir, sys32_utimes, sys_lfs_syscall /*140*/ .word sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys32_getrlimit .word sys32_setrlimit, sys_nis_syscall, sys32_prctl, sys32_pciconfig_read, sys32_pciconfig_write /*150*/ .word sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_poll, sys_nis_syscall @@ -114,15 +114,15 @@ .word sys_quotactl, sys_nis_syscall, sys_mount, sys_ustat, sys_nis_syscall /*170*/ .word sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_getdents .word sys_setsid, sys_fchdir, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall -/*180*/ .word sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_query_module +/*180*/ .word sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_sigpending, sys_query_module .word sys_setpgid, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_newuname /*190*/ .word sys_init_module, sys_personality, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall - .word sys_nis_syscall, sys_nis_syscall, sys_getppid, sys_nis_syscall, sys_sgetmask -/*200*/ .word sys_ssetmask, sys_nis_syscall, sys_newlstat, sys_uselib, sys_nis_syscall + .word sys_nis_syscall, sys_nis_syscall, sys_getppid, sys_sigaction, sys_sgetmask +/*200*/ .word sys_ssetmask, sys_sigsuspend, sys_newlstat, sys_uselib, sys_nis_syscall .word sys_nis_syscall, sys_socketcall, sys_syslog, sys_nis_syscall, sys_nis_syscall /*210*/ .word sys_idle, sys_nis_syscall, sys_waitpid, sys_swapoff, sys_sysinfo - .word sys_ipc, sys_nis_syscall, sys_clone, sys_nis_syscall, sys_adjtimex -/*220*/ .word sys_nis_syscall, sys_create_module, sys_delete_module, sys_get_kernel_syms, sys_getpgid + .word sys_ipc, sys_sigreturn, sys_clone, sys_nis_syscall, sys_adjtimex +/*220*/ .word sys_sigprocmask, sys_create_module, sys_delete_module, sys_get_kernel_syms, sys_getpgid .word sys_bdflush, sys_sysfs, sys_nis_syscall, sys_setfsuid, sys_setfsgid /*230*/ .word sys_select, sys_time, sys_nis_syscall, sys_stime, sys_nis_syscall .word sys_nis_syscall, sys_llseek, sys_mlock, sys_munlock, sys_mlockall Index: oldkernel/linux/arch/sparc64/kernel/time.c diff -u linux/arch/sparc64/kernel/time.c:1.1.1.1 linux/arch/sparc64/kernel/time.c:1.2 --- linux/arch/sparc64/kernel/time.c:1.1.1.1 Wed May 31 12:33:53 2000 +++ linux/arch/sparc64/kernel/time.c Fri Jul 7 15:36:42 2000 @@ -1,4 +1,4 @@ -/* $Id: time.c,v 1.20.2.1 1999/10/09 06:03:23 davem Exp $ +/* $Id: time.c,v 1.20.2.2 2000/03/02 02:03:31 davem Exp $ * time.c: UltraSparc timer and TOD clock support. * * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu) @@ -69,20 +69,53 @@ static void timer_interrupt(int irq, void *dev_id, struct pt_regs * regs) { - unsigned long ticks; + unsigned long ticks, pstate; write_lock(&xtime_lock); do { do_timer(regs); + /* Guarentee that the following sequences execute + * uninterrupted. + */ + __asm__ __volatile__("rdpr %%pstate, %0\n\t" + "wrpr %0, %1, %%pstate" + : "=r" (pstate) + : "i" (PSTATE_IE)); + + /* Workaround for Spitfire Errata (#54 I think??), I discovered + * this via Sun BugID 4008234, mentioned in Solaris-2.5.1 patch + * number 103640. + * + * On Blackbird writes to %tick_cmpr can fail, the + * workaround seems to be to execute the wr instruction + * at the start of an I-cache line, and perform a dummy + * read back from %tick_cmpr right after writing to it. -DaveM + * + * Just to be anal we add a workaround for Spitfire + * Errata 50 by preventing pipeline bypasses on the + * final read of the %tick register into a compare + * instruction. The Errata 50 description states + * that %tick is not prone to this bug, but I am not + * taking any chances. + */ __asm__ __volatile__(" rd %%tick_cmpr, %0 - add %0, %2, %0 - wr %0, 0, %%tick_cmpr - rd %%tick, %1" + ba,pt %%xcc, 1f + add %0, %2, %0 + .align 64 + 1: wr %0, 0, %%tick_cmpr + rd %%tick_cmpr, %%g0 + rd %%tick, %1 + mov %1, %1" : "=&r" (timer_tick_compare), "=r" (ticks) : "r" (timer_tick_offset)); + + /* Restore PSTATE_IE. */ + __asm__ __volatile__("wrpr %0, 0x0, %%pstate" + : /* no outputs */ + : "r" (pstate)); } while (ticks >= timer_tick_compare); timer_check_rtc(); Index: oldkernel/linux/arch/sparc64/kernel/unaligned.c diff -u linux/arch/sparc64/kernel/unaligned.c:1.1.1.1 linux/arch/sparc64/kernel/unaligned.c:1.2 --- linux/arch/sparc64/kernel/unaligned.c:1.1.1.1 Wed May 31 12:33:53 2000 +++ linux/arch/sparc64/kernel/unaligned.c Fri Jul 7 15:36:42 2000 @@ -587,9 +587,19 @@ maybe_flush_windows(0, 0, rd, from_kernel); reg = fetch_reg_addr(rd, regs); - if ((insn & 0x780000) == 0x180000) - reg[1] = 0; - reg[0] = 0; + if (from_kernel || rd < 16) { + reg[0] = 0; + if ((insn & 0x780000) == 0x180000) + reg[1] = 0; + } else if (current->tss.flags & SPARC_FLAG_32BIT) { + put_user(0, (int *)reg); + if ((insn & 0x780000) == 0x180000) + put_user(0, ((int *)reg) + 1); + } else { + put_user(0, reg); + if ((insn & 0x780000) == 0x180000) + put_user(0, reg + 1); + } advance(regs); } Index: oldkernel/linux/arch/sparc64/lib/blockops.S diff -u linux/arch/sparc64/lib/blockops.S:1.1.1.1 linux/arch/sparc64/lib/blockops.S:1.2 --- linux/arch/sparc64/lib/blockops.S:1.1.1.1 Wed May 31 12:33:53 2000 +++ linux/arch/sparc64/lib/blockops.S Fri Jul 7 15:36:42 2000 @@ -46,13 +46,37 @@ sethi %hi(TLBTEMP_ENT1), %o3 rdpr %pstate, %g3 wrpr %g3, PSTATE_IE, %pstate + + /* Spitfire Errata #32 workaround */ + mov 0x8, %o4 + stxa %g0, [%o4] ASI_DMMU + flush %g6 + ldxa [%o3] ASI_DTLB_TAG_READ, %o4 + + /* Spitfire Errata #32 workaround */ + mov 0x8, %o5 + stxa %g0, [%o5] ASI_DMMU + flush %g6 + ldxa [%o3] ASI_DTLB_DATA_ACCESS, %o5 stxa %o0, [%o2] ASI_DMMU stxa %g1, [%o3] ASI_DTLB_DATA_ACCESS membar #Sync add %o3, (TLBTEMP_ENTSZ), %o3 + + /* Spitfire Errata #32 workaround */ + mov 0x8, %g5 + stxa %g0, [%g5] ASI_DMMU + flush %g6 + ldxa [%o3] ASI_DTLB_TAG_READ, %g5 + + /* Spitfire Errata #32 workaround */ + mov 0x8, %g7 + stxa %g0, [%g7] ASI_DMMU + flush %g6 + ldxa [%o3] ASI_DTLB_DATA_ACCESS, %g7 stxa %o1, [%o2] ASI_DMMU stxa %g2, [%o3] ASI_DTLB_DATA_ACCESS @@ -120,7 +144,19 @@ sethi %hi(TLBTEMP_ENT2), %o3 rdpr %pstate, %g3 wrpr %g3, PSTATE_IE, %pstate + + /* Spitfire Errata #32 workaround */ + mov 0x8, %g5 + stxa %g0, [%g5] ASI_DMMU + flush %g6 + ldxa [%o3] ASI_DTLB_TAG_READ, %g5 + + /* Spitfire Errata #32 workaround */ + mov 0x8, %g7 + stxa %g0, [%g7] ASI_DMMU + flush %g6 + ldxa [%o3] ASI_DTLB_DATA_ACCESS, %g7 stxa %o0, [%o2] ASI_DMMU stxa %g1, [%o3] ASI_DTLB_DATA_ACCESS Index: oldkernel/linux/arch/sparc64/mm/init.c diff -u linux/arch/sparc64/mm/init.c:1.1.1.1 linux/arch/sparc64/mm/init.c:1.2 --- linux/arch/sparc64/mm/init.c:1.1.1.1 Wed May 31 12:33:53 2000 +++ linux/arch/sparc64/mm/init.c Fri Jul 7 15:36:42 2000 @@ -709,6 +709,14 @@ /* Now fixup OBP's idea about where we really are mapped. */ prom_printf("Remapping the kernel... "); + + /* Spitfire Errata #32 workaround */ + __asm__ __volatile__("stxa %0, [%1] %2\n\t" + "flush %%g6" + : /* No outputs */ + : "r" (0), + "r" (PRIMARY_CONTEXT), "i" (ASI_DMMU)); + phys_page = spitfire_get_dtlb_data(63) & _PAGE_PADDR; phys_page += ((unsigned long)&prom_boot_page - (unsigned long)&empty_zero_page); @@ -731,11 +739,27 @@ : "memory"); tte_vaddr = (unsigned long) &empty_zero_page; + + /* Spitfire Errata #32 workaround */ + __asm__ __volatile__("stxa %0, [%1] %2\n\t" + "flush %%g6" + : /* No outputs */ + : "r" (0), + "r" (PRIMARY_CONTEXT), "i" (ASI_DMMU)); + kern_locked_tte_data = tte_data = spitfire_get_dtlb_data(63); remap_func = (void *) ((unsigned long) &prom_remap - (unsigned long) &prom_boot_page); + + /* Spitfire Errata #32 workaround */ + __asm__ __volatile__("stxa %0, [%1] %2\n\t" + "flush %%g6" + : /* No outputs */ + : "r" (0), + "r" (PRIMARY_CONTEXT), "i" (ASI_DMMU)); + remap_func(spitfire_get_dtlb_data(63) & _PAGE_PADDR, (unsigned long) &empty_zero_page, prom_get_mmu_ihandle()); @@ -798,8 +822,16 @@ /* Only DTLB must be checked for VPTE entries. */ for(i = 0; i < 63; i++) { - unsigned long tag = spitfire_get_dtlb_tag(i); + unsigned long tag; + + /* Spitfire Errata #32 workaround */ + __asm__ __volatile__("stxa %0, [%1] %2\n\t" + "flush %%g6" + : /* No outputs */ + : "r" (0), + "r" (PRIMARY_CONTEXT), "i" (ASI_DMMU)); + tag = spitfire_get_dtlb_tag(i); if(((tag & ~(PAGE_MASK)) == 0) && ((tag & (PAGE_MASK)) >= prom_reserved_base)) { __asm__ __volatile__("stxa %%g0, [%0] %1" @@ -912,10 +944,26 @@ for(i = 0; i < 63; i++) { unsigned long data; + + /* Spitfire Errata #32 workaround */ + __asm__ __volatile__("stxa %0, [%1] %2\n\t" + "flush %%g6" + : /* No outputs */ + : "r" (0), + "r" (PRIMARY_CONTEXT), "i" (ASI_DMMU)); + data = spitfire_get_dtlb_data(i); if((data & (_PAGE_L|_PAGE_VALID)) == (_PAGE_L|_PAGE_VALID)) { - unsigned long tag = spitfire_get_dtlb_tag(i); + unsigned long tag; + /* Spitfire Errata #32 workaround */ + __asm__ __volatile__("stxa %0, [%1] %2\n\t" + "flush %%g6" + : /* No outputs */ + : "r" (0), + "r" (PRIMARY_CONTEXT), "i" (ASI_DMMU)); + + tag = spitfire_get_dtlb_tag(i); if(save_p) { prom_dtlb[dtlb_seen].tlb_ent = i; prom_dtlb[dtlb_seen].tlb_tag = tag; @@ -935,10 +983,25 @@ for(i = 0; i < 63; i++) { unsigned long data; + /* Spitfire Errata #32 workaround */ + __asm__ __volatile__("stxa %0, [%1] %2\n\t" + "flush %%g6" + : /* No outputs */ + : "r" (0), + "r" (PRIMARY_CONTEXT), "i" (ASI_DMMU)); + data = spitfire_get_itlb_data(i); if((data & (_PAGE_L|_PAGE_VALID)) == (_PAGE_L|_PAGE_VALID)) { - unsigned long tag = spitfire_get_itlb_tag(i); + unsigned long tag; + /* Spitfire Errata #32 workaround */ + __asm__ __volatile__("stxa %0, [%1] %2\n\t" + "flush %%g6" + : /* No outputs */ + : "r" (0), + "r" (PRIMARY_CONTEXT), "i" (ASI_DMMU)); + + tag = spitfire_get_itlb_tag(i); if(save_p) { prom_itlb[itlb_seen].tlb_ent = i; prom_itlb[itlb_seen].tlb_tag = tag; @@ -989,13 +1052,11 @@ void __flush_dcache_range(unsigned long start, unsigned long end) { - unsigned long va; - int n = 0; - - for (va = start; va < end; va += 32) { - spitfire_put_dcache_tag(va & 0x3fe0, 0x0); - if (++n >= 512) - break; + start &= PAGE_MASK; + end = PAGE_ALIGN(end); + while (start < end) { + flush_dcache_page(start); + start += PAGE_SIZE; } } @@ -1020,6 +1081,13 @@ : "=r" (pstate) : "i" (PSTATE_IE)); for(i = 0; i < 64; i++) { + /* Spitfire Errata #32 workaround */ + __asm__ __volatile__("stxa %0, [%1] %2\n\t" + "flush %%g6" + : /* No outputs */ + : "r" (0), + "r" (PRIMARY_CONTEXT), "i" (ASI_DMMU)); + if(!(spitfire_get_dtlb_data(i) & _PAGE_L)) { __asm__ __volatile__("stxa %%g0, [%0] %1" : /* no outputs */ @@ -1028,6 +1096,14 @@ spitfire_put_dtlb_data(i, 0x0UL); membar("#Sync"); } + + /* Spitfire Errata #32 workaround */ + __asm__ __volatile__("stxa %0, [%1] %2\n\t" + "flush %%g6" + : /* No outputs */ + : "r" (0), + "r" (PRIMARY_CONTEXT), "i" (ASI_DMMU)); + if(!(spitfire_get_itlb_data(i) & _PAGE_L)) { __asm__ __volatile__("stxa %%g0, [%0] %1" : /* no outputs */ Index: oldkernel/linux/arch/sparc64/mm/ultra.S diff -u linux/arch/sparc64/mm/ultra.S:1.1.1.1 linux/arch/sparc64/mm/ultra.S:1.2 --- linux/arch/sparc64/mm/ultra.S:1.1.1.1 Wed May 31 12:33:53 2000 +++ linux/arch/sparc64/mm/ultra.S Fri Jul 7 15:36:42 2000 @@ -35,7 +35,7 @@ __flush_tlb_range: /* %o0=(ctx&0x3ff), %o1=start&PAGE_MASK, %o2=SECONDARY_CONTEXT, * %o3=end&PAGE_MASK, %o4=PAGE_SIZE, %o5=(end - start) */ -#define TLB_MAGIC 206 /* Students, do you know how I calculated this? -DaveM */ +#define TLB_MAGIC 207 /* Students, do you know how I calculated this? -DaveM */ /*IC3*/ cmp %o5, %o4 be,pt %xcc, __flush_tlb_page srlx %o5, 13, %g5 @@ -58,6 +58,12 @@ wrpr %g1, PSTATE_IE, %pstate mov TLB_TAG_ACCESS, %g3 mov (62 << 3), %g2 + + /* Spitfire Errata #32 workaround. */ + mov 0x8, %o4 + stxa %g0, [%o4] ASI_DMMU + flush %g6 + 1: ldxa [%g2] ASI_ITLB_TAG_READ, %o4 and %o4, 0x3ff, %o5 cmp %o5, %o0 @@ -83,12 +89,27 @@ wrpr %g1, 0x0, %pstate 4: stxa %g0, [%g3] ASI_IMMU stxa %g0, [%g2] ASI_ITLB_DATA_ACCESS + flush %g6 + + /* Spitfire Errata #32 workaround. */ + mov 0x8, %o4 + stxa %g0, [%o4] ASI_DMMU + flush %g6 + ba,pt %xcc, 2b - flush %g6 + nop + 5: stxa %g0, [%g3] ASI_DMMU /*IC9*/ stxa %g0, [%g2] ASI_DTLB_DATA_ACCESS + flush %g6 + + /* Spitfire Errata #32 workaround. */ + mov 0x8, %o4 + stxa %g0, [%o4] ASI_DMMU + flush %g6 + ba,pt %xcc, 3b - flush %g6 + nop .align 32 __flush_tlb_mm_slow: @@ -167,6 +188,29 @@ ba,pt %xcc, 3b flush %g6 + .align 64 + .globl flush_dcache_page +flush_dcache_page: + sub %o0, %g4, %o0 + clr %o1 + srlx %o0, 11, %o0 + sethi %hi(1 << 14), %o2 +1: ldxa [%o1] ASI_DCACHE_TAG, %o3 + andn %o3, 0x3, %o3 + cmp %o0, %o3 + bne,pt %xcc, 2f + nop + stxa %g0, [%o1] ASI_DCACHE_TAG +2: add %o1, (1 << 5), %o1 + cmp %o1, %o2 + bne,pt %xcc, 1b + nop + /* The I-cache does not snoop local stores so we + * better flush that too. + */ + ba,pt %xcc, flush_icache_page + sllx %o0, 11, %o0 + #ifdef __SMP__ /* These are all called by the slaves of a cross call, at * trap level 1, with interrupts fully disabled. @@ -292,28 +336,51 @@ clr %l6 99: retry + .data + +errata32_hwbug: + .xword 0 + + .text + /* These two are not performance critical... */ .globl xcall_flush_tlb_all xcall_flush_tlb_all: + + /* Spitfire Errata #32 workaround. */ + sethi %hi(errata32_hwbug), %g4 + stx %g0, [%g4 + %lo(errata32_hwbug)] + clr %g2 clr %g3 1: ldxa [%g3] ASI_DTLB_DATA_ACCESS, %g4 and %g4, _PAGE_L, %g5 brnz,pn %g5, 2f mov TLB_TAG_ACCESS, %g7 + stxa %g0, [%g7] ASI_DMMU membar #Sync - stxa %g0, [%g3] ASI_DTLB_DATA_ACCESS membar #Sync + + /* Spitfire Errata #32 workaround. */ + sethi %hi(errata32_hwbug), %g4 + stx %g0, [%g4 + %lo(errata32_hwbug)] + 2: ldxa [%g3] ASI_ITLB_DATA_ACCESS, %g4 and %g4, _PAGE_L, %g5 brnz,pn %g5, 2f mov TLB_TAG_ACCESS, %g7 + stxa %g0, [%g7] ASI_IMMU membar #Sync - stxa %g0, [%g3] ASI_ITLB_DATA_ACCESS + membar #Sync + + /* Spitfire Errata #32 workaround. */ + sethi %hi(errata32_hwbug), %g4 + stx %g0, [%g4 + %lo(errata32_hwbug)] + 2: add %g2, 1, %g2 cmp %g2, 63 ble,pt %icc, 1b Index: oldkernel/linux/arch/sparc64/solaris/fs.c diff -u linux/arch/sparc64/solaris/fs.c:1.2 linux/arch/sparc64/solaris/fs.c:1.3 --- linux/arch/sparc64/solaris/fs.c:1.2 Thu Jun 1 15:03:08 2000 +++ linux/arch/sparc64/solaris/fs.c Fri Jul 7 15:36:42 2000 @@ -572,20 +572,20 @@ return error; } -extern asmlinkage long sparc32_open(const char * filename, int flags, int mode); - asmlinkage int solaris_open(u32 filename, int flags, u32 mode) { + int (*sys_open)(const char *,int,int) = + (int (*)(const char *,int,int))SYS(open); int fl = flags & 0xf; - if (flags & 0x2000) fl |= O_LARGEFILE; +/* if (flags & 0x2000) - allow LFS */ if (flags & 0x8050) fl |= O_SYNC; if (flags & 0x80) fl |= O_NONBLOCK; if (flags & 0x100) fl |= O_CREAT; if (flags & 0x200) fl |= O_TRUNC; if (flags & 0x400) fl |= O_EXCL; if (flags & 0x800) fl |= O_NOCTTY; - return sparc32_open((const char *)A(filename), fl, mode); + return sys_open((const char *)A(filename), fl, mode); } #define SOL_F_SETLK 6 Index: oldkernel/linux/configs/kernel-2.2.14-i386-BOOT.config diff -u linux/configs/kernel-2.2.14-i386-BOOT.config:1.5 linux/configs/kernel-2.2.14-i386-BOOT.config:1.6 --- linux/configs/kernel-2.2.14-i386-BOOT.config:1.5 Thu Jun 1 13:01:16 2000 +++ linux/configs/kernel-2.2.14-i386-BOOT.config Fri Jul 7 15:36:42 2000 @@ -1,5 +1,5 @@ # -# Automatically generated by make menuconfig: don't edit +# Automatically generated make config: don't edit # # @@ -15,15 +15,14 @@ # CONFIG_M586 is not set # CONFIG_M586TSC is not set # CONFIG_M686 is not set -# CONFIG_M686FX is not set -# CONFIG_X86_PN_OFF is not set -# CONFIG_X86_FX is not set +CONFIG_X86_PN_OFF=y +CONFIG_X86_FX=y # CONFIG_X86_CPU_OPTIMIZATIONS is not set +CONFIG_1GB=y +# CONFIG_2GB is not set CONFIG_MATH_EMULATION=y # CONFIG_MTRR is not set # CONFIG_SMP is not set -CONFIG_1GB=y -# CONFIG_2GB is not set # # Loadable module support @@ -48,7 +47,7 @@ CONFIG_PCI_OLD_PROC=y # CONFIG_MCA is not set # CONFIG_VISWS is not set -# CONFIG_SYSVIPC is not set +CONFIG_SYSVIPC=y # CONFIG_BSD_PROCESS_ACCT is not set CONFIG_SYSCTL=y # CONFIG_BINFMT_AOUT is not set @@ -71,6 +70,10 @@ # CONFIG_BLK_DEV_FD=y 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_IDEDISK=y CONFIG_BLK_DEV_IDECD=y @@ -90,6 +93,10 @@ # CONFIG_BLK_DEV_VIA82C586 is not set # CONFIG_BLK_DEV_CMD646 is not set # CONFIG_IDE_CHIPSETS is not set + +# +# Additional Block Devices +# CONFIG_BLK_DEV_LOOP=y # CONFIG_BLK_DEV_NBD is not set # CONFIG_BLK_DEV_MD is not set @@ -104,13 +111,22 @@ CONFIG_BLK_DEV_INITRD=y # CONFIG_BLK_DEV_XD is not set CONFIG_BLK_DEV_DAC960=m +CONFIG_BLK_DEV_3WARE=m CONFIG_PARIDE_PARPORT=m CONFIG_PARIDE=m + +# +# Parallel IDE high-level drivers +# CONFIG_PARIDE_PD=m CONFIG_PARIDE_PCD=m # CONFIG_PARIDE_PF is not set # CONFIG_PARIDE_PT is not set # CONFIG_PARIDE_PG is not set + +# +# Parallel IDE protocol modules +# CONFIG_PARIDE_ATEN=m CONFIG_PARIDE_BPCK=m CONFIG_PARIDE_COMM=m @@ -145,9 +161,17 @@ # CONFIG_NET_IPGRE is not set # CONFIG_IP_ALIAS is not set CONFIG_SYN_COOKIES=y + +# +# (it is safe to leave these untouched) +# # CONFIG_INET_RARP is not set # CONFIG_SKB_LARGE is not set # CONFIG_IPV6 is not set + +# +# +# # CONFIG_IPX is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set @@ -175,11 +199,19 @@ # SCSI support # CONFIG_SCSI=y + +# +# SCSI support type (disk, tape, CD-ROM) +# CONFIG_BLK_DEV_SD=y CONFIG_CHR_DEV_ST=m CONFIG_BLK_DEV_SR=y CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=m + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# # CONFIG_SCSI_MULTI_LUN is not set CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_LOGGING=y @@ -193,7 +225,7 @@ CONFIG_SCSI_AHA1542=m CONFIG_SCSI_AHA1740=m CONFIG_SCSI_AIC7XXX=m -# CONFIG_AIC7XXX_TCQ_ON_BY_DEFAULT is not set +CONFIG_AIC7XXX_TCQ_ON_BY_DEFAULT=y CONFIG_AIC7XXX_CMDS_PER_DEVICE=8 CONFIG_AIC7XXX_PROC_STATS=y CONFIG_AIC7XXX_RESET_DELAY=5 @@ -238,11 +270,13 @@ CONFIG_SCSI_SYM53C8XX=m CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS=8 CONFIG_SCSI_NCR53C8XX_MAX_TAGS=32 -CONFIG_SCSI_NCR53C8XX_SYNC=40 +CONFIG_SCSI_NCR53C8XX_SYNC=80 CONFIG_SCSI_NCR53C8XX_PROFILE=y # CONFIG_SCSI_NCR53C8XX_IOMAPPED is not set CONFIG_SCSI_NCR53C8XX_SYMBIOS_COMPAT=y -CONFIG_SCSI_NCR53C8XX_PQS_PDS=y +CONFIG_SCSI_NCR53C8XX_PQS_PDS=y +# CONFIG_SCSI_NCR53C8XX_IARB is not set +CONFIG_SCSI_NCR53C8XX_INTEGRITY_CHECK=y CONFIG_SCSI_PAS16=m CONFIG_SCSI_PCI2000=m CONFIG_SCSI_PCI2220I=m @@ -444,6 +478,15 @@ # CONFIG_WATCHDOG is not set # CONFIG_NVRAM is not set # CONFIG_RTC is not set + +# +# I2C support +# +# CONFIG_I2C is not set + +# +# AGP support +# CONFIG_AGP=y CONFIG_AGP_INTEL=y CONFIG_AGP_I810=y @@ -485,6 +528,8 @@ # CONFIG_QNX4FS_FS is not set CONFIG_ROMFS_FS=m CONFIG_EXT2_FS=y +CONFIG_EXT3_FS=m +CONFIG_EXT3_FS_JFS_CHECK=y CONFIG_SYSV_FS=m CONFIG_UFS_FS=m # CONFIG_UFS_FS_WRITE is not set @@ -498,6 +543,8 @@ # CONFIG_NFSD is not set CONFIG_SUNRPC=m CONFIG_LOCKD=m +CONFIG_NFSD_V3=y +CONFIG_NFS_V3=y CONFIG_SMB_FS=m # CONFIG_NCP_FS is not set Index: oldkernel/linux/configs/kernel-2.2.14-i386-smp.config diff -u linux/configs/kernel-2.2.14-i386-smp.config:1.5 linux/configs/kernel-2.2.14-i386-smp.config:1.6 --- linux/configs/kernel-2.2.14-i386-smp.config:1.5 Thu Jun 1 13:01:16 2000 +++ linux/configs/kernel-2.2.14-i386-smp.config Fri Jul 7 15:36:42 2000 @@ -1,5 +1,5 @@ # -# Automatically generated by make menuconfig: don't edit +# Automatically generated make config: don't edit # # @@ -15,15 +15,14 @@ # CONFIG_M586 is not set # CONFIG_M586TSC is not set # CONFIG_M686 is not set -# CONFIG_M686FX is not set -# CONFIG_X86_PN_OFF is not set -# CONFIG_X86_FX is not set +CONFIG_X86_PN_OFF=y +CONFIG_X86_FX=y # CONFIG_X86_CPU_OPTIMIZATIONS is not set +CONFIG_1GB=y +# CONFIG_2GB is not set CONFIG_MATH_EMULATION=y CONFIG_MTRR=y CONFIG_SMP=y -CONFIG_1GB=y -# CONFIG_2GB is not set # # Loadable module support @@ -82,6 +81,10 @@ # CONFIG_BLK_DEV_FD=y 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_IDEDISK=y CONFIG_BLK_DEV_IDECD=m @@ -100,6 +103,10 @@ # CONFIG_BLK_DEV_VIA82C586 is not set # CONFIG_BLK_DEV_CMD646 is not set # CONFIG_IDE_CHIPSETS is not set + +# +# Additional Block Devices +# CONFIG_BLK_DEV_LOOP=m CONFIG_BLK_DEV_NBD=m # CONFIG_BLK_DEV_MD is not set @@ -114,13 +121,22 @@ CONFIG_BLK_DEV_INITRD=y CONFIG_BLK_DEV_XD=m CONFIG_BLK_DEV_DAC960=y +CONFIG_BLK_DEV_3WARE=y CONFIG_PARIDE_PARPORT=m CONFIG_PARIDE=m + +# +# Parallel IDE high-level drivers +# CONFIG_PARIDE_PD=m CONFIG_PARIDE_PCD=m CONFIG_PARIDE_PF=m CONFIG_PARIDE_PT=m CONFIG_PARIDE_PG=m + +# +# Parallel IDE protocol modules +# CONFIG_PARIDE_ATEN=m CONFIG_PARIDE_BPCK=m CONFIG_PARIDE_COMM=m @@ -157,7 +173,16 @@ CONFIG_NETLINK_DEV=y CONFIG_IP_TRANSPARENT_PROXY=y CONFIG_IP_MASQUERADE=y + +# +# Protocol-specific masquerading support will be built as modules. +# +# CONFIG_IP_MASQUERADE_UDP_LOOSE is not set CONFIG_IP_MASQUERADE_ICMP=y + +# +# Protocol-specific masquerading support will be built as modules. +# CONFIG_IP_MASQUERADE_MOD=y CONFIG_IP_MASQUERADE_IPAUTOFW=m CONFIG_IP_MASQUERADE_IPPORTFW=m @@ -176,9 +201,17 @@ CONFIG_IP_ALIAS=y # CONFIG_ARPD is not set CONFIG_SYN_COOKIES=y + +# +# (it is safe to leave these untouched) +# CONFIG_INET_RARP=m CONFIG_SKB_LARGE=y # CONFIG_IPV6 is not set + +# +# +# CONFIG_IPX=m # CONFIG_IPX_INTERN is not set # CONFIG_SPX is not set @@ -208,11 +241,19 @@ # SCSI support # CONFIG_SCSI=y + +# +# SCSI support type (disk, tape, CD-ROM) +# CONFIG_BLK_DEV_SD=y CONFIG_CHR_DEV_ST=y CONFIG_BLK_DEV_SR=y CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=m + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# # CONFIG_SCSI_MULTI_LUN is not set CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_LOGGING=y @@ -226,7 +267,7 @@ CONFIG_SCSI_AHA1542=m CONFIG_SCSI_AHA1740=m CONFIG_SCSI_AIC7XXX=y -# CONFIG_AIC7XXX_TCQ_ON_BY_DEFAULT is not set +CONFIG_AIC7XXX_TCQ_ON_BY_DEFAULT=y CONFIG_AIC7XXX_CMDS_PER_DEVICE=8 CONFIG_AIC7XXX_PROC_STATS=y CONFIG_AIC7XXX_RESET_DELAY=5 @@ -271,11 +312,13 @@ CONFIG_SCSI_SYM53C8XX=y CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS=8 CONFIG_SCSI_NCR53C8XX_MAX_TAGS=32 -CONFIG_SCSI_NCR53C8XX_SYNC=40 +CONFIG_SCSI_NCR53C8XX_SYNC=80 CONFIG_SCSI_NCR53C8XX_PROFILE=y # CONFIG_SCSI_NCR53C8XX_IOMAPPED is not set CONFIG_SCSI_NCR53C8XX_SYMBIOS_COMPAT=y -CONFIG_SCSI_NCR53C8XX_PQS_PDS=y +CONFIG_SCSI_NCR53C8XX_PQS_PDS=y +# CONFIG_SCSI_NCR53C8XX_IARB is not set +CONFIG_SCSI_NCR53C8XX_INTEGRITY_CHECK=y CONFIG_SCSI_PAS16=m CONFIG_SCSI_PCI2000=m CONFIG_SCSI_PCI2220I=m @@ -395,6 +438,10 @@ CONFIG_IPDDP_DECAP=y CONFIG_PLIP=m CONFIG_PPP=m + +# +# CCP compressors for PPP are only built as modules. +# CONFIG_SLIP=m CONFIG_SLIP_COMPRESSED=y CONFIG_SLIP_SMART=y @@ -444,28 +491,52 @@ # IrDA subsystem support # CONFIG_IRDA=m + +# +# IrDA protocols +# CONFIG_IRLAN=m CONFIG_IRCOMM=m CONFIG_IRLPT=m CONFIG_IRLPT_CLIENT=m CONFIG_IRLPT_SERVER=m CONFIG_IRDA_OPTIONS=y + +# +# IrDA options +# CONFIG_IRDA_CACHE_LAST_LSAP=y CONFIG_IRDA_FAST_RR=y # CONFIG_IRDA_DEBUG is not set CONFIG_IRDA_COMPRESSION=y + +# +# IrDA compressors +# CONFIG_IRDA_DEFLATE=m # # Infrared-port device drivers # + +# +# SIR device drivers +# CONFIG_IRTTY_SIR=m CONFIG_IRPORT_SIR=m + +# +# FIR device drivers +# CONFIG_NSC_FIR=m CONFIG_WINBOND_FIR=m CONFIG_SHARP_FIR=m CONFIG_TOSHIBA_FIR=m CONFIG_SMC_IRCC_FIR=m + +# +# Dongle support +# CONFIG_DONGLE=y CONFIG_ESI_DONGLE=m CONFIG_ACTISYS_DONGLE=m @@ -632,6 +703,44 @@ # CONFIG_MIXCOMWD is not set CONFIG_NVRAM=m CONFIG_RTC=y + +# +# I2C support +# +CONFIG_I2C=m +CONFIG_I2C_ALGOBIT=m +CONFIG_I2C_PHILIPSPAR=m +CONFIG_I2C_ELV=m +CONFIG_I2C_VELLEMAN=m +CONFIG_I2C_ALGOPCF=m +CONFIG_I2C_ELEKTOR=m +CONFIG_I2C_MAINBOARD=m +CONFIG_I2C_ALI15X3=m +CONFIG_I2C_HYDRA=m +CONFIG_I2C_PIIX4=m +CONFIG_I2C_VIA=m +CONFIG_I2C_ISA=m +CONFIG_I2C_CHARDEV=m + +# +# Hardware sensors support +# +CONFIG_SENSORS=m +CONFIG_SENSORS_ADM1021=m +CONFIG_SENSORS_ADM9240=m +CONFIG_SENSORS_GL518SM=m +CONFIG_SENSORS_LM75=m +CONFIG_SENSORS_LM78=m +CONFIG_SENSORS_LM80=m +CONFIG_SENSORS_SIS5595=m +CONFIG_SENSORS_W83781D=m +CONFIG_SENSORS_OTHER=m +CONFIG_SENSORS_EEPROM=m +CONFIG_SENSORS_LTC1710=m + +# +# AGP support +# CONFIG_AGP=m CONFIG_AGP_INTEL=y CONFIG_AGP_I810=y @@ -670,6 +779,10 @@ CONFIG_FTAPE=m CONFIG_ZFTAPE=m CONFIG_ZFT_DFLT_BLK_SZ=10240 + +# +# The compressor will be built as a module only! +# CONFIG_ZFT_COMPRESSOR=m CONFIG_FT_NR_BUFFERS=3 CONFIG_FT_PROC_FS=y @@ -677,12 +790,20 @@ # CONFIG_FT_FULL_DEBUG is not set # CONFIG_FT_NO_TRACE is not set # CONFIG_FT_NO_TRACE_AT_ALL is not set + +# +# Hardware configuration +# CONFIG_FT_STD_FDC=y # CONFIG_FT_MACH2 is not set # CONFIG_FT_PROBE_FC10 is not set # CONFIG_FT_ALT_FDC is not set CONFIG_FT_FDC_THR=8 CONFIG_FT_FDC_MAX_RATE=2000 + +# +# ONLY for DEC Alpha architectures +# CONFIG_FT_ALPHA_CLOCK=0 # @@ -709,6 +830,8 @@ # CONFIG_QNX4FS_RW is not set CONFIG_ROMFS_FS=m CONFIG_EXT2_FS=y +CONFIG_EXT3_FS=y +CONFIG_EXT3_FS_JFS_CHECK=y CONFIG_SYSV_FS=m CONFIG_UFS_FS=m # CONFIG_UFS_FS_WRITE is not set @@ -724,6 +847,8 @@ CONFIG_NFSD_SUN=y CONFIG_SUNRPC=m CONFIG_LOCKD=m +CONFIG_NFSD_V3=y +CONFIG_NFS_V3=y CONFIG_SMB_FS=m CONFIG_NCP_FS=m CONFIG_NCPFS_PACKET_SIGNING=y @@ -866,15 +991,31 @@ CONFIG_AEDSP16=m CONFIG_AEDSP16_BASE=220 CONFIG_MPU_BASE=330 + +# +# SC-6600 Audio Cards have no jumper switches at all +# CONFIG_SC6600=y + +# +# SC-6600 specific configuration +# CONFIG_SC6600_JOY=y CONFIG_SC6600_CDROM=4 CONFIG_SC6600_CDROMBASE=0 CONFIG_AEDSP16_SBPRO=y + +# +# Audio Excel DSP 16 [Sound Blaster Pro] +# CONFIG_AEDSP16_BASE=220 CONFIG_AEDSP16_SB_IRQ=5 CONFIG_AEDSP16_SB_DMA=0 CONFIG_AEDSP16_MPU401=y + +# +# Audio Excel DSP 16 [MPU-401] +# CONFIG_AEDSP16_MPU_IRQ=5 # Index: oldkernel/linux/configs/kernel-2.2.14-i386.config diff -u linux/configs/kernel-2.2.14-i386.config:1.5 linux/configs/kernel-2.2.14-i386.config:1.6 --- linux/configs/kernel-2.2.14-i386.config:1.5 Thu Jun 1 13:01:16 2000 +++ linux/configs/kernel-2.2.14-i386.config Fri Jul 7 15:36:42 2000 @@ -1,5 +1,5 @@ # -# Automatically generated by make menuconfig: don't edit +# Automatically generated make config: don't edit # # @@ -15,15 +15,14 @@ # CONFIG_M586 is not set # CONFIG_M586TSC is not set # CONFIG_M686 is not set -# CONFIG_M686FX is not set -# CONFIG_X86_PN_OFF is not set -# CONFIG_X86_FX is not set +CONFIG_X86_PN_OFF=y +CONFIG_X86_FX=y # CONFIG_X86_CPU_OPTIMIZATIONS is not set +CONFIG_1GB=y +# CONFIG_2GB is not set CONFIG_MATH_EMULATION=y CONFIG_MTRR=y # CONFIG_SMP is not set -CONFIG_1GB=y -# CONFIG_2GB is not set # # Loadable module support @@ -80,6 +79,10 @@ # CONFIG_BLK_DEV_FD=y 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_IDEDISK=y CONFIG_BLK_DEV_IDECD=m @@ -98,6 +101,10 @@ # CONFIG_BLK_DEV_VIA82C586 is not set # CONFIG_BLK_DEV_CMD646 is not set # CONFIG_IDE_CHIPSETS is not set + +# +# Additional Block Devices +# CONFIG_BLK_DEV_LOOP=m CONFIG_BLK_DEV_NBD=m # CONFIG_BLK_DEV_MD is not set @@ -112,13 +119,22 @@ CONFIG_BLK_DEV_INITRD=y CONFIG_BLK_DEV_XD=m CONFIG_BLK_DEV_DAC960=y +CONFIG_BLK_DEV_3WARE=y CONFIG_PARIDE_PARPORT=m CONFIG_PARIDE=m + +# +# Parallel IDE high-level drivers +# CONFIG_PARIDE_PD=m CONFIG_PARIDE_PCD=m CONFIG_PARIDE_PF=m CONFIG_PARIDE_PT=m CONFIG_PARIDE_PG=m + +# +# Parallel IDE protocol modules +# CONFIG_PARIDE_ATEN=m CONFIG_PARIDE_BPCK=m CONFIG_PARIDE_COMM=m @@ -155,7 +171,16 @@ CONFIG_NETLINK_DEV=y CONFIG_IP_TRANSPARENT_PROXY=y CONFIG_IP_MASQUERADE=y + +# +# Protocol-specific masquerading support will be built as modules. +# +# CONFIG_IP_MASQUERADE_UDP_LOOSE is not set CONFIG_IP_MASQUERADE_ICMP=y + +# +# Protocol-specific masquerading support will be built as modules. +# CONFIG_IP_MASQUERADE_MOD=y CONFIG_IP_MASQUERADE_IPAUTOFW=m CONFIG_IP_MASQUERADE_IPPORTFW=m @@ -174,9 +199,17 @@ CONFIG_IP_ALIAS=y # CONFIG_ARPD is not set CONFIG_SYN_COOKIES=y + +# +# (it is safe to leave these untouched) +# CONFIG_INET_RARP=m CONFIG_SKB_LARGE=y # CONFIG_IPV6 is not set + +# +# +# CONFIG_IPX=m # CONFIG_IPX_INTERN is not set # CONFIG_SPX is not set @@ -206,11 +239,19 @@ # SCSI support # CONFIG_SCSI=y + +# +# SCSI support type (disk, tape, CD-ROM) +# CONFIG_BLK_DEV_SD=y CONFIG_CHR_DEV_ST=y CONFIG_BLK_DEV_SR=y CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=m + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# # CONFIG_SCSI_MULTI_LUN is not set CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_LOGGING=y @@ -224,7 +265,7 @@ CONFIG_SCSI_AHA1542=m CONFIG_SCSI_AHA1740=m CONFIG_SCSI_AIC7XXX=y -# CONFIG_AIC7XXX_TCQ_ON_BY_DEFAULT is not set +CONFIG_AIC7XXX_TCQ_ON_BY_DEFAULT=y CONFIG_AIC7XXX_CMDS_PER_DEVICE=8 CONFIG_AIC7XXX_PROC_STATS=y CONFIG_AIC7XXX_RESET_DELAY=5 @@ -269,11 +310,13 @@ CONFIG_SCSI_SYM53C8XX=y CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS=8 CONFIG_SCSI_NCR53C8XX_MAX_TAGS=32 -CONFIG_SCSI_NCR53C8XX_SYNC=40 +CONFIG_SCSI_NCR53C8XX_SYNC=80 CONFIG_SCSI_NCR53C8XX_PROFILE=y # CONFIG_SCSI_NCR53C8XX_IOMAPPED is not set CONFIG_SCSI_NCR53C8XX_SYMBIOS_COMPAT=y -CONFIG_SCSI_NCR53C8XX_PQS_PDS=y +CONFIG_SCSI_NCR53C8XX_PQS_PDS=y +# CONFIG_SCSI_NCR53C8XX_IARB is not set +CONFIG_SCSI_NCR53C8XX_INTEGRITY_CHECK=y CONFIG_SCSI_PAS16=m CONFIG_SCSI_PCI2000=m CONFIG_SCSI_PCI2220I=m @@ -393,6 +436,10 @@ CONFIG_IPDDP_DECAP=y CONFIG_PLIP=m CONFIG_PPP=m + +# +# CCP compressors for PPP are only built as modules. +# CONFIG_SLIP=m CONFIG_SLIP_COMPRESSED=y CONFIG_SLIP_SMART=y @@ -442,28 +489,52 @@ # IrDA subsystem support # CONFIG_IRDA=m + +# +# IrDA protocols +# CONFIG_IRLAN=m CONFIG_IRCOMM=m CONFIG_IRLPT=m CONFIG_IRLPT_CLIENT=m CONFIG_IRLPT_SERVER=m CONFIG_IRDA_OPTIONS=y + +# +# IrDA options +# CONFIG_IRDA_CACHE_LAST_LSAP=y CONFIG_IRDA_FAST_RR=y # CONFIG_IRDA_DEBUG is not set CONFIG_IRDA_COMPRESSION=y + +# +# IrDA compressors +# CONFIG_IRDA_DEFLATE=m # # Infrared-port device drivers # + +# +# SIR device drivers +# CONFIG_IRTTY_SIR=m CONFIG_IRPORT_SIR=m + +# +# FIR device drivers +# CONFIG_NSC_FIR=m CONFIG_WINBOND_FIR=m CONFIG_SHARP_FIR=m CONFIG_TOSHIBA_FIR=m CONFIG_SMC_IRCC_FIR=m + +# +# Dongle support +# CONFIG_DONGLE=y CONFIG_ESI_DONGLE=m CONFIG_ACTISYS_DONGLE=m @@ -630,6 +701,44 @@ # CONFIG_MIXCOMWD is not set CONFIG_NVRAM=m CONFIG_RTC=y + +# +# I2C support +# +CONFIG_I2C=m +CONFIG_I2C_ALGOBIT=m +CONFIG_I2C_PHILIPSPAR=m +CONFIG_I2C_ELV=m +CONFIG_I2C_VELLEMAN=m +CONFIG_I2C_ALGOPCF=m +CONFIG_I2C_ELEKTOR=m +CONFIG_I2C_MAINBOARD=m +CONFIG_I2C_ALI15X3=m +CONFIG_I2C_HYDRA=m +CONFIG_I2C_PIIX4=m +CONFIG_I2C_VIA=m +CONFIG_I2C_ISA=m +CONFIG_I2C_CHARDEV=m + +# +# Hardware sensors support +# +CONFIG_SENSORS=m +CONFIG_SENSORS_ADM1021=m +CONFIG_SENSORS_ADM9240=m +CONFIG_SENSORS_GL518SM=m +CONFIG_SENSORS_LM75=m +CONFIG_SENSORS_LM78=m +CONFIG_SENSORS_LM80=m +CONFIG_SENSORS_SIS5595=m +CONFIG_SENSORS_W83781D=m +CONFIG_SENSORS_OTHER=m +CONFIG_SENSORS_EEPROM=m +CONFIG_SENSORS_LTC1710=m + +# +# AGP support +# CONFIG_AGP=m CONFIG_AGP_INTEL=y CONFIG_AGP_I810=y @@ -668,6 +777,10 @@ CONFIG_FTAPE=m CONFIG_ZFTAPE=m CONFIG_ZFT_DFLT_BLK_SZ=10240 + +# +# The compressor will be built as a module only! +# CONFIG_ZFT_COMPRESSOR=m CONFIG_FT_NR_BUFFERS=3 CONFIG_FT_PROC_FS=y @@ -675,12 +788,20 @@ # CONFIG_FT_FULL_DEBUG is not set # CONFIG_FT_NO_TRACE is not set # CONFIG_FT_NO_TRACE_AT_ALL is not set + +# +# Hardware configuration +# CONFIG_FT_STD_FDC=y # CONFIG_FT_MACH2 is not set # CONFIG_FT_PROBE_FC10 is not set # CONFIG_FT_ALT_FDC is not set CONFIG_FT_FDC_THR=8 CONFIG_FT_FDC_MAX_RATE=2000 + +# +# ONLY for DEC Alpha architectures +# CONFIG_FT_ALPHA_CLOCK=0 # @@ -707,6 +828,8 @@ # CONFIG_QNX4FS_RW is not set CONFIG_ROMFS_FS=m CONFIG_EXT2_FS=y +CONFIG_EXT3_FS=y +CONFIG_EXT3_FS_JFS_CHECK=y CONFIG_SYSV_FS=m CONFIG_UFS_FS=m # CONFIG_UFS_FS_WRITE is not set @@ -722,6 +845,8 @@ CONFIG_NFSD_SUN=y CONFIG_SUNRPC=m CONFIG_LOCKD=m +CONFIG_NFSD_V3=y +CONFIG_NFS_V3=y CONFIG_SMB_FS=m CONFIG_NCP_FS=m CONFIG_NCPFS_PACKET_SIGNING=y @@ -864,15 +989,31 @@ CONFIG_AEDSP16=m CONFIG_AEDSP16_BASE=220 CONFIG_MPU_BASE=330 + +# +# SC-6600 Audio Cards have no jumper switches at all +# CONFIG_SC6600=y + +# +# SC-6600 specific configuration +# CONFIG_SC6600_JOY=y CONFIG_SC6600_CDROM=4 CONFIG_SC6600_CDROMBASE=0 CONFIG_AEDSP16_SBPRO=y + +# +# Audio Excel DSP 16 [Sound Blaster Pro] +# CONFIG_AEDSP16_BASE=220 CONFIG_AEDSP16_SB_IRQ=5 CONFIG_AEDSP16_SB_DMA=0 CONFIG_AEDSP16_MPU401=y + +# +# Audio Excel DSP 16 [MPU-401] +# CONFIG_AEDSP16_MPU_IRQ=5 # Index: oldkernel/linux/configs/kernel-2.2.14-i586-smp.config diff -u linux/configs/kernel-2.2.14-i586-smp.config:1.6 linux/configs/kernel-2.2.14-i586-smp.config:1.7 --- linux/configs/kernel-2.2.14-i586-smp.config:1.6 Thu Jun 1 13:01:16 2000 +++ linux/configs/kernel-2.2.14-i586-smp.config Fri Jul 7 15:36:42 2000 @@ -1,5 +1,5 @@ # -# Automatically generated by make menuconfig: don't edit +# Automatically generated make config: don't edit # # @@ -15,19 +15,18 @@ CONFIG_M586=y # CONFIG_M586TSC is not set # CONFIG_M686 is not set -# CONFIG_M686FX is not set CONFIG_X86_WP_WORKS_OK=y CONFIG_X86_INVLPG=y CONFIG_X86_BSWAP=y CONFIG_X86_POPAD_OK=y CONFIG_X86_PN_OFF=y -# CONFIG_X86_FX is not set +CONFIG_X86_FX=y # CONFIG_X86_CPU_OPTIMIZATIONS is not set +CONFIG_1GB=y +# CONFIG_2GB is not set # CONFIG_MATH_EMULATION is not set CONFIG_MTRR=y CONFIG_SMP=y -CONFIG_1GB=y -# CONFIG_2GB is not set # # Loadable module support @@ -77,6 +76,10 @@ # CONFIG_BLK_DEV_FD=y 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_IDEDISK=y CONFIG_BLK_DEV_IDECD=m @@ -95,6 +98,10 @@ # CONFIG_BLK_DEV_VIA82C586 is not set # CONFIG_BLK_DEV_CMD646 is not set # CONFIG_IDE_CHIPSETS is not set + +# +# Additional Block Devices +# CONFIG_BLK_DEV_LOOP=m CONFIG_BLK_DEV_NBD=m # CONFIG_BLK_DEV_MD is not set @@ -109,13 +116,22 @@ CONFIG_BLK_DEV_INITRD=y CONFIG_BLK_DEV_XD=m CONFIG_BLK_DEV_DAC960=y +CONFIG_BLK_DEV_3WARE=y CONFIG_PARIDE_PARPORT=m CONFIG_PARIDE=m + +# +# Parallel IDE high-level drivers +# CONFIG_PARIDE_PD=m CONFIG_PARIDE_PCD=m CONFIG_PARIDE_PF=m CONFIG_PARIDE_PT=m CONFIG_PARIDE_PG=m + +# +# Parallel IDE protocol modules +# CONFIG_PARIDE_ATEN=m CONFIG_PARIDE_BPCK=m CONFIG_PARIDE_COMM=m @@ -152,7 +168,16 @@ CONFIG_NETLINK_DEV=y CONFIG_IP_TRANSPARENT_PROXY=y CONFIG_IP_MASQUERADE=y + +# +# Protocol-specific masquerading support will be built as modules. +# +# CONFIG_IP_MASQUERADE_UDP_LOOSE is not set CONFIG_IP_MASQUERADE_ICMP=y + +# +# Protocol-specific masquerading support will be built as modules. +# CONFIG_IP_MASQUERADE_MOD=y CONFIG_IP_MASQUERADE_IPAUTOFW=m CONFIG_IP_MASQUERADE_IPPORTFW=m @@ -171,9 +196,17 @@ CONFIG_IP_ALIAS=y # CONFIG_ARPD is not set CONFIG_SYN_COOKIES=y + +# +# (it is safe to leave these untouched) +# CONFIG_INET_RARP=m CONFIG_SKB_LARGE=y # CONFIG_IPV6 is not set + +# +# +# CONFIG_IPX=m # CONFIG_IPX_INTERN is not set # CONFIG_SPX is not set @@ -203,11 +236,19 @@ # SCSI support # CONFIG_SCSI=y + +# +# SCSI support type (disk, tape, CD-ROM) +# CONFIG_BLK_DEV_SD=y CONFIG_CHR_DEV_ST=y CONFIG_BLK_DEV_SR=y CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=m + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# # CONFIG_SCSI_MULTI_LUN is not set CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_LOGGING=y @@ -221,7 +262,7 @@ CONFIG_SCSI_AHA1542=m CONFIG_SCSI_AHA1740=m CONFIG_SCSI_AIC7XXX=y -# CONFIG_AIC7XXX_TCQ_ON_BY_DEFAULT is not set +CONFIG_AIC7XXX_TCQ_ON_BY_DEFAULT=y CONFIG_AIC7XXX_CMDS_PER_DEVICE=8 CONFIG_AIC7XXX_PROC_STATS=y CONFIG_AIC7XXX_RESET_DELAY=5 @@ -266,11 +307,13 @@ CONFIG_SCSI_SYM53C8XX=y CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS=8 CONFIG_SCSI_NCR53C8XX_MAX_TAGS=32 -CONFIG_SCSI_NCR53C8XX_SYNC=40 +CONFIG_SCSI_NCR53C8XX_SYNC=80 CONFIG_SCSI_NCR53C8XX_PROFILE=y # CONFIG_SCSI_NCR53C8XX_IOMAPPED is not set CONFIG_SCSI_NCR53C8XX_SYMBIOS_COMPAT=y -CONFIG_SCSI_NCR53C8XX_PQS_PDS=y +CONFIG_SCSI_NCR53C8XX_PQS_PDS=y +# CONFIG_SCSI_NCR53C8XX_IARB is not set +CONFIG_SCSI_NCR53C8XX_INTEGRITY_CHECK=y CONFIG_SCSI_PAS16=m CONFIG_SCSI_PCI2000=m CONFIG_SCSI_PCI2220I=m @@ -390,6 +433,10 @@ CONFIG_IPDDP_DECAP=y CONFIG_PLIP=m CONFIG_PPP=m + +# +# CCP compressors for PPP are only built as modules. +# CONFIG_SLIP=m CONFIG_SLIP_COMPRESSED=y CONFIG_SLIP_SMART=y @@ -439,28 +486,52 @@ # IrDA subsystem support # CONFIG_IRDA=m + +# +# IrDA protocols +# CONFIG_IRLAN=m CONFIG_IRCOMM=m CONFIG_IRLPT=m CONFIG_IRLPT_CLIENT=m CONFIG_IRLPT_SERVER=m CONFIG_IRDA_OPTIONS=y + +# +# IrDA options +# CONFIG_IRDA_CACHE_LAST_LSAP=y CONFIG_IRDA_FAST_RR=y # CONFIG_IRDA_DEBUG is not set CONFIG_IRDA_COMPRESSION=y + +# +# IrDA compressors +# CONFIG_IRDA_DEFLATE=m # # Infrared-port device drivers # + +# +# SIR device drivers +# CONFIG_IRTTY_SIR=m CONFIG_IRPORT_SIR=m + +# +# FIR device drivers +# CONFIG_NSC_FIR=m CONFIG_WINBOND_FIR=m CONFIG_SHARP_FIR=m CONFIG_TOSHIBA_FIR=m CONFIG_SMC_IRCC_FIR=m + +# +# Dongle support +# CONFIG_DONGLE=y CONFIG_ESI_DONGLE=m CONFIG_ACTISYS_DONGLE=m @@ -627,6 +698,44 @@ # CONFIG_MIXCOMWD is not set CONFIG_NVRAM=m CONFIG_RTC=y + +# +# I2C support +# +CONFIG_I2C=m +CONFIG_I2C_ALGOBIT=m +CONFIG_I2C_PHILIPSPAR=m +CONFIG_I2C_ELV=m +CONFIG_I2C_VELLEMAN=m +CONFIG_I2C_ALGOPCF=m +CONFIG_I2C_ELEKTOR=m +CONFIG_I2C_MAINBOARD=m +CONFIG_I2C_ALI15X3=m +CONFIG_I2C_HYDRA=m +CONFIG_I2C_PIIX4=m +CONFIG_I2C_VIA=m +CONFIG_I2C_ISA=m +CONFIG_I2C_CHARDEV=m + +# +# Hardware sensors support +# +CONFIG_SENSORS=m +CONFIG_SENSORS_ADM1021=m +CONFIG_SENSORS_ADM9240=m +CONFIG_SENSORS_GL518SM=m +CONFIG_SENSORS_LM75=m +CONFIG_SENSORS_LM78=m +CONFIG_SENSORS_LM80=m +CONFIG_SENSORS_SIS5595=m +CONFIG_SENSORS_W83781D=m +CONFIG_SENSORS_OTHER=m +CONFIG_SENSORS_EEPROM=m +CONFIG_SENSORS_LTC1710=m + +# +# AGP support +# CONFIG_AGP=m CONFIG_AGP_INTEL=y CONFIG_AGP_I810=y @@ -665,6 +774,10 @@ CONFIG_FTAPE=m CONFIG_ZFTAPE=m CONFIG_ZFT_DFLT_BLK_SZ=10240 + +# +# The compressor will be built as a module only! +# CONFIG_ZFT_COMPRESSOR=m CONFIG_FT_NR_BUFFERS=3 CONFIG_FT_PROC_FS=y @@ -672,12 +785,20 @@ # CONFIG_FT_FULL_DEBUG is not set # CONFIG_FT_NO_TRACE is not set # CONFIG_FT_NO_TRACE_AT_ALL is not set + +# +# Hardware configuration +# CONFIG_FT_STD_FDC=y # CONFIG_FT_MACH2 is not set # CONFIG_FT_PROBE_FC10 is not set # CONFIG_FT_ALT_FDC is not set CONFIG_FT_FDC_THR=8 CONFIG_FT_FDC_MAX_RATE=2000 + +# +# ONLY for DEC Alpha architectures +# CONFIG_FT_ALPHA_CLOCK=0 # @@ -704,6 +825,8 @@ # CONFIG_QNX4FS_RW is not set CONFIG_ROMFS_FS=m CONFIG_EXT2_FS=y +CONFIG_EXT3_FS=y +CONFIG_EXT3_FS_JFS_CHECK=y CONFIG_SYSV_FS=m CONFIG_UFS_FS=m # CONFIG_UFS_FS_WRITE is not set @@ -719,6 +842,8 @@ CONFIG_NFSD_SUN=y CONFIG_SUNRPC=m CONFIG_LOCKD=m +CONFIG_NFSD_V3=y +CONFIG_NFS_V3=y CONFIG_SMB_FS=m CONFIG_NCP_FS=m CONFIG_NCPFS_PACKET_SIGNING=y @@ -861,15 +986,31 @@ CONFIG_AEDSP16=m CONFIG_AEDSP16_BASE=220 CONFIG_MPU_BASE=330 + +# +# SC-6600 Audio Cards have no jumper switches at all +# CONFIG_SC6600=y + +# +# SC-6600 specific configuration +# CONFIG_SC6600_JOY=y CONFIG_SC6600_CDROM=4 CONFIG_SC6600_CDROMBASE=0 CONFIG_AEDSP16_SBPRO=y + +# +# Audio Excel DSP 16 [Sound Blaster Pro] +# CONFIG_AEDSP16_BASE=220 CONFIG_AEDSP16_SB_IRQ=5 CONFIG_AEDSP16_SB_DMA=0 CONFIG_AEDSP16_MPU401=y + +# +# Audio Excel DSP 16 [MPU-401] +# CONFIG_AEDSP16_MPU_IRQ=5 # Index: oldkernel/linux/configs/kernel-2.2.14-i586.config diff -u linux/configs/kernel-2.2.14-i586.config:1.6 linux/configs/kernel-2.2.14-i586.config:1.7 --- linux/configs/kernel-2.2.14-i586.config:1.6 Thu Jun 1 13:01:16 2000 +++ linux/configs/kernel-2.2.14-i586.config Fri Jul 7 15:36:42 2000 @@ -1,5 +1,5 @@ # -# Automatically generated by make menuconfig: don't edit +# Automatically generated make config: don't edit # # @@ -15,19 +15,18 @@ CONFIG_M586=y # CONFIG_M586TSC is not set # CONFIG_M686 is not set -# CONFIG_M686FX is not set CONFIG_X86_WP_WORKS_OK=y CONFIG_X86_INVLPG=y CONFIG_X86_BSWAP=y CONFIG_X86_POPAD_OK=y CONFIG_X86_PN_OFF=y -# CONFIG_X86_FX is not set +CONFIG_X86_FX=y # CONFIG_X86_CPU_OPTIMIZATIONS is not set +CONFIG_1GB=y +# CONFIG_2GB is not set # CONFIG_MATH_EMULATION is not set CONFIG_MTRR=y # CONFIG_SMP is not set -CONFIG_1GB=y -# CONFIG_2GB is not set # # Loadable module support @@ -84,6 +83,10 @@ # CONFIG_BLK_DEV_FD=y 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_IDEDISK=y CONFIG_BLK_DEV_IDECD=m @@ -102,6 +105,10 @@ # CONFIG_BLK_DEV_VIA82C586 is not set # CONFIG_BLK_DEV_CMD646 is not set # CONFIG_IDE_CHIPSETS is not set + +# +# Additional Block Devices +# CONFIG_BLK_DEV_LOOP=m CONFIG_BLK_DEV_NBD=m # CONFIG_BLK_DEV_MD is not set @@ -116,13 +123,22 @@ CONFIG_BLK_DEV_INITRD=y CONFIG_BLK_DEV_XD=m CONFIG_BLK_DEV_DAC960=y +CONFIG_BLK_DEV_3WARE=y CONFIG_PARIDE_PARPORT=m CONFIG_PARIDE=m + +# +# Parallel IDE high-level drivers +# CONFIG_PARIDE_PD=m CONFIG_PARIDE_PCD=m CONFIG_PARIDE_PF=m CONFIG_PARIDE_PT=m CONFIG_PARIDE_PG=m + +# +# Parallel IDE protocol modules +# CONFIG_PARIDE_ATEN=m CONFIG_PARIDE_BPCK=m CONFIG_PARIDE_COMM=m @@ -159,7 +175,16 @@ CONFIG_NETLINK_DEV=y CONFIG_IP_TRANSPARENT_PROXY=y CONFIG_IP_MASQUERADE=y + +# +# Protocol-specific masquerading support will be built as modules. +# +# CONFIG_IP_MASQUERADE_UDP_LOOSE is not set CONFIG_IP_MASQUERADE_ICMP=y + +# +# Protocol-specific masquerading support will be built as modules. +# CONFIG_IP_MASQUERADE_MOD=y CONFIG_IP_MASQUERADE_IPAUTOFW=m CONFIG_IP_MASQUERADE_IPPORTFW=m @@ -178,9 +203,17 @@ CONFIG_IP_ALIAS=y # CONFIG_ARPD is not set CONFIG_SYN_COOKIES=y + +# +# (it is safe to leave these untouched) +# CONFIG_INET_RARP=m CONFIG_SKB_LARGE=y # CONFIG_IPV6 is not set + +# +# +# CONFIG_IPX=m # CONFIG_IPX_INTERN is not set # CONFIG_SPX is not set @@ -210,11 +243,19 @@ # SCSI support # CONFIG_SCSI=y + +# +# SCSI support type (disk, tape, CD-ROM) +# CONFIG_BLK_DEV_SD=y CONFIG_CHR_DEV_ST=y CONFIG_BLK_DEV_SR=y CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=m + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# # CONFIG_SCSI_MULTI_LUN is not set CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_LOGGING=y @@ -228,7 +269,7 @@ CONFIG_SCSI_AHA1542=m CONFIG_SCSI_AHA1740=m CONFIG_SCSI_AIC7XXX=y -# CONFIG_AIC7XXX_TCQ_ON_BY_DEFAULT is not set +CONFIG_AIC7XXX_TCQ_ON_BY_DEFAULT=y CONFIG_AIC7XXX_CMDS_PER_DEVICE=8 CONFIG_AIC7XXX_PROC_STATS=y CONFIG_AIC7XXX_RESET_DELAY=5 @@ -273,11 +314,13 @@ CONFIG_SCSI_SYM53C8XX=y CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS=8 CONFIG_SCSI_NCR53C8XX_MAX_TAGS=32 -CONFIG_SCSI_NCR53C8XX_SYNC=40 +CONFIG_SCSI_NCR53C8XX_SYNC=80 CONFIG_SCSI_NCR53C8XX_PROFILE=y # CONFIG_SCSI_NCR53C8XX_IOMAPPED is not set CONFIG_SCSI_NCR53C8XX_SYMBIOS_COMPAT=y -CONFIG_SCSI_NCR53C8XX_PQS_PDS=y +CONFIG_SCSI_NCR53C8XX_PQS_PDS=y +# CONFIG_SCSI_NCR53C8XX_IARB is not set +CONFIG_SCSI_NCR53C8XX_INTEGRITY_CHECK=y CONFIG_SCSI_PAS16=m CONFIG_SCSI_PCI2000=m CONFIG_SCSI_PCI2220I=m @@ -397,6 +440,10 @@ CONFIG_IPDDP_DECAP=y CONFIG_PLIP=m CONFIG_PPP=m + +# +# CCP compressors for PPP are only built as modules. +# CONFIG_SLIP=m CONFIG_SLIP_COMPRESSED=y CONFIG_SLIP_SMART=y @@ -446,28 +493,52 @@ # IrDA subsystem support # CONFIG_IRDA=m + +# +# IrDA protocols +# CONFIG_IRLAN=m CONFIG_IRCOMM=m CONFIG_IRLPT=m CONFIG_IRLPT_CLIENT=m CONFIG_IRLPT_SERVER=m CONFIG_IRDA_OPTIONS=y + +# +# IrDA options +# CONFIG_IRDA_CACHE_LAST_LSAP=y CONFIG_IRDA_FAST_RR=y # CONFIG_IRDA_DEBUG is not set CONFIG_IRDA_COMPRESSION=y + +# +# IrDA compressors +# CONFIG_IRDA_DEFLATE=m # # Infrared-port device drivers # + +# +# SIR device drivers +# CONFIG_IRTTY_SIR=m CONFIG_IRPORT_SIR=m + +# +# FIR device drivers +# CONFIG_NSC_FIR=m CONFIG_WINBOND_FIR=m CONFIG_SHARP_FIR=m CONFIG_TOSHIBA_FIR=m CONFIG_SMC_IRCC_FIR=m + +# +# Dongle support +# CONFIG_DONGLE=y CONFIG_ESI_DONGLE=m CONFIG_ACTISYS_DONGLE=m @@ -634,6 +705,44 @@ # CONFIG_MIXCOMWD is not set CONFIG_NVRAM=m CONFIG_RTC=y + +# +# I2C support +# +CONFIG_I2C=m +CONFIG_I2C_ALGOBIT=m +CONFIG_I2C_PHILIPSPAR=m +CONFIG_I2C_ELV=m +CONFIG_I2C_VELLEMAN=m +CONFIG_I2C_ALGOPCF=m +CONFIG_I2C_ELEKTOR=m +CONFIG_I2C_MAINBOARD=m +CONFIG_I2C_ALI15X3=m +CONFIG_I2C_HYDRA=m +CONFIG_I2C_PIIX4=m +CONFIG_I2C_VIA=m +CONFIG_I2C_ISA=m +CONFIG_I2C_CHARDEV=m + +# +# Hardware sensors support +# +CONFIG_SENSORS=m +CONFIG_SENSORS_ADM1021=m +CONFIG_SENSORS_ADM9240=m +CONFIG_SENSORS_GL518SM=m +CONFIG_SENSORS_LM75=m +CONFIG_SENSORS_LM78=m +CONFIG_SENSORS_LM80=m +CONFIG_SENSORS_SIS5595=m +CONFIG_SENSORS_W83781D=m +CONFIG_SENSORS_OTHER=m +CONFIG_SENSORS_EEPROM=m +CONFIG_SENSORS_LTC1710=m + +# +# AGP support +# CONFIG_AGP=m CONFIG_AGP_INTEL=y CONFIG_AGP_I810=y @@ -672,6 +781,10 @@ CONFIG_FTAPE=m CONFIG_ZFTAPE=m CONFIG_ZFT_DFLT_BLK_SZ=10240 + +# +# The compressor will be built as a module only! +# CONFIG_ZFT_COMPRESSOR=m CONFIG_FT_NR_BUFFERS=3 CONFIG_FT_PROC_FS=y @@ -679,12 +792,20 @@ # CONFIG_FT_FULL_DEBUG is not set # CONFIG_FT_NO_TRACE is not set # CONFIG_FT_NO_TRACE_AT_ALL is not set + +# +# Hardware configuration +# CONFIG_FT_STD_FDC=y # CONFIG_FT_MACH2 is not set # CONFIG_FT_PROBE_FC10 is not set # CONFIG_FT_ALT_FDC is not set CONFIG_FT_FDC_THR=8 CONFIG_FT_FDC_MAX_RATE=2000 + +# +# ONLY for DEC Alpha architectures +# CONFIG_FT_ALPHA_CLOCK=0 # @@ -711,6 +832,8 @@ # CONFIG_QNX4FS_RW is not set CONFIG_ROMFS_FS=m CONFIG_EXT2_FS=y +CONFIG_EXT3_FS=y +CONFIG_EXT3_FS_JFS_CHECK=y CONFIG_SYSV_FS=m CONFIG_UFS_FS=m # CONFIG_UFS_FS_WRITE is not set @@ -726,6 +849,8 @@ CONFIG_NFSD_SUN=y CONFIG_SUNRPC=m CONFIG_LOCKD=m +CONFIG_NFSD_V3=y +CONFIG_NFS_V3=y CONFIG_SMB_FS=m CONFIG_NCP_FS=m CONFIG_NCPFS_PACKET_SIGNING=y @@ -868,15 +993,31 @@ CONFIG_AEDSP16=m CONFIG_AEDSP16_BASE=220 CONFIG_MPU_BASE=330 + +# +# SC-6600 Audio Cards have no jumper switches at all +# CONFIG_SC6600=y + +# +# SC-6600 specific configuration +# CONFIG_SC6600_JOY=y CONFIG_SC6600_CDROM=4 CONFIG_SC6600_CDROMBASE=0 CONFIG_AEDSP16_SBPRO=y + +# +# Audio Excel DSP 16 [Sound Blaster Pro] +# CONFIG_AEDSP16_BASE=220 CONFIG_AEDSP16_SB_IRQ=5 CONFIG_AEDSP16_SB_DMA=0 CONFIG_AEDSP16_MPU401=y + +# +# Audio Excel DSP 16 [MPU-401] +# CONFIG_AEDSP16_MPU_IRQ=5 # Index: oldkernel/linux/configs/kernel-2.2.14-i686-smp.config diff -u linux/configs/kernel-2.2.14-i686-smp.config:1.7 linux/configs/kernel-2.2.14-i686-smp.config:1.8 --- linux/configs/kernel-2.2.14-i686-smp.config:1.7 Thu Jun 1 13:01:16 2000 +++ linux/configs/kernel-2.2.14-i686-smp.config Fri Jul 7 15:36:42 2000 @@ -1,5 +1,5 @@ # -# Automatically generated by make menuconfig: don't edit +# Automatically generated make config: don't edit # # @@ -14,8 +14,7 @@ # CONFIG_M486 is not set # CONFIG_M586 is not set # CONFIG_M586TSC is not set -# CONFIG_M686 is not set -CONFIG_M686FX=y +CONFIG_M686=y CONFIG_X86_WP_WORKS_OK=y CONFIG_X86_INVLPG=y CONFIG_X86_BSWAP=y @@ -25,11 +24,11 @@ CONFIG_X86_PN_OFF=y CONFIG_X86_FX=y # CONFIG_X86_CPU_OPTIMIZATIONS is not set +CONFIG_1GB=y +# CONFIG_2GB is not set # CONFIG_MATH_EMULATION is not set CONFIG_MTRR=y CONFIG_SMP=y -CONFIG_1GB=y -# CONFIG_2GB is not set # # Loadable module support @@ -79,6 +78,10 @@ # CONFIG_BLK_DEV_FD=y 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_IDEDISK=y CONFIG_BLK_DEV_IDECD=m @@ -97,27 +100,41 @@ # CONFIG_BLK_DEV_VIA82C586 is not set # CONFIG_BLK_DEV_CMD646 is not set # CONFIG_IDE_CHIPSETS is not set + +# +# Additional Block Devices +# CONFIG_BLK_DEV_LOOP=m CONFIG_BLK_DEV_NBD=m -# CONFIG_BLK_DEV_MD is not set +CONFIG_BLK_DEV_MD=y CONFIG_AUTODETECT_RAID=y -CONFIG_MD_LINEAR=m -CONFIG_MD_STRIPED=m -CONFIG_MD_MIRRORING=m -CONFIG_MD_RAID5=m +CONFIG_MD_LINEAR=y +CONFIG_MD_STRIPED=y +CONFIG_MD_MIRRORING=y +CONFIG_MD_RAID5=y # CONFIG_MD_TRANSLUCENT is not set # CONFIG_MD_HSM is not set +CONFIG_MD_BOOT=y CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_INITRD=y CONFIG_BLK_DEV_XD=m CONFIG_BLK_DEV_DAC960=y +CONFIG_BLK_DEV_3WARE=y CONFIG_PARIDE_PARPORT=m CONFIG_PARIDE=m + +# +# Parallel IDE high-level drivers +# CONFIG_PARIDE_PD=m CONFIG_PARIDE_PCD=m CONFIG_PARIDE_PF=m CONFIG_PARIDE_PT=m CONFIG_PARIDE_PG=m + +# +# Parallel IDE protocol modules +# CONFIG_PARIDE_ATEN=m CONFIG_PARIDE_BPCK=m CONFIG_PARIDE_COMM=m @@ -154,7 +171,16 @@ CONFIG_NETLINK_DEV=y CONFIG_IP_TRANSPARENT_PROXY=y CONFIG_IP_MASQUERADE=y + +# +# Protocol-specific masquerading support will be built as modules. +# +# CONFIG_IP_MASQUERADE_UDP_LOOSE is not set CONFIG_IP_MASQUERADE_ICMP=y + +# +# Protocol-specific masquerading support will be built as modules. +# CONFIG_IP_MASQUERADE_MOD=y CONFIG_IP_MASQUERADE_IPAUTOFW=m CONFIG_IP_MASQUERADE_IPPORTFW=m @@ -173,9 +199,17 @@ CONFIG_IP_ALIAS=y # CONFIG_ARPD is not set CONFIG_SYN_COOKIES=y + +# +# (it is safe to leave these untouched) +# CONFIG_INET_RARP=m CONFIG_SKB_LARGE=y # CONFIG_IPV6 is not set + +# +# +# CONFIG_IPX=m # CONFIG_IPX_INTERN is not set # CONFIG_SPX is not set @@ -205,11 +239,19 @@ # SCSI support # CONFIG_SCSI=y + +# +# SCSI support type (disk, tape, CD-ROM) +# CONFIG_BLK_DEV_SD=y CONFIG_CHR_DEV_ST=y CONFIG_BLK_DEV_SR=y CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=m + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# # CONFIG_SCSI_MULTI_LUN is not set CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_LOGGING=y @@ -223,7 +265,7 @@ CONFIG_SCSI_AHA1542=m CONFIG_SCSI_AHA1740=m CONFIG_SCSI_AIC7XXX=y -# CONFIG_AIC7XXX_TCQ_ON_BY_DEFAULT is not set +CONFIG_AIC7XXX_TCQ_ON_BY_DEFAULT=y CONFIG_AIC7XXX_CMDS_PER_DEVICE=8 CONFIG_AIC7XXX_PROC_STATS=y CONFIG_AIC7XXX_RESET_DELAY=5 @@ -268,11 +310,13 @@ CONFIG_SCSI_SYM53C8XX=y CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS=8 CONFIG_SCSI_NCR53C8XX_MAX_TAGS=32 -CONFIG_SCSI_NCR53C8XX_SYNC=40 +CONFIG_SCSI_NCR53C8XX_SYNC=80 CONFIG_SCSI_NCR53C8XX_PROFILE=y # CONFIG_SCSI_NCR53C8XX_IOMAPPED is not set CONFIG_SCSI_NCR53C8XX_SYMBIOS_COMPAT=y -CONFIG_SCSI_NCR53C8XX_PQS_PDS=y +CONFIG_SCSI_NCR53C8XX_PQS_PDS=y +# CONFIG_SCSI_NCR53C8XX_IARB is not set +CONFIG_SCSI_NCR53C8XX_INTEGRITY_CHECK=y CONFIG_SCSI_PAS16=m CONFIG_SCSI_PCI2000=m CONFIG_SCSI_PCI2220I=m @@ -392,6 +436,10 @@ CONFIG_IPDDP_DECAP=y CONFIG_PLIP=m CONFIG_PPP=m + +# +# CCP compressors for PPP are only built as modules. +# CONFIG_SLIP=m CONFIG_SLIP_COMPRESSED=y CONFIG_SLIP_SMART=y @@ -441,28 +489,52 @@ # IrDA subsystem support # CONFIG_IRDA=m + +# +# IrDA protocols +# CONFIG_IRLAN=m CONFIG_IRCOMM=m CONFIG_IRLPT=m CONFIG_IRLPT_CLIENT=m CONFIG_IRLPT_SERVER=m CONFIG_IRDA_OPTIONS=y + +# +# IrDA options +# CONFIG_IRDA_CACHE_LAST_LSAP=y CONFIG_IRDA_FAST_RR=y # CONFIG_IRDA_DEBUG is not set CONFIG_IRDA_COMPRESSION=y + +# +# IrDA compressors +# CONFIG_IRDA_DEFLATE=m # # Infrared-port device drivers # + +# +# SIR device drivers +# CONFIG_IRTTY_SIR=m CONFIG_IRPORT_SIR=m + +# +# FIR device drivers +# CONFIG_NSC_FIR=m CONFIG_WINBOND_FIR=m CONFIG_SHARP_FIR=m CONFIG_TOSHIBA_FIR=m CONFIG_SMC_IRCC_FIR=m + +# +# Dongle support +# CONFIG_DONGLE=y CONFIG_ESI_DONGLE=m CONFIG_ACTISYS_DONGLE=m @@ -629,6 +701,44 @@ # CONFIG_MIXCOMWD is not set CONFIG_NVRAM=m CONFIG_RTC=y + +# +# I2C support +# +CONFIG_I2C=m +CONFIG_I2C_ALGOBIT=m +CONFIG_I2C_PHILIPSPAR=m +CONFIG_I2C_ELV=m +CONFIG_I2C_VELLEMAN=m +CONFIG_I2C_ALGOPCF=m +CONFIG_I2C_ELEKTOR=m +CONFIG_I2C_MAINBOARD=m +CONFIG_I2C_ALI15X3=m +CONFIG_I2C_HYDRA=m +CONFIG_I2C_PIIX4=m +CONFIG_I2C_VIA=m +CONFIG_I2C_ISA=m +CONFIG_I2C_CHARDEV=m + +# +# Hardware sensors support +# +CONFIG_SENSORS=m +CONFIG_SENSORS_ADM1021=m +CONFIG_SENSORS_ADM9240=m +CONFIG_SENSORS_GL518SM=m +CONFIG_SENSORS_LM75=m +CONFIG_SENSORS_LM78=m +CONFIG_SENSORS_LM80=m +CONFIG_SENSORS_SIS5595=m +CONFIG_SENSORS_W83781D=m +CONFIG_SENSORS_OTHER=m +CONFIG_SENSORS_EEPROM=m +CONFIG_SENSORS_LTC1710=m + +# +# AGP support +# CONFIG_AGP=m CONFIG_AGP_INTEL=y CONFIG_AGP_I810=y @@ -667,6 +777,10 @@ CONFIG_FTAPE=m CONFIG_ZFTAPE=m CONFIG_ZFT_DFLT_BLK_SZ=10240 + +# +# The compressor will be built as a module only! +# CONFIG_ZFT_COMPRESSOR=m CONFIG_FT_NR_BUFFERS=3 CONFIG_FT_PROC_FS=y @@ -674,12 +788,20 @@ # CONFIG_FT_FULL_DEBUG is not set # CONFIG_FT_NO_TRACE is not set # CONFIG_FT_NO_TRACE_AT_ALL is not set + +# +# Hardware configuration +# CONFIG_FT_STD_FDC=y # CONFIG_FT_MACH2 is not set # CONFIG_FT_PROBE_FC10 is not set # CONFIG_FT_ALT_FDC is not set CONFIG_FT_FDC_THR=8 CONFIG_FT_FDC_MAX_RATE=2000 + +# +# ONLY for DEC Alpha architectures +# CONFIG_FT_ALPHA_CLOCK=0 # @@ -706,6 +828,8 @@ # CONFIG_QNX4FS_RW is not set CONFIG_ROMFS_FS=m CONFIG_EXT2_FS=y +CONFIG_EXT3_FS=y +CONFIG_EXT3_FS_JFS_CHECK=y CONFIG_SYSV_FS=m CONFIG_UFS_FS=m # CONFIG_UFS_FS_WRITE is not set @@ -721,6 +845,8 @@ CONFIG_NFSD_SUN=y CONFIG_SUNRPC=m CONFIG_LOCKD=m +CONFIG_NFSD_V3=y +CONFIG_NFS_V3=y CONFIG_SMB_FS=m CONFIG_NCP_FS=m CONFIG_NCPFS_PACKET_SIGNING=y @@ -863,15 +989,31 @@ CONFIG_AEDSP16=m CONFIG_AEDSP16_BASE=220 CONFIG_MPU_BASE=330 + +# +# SC-6600 Audio Cards have no jumper switches at all +# CONFIG_SC6600=y + +# +# SC-6600 specific configuration +# CONFIG_SC6600_JOY=y CONFIG_SC6600_CDROM=4 CONFIG_SC6600_CDROMBASE=0 CONFIG_AEDSP16_SBPRO=y + +# +# Audio Excel DSP 16 [Sound Blaster Pro] +# CONFIG_AEDSP16_BASE=220 CONFIG_AEDSP16_SB_IRQ=5 CONFIG_AEDSP16_SB_DMA=0 CONFIG_AEDSP16_MPU401=y + +# +# Audio Excel DSP 16 [MPU-401] +# CONFIG_AEDSP16_MPU_IRQ=5 # Index: oldkernel/linux/configs/kernel-2.2.14-i686.config diff -u linux/configs/kernel-2.2.14-i686.config:1.7 linux/configs/kernel-2.2.14-i686.config:1.8 --- linux/configs/kernel-2.2.14-i686.config:1.7 Thu Jun 1 13:01:16 2000 +++ linux/configs/kernel-2.2.14-i686.config Fri Jul 7 15:36:42 2000 @@ -1,5 +1,5 @@ # -# Automatically generated by make menuconfig: don't edit +# Automatically generated make config: don't edit # # @@ -14,8 +14,7 @@ # CONFIG_M486 is not set # CONFIG_M586 is not set # CONFIG_M586TSC is not set -# CONFIG_M686 is not set -CONFIG_M686FX=y +CONFIG_M686=y CONFIG_X86_WP_WORKS_OK=y CONFIG_X86_INVLPG=y CONFIG_X86_BSWAP=y @@ -25,11 +24,11 @@ CONFIG_X86_PN_OFF=y CONFIG_X86_FX=y # CONFIG_X86_CPU_OPTIMIZATIONS is not set +CONFIG_1GB=y +# CONFIG_2GB is not set # CONFIG_MATH_EMULATION is not set CONFIG_MTRR=y # CONFIG_SMP is not set -CONFIG_1GB=y -# CONFIG_2GB is not set # # Loadable module support @@ -86,6 +85,10 @@ # CONFIG_BLK_DEV_FD=y 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_IDEDISK=y CONFIG_BLK_DEV_IDECD=m @@ -104,27 +107,41 @@ # CONFIG_BLK_DEV_VIA82C586 is not set # CONFIG_BLK_DEV_CMD646 is not set # CONFIG_IDE_CHIPSETS is not set + +# +# Additional Block Devices +# CONFIG_BLK_DEV_LOOP=m CONFIG_BLK_DEV_NBD=m -# CONFIG_BLK_DEV_MD is not set +CONFIG_BLK_DEV_MD=y CONFIG_AUTODETECT_RAID=y -CONFIG_MD_LINEAR=m -CONFIG_MD_STRIPED=m -CONFIG_MD_MIRRORING=m -CONFIG_MD_RAID5=m +CONFIG_MD_LINEAR=y +CONFIG_MD_STRIPED=y +CONFIG_MD_MIRRORING=y +CONFIG_MD_RAID5=y # CONFIG_MD_TRANSLUCENT is not set # CONFIG_MD_HSM is not set +CONFIG_MD_BOOT=y CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_INITRD=y CONFIG_BLK_DEV_XD=m CONFIG_BLK_DEV_DAC960=y +CONFIG_BLK_DEV_3WARE=y CONFIG_PARIDE_PARPORT=m CONFIG_PARIDE=m + +# +# Parallel IDE high-level drivers +# CONFIG_PARIDE_PD=m CONFIG_PARIDE_PCD=m CONFIG_PARIDE_PF=m CONFIG_PARIDE_PT=m CONFIG_PARIDE_PG=m + +# +# Parallel IDE protocol modules +# CONFIG_PARIDE_ATEN=m CONFIG_PARIDE_BPCK=m CONFIG_PARIDE_COMM=m @@ -161,7 +178,16 @@ CONFIG_NETLINK_DEV=y CONFIG_IP_TRANSPARENT_PROXY=y CONFIG_IP_MASQUERADE=y + +# +# Protocol-specific masquerading support will be built as modules. +# +# CONFIG_IP_MASQUERADE_UDP_LOOSE is not set CONFIG_IP_MASQUERADE_ICMP=y + +# +# Protocol-specific masquerading support will be built as modules. +# CONFIG_IP_MASQUERADE_MOD=y CONFIG_IP_MASQUERADE_IPAUTOFW=m CONFIG_IP_MASQUERADE_IPPORTFW=m @@ -180,9 +206,17 @@ CONFIG_IP_ALIAS=y # CONFIG_ARPD is not set CONFIG_SYN_COOKIES=y + +# +# (it is safe to leave these untouched) +# CONFIG_INET_RARP=m CONFIG_SKB_LARGE=y # CONFIG_IPV6 is not set + +# +# +# CONFIG_IPX=m # CONFIG_IPX_INTERN is not set # CONFIG_SPX is not set @@ -212,11 +246,19 @@ # SCSI support # CONFIG_SCSI=y + +# +# SCSI support type (disk, tape, CD-ROM) +# CONFIG_BLK_DEV_SD=y CONFIG_CHR_DEV_ST=y CONFIG_BLK_DEV_SR=y CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=m + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# # CONFIG_SCSI_MULTI_LUN is not set CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_LOGGING=y @@ -230,7 +272,7 @@ CONFIG_SCSI_AHA1542=m CONFIG_SCSI_AHA1740=m CONFIG_SCSI_AIC7XXX=y -# CONFIG_AIC7XXX_TCQ_ON_BY_DEFAULT is not set +CONFIG_AIC7XXX_TCQ_ON_BY_DEFAULT=y CONFIG_AIC7XXX_CMDS_PER_DEVICE=8 CONFIG_AIC7XXX_PROC_STATS=y CONFIG_AIC7XXX_RESET_DELAY=5 @@ -275,11 +317,13 @@ CONFIG_SCSI_SYM53C8XX=y CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS=8 CONFIG_SCSI_NCR53C8XX_MAX_TAGS=32 -CONFIG_SCSI_NCR53C8XX_SYNC=40 +CONFIG_SCSI_NCR53C8XX_SYNC=80 CONFIG_SCSI_NCR53C8XX_PROFILE=y # CONFIG_SCSI_NCR53C8XX_IOMAPPED is not set CONFIG_SCSI_NCR53C8XX_SYMBIOS_COMPAT=y -CONFIG_SCSI_NCR53C8XX_PQS_PDS=y +CONFIG_SCSI_NCR53C8XX_PQS_PDS=y +# CONFIG_SCSI_NCR53C8XX_IARB is not set +CONFIG_SCSI_NCR53C8XX_INTEGRITY_CHECK=y CONFIG_SCSI_PAS16=m CONFIG_SCSI_PCI2000=m CONFIG_SCSI_PCI2220I=m @@ -399,6 +443,10 @@ CONFIG_IPDDP_DECAP=y CONFIG_PLIP=m CONFIG_PPP=m + +# +# CCP compressors for PPP are only built as modules. +# CONFIG_SLIP=m CONFIG_SLIP_COMPRESSED=y CONFIG_SLIP_SMART=y @@ -448,28 +496,52 @@ # IrDA subsystem support # CONFIG_IRDA=m + +# +# IrDA protocols +# CONFIG_IRLAN=m CONFIG_IRCOMM=m CONFIG_IRLPT=m CONFIG_IRLPT_CLIENT=m CONFIG_IRLPT_SERVER=m CONFIG_IRDA_OPTIONS=y + +# +# IrDA options +# CONFIG_IRDA_CACHE_LAST_LSAP=y CONFIG_IRDA_FAST_RR=y # CONFIG_IRDA_DEBUG is not set CONFIG_IRDA_COMPRESSION=y + +# +# IrDA compressors +# CONFIG_IRDA_DEFLATE=m # # Infrared-port device drivers # + +# +# SIR device drivers +# CONFIG_IRTTY_SIR=m CONFIG_IRPORT_SIR=m + +# +# FIR device drivers +# CONFIG_NSC_FIR=m CONFIG_WINBOND_FIR=m CONFIG_SHARP_FIR=m CONFIG_TOSHIBA_FIR=m CONFIG_SMC_IRCC_FIR=m + +# +# Dongle support +# CONFIG_DONGLE=y CONFIG_ESI_DONGLE=m CONFIG_ACTISYS_DONGLE=m @@ -636,6 +708,44 @@ # CONFIG_MIXCOMWD is not set CONFIG_NVRAM=m CONFIG_RTC=y + +# +# I2C support +# +CONFIG_I2C=m +CONFIG_I2C_ALGOBIT=m +CONFIG_I2C_PHILIPSPAR=m +CONFIG_I2C_ELV=m +CONFIG_I2C_VELLEMAN=m +CONFIG_I2C_ALGOPCF=m +CONFIG_I2C_ELEKTOR=m +CONFIG_I2C_MAINBOARD=m +CONFIG_I2C_ALI15X3=m +CONFIG_I2C_HYDRA=m +CONFIG_I2C_PIIX4=m +CONFIG_I2C_VIA=m +CONFIG_I2C_ISA=m +CONFIG_I2C_CHARDEV=m + +# +# Hardware sensors support +# +CONFIG_SENSORS=m +CONFIG_SENSORS_ADM1021=m +CONFIG_SENSORS_ADM9240=m +CONFIG_SENSORS_GL518SM=m +CONFIG_SENSORS_LM75=m +CONFIG_SENSORS_LM78=m +CONFIG_SENSORS_LM80=m +CONFIG_SENSORS_SIS5595=m +CONFIG_SENSORS_W83781D=m +CONFIG_SENSORS_OTHER=m +CONFIG_SENSORS_EEPROM=m +CONFIG_SENSORS_LTC1710=m + +# +# AGP support +# CONFIG_AGP=m CONFIG_AGP_INTEL=y CONFIG_AGP_I810=y @@ -674,6 +784,10 @@ CONFIG_FTAPE=m CONFIG_ZFTAPE=m CONFIG_ZFT_DFLT_BLK_SZ=10240 + +# +# The compressor will be built as a module only! +# CONFIG_ZFT_COMPRESSOR=m CONFIG_FT_NR_BUFFERS=3 CONFIG_FT_PROC_FS=y @@ -681,12 +795,20 @@ # CONFIG_FT_FULL_DEBUG is not set # CONFIG_FT_NO_TRACE is not set # CONFIG_FT_NO_TRACE_AT_ALL is not set + +# +# Hardware configuration +# CONFIG_FT_STD_FDC=y # CONFIG_FT_MACH2 is not set # CONFIG_FT_PROBE_FC10 is not set # CONFIG_FT_ALT_FDC is not set CONFIG_FT_FDC_THR=8 CONFIG_FT_FDC_MAX_RATE=2000 + +# +# ONLY for DEC Alpha architectures +# CONFIG_FT_ALPHA_CLOCK=0 # @@ -713,6 +835,8 @@ # CONFIG_QNX4FS_RW is not set CONFIG_ROMFS_FS=m CONFIG_EXT2_FS=y +CONFIG_EXT3_FS=y +CONFIG_EXT3_FS_JFS_CHECK=y CONFIG_SYSV_FS=m CONFIG_UFS_FS=m # CONFIG_UFS_FS_WRITE is not set @@ -728,6 +852,8 @@ CONFIG_NFSD_SUN=y CONFIG_SUNRPC=m CONFIG_LOCKD=m +CONFIG_NFSD_V3=y +CONFIG_NFS_V3=y CONFIG_SMB_FS=m CONFIG_NCP_FS=m CONFIG_NCPFS_PACKET_SIGNING=y @@ -870,15 +996,31 @@ CONFIG_AEDSP16=m CONFIG_AEDSP16_BASE=220 CONFIG_MPU_BASE=330 + +# +# SC-6600 Audio Cards have no jumper switches at all +# CONFIG_SC6600=y + +# +# SC-6600 specific configuration +# CONFIG_SC6600_JOY=y CONFIG_SC6600_CDROM=4 CONFIG_SC6600_CDROMBASE=0 CONFIG_AEDSP16_SBPRO=y + +# +# Audio Excel DSP 16 [Sound Blaster Pro] +# CONFIG_AEDSP16_BASE=220 CONFIG_AEDSP16_SB_IRQ=5 CONFIG_AEDSP16_SB_DMA=0 CONFIG_AEDSP16_MPU401=y + +# +# Audio Excel DSP 16 [MPU-401] +# CONFIG_AEDSP16_MPU_IRQ=5 # Index: oldkernel/linux/drivers/block/3w-xxxx.c diff -u /dev/null linux/drivers/block/3w-xxxx.c:1.1 --- /dev/null Mon Jul 31 21:15:04 2000 +++ linux/drivers/block/3w-xxxx.c Fri Jul 7 16:18:17 2000 @@ -0,0 +1,2387 @@ +/* + 3w-xxxx.c -- 3ware Storage Controller device driver for Linux. + + Written By: Adam Radford + Copyright (C) 1999 3ware Inc. + + 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 of the License. + + 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. + + NO WARRANTY + THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT + LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, + MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is + solely responsible for determining the appropriateness of using and + distributing the Program and assumes all risks associated with its + exercise of rights under this Agreement, including but not limited to + the risks and costs of program errors, damage to or loss of data, + programs or equipment, and unavailability or interruption of operations. + + DISCLAIMER OF LIABILITY + NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), 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 OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED + HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES + + 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 + + Bugs/Comments/Suggestions should be mailed to: + linux@3ware.com + + For more information, goto: + http://www.3ware.com +*/ + +#include +#include + +#ifdef MODULE +#include +#include +char kernel_version[] = UTS_RELEASE; +MODULE_AUTHOR ("3ware Inc."); +MODULE_DESCRIPTION ("3ware Storage Controller Linux Driver"); +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../scsi/sd.h" +#include "../scsi/scsi.h" +#include "../scsi/hosts.h" + +#include "3w-xxxx.h" + +struct proc_dir_entry tw_scsi_proc_entry = +/* We will eventually need to be added to proc_fs.h */ +{ +#if !defined(PROC_SCSI_3W_XXXX) + PROC_SCSI_IDESCSI, +#else + PROC_SCSI_3W_XXXX, +#endif + 7, "3w-xxxx", + S_IFDIR | S_IRUGO | S_IXUGO, 2 +}; + +/* Globals */ +char *tw_driver_version="1.0.000"; +TW_Device_Extension *tw_device_extension_list[TW_MAX_SLOT]; +int tw_device_extension_count = 0; + +/* Functions */ + +/* This function will complete an aen request from the isr */ +int tw_aen_complete(TW_Device_Extension *tw_dev, int request_id) +{ + TW_Param *param; + unsigned short aen, aen_code; + + if (tw_dev->alignment_virtual_address[request_id] == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_aen_complete(): Bad alignment " + "virtual address.\n"); + return 1; + } + param = (TW_Param *)tw_dev->alignment_virtual_address[request_id]; + aen = *(unsigned short *)(param->data); + aen_code = (aen & 0x0ff); + dprintk(KERN_NOTICE "3w-xxxx: tw_aen_complete(): Queue'd code 0x%x\n", + aen_code); + /* Now queue the code */ + tw_dev->aen_queue[tw_dev->aen_tail] = aen_code; + if (tw_dev->aen_tail == TW_Q_LENGTH - 1) + tw_dev->aen_tail = TW_Q_START; + else + tw_dev->aen_tail = tw_dev->aen_tail + 1; + if (tw_dev->aen_head == tw_dev->aen_tail) { + if (tw_dev->aen_head == TW_Q_LENGTH - 1) + tw_dev->aen_head = TW_Q_START; + else + tw_dev->aen_head = tw_dev->aen_head + 1; + } + tw_dev->state[request_id] = TW_S_COMPLETED; + tw_state_request_finish(tw_dev, request_id); + + return 0; +} /* End tw_aen_complete() */ + +/* This function will drain the aen queue after a soft reset */ +int tw_aen_drain_queue(TW_Device_Extension *tw_dev) +{ + TW_Command *command_packet; + TW_Param *param; + int tries = 0; + int request_id = 0; + u32 command_que_value = 0, command_que_addr; + u32 status_reg_value = 0, status_reg_addr; + u32 param_value; + TW_Response_Queue response_queue; + u32 response_que_addr; + unsigned short aen; + unsigned short aen_code; + int finished = 0; + int first_reset = 0; + int queue = 0; + int imax, i; + int found = 0; + + dprintk(KERN_NOTICE "3w-xxxx: tw_aen_drain_queue()\n"); + + command_que_addr = tw_dev->registers.command_que_addr; + status_reg_addr = tw_dev->registers.status_reg_addr; + response_que_addr = tw_dev->registers.response_que_addr; + + if (tw_poll_status(tw_dev, TW_STATUS_ATTENTION_INTERRUPT, 15)) { + printk(KERN_WARNING "3w-xxxx: tw_aen_drain_queue(): No attention " + "interrupt for card %d\n", tw_dev->host->host_no); + return 1; + } + + /* Initialize command packet */ + if (tw_dev->command_packet_virtual_address[request_id] == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_aen_drain_queue(): Bad command packet " + "virtual address.\n"); + return 1; + } + command_packet = + (TW_Command *)tw_dev->command_packet_virtual_address[request_id]; + memset(command_packet, 0, sizeof(TW_Sector)); + command_packet->byte0.opcode = TW_OP_GET_PARAM; + command_packet->byte0.sgl_offset = 2; + command_packet->size = 4; + command_packet->request_id = request_id; + command_packet->byte3.unit = 0; + command_packet->byte3.host_id = 0; + command_packet->status = 0; + command_packet->flags = 0; + command_packet->byte6.parameter_count = 1; + command_que_value = tw_dev->command_packet_physical_address[request_id]; + if (command_que_value == 0) { + printk(KERN_WARNING "3w-xxxx: tw_aen_drain_queue(): Bad command packet " + "physical address.\n"); + return 1; + } + + /* Now setup the param */ + if (tw_dev->alignment_virtual_address[request_id] == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_aen_drain_queue(): Bad alignment " + "virtual address.\n"); + return 1; + } + param = (TW_Param *)tw_dev->alignment_virtual_address[request_id]; + memset(param, 0, sizeof(TW_Sector)); + param->table_id = 0x401; /* AEN table */ + param->parameter_id = 2; /* Unit code */ + param->parameter_size_bytes = 2; + param_value = tw_dev->alignment_physical_address[request_id]; + if (param_value == 0) { + printk(KERN_WARNING "3w-xxxx: tw_aen_drain_queue(): Bad alignment " + "physical address.\n"); + return 1; + } + command_packet->byte8.param.sgl[0].address = param_value; + command_packet->byte8.param.sgl[0].length = sizeof(TW_Sector); + + imax = TW_POLL_MAX_RETRIES; + + /* Now drain the controller's aen queue */ + do { + /* Post command packet */ + outl(command_que_value, command_que_addr); + + /* Now poll for completion */ + for (i=0;istatus != 0) { + if (command_packet->flags != TW_AEN_TABLE_UNDEFINED) { + /* Bad response */ + printk(KERN_WARNING "3w-xxxx: tw_aen_drain_queue(): Bad " + "response, flags = 0x%x.\n", command_packet->flags); + return 1; + } else { + /* We know this is a 3w-1x00, and doesn't support aen's */ + return 0; + } + } + + /* Now check the aen */ + aen = *(unsigned short *)(param->data); + aen_code = (aen & 0x0ff); + queue = 0; + switch (aen_code) { + case TW_AEN_QUEUE_EMPTY: + dprintk(KERN_NOTICE "3w-xxxx: tw_aen_drain_queue(): Found " + "TW_AEN_QUEUE_EMPTY.\n"); + if (first_reset != 1) + continue; + else + finished = 1; + break; + case TW_AEN_SOFT_RESET: + dprintk(KERN_NOTICE "3w-xxxx: tw_aen_drain_queue(): Found " + "TW_AEN_SOFT_RESET.\n"); + if (first_reset == 0) + first_reset = 1; + else + queue = 1; + break; + case TW_AEN_DEGRADED_MIRROR: + dprintk(KERN_NOTICE "3w-xxxx: tw_aen_drain_queue(): Found " + "TW_AEN_DEGRADED_MIRROR.\n"); + queue = 1; + break; + case TW_AEN_CONTROLLER_ERROR: + dprintk(KERN_NOTICE "3w-xxxx: tw_aen_drain_queue(): Found " + "TW_AEN_CONTROLLER_ERROR.\n"); + queue = 1; + break; + case TW_AEN_REBUILD_FAIL: + dprintk(KERN_NOTICE "3w-xxxx: tw_aen_drain_queue(): Found " + "TW_AEN_REBUILD_FAIL.\n"); + queue = 1; + break; + case TW_AEN_REBUILD_DONE: + dprintk(KERN_NOTICE "3w-xxxx: tw_aen_drain_queue(): Found " + "TW_AEN_REBUILD_DONE.\n"); + queue = 1; + break; + case TW_AEN_QUEUE_FULL: + dprintk(KERN_NOTICE "3w-xxxx: tw_aen_drain_queue(): Found " + "TW_AEN_QUEUE_FULL.\n"); + queue = 1; + break; + default: + dprintk(KERN_WARNING "3w-xxxx: tw_aen_drain_queue(): Unknown AEN " + "code 0x%x.\n", aen_code); + queue = 1; + } + + /* Now put the aen on the aen_queue */ + if (queue == 1) { + tw_dev->aen_queue[tw_dev->aen_tail] = aen_code; + if (tw_dev->aen_tail == TW_Q_LENGTH - 1) + tw_dev->aen_tail = TW_Q_START; + else + tw_dev->aen_tail = tw_dev->aen_tail + 1; + if (tw_dev->aen_head == tw_dev->aen_tail) { + if (tw_dev->aen_head == TW_Q_LENGTH - 1) + tw_dev->aen_head = TW_Q_START; + else + tw_dev->aen_head = tw_dev->aen_head + 1; + } + } + found = 1; + break; + } + } + if (found == 0) { + printk(KERN_WARNING "3w-xxxx: tw_aen_drain_queue(): Response never " + "received.\n"); + return 1; + } + tries++; + } while ((tries < TW_MAX_AEN_TRIES) && (finished == 0)); + + if (tries >=TW_MAX_AEN_TRIES) { + printk(KERN_WARNING "3w-xxxx: tw_aen_drain_queue(): Aen queue error.\n"); + return 1; + } + + return 0; +} /* End tw_aen_drain_queue() */ + +/* This function will read the aen queue from the isr */ +int tw_aen_read_queue(TW_Device_Extension *tw_dev, int request_id) +{ + TW_Command *command_packet; + TW_Param *param; + u32 command_que_value = 0, command_que_addr; + u32 status_reg_value = 0, status_reg_addr; + u32 param_value = 0; + + dprintk(KERN_NOTICE "3w-xxxx: tw_aen_read_queue()\n"); + command_que_addr = tw_dev->registers.command_que_addr; + status_reg_addr = tw_dev->registers.status_reg_addr; + + status_reg_value = inl(status_reg_addr); + if (tw_check_bits(status_reg_value)) { + printk(KERN_WARNING "3w-xxxx: tw_aen_read_queue(): Unexpected bits.\n"); + return 1; + } + if (tw_dev->command_packet_virtual_address[request_id] == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_aen_read_queue(): Bad command packet " + "virtual address.\n"); + return 1; + } + command_packet = + (TW_Command *)tw_dev->command_packet_virtual_address[request_id]; + memset(command_packet, 0, sizeof(TW_Sector)); + command_packet->byte0.opcode = TW_OP_GET_PARAM; + command_packet->byte0.sgl_offset = 2; + command_packet->size = 4; + command_packet->request_id = request_id; + command_packet->byte3.unit = 0; + command_packet->byte3.host_id = 0; + command_packet->status = 0; + command_packet->flags = 0; + command_packet->byte6.parameter_count = 1; + command_que_value = tw_dev->command_packet_physical_address[request_id]; + if (command_que_value == 0) { + printk(KERN_WARNING "3w-xxxx: tw_aen_read_queue(): Bad command packet " + "physical address.\n"); + return 1; + } + /* Now setup the param */ + if (tw_dev->alignment_virtual_address[request_id] == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_aen_read_queue(): Bad alignment " + "virtual address.\n"); + return 1; + } + param = (TW_Param *)tw_dev->alignment_virtual_address[request_id]; + memset(param, 0, sizeof(TW_Sector)); + param->table_id = 0x401; /* AEN table */ + param->parameter_id = 2; /* Unit code */ + param->parameter_size_bytes = 2; + param_value = tw_dev->alignment_physical_address[request_id]; + if (param_value == 0) { + printk(KERN_WARNING "3w-xxxx: tw_aen_read_queue(): Bad alignment " + "physical address.\n"); + return 1; + } + command_packet->byte8.param.sgl[0].address = param_value; + command_packet->byte8.param.sgl[0].length = sizeof(TW_Sector); + + /* Now post the command packet */ + if ((status_reg_value & TW_STATUS_COMMAND_QUEUE_FULL) == 0) { + dprintk(KERN_WARNING "3w-xxxx: tw_aen_read_queue(): Post succeeded.\n"); + tw_dev->srb[request_id] = 0; /* Flag internal command */ + tw_dev->state[request_id] = TW_S_POSTED; + outl(command_que_value, command_que_addr); + } + else { + printk(KERN_WARNING "3w-xxxx: tw_aen_read_queue(): Post failed, will " + "retry.\n"); + return 1; + } + + return 0; +} /* End tw_aen_read_queue() */ + +/* This function will allocate memory and check if it is 16 d-word aligned */ +int tw_allocate_memory(TW_Device_Extension *tw_dev, int request_id, + int size, int which) +{ + u32 *virt_addr; + + dprintk(KERN_NOTICE "3w-xxxx: tw_allocate_memory()\n"); + + if (which == 0) { + /* Allocate command packet memory */ + virt_addr = kmalloc(size, GFP_ATOMIC); + if (virt_addr == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_allocate_memory(): kmalloc() " + "failed.\n"); + return 1; + } + if ((u32)virt_addr % TW_ALIGNMENT) { + printk(KERN_WARNING "3w-xxxx: tw_allocate_memory(): Found unaligned " + "address.\n"); + return 1; + } + tw_dev->command_packet_virtual_address[request_id] = virt_addr; + tw_dev->command_packet_physical_address[request_id] = + virt_to_bus(virt_addr); + } else { + /* Allocate generic buffer */ + virt_addr = kmalloc(size, GFP_ATOMIC); + if (virt_addr == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_allocate_memory(): kmalloc() " + "failed.\n"); + return 1; + } + if ((u32)virt_addr % TW_ALIGNMENT) { + printk(KERN_WARNING "3w-xxxx: tw_allocate_memory(): Found unaligned " + "address.\n"); + return 1; + } + tw_dev->alignment_virtual_address[request_id] = virt_addr; + tw_dev->alignment_physical_address[request_id] = virt_to_bus(virt_addr); + } + return 0; +} /* End tw_allocate_memory() */ + +/* This function will check the status register for unexpected bits */ +int tw_check_bits(u32 status_reg_value) +{ + if ((status_reg_value & TW_STATUS_EXPECTED_BITS) != + TW_STATUS_EXPECTED_BITS) { + printk(KERN_WARNING "3w-xxxx: tw_check_bits(): No expected bits (0x%x).\n", + status_reg_value); + return 1; + } + if ((status_reg_value & TW_STATUS_UNEXPECTED_BITS) != 0) { + printk(KERN_WARNING "3w-xxxx: tw_check_bits(): Found unexpected " + "bits (0x%x).\n", + status_reg_value); + return 1; + } + return 0; +} /* End tw_check_bits() */ + +/* This function will report controller error status */ +int tw_check_errors(TW_Device_Extension *tw_dev) +{ + u32 status_reg_addr, status_reg_value; + + status_reg_addr = tw_dev->registers.status_reg_addr; + status_reg_value = inl(status_reg_addr); + + if (TW_STATUS_ERRORS(status_reg_value) || + tw_check_bits(status_reg_value)) + return 1; + return 0; +} /* End tw_check_errors() */ + +/* This function will clear the attention interrupt */ +void tw_clear_attention_interrupt(TW_Device_Extension *tw_dev) +{ + u32 control_reg_addr, control_reg_value; + + control_reg_addr = tw_dev->registers.control_reg_addr; + control_reg_value = TW_CONTROL_CLEAR_ATTENTION_INTERRUPT; + outl(control_reg_value, control_reg_addr); +} /* End tw_clear_attention_interrupt() */ + +/* This function will clear the host interrupt */ +void tw_clear_host_interrupt(TW_Device_Extension *tw_dev) +{ + u32 control_reg_addr, control_reg_value; + + control_reg_addr = tw_dev->registers.control_reg_addr; + control_reg_value = TW_CONTROL_CLEAR_HOST_INTERRUPT; + outl(control_reg_value, control_reg_addr); +} /* End tw_clear_host_interrupt() */ + +/* This function is called by tw_scsi_proc_info */ +static int tw_copy_info(TW_Info *info, char *fmt, ...) +{ + va_list args; + char buf[81]; + int len; + + va_start(args, fmt); + len = vsprintf(buf, fmt, args); + va_end(args); + tw_copy_mem_info(info, buf, len); + return len; +} /* End tw_copy_info() */ + +/* This function is called by tw_scsi_proc_info */ +static void tw_copy_mem_info(TW_Info *info, char *data, int len) +{ + if (info->position + len > info->length) + len = info->length - info->position; + + if (info->position + len < info->offset) { + info->position += len; + return; + } + if (info->position < info->offset) { + data += (info->offset - info->position); + len -= (info->offset - info->position); + } + if (len > 0) { + memcpy(info->buffer + info->position, data, len); + info->position += len; + } +} /* End tw_copy_mem_info() */ + +/* This function will disable interrupts on the controller */ +void tw_disable_interrupts(TW_Device_Extension *tw_dev) +{ + u32 control_reg_value, control_reg_addr; + + control_reg_addr = tw_dev->registers.control_reg_addr; + control_reg_value = TW_CONTROL_DISABLE_INTERRUPTS; + outl(control_reg_value, control_reg_addr); +} /* End tw_disable_interrupts() */ + +/* This function will empty the response que */ +int tw_empty_response_que(TW_Device_Extension *tw_dev) +{ + u32 status_reg_addr, status_reg_value; + u32 response_que_addr, response_que_value; + + status_reg_addr = tw_dev->registers.status_reg_addr; + response_que_addr = tw_dev->registers.response_que_addr; + + status_reg_value = inl(status_reg_addr); + + if (tw_check_bits(status_reg_value)) { + printk(KERN_WARNING "3w-xxxx: tw_empty_response_queue(): " + "Unexpected bits 1.\n"); + return 1; + } + + while ((status_reg_value & TW_STATUS_RESPONSE_QUEUE_EMPTY) == 0) { + response_que_value = inl(response_que_addr); + status_reg_value = inl(status_reg_addr); + if (tw_check_bits(status_reg_value)) { + printk(KERN_WARNING "3w-xxxx: tw_empty_response_queue(): " + "Unexpected bits 2.\n"); + return 1; + } + } + return 0; +} /* End tw_empty_response_que() */ + +/* This function will enable interrupts on the controller */ +void tw_enable_interrupts(TW_Device_Extension *tw_dev) +{ + u32 control_reg_value, control_reg_addr; + + control_reg_addr = tw_dev->registers.control_reg_addr; + control_reg_value = (TW_CONTROL_CLEAR_ATTENTION_INTERRUPT | + TW_CONTROL_UNMASK_RESPONSE_INTERRUPT | + TW_CONTROL_ENABLE_INTERRUPTS); + outl(control_reg_value, control_reg_addr); +} /* End tw_enable_interrupts() */ + +/* This function will find and initialize all cards */ +int tw_findcards(Scsi_Host_Template *tw_host) +{ + int numcards = 0, tries = 0, error = 0; + struct Scsi_Host *host; + TW_Device_Extension *tw_dev; + TW_Device_Extension *tw_dev2; + struct pci_dev *tw_pci_dev = pci_devices; + u32 status_reg_value; + + dprintk(KERN_NOTICE "3w-xxxx: tw_findcards()\n"); + while ((tw_pci_dev = pci_find_device(TW_VENDOR_ID, TW_DEVICE_ID, + tw_pci_dev))) { + /* Prepare temporary device extension */ + tw_dev=(TW_Device_Extension *)kmalloc(sizeof(TW_Device_Extension), + GFP_ATOMIC); + if (tw_dev == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_findcards(): kmalloc() failed for " + "card %d.\n", numcards); + continue; + } + memset(tw_dev, 0, sizeof(TW_Device_Extension)); + + error = tw_initialize_device_extension(tw_dev); + if (error) { + printk(KERN_WARNING "3w-xxxx: tw_findcards(): Couldn't initialize " + "device extension for card %d.\n", numcards); + tw_free_device_extension(tw_dev); + kfree(tw_dev); + continue; + } + + /* Calculate the cards register addresses */ + tw_dev->registers.base_addr = tw_pci_dev->base_address[0]; + tw_dev->registers.control_reg_addr = + (tw_pci_dev->base_address[0] & ~15); + tw_dev->registers.status_reg_addr = + ((tw_pci_dev->base_address[0] & ~15) + 0x4); + tw_dev->registers.command_que_addr = + ((tw_pci_dev->base_address[0] & ~15) + 0x8); + tw_dev->registers.response_que_addr = + ((tw_pci_dev->base_address[0] & ~15) + 0xC); + + /* Save pci_dev struct to device extension */ + tw_dev->tw_pci_dev = tw_pci_dev; + + /* Poll status register for 60 secs for 'Controller Ready' flag */ + if (tw_poll_status(tw_dev, TW_STATUS_MICROCONTROLLER_READY, 60)) { + printk(KERN_WARNING "3w-xxxx: tw_findcards(): Microcontroller not " + "ready for card %d.\n", numcards); + tw_free_device_extension(tw_dev); + kfree(tw_dev); + continue; + } + + /* Disable interrupts on the card */ + tw_disable_interrupts(tw_dev); + + while (tries < TW_MAX_RESET_TRIES) { + /* Do soft reset */ + tw_soft_reset(tw_dev); + + error = tw_aen_drain_queue(tw_dev); + if (error) { + printk(KERN_WARNING "3w-xxxx: tw_findcards(): No attention " + "interrupt for card %d.\n", numcards); + tries++; + continue; + } + + /* Check for controller errors */ + if (tw_check_errors(tw_dev)) { + printk(KERN_WARNING "3w-xxxx: tw_findcards(): Controller errors " + "found, soft resetting card %d.\n", numcards); + tries++; + continue; + } + + /* Empty the response queue */ + error = tw_empty_response_que(tw_dev); + if (error) { + printk(KERN_WARNING "3w-xxxx: tw_findcards(): Couldn't empty " + "response queue for card %d.\n", numcards); + tries++; + continue; + } + + /* Now the controller is in a good state */ + break; + } + + if (tries >= TW_MAX_RESET_TRIES) { + printk(KERN_WARNING "3w-xxxx: tw_findcards(): Controller error or " + "no attention interrupt: giving up for card %d.\n", numcards); + tw_free_device_extension(tw_dev); + kfree(tw_dev); + continue; + } + + /* Make sure that io region isn't already taken */ + if (check_region((tw_dev->tw_pci_dev->base_address[0] & ~15), + TW_IO_ADDRESS_RANGE)) { + printk(KERN_WARNING "3w-xxxx: tw_findcards(): Couldn't get io range " + "0x%lx-0x%lx for card %d.\n", + (tw_dev->tw_pci_dev->base_address[0] & ~15), + (tw_dev->tw_pci_dev->base_address[0] & ~15) + + TW_IO_ADDRESS_RANGE, numcards); + tw_free_device_extension(tw_dev); + kfree(tw_dev); + continue; + } + + /* Reserve the io address space */ + request_region((tw_dev->tw_pci_dev->base_address[0] & ~15), + TW_IO_ADDRESS_RANGE, TW_DEVICE_NAME); + + error = tw_initialize_units(tw_dev); + if (error) { + printk(KERN_WARNING "3w-xxxx: tw_findcards(): Couldn't initialize " + "units for card %d.\n", numcards); + release_region((tw_dev->tw_pci_dev->base_address[0] & ~15), + TW_IO_ADDRESS_RANGE); + tw_free_device_extension(tw_dev); + kfree(tw_dev); + continue; + } + + error = tw_initconnection(tw_dev); + if (error) { + printk(KERN_WARNING "3w-xxxx: tw_findcards(): Couldn't initconnection " + "for card %d.\n", numcards); + release_region((tw_dev->tw_pci_dev->base_address[0] & ~15), + TW_IO_ADDRESS_RANGE); + tw_free_device_extension(tw_dev); + kfree(tw_dev); + continue; + } + + /* Calculate max cmds per lun */ + if (tw_dev->num_units > 0) + tw_host->cmd_per_lun = (TW_Q_LENGTH-2)/tw_dev->num_units; + + /* Register the card with the kernel SCSI layer */ + host = scsi_register(tw_host, sizeof(TW_Device_Extension)); + + status_reg_value = inl(tw_dev->registers.status_reg_addr); + + dprintk(KERN_NOTICE "scsi%d : Found a 3ware Storage Controller at " + "0x%x, IRQ: %d P-chip: %d.%d\n", host->host_no, + (u32)(tw_pci_dev->base_address[0] & ~15), tw_pci_dev->irq, + (status_reg_value & TW_STATUS_MAJOR_VERSION_MASK) >> 28, + (status_reg_value & TW_STATUS_MINOR_VERSION_MASK) >> 24); + + if (host->hostdata) { + tw_dev2 = (TW_Device_Extension *)host->hostdata; + memcpy(tw_dev2, tw_dev, sizeof(TW_Device_Extension)); + tw_device_extension_list[tw_device_extension_count] = tw_dev2; + numcards++; + tw_device_extension_count = numcards; + tw_dev2->host = host; + } else { + printk(KERN_WARNING "3w-xxxx: tw_findcards(): Bad scsi host data for " + "card %d.\n", numcards-1); + scsi_unregister(host); + release_region((tw_dev->tw_pci_dev->base_address[0] & ~15), + TW_IO_ADDRESS_RANGE); + tw_free_device_extension(tw_dev); + kfree(tw_dev); + continue; + } + + /* Re-enable interrupts on the card */ + tw_enable_interrupts(tw_dev2); + + /* Now setup the interrupt handler */ + error = tw_setup_irq(tw_dev2); + if (error) { + printk(KERN_WARNING "3w-xxxx: tw_findcards(): Error requesting irq " + "for card %d.\n", numcards-1); + scsi_unregister(host); + release_region((tw_dev->tw_pci_dev->base_address[0] & ~15), + TW_IO_ADDRESS_RANGE); + tw_free_device_extension(tw_dev); + kfree(tw_dev); + numcards--; + continue; + } + + /* Free the temporary device extension */ + if (tw_dev) + kfree(tw_dev); + } + + if (numcards == 0) + printk(KERN_WARNING "3w-xxxx: tw_findcards(): No cards found.\n"); + + return numcards; +} /* End tw_findcards() */ + +/* This function will free up device extension resources */ +void tw_free_device_extension(TW_Device_Extension *tw_dev) +{ + int i, imax; + imax = TW_Q_LENGTH; + + dprintk(KERN_NOTICE "3w-xxxx: tw_free_device_extension()\n"); + /* Free command packet and generic buffer memory */ + for (i=0;icommand_packet_virtual_address[i]) + kfree(tw_dev->command_packet_virtual_address[i]); + if (tw_dev->alignment_virtual_address[i]) + kfree(tw_dev->alignment_virtual_address[i]); + } +} /* End tw_free_device_extension() */ + +/* This function will send an initconnection command to controller */ +int tw_initconnection(TW_Device_Extension *tw_dev) +{ + u32 command_que_addr, command_que_value; + u32 status_reg_addr, status_reg_value; + u32 response_que_addr; + TW_Command *command_packet; + TW_Response_Queue response_queue; + int request_id = 0; + int i = 0; + int imax = 0; + + dprintk(KERN_NOTICE "3w-xxxx: tw_initconnection()\n"); + command_que_addr = tw_dev->registers.command_que_addr; + status_reg_addr = tw_dev->registers.status_reg_addr; + response_que_addr = tw_dev->registers.response_que_addr; + + /* Initialize InitConnection command packet */ + if (tw_dev->command_packet_virtual_address[request_id] == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_initconnection(): " + "Bad command packet virtual address.\n"); + return 1; + } + + command_packet = + (TW_Command *)tw_dev->command_packet_virtual_address[request_id]; + memset(command_packet, 0, sizeof(TW_Sector)); + command_packet->byte0.opcode = TW_OP_INIT_CONNECTION; + command_packet->byte0.sgl_offset = 0x0; + command_packet->size = TW_INIT_COMMAND_PACKET_SIZE; + command_packet->request_id = request_id; + command_packet->byte3.unit = 0x0; + command_packet->byte3.host_id = 0x0; + command_packet->status = 0x0; + command_packet->flags = 0x0; + command_packet->byte6.message_credits = TW_INIT_MESSAGE_CREDITS; + command_packet->byte8.init_connection.response_queue_pointer = 0x0; + command_que_value = tw_dev->command_packet_physical_address[request_id]; + + if (command_que_value == 0) { + printk(KERN_WARNING "3w-xxxx: tw_initconnection(): " + "Bad command packet physical address.\n"); + return 1; + } + + /* Send command packet to the board */ + outl(command_que_value, command_que_addr); + + /* Poll for completion */ + imax = TW_POLL_MAX_RETRIES; + for (i=0;istatus != 0) { + /* bad response */ + printk(KERN_WARNING "3w-xxxx: tw_initconnection(): Bad response, " + "flags = 0x%x.\n", command_packet->flags); + return 1; + } + break; /* Response was okay, so we exit */ + } + } + return 0; +} /* End tw_initconnection() */ + +/* This function will initialize the fields of a device extension */ +int tw_initialize_device_extension(TW_Device_Extension *tw_dev) +{ + int i, imax; + + dprintk(KERN_NOTICE "3w-xxxx: tw_initialize_device_extension()\n"); + imax = TW_Q_LENGTH; + + for (i=0; icommand_packet_virtual_address[i] == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_initialize_device_extension(): " + "Bad command packet virtual address.\n"); + return 1; + } + memset(tw_dev->command_packet_virtual_address[i], 0, sizeof(TW_Sector)); + + /* Initialize generic buffer */ + tw_allocate_memory(tw_dev, i, sizeof(TW_Sector), 1); + if (tw_dev->alignment_virtual_address[i] == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_initialize_device_extension(): " + "Bad alignment virtual address.\n"); + return 1; + } + memset(tw_dev->alignment_virtual_address[i], 0, sizeof(TW_Sector)); + + tw_dev->free_queue[i] = i; + tw_dev->state[i] = TW_S_INITIAL; + tw_dev->ioctl_size[i] = 0; + tw_dev->aen_queue[i] = 0; + } + + for (i=0;iis_unit_present[i] = 0; + + tw_dev->num_units = 0; + tw_dev->num_aborts = 0; + tw_dev->num_resets = 0; + tw_dev->free_head = TW_Q_START; + tw_dev->free_tail = TW_Q_LENGTH - 1; + tw_dev->posted_request_count = 0; + tw_dev->max_posted_request_count = 0; + tw_dev->max_sgl_entries = 0; + tw_dev->sgl_entries = 0; + tw_dev->host = NULL; + tw_dev->pending_head = TW_Q_START; + tw_dev->pending_tail = TW_Q_START; + tw_dev->aen_head = 0; + tw_dev->aen_tail = 0; + tw_dev->sector_count = 0; + tw_dev->max_sector_count = 0; + spin_lock_init(&tw_dev->tw_lock); + + return 0; +} /* End tw_initialize_device_extension() */ + +/* This function will get unit info from the controller */ +int tw_initialize_units(TW_Device_Extension *tw_dev) +{ + int found = 0; + unsigned char request_id = 0; + TW_Command *command_packet; + TW_Param *param; + int i, imax, num_units = 0; + u32 status_reg_addr, status_reg_value; + u32 command_que_addr, command_que_value; + u32 response_que_addr; + TW_Response_Queue response_queue; + u32 param_value; + unsigned char *is_unit_present; + + dprintk(KERN_NOTICE "3w-xxxx: tw_initialize_units()\n"); + + status_reg_addr = tw_dev->registers.status_reg_addr; + command_que_addr = tw_dev->registers.command_que_addr; + response_que_addr = tw_dev->registers.response_que_addr; + + /* Setup the command packet */ + command_packet = + (TW_Command *)tw_dev->command_packet_virtual_address[request_id]; + if (command_packet == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_initialize_units(): " + "Bad command packet virtual address.\n"); + return 1; + } + memset(command_packet, 0, sizeof(TW_Sector)); + command_packet->byte0.opcode = TW_OP_GET_PARAM; + command_packet->byte0.sgl_offset = 2; + command_packet->size = 4; + command_packet->request_id = request_id; + command_packet->byte3.unit = 0; + command_packet->byte3.host_id = 0; + command_packet->status = 0; + command_packet->flags = 0; + command_packet->byte6.block_count = 1; + + /* Now setup the param */ + if (tw_dev->alignment_virtual_address[request_id] == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_initialize_units(): Bad alignment " + "virtual address.\n"); + return 1; + } + param = (TW_Param *)tw_dev->alignment_virtual_address[request_id]; + memset(param, 0, sizeof(TW_Sector)); + param->table_id = 3; /* unit summary table */ + param->parameter_id = 3; /* unitstatus parameter */ + param->parameter_size_bytes = TW_MAX_UNITS; + param_value = tw_dev->alignment_physical_address[request_id]; + if (param_value == 0) { + printk(KERN_WARNING "3w-xxxx: tw_initialize_units(): Bad alignment " + "physical address.\n"); + return 1; + } + + command_packet->byte8.param.sgl[0].address = param_value; + command_packet->byte8.param.sgl[0].length = sizeof(TW_Sector); + + /* Post the command packet to the board */ + command_que_value = tw_dev->command_packet_physical_address[request_id]; + if (command_que_value == 0) { + printk(KERN_WARNING "3w-xxxx: tw_initialize_units(): " + "Bad command packet physical address.\n"); + return 1; + } + outl(command_que_value, command_que_addr); + + /* Poll for completion */ + imax = TW_POLL_MAX_RETRIES; + for(i=0; istatus != 0) { + /* bad response */ + printk(KERN_WARNING "3w-xxxx: tw_initialize_units(): Bad response," + " flags = 0x%x.\n", command_packet->flags); + return 1; + } + found = 1; + break; + } + } + if (found == 0) { + /* response never received */ + printk(KERN_WARNING "3w-xxxx: tw_initialize_units(): No response.\n"); + return 1; + } + + param = (TW_Param *)tw_dev->alignment_virtual_address[request_id]; + is_unit_present = (unsigned char *)&(param->data[0]); + + /* Show all units present */ + imax = TW_MAX_UNITS; + for(i=0; iis_unit_present[i] = FALSE; + else { + dprintk(KERN_NOTICE "3w-xxxx: tw_initialize_units(): Unit %d " + "found.\n", i); + tw_dev->is_unit_present[i] = TRUE; + num_units++; + } + } + tw_dev->num_units = num_units; + + if (num_units == 0) { + printk(KERN_NOTICE "3w-xxxx: tw_initialize_units(): No units found.\n"); + return 1; + } + + return 0; +} /* End tw_initialize_units() */ + +/* This function is the interrupt service routine */ +static void tw_interrupt(int irq, void *dev_instance, struct pt_regs *regs) +{ + int request_id; + u32 status_reg_addr, status_reg_value; + u32 response_que_addr; + TW_Device_Extension *tw_dev = (TW_Device_Extension *)dev_instance; + TW_Response_Queue response_que; + int error = 0; + int do_response_interrupt=0; + int do_attention_interrupt=0; + int do_host_interrupt=0; + int do_command_interrupt=0; + int flags = 0; + int flags2 = 0; + TW_Command *command_packet; + + spin_lock_irqsave(&io_request_lock, flags); + + if (tw_dev->tw_pci_dev->irq == irq) { + spin_lock_irqsave(&tw_dev->tw_lock, flags2); + dprintk(KERN_NOTICE "3w-xxxx: tw_interrupt()\n"); + + /* Read the registers */ + status_reg_addr = tw_dev->registers.status_reg_addr; + response_que_addr = tw_dev->registers.response_que_addr; + status_reg_value = inl(status_reg_addr); + + /* Check which interrupt */ + if (status_reg_value & TW_STATUS_HOST_INTERRUPT) + do_host_interrupt=1; + if (status_reg_value & TW_STATUS_ATTENTION_INTERRUPT) + do_attention_interrupt=1; + if (status_reg_value & TW_STATUS_COMMAND_INTERRUPT) + do_command_interrupt=1; + if (status_reg_value & TW_STATUS_RESPONSE_INTERRUPT) + do_response_interrupt=1; + + /* Handle host interrupt */ + if (do_host_interrupt) { + dprintk(KERN_NOTICE "3w-xxxx: tw_interrupt(): Received host " + "interrupt.\n"); + tw_clear_host_interrupt(tw_dev); + } + + /* Handle attention interrupt */ + if (do_attention_interrupt) { + dprintk(KERN_NOTICE "3w-xxxx: tw_interrupt(): Received attention " + "interrupt.\n"); + tw_state_request_start(tw_dev, &request_id); + error = tw_aen_read_queue(tw_dev, request_id); + if (error) { + printk(KERN_WARNING "3w-xxxx: tw_interrupt(): Error reading aen " + "queue.\n"); + tw_dev->state[request_id] = TW_S_COMPLETED; + tw_state_request_finish(tw_dev, request_id); + } else { + dprintk(KERN_WARNING "3w-xxxx: tw_interrupt(): Clearing attention " + "interrupt.\n"); + tw_clear_attention_interrupt(tw_dev); + } + } + + /* Handle command interrupt */ + if (do_command_interrupt) { + /* Drain as many pending commands as we can */ + while (tw_dev->pending_request_count > 0) { + request_id = tw_dev->pending_queue[tw_dev->pending_head]; + if (tw_dev->state[request_id] != TW_S_PENDING) { + printk(KERN_WARNING "3w-xxxx: tw_interrupt(): Found request id " + "that wasn't pending.\n"); + break; + } + if (tw_post_command_packet(tw_dev, request_id)==0) { + if (tw_dev->pending_head == TW_Q_LENGTH-1) + tw_dev->pending_head = TW_Q_START; + else + tw_dev->pending_head = tw_dev->pending_head + 1; + tw_dev->pending_request_count--; + } else + break; + } + /* If there are no more pending requests, we mask command interrupt */ + if (tw_dev->pending_request_count == 0) + tw_mask_command_interrupt(tw_dev); + } + + /* Handle response interrupt */ + if (do_response_interrupt) { + /* Drain the response queue from the board */ + while ((status_reg_value & TW_STATUS_RESPONSE_QUEUE_EMPTY) == 0) { + response_que.value = inl(response_que_addr); + request_id = response_que.u.response_id; + command_packet = + (TW_Command *)tw_dev->command_packet_virtual_address[request_id]; + if (command_packet->status != 0) { + printk(KERN_WARNING "3w-xxxx: tw_interrupt(): Bad response, " + "flags = 0x%x.\n", command_packet->flags); + } + if (tw_dev->state[request_id] != TW_S_POSTED) { + printk(KERN_WARNING "3w-xxxx: tw_interrupt(): Received a request " + "id (%d) (opcode = 0x%x) that wasn't posted.\n", + request_id, command_packet->byte0.opcode); + } + error = 0; + dprintk(KERN_NOTICE "3w-xxxx: tw_interrupt(): Response queue " + "request id: %d.\n", request_id); + /* Check for internal command */ + if (tw_dev->srb[request_id] == 0) { + dprintk(KERN_WARNING "3w-xxxx: tw_interrupt(): Found internally " + "posted command.\n"); + error = tw_aen_complete(tw_dev, request_id); + if (error) + printk(KERN_WARNING "3w-xxxx: tw_interrupt(): Error completing " + "aen.\n"); + status_reg_value = inl(status_reg_addr); + if (tw_check_bits(status_reg_value)) + printk(KERN_WARNING "3w-xxxx: tw_interrupt(): Unexpected bits.\n"); + } else { + switch (tw_dev->srb[request_id]->cmnd[0]) { + case READ_10: + dprintk(KERN_NOTICE "3w-xxxx: tw_interrupt(): caught READ_10\n"); + case READ_6: + dprintk(KERN_NOTICE "3w-xxxx: tw_interrupt(): caught READ_6\n"); + break; + case WRITE_10: + dprintk(KERN_NOTICE "3w-xxxx: tw_interrupt(): caught WRITE_10\n"); + case WRITE_6: + dprintk(KERN_NOTICE "3w-xxxx: tw_interrupt(): caught WRITE_6\n"); + break; + case INQUIRY: + dprintk(KERN_NOTICE "3w-xxxx: tw_interrupt(): caught INQUIRY\n"); + error = tw_scsiop_inquiry_complete(tw_dev, request_id); + break; + case READ_CAPACITY: + dprintk(KERN_NOTICE "3w-xxxx: tw_interrupt(): caught " + "READ_CAPACITY\n"); + error = tw_scsiop_read_capacity_complete(tw_dev, request_id); + break; + case TW_IOCTL: + dprintk(KERN_NOTICE "3w-xxxx: tw_interrupt(): caught TW_IOCTL\n"); + error = tw_ioctl_complete(tw_dev, request_id); + break; + default: + printk(KERN_WARNING "3w-xxxx: tw_interrupt(): Unknown scsi " + "opcode: 0x%x.\n", tw_dev->srb[request_id]->cmnd[0]); + tw_dev->srb[request_id]->result = (DID_BAD_TARGET << 16); + tw_dev->srb[request_id]->scsi_done(tw_dev->srb[request_id]); + } + if (error) { + /* Tell scsi layer there was an error */ + printk(KERN_WARNING "3w-xxxx: tw_interrupt(): Scsi Error.\n"); + tw_dev->srb[request_id]->result = (DID_ERROR << 16); + } else { + /* Tell scsi layer command was a success */ + tw_dev->srb[request_id]->result = (DID_OK << 16); + } + tw_dev->state[request_id] = TW_S_COMPLETED; + tw_state_request_finish(tw_dev, request_id); + tw_dev->posted_request_count--; + tw_dev->srb[request_id]->scsi_done(tw_dev->srb[request_id]); + status_reg_value = inl(status_reg_addr); + if (tw_check_bits(status_reg_value)) + printk(KERN_WARNING "3w-xxxx: tw_interrupt(): Unexpected bits.\n"); + } + } + } + spin_unlock_irqrestore(&tw_dev->tw_lock, flags2); + } + spin_unlock_irqrestore(&io_request_lock, flags); +} /* End tw_interrupt() */ + +/* This function handles ioctls from userspace to the driver */ +int tw_ioctl(TW_Device_Extension *tw_dev, int request_id) +{ + unsigned char opcode; + int bufflen; + TW_Param *param; + TW_Command *command_packet; + u32 param_value; + TW_Ioctl *ioctl = NULL; + int tw_aen_code; + + ioctl = (TW_Ioctl *)tw_dev->srb[request_id]->request_buffer; + if (ioctl == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_ioctl(): Request buffer NULL.\n"); + tw_dev->state[request_id] = TW_S_COMPLETED; + tw_state_request_finish(tw_dev, request_id); + tw_dev->srb[request_id]->result = (DID_OK << 16); + tw_dev->srb[request_id]->scsi_done(tw_dev->srb[request_id]); + return 0; + } + bufflen = tw_dev->srb[request_id]->request_bufflen; + + /* Initialize command packet */ + command_packet = + (TW_Command *)tw_dev->command_packet_virtual_address[request_id]; + if (command_packet == NULL) { + printk(KERN_WARNING "3w-xxxx: twioctl(): Bad command packet " + "virtual address.\n"); + tw_dev->state[request_id] = TW_S_COMPLETED; + tw_state_request_finish(tw_dev, request_id); + tw_dev->srb[request_id]->result = (DID_OK << 16); + tw_dev->srb[request_id]->scsi_done(tw_dev->srb[request_id]); + return 0; + } + memset(command_packet, 0, sizeof(TW_Sector)); + + /* Initialize param */ + if (tw_dev->alignment_virtual_address[request_id] == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_ioctl(): Bad alignment " + "virtual address.\n"); + tw_dev->state[request_id] = TW_S_COMPLETED; + tw_state_request_finish(tw_dev, request_id); + tw_dev->srb[request_id]->result = (DID_OK << 16); + tw_dev->srb[request_id]->scsi_done(tw_dev->srb[request_id]); + return 0; + } + param = (TW_Param *)tw_dev->alignment_virtual_address[request_id]; + memset(param, 0, sizeof(TW_Sector)); + + dprintk(KERN_NOTICE "opcode = %d table_id = %d parameter_id = %d " + "parameter_size_bytes = %d\n", ioctl->opcode, ioctl->table_id, + ioctl->parameter_id, ioctl->parameter_size_bytes); + opcode = ioctl->opcode; + + switch (opcode) { + case TW_OP_NOP: + dprintk(KERN_NOTICE "3w-xxxx: tw_ioctl(): caught TW_OP_NOP.\n"); + command_packet->byte0.opcode = TW_OP_NOP; + break; + case TW_OP_GET_PARAM: + dprintk(KERN_NOTICE "3w-xxxx: tw_ioctl(): caught TW_OP_GET_PARAM.\n"); + command_packet->byte0.opcode = TW_OP_GET_PARAM; + param->table_id = ioctl->table_id; + param->parameter_id = ioctl->parameter_id; + param->parameter_size_bytes = ioctl->parameter_size_bytes; + tw_dev->ioctl_size[request_id] = ioctl->parameter_size_bytes; + dprintk(KERN_NOTICE + "table_id = %d parameter_id = %d parameter_size_bytes %d\n", + param->table_id, param->parameter_id, param->parameter_size_bytes); + break; + case TW_OP_SET_PARAM: + dprintk(KERN_NOTICE "3w-xxxx: tw_ioctl(): caught TW_OP_SET_PARAM: " + "table_id = %d, parameter_id = %d, parameter_size_bytes = %d.\n", + ioctl->table_id, ioctl->parameter_id, ioctl->parameter_size_bytes); + command_packet->byte0.opcode = TW_OP_SET_PARAM; + param->table_id = ioctl->table_id; + param->parameter_id = ioctl->parameter_id; + param->parameter_size_bytes = ioctl->parameter_size_bytes; + memcpy(param->data, ioctl->data, ioctl->parameter_size_bytes); + break; + case TW_OP_AEN_LISTEN: + dprintk(KERN_NOTICE "3w-xxxx: tw_ioctl(): caught TW_OP_AEN_LISTEN.\n"); + if (tw_dev->aen_head == tw_dev->aen_tail) { + /* aen queue empty */ + dprintk(KERN_NOTICE "3w-xxxx: tw_ioctl(): Aen queue empty.\n"); + tw_aen_code = TW_AEN_QUEUE_EMPTY; + memcpy(tw_dev->srb[request_id]->request_buffer, + &tw_aen_code, ioctl->parameter_size_bytes); + } else { + /* Copy aen queue entry to request buffer */ + dprintk(KERN_NOTICE "3w-xxxx: tw_ioctl(): Returning aen 0x%x\n", + tw_dev->aen_queue[tw_dev->aen_head]); + tw_aen_code = tw_dev->aen_queue[tw_dev->aen_head]; + memcpy(tw_dev->srb[request_id]->request_buffer, + &tw_aen_code, ioctl->parameter_size_bytes); + if (tw_dev->aen_head == TW_Q_LENGTH - 1) + tw_dev->aen_head = TW_Q_START; + else + tw_dev->aen_head = tw_dev->aen_head + 1; + } + tw_dev->state[request_id] = TW_S_COMPLETED; + tw_state_request_finish(tw_dev, request_id); + tw_dev->srb[request_id]->result = (DID_OK << 16); + tw_dev->srb[request_id]->scsi_done(tw_dev->srb[request_id]); + return 0; + default: + printk(KERN_WARNING "3w-xxxx: Unknown ioctl 0x%x.\n", opcode); + tw_dev->state[request_id] = TW_S_COMPLETED; + tw_state_request_finish(tw_dev, request_id); + tw_dev->srb[request_id]->result = (DID_OK << 16); + tw_dev->srb[request_id]->scsi_done(tw_dev->srb[request_id]); + return 0; + } + + param_value = tw_dev->alignment_physical_address[request_id]; + if (param_value == 0) { + printk(KERN_WARNING "3w-xxxx: tw_ioctl(): Bad alignment physical " + "address.\n"); + tw_dev->state[request_id] = TW_S_COMPLETED; + tw_state_request_finish(tw_dev, request_id); + tw_dev->srb[request_id]->result = (DID_OK << 16); + tw_dev->srb[request_id]->scsi_done(tw_dev->srb[request_id]); + } + + command_packet->byte8.param.sgl[0].address = param_value; + command_packet->byte8.param.sgl[0].length = sizeof(TW_Sector); + + command_packet->byte0.sgl_offset = 2; + command_packet->size = 4; + command_packet->request_id = request_id; + command_packet->byte3.unit = 0; + command_packet->byte3.host_id = 0; + command_packet->status = 0; + command_packet->flags = 0; + command_packet->byte6.parameter_count = 1; + + /* Now try to post the command to the board */ + tw_post_command_packet(tw_dev, request_id); + + return 0; +} /* End tw_ioctl() */ + +/* This function is called by the isr to complete ioctl requests */ +int tw_ioctl_complete(TW_Device_Extension *tw_dev, int request_id) +{ + unsigned char *param_data; + unsigned char *buff; + TW_Param *param; + + dprintk(KERN_NOTICE "3w-xxxx: tw_ioctl_complete()\n"); + buff = tw_dev->srb[request_id]->request_buffer; + if (buff == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_ioctl_complete(): " + "Request buffer NULL.\n"); + return 1; + } + dprintk(KERN_NOTICE "3w-xxxx: tw_ioctl_complete(): Request_bufflen = %d\n", + tw_dev->srb[request_id]->request_bufflen); + memset(buff, 0, tw_dev->srb[request_id]->request_bufflen); + param = (TW_Param *)tw_dev->alignment_virtual_address[request_id]; + if (param == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_scsiop_read_capacity_complete(): " + "Bad alignment virtual address.\n"); + return 1; + } + param_data = &(param->data[0]); + + memcpy(buff, param_data, tw_dev->ioctl_size[request_id]); + + return 0; +} /* End tw_ioctl_complete() */ + +/* This function will mask the command interrupt */ +void tw_mask_command_interrupt(TW_Device_Extension *tw_dev) +{ + u32 control_reg_addr, control_reg_value; + + control_reg_addr = tw_dev->registers.control_reg_addr; + control_reg_value = TW_CONTROL_MASK_COMMAND_INTERRUPT; + outl(control_reg_value, control_reg_addr); +} /* End tw_mask_command_interrupt() */ + +/* This function will poll the status register for a flag */ +int tw_poll_status(TW_Device_Extension *tw_dev, u32 flag, int seconds) +{ + u32 status_reg_addr, status_reg_value; + struct timeval before, timeout; + + status_reg_addr = tw_dev->registers.status_reg_addr; + do_gettimeofday(&before); + status_reg_value = inl(status_reg_addr); + + while ((status_reg_value & flag) != flag) { + status_reg_value = inl(status_reg_addr); + do_gettimeofday(&timeout); + if (before.tv_sec + seconds < timeout.tv_sec) { + printk(KERN_WARNING "3w-xxxx: tw_poll_status(): Flag 0x%x not found.\n", + flag); + return 1; + } + mdelay(1); + } + return 0; +} /* End tw_poll_status() */ + +/* This function will attempt to post a command packet to the board */ +int tw_post_command_packet(TW_Device_Extension *tw_dev, int request_id) +{ + u32 status_reg_addr, status_reg_value; + u32 command_que_addr, command_que_value; + + dprintk(KERN_NOTICE "3w-xxxx: tw_post_command_packet()\n"); + command_que_addr = tw_dev->registers.command_que_addr; + command_que_value = tw_dev->command_packet_physical_address[request_id]; + status_reg_addr = tw_dev->registers.status_reg_addr; + status_reg_value = inl(status_reg_addr); + + if (tw_check_bits(status_reg_value)) + printk(KERN_WARNING "3w-xxxx: tw_post_command_packet(): Unexpected " + "bits.\n"); + + if ((status_reg_value & TW_STATUS_COMMAND_QUEUE_FULL) == 0) { + /* We successfully posted the command packet */ + outl(command_que_value, command_que_addr); + tw_dev->state[request_id] = TW_S_POSTED; + tw_dev->posted_request_count++; + if (tw_dev->posted_request_count > tw_dev->max_posted_request_count) + tw_dev->max_posted_request_count = tw_dev->posted_request_count; + } else { + /* Couldn't post the command packet, so we do it in the isr */ + if (tw_dev->state[request_id] != TW_S_PENDING) { + tw_dev->state[request_id] = TW_S_PENDING; + tw_dev->pending_request_count++; + if (tw_dev->pending_request_count > tw_dev->max_pending_request_count) + tw_dev->max_pending_request_count = tw_dev->pending_request_count; + tw_dev->pending_queue[tw_dev->pending_tail] = request_id; + if (tw_dev->pending_tail == TW_Q_LENGTH-1) + tw_dev->pending_tail = TW_Q_START; + else + tw_dev->pending_tail = tw_dev->pending_tail + 1; + } + tw_unmask_command_interrupt(tw_dev); + return 1; + } + return 0; +} /* End tw_post_command_packet() */ + +/* This function will reset a device extension */ +int tw_reset_device_extension(TW_Device_Extension *tw_dev) +{ + int imax = 0; + int i = 0; + Scsi_Cmnd *srb; + + dprintk(KERN_NOTICE "3w-xxxx: tw_reset_device_extension()\n"); + imax = TW_Q_LENGTH; + + if (tw_reset_sequence(tw_dev)) { + printk(KERN_WARNING "3w-xxxx: tw_reset_device_extension(): Reset " + "sequence failed for card %d.\n", tw_dev->host->host_no); + return 1; + } + + /* Abort all requests that are in progress */ + for (i=0;istate[i] != TW_S_FINISHED) && + (tw_dev->state[i] != TW_S_INITIAL) && + (tw_dev->state[i] != TW_S_COMPLETED)) { + srb = tw_dev->srb[i]; + srb->result = (DID_RESET << 16); + tw_dev->srb[i]->scsi_done(tw_dev->srb[i]); + } + } + + /* Reset queues and counts */ + for (i=0;ifree_queue[i] = i; + tw_dev->state[i] = TW_S_INITIAL; + } + tw_dev->free_head = TW_Q_START; + tw_dev->free_tail = TW_Q_LENGTH - 1; + tw_dev->posted_request_count = 0; + tw_dev->pending_request_count = 0; + tw_dev->pending_head = TW_Q_START; + tw_dev->pending_tail = TW_Q_START; + + return 0; +} /* End tw_reset_device_extension() */ + +/* This function will reset a controller */ +int tw_reset_sequence(TW_Device_Extension *tw_dev) +{ + int error = 0; + int tries = 0; + + /* Disable interrupts */ + tw_disable_interrupts(tw_dev); + + /* Reset the board */ + while (tries < TW_MAX_RESET_TRIES) { + tw_soft_reset(tw_dev); + + error = tw_aen_drain_queue(tw_dev); + if (error) { + printk(KERN_WARNING "3w-xxxx: tw_reset_sequence(): No attention " + "interrupt for card %d.\n", tw_dev->host->host_no); + tries++; + continue; + } + + /* Check for controller errors */ + if (tw_check_errors(tw_dev)) { + printk(KERN_WARNING "3w-xxxx: tw_reset_sequence(): Controller " + "errors found, soft resetting card %d.\n", tw_dev->host->host_no); + tries++; + continue; + } + + /* Empty the response queue again */ + error = tw_empty_response_que(tw_dev); + if (error) { + printk(KERN_WARNING "3w-xxxx: tw_reset_sequence(): Couldn't empty " + "response queue for card %d.\n", tw_dev->host->host_no); + tries++; + continue; + } + + /* Now the controller is in a good state */ + break; + } + + if (tries >= TW_MAX_RESET_TRIES) { + printk(KERN_WARNING "3w-xxxx: tw_reset_sequence(): Controller error or no " + "attention interrupt: giving up for card %d.\n", + tw_dev->host->host_no); + return 1; + } + + error = tw_initconnection(tw_dev); + if (error) { + printk(KERN_WARNING "3w-xxxx: tw_reset_sequence(): Couldn't " + "initconnection for card %d.\n", tw_dev->host->host_no); + return 1; + } + + /* Re-enable interrupts */ + tw_enable_interrupts(tw_dev); + + return 0; +} /* End tw_reset_sequence() */ + +/* This funciton returns unit geometry in cylinders/heads/sectors */ +int tw_scsi_biosparam(Disk *disk, kdev_t dev, int geom[]) +{ + int heads, sectors, cylinders; + TW_Device_Extension *tw_dev; + + dprintk(KERN_NOTICE "3w-xxxx: tw_scsi_biosparam()\n"); + tw_dev = (TW_Device_Extension *)disk->device->host->hostdata; + + heads = 64; + sectors = 32; + cylinders = disk->capacity / (heads * sectors); + + if (disk->capacity >= 0x200000) { + heads = 255; + sectors = 63; + cylinders = disk->capacity / (heads * sectors); + } + + dprintk(KERN_NOTICE "3w-xxxx: tw_scsi_biosparam(): heads = %d, " + "sectors = %d, cylinders = %d\n", heads, sectors, cylinders); + geom[0] = heads; + geom[1] = sectors; + geom[2] = cylinders; + + return 0; +} /* End tw_scsi_biosparam() */ + +/* This function will find and initialize any cards */ +int tw_scsi_detect(Scsi_Host_Template *tw_host) +{ + dprintk(KERN_NOTICE "3w-xxxx: tw_scsi_detect()\n"); + + /* Check if the kernel has PCI interface compiled in */ + if (!pci_present()) { + printk(KERN_WARNING "3w-xxxx: tw_scsi_detect(): No pci interface " + "present.\n"); + return 0; + } + + return(tw_findcards(tw_host)); +} /* End tw_scsi_detect() */ + +/* This is the new scsi eh abort function */ +int tw_scsi_eh_abort(Scsi_Cmnd *SCpnt) +{ + TW_Device_Extension *tw_dev=NULL; + int i = 0; + + dprintk(KERN_NOTICE "3w-xxxx: tw_scsi_eh_abort()\n"); + + if (!SCpnt) { + printk(KERN_WARNING "3w-xxxx: tw_scsi_eh_abort(): Invalid Scsi_Cmnd.\n"); + return (FAILED); + } + + tw_dev = (TW_Device_Extension *)SCpnt->host->hostdata; + if (tw_dev == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_scsi_eh_abort(): Invalid device " + "extension.\n"); + return (FAILED); + } + + spin_lock(&tw_dev->tw_lock); + tw_dev->num_aborts++; + + /* If the command hasn't been posted yet, we can do the abort */ + for (i=0;isrb[i] == SCpnt) { + if (tw_dev->state[i] == TW_S_STARTED) { + printk(KERN_WARNING "3w-xxxx: tw_scsi_eh_abort(): Abort succeeded for" + " started Scsi_Cmnd 0x%x\n", (u32)tw_dev->srb[i]); + tw_dev->state[i] = TW_S_COMPLETED; + tw_state_request_finish(tw_dev, i); + spin_unlock(&tw_dev->tw_lock); + return (SUCCESS); + } + if (tw_dev->state[i] == TW_S_PENDING) { + printk(KERN_WARNING "3w-xxxx: tw_scsi_eh_abort(): Abort succeeded for" + " pending Scsi_Cmnd 0x%x\n", (u32)tw_dev->srb[i]); + if (tw_dev->pending_head == TW_Q_LENGTH-1) + tw_dev->pending_head = TW_Q_START; + else + tw_dev->pending_head = tw_dev->pending_head + 1; + tw_dev->pending_request_count--; + tw_dev->state[i] = TW_S_COMPLETED; + tw_state_request_finish(tw_dev, i); + spin_unlock(&tw_dev->tw_lock); + return (SUCCESS); + } + } + } + + /* If the command has already been posted, we have to reset the card */ + printk(KERN_WARNING "3w-xxxx: tw_scsi_eh_abort(): Abort failed for " + "unknown Scsi_Cmnd 0x%x, resetting card %d.\n", (u32)SCpnt, + tw_dev->host->host_no); + + if (tw_reset_device_extension(tw_dev)) { + printk(KERN_WARNING "3w-xxxx: tw_scsi_eh_abort(): Reset failed for " + "card %d.\n", tw_dev->host->host_no); + spin_unlock(&tw_dev->tw_lock); + return (FAILED); + } + spin_unlock(&tw_dev->tw_lock); + + return (SUCCESS); +} /* End tw_scsi_eh_abort() */ + +/* This is the new scsi eh reset function */ +int tw_scsi_eh_reset(Scsi_Cmnd *SCpnt) +{ + TW_Device_Extension *tw_dev=NULL; + int flags = 0; + + dprintk(KERN_NOTICE "3w-xxxx: tw_scsi_eh_reset()\n"); + + if (!SCpnt) { + printk(KERN_WARNING "3w-xxxx: tw_scsi_eh_reset(): Invalid Scsi_Cmnd.\n"); + return (FAILED); + } + + tw_dev = (TW_Device_Extension *)SCpnt->host->hostdata; + if (tw_dev == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_scsi_eh_reset(): Invalid device " + "extension.\n"); + return (FAILED); + } + + spin_lock_irqsave(&tw_dev->tw_lock, flags); + tw_dev->num_resets++; + + /* Now reset the card and some of the device extension data */ + if (tw_reset_device_extension(tw_dev)) { + printk(KERN_WARNING "3w-xxxx: tw_scsi_eh_reset(): Reset failed for " + "card %d.\n", tw_dev->host->host_no); + spin_unlock_irqrestore(&tw_dev->tw_lock, flags); + return (FAILED); + } + printk(KERN_WARNING "3w-xxxx: tw_scsi_eh_reset(): Reset succeeded for " + "card %d.\n", tw_dev->host->host_no); + spin_unlock_irqrestore(&tw_dev->tw_lock, flags); + + return (SUCCESS); +} /* End tw_scsi_eh_reset() */ + +/* This function handles input and output from /proc/scsi/3w-xxxx/x */ +int tw_scsi_proc_info(char *buffer, char **start, off_t offset, int length, + int hostno, int inout) +{ + TW_Device_Extension *tw_dev = NULL; + TW_Info info; + int i; + int j; + + dprintk(KERN_NOTICE "3w-xxxx: tw_scsi_proc_info()\n"); + + /* Find the correct device extension */ + for (i=0;ihost->host_no == hostno) + tw_dev = tw_device_extension_list[i]; + if (tw_dev == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_scsi_proc_info(): Couldn't locate " + "device extension.\n"); + return (-EINVAL); + } + + info.buffer = buffer; + info.length = length; + info.offset = offset; + info.position = 0; + + if (inout) { + /* Write */ + if (strncmp(buffer, "debug", 5) == 0) { + printk(KERN_INFO "3w-xxxx: Posted commands:\n"); + for (j=0;jstate[j] == TW_S_POSTED) { + TW_Command *command= + (TW_Command *)tw_dev->command_packet_virtual_address[j]; + printk(KERN_INFO "3w-xxxx: Request_id: %d\n", j); + printk(KERN_INFO "Opcode: 0x%x\n", command->byte0.opcode); + printk(KERN_INFO "Block_count: 0x%x\n", + command->byte6.block_count); + printk(KERN_INFO "LBA: 0x%x\n", (u32)command->byte8.io.lba); + printk(KERN_INFO "Physical command packet addr: 0x%x\n", + tw_dev->command_packet_physical_address[j]); + printk(KERN_INFO "Scsi_Cmnd: 0x%x\n", (u32)tw_dev->srb[j]); + } + } + printk(KERN_INFO "3w-xxxx: Free_head: %3d\n", tw_dev->free_head); + printk(KERN_INFO "3w-xxxx: Free_tail: %3d\n", tw_dev->free_tail); + } + return length; + } else { + /* Read */ + if (start) + *start = buffer; + tw_copy_info(&info, "scsi%d: 3ware Storage Controller\n", hostno); + tw_copy_info(&info, "Driver version: %s\n", + tw_driver_version); + tw_copy_info(&info, "Current commands posted: %3d\n", + tw_dev->posted_request_count); + tw_copy_info(&info, "Max commands posted: %3d\n", + tw_dev->max_posted_request_count); + tw_copy_info(&info, "Current pending commands: %3d\n", + tw_dev->pending_request_count); + tw_copy_info(&info, "Max pending commands: %3d\n", + tw_dev->max_pending_request_count); + tw_copy_info(&info, "Last sgl length: %3d\n", + tw_dev->sgl_entries); + tw_copy_info(&info, "Max sgl length: %3d\n", + tw_dev->max_sgl_entries); + tw_copy_info(&info, "Last sector count: %3d\n", + tw_dev->sector_count); + tw_copy_info(&info, "Max sector count: %3d\n", + tw_dev->max_sector_count); + tw_copy_info(&info, "Resets: %3d\n", + tw_dev->num_resets); + tw_copy_info(&info, "Aborts: %3d\n", + tw_dev->num_aborts); + } + if (info.position > info.offset) + return (info.position - info.offset); + else + return 0; +} /* End tw_scsi_proc_info() */ + +/* This is the main scsi queue function to handle scsi opcodes */ +int tw_scsi_queue(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *)) +{ + unsigned char *command = SCpnt->cmnd; + int request_id = 0; + int error = 0; + int flags = 0; + TW_Device_Extension *tw_dev = (TW_Device_Extension *)SCpnt->host->hostdata; + + spin_lock_irqsave(&tw_dev->tw_lock, flags); + dprintk(KERN_NOTICE "3w-xxxx: tw_scsi_queue()\n"); + + /* Skip scsi command if it isn't for us */ + if ((tw_dev->is_unit_present[SCpnt->target] == FALSE) || (SCpnt->lun != 0)) { + SCpnt->result = (DID_BAD_TARGET << 16); + done(SCpnt); + spin_unlock_irqrestore(&tw_dev->tw_lock, flags); + return 0; + } + if (done == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_scsi_queue(): Invalid done function.\n"); + SCpnt->result = (DID_ERROR << 16); + done(SCpnt); + spin_unlock_irqrestore(&tw_dev->tw_lock, flags); + return 0; + } + if (tw_dev == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_scsi_queue(): Invalid device " + "extension.\n"); + SCpnt->result = (DID_ERROR << 16); + done(SCpnt); + spin_unlock_irqrestore(&tw_dev->tw_lock, flags); + return 0; + } + + /* Save done function into Scsi_Cmnd struct */ + SCpnt->scsi_done = done; + + /* Queue the command and get a request id */ + tw_state_request_start(tw_dev, &request_id); + + /* Save the scsi command for use by the ISR */ + tw_dev->srb[request_id] = SCpnt; + + switch (*command) { + case READ_10: + dprintk(KERN_NOTICE "3w-xxxx: tw_scsi_queue(): caught READ_10.\n"); + case READ_6: + dprintk(KERN_NOTICE "3w-xxxx: tw_scsi_queue(): caught READ_6.\n"); + case WRITE_10: + dprintk(KERN_NOTICE "3w-xxxx: tw_scsi_queue(): caught WRITE_10.\n"); + case WRITE_6: + dprintk(KERN_NOTICE "3w-xxxx: tw_scsi_queue(): caught WRITE_6.\n"); + error = tw_scsiop_read_write(tw_dev, request_id); + break; + case TEST_UNIT_READY: + dprintk(KERN_NOTICE "3w-xxxx: tw_scsi_queue(): caught TEST_UNIT_READY.\n"); + error = tw_scsiop_test_unit_ready(tw_dev, request_id); + break; + case INQUIRY: + dprintk(KERN_NOTICE "3w-xxxx: tw_scsi_queue(): caught INQUIRY.\n"); + error = tw_scsiop_inquiry(tw_dev, request_id); + break; + case READ_CAPACITY: + dprintk(KERN_NOTICE "3w-xxxx: tw_scsi_queue(): caught READ_CAPACITY.\n"); + error = tw_scsiop_read_capacity(tw_dev, request_id); + break; + case TW_IOCTL: + dprintk(KERN_NOTICE "3w-xxxx: tw_scsi_queue(): caught TW_SCSI_IOCTL.\n"); + error = tw_ioctl(tw_dev, request_id); + break; + default: + printk(KERN_NOTICE "3w-xxxx: tw_scsi_queue(): Unknown scsi opcode: " + "0x%x\n", *command); + tw_dev->state[request_id] = TW_S_COMPLETED; + tw_state_request_finish(tw_dev, request_id); + SCpnt->result = (DID_BAD_TARGET << 16); + done(SCpnt); + } + if (error) { + tw_dev->state[request_id] = TW_S_COMPLETED; + tw_state_request_finish(tw_dev, request_id); + SCpnt->result = (DID_ERROR << 16); + done(SCpnt); + } + spin_unlock_irqrestore(&tw_dev->tw_lock, flags); + + return 0; +} /* End tw_scsi_queue() */ + +/* This function will release the resources on an rmmod call */ +int tw_scsi_release(struct Scsi_Host *tw_host) +{ + TW_Device_Extension *tw_dev; + tw_dev = (TW_Device_Extension *)tw_host->hostdata; + + dprintk(KERN_NOTICE "3w-xxxx: tw_scsi_release()\n"); + + /* Free up the IO region */ + release_region((tw_dev->tw_pci_dev->base_address[0] & ~15), + TW_IO_ADDRESS_RANGE); + + /* Free up the IRQ */ + free_irq(tw_dev->tw_pci_dev->irq, tw_dev); + + /* Free up device extension resources */ + tw_free_device_extension(tw_dev); + + /* Tell kernel scsi-layer we are gone */ + scsi_unregister(tw_host); + + return 0; +} /* End tw_scsi_release() */ + +/* This function handles scsi inquiry commands */ +int tw_scsiop_inquiry(TW_Device_Extension *tw_dev, int request_id) +{ + TW_Param *param; + TW_Command *command_packet; + u32 command_que_value, command_que_addr; + u32 param_value; + + dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_inquiry()\n"); + + /* Initialize command packet */ + command_que_addr = tw_dev->registers.command_que_addr; + command_packet = + (TW_Command *)tw_dev->command_packet_virtual_address[request_id]; + if (command_packet == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_scsiop_inquiry(): Bad command packet " + "virtual address.\n"); + return 1; + } + memset(command_packet, 0, sizeof(TW_Sector)); + command_packet->byte0.opcode = TW_OP_GET_PARAM; + command_packet->byte0.sgl_offset = 2; + command_packet->size = 4; + command_packet->request_id = request_id; + command_packet->byte3.unit = 0; + command_packet->byte3.host_id = 0; + command_packet->status = 0; + command_packet->flags = 0; + command_packet->byte6.parameter_count = 1; + + /* Now setup the param */ + if (tw_dev->alignment_virtual_address[request_id] == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_scsiop_inquiry(): Bad alignment " + "virtual address.\n"); + return 1; + } + param = (TW_Param *)tw_dev->alignment_virtual_address[request_id]; + memset(param, 0, sizeof(TW_Sector)); + param->table_id = 3; /* unit summary table */ + param->parameter_id = 3; /* unitsstatus parameter */ + param->parameter_size_bytes = TW_MAX_UNITS; + param_value = tw_dev->alignment_physical_address[request_id]; + if (param_value == 0) { + printk(KERN_WARNING "3w-xxxx: tw_scsiop_inquiry(): Bad alignment " + "physical address.\n"); + return 1; + } + + command_packet->byte8.param.sgl[0].address = param_value; + command_packet->byte8.param.sgl[0].length = sizeof(TW_Sector); + command_que_value = tw_dev->command_packet_physical_address[request_id]; + if (command_que_value == 0) { + printk(KERN_WARNING "3w-xxxx: tw_scsiop_inquiry(): Bad command packet " + "physical address.\n"); + return 1; + } + + /* Now try to post the command packet */ + tw_post_command_packet(tw_dev, request_id); + + return 0; +} /* End tw_scsiop_inquiry() */ + +/* This function is called by the isr to complete an inquiry command */ +int tw_scsiop_inquiry_complete(TW_Device_Extension *tw_dev, int request_id) +{ + unsigned char *is_unit_present; + unsigned char *request_buffer; + int i; + TW_Param *param; + + dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_inquiry_complete()\n"); + + /* Fill request buffer */ + if (tw_dev->srb[request_id]->request_buffer == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_scsiop_inquiry_complete(): Request " + "buffer NULL.\n"); + return 1; + } + request_buffer = tw_dev->srb[request_id]->request_buffer; + memset(request_buffer, 0, tw_dev->srb[request_id]->request_bufflen); + request_buffer[0] = TYPE_DISK; /* Peripheral device type */ + request_buffer[1] = 0; /* Device type modifier */ + request_buffer[2] = 0; /* No ansi/iso compliance */ + request_buffer[4] = 31; /* Additional length */ + memcpy(&request_buffer[8], "3ware ", 8); /* Vendor ID */ + memcpy(&request_buffer[16], "3w-xxxx ", 16); /* Product ID */ + memcpy(&request_buffer[32], tw_driver_version, 3); + + param = (TW_Param *)tw_dev->alignment_virtual_address[request_id]; + if (param == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_scsiop_inquiry_complete(): " + "Bad alignment virtual address.\n"); + return 1; + } + is_unit_present = &(param->data[0]); + + for (i=0 ; iis_unit_present[i] = FALSE; + else { + tw_dev->is_unit_present[i] = TRUE; + dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_inquiry_complete: Unit " + "%d found.\n", i); + } + } + + return 0; +} /* End tw_scsiop_inquiry_complete() */ + +/* This function handles scsi read_capacity commands */ +int tw_scsiop_read_capacity(TW_Device_Extension *tw_dev, int request_id) +{ + TW_Param *param; + TW_Command *command_packet; + u32 command_que_addr, command_que_value; + u32 param_value; + + dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_read_capacity()\n"); + + /* Initialize command packet */ + command_que_addr = tw_dev->registers.command_que_addr; + command_packet = + (TW_Command *)tw_dev->command_packet_virtual_address[request_id]; + if (command_packet == NULL) { + dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_read_capacity(): Bad command " + "packet virtual address.\n"); + return 1; + } + memset(command_packet, 0, sizeof(TW_Sector)); + command_packet->byte0.opcode = TW_OP_GET_PARAM; + command_packet->byte0.sgl_offset = 2; + command_packet->size = 4; + command_packet->request_id = request_id; + command_packet->byte3.unit = tw_dev->srb[request_id]->target; + command_packet->byte3.host_id = 0; + command_packet->status = 0; + command_packet->flags = 0; + command_packet->byte6.block_count = 1; + + /* Now setup the param */ + if (tw_dev->alignment_virtual_address[request_id] == NULL) { + dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_read_capacity(): " + "Bad alignment virtual address.\n"); + return 1; + } + param = (TW_Param *)tw_dev->alignment_virtual_address[request_id]; + memset(param, 0, sizeof(TW_Sector)); + param->table_id = TW_UNIT_INFORMATION_TABLE_BASE + + tw_dev->srb[request_id]->target; + param->parameter_id = 4; /* unitcapacity parameter */ + param->parameter_size_bytes = 4; + param_value = tw_dev->alignment_physical_address[request_id]; + if (param_value == 0) { + dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_read_capacity(): Bad alignment " + "physical address.\n"); + return 1; + } + + command_packet->byte8.param.sgl[0].address = param_value; + command_packet->byte8.param.sgl[0].length = sizeof(TW_Sector); + command_que_value = tw_dev->command_packet_physical_address[request_id]; + if (command_que_value == 0) { + dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_read_capacity(): " + "Bad command packet physical address.\n"); + return 1; + } + + /* Now try to post the command to the board */ + tw_post_command_packet(tw_dev, request_id); + + return 0; +} /* End tw_scsiop_read_capacity() */ + +/* This function is called by the isr to complete a readcapacity command */ +int tw_scsiop_read_capacity_complete(TW_Device_Extension *tw_dev, + int request_id) +{ + unsigned char *param_data; + u32 capacity; + char *buff; + TW_Param *param; + + dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_read_capacity_complete()\n"); + + buff = tw_dev->srb[request_id]->request_buffer; + if (buff == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_scsiop_read_capacity_complete(): " + "Request buffer NULL.\n"); + return 1; + } + memset(buff, 0, tw_dev->srb[request_id]->request_bufflen); + param = (TW_Param *)tw_dev->alignment_virtual_address[request_id]; + if (param == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_scsiop_read_capacity_complete(): " + "Bad alignment virtual address.\n"); + return 1; + } + param_data = &(param->data[0]); + + capacity = (param_data[3] << 24) | (param_data[2] << 16) | + (param_data[1] << 8) | param_data[0]; + + dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_read_capacity_complete(): " + "Capacity = 0x%x.\n", capacity); + + /* Number of LBA's */ + buff[0] = (capacity >> 24); + buff[1] = (capacity >> 16) & 0xff; + buff[2] = (capacity >> 8) & 0xff; + buff[3] = capacity & 0xff; + + /* Block size in bytes (512) */ + buff[4] = (TW_BLOCK_SIZE >> 24); + buff[5] = (TW_BLOCK_SIZE >> 16) & 0xff; + buff[6] = (TW_BLOCK_SIZE >> 8) & 0xff; + buff[7] = TW_BLOCK_SIZE & 0xff; + + return 0; +} /* End tw_scsiop_read_capacity_complete() */ + +/* This function handles scsi read or write commands */ +int tw_scsiop_read_write(TW_Device_Extension *tw_dev, int request_id) +{ + TW_Command *command_packet; + u32 command_que_addr, command_que_value = 0; + u32 lba = 0x0, num_sectors = 0x0; + int i; + Scsi_Cmnd *srb; + struct scatterlist *sglist; + + dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_read_write()\n"); + + if (tw_dev->srb[request_id]->request_buffer == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_scsiop_read_write(): Request buffer " + "NULL.\n"); + return 1; + } + sglist = (struct scatterlist *)tw_dev->srb[request_id]->request_buffer; + srb = tw_dev->srb[request_id]; + + /* Initialize command packet */ + command_que_addr = tw_dev->registers.command_que_addr; + command_packet = + (TW_Command *)tw_dev->command_packet_virtual_address[request_id]; + if (command_packet == NULL) { + dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_read_write(): Bad command " + "packet virtual address.\n"); + return 1; + } + + if (srb->cmnd[0] == READ_6 || srb->cmnd[0] == READ_10) + command_packet->byte0.opcode = TW_OP_READ; + else + command_packet->byte0.opcode = TW_OP_WRITE; + + command_packet->byte0.sgl_offset = 3; + command_packet->size = 5; + command_packet->request_id = request_id; + command_packet->byte3.unit = srb->target; + command_packet->byte3.host_id = 0; + command_packet->status = 0; + command_packet->flags = 0; + + if ((srb->cmnd[0] == WRITE_6) || (srb->cmnd[0] == WRITE_10)) { + if ((srb->cmnd[1] & 0x8) || (srb->cmnd[1] & 0x10)) + command_packet->flags = 1; + } + + if (srb->cmnd[0] == READ_6 || srb->cmnd[0] == WRITE_6) { + lba = ((u32)srb->cmnd[1] << 16) | ((u32)srb->cmnd[2] << 8) | + (u32)srb->cmnd[3]; + num_sectors = (u32)srb->cmnd[4]; + } else { + lba = ((u32)srb->cmnd[2] << 24) | ((u32)srb->cmnd[3] << 16) | + ((u32)srb->cmnd[4] << 8) | (u32)srb->cmnd[5]; + num_sectors = (u32)srb->cmnd[8] | ((u32)srb->cmnd[7] << 8); + } + + /* Update sector statistic */ + tw_dev->sector_count = num_sectors; + if (tw_dev->sector_count > tw_dev->max_sector_count) + tw_dev->max_sector_count = tw_dev->sector_count; + + dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_read_write(): lba = 0x%x " + "num_sectors = 0x%x\n", lba, num_sectors); + command_packet->byte8.io.lba = lba; + command_packet->byte6.block_count = num_sectors; + + /* Do this if there are no sg list entries */ + if (tw_dev->srb[request_id]->use_sg == 0) { + dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_read_write(): SG = 0\n"); + command_packet->byte8.io.sgl[0].address = + virt_to_bus(tw_dev->srb[request_id]->request_buffer); + command_packet->byte8.io.sgl[0].length = + tw_dev->srb[request_id]->request_bufflen; + } + + /* Do this if we have multiple sg list entries */ + if (tw_dev->srb[request_id]->use_sg > 0) { + for (i=0;isrb[request_id]->use_sg; i++) { + command_packet->byte8.io.sgl[i].address = virt_to_bus(sglist[i].address); + command_packet->byte8.io.sgl[i].length = sglist[i].length; + command_packet->size+=2; + } + if (tw_dev->srb[request_id]->use_sg > 1) + command_packet->size-=2; + } + + /* Update SG statistics */ + tw_dev->sgl_entries = tw_dev->srb[request_id]->use_sg; + if (tw_dev->sgl_entries > tw_dev->max_sgl_entries) + tw_dev->max_sgl_entries = tw_dev->sgl_entries; + + command_que_value = tw_dev->command_packet_physical_address[request_id]; + if (command_que_value == 0) { + dprintk(KERN_WARNING "3w-xxxx: tw_scsiop_read_write(): Bad command " + "packet physical address.\n"); + return 1; + } + + /* Now try to post the command to the board */ + tw_post_command_packet(tw_dev, request_id); + + return 0; +} /* End tw_scsiop_read_write() */ + +/* This function will handle test unit ready scsi command */ +int tw_scsiop_test_unit_ready(TW_Device_Extension *tw_dev, int request_id) +{ + dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_test_unit_ready()\n"); + + /* Tell the scsi layer were done */ + tw_dev->state[request_id] = TW_S_COMPLETED; + tw_state_request_finish(tw_dev, request_id); + tw_dev->srb[request_id]->result = (DID_OK << 16); + tw_dev->srb[request_id]->scsi_done(tw_dev->srb[request_id]); + + return 0; +} /* End tw_scsiop_test_unit_ready() */ + +/* This function will setup the interrupt handler */ +int tw_setup_irq(TW_Device_Extension *tw_dev) +{ + char *device = TW_DEVICE_NAME; + int error; + + dprintk(KERN_NOTICE "3w-xxxx: tw_setup_irq()\n"); + error = request_irq(tw_dev->tw_pci_dev->irq, tw_interrupt, + SA_SHIRQ, device, tw_dev); + if (error < 0) { + printk(KERN_WARNING "3w-xxxx: tw_setup_irq(): Error requesting IRQ: %d " + "for card %d.\n", tw_dev->tw_pci_dev->irq, tw_dev->host->host_no); + return 1; + } + return 0; +} /* End tw_setup_irq() */ + +/* This function will soft reset the controller */ +void tw_soft_reset(TW_Device_Extension *tw_dev) +{ + u32 control_reg_addr, control_reg_value; + + control_reg_addr = tw_dev->registers.control_reg_addr; + control_reg_value = ( TW_CONTROL_ISSUE_SOFT_RESET | + TW_CONTROL_CLEAR_HOST_INTERRUPT | + TW_CONTROL_CLEAR_ATTENTION_INTERRUPT | + TW_CONTROL_MASK_COMMAND_INTERRUPT | + TW_CONTROL_MASK_RESPONSE_INTERRUPT | + TW_CONTROL_CLEAR_ERROR_STATUS | + TW_CONTROL_DISABLE_INTERRUPTS); + outl(control_reg_value, control_reg_addr); +} /* End tw_soft_reset() */ + +/* This function will free a request_id */ +int tw_state_request_finish(TW_Device_Extension *tw_dev, + int request_id) +{ + dprintk(KERN_NOTICE "3w-xxxx: tw_state_request_finish()\n"); + + do { + if (tw_dev->free_tail == TW_Q_LENGTH-1) + tw_dev->free_tail = TW_Q_START; + else + tw_dev->free_tail = tw_dev->free_tail + 1; + } + while ((tw_dev->state[tw_dev->free_queue[tw_dev->free_tail]] != + TW_S_COMPLETED)); + + tw_dev->free_queue[tw_dev->free_tail] = request_id; + + tw_dev->state[request_id] = TW_S_FINISHED; + dprintk(KERN_NOTICE "3w-xxxx: tw_state_request_finish(): Freeing " + "request_id %d\n", request_id); + + return 0; +} /* End tw_state_request_finish() */ + +/* This function will assign an available request_id */ +int tw_state_request_start(TW_Device_Extension *tw_dev, int *request_id) +{ + int id = 0; + + dprintk(KERN_NOTICE "3w-xxxx: tw_state_request_start()\n"); + + /* Obtain next free request_id */ + do { + if (tw_dev->free_head == TW_Q_LENGTH - 1) + tw_dev->free_head = TW_Q_START; + else + tw_dev->free_head = tw_dev->free_head + 1; + } + while ((tw_dev->state[tw_dev->free_queue[tw_dev->free_head]] == + TW_S_STARTED) || + (tw_dev->state[tw_dev->free_queue[tw_dev->free_head]] == + TW_S_POSTED) || + (tw_dev->state[tw_dev->free_queue[tw_dev->free_head]] == + TW_S_PENDING) || + (tw_dev->state[tw_dev->free_queue[tw_dev->free_head]] == + TW_S_COMPLETED)); + + id = tw_dev->free_queue[tw_dev->free_head]; + + if (tw_dev->free_head == TW_Q_LENGTH - 1) + tw_dev->free_head = TW_Q_START; + else + tw_dev->free_head = tw_dev->free_head + 1; + + dprintk(KERN_NOTICE "3w-xxxx: tw_state_request_start(): id = %d.\n", id); + *request_id = id; + tw_dev->state[id] = TW_S_STARTED; + + return 0; +} /* End tw_state_request_start() */ + +/* This function will unmask the command interrupt on the controller */ +void tw_unmask_command_interrupt(TW_Device_Extension *tw_dev) +{ + u32 control_reg_addr, control_reg_value; + + control_reg_addr = tw_dev->registers.control_reg_addr; + control_reg_value = TW_CONTROL_UNMASK_COMMAND_INTERRUPT; + outl(control_reg_value, control_reg_addr); +} /* End tw_unmask_command_interrupt() */ + +/* Now get things going */ +#ifdef MODULE +Scsi_Host_Template driver_template = TWXXXX; +#include "../scsi/scsi_module.c" +#endif Index: oldkernel/linux/drivers/block/3w-xxxx.h diff -u /dev/null linux/drivers/block/3w-xxxx.h:1.1 --- /dev/null Mon Jul 31 21:15:04 2000 +++ linux/drivers/block/3w-xxxx.h Fri Jul 7 16:18:17 2000 @@ -0,0 +1,374 @@ +/* + 3w-xxxx.h -- 3ware Storage Controller device driver for Linux. + + Written By: Adam Radford + Copyright (C) 1999 3ware Inc. + + 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 of the License. + + 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. + + NO WARRANTY + THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT + LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, + MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is + solely responsible for determining the appropriateness of using and + distributing the Program and assumes all risks associated with its + exercise of rights under this Agreement, including but not limited to + the risks and costs of program errors, damage to or loss of data, + programs or equipment, and unavailability or interruption of operations. + + DISCLAIMER OF LIABILITY + NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), 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 OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED + HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES + + 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 + + Bugs/Comments/Suggestions should be mailed to: + linux@3ware.com + + For more information, goto: + http://www.3ware.com +*/ + +/* Control register bit definitions */ +#define TW_CONTROL_CLEAR_HOST_INTERRUPT 0x00080000 +#define TW_CONTROL_CLEAR_ATTENTION_INTERRUPT 0x00040000 +#define TW_CONTROL_MASK_COMMAND_INTERRUPT 0x00020000 +#define TW_CONTROL_MASK_RESPONSE_INTERRUPT 0x00010000 +#define TW_CONTROL_UNMASK_COMMAND_INTERRUPT 0x00008000 +#define TW_CONTROL_UNMASK_RESPONSE_INTERRUPT 0x00004000 +#define TW_CONTROL_CLEAR_ERROR_STATUS 0x00000200 +#define TW_CONTROL_ISSUE_SOFT_RESET 0x00000100 +#define TW_CONTROL_ENABLE_INTERRUPTS 0x00000080 +#define TW_CONTROL_DISABLE_INTERRUPTS 0x00000040 +#define TW_CONTROL_ISSUE_HOST_INTERRUPT 0x00000020 + +/* Status register bit definitions */ +#define TW_STATUS_MAJOR_VERSION_MASK 0xF0000000 +#define TW_STATUS_MINOR_VERSION_MASK 0x0F000000 +#define TW_STATUS_PCI_PARITY_ERROR 0x00800000 +#define TW_STATUS_QUEUE_ERROR 0x00400000 +#define TW_STATUS_MICROCONTROLLER_ERROR 0x00200000 +#define TW_STATUS_PCI_ABORT 0x00100000 +#define TW_STATUS_HOST_INTERRUPT 0x00080000 +#define TW_STATUS_ATTENTION_INTERRUPT 0x00040000 +#define TW_STATUS_COMMAND_INTERRUPT 0x00020000 +#define TW_STATUS_RESPONSE_INTERRUPT 0x00010000 +#define TW_STATUS_COMMAND_QUEUE_FULL 0x00008000 +#define TW_STATUS_RESPONSE_QUEUE_EMPTY 0x00004000 +#define TW_STATUS_MICROCONTROLLER_READY 0x00002000 +#define TW_STATUS_COMMAND_QUEUE_EMPTY 0x00001000 +#define TW_STATUS_ALL_INTERRUPTS 0x000F0000 +#define TW_STATUS_CLEARABLE_BITS 0x00D00000 +#define TW_STATUS_EXPECTED_BITS 0x00002000 +#define TW_STATUS_UNEXPECTED_BITS 0x00F80000 + +/* RESPONSE QUEUE BIT DEFINITIONS */ +#define TW_RESPONSE_ID_MASK 0x00000FF0 + +/* PCI related defines */ +#define TW_IO_ADDRESS_RANGE 0xD +#define TW_DEVICE_NAME "3ware Storage Controller" +#define TW_VENDOR_ID (0x13C1) /* 3ware */ +#define TW_DEVICE_ID (0x1000) /* Storage Controller */ + +/* Command packet opcodes */ +#define TW_OP_NOP 0x0 +#define TW_OP_INIT_CONNECTION 0x1 +#define TW_OP_READ 0x2 +#define TW_OP_WRITE 0x3 +#define TW_OP_VERIFY 0x4 +#define TW_OP_GET_PARAM 0x12 +#define TW_OP_SET_PARAM 0x13 +#define TW_OP_SECTOR_INFO 0x1a +#define TW_OP_AEN_LISTEN 0x1c + +/* Asynchronous Event Notification (AEN) Codes */ +#define TW_AEN_QUEUE_EMPTY 0x0000 +#define TW_AEN_SOFT_RESET 0x0001 +#define TW_AEN_DEGRADED_MIRROR 0x0002 +#define TW_AEN_CONTROLLER_ERROR 0x0003 +#define TW_AEN_REBUILD_FAIL 0x0004 +#define TW_AEN_REBUILD_DONE 0x0005 +#define TW_AEN_QUEUE_FULL 0x00ff +#define TW_AEN_TABLE_UNDEFINED 0x15 + +/* Misc defines */ +#define TW_ALIGNMENT 0x200 /* 16 D-WORDS */ +#define TW_MAX_UNITS 16 +#define TW_COMMAND_ALIGNMENT_MASK 0x1ff +#define TW_INIT_MESSAGE_CREDITS 0x100 +#define TW_INIT_COMMAND_PACKET_SIZE 0x3 +#define TW_POLL_MAX_RETRIES 10000 +#define TW_MAX_SGL_LENGTH 62 +#define TW_Q_LENGTH 256 +#define TW_Q_START 0 +#define TW_MAX_SLOT 32 +#define TW_MAX_PCI_BUSES 255 +#define TW_MAX_RESET_TRIES 3 +#define TW_UNIT_INFORMATION_TABLE_BASE 0x300 +#define TW_MAX_CMDS_PER_LUN (TW_Q_LENGTH-2)/TW_MAX_UNITS +#define TW_BLOCK_SIZE 0x200 /* 512-byte blocks */ +#define TW_IOCTL 0x80 +#define TW_MAX_AEN_TRIES 100 + +#ifndef MAJOR_NR +#define MAJOR_NR 8 /* SCSI */ +#endif + +/* Macros */ +#define TW_STATUS_ERRORS(x) \ +(((x & TW_STATUS_PCI_ABORT) || \ +(x & TW_STATUS_PCI_PARITY_ERROR) || \ +(x & TW_STATUS_QUEUE_ERROR) || \ +(x & TW_STATUS_MICROCONTROLLER_ERROR)) && \ +(x & TW_STATUS_MICROCONTROLLER_READY)) + +#ifdef TW_DEBUG +#define dprintk(msg...) printk(msg) +#else +#define dprintk(msg...) do { } while(0); +#endif + +extern struct proc_dir_entry tw_scsi_proc_entry; + +/* Scatter Gather List Entry */ +typedef struct TAG_TW_SG_Entry +{ + unsigned long address; + unsigned long length; +} TW_SG_Entry; + +typedef unsigned char TW_Sector[512]; + +/* Command Packet */ +typedef struct TW_Command +{ + /* First DWORD */ + struct { + unsigned char opcode:5; + unsigned char sgl_offset:3; + } byte0; + unsigned char size; + unsigned char request_id; + struct { + unsigned char unit:4; + unsigned char host_id:4; + } byte3; + /* Second DWORD */ + unsigned char status; + unsigned char flags; + union { + unsigned short block_count; + unsigned short parameter_count; + unsigned short message_credits; + } byte6; + union { + struct { + unsigned long lba; + TW_SG_Entry sgl[TW_MAX_SGL_LENGTH]; + unsigned long padding; /* pad to 512 bytes */ + } io; + struct { + TW_SG_Entry sgl[TW_MAX_SGL_LENGTH]; + unsigned long padding[2]; + } param; + struct { + unsigned long response_queue_pointer; + unsigned long padding[125]; + } init_connection; + struct { + char version[504]; + } ioctl_miniport_version; + } byte8; +} TW_Command; + +typedef struct TAG_TW_Ioctl +{ + int buffer; + unsigned char opcode; + unsigned short table_id; + unsigned char parameter_id; + unsigned char parameter_size_bytes; + unsigned char data[1]; +} TW_Ioctl; + +/* GetParam descriptor */ +typedef struct +{ + unsigned short table_id; + unsigned char parameter_id; + unsigned char parameter_size_bytes; + unsigned char data[1]; +} TW_Param, *PTW_Param; + +/* Response queue */ +typedef union TAG_TW_Response_Queue +{ + struct + { + u32 undefined_1: 4; + u32 response_id: 8; + u32 undefined_2: 20; + } u; + u32 value; +} TW_Response_Queue; + +typedef struct TAG_TW_Registers +{ + u32 base_addr; + u32 control_reg_addr; + u32 status_reg_addr; + u32 command_que_addr; + u32 response_que_addr; +} TW_Registers; + +typedef struct TAG_TW_Info +{ + char *buffer; + int length; + int offset; + int position; +} TW_Info; + +typedef enum TAG_TW_Cmd_State +{ + TW_S_INITIAL, /* Initial state */ + TW_S_STARTED, /* Id in use */ + TW_S_POSTED, /* Posted to the controller */ + TW_S_PENDING, /* Waiting to be posted in isr */ + TW_S_COMPLETED, /* Completed by isr */ + TW_S_FINISHED, /* I/O completely done */ +} TW_Cmd_State; + +typedef struct TAG_TW_Device_Extension +{ + TW_Registers registers; + u32 *alignment_virtual_address[TW_Q_LENGTH]; + u32 alignment_physical_address[TW_Q_LENGTH]; + int is_unit_present[TW_MAX_UNITS]; + int num_units; + u32 *command_packet_virtual_address[TW_Q_LENGTH]; + u32 command_packet_physical_address[TW_Q_LENGTH]; + struct pci_dev *tw_pci_dev; + Scsi_Cmnd *srb[TW_Q_LENGTH]; + unsigned char free_queue[TW_Q_LENGTH]; + unsigned char free_head; + unsigned char free_tail; + unsigned char pending_queue[TW_Q_LENGTH]; + unsigned char pending_head; + unsigned char pending_tail; + TW_Cmd_State state[TW_Q_LENGTH]; + u32 posted_request_count; + u32 max_posted_request_count; + u32 request_count_marked_pending; + u32 pending_request_count; + u32 max_pending_request_count; + u32 max_sgl_entries; + u32 sgl_entries; + u32 num_aborts; + u32 num_resets; + u32 sector_count; + u32 max_sector_count; + struct Scsi_Host *host; + spinlock_t tw_lock; + unsigned char ioctl_size[TW_Q_LENGTH]; + unsigned short aen_queue[TW_Q_LENGTH]; + unsigned char aen_head; + unsigned char aen_tail; +} TW_Device_Extension; + +/* Function prototypes */ +int tw_aen_complete(TW_Device_Extension *tw_dev, int request_id); +int tw_aen_drain_queue(TW_Device_Extension *tw_dev); +int tw_aen_read_queue(TW_Device_Extension *tw_dev, int request_id); +int tw_allocate_memory(TW_Device_Extension *tw_dev, int request_id, + int size, int which); +int tw_check_bits(u32 status_reg_value); +int tw_check_errors(TW_Device_Extension *tw_dev); +void tw_clear_attention_interrupt(TW_Device_Extension *tw_dev); +void tw_clear_host_interrupt(TW_Device_Extension *tw_dev); +static int tw_copy_info(TW_Info *info, char *fmt, ...); +static void tw_copy_mem_info(TW_Info *info, char *data, int len); +void tw_disable_interrupts(TW_Device_Extension *tw_dev); +int tw_empty_response_que(TW_Device_Extension *tw_dev); +void tw_enable_interrupts(TW_Device_Extension *tw_dev); +int tw_findcards(Scsi_Host_Template *tw_host); +void tw_free_device_extension(TW_Device_Extension *tw_dev); +int tw_initconnection(TW_Device_Extension *tw_dev); +int tw_initialize_device_extension(TW_Device_Extension *tw_dev); +int tw_initialize_units(TW_Device_Extension *tw_dev); +static void tw_interrupt(int irq, void *dev_instance, struct pt_regs *regs); +int tw_ioctl(TW_Device_Extension *tw_dev, int request_id); +int tw_ioctl_complete(TW_Device_Extension *tw_dev, int request_id); +void tw_mask_command_interrupt(TW_Device_Extension *tw_dev); +int tw_poll_status(TW_Device_Extension *tw_dev, u32 flag, int seconds); +int tw_post_command_packet(TW_Device_Extension *tw_dev, int request_id); +int tw_reset_device_extension(TW_Device_Extension *tw_dev); +int tw_reset_sequence(TW_Device_Extension *tw_dev); +int tw_scsi_biosparam(Disk *disk, kdev_t dev, int geom[]); +int tw_scsi_detect(Scsi_Host_Template *tw_host); +int tw_scsi_eh_abort(Scsi_Cmnd *SCpnt); +int tw_scsi_eh_reset(Scsi_Cmnd *SCpnt); +int tw_scsi_proc_info(char *buffer, char **start, off_t offset, int length, + int inode, int inout); +int tw_scsi_queue(Scsi_Cmnd *cmd, void (*done) (Scsi_Cmnd *)); +int tw_scsi_release(struct Scsi_Host *tw_host); +int tw_scsiop_inquiry(TW_Device_Extension *tw_dev, int request_id); +int tw_scsiop_inquiry_complete(TW_Device_Extension *tw_dev, int request_id); +int tw_scsiop_read_capacity(TW_Device_Extension *tw_dev, int request_id); +int tw_scsiop_read_capacity_complete(TW_Device_Extension *tw_dev, + int request_id); +int tw_scsiop_read_write(TW_Device_Extension *tw_dev, int request_id); +int tw_scsiop_test_unit_ready(TW_Device_Extension *tw_dev, int request_id); +int tw_setup_irq(TW_Device_Extension *tw_dev); +void tw_soft_reset(TW_Device_Extension *tw_dev); +int tw_state_request_finish(TW_Device_Extension *tw_dev,int request_id); +int tw_state_request_start(TW_Device_Extension *tw_dev, int *request_id); +void tw_unmask_command_interrupt(TW_Device_Extension *tw_dev); + +/* Scsi_Host_Template Initializer */ +#define TWXXXX { \ + next : NULL, \ + module : NULL, \ + proc_dir : &tw_scsi_proc_entry, \ + proc_info : tw_scsi_proc_info, \ + name : "3ware Storage Controller", \ + detect : tw_scsi_detect, \ + release : tw_scsi_release, \ + info : NULL, \ + ioctl : NULL, \ + command : NULL, \ + queuecommand : tw_scsi_queue, \ + eh_strategy_handler : NULL, \ + eh_abort_handler : tw_scsi_eh_abort, \ + eh_device_reset_handler : NULL, \ + eh_bus_reset_handler : NULL, \ + eh_host_reset_handler : tw_scsi_eh_reset,\ + abort : NULL, \ + reset : NULL, \ + slave_attach : NULL, \ + bios_param : tw_scsi_biosparam, \ + can_queue : TW_Q_LENGTH, \ + this_id: -1, \ + sg_tablesize : TW_MAX_SGL_LENGTH, \ + cmd_per_lun: TW_MAX_CMDS_PER_LUN, \ + present : 0, \ + unchecked_isa_dma : 0, \ + use_clustering : ENABLE_CLUSTERING, \ + use_new_eh_code : 1 \ + } Index: oldkernel/linux/drivers/block/Config.in diff -u linux/drivers/block/Config.in:1.2 linux/drivers/block/Config.in:1.3 --- linux/drivers/block/Config.in:1.2 Thu Jun 1 14:51:28 2000 +++ linux/drivers/block/Config.in Fri Jul 7 15:36:42 2000 @@ -119,6 +119,7 @@ tristate 'XT hard disk support' CONFIG_BLK_DEV_XD if [ "$CONFIG_PCI" = "y" ]; then tristate 'Mylex DAC960/DAC1100 PCI RAID Controller support' CONFIG_BLK_DEV_DAC960 + tristate '3ware Storage Controller support' CONFIG_BLK_DEV_3WARE fi # PARIDE doesn't need PARPORT, but if PARPORT is configured as a module, Index: oldkernel/linux/drivers/block/DAC960.c diff -u linux/drivers/block/DAC960.c:1.2 linux/drivers/block/DAC960.c:1.3 --- linux/drivers/block/DAC960.c:1.2 Wed May 31 14:57:57 2000 +++ linux/drivers/block/DAC960.c Fri Jul 7 15:36:42 2000 @@ -1,8 +1,8 @@ /* - Linux Driver for Mylex DAC960 and DAC1100 PCI RAID Controllers + Linux Driver for Mylex DAC960/AcceleRAID/eXtremeRAID PCI RAID Controllers - Copyright 1998-1999 by Leonard N. Zubkoff + Copyright 1998-2000 by Leonard N. Zubkoff This program is free software; you may redistribute and/or modify it under the terms of the GNU General Public License Version 2 as published by the @@ -19,8 +19,8 @@ */ -#define DAC960_DriverVersion "2.2.5" -#define DAC960_DriverDate "23 January 2000" +#define DAC960_DriverVersion "2.2.6" +#define DAC960_DriverDate "31 May 2000" #include @@ -55,7 +55,7 @@ /* - DAC960_ActiveControllerCount is the number of Active DAC960 Controllers + DAC960_ActiveControllerCount is the number of active DAC960 Controllers detected. */ @@ -130,7 +130,7 @@ */ static boolean DAC960_Failure(DAC960_Controller_T *Controller, - char *ErrorMessage) + unsigned char *ErrorMessage) { DAC960_Error("While configuring DAC960 PCI RAID Controller at\n", Controller); @@ -150,17 +150,128 @@ /* - DAC960_ClearCommand clears critical fields of Command. + DAC960_CreateAuxiliaryStructures allocates and initializes the auxiliary + data structures for Controller. It returns true on success and false on + failure. */ -static inline void DAC960_ClearCommand(DAC960_Command_T *Command) +static boolean DAC960_CreateAuxiliaryStructures(DAC960_Controller_T *Controller) { - DAC960_CommandMailbox_T *CommandMailbox = &Command->CommandMailbox; - CommandMailbox->Words[0] = 0; - CommandMailbox->Words[1] = 0; - CommandMailbox->Words[2] = 0; - CommandMailbox->Words[3] = 0; - Command->CommandStatus = 0; + int CommandAllocationLength, CommandAllocationGroupSize; + int CommandsRemaining = 0, CommandIdentifier, CommandGroupByteCount; + void *AllocationPointer = NULL; + if (Controller->FirmwareType == DAC960_V1_Controller) + { + CommandAllocationLength = offsetof(DAC960_Command_T, V1.EndMarker); + CommandAllocationGroupSize = DAC960_V1_CommandAllocationGroupSize; + } + else + { + CommandAllocationLength = offsetof(DAC960_Command_T, V2.EndMarker); + CommandAllocationGroupSize = DAC960_V2_CommandAllocationGroupSize; + } + Controller->CommandAllocationGroupSize = CommandAllocationGroupSize; + Controller->FreeCommands = NULL; + for (CommandIdentifier = 1; + CommandIdentifier <= Controller->DriverQueueDepth; + CommandIdentifier++) + { + DAC960_Command_T *Command; + if (--CommandsRemaining <= 0) + { + CommandsRemaining = + Controller->DriverQueueDepth - CommandIdentifier + 1; + if (CommandsRemaining > CommandAllocationGroupSize) + CommandsRemaining = CommandAllocationGroupSize; + CommandGroupByteCount = + CommandsRemaining * CommandAllocationLength; + AllocationPointer = kmalloc(CommandGroupByteCount, GFP_ATOMIC); + if (AllocationPointer == NULL) + return DAC960_Failure(Controller, "AUXILIARY STRUCTURE CREATION"); + memset(AllocationPointer, 0, CommandGroupByteCount); + } + Command = (DAC960_Command_T *) AllocationPointer; + AllocationPointer += CommandAllocationLength; + Command->CommandIdentifier = CommandIdentifier; + Command->Controller = Controller; + Command->Next = Controller->FreeCommands; + Controller->FreeCommands = Command; + Controller->Commands[CommandIdentifier-1] = Command; + } + return true; +} + + +/* + DAC960_DestroyAuxiliaryStructures deallocates the auxiliary data + structures for Controller. +*/ + +static void DAC960_DestroyAuxiliaryStructures(DAC960_Controller_T *Controller) +{ + int i; + Controller->FreeCommands = NULL; + for (i = 0; i < Controller->DriverQueueDepth; i++) + { + DAC960_Command_T *Command = Controller->Commands[i]; + if (Command != NULL && + (Command->CommandIdentifier + % Controller->CommandAllocationGroupSize) == 1) + kfree(Command); + Controller->Commands[i] = NULL; + } + if (Controller->CombinedStatusBuffer != NULL) + { + kfree(Controller->CombinedStatusBuffer); + Controller->CombinedStatusBuffer = NULL; + Controller->CurrentStatusBuffer = NULL; + } + if (Controller->FirmwareType == DAC960_V1_Controller) return; + for (i = 0; i < DAC960_MaxLogicalDrives; i++) + if (Controller->V2.LogicalDeviceInformation[i] != NULL) + { + kfree(Controller->V2.LogicalDeviceInformation[i]); + Controller->V2.LogicalDeviceInformation[i] = NULL; + } + for (i = 0; i < DAC960_V2_MaxPhysicalDevices; i++) + { + if (Controller->V2.PhysicalDeviceInformation[i] != NULL) + { + kfree(Controller->V2.PhysicalDeviceInformation[i]); + Controller->V2.PhysicalDeviceInformation[i] = NULL; + } + if (Controller->V2.InquiryUnitSerialNumber[i] != NULL) + { + kfree(Controller->V2.InquiryUnitSerialNumber[i]); + Controller->V2.InquiryUnitSerialNumber[i] = NULL; + } + } +} + + +/* + DAC960_V1_ClearCommand clears critical fields of Command for DAC960 V1 + Firmware Controllers. +*/ + +static inline void DAC960_V1_ClearCommand(DAC960_Command_T *Command) +{ + DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox; + memset(CommandMailbox, 0, sizeof(DAC960_V1_CommandMailbox_T)); + Command->V1.CommandStatus = 0; +} + + +/* + DAC960_V2_ClearCommand clears critical fields of Command for DAC960 V2 + Firmware Controllers. +*/ + +static inline void DAC960_V2_ClearCommand(DAC960_Command_T *Command) +{ + DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox; + memset(CommandMailbox, 0, sizeof(DAC960_V2_CommandMailbox_T)); + Command->V2.CommandStatus = 0; } @@ -211,66 +322,181 @@ /* - DAC960_QueueCommand queues Command. + DAC960_BA_QueueCommand queues Command for DAC960 BA Series Controllers. */ -static void DAC960_QueueCommand(DAC960_Command_T *Command) +static void DAC960_BA_QueueCommand(DAC960_Command_T *Command) { DAC960_Controller_T *Controller = Command->Controller; void *ControllerBaseAddress = Controller->BaseAddress; - DAC960_CommandMailbox_T *CommandMailbox = &Command->CommandMailbox; - DAC960_CommandMailbox_T *NextCommandMailbox; - CommandMailbox->Common.CommandIdentifier = Command - Controller->Commands; - switch (Controller->ControllerType) - { - case DAC960_V5_Controller: - NextCommandMailbox = Controller->NextCommandMailbox; - DAC960_V5_WriteCommandMailbox(NextCommandMailbox, CommandMailbox); - if (Controller->PreviousCommandMailbox1->Words[0] == 0 || - Controller->PreviousCommandMailbox2->Words[0] == 0) - { - if (Controller->DualModeMemoryMailboxInterface) - DAC960_V5_MemoryMailboxNewCommand(ControllerBaseAddress); - else DAC960_V5_HardwareMailboxNewCommand(ControllerBaseAddress); - } - Controller->PreviousCommandMailbox2 = Controller->PreviousCommandMailbox1; - Controller->PreviousCommandMailbox1 = NextCommandMailbox; - if (++NextCommandMailbox > Controller->LastCommandMailbox) - NextCommandMailbox = Controller->FirstCommandMailbox; - Controller->NextCommandMailbox = NextCommandMailbox; - break; - case DAC960_V4_Controller: - NextCommandMailbox = Controller->NextCommandMailbox; - DAC960_V4_WriteCommandMailbox(NextCommandMailbox, CommandMailbox); - if (Controller->PreviousCommandMailbox1->Words[0] == 0 || - Controller->PreviousCommandMailbox2->Words[0] == 0) - { - if (Controller->DualModeMemoryMailboxInterface) - DAC960_V4_MemoryMailboxNewCommand(ControllerBaseAddress); - else DAC960_V4_HardwareMailboxNewCommand(ControllerBaseAddress); - } - Controller->PreviousCommandMailbox2 = Controller->PreviousCommandMailbox1; - Controller->PreviousCommandMailbox1 = NextCommandMailbox; - if (++NextCommandMailbox > Controller->LastCommandMailbox) - NextCommandMailbox = Controller->FirstCommandMailbox; - Controller->NextCommandMailbox = NextCommandMailbox; - break; - case DAC960_V3_Controller: - while (DAC960_V3_MailboxFullP(ControllerBaseAddress)) - udelay(1); - DAC960_V3_WriteCommandMailbox(ControllerBaseAddress, CommandMailbox); - DAC960_V3_NewCommand(ControllerBaseAddress); - break; - } + DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox; + DAC960_V2_CommandMailbox_T *NextCommandMailbox = + Controller->V2.NextCommandMailbox; + CommandMailbox->Common.CommandIdentifier = Command->CommandIdentifier; + DAC960_BA_WriteCommandMailbox(NextCommandMailbox, CommandMailbox); + if (Controller->V2.PreviousCommandMailbox1->Words[0] == 0 || + Controller->V2.PreviousCommandMailbox2->Words[0] == 0) + DAC960_BA_MemoryMailboxNewCommand(ControllerBaseAddress); + Controller->V2.PreviousCommandMailbox2 = + Controller->V2.PreviousCommandMailbox1; + Controller->V2.PreviousCommandMailbox1 = NextCommandMailbox; + if (++NextCommandMailbox > Controller->V2.LastCommandMailbox) + NextCommandMailbox = Controller->V2.FirstCommandMailbox; + Controller->V2.NextCommandMailbox = NextCommandMailbox; } /* - DAC960_ExecuteCommand executes Command and waits for completion. It - returns true on success and false on failure. + DAC960_LP_QueueCommand queues Command for DAC960 LP Series Controllers. +*/ + +static void DAC960_LP_QueueCommand(DAC960_Command_T *Command) +{ + DAC960_Controller_T *Controller = Command->Controller; + void *ControllerBaseAddress = Controller->BaseAddress; + DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox; + DAC960_V2_CommandMailbox_T *NextCommandMailbox = + Controller->V2.NextCommandMailbox; + CommandMailbox->Common.CommandIdentifier = Command->CommandIdentifier; + DAC960_LP_WriteCommandMailbox(NextCommandMailbox, CommandMailbox); + if (Controller->V2.PreviousCommandMailbox1->Words[0] == 0 || + Controller->V2.PreviousCommandMailbox2->Words[0] == 0) + DAC960_LP_MemoryMailboxNewCommand(ControllerBaseAddress); + Controller->V2.PreviousCommandMailbox2 = + Controller->V2.PreviousCommandMailbox1; + Controller->V2.PreviousCommandMailbox1 = NextCommandMailbox; + if (++NextCommandMailbox > Controller->V2.LastCommandMailbox) + NextCommandMailbox = Controller->V2.FirstCommandMailbox; + Controller->V2.NextCommandMailbox = NextCommandMailbox; +} + + +/* + DAC960_LA_QueueCommandDualMode queues Command for DAC960 LA Series + Controllers with Dual Mode Firmware. +*/ + +static void DAC960_LA_QueueCommandDualMode(DAC960_Command_T *Command) +{ + DAC960_Controller_T *Controller = Command->Controller; + void *ControllerBaseAddress = Controller->BaseAddress; + DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox; + DAC960_V1_CommandMailbox_T *NextCommandMailbox = + Controller->V1.NextCommandMailbox; + CommandMailbox->Common.CommandIdentifier = Command->CommandIdentifier; + DAC960_LA_WriteCommandMailbox(NextCommandMailbox, CommandMailbox); + if (Controller->V1.PreviousCommandMailbox1->Words[0] == 0 || + Controller->V1.PreviousCommandMailbox2->Words[0] == 0) + DAC960_LA_MemoryMailboxNewCommand(ControllerBaseAddress); + Controller->V1.PreviousCommandMailbox2 = + Controller->V1.PreviousCommandMailbox1; + Controller->V1.PreviousCommandMailbox1 = NextCommandMailbox; + if (++NextCommandMailbox > Controller->V1.LastCommandMailbox) + NextCommandMailbox = Controller->V1.FirstCommandMailbox; + Controller->V1.NextCommandMailbox = NextCommandMailbox; +} + + +/* + DAC960_LA_QueueCommandSingleMode queues Command for DAC960 LA Series + Controllers with Single Mode Firmware. +*/ + +static void DAC960_LA_QueueCommandSingleMode(DAC960_Command_T *Command) +{ + DAC960_Controller_T *Controller = Command->Controller; + void *ControllerBaseAddress = Controller->BaseAddress; + DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox; + DAC960_V1_CommandMailbox_T *NextCommandMailbox = + Controller->V1.NextCommandMailbox; + CommandMailbox->Common.CommandIdentifier = Command->CommandIdentifier; + DAC960_LA_WriteCommandMailbox(NextCommandMailbox, CommandMailbox); + if (Controller->V1.PreviousCommandMailbox1->Words[0] == 0 || + Controller->V1.PreviousCommandMailbox2->Words[0] == 0) + DAC960_LA_HardwareMailboxNewCommand(ControllerBaseAddress); + Controller->V1.PreviousCommandMailbox2 = + Controller->V1.PreviousCommandMailbox1; + Controller->V1.PreviousCommandMailbox1 = NextCommandMailbox; + if (++NextCommandMailbox > Controller->V1.LastCommandMailbox) + NextCommandMailbox = Controller->V1.FirstCommandMailbox; + Controller->V1.NextCommandMailbox = NextCommandMailbox; +} + + +/* + DAC960_PG_QueueCommandDualMode queues Command for DAC960 PG Series + Controllers with Dual Mode Firmware. +*/ + +static void DAC960_PG_QueueCommandDualMode(DAC960_Command_T *Command) +{ + DAC960_Controller_T *Controller = Command->Controller; + void *ControllerBaseAddress = Controller->BaseAddress; + DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox; + DAC960_V1_CommandMailbox_T *NextCommandMailbox = + Controller->V1.NextCommandMailbox; + CommandMailbox->Common.CommandIdentifier = Command->CommandIdentifier; + DAC960_PG_WriteCommandMailbox(NextCommandMailbox, CommandMailbox); + if (Controller->V1.PreviousCommandMailbox1->Words[0] == 0 || + Controller->V1.PreviousCommandMailbox2->Words[0] == 0) + DAC960_PG_MemoryMailboxNewCommand(ControllerBaseAddress); + Controller->V1.PreviousCommandMailbox2 = + Controller->V1.PreviousCommandMailbox1; + Controller->V1.PreviousCommandMailbox1 = NextCommandMailbox; + if (++NextCommandMailbox > Controller->V1.LastCommandMailbox) + NextCommandMailbox = Controller->V1.FirstCommandMailbox; + Controller->V1.NextCommandMailbox = NextCommandMailbox; +} + + +/* + DAC960_PG_QueueCommandSingleMode queues Command for DAC960 PG Series + Controllers with Single Mode Firmware. +*/ + +static void DAC960_PG_QueueCommandSingleMode(DAC960_Command_T *Command) +{ + DAC960_Controller_T *Controller = Command->Controller; + void *ControllerBaseAddress = Controller->BaseAddress; + DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox; + DAC960_V1_CommandMailbox_T *NextCommandMailbox = + Controller->V1.NextCommandMailbox; + CommandMailbox->Common.CommandIdentifier = Command->CommandIdentifier; + DAC960_PG_WriteCommandMailbox(NextCommandMailbox, CommandMailbox); + if (Controller->V1.PreviousCommandMailbox1->Words[0] == 0 || + Controller->V1.PreviousCommandMailbox2->Words[0] == 0) + DAC960_PG_HardwareMailboxNewCommand(ControllerBaseAddress); + Controller->V1.PreviousCommandMailbox2 = + Controller->V1.PreviousCommandMailbox1; + Controller->V1.PreviousCommandMailbox1 = NextCommandMailbox; + if (++NextCommandMailbox > Controller->V1.LastCommandMailbox) + NextCommandMailbox = Controller->V1.FirstCommandMailbox; + Controller->V1.NextCommandMailbox = NextCommandMailbox; +} + + +/* + DAC960_PD_QueueCommand queues Command for DAC960 PD Series Controllers. +*/ + +static void DAC960_PD_QueueCommand(DAC960_Command_T *Command) +{ + DAC960_Controller_T *Controller = Command->Controller; + void *ControllerBaseAddress = Controller->BaseAddress; + DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox; + CommandMailbox->Common.CommandIdentifier = Command->CommandIdentifier; + while (DAC960_PD_MailboxFullP(ControllerBaseAddress)) + udelay(1); + DAC960_PD_WriteCommandMailbox(ControllerBaseAddress, CommandMailbox); + DAC960_PD_NewCommand(ControllerBaseAddress); +} + + +/* + DAC960_ExecuteCommand executes Command and waits for completion. */ -static boolean DAC960_ExecuteCommand(DAC960_Command_T *Command) +static void DAC960_ExecuteCommand(DAC960_Command_T *Command) { DAC960_Controller_T *Controller = Command->Controller; Semaphore_T Semaphore = MUTEX_LOCKED; @@ -279,227 +505,386 @@ DAC960_AcquireControllerLock(Controller, &ProcessorFlags); DAC960_QueueCommand(Command); DAC960_ReleaseControllerLock(Controller, &ProcessorFlags); - if (!in_interrupt()) - down(&Semaphore); - return Command->CommandStatus == DAC960_NormalCompletion; + if (in_interrupt()) return; + down(&Semaphore); } /* - DAC960_ExecuteType3 executes a DAC960 Type 3 Command and waits for - completion. It returns true on success and false on failure. + DAC960_V1_ExecuteType3 executes a DAC960 V1 Firmware Controller Type 3 + Command and waits for completion. It returns true on success and false + on failure. */ -static boolean DAC960_ExecuteType3(DAC960_Controller_T *Controller, - DAC960_CommandOpcode_T CommandOpcode, - void *DataPointer) +static boolean DAC960_V1_ExecuteType3(DAC960_Controller_T *Controller, + DAC960_V1_CommandOpcode_T CommandOpcode, + void *DataPointer) { DAC960_Command_T *Command = DAC960_AllocateCommand(Controller); - DAC960_CommandMailbox_T *CommandMailbox = &Command->CommandMailbox; - boolean Result; - DAC960_ClearCommand(Command); + DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox; + DAC960_V1_CommandStatus_T CommandStatus; + DAC960_V1_ClearCommand(Command); Command->CommandType = DAC960_ImmediateCommand; CommandMailbox->Type3.CommandOpcode = CommandOpcode; CommandMailbox->Type3.BusAddress = Virtual_to_Bus(DataPointer); - Result = DAC960_ExecuteCommand(Command); + DAC960_ExecuteCommand(Command); + CommandStatus = Command->V1.CommandStatus; DAC960_DeallocateCommand(Command); - return Result; + return (CommandStatus == DAC960_V1_NormalCompletion); } /* - DAC960_ExecuteType3D executes a DAC960 Type 3D Command and waits for - completion. It returns true on success and false on failure. + DAC960_V1_ExecuteType3D executes a DAC960 V1 Firmware Controller Type 3D + Command and waits for completion. It returns true on success and false + on failure. */ -static boolean DAC960_ExecuteType3D(DAC960_Controller_T *Controller, - DAC960_CommandOpcode_T CommandOpcode, - unsigned char Channel, - unsigned char TargetID, - void *DataPointer) +static boolean DAC960_V1_ExecuteType3D(DAC960_Controller_T *Controller, + DAC960_V1_CommandOpcode_T CommandOpcode, + unsigned char Channel, + unsigned char TargetID, + void *DataPointer) { DAC960_Command_T *Command = DAC960_AllocateCommand(Controller); - DAC960_CommandMailbox_T *CommandMailbox = &Command->CommandMailbox; - boolean Result; - DAC960_ClearCommand(Command); + DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox; + DAC960_V1_CommandStatus_T CommandStatus; + DAC960_V1_ClearCommand(Command); Command->CommandType = DAC960_ImmediateCommand; CommandMailbox->Type3D.CommandOpcode = CommandOpcode; CommandMailbox->Type3D.Channel = Channel; CommandMailbox->Type3D.TargetID = TargetID; CommandMailbox->Type3D.BusAddress = Virtual_to_Bus(DataPointer); - Result = DAC960_ExecuteCommand(Command); + DAC960_ExecuteCommand(Command); + CommandStatus = Command->V1.CommandStatus; DAC960_DeallocateCommand(Command); - return Result; + return (CommandStatus == DAC960_V1_NormalCompletion); } /* - DAC960_ReportErrorStatus reports Controller BIOS Messages passed through - the Error Status Register when the driver performs the BIOS handshaking. - It returns true for fatal errors and false otherwise. + DAC960_V2_GeneralInfo executes a DAC960 V2 Firmware General Information + Reading IOCTL Command and waits for completion. It returns true on success + and false on failure. */ -static boolean DAC960_ReportErrorStatus(DAC960_Controller_T *Controller, - unsigned char ErrorStatus, - unsigned char Parameter0, - unsigned char Parameter1) +static boolean DAC960_V2_GeneralInfo(DAC960_Controller_T *Controller, + DAC960_V2_IOCTL_Opcode_T IOCTL_Opcode, + void *DataPointer, + unsigned int DataByteCount) { - switch (ErrorStatus) - { - case 0x00: - DAC960_Notice("Physical Drive %d:%d Not Responding\n", - Controller, Parameter1, Parameter0); - break; - case 0x08: - if (Controller->DriveSpinUpMessageDisplayed) break; - DAC960_Notice("Spinning Up Drives\n", Controller); - Controller->DriveSpinUpMessageDisplayed = true; - break; - case 0x30: - DAC960_Notice("Configuration Checksum Error\n", Controller); - break; - case 0x60: - DAC960_Notice("Mirror Race Recovery Failed\n", Controller); - break; - case 0x70: - DAC960_Notice("Mirror Race Recovery In Progress\n", Controller); - break; - case 0x90: - DAC960_Notice("Physical Drive %d:%d COD Mismatch\n", - Controller, Parameter1, Parameter0); - break; - case 0xA0: - DAC960_Notice("Logical Drive Installation Aborted\n", Controller); - break; - case 0xB0: - DAC960_Notice("Mirror Race On A Critical Logical Drive\n", Controller); - break; - case 0xD0: - DAC960_Notice("New Controller Configuration Found\n", Controller); - break; - case 0xF0: - DAC960_Error("Fatal Memory Parity Error for Controller at\n", Controller); - return true; - default: - DAC960_Error("Unknown Initialization Error %02X for Controller at\n", - Controller, ErrorStatus); - return true; - } - return false; + DAC960_Command_T *Command = DAC960_AllocateCommand(Controller); + DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox; + DAC960_V2_CommandStatus_T CommandStatus; + DAC960_V2_ClearCommand(Command); + Command->CommandType = DAC960_ImmediateCommand; + CommandMailbox->Common.CommandOpcode = DAC960_V2_IOCTL; + CommandMailbox->Common.CommandControlBits + .DataTransferControllerToHost = true; + CommandMailbox->Common.CommandControlBits + .NoAutoRequestSense = true; + CommandMailbox->Common.DataTransferSize = DataByteCount; + CommandMailbox->Common.IOCTL_Opcode = IOCTL_Opcode; + CommandMailbox->Common.DataTransferMemoryAddress + .ScatterGatherSegments[0] + .SegmentDataPointer = + Virtual_to_Bus(DataPointer); + CommandMailbox->Common.DataTransferMemoryAddress + .ScatterGatherSegments[0] + .SegmentByteCount = + CommandMailbox->Common.DataTransferSize; + DAC960_ExecuteCommand(Command); + CommandStatus = Command->V2.CommandStatus; + DAC960_DeallocateCommand(Command); + return (CommandStatus == DAC960_V2_NormalCompletion); } /* - DAC960_EnableMemoryMailboxInterface enables the Memory Mailbox Interface. + DAC960_V2_ControllerInfo executes a DAC960 V2 Firmware Controller + Information Reading IOCTL Command and waits for completion. It returns + true on success and false on failure. */ -static boolean DAC960_EnableMemoryMailboxInterface(DAC960_Controller_T - *Controller) +static boolean DAC960_V2_ControllerInfo(DAC960_Controller_T *Controller, + DAC960_V2_IOCTL_Opcode_T IOCTL_Opcode, + void *DataPointer, + unsigned int DataByteCount) +{ + DAC960_Command_T *Command = DAC960_AllocateCommand(Controller); + DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox; + DAC960_V2_CommandStatus_T CommandStatus; + DAC960_V2_ClearCommand(Command); + Command->CommandType = DAC960_ImmediateCommand; + CommandMailbox->ControllerInfo.CommandOpcode = DAC960_V2_IOCTL; + CommandMailbox->ControllerInfo.CommandControlBits + .DataTransferControllerToHost = true; + CommandMailbox->ControllerInfo.CommandControlBits + .NoAutoRequestSense = true; + CommandMailbox->ControllerInfo.DataTransferSize = DataByteCount; + CommandMailbox->ControllerInfo.ControllerNumber = 0; + CommandMailbox->ControllerInfo.IOCTL_Opcode = IOCTL_Opcode; + CommandMailbox->ControllerInfo.DataTransferMemoryAddress + .ScatterGatherSegments[0] + .SegmentDataPointer = + Virtual_to_Bus(DataPointer); + CommandMailbox->ControllerInfo.DataTransferMemoryAddress + .ScatterGatherSegments[0] + .SegmentByteCount = + CommandMailbox->ControllerInfo.DataTransferSize; + DAC960_ExecuteCommand(Command); + CommandStatus = Command->V2.CommandStatus; + DAC960_DeallocateCommand(Command); + return (CommandStatus == DAC960_V2_NormalCompletion); +} + + +/* + DAC960_V2_LogicalDeviceInfo executes a DAC960 V2 Firmware Controller Logical + Device Information Reading IOCTL Command and waits for completion. It + returns true on success and false on failure. +*/ + +static boolean DAC960_V2_LogicalDeviceInfo(DAC960_Controller_T *Controller, + DAC960_V2_IOCTL_Opcode_T + IOCTL_Opcode, + unsigned short + LogicalDeviceNumber, + void *DataPointer, + unsigned int DataByteCount) +{ + DAC960_Command_T *Command = DAC960_AllocateCommand(Controller); + DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox; + DAC960_V2_CommandStatus_T CommandStatus; + DAC960_V2_ClearCommand(Command); + Command->CommandType = DAC960_ImmediateCommand; + CommandMailbox->LogicalDeviceInfo.CommandOpcode = DAC960_V2_IOCTL; + CommandMailbox->LogicalDeviceInfo.CommandControlBits + .DataTransferControllerToHost = true; + CommandMailbox->LogicalDeviceInfo.CommandControlBits + .NoAutoRequestSense = true; + CommandMailbox->LogicalDeviceInfo.DataTransferSize = DataByteCount; + CommandMailbox->LogicalDeviceInfo.LogicalDevice.LogicalDeviceNumber = + LogicalDeviceNumber; + CommandMailbox->LogicalDeviceInfo.IOCTL_Opcode = IOCTL_Opcode; + CommandMailbox->LogicalDeviceInfo.DataTransferMemoryAddress + .ScatterGatherSegments[0] + .SegmentDataPointer = + Virtual_to_Bus(DataPointer); + CommandMailbox->LogicalDeviceInfo.DataTransferMemoryAddress + .ScatterGatherSegments[0] + .SegmentByteCount = + CommandMailbox->LogicalDeviceInfo.DataTransferSize; + DAC960_ExecuteCommand(Command); + CommandStatus = Command->V2.CommandStatus; + DAC960_DeallocateCommand(Command); + return (CommandStatus == DAC960_V2_NormalCompletion); +} + + +/* + DAC960_V2_PhysicalDeviceInfo executes a DAC960 V2 Firmware Controller Physical + Device Information Reading IOCTL Command and waits for completion. It + returns true on success and false on failure. +*/ + +static boolean DAC960_V2_PhysicalDeviceInfo(DAC960_Controller_T *Controller, + DAC960_V2_IOCTL_Opcode_T + IOCTL_Opcode, + unsigned char Channel, + unsigned char TargetID, + unsigned char LogicalUnit, + void *DataPointer, + unsigned int DataByteCount) +{ + DAC960_Command_T *Command = DAC960_AllocateCommand(Controller); + DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox; + DAC960_V2_CommandStatus_T CommandStatus; + DAC960_V2_ClearCommand(Command); + Command->CommandType = DAC960_ImmediateCommand; + CommandMailbox->PhysicalDeviceInfo.CommandOpcode = DAC960_V2_IOCTL; + CommandMailbox->PhysicalDeviceInfo.CommandControlBits + .DataTransferControllerToHost = true; + CommandMailbox->PhysicalDeviceInfo.CommandControlBits + .NoAutoRequestSense = true; + CommandMailbox->PhysicalDeviceInfo.DataTransferSize = DataByteCount; + CommandMailbox->PhysicalDeviceInfo.PhysicalDevice.LogicalUnit = LogicalUnit; + CommandMailbox->PhysicalDeviceInfo.PhysicalDevice.TargetID = TargetID; + CommandMailbox->PhysicalDeviceInfo.PhysicalDevice.Channel = Channel; + CommandMailbox->PhysicalDeviceInfo.IOCTL_Opcode = IOCTL_Opcode; + CommandMailbox->PhysicalDeviceInfo.DataTransferMemoryAddress + .ScatterGatherSegments[0] + .SegmentDataPointer = + Virtual_to_Bus(DataPointer); + CommandMailbox->PhysicalDeviceInfo.DataTransferMemoryAddress + .ScatterGatherSegments[0] + .SegmentByteCount = + CommandMailbox->PhysicalDeviceInfo.DataTransferSize; + DAC960_ExecuteCommand(Command); + CommandStatus = Command->V2.CommandStatus; + DAC960_DeallocateCommand(Command); + return (CommandStatus == DAC960_V2_NormalCompletion); +} + + +/* + DAC960_V2_DeviceOperation executes a DAC960 V2 Firmware Controller Device + Operation IOCTL Command and waits for completion. It returns true on + success and false on failure. +*/ + +static boolean DAC960_V2_DeviceOperation(DAC960_Controller_T *Controller, + DAC960_V2_IOCTL_Opcode_T IOCTL_Opcode, + DAC960_V2_OperationDevice_T + OperationDevice) +{ + DAC960_Command_T *Command = DAC960_AllocateCommand(Controller); + DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox; + DAC960_V2_CommandStatus_T CommandStatus; + DAC960_V2_ClearCommand(Command); + Command->CommandType = DAC960_ImmediateCommand; + CommandMailbox->DeviceOperation.CommandOpcode = DAC960_V2_IOCTL; + CommandMailbox->DeviceOperation.CommandControlBits + .DataTransferControllerToHost = true; + CommandMailbox->DeviceOperation.CommandControlBits + .NoAutoRequestSense = true; + CommandMailbox->DeviceOperation.IOCTL_Opcode = IOCTL_Opcode; + CommandMailbox->DeviceOperation.OperationDevice = OperationDevice; + DAC960_ExecuteCommand(Command); + CommandStatus = Command->V2.CommandStatus; + DAC960_DeallocateCommand(Command); + return (CommandStatus == DAC960_V2_NormalCompletion); +} + + +/* + DAC960_V1_EnableMemoryMailboxInterface enables the Memory Mailbox Interface + for DAC960 V1 Firmware Controllers. +*/ + +static boolean DAC960_V1_EnableMemoryMailboxInterface(DAC960_Controller_T + *Controller) { void *ControllerBaseAddress = Controller->BaseAddress; - DAC960_CommandMailbox_T *CommandMailboxesMemory; - DAC960_StatusMailbox_T *StatusMailboxesMemory; - DAC960_CommandMailbox_T CommandMailbox; - DAC960_CommandStatus_T CommandStatus; + DAC960_V1_CommandMailbox_T *CommandMailboxesMemory; + DAC960_V1_StatusMailbox_T *StatusMailboxesMemory; + DAC960_V1_CommandMailbox_T CommandMailbox; + DAC960_V1_CommandStatus_T CommandStatus; + unsigned long MemoryMailboxPagesAddress; + unsigned long MemoryMailboxPagesOrder; + unsigned long MemoryMailboxPagesSize; void *SavedMemoryMailboxesAddress = NULL; short NextCommandMailboxIndex = 0; short NextStatusMailboxIndex = 0; int TimeoutCounter = 1000000, i; - if (Controller->ControllerType == DAC960_V5_Controller) - DAC960_V5_RestoreMemoryMailboxInfo(Controller, + MemoryMailboxPagesOrder = 0; + MemoryMailboxPagesSize = + DAC960_V1_CommandMailboxCount * sizeof(DAC960_V1_CommandMailbox_T) + + DAC960_V1_StatusMailboxCount * sizeof(DAC960_V1_StatusMailbox_T); + while (MemoryMailboxPagesSize > PAGE_SIZE << MemoryMailboxPagesOrder) + MemoryMailboxPagesOrder++; + if (Controller->HardwareType == DAC960_LA_Controller) + DAC960_LA_RestoreMemoryMailboxInfo(Controller, &SavedMemoryMailboxesAddress, &NextCommandMailboxIndex, &NextStatusMailboxIndex); - else DAC960_V4_RestoreMemoryMailboxInfo(Controller, + else DAC960_PG_RestoreMemoryMailboxInfo(Controller, &SavedMemoryMailboxesAddress, &NextCommandMailboxIndex, &NextStatusMailboxIndex); if (SavedMemoryMailboxesAddress == NULL) - CommandMailboxesMemory = - (DAC960_CommandMailbox_T *) __get_free_pages(GFP_KERNEL, 1); + { + MemoryMailboxPagesAddress = + __get_free_pages(GFP_KERNEL, MemoryMailboxPagesOrder); + Controller->MemoryMailboxPagesAddress = MemoryMailboxPagesAddress; + CommandMailboxesMemory = + (DAC960_V1_CommandMailbox_T *) MemoryMailboxPagesAddress; + } else CommandMailboxesMemory = SavedMemoryMailboxesAddress; - memset(CommandMailboxesMemory, 0, PAGE_SIZE << 1); - Controller->FirstCommandMailbox = CommandMailboxesMemory; - CommandMailboxesMemory += DAC960_CommandMailboxCount - 1; - Controller->LastCommandMailbox = CommandMailboxesMemory; - Controller->NextCommandMailbox = - &Controller->FirstCommandMailbox[NextCommandMailboxIndex]; + if (CommandMailboxesMemory == NULL) return false; + Controller->MemoryMailboxPagesOrder = MemoryMailboxPagesOrder; + memset(CommandMailboxesMemory, 0, MemoryMailboxPagesSize); + Controller->V1.FirstCommandMailbox = CommandMailboxesMemory; + CommandMailboxesMemory += DAC960_V1_CommandMailboxCount - 1; + Controller->V1.LastCommandMailbox = CommandMailboxesMemory; + Controller->V1.NextCommandMailbox = + &Controller->V1.FirstCommandMailbox[NextCommandMailboxIndex]; if (--NextCommandMailboxIndex < 0) - NextCommandMailboxIndex = DAC960_CommandMailboxCount - 1; - Controller->PreviousCommandMailbox1 = - &Controller->FirstCommandMailbox[NextCommandMailboxIndex]; + NextCommandMailboxIndex = DAC960_V1_CommandMailboxCount - 1; + Controller->V1.PreviousCommandMailbox1 = + &Controller->V1.FirstCommandMailbox[NextCommandMailboxIndex]; if (--NextCommandMailboxIndex < 0) - NextCommandMailboxIndex = DAC960_CommandMailboxCount - 1; - Controller->PreviousCommandMailbox2 = - &Controller->FirstCommandMailbox[NextCommandMailboxIndex]; + NextCommandMailboxIndex = DAC960_V1_CommandMailboxCount - 1; + Controller->V1.PreviousCommandMailbox2 = + &Controller->V1.FirstCommandMailbox[NextCommandMailboxIndex]; StatusMailboxesMemory = - (DAC960_StatusMailbox_T *) (CommandMailboxesMemory + 1); - Controller->FirstStatusMailbox = StatusMailboxesMemory; - StatusMailboxesMemory += DAC960_StatusMailboxCount - 1; - Controller->LastStatusMailbox = StatusMailboxesMemory; - Controller->NextStatusMailbox = - &Controller->FirstStatusMailbox[NextStatusMailboxIndex]; + (DAC960_V1_StatusMailbox_T *) (CommandMailboxesMemory + 1); + Controller->V1.FirstStatusMailbox = StatusMailboxesMemory; + StatusMailboxesMemory += DAC960_V1_StatusMailboxCount - 1; + Controller->V1.LastStatusMailbox = StatusMailboxesMemory; + Controller->V1.NextStatusMailbox = + &Controller->V1.FirstStatusMailbox[NextStatusMailboxIndex]; if (SavedMemoryMailboxesAddress != NULL) return true; /* Enable the Memory Mailbox Interface. */ - Controller->DualModeMemoryMailboxInterface = true; + Controller->V1.DualModeMemoryMailboxInterface = true; CommandMailbox.TypeX.CommandOpcode = 0x2B; CommandMailbox.TypeX.CommandIdentifier = 0; CommandMailbox.TypeX.CommandOpcode2 = 0x14; CommandMailbox.TypeX.CommandMailboxesBusAddress = - Virtual_to_Bus(Controller->FirstCommandMailbox); + Virtual_to_Bus(Controller->V1.FirstCommandMailbox); CommandMailbox.TypeX.StatusMailboxesBusAddress = - Virtual_to_Bus(Controller->FirstStatusMailbox); + Virtual_to_Bus(Controller->V1.FirstStatusMailbox); for (i = 0; i < 2; i++) - switch (Controller->ControllerType) + switch (Controller->HardwareType) { - case DAC960_V5_Controller: + case DAC960_LA_Controller: while (--TimeoutCounter >= 0) { - if (!DAC960_V5_HardwareMailboxFullP(ControllerBaseAddress)) + if (!DAC960_LA_HardwareMailboxFullP(ControllerBaseAddress)) break; udelay(10); } if (TimeoutCounter < 0) return false; - DAC960_V5_WriteHardwareMailbox(ControllerBaseAddress, &CommandMailbox); - DAC960_V5_HardwareMailboxNewCommand(ControllerBaseAddress); + DAC960_LA_WriteHardwareMailbox(ControllerBaseAddress, &CommandMailbox); + DAC960_LA_HardwareMailboxNewCommand(ControllerBaseAddress); while (--TimeoutCounter >= 0) { - if (DAC960_V5_HardwareMailboxStatusAvailableP( + if (DAC960_LA_HardwareMailboxStatusAvailableP( ControllerBaseAddress)) break; udelay(10); } if (TimeoutCounter < 0) return false; - CommandStatus = DAC960_V5_ReadStatusRegister(ControllerBaseAddress); - DAC960_V5_AcknowledgeHardwareMailboxInterrupt(ControllerBaseAddress); - DAC960_V5_AcknowledgeHardwareMailboxStatus(ControllerBaseAddress); - if (CommandStatus == DAC960_NormalCompletion) return true; - Controller->DualModeMemoryMailboxInterface = false; + CommandStatus = DAC960_LA_ReadStatusRegister(ControllerBaseAddress); + DAC960_LA_AcknowledgeHardwareMailboxInterrupt(ControllerBaseAddress); + DAC960_LA_AcknowledgeHardwareMailboxStatus(ControllerBaseAddress); + if (CommandStatus == DAC960_V1_NormalCompletion) return true; + Controller->V1.DualModeMemoryMailboxInterface = false; CommandMailbox.TypeX.CommandOpcode2 = 0x10; break; - case DAC960_V4_Controller: + case DAC960_PG_Controller: while (--TimeoutCounter >= 0) { - if (!DAC960_V4_HardwareMailboxFullP(ControllerBaseAddress)) + if (!DAC960_PG_HardwareMailboxFullP(ControllerBaseAddress)) break; udelay(10); } if (TimeoutCounter < 0) return false; - DAC960_V4_WriteHardwareMailbox(ControllerBaseAddress, &CommandMailbox); - DAC960_V4_HardwareMailboxNewCommand(ControllerBaseAddress); + DAC960_PG_WriteHardwareMailbox(ControllerBaseAddress, &CommandMailbox); + DAC960_PG_HardwareMailboxNewCommand(ControllerBaseAddress); while (--TimeoutCounter >= 0) { - if (DAC960_V4_HardwareMailboxStatusAvailableP( + if (DAC960_PG_HardwareMailboxStatusAvailableP( ControllerBaseAddress)) break; udelay(10); } if (TimeoutCounter < 0) return false; - CommandStatus = DAC960_V4_ReadStatusRegister(ControllerBaseAddress); - DAC960_V4_AcknowledgeHardwareMailboxInterrupt(ControllerBaseAddress); - DAC960_V4_AcknowledgeHardwareMailboxStatus(ControllerBaseAddress); - if (CommandStatus == DAC960_NormalCompletion) return true; - Controller->DualModeMemoryMailboxInterface = false; + CommandStatus = DAC960_PG_ReadStatusRegister(ControllerBaseAddress); + DAC960_PG_AcknowledgeHardwareMailboxInterrupt(ControllerBaseAddress); + DAC960_PG_AcknowledgeHardwareMailboxStatus(ControllerBaseAddress); + if (CommandStatus == DAC960_V1_NormalCompletion) return true; + Controller->V1.DualModeMemoryMailboxInterface = false; CommandMailbox.TypeX.CommandOpcode2 = 0x10; break; default: @@ -510,283 +895,165 @@ /* - DAC960_DetectControllers detects DAC960 PCI RAID Controllers by interrogating - the PCI Configuration Space for Controller Type. + DAC960_V2_EnableMemoryMailboxInterface enables the Memory Mailbox Interface + for DAC960 V2 Firmware Controllers. */ -static void DAC960_DetectControllers(DAC960_ControllerType_T ControllerType) +static boolean DAC960_V2_EnableMemoryMailboxInterface(DAC960_Controller_T + *Controller) { - unsigned short VendorID = 0, DeviceID = 0; - unsigned int MemoryWindowSize = 0; - PCI_Device_T *PCI_Device = NULL; - switch (ControllerType) + void *ControllerBaseAddress = Controller->BaseAddress; + DAC960_V2_CommandMailbox_T *CommandMailboxesMemory; + DAC960_V2_StatusMailbox_T *StatusMailboxesMemory; + DAC960_V2_CommandMailbox_T CommandMailbox; + DAC960_V2_CommandStatus_T CommandStatus = 0; + unsigned long MemoryMailboxPagesAddress; + unsigned long MemoryMailboxPagesOrder; + unsigned long MemoryMailboxPagesSize; + MemoryMailboxPagesOrder = 0; + MemoryMailboxPagesSize = + DAC960_V2_CommandMailboxCount * sizeof(DAC960_V2_CommandMailbox_T) + + DAC960_V2_StatusMailboxCount * sizeof(DAC960_V2_StatusMailbox_T) + + sizeof(DAC960_V2_HealthStatusBuffer_T); + while (MemoryMailboxPagesSize > PAGE_SIZE << MemoryMailboxPagesOrder) + MemoryMailboxPagesOrder++; + MemoryMailboxPagesAddress = + __get_free_pages(GFP_KERNEL, MemoryMailboxPagesOrder); + Controller->MemoryMailboxPagesAddress = MemoryMailboxPagesAddress; + CommandMailboxesMemory = + (DAC960_V2_CommandMailbox_T *) MemoryMailboxPagesAddress; + if (CommandMailboxesMemory == NULL) return false; + Controller->MemoryMailboxPagesOrder = MemoryMailboxPagesOrder; + memset(CommandMailboxesMemory, 0, MemoryMailboxPagesSize); + Controller->V2.FirstCommandMailbox = CommandMailboxesMemory; + CommandMailboxesMemory += DAC960_V2_CommandMailboxCount - 1; + Controller->V2.LastCommandMailbox = CommandMailboxesMemory; + Controller->V2.NextCommandMailbox = Controller->V2.FirstCommandMailbox; + Controller->V2.PreviousCommandMailbox1 = Controller->V2.LastCommandMailbox; + Controller->V2.PreviousCommandMailbox2 = + Controller->V2.LastCommandMailbox - 1; + StatusMailboxesMemory = + (DAC960_V2_StatusMailbox_T *) (CommandMailboxesMemory + 1); + Controller->V2.FirstStatusMailbox = StatusMailboxesMemory; + StatusMailboxesMemory += DAC960_V2_StatusMailboxCount - 1; + Controller->V2.LastStatusMailbox = StatusMailboxesMemory; + Controller->V2.NextStatusMailbox = Controller->V2.FirstStatusMailbox; + Controller->V2.HealthStatusBuffer = + (DAC960_V2_HealthStatusBuffer_T *) (StatusMailboxesMemory + 1); + /* Enable the Memory Mailbox Interface. */ + memset(&CommandMailbox, 0, sizeof(DAC960_V2_CommandMailbox_T)); + CommandMailbox.SetMemoryMailbox.CommandIdentifier = 1; + CommandMailbox.SetMemoryMailbox.CommandOpcode = DAC960_V2_IOCTL; + CommandMailbox.SetMemoryMailbox.CommandControlBits.NoAutoRequestSense = true; + CommandMailbox.SetMemoryMailbox.FirstCommandMailboxSizeKB = + (DAC960_V2_CommandMailboxCount * sizeof(DAC960_V2_CommandMailbox_T)) >> 10; + CommandMailbox.SetMemoryMailbox.FirstStatusMailboxSizeKB = + (DAC960_V2_StatusMailboxCount * sizeof(DAC960_V2_StatusMailbox_T)) >> 10; + CommandMailbox.SetMemoryMailbox.SecondCommandMailboxSizeKB = 0; + CommandMailbox.SetMemoryMailbox.SecondStatusMailboxSizeKB = 0; + CommandMailbox.SetMemoryMailbox.RequestSenseSize = 0; + CommandMailbox.SetMemoryMailbox.IOCTL_Opcode = DAC960_V2_SetMemoryMailbox; + CommandMailbox.SetMemoryMailbox.HealthStatusBufferSizeKB = 1; + CommandMailbox.SetMemoryMailbox.HealthStatusBufferBusAddress = + Virtual_to_Bus(Controller->V2.HealthStatusBuffer); + CommandMailbox.SetMemoryMailbox.FirstCommandMailboxBusAddress = + Virtual_to_Bus(Controller->V2.FirstCommandMailbox); + CommandMailbox.SetMemoryMailbox.FirstStatusMailboxBusAddress = + Virtual_to_Bus(Controller->V2.FirstStatusMailbox); + switch (Controller->HardwareType) { - case DAC960_V5_Controller: - VendorID = PCI_VENDOR_ID_DEC; - DeviceID = PCI_DEVICE_ID_DEC_21285; - MemoryWindowSize = DAC960_V5_RegisterWindowSize; + case DAC960_BA_Controller: + while (DAC960_BA_HardwareMailboxFullP(ControllerBaseAddress)) + udelay(1); + DAC960_BA_WriteHardwareMailbox(ControllerBaseAddress, &CommandMailbox); + DAC960_BA_HardwareMailboxNewCommand(ControllerBaseAddress); + while (!DAC960_BA_HardwareMailboxStatusAvailableP(ControllerBaseAddress)) + udelay(1); + CommandStatus = DAC960_BA_ReadCommandStatus(ControllerBaseAddress); + DAC960_BA_AcknowledgeHardwareMailboxInterrupt(ControllerBaseAddress); + DAC960_BA_AcknowledgeHardwareMailboxStatus(ControllerBaseAddress); break; - case DAC960_V4_Controller: - VendorID = PCI_VENDOR_ID_MYLEX; - DeviceID = PCI_DEVICE_ID_MYLEX_DAC960P_V4; - MemoryWindowSize = DAC960_V4_RegisterWindowSize; + case DAC960_LP_Controller: + while (DAC960_LP_HardwareMailboxFullP(ControllerBaseAddress)) + udelay(1); + DAC960_LP_WriteHardwareMailbox(ControllerBaseAddress, &CommandMailbox); + DAC960_LP_HardwareMailboxNewCommand(ControllerBaseAddress); + while (!DAC960_LP_HardwareMailboxStatusAvailableP(ControllerBaseAddress)) + udelay(1); + CommandStatus = DAC960_LP_ReadCommandStatus(ControllerBaseAddress); + DAC960_LP_AcknowledgeHardwareMailboxInterrupt(ControllerBaseAddress); + DAC960_LP_AcknowledgeHardwareMailboxStatus(ControllerBaseAddress); break; - case DAC960_V3_Controller: - VendorID = PCI_VENDOR_ID_MYLEX; - DeviceID = PCI_DEVICE_ID_MYLEX_DAC960P_V3; - MemoryWindowSize = DAC960_V3_RegisterWindowSize; + default: break; } - while ((PCI_Device = pci_find_device(VendorID, DeviceID, PCI_Device)) != NULL) + return (CommandStatus == DAC960_V2_NormalCompletion); +} + + +/* + DAC960_V1_ReadControllerConfiguration reads the Configuration Information + from DAC960 V1 Firmware Controllers and initializes the Controller structure. +*/ + +static boolean DAC960_V1_ReadControllerConfiguration(DAC960_Controller_T + *Controller) +{ + DAC960_V1_Enquiry2_T Enquiry2; + DAC960_V1_Config2_T Config2; + int LogicalDriveNumber, Channel, TargetID; + if (!DAC960_V1_ExecuteType3(Controller, DAC960_V1_Enquiry, + &Controller->V1.Enquiry)) + return DAC960_Failure(Controller, "ENQUIRY"); + if (!DAC960_V1_ExecuteType3(Controller, DAC960_V1_Enquiry2, &Enquiry2)) + return DAC960_Failure(Controller, "ENQUIRY2"); + if (!DAC960_V1_ExecuteType3(Controller, DAC960_V1_ReadConfig2, &Config2)) + return DAC960_Failure(Controller, "READ CONFIG2"); + if (!DAC960_V1_ExecuteType3(Controller, DAC960_V1_GetLogicalDriveInformation, + &Controller->V1.LogicalDriveInformation)) + return DAC960_Failure(Controller, "GET LOGICAL DRIVE INFORMATION"); + for (Channel = 0; Channel < Enquiry2.ActualChannels; Channel++) + for (TargetID = 0; TargetID < Enquiry2.MaxTargets; TargetID++) + if (!DAC960_V1_ExecuteType3D(Controller, DAC960_V1_GetDeviceState, + Channel, TargetID, + &Controller->V1.DeviceState + [Channel][TargetID])) + return DAC960_Failure(Controller, "GET DEVICE STATE"); + /* + Initialize the Controller Model Name and Full Model Name fields. + */ + switch (Enquiry2.HardwareID.SubModel) { - DAC960_Controller_T *Controller = (DAC960_Controller_T *) - kmalloc(sizeof(DAC960_Controller_T), GFP_ATOMIC); - DAC960_IO_Address_T IO_Address = 0; - DAC960_PCI_Address_T PCI_Address = 0; - unsigned char Bus = PCI_Device->bus->number; - unsigned char DeviceFunction = PCI_Device->devfn; - unsigned char Device = DeviceFunction >> 3; - unsigned char Function = DeviceFunction & 0x7; - unsigned char ErrorStatus, Parameter0, Parameter1; - unsigned int IRQ_Channel = PCI_Device->irq; - unsigned long BaseAddress0 = PCI_Device->base_address[0]; - unsigned long BaseAddress1 = PCI_Device->base_address[1]; - unsigned short SubsystemVendorID, SubsystemDeviceID; - int CommandIdentifier; - void *BaseAddress; - pci_read_config_word(PCI_Device, PCI_SUBSYSTEM_VENDOR_ID, - &SubsystemVendorID); - pci_read_config_word(PCI_Device, PCI_SUBSYSTEM_ID, - &SubsystemDeviceID); - switch (ControllerType) - { - case DAC960_V5_Controller: - if (!(SubsystemVendorID == PCI_VENDOR_ID_MYLEX && - SubsystemDeviceID == PCI_DEVICE_ID_MYLEX_DAC960P_V5)) - goto Ignore; - PCI_Address = BaseAddress0 & PCI_BASE_ADDRESS_MEM_MASK; - break; - case DAC960_V4_Controller: - PCI_Address = BaseAddress0 & PCI_BASE_ADDRESS_MEM_MASK; - break; - case DAC960_V3_Controller: - IO_Address = BaseAddress0 & PCI_BASE_ADDRESS_IO_MASK; - PCI_Address = BaseAddress1 & PCI_BASE_ADDRESS_MEM_MASK; - break; - } - if (DAC960_ControllerCount == DAC960_MaxControllers) - { - DAC960_Error("More than %d DAC960 Controllers detected - " - "ignoring from Controller at\n", - NULL, DAC960_MaxControllers); - goto Ignore; - } - if (Controller == NULL) - { - DAC960_Error("Unable to allocate Controller structure for " - "Controller at\n", NULL); - goto Ignore; - } - memset(Controller, 0, sizeof(DAC960_Controller_T)); - Controller->ControllerNumber = DAC960_ControllerCount; - DAC960_Controllers[DAC960_ControllerCount++] = Controller; - DAC960_AnnounceDriver(Controller); - Controller->ControllerType = ControllerType; - Controller->IO_Address = IO_Address; - Controller->PCI_Address = PCI_Address; - Controller->Bus = Bus; - Controller->Device = Device; - Controller->Function = Function; - sprintf(Controller->ControllerName, "c%d", Controller->ControllerNumber); - /* - Map the Controller Register Window. - */ - if (MemoryWindowSize < PAGE_SIZE) - MemoryWindowSize = PAGE_SIZE; - Controller->MemoryMappedAddress = - ioremap_nocache(PCI_Address & PAGE_MASK, MemoryWindowSize); - Controller->BaseAddress = - Controller->MemoryMappedAddress + (PCI_Address & ~PAGE_MASK); - if (Controller->MemoryMappedAddress == NULL) - { - DAC960_Error("Unable to map Controller Register Window for " - "Controller at\n", Controller); - goto Failure; - } - BaseAddress = Controller->BaseAddress; - switch (ControllerType) - { - case DAC960_V5_Controller: - DAC960_V5_DisableInterrupts(BaseAddress); - DAC960_V5_AcknowledgeHardwareMailboxStatus(BaseAddress); - udelay(1000); - while (DAC960_V5_InitializationInProgressP(BaseAddress)) - { - if (DAC960_V5_ReadErrorStatus(BaseAddress, &ErrorStatus, - &Parameter0, &Parameter1) && - DAC960_ReportErrorStatus(Controller, ErrorStatus, - Parameter0, Parameter1)) - goto Failure; - udelay(10); - } - if (!DAC960_EnableMemoryMailboxInterface(Controller)) - { - DAC960_Error("Unable to Enable Memory Mailbox Interface " - "for Controller at\n", Controller); - goto Failure; - } - DAC960_V5_EnableInterrupts(BaseAddress); - break; - case DAC960_V4_Controller: - DAC960_V4_DisableInterrupts(BaseAddress); - DAC960_V4_AcknowledgeHardwareMailboxStatus(BaseAddress); - udelay(1000); - while (DAC960_V4_InitializationInProgressP(BaseAddress)) - { - if (DAC960_V4_ReadErrorStatus(BaseAddress, &ErrorStatus, - &Parameter0, &Parameter1) && - DAC960_ReportErrorStatus(Controller, ErrorStatus, - Parameter0, Parameter1)) - goto Failure; - udelay(10); - } - if (!DAC960_EnableMemoryMailboxInterface(Controller)) - { - DAC960_Error("Unable to Enable Memory Mailbox Interface " - "for Controller at\n", Controller); - goto Failure; - } - DAC960_V4_EnableInterrupts(BaseAddress); - break; - case DAC960_V3_Controller: - request_region(Controller->IO_Address, 0x80, - Controller->FullModelName); - DAC960_V3_DisableInterrupts(BaseAddress); - DAC960_V3_AcknowledgeStatus(BaseAddress); - udelay(1000); - while (DAC960_V3_InitializationInProgressP(BaseAddress)) - { - if (DAC960_V3_ReadErrorStatus(BaseAddress, &ErrorStatus, - &Parameter0, &Parameter1) && - DAC960_ReportErrorStatus(Controller, ErrorStatus, - Parameter0, Parameter1)) - goto Failure; - udelay(10); - } - DAC960_V3_EnableInterrupts(BaseAddress); - break; - } - /* - Acquire shared access to the IRQ Channel. - */ - if (IRQ_Channel == 0) - { - DAC960_Error("IRQ Channel %d illegal for Controller at\n", - Controller, IRQ_Channel); - goto Failure; - } - strcpy(Controller->FullModelName, "DAC960"); - if (request_irq(IRQ_Channel, DAC960_InterruptHandler, - SA_SHIRQ, Controller->FullModelName, Controller) < 0) - { - DAC960_Error("Unable to acquire IRQ Channel %d for Controller at\n", - Controller, IRQ_Channel); - goto Failure; - } - Controller->IRQ_Channel = IRQ_Channel; - DAC960_ActiveControllerCount++; - for (CommandIdentifier = 0; - CommandIdentifier < DAC960_MaxChannels; - CommandIdentifier++) - { - Controller->Commands[CommandIdentifier].Controller = Controller; - Controller->Commands[CommandIdentifier].Next = - Controller->FreeCommands; - Controller->FreeCommands = &Controller->Commands[CommandIdentifier]; - } - continue; - Failure: - if (IO_Address == 0) - DAC960_Error("PCI Bus %d Device %d Function %d I/O Address N/A " - "PCI Address 0x%X\n", Controller, - Bus, Device, Function, PCI_Address); - else DAC960_Error("PCI Bus %d Device %d Function %d I/O Address " - "0x%X PCI Address 0x%X\n", Controller, - Bus, Device, Function, IO_Address, PCI_Address); - if (Controller == NULL) break; - if (Controller->MemoryMappedAddress != NULL) - iounmap(Controller->MemoryMappedAddress); - DAC960_Controllers[Controller->ControllerNumber] = NULL; - if (Controller->IRQ_Channel > 0) - free_irq(IRQ_Channel, Controller); - Ignore: - kfree(Controller); - } -} - - -/* - DAC960_ReadControllerConfiguration reads the Configuration Information - from Controller and initializes the Controller structure. -*/ - -static boolean DAC960_ReadControllerConfiguration(DAC960_Controller_T - *Controller) -{ - DAC960_Enquiry2_T Enquiry2; - DAC960_Config2_T Config2; - int LogicalDriveNumber, Channel, TargetID; - if (!DAC960_ExecuteType3(Controller, DAC960_Enquiry, - &Controller->Enquiry[0])) - return DAC960_Failure(Controller, "ENQUIRY"); - if (!DAC960_ExecuteType3(Controller, DAC960_Enquiry2, &Enquiry2)) - return DAC960_Failure(Controller, "ENQUIRY2"); - if (!DAC960_ExecuteType3(Controller, DAC960_ReadConfig2, &Config2)) - return DAC960_Failure(Controller, "READ CONFIG2"); - if (!DAC960_ExecuteType3(Controller, DAC960_GetLogicalDriveInformation, - &Controller->LogicalDriveInformation[0])) - return DAC960_Failure(Controller, "GET LOGICAL DRIVE INFORMATION"); - for (Channel = 0; Channel < Enquiry2.ActualChannels; Channel++) - for (TargetID = 0; TargetID < DAC960_MaxTargets; TargetID++) - if (!DAC960_ExecuteType3D(Controller, DAC960_GetDeviceState, - Channel, TargetID, - &Controller->DeviceState[0][Channel][TargetID])) - return DAC960_Failure(Controller, "GET DEVICE STATE"); - /* - Initialize the Controller Model Name and Full Model Name fields. - */ - switch (Enquiry2.HardwareID.SubModel) - { - case DAC960_P_PD_PU: - if (Enquiry2.SCSICapability.BusSpeed == DAC960_Ultra) + case DAC960_V1_P_PD_PU: + if (Enquiry2.SCSICapability.BusSpeed == DAC960_V1_Ultra) strcpy(Controller->ModelName, "DAC960PU"); else strcpy(Controller->ModelName, "DAC960PD"); break; - case DAC960_PL: + case DAC960_V1_PL: strcpy(Controller->ModelName, "DAC960PL"); break; - case DAC960_PG: + case DAC960_V1_PG: strcpy(Controller->ModelName, "DAC960PG"); break; - case DAC960_PJ: + case DAC960_V1_PJ: strcpy(Controller->ModelName, "DAC960PJ"); break; - case DAC960_PR: + case DAC960_V1_PR: strcpy(Controller->ModelName, "DAC960PR"); break; - case DAC960_PT: + case DAC960_V1_PT: strcpy(Controller->ModelName, "DAC960PT"); break; - case DAC960_PTL0: + case DAC960_V1_PTL0: strcpy(Controller->ModelName, "DAC960PTL0"); break; - case DAC960_PRL: + case DAC960_V1_PRL: strcpy(Controller->ModelName, "DAC960PRL"); break; - case DAC960_PTL1: + case DAC960_V1_PTL1: strcpy(Controller->ModelName, "DAC960PTL1"); break; - case DAC1164_P: + case DAC960_V1_1164P: strcpy(Controller->ModelName, "DAC1164P"); break; default: @@ -818,61 +1085,197 @@ return false; } /* - Initialize the Controller Channels, Memory Size, and SAF-TE Enclosure - Management Enabled fields. + Initialize the Controller Channels, Targets, Memory Size, and SAF-TE + Enclosure Management Enabled fields. */ Controller->Channels = Enquiry2.ActualChannels; + Controller->Targets = Enquiry2.MaxTargets; Controller->MemorySize = Enquiry2.MemorySize >> 20; - Controller->SAFTE_EnclosureManagementEnabled = - Enquiry2.FaultManagementType == DAC960_SAFTE; + Controller->V1.SAFTE_EnclosureManagementEnabled = + (Enquiry2.FaultManagementType == DAC960_V1_SAFTE); /* Initialize the Controller Queue Depth, Driver Queue Depth, Logical Drive - Count, Maximum Blocks per Command, and Maximum Scatter/Gather Segments. - The Driver Queue Depth must be at most one less than the Controller Queue - Depth to allow for an automatic drive rebuild operation. + Count, Maximum Blocks per Command, Controller Scatter/Gather Limit, and + Driver Scatter/Gather Limit. The Driver Queue Depth must be at most one + less than the Controller Queue Depth to allow for an automatic drive + rebuild operation. */ - Controller->ControllerQueueDepth = Controller->Enquiry[0].MaxCommands; + Controller->ControllerQueueDepth = Controller->V1.Enquiry.MaxCommands; Controller->DriverQueueDepth = Controller->ControllerQueueDepth - 1; - Controller->LogicalDriveCount = Controller->Enquiry[0].NumberOfLogicalDrives; + if (Controller->DriverQueueDepth > DAC960_MaxDriverQueueDepth) + Controller->DriverQueueDepth = DAC960_MaxDriverQueueDepth; + Controller->LogicalDriveCount = + Controller->V1.Enquiry.NumberOfLogicalDrives; Controller->MaxBlocksPerCommand = Enquiry2.MaxBlocksPerCommand; - Controller->MaxScatterGatherSegments = Enquiry2.MaxScatterGatherEntries; + Controller->ControllerScatterGatherLimit = Enquiry2.MaxScatterGatherEntries; + Controller->DriverScatterGatherLimit = + Controller->ControllerScatterGatherLimit; + if (Controller->DriverScatterGatherLimit > DAC960_V1_ScatterGatherLimit) + Controller->DriverScatterGatherLimit = DAC960_V1_ScatterGatherLimit; /* Initialize the Stripe Size, Segment Size, and Geometry Translation. */ - Controller->StripeSize = Config2.BlocksPerStripe * Config2.BlockFactor - >> (10 - DAC960_BlockSizeBits); - Controller->SegmentSize = Config2.BlocksPerCacheLine * Config2.BlockFactor - >> (10 - DAC960_BlockSizeBits); + Controller->V1.StripeSize = Config2.BlocksPerStripe * Config2.BlockFactor + >> (10 - DAC960_BlockSizeBits); + Controller->V1.SegmentSize = Config2.BlocksPerCacheLine * Config2.BlockFactor + >> (10 - DAC960_BlockSizeBits); switch (Config2.DriveGeometry) { - case DAC960_Geometry_128_32: - Controller->GeometryTranslationHeads = 128; - Controller->GeometryTranslationSectors = 32; - break; - case DAC960_Geometry_255_63: - Controller->GeometryTranslationHeads = 255; - Controller->GeometryTranslationSectors = 63; + case DAC960_V1_Geometry_128_32: + Controller->V1.GeometryTranslationHeads = 128; + Controller->V1.GeometryTranslationSectors = 32; + break; + case DAC960_V1_Geometry_255_63: + Controller->V1.GeometryTranslationHeads = 255; + Controller->V1.GeometryTranslationSectors = 63; break; default: return DAC960_Failure(Controller, "CONFIG2 DRIVE GEOMETRY"); } /* - Initialize the Logical Drive Initial State. + Initialize the Logical Drive Initially Accessible flag. */ for (LogicalDriveNumber = 0; LogicalDriveNumber < Controller->LogicalDriveCount; LogicalDriveNumber++) - Controller->LogicalDriveInitialState[LogicalDriveNumber] = - Controller->LogicalDriveInformation[0] - [LogicalDriveNumber].LogicalDriveState; - Controller->LastRebuildStatus = DAC960_NoRebuildOrCheckInProgress; + if (Controller->V1.LogicalDriveInformation + [LogicalDriveNumber].LogicalDriveState != + DAC960_V1_LogicalDrive_Offline) + Controller->LogicalDriveInitiallyAccessible[LogicalDriveNumber] = true; + Controller->V1.LastRebuildStatus = DAC960_V1_NoRebuildOrCheckInProgress; return true; } /* - DAC960_ReportControllerConfiguration reports the Configuration Information of - Controller. + DAC960_V2_ReadControllerConfiguration reads the Configuration Information + from DAC960 V2 Firmware Controllers and initializes the Controller structure. +*/ + +static boolean DAC960_V2_ReadControllerConfiguration(DAC960_Controller_T + *Controller) +{ + DAC960_V2_ControllerInfo_T *ControllerInfo = + &Controller->V2.ControllerInformation; + unsigned short LogicalDeviceNumber = 0; + int ModelNameLength; + if (!DAC960_V2_ControllerInfo(Controller, DAC960_V2_GetControllerInfo, + ControllerInfo, + sizeof(DAC960_V2_ControllerInfo_T))) + return DAC960_Failure(Controller, "GET CONTROLLER INFO"); + if (!DAC960_V2_GeneralInfo(Controller, DAC960_V2_GetHealthStatus, + Controller->V2.HealthStatusBuffer, + sizeof(DAC960_V2_HealthStatusBuffer_T))) + return DAC960_Failure(Controller, "GET HEALTH STATUS"); + /* + Initialize the Controller Model Name and Full Model Name fields. + */ + ModelNameLength = sizeof(ControllerInfo->ControllerName); + if (ModelNameLength > sizeof(Controller->ModelName)-1) + ModelNameLength = sizeof(Controller->ModelName)-1; + memcpy(Controller->ModelName, ControllerInfo->ControllerName, + ModelNameLength); + ModelNameLength--; + while (Controller->ModelName[ModelNameLength] == ' ' || + Controller->ModelName[ModelNameLength] == '\0') + ModelNameLength--; + Controller->ModelName[++ModelNameLength] = '\0'; + strcpy(Controller->FullModelName, "Mylex "); + strcat(Controller->FullModelName, Controller->ModelName); + /* + Initialize the Controller Firmware Version field. + */ + sprintf(Controller->FirmwareVersion, "%d.%02d-%02d", + ControllerInfo->FirmwareMajorVersion, + ControllerInfo->FirmwareMinorVersion, + ControllerInfo->FirmwareTurnNumber); + if (ControllerInfo->FirmwareMajorVersion == 6 && + ControllerInfo->FirmwareMinorVersion == 0 && + ControllerInfo->FirmwareTurnNumber < 1) + { + DAC960_Info("FIRMWARE VERSION %s DOES NOT PROVIDE THE CONTROLLER\n", + Controller, Controller->FirmwareVersion); + DAC960_Info("STATUS MONITORING FUNCTIONALITY NEEDED BY THIS DRIVER.\n", + Controller); + DAC960_Info("PLEASE UPGRADE TO VERSION 6.00-01 OR ABOVE.\n", + Controller); + } + /* + Initialize the Controller Channels, Targets, and Memory Size. + */ + Controller->Channels = ControllerInfo->NumberOfPhysicalChannelsPresent; + Controller->Targets = + ControllerInfo->MaximumTargetsPerChannel + [ControllerInfo->NumberOfPhysicalChannelsPresent-1]; + Controller->MemorySize = ControllerInfo->MemorySizeMB; + /* + Initialize the Controller Queue Depth, Driver Queue Depth, Logical Drive + Count, Maximum Blocks per Command, Controller Scatter/Gather Limit, and + Driver Scatter/Gather Limit. The Driver Queue Depth must be at most one + less than the Controller Queue Depth to allow for an automatic drive + rebuild operation. + */ + Controller->ControllerQueueDepth = ControllerInfo->MaximumParallelCommands; + Controller->DriverQueueDepth = Controller->ControllerQueueDepth - 1; + if (Controller->DriverQueueDepth > DAC960_MaxDriverQueueDepth) + Controller->DriverQueueDepth = DAC960_MaxDriverQueueDepth; + Controller->LogicalDriveCount = ControllerInfo->LogicalDevicesPresent; + Controller->MaxBlocksPerCommand = + ControllerInfo->MaximumDataTransferSizeInBlocks; + Controller->ControllerScatterGatherLimit = + ControllerInfo->MaximumScatterGatherEntries; + Controller->DriverScatterGatherLimit = + Controller->ControllerScatterGatherLimit; + if (Controller->DriverScatterGatherLimit > DAC960_V2_ScatterGatherLimit) + Controller->DriverScatterGatherLimit = DAC960_V2_ScatterGatherLimit; + /* + Initialize the Logical Device Information. + */ + while (true) + { + DAC960_V2_LogicalDeviceInfo_T *NewLogicalDeviceInfo = + &Controller->V2.NewLogicalDeviceInformation; + DAC960_V2_LogicalDeviceInfo_T *LogicalDeviceInfo; + DAC960_V2_PhysicalDevice_T PhysicalDevice; + if (!DAC960_V2_LogicalDeviceInfo(Controller, + DAC960_V2_GetLogicalDeviceInfoValid, + LogicalDeviceNumber, + NewLogicalDeviceInfo, + sizeof(DAC960_V2_LogicalDeviceInfo_T))) + break; + LogicalDeviceNumber = NewLogicalDeviceInfo->LogicalDeviceNumber; + if (LogicalDeviceNumber > DAC960_MaxLogicalDrives) + panic("DAC960: Logical Drive Number %d not supported\n", + LogicalDeviceNumber); + if (NewLogicalDeviceInfo->DeviceBlockSizeInBytes != DAC960_BlockSize) + panic("DAC960: Logical Drive Block Size %d not supported\n", + NewLogicalDeviceInfo->DeviceBlockSizeInBytes); + PhysicalDevice.Controller = 0; + PhysicalDevice.Channel = NewLogicalDeviceInfo->Channel; + PhysicalDevice.TargetID = NewLogicalDeviceInfo->TargetID; + PhysicalDevice.LogicalUnit = NewLogicalDeviceInfo->LogicalUnit; + Controller->V2.LogicalDriveToVirtualDevice[LogicalDeviceNumber] = + PhysicalDevice; + if (NewLogicalDeviceInfo->LogicalDeviceState != + DAC960_V2_LogicalDevice_Offline) + Controller->LogicalDriveInitiallyAccessible[LogicalDeviceNumber] = true; + LogicalDeviceInfo = (DAC960_V2_LogicalDeviceInfo_T *) + kmalloc(sizeof(DAC960_V2_LogicalDeviceInfo_T), GFP_ATOMIC); + if (LogicalDeviceInfo == NULL) + return DAC960_Failure(Controller, "LOGICAL DEVICE ALLOCATION"); + Controller->V2.LogicalDeviceInformation[LogicalDeviceNumber] = + LogicalDeviceInfo; + memcpy(LogicalDeviceInfo, NewLogicalDeviceInfo, + sizeof(DAC960_V2_LogicalDeviceInfo_T)); + LogicalDeviceNumber++; + } + return true; +} + + +/* + DAC960_ReportControllerConfiguration reports the Configuration Information + for Controller. */ static boolean DAC960_ReportControllerConfiguration(DAC960_Controller_T @@ -898,54 +1301,60 @@ Controller, Controller->ControllerQueueDepth, Controller->MaxBlocksPerCommand); DAC960_Info(" Driver Queue Depth: %d, " - "Maximum Scatter/Gather Segments: %d\n", + "Scatter/Gather Limit: %d of %d Segments\n", Controller, Controller->DriverQueueDepth, - Controller->MaxScatterGatherSegments); - DAC960_Info(" Stripe Size: %dKB, Segment Size: %dKB, " - "BIOS Geometry: %d/%d\n", Controller, - Controller->StripeSize, - Controller->SegmentSize, - Controller->GeometryTranslationHeads, - Controller->GeometryTranslationSectors); - if (Controller->SAFTE_EnclosureManagementEnabled) - DAC960_Info(" SAF-TE Enclosure Management Enabled\n", Controller); + Controller->DriverScatterGatherLimit, + Controller->ControllerScatterGatherLimit); + if (Controller->FirmwareType == DAC960_V1_Controller) + { + DAC960_Info(" Stripe Size: %dKB, Segment Size: %dKB, " + "BIOS Geometry: %d/%d\n", Controller, + Controller->V1.StripeSize, + Controller->V1.SegmentSize, + Controller->V1.GeometryTranslationHeads, + Controller->V1.GeometryTranslationSectors); + if (Controller->V1.SAFTE_EnclosureManagementEnabled) + DAC960_Info(" SAF-TE Enclosure Management Enabled\n", Controller); + } return true; } /* - DAC960_ReadDeviceConfiguration reads the Device Configuration Information by - requesting the SCSI Inquiry and SCSI Inquiry Unit Serial Number information - for each device connected to Controller. + DAC960_V1_ReadDeviceConfiguration reads the Device Configuration Information + for DAC960 V1 Firmware Controllers by requesting the SCSI Inquiry and SCSI + Inquiry Unit Serial Number information for each device connected to + Controller. */ -static boolean DAC960_ReadDeviceConfiguration(DAC960_Controller_T *Controller) +static boolean DAC960_V1_ReadDeviceConfiguration(DAC960_Controller_T + *Controller) { - DAC960_DCDB_T DCDBs[DAC960_MaxChannels], *DCDB; - Semaphore_T Semaphores[DAC960_MaxChannels], *Semaphore; + DAC960_V1_DCDB_T DCDBs[DAC960_V1_MaxChannels], *DCDB; + Semaphore_T Semaphores[DAC960_V1_MaxChannels], *Semaphore; unsigned long ProcessorFlags; int Channel, TargetID; - for (TargetID = 0; TargetID < DAC960_MaxTargets; TargetID++) + for (TargetID = 0; TargetID < Controller->Targets; TargetID++) { for (Channel = 0; Channel < Controller->Channels; Channel++) { - DAC960_Command_T *Command = &Controller->Commands[Channel]; + DAC960_Command_T *Command = Controller->Commands[Channel]; DAC960_SCSI_Inquiry_T *InquiryStandardData = - &Controller->InquiryStandardData[Channel][TargetID]; + &Controller->V1.InquiryStandardData[Channel][TargetID]; InquiryStandardData->PeripheralDeviceType = 0x1F; Semaphore = &Semaphores[Channel]; *Semaphore = MUTEX_LOCKED; DCDB = &DCDBs[Channel]; - DAC960_ClearCommand(Command); + DAC960_V1_ClearCommand(Command); Command->CommandType = DAC960_ImmediateCommand; Command->Semaphore = Semaphore; - Command->CommandMailbox.Type3.CommandOpcode = DAC960_DCDB; - Command->CommandMailbox.Type3.BusAddress = Virtual_to_Bus(DCDB); + Command->V1.CommandMailbox.Type3.CommandOpcode = DAC960_V1_DCDB; + Command->V1.CommandMailbox.Type3.BusAddress = Virtual_to_Bus(DCDB); DCDB->Channel = Channel; DCDB->TargetID = TargetID; - DCDB->Direction = DAC960_DCDB_DataTransferDeviceToSystem; + DCDB->Direction = DAC960_V1_DCDB_DataTransferDeviceToSystem; DCDB->EarlyStatus = false; - DCDB->Timeout = DAC960_DCDB_Timeout_10_seconds; + DCDB->Timeout = DAC960_V1_DCDB_Timeout_10_seconds; DCDB->NoAutomaticRequestSense = false; DCDB->DisconnectPermitted = true; DCDB->TransferLength = sizeof(DAC960_SCSI_Inquiry_T); @@ -965,13 +1374,14 @@ } for (Channel = 0; Channel < Controller->Channels; Channel++) { - DAC960_Command_T *Command = &Controller->Commands[Channel]; + DAC960_Command_T *Command = Controller->Commands[Channel]; DAC960_SCSI_Inquiry_UnitSerialNumber_T *InquiryUnitSerialNumber = - &Controller->InquiryUnitSerialNumber[Channel][TargetID]; + &Controller->V1.InquiryUnitSerialNumber[Channel][TargetID]; InquiryUnitSerialNumber->PeripheralDeviceType = 0x1F; Semaphore = &Semaphores[Channel]; down(Semaphore); - if (Command->CommandStatus != DAC960_NormalCompletion) continue; + if (Command->V1.CommandStatus != DAC960_V1_NormalCompletion) + continue; Command->Semaphore = Semaphore; DCDB = &DCDBs[Channel]; DCDB->TransferLength = sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T); @@ -988,108 +1398,216 @@ DAC960_ReleaseControllerLock(Controller, &ProcessorFlags); down(Semaphore); } + } + return true; +} + + +/* + DAC960_V2_ReadDeviceConfiguration reads the Device Configuration Information + for DAC960 V2 Firmware Controllers by requesting the Physical Device + Information and SCSI Inquiry Unit Serial Number information for each + device connected to Controller. +*/ + +static boolean DAC960_V2_ReadDeviceConfiguration(DAC960_Controller_T + *Controller) +{ + unsigned char Channel = 0, TargetID = 0, LogicalUnit = 0; + unsigned short PhysicalDeviceIndex = 0; + while (true) + { + DAC960_V2_PhysicalDeviceInfo_T *NewPhysicalDeviceInfo = + &Controller->V2.NewPhysicalDeviceInformation; + DAC960_V2_PhysicalDeviceInfo_T *PhysicalDeviceInfo; + DAC960_SCSI_Inquiry_UnitSerialNumber_T *InquiryUnitSerialNumber; + DAC960_Command_T *Command; + DAC960_V2_CommandMailbox_T *CommandMailbox; + if (!DAC960_V2_PhysicalDeviceInfo(Controller, + DAC960_V2_GetPhysicalDeviceInfoValid, + Channel, + TargetID, + LogicalUnit, + NewPhysicalDeviceInfo, + sizeof(DAC960_V2_PhysicalDeviceInfo_T))) + break; + Channel = NewPhysicalDeviceInfo->Channel; + TargetID = NewPhysicalDeviceInfo->TargetID; + LogicalUnit = NewPhysicalDeviceInfo->LogicalUnit; + PhysicalDeviceInfo = (DAC960_V2_PhysicalDeviceInfo_T *) + kmalloc(sizeof(DAC960_V2_PhysicalDeviceInfo_T), GFP_ATOMIC); + if (PhysicalDeviceInfo == NULL) + return DAC960_Failure(Controller, "PHYSICAL DEVICE ALLOCATION"); + Controller->V2.PhysicalDeviceInformation[PhysicalDeviceIndex] = + PhysicalDeviceInfo; + memcpy(PhysicalDeviceInfo, NewPhysicalDeviceInfo, + sizeof(DAC960_V2_PhysicalDeviceInfo_T)); + InquiryUnitSerialNumber = (DAC960_SCSI_Inquiry_UnitSerialNumber_T *) + kmalloc(sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T), GFP_ATOMIC); + if (InquiryUnitSerialNumber == NULL) + return DAC960_Failure(Controller, "SERIAL NUMBER ALLOCATION"); + Controller->V2.InquiryUnitSerialNumber[PhysicalDeviceIndex] = + InquiryUnitSerialNumber; + memset(InquiryUnitSerialNumber, 0, + sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T)); + InquiryUnitSerialNumber->PeripheralDeviceType = 0x1F; + Command = DAC960_AllocateCommand(Controller); + CommandMailbox = &Command->V2.CommandMailbox; + DAC960_V2_ClearCommand(Command); + Command->CommandType = DAC960_ImmediateCommand; + CommandMailbox->SCSI_10.CommandOpcode = DAC960_V2_SCSI_10_Passthru; + CommandMailbox->SCSI_10.CommandControlBits + .DataTransferControllerToHost = true; + CommandMailbox->SCSI_10.CommandControlBits + .NoAutoRequestSense = true; + CommandMailbox->SCSI_10.DataTransferSize = + sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T); + CommandMailbox->SCSI_10.PhysicalDevice.LogicalUnit = LogicalUnit; + CommandMailbox->SCSI_10.PhysicalDevice.TargetID = TargetID; + CommandMailbox->SCSI_10.PhysicalDevice.Channel = Channel; + CommandMailbox->SCSI_10.CDBLength = 6; + CommandMailbox->SCSI_10.SCSI_CDB[0] = 0x12; /* INQUIRY */ + CommandMailbox->SCSI_10.SCSI_CDB[1] = 1; /* EVPD = 1 */ + CommandMailbox->SCSI_10.SCSI_CDB[2] = 0x80; /* Page Code */ + CommandMailbox->SCSI_10.SCSI_CDB[3] = 0; /* Reserved */ + CommandMailbox->SCSI_10.SCSI_CDB[4] = + sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T); + CommandMailbox->SCSI_10.SCSI_CDB[5] = 0; /* Control */ + CommandMailbox->SCSI_10.DataTransferMemoryAddress + .ScatterGatherSegments[0] + .SegmentDataPointer = + Virtual_to_Bus(InquiryUnitSerialNumber); + CommandMailbox->SCSI_10.DataTransferMemoryAddress + .ScatterGatherSegments[0] + .SegmentByteCount = + CommandMailbox->SCSI_10.DataTransferSize; + DAC960_ExecuteCommand(Command); + DAC960_DeallocateCommand(Command); + PhysicalDeviceIndex++; + LogicalUnit++; + } + return true; +} + + +/* + DAC960_SanitizeInquiryData sanitizes the Vendor, Model, Revision, and + Product Serial Number fields of the Inquiry Standard Data and Inquiry + Unit Serial Number structures. +*/ + +static void DAC960_SanitizeInquiryData(DAC960_SCSI_Inquiry_T + *InquiryStandardData, + DAC960_SCSI_Inquiry_UnitSerialNumber_T + *InquiryUnitSerialNumber, + unsigned char *Vendor, + unsigned char *Model, + unsigned char *Revision, + unsigned char *SerialNumber) +{ + int SerialNumberLength, i; + if (InquiryStandardData->PeripheralDeviceType == 0x1F) return; + for (i = 0; i < sizeof(InquiryStandardData->VendorIdentification); i++) + { + unsigned char VendorCharacter = + InquiryStandardData->VendorIdentification[i]; + Vendor[i] = (VendorCharacter >= ' ' && VendorCharacter <= '~' + ? VendorCharacter : ' '); + } + Vendor[sizeof(InquiryStandardData->VendorIdentification)] = '\0'; + for (i = 0; i < sizeof(InquiryStandardData->ProductIdentification); i++) + { + unsigned char ModelCharacter = + InquiryStandardData->ProductIdentification[i]; + Model[i] = (ModelCharacter >= ' ' && ModelCharacter <= '~' + ? ModelCharacter : ' '); } - return true; + Model[sizeof(InquiryStandardData->ProductIdentification)] = '\0'; + for (i = 0; i < sizeof(InquiryStandardData->ProductRevisionLevel); i++) + { + unsigned char RevisionCharacter = + InquiryStandardData->ProductRevisionLevel[i]; + Revision[i] = (RevisionCharacter >= ' ' && RevisionCharacter <= '~' + ? RevisionCharacter : ' '); + } + Revision[sizeof(InquiryStandardData->ProductRevisionLevel)] = '\0'; + if (InquiryUnitSerialNumber->PeripheralDeviceType == 0x1F) return; + SerialNumberLength = InquiryUnitSerialNumber->PageLength; + if (SerialNumberLength > + sizeof(InquiryUnitSerialNumber->ProductSerialNumber)) + SerialNumberLength = sizeof(InquiryUnitSerialNumber->ProductSerialNumber); + for (i = 0; i < SerialNumberLength; i++) + { + unsigned char SerialNumberCharacter = + InquiryUnitSerialNumber->ProductSerialNumber[i]; + SerialNumber[i] = + (SerialNumberCharacter >= ' ' && SerialNumberCharacter <= '~' + ? SerialNumberCharacter : ' '); + } + SerialNumber[SerialNumberLength] = '\0'; } /* - DAC960_ReportDeviceConfiguration reports the Device Configuration Information - of Controller. + DAC960_V1_ReportDeviceConfiguration reports the Device Configuration + Information for DAC960 V1 Firmware Controllers. */ -static boolean DAC960_ReportDeviceConfiguration(DAC960_Controller_T *Controller) +static boolean DAC960_V1_ReportDeviceConfiguration(DAC960_Controller_T + *Controller) { int LogicalDriveNumber, Channel, TargetID; DAC960_Info(" Physical Devices:\n", Controller); for (Channel = 0; Channel < Controller->Channels; Channel++) - for (TargetID = 0; TargetID < DAC960_MaxTargets; TargetID++) + for (TargetID = 0; TargetID < Controller->Targets; TargetID++) { DAC960_SCSI_Inquiry_T *InquiryStandardData = - &Controller->InquiryStandardData[Channel][TargetID]; + &Controller->V1.InquiryStandardData[Channel][TargetID]; DAC960_SCSI_Inquiry_UnitSerialNumber_T *InquiryUnitSerialNumber = - &Controller->InquiryUnitSerialNumber[Channel][TargetID]; - DAC960_DeviceState_T *DeviceState = - &Controller->DeviceState[Controller->DeviceStateIndex] - [Channel][TargetID]; - DAC960_ErrorTable_T *ErrorTable = - &Controller->ErrorTable[Controller->ErrorTableIndex]; - DAC960_ErrorTableEntry_T *ErrorEntry = - &ErrorTable->ErrorTableEntries[Channel][TargetID]; + &Controller->V1.InquiryUnitSerialNumber[Channel][TargetID]; + DAC960_V1_DeviceState_T *DeviceState = + &Controller->V1.DeviceState[Channel][TargetID]; + DAC960_V1_ErrorTableEntry_T *ErrorEntry = + &Controller->V1.ErrorTable.ErrorTableEntries[Channel][TargetID]; char Vendor[1+sizeof(InquiryStandardData->VendorIdentification)]; char Model[1+sizeof(InquiryStandardData->ProductIdentification)]; char Revision[1+sizeof(InquiryStandardData->ProductRevisionLevel)]; char SerialNumber[1+sizeof(InquiryUnitSerialNumber ->ProductSerialNumber)]; - int i; if (InquiryStandardData->PeripheralDeviceType == 0x1F) continue; - for (i = 0; i < sizeof(Vendor)-1; i++) - { - unsigned char VendorCharacter = - InquiryStandardData->VendorIdentification[i]; - Vendor[i] = (VendorCharacter >= ' ' && VendorCharacter <= '~' - ? VendorCharacter : ' '); - } - Vendor[sizeof(Vendor)-1] = '\0'; - for (i = 0; i < sizeof(Model)-1; i++) - { - unsigned char ModelCharacter = - InquiryStandardData->ProductIdentification[i]; - Model[i] = (ModelCharacter >= ' ' && ModelCharacter <= '~' - ? ModelCharacter : ' '); - } - Model[sizeof(Model)-1] = '\0'; - for (i = 0; i < sizeof(Revision)-1; i++) - { - unsigned char RevisionCharacter = - InquiryStandardData->ProductRevisionLevel[i]; - Revision[i] = (RevisionCharacter >= ' ' && RevisionCharacter <= '~' - ? RevisionCharacter : ' '); - } - Revision[sizeof(Revision)-1] = '\0'; + DAC960_SanitizeInquiryData(InquiryStandardData, InquiryUnitSerialNumber, + Vendor, Model, Revision, SerialNumber); DAC960_Info(" %d:%d%s Vendor: %s Model: %s Revision: %s\n", Controller, Channel, TargetID, (TargetID < 10 ? " " : ""), Vendor, Model, Revision); if (InquiryUnitSerialNumber->PeripheralDeviceType != 0x1F) - { - int SerialNumberLength = InquiryUnitSerialNumber->PageLength; - if (SerialNumberLength > - sizeof(InquiryUnitSerialNumber->ProductSerialNumber)) - SerialNumberLength = - sizeof(InquiryUnitSerialNumber->ProductSerialNumber); - for (i = 0; i < SerialNumberLength; i++) - { - unsigned char SerialNumberCharacter = - InquiryUnitSerialNumber->ProductSerialNumber[i]; - SerialNumber[i] = - (SerialNumberCharacter >= ' ' && SerialNumberCharacter <= '~' - ? SerialNumberCharacter : ' '); - } - SerialNumber[SerialNumberLength] = '\0'; - DAC960_Info(" Serial Number: %s\n", - Controller, SerialNumber); - } - if (DeviceState->Present && DeviceState->DeviceType == DAC960_DiskType) + DAC960_Info(" Serial Number: %s\n", Controller, SerialNumber); + if (DeviceState->Present && + DeviceState->DeviceType == DAC960_V1_DiskType) { - if (Controller->DeviceResetCount[Channel][TargetID] > 0) + if (Controller->V1.DeviceResetCount[Channel][TargetID] > 0) DAC960_Info(" Disk Status: %s, %d blocks, %d resets\n", Controller, - (DeviceState->DeviceState == DAC960_Device_Dead + (DeviceState->DeviceState == DAC960_V1_Device_Dead ? "Dead" - : DeviceState->DeviceState == DAC960_Device_WriteOnly - ? "Write-Only" - : DeviceState->DeviceState == DAC960_Device_Online - ? "Online" : "Standby"), + : DeviceState->DeviceState + == DAC960_V1_Device_WriteOnly + ? "Write-Only" + : DeviceState->DeviceState + == DAC960_V1_Device_Online + ? "Online" : "Standby"), DeviceState->DiskSize, - Controller->DeviceResetCount[Channel][TargetID]); + Controller->V1.DeviceResetCount[Channel][TargetID]); else DAC960_Info(" Disk Status: %s, %d blocks\n", Controller, - (DeviceState->DeviceState == DAC960_Device_Dead + (DeviceState->DeviceState == DAC960_V1_Device_Dead ? "Dead" - : DeviceState->DeviceState == DAC960_Device_WriteOnly - ? "Write-Only" - : DeviceState->DeviceState == DAC960_Device_Online - ? "Online" : "Standby"), + : DeviceState->DeviceState + == DAC960_V1_Device_WriteOnly + ? "Write-Only" + : DeviceState->DeviceState + == DAC960_V1_Device_Online + ? "Online" : "Standby"), DeviceState->DiskSize); } if (ErrorEntry->ParityErrorCount > 0 || @@ -1108,17 +1626,16 @@ LogicalDriveNumber < Controller->LogicalDriveCount; LogicalDriveNumber++) { - DAC960_LogicalDriveInformation_T *LogicalDriveInformation = - &Controller->LogicalDriveInformation - [Controller->LogicalDriveInformationIndex][LogicalDriveNumber]; + DAC960_V1_LogicalDriveInformation_T *LogicalDriveInformation = + &Controller->V1.LogicalDriveInformation[LogicalDriveNumber]; DAC960_Info(" /dev/rd/c%dd%d: RAID-%d, %s, %d blocks, %s\n", Controller, Controller->ControllerNumber, LogicalDriveNumber, LogicalDriveInformation->RAIDLevel, - (LogicalDriveInformation->LogicalDriveState == - DAC960_LogicalDrive_Online + (LogicalDriveInformation->LogicalDriveState + == DAC960_V1_LogicalDrive_Online ? "Online" - : LogicalDriveInformation->LogicalDriveState == - DAC960_LogicalDrive_Critical + : LogicalDriveInformation->LogicalDriveState + == DAC960_V1_LogicalDrive_Critical ? "Critical" : "Offline"), LogicalDriveInformation->LogicalDriveSize, (LogicalDriveInformation->WriteBack @@ -1129,6 +1646,179 @@ /* + DAC960_V2_ReportDeviceConfiguration reports the Device Configuration + Information for DAC960 V2 Firmware Controllers. +*/ + +static boolean DAC960_V2_ReportDeviceConfiguration(DAC960_Controller_T + *Controller) +{ + int PhysicalDeviceIndex, LogicalDriveNumber; + DAC960_Info(" Physical Devices:\n", Controller); + for (PhysicalDeviceIndex = 0; + PhysicalDeviceIndex < DAC960_V2_MaxPhysicalDevices; + PhysicalDeviceIndex++) + { + DAC960_V2_PhysicalDeviceInfo_T *PhysicalDeviceInfo = + Controller->V2.PhysicalDeviceInformation[PhysicalDeviceIndex]; + DAC960_SCSI_Inquiry_T *InquiryStandardData = + (DAC960_SCSI_Inquiry_T *) &PhysicalDeviceInfo->SCSI_InquiryData; + DAC960_SCSI_Inquiry_UnitSerialNumber_T *InquiryUnitSerialNumber = + Controller->V2.InquiryUnitSerialNumber[PhysicalDeviceIndex]; + char Vendor[1+sizeof(InquiryStandardData->VendorIdentification)]; + char Model[1+sizeof(InquiryStandardData->ProductIdentification)]; + char Revision[1+sizeof(InquiryStandardData->ProductRevisionLevel)]; + char SerialNumber[1+sizeof(InquiryUnitSerialNumber->ProductSerialNumber)]; + if (PhysicalDeviceInfo == NULL) break; + DAC960_SanitizeInquiryData(InquiryStandardData, InquiryUnitSerialNumber, + Vendor, Model, Revision, SerialNumber); + DAC960_Info(" %d:%d%s Vendor: %s Model: %s Revision: %s\n", + Controller, + PhysicalDeviceInfo->Channel, + PhysicalDeviceInfo->TargetID, + (PhysicalDeviceInfo->TargetID < 10 ? " " : ""), + Vendor, Model, Revision); + if (PhysicalDeviceInfo->NegotiatedSynchronousMegaTransfers == 0) + DAC960_Info(" %sAsynchronous\n", Controller, + (PhysicalDeviceInfo->NegotiatedDataWidthBits == 16 + ? "Wide " :"")); + else + DAC960_Info(" %sSynchronous at %d MB/sec\n", Controller, + (PhysicalDeviceInfo->NegotiatedDataWidthBits == 16 + ? "Wide " :""), + (PhysicalDeviceInfo->NegotiatedSynchronousMegaTransfers + * (PhysicalDeviceInfo->NegotiatedDataWidthBits == 16 + ? 2 : 1))); + if (InquiryUnitSerialNumber->PeripheralDeviceType != 0x1F) + DAC960_Info(" Serial Number: %s\n", Controller, SerialNumber); + if (PhysicalDeviceInfo->PhysicalDeviceState == + DAC960_V2_Device_Unconfigured) + continue; + DAC960_Info(" Disk Status: %s, %d blocks\n", Controller, + (PhysicalDeviceInfo->PhysicalDeviceState + == DAC960_V2_Device_Online + ? "Online" + : PhysicalDeviceInfo->PhysicalDeviceState + == DAC960_V2_Device_WriteOnly + ? "Write-Only" + : PhysicalDeviceInfo->PhysicalDeviceState + == DAC960_V2_Device_Dead + ? "Dead" : "Standby"), + PhysicalDeviceInfo + ->ConfigurableDeviceSizeIn512ByteBlocksOrMB); + if (PhysicalDeviceInfo->ParityErrors == 0 && + PhysicalDeviceInfo->SoftErrors == 0 && + PhysicalDeviceInfo->HardErrors == 0 && + PhysicalDeviceInfo->MiscellaneousErrors == 0 && + PhysicalDeviceInfo->CommandTimeouts == 0 && + PhysicalDeviceInfo->Retries == 0 && + PhysicalDeviceInfo->Aborts == 0 && + PhysicalDeviceInfo->PredictedFailuresDetected == 0) + continue; + DAC960_Info(" Errors - Parity: %d, Soft: %d, " + "Hard: %d, Misc: %d\n", Controller, + PhysicalDeviceInfo->ParityErrors, + PhysicalDeviceInfo->SoftErrors, + PhysicalDeviceInfo->HardErrors, + PhysicalDeviceInfo->MiscellaneousErrors); + DAC960_Info(" Timeouts: %d, Retries: %d, " + "Aborts: %d, Predicted: %d\n", Controller, + PhysicalDeviceInfo->CommandTimeouts, + PhysicalDeviceInfo->Retries, + PhysicalDeviceInfo->Aborts, + PhysicalDeviceInfo->PredictedFailuresDetected); + } + DAC960_Info(" Logical Drives:\n", Controller); + for (LogicalDriveNumber = 0; + LogicalDriveNumber < DAC960_MaxLogicalDrives; + LogicalDriveNumber++) + { + DAC960_V2_LogicalDeviceInfo_T *LogicalDeviceInfo = + Controller->V2.LogicalDeviceInformation[LogicalDriveNumber]; + unsigned char *ReadCacheStatus[] = { "Read Cache Disabled", + "Read Cache Enabled", + "Read Ahead Enabled", + "Intelligent Read Ahead Enabled", + "-", "-", "-", "-" }; + unsigned char *WriteCacheStatus[] = { "Write Cache Disabled", + "Logical Device Read Only", + "Write Cache Enabled", + "Intelligent Write Cache Enabled", + "-", "-", "-", "-" }; + unsigned char *GeometryTranslation; + if (LogicalDeviceInfo == NULL) continue; + switch(LogicalDeviceInfo->DriveGeometry) + { + case DAC960_V2_Geometry_128_32: + GeometryTranslation = "128/32"; + break; + case DAC960_V2_Geometry_255_63: + GeometryTranslation = "255/63"; + break; + default: + GeometryTranslation = "Invalid"; + DAC960_Error("Illegal Logical Device Geometry %d\n", + Controller, LogicalDeviceInfo->DriveGeometry); + break; + } + DAC960_Info(" /dev/rd/c%dd%d: RAID-%d, %s, %d blocks\n", + Controller, Controller->ControllerNumber, LogicalDriveNumber, + LogicalDeviceInfo->RAIDLevel, + (LogicalDeviceInfo->LogicalDeviceState + == DAC960_V2_LogicalDevice_Online + ? "Online" + : LogicalDeviceInfo->LogicalDeviceState + == DAC960_V2_LogicalDevice_Critical + ? "Critical" : "Offline"), + LogicalDeviceInfo->ConfigurableDeviceSizeIn512ByteBlocksOrMB); + DAC960_Info(" Logical Device %s, BIOS Geometry: %s\n", + Controller, + (LogicalDeviceInfo->LogicalDeviceControl + .LogicalDeviceInitialized + ? "Initialized" : "Uninitialized"), + GeometryTranslation); + if (LogicalDeviceInfo->StripeSize == 0) + { + if (LogicalDeviceInfo->CacheLineSize == 0) + DAC960_Info(" Stripe Size: N/A, " + "Segment Size: N/A\n", Controller); + else + DAC960_Info(" Stripe Size: N/A, " + "Segment Size: %dKB\n", Controller, + 1 << (LogicalDeviceInfo->CacheLineSize - 2)); + } + else + { + if (LogicalDeviceInfo->CacheLineSize == 0) + DAC960_Info(" Stripe Size: %dKB, " + "Segment Size: N/A\n", Controller, + 1 << (LogicalDeviceInfo->StripeSize - 2)); + else + DAC960_Info(" Stripe Size: %dKB, " + "Segment Size: %dKB\n", Controller, + 1 << (LogicalDeviceInfo->StripeSize - 2), + 1 << (LogicalDeviceInfo->CacheLineSize - 2)); + } + DAC960_Info(" %s, %s\n", Controller, + ReadCacheStatus[ + LogicalDeviceInfo->LogicalDeviceControl.ReadCache], + WriteCacheStatus[ + LogicalDeviceInfo->LogicalDeviceControl.WriteCache]); + if (LogicalDeviceInfo->SoftErrors > 0 || + LogicalDeviceInfo->CommandsFailed > 0 || + LogicalDeviceInfo->DeferredWriteErrors) + DAC960_Info(" Errors - Soft: %d, Failed: %d, " + "Deferred Write: %d\n", Controller, + LogicalDeviceInfo->SoftErrors, + LogicalDeviceInfo->CommandsFailed, + LogicalDeviceInfo->DeferredWriteErrors); + + } + return true; +} + + +/* DAC960_RegisterBlockDevice registers the Block Device structures associated with Controller. */ @@ -1167,7 +1857,7 @@ Controller->MaxSectorsPerRequest[MinorNumber] = Controller->MaxBlocksPerCommand; Controller->MaxSegmentsPerRequest[MinorNumber] = - Controller->MaxScatterGatherSegments; + Controller->DriverScatterGatherLimit; } Controller->GenericDiskInfo.part = Controller->DiskPartitions; Controller->GenericDiskInfo.sizes = Controller->PartitionSizes; @@ -1250,37 +1940,485 @@ /* - DAC960_InitializeController initializes Controller. + DAC960_GenericDiskInit is the Generic Disk Information Initialization + Function for the DAC960 Driver. */ -static void DAC960_InitializeController(DAC960_Controller_T *Controller) +static void DAC960_InitializeGenericDiskInfo(GenericDiskInfo_T *GenericDiskInfo) { - if (DAC960_ReadControllerConfiguration(Controller) && - DAC960_ReportControllerConfiguration(Controller) && - DAC960_ReadDeviceConfiguration(Controller) && - DAC960_ReportDeviceConfiguration(Controller) && - DAC960_RegisterBlockDevice(Controller)) - { - /* - Initialize the Command structures. - */ - DAC960_Command_T *Commands = Controller->Commands; - int CommandIdentifier; - Controller->FreeCommands = NULL; - for (CommandIdentifier = 0; - CommandIdentifier < Controller->DriverQueueDepth; - CommandIdentifier++) - { - Commands[CommandIdentifier].Controller = Controller; - Commands[CommandIdentifier].Next = Controller->FreeCommands; - Controller->FreeCommands = &Commands[CommandIdentifier]; - } - /* - Initialize the Monitoring Timer. - */ - init_timer(&Controller->MonitoringTimer); - Controller->MonitoringTimer.expires = - jiffies + DAC960_MonitoringTimerInterval; + DAC960_Controller_T *Controller = + (DAC960_Controller_T *) GenericDiskInfo->real_devices; + int LogicalDriveNumber; + if (Controller->FirmwareType == DAC960_V1_Controller) + for (LogicalDriveNumber = 0; + LogicalDriveNumber < Controller->LogicalDriveCount; + LogicalDriveNumber++) + GenericDiskInfo->part[DAC960_MinorNumber(LogicalDriveNumber, 0)] + .nr_sects = + Controller->V1.LogicalDriveInformation + [LogicalDriveNumber].LogicalDriveSize; + else + for (LogicalDriveNumber = 0; + LogicalDriveNumber < DAC960_MaxLogicalDrives; + LogicalDriveNumber++) + { + DAC960_V2_LogicalDeviceInfo_T *LogicalDeviceInfo = + Controller->V2.LogicalDeviceInformation[LogicalDriveNumber]; + if (LogicalDeviceInfo != NULL) + GenericDiskInfo->part[DAC960_MinorNumber(LogicalDriveNumber, 0)] + .nr_sects = + LogicalDeviceInfo->ConfigurableDeviceSizeIn512ByteBlocksOrMB; + } +} + + +/* + DAC960_ReportErrorStatus reports Controller BIOS Messages passed through + the Error Status Register when the driver performs the BIOS handshaking. + It returns true for fatal errors and false otherwise. +*/ + +static boolean DAC960_ReportErrorStatus(DAC960_Controller_T *Controller, + unsigned char ErrorStatus, + unsigned char Parameter0, + unsigned char Parameter1) +{ + switch (ErrorStatus) + { + case 0x00: + DAC960_Notice("Physical Device %d:%d Not Responding\n", + Controller, Parameter1, Parameter0); + break; + case 0x08: + if (Controller->DriveSpinUpMessageDisplayed) break; + DAC960_Notice("Spinning Up Drives\n", Controller); + Controller->DriveSpinUpMessageDisplayed = true; + break; + case 0x30: + DAC960_Notice("Configuration Checksum Error\n", Controller); + break; + case 0x60: + DAC960_Notice("Mirror Race Recovery Failed\n", Controller); + break; + case 0x70: + DAC960_Notice("Mirror Race Recovery In Progress\n", Controller); + break; + case 0x90: + DAC960_Notice("Physical Device %d:%d COD Mismatch\n", + Controller, Parameter1, Parameter0); + break; + case 0xA0: + DAC960_Notice("Logical Drive Installation Aborted\n", Controller); + break; + case 0xB0: + DAC960_Notice("Mirror Race On A Critical Logical Drive\n", Controller); + break; + case 0xD0: + DAC960_Notice("New Controller Configuration Found\n", Controller); + break; + case 0xF0: + DAC960_Error("Fatal Memory Parity Error for Controller at\n", Controller); + return true; + default: + DAC960_Error("Unknown Initialization Error %02X for Controller at\n", + Controller, ErrorStatus); + return true; + } + return false; +} + + +/* + DAC960_DetectControllers detects Mylex DAC960/AcceleRAID/eXtremeRAID + PCI RAID Controllers by interrogating the PCI Configuration Space for + Controller Type. +*/ + +static void DAC960_DetectControllers(DAC960_HardwareType_T HardwareType) +{ + void (*InterruptHandler)(int, void *, Registers_T *) = NULL; + DAC960_FirmwareType_T FirmwareType = 0; + unsigned short VendorID = 0, DeviceID = 0; + unsigned int MemoryWindowSize = 0; + PCI_Device_T *PCI_Device = NULL; + switch (HardwareType) + { + case DAC960_BA_Controller: + VendorID = PCI_VENDOR_ID_MYLEX; + DeviceID = PCI_DEVICE_ID_MYLEX_DAC960_BA; + FirmwareType = DAC960_V2_Controller; + InterruptHandler = DAC960_BA_InterruptHandler; + MemoryWindowSize = DAC960_BA_RegisterWindowSize; + break; + case DAC960_LP_Controller: + VendorID = PCI_VENDOR_ID_MYLEX; + DeviceID = PCI_DEVICE_ID_MYLEX_DAC960_LP; + FirmwareType = DAC960_LP_Controller; + InterruptHandler = DAC960_LP_InterruptHandler; + MemoryWindowSize = DAC960_LP_RegisterWindowSize; + break; + case DAC960_LA_Controller: + VendorID = PCI_VENDOR_ID_DEC; + DeviceID = PCI_DEVICE_ID_DEC_21285; + FirmwareType = DAC960_V1_Controller; + InterruptHandler = DAC960_LA_InterruptHandler; + MemoryWindowSize = DAC960_LA_RegisterWindowSize; + break; + case DAC960_PG_Controller: + VendorID = PCI_VENDOR_ID_MYLEX; + DeviceID = PCI_DEVICE_ID_MYLEX_DAC960_PG; + FirmwareType = DAC960_V1_Controller; + InterruptHandler = DAC960_PG_InterruptHandler; + MemoryWindowSize = DAC960_PG_RegisterWindowSize; + break; + case DAC960_PD_Controller: + VendorID = PCI_VENDOR_ID_MYLEX; + DeviceID = PCI_DEVICE_ID_MYLEX_DAC960_PD; + FirmwareType = DAC960_V1_Controller; + InterruptHandler = DAC960_PD_InterruptHandler; + MemoryWindowSize = DAC960_PD_RegisterWindowSize; + break; + } + while ((PCI_Device = pci_find_device(VendorID, DeviceID, PCI_Device)) != NULL) + { + DAC960_Controller_T *Controller = NULL; + DAC960_IO_Address_T IO_Address = 0; + DAC960_PCI_Address_T PCI_Address = 0; + unsigned char Bus = PCI_Device->bus->number; + unsigned char DeviceFunction = PCI_Device->devfn; + unsigned char Device = DeviceFunction >> 3; + unsigned char Function = DeviceFunction & 0x7; + unsigned char ErrorStatus, Parameter0, Parameter1; + unsigned int IRQ_Channel = PCI_Device->irq; + unsigned long BaseAddress0 = PCI_Device->base_address[0]; + unsigned long BaseAddress1 = PCI_Device->base_address[1]; + unsigned short SubsystemVendorID, SubsystemDeviceID; + void *BaseAddress; + pci_read_config_word(PCI_Device, PCI_SUBSYSTEM_VENDOR_ID, + &SubsystemVendorID); + pci_read_config_word(PCI_Device, PCI_SUBSYSTEM_ID, + &SubsystemDeviceID); + switch (HardwareType) + { + case DAC960_BA_Controller: + PCI_Address = BaseAddress0 & PCI_BASE_ADDRESS_MEM_MASK; + break; + case DAC960_LP_Controller: + PCI_Address = BaseAddress0 & PCI_BASE_ADDRESS_MEM_MASK; + break; + case DAC960_LA_Controller: + if (!(SubsystemVendorID == PCI_VENDOR_ID_MYLEX && + SubsystemDeviceID == PCI_DEVICE_ID_MYLEX_DAC960_LA)) + continue; + PCI_Address = BaseAddress0 & PCI_BASE_ADDRESS_MEM_MASK; + break; + case DAC960_PG_Controller: + PCI_Address = BaseAddress0 & PCI_BASE_ADDRESS_MEM_MASK; + break; + case DAC960_PD_Controller: + IO_Address = BaseAddress0 & PCI_BASE_ADDRESS_IO_MASK; + PCI_Address = BaseAddress1 & PCI_BASE_ADDRESS_MEM_MASK; + break; + } + if (DAC960_ControllerCount == DAC960_MaxControllers) + { + DAC960_Error("More than %d DAC960 Controllers detected - " + "ignoring from Controller at\n", + NULL, DAC960_MaxControllers); + goto Failure; + } + Controller = (DAC960_Controller_T *) + kmalloc(sizeof(DAC960_Controller_T), GFP_ATOMIC); + if (Controller == NULL) + { + DAC960_Error("Unable to allocate Controller structure for " + "Controller at\n", NULL); + goto Failure; + } + memset(Controller, 0, sizeof(DAC960_Controller_T)); + Controller->ControllerNumber = DAC960_ControllerCount; + DAC960_Controllers[DAC960_ControllerCount++] = Controller; + DAC960_AnnounceDriver(Controller); + Controller->FirmwareType = FirmwareType; + Controller->HardwareType = HardwareType; + Controller->IO_Address = IO_Address; + Controller->PCI_Address = PCI_Address; + Controller->Bus = Bus; + Controller->Device = Device; + Controller->Function = Function; + sprintf(Controller->ControllerName, "c%d", Controller->ControllerNumber); + /* + Map the Controller Register Window. + */ + if (MemoryWindowSize < PAGE_SIZE) + MemoryWindowSize = PAGE_SIZE; + Controller->MemoryMappedAddress = + ioremap_nocache(PCI_Address & PAGE_MASK, MemoryWindowSize); + Controller->BaseAddress = + Controller->MemoryMappedAddress + (PCI_Address & ~PAGE_MASK); + if (Controller->MemoryMappedAddress == NULL) + { + DAC960_Error("Unable to map Controller Register Window for " + "Controller at\n", Controller); + goto Failure; + } + BaseAddress = Controller->BaseAddress; + switch (HardwareType) + { + case DAC960_BA_Controller: + DAC960_BA_DisableInterrupts(Controller->BaseAddress); + DAC960_BA_AcknowledgeHardwareMailboxStatus(BaseAddress); + udelay(1000); + while (DAC960_BA_InitializationInProgressP(BaseAddress)) + { + if (DAC960_BA_ReadErrorStatus(BaseAddress, &ErrorStatus, + &Parameter0, &Parameter1) && + DAC960_ReportErrorStatus(Controller, ErrorStatus, + Parameter0, Parameter1)) + goto Failure; + udelay(10); + } + if (!DAC960_V2_EnableMemoryMailboxInterface(Controller)) + { + DAC960_Error("Unable to Enable Memory Mailbox Interface " + "for Controller at\n", Controller); + goto Failure; + } + DAC960_BA_EnableInterrupts(Controller->BaseAddress); + Controller->QueueCommand = DAC960_BA_QueueCommand; + Controller->ReadControllerConfiguration = + DAC960_V2_ReadControllerConfiguration; + Controller->ReadDeviceConfiguration = + DAC960_V2_ReadDeviceConfiguration; + Controller->ReportDeviceConfiguration = + DAC960_V2_ReportDeviceConfiguration; + Controller->QueueReadWriteCommand = + DAC960_V2_QueueReadWriteCommand; + break; + case DAC960_LP_Controller: + DAC960_LP_DisableInterrupts(Controller->BaseAddress); + DAC960_LP_AcknowledgeHardwareMailboxStatus(BaseAddress); + udelay(1000); + while (DAC960_LP_InitializationInProgressP(BaseAddress)) + { + if (DAC960_LP_ReadErrorStatus(BaseAddress, &ErrorStatus, + &Parameter0, &Parameter1) && + DAC960_ReportErrorStatus(Controller, ErrorStatus, + Parameter0, Parameter1)) + goto Failure; + udelay(10); + } + if (!DAC960_V2_EnableMemoryMailboxInterface(Controller)) + { + DAC960_Error("Unable to Enable Memory Mailbox Interface " + "for Controller at\n", Controller); + goto Failure; + } + DAC960_LP_EnableInterrupts(Controller->BaseAddress); + Controller->QueueCommand = DAC960_LP_QueueCommand; + Controller->ReadControllerConfiguration = + DAC960_V2_ReadControllerConfiguration; + Controller->ReadDeviceConfiguration = + DAC960_V2_ReadDeviceConfiguration; + Controller->ReportDeviceConfiguration = + DAC960_V2_ReportDeviceConfiguration; + Controller->QueueReadWriteCommand = + DAC960_V2_QueueReadWriteCommand; + break; + case DAC960_LA_Controller: + DAC960_LA_DisableInterrupts(Controller->BaseAddress); + DAC960_LA_AcknowledgeHardwareMailboxStatus(BaseAddress); + udelay(1000); + while (DAC960_LA_InitializationInProgressP(BaseAddress)) + { + if (DAC960_LA_ReadErrorStatus(BaseAddress, &ErrorStatus, + &Parameter0, &Parameter1) && + DAC960_ReportErrorStatus(Controller, ErrorStatus, + Parameter0, Parameter1)) + goto Failure; + udelay(10); + } + if (!DAC960_V1_EnableMemoryMailboxInterface(Controller)) + { + DAC960_Error("Unable to Enable Memory Mailbox Interface " + "for Controller at\n", Controller); + goto Failure; + } + DAC960_LA_EnableInterrupts(Controller->BaseAddress); + if (Controller->V1.DualModeMemoryMailboxInterface) + Controller->QueueCommand = DAC960_LA_QueueCommandDualMode; + else Controller->QueueCommand = DAC960_LA_QueueCommandSingleMode; + Controller->ReadControllerConfiguration = + DAC960_V1_ReadControllerConfiguration; + Controller->ReadDeviceConfiguration = + DAC960_V1_ReadDeviceConfiguration; + Controller->ReportDeviceConfiguration = + DAC960_V1_ReportDeviceConfiguration; + Controller->QueueReadWriteCommand = + DAC960_V1_QueueReadWriteCommand; + break; + case DAC960_PG_Controller: + DAC960_PG_DisableInterrupts(Controller->BaseAddress); + DAC960_PG_AcknowledgeHardwareMailboxStatus(BaseAddress); + udelay(1000); + while (DAC960_PG_InitializationInProgressP(BaseAddress)) + { + if (DAC960_PG_ReadErrorStatus(BaseAddress, &ErrorStatus, + &Parameter0, &Parameter1) && + DAC960_ReportErrorStatus(Controller, ErrorStatus, + Parameter0, Parameter1)) + goto Failure; + udelay(10); + } + if (!DAC960_V1_EnableMemoryMailboxInterface(Controller)) + { + DAC960_Error("Unable to Enable Memory Mailbox Interface " + "for Controller at\n", Controller); + goto Failure; + } + DAC960_PG_EnableInterrupts(Controller->BaseAddress); + if (Controller->V1.DualModeMemoryMailboxInterface) + Controller->QueueCommand = DAC960_PG_QueueCommandDualMode; + else Controller->QueueCommand = DAC960_PG_QueueCommandSingleMode; + Controller->ReadControllerConfiguration = + DAC960_V1_ReadControllerConfiguration; + Controller->ReadDeviceConfiguration = + DAC960_V1_ReadDeviceConfiguration; + Controller->ReportDeviceConfiguration = + DAC960_V1_ReportDeviceConfiguration; + Controller->QueueReadWriteCommand = + DAC960_V1_QueueReadWriteCommand; + break; + case DAC960_PD_Controller: + request_region(Controller->IO_Address, 0x80, + Controller->FullModelName); + DAC960_PD_DisableInterrupts(BaseAddress); + DAC960_PD_AcknowledgeStatus(BaseAddress); + udelay(1000); + while (DAC960_PD_InitializationInProgressP(BaseAddress)) + { + if (DAC960_PD_ReadErrorStatus(BaseAddress, &ErrorStatus, + &Parameter0, &Parameter1) && + DAC960_ReportErrorStatus(Controller, ErrorStatus, + Parameter0, Parameter1)) + goto Failure; + udelay(10); + } + DAC960_PD_EnableInterrupts(Controller->BaseAddress); + Controller->QueueCommand = DAC960_PD_QueueCommand; + Controller->ReadControllerConfiguration = + DAC960_V1_ReadControllerConfiguration; + Controller->ReadDeviceConfiguration = + DAC960_V1_ReadDeviceConfiguration; + Controller->ReportDeviceConfiguration = + DAC960_V1_ReportDeviceConfiguration; + Controller->QueueReadWriteCommand = + DAC960_V1_QueueReadWriteCommand; + break; + } + /* + Acquire shared access to the IRQ Channel. + */ + if (IRQ_Channel == 0) + { + DAC960_Error("IRQ Channel %d illegal for Controller at\n", + Controller, IRQ_Channel); + goto Failure; + } + strcpy(Controller->FullModelName, "DAC960"); + if (request_irq(IRQ_Channel, InterruptHandler, SA_SHIRQ, + Controller->FullModelName, Controller) < 0) + { + DAC960_Error("Unable to acquire IRQ Channel %d for Controller at\n", + Controller, IRQ_Channel); + goto Failure; + } + Controller->IRQ_Channel = IRQ_Channel; + DAC960_ActiveControllerCount++; + Controller->InitialCommand.CommandIdentifier = 1; + Controller->InitialCommand.Controller = Controller; + Controller->Commands[0] = &Controller->InitialCommand; + Controller->FreeCommands = &Controller->InitialCommand; + Controller->ControllerDetectionSuccessful = true; + continue; + Failure: + if (IO_Address == 0) + DAC960_Error("PCI Bus %d Device %d Function %d I/O Address N/A " + "PCI Address 0x%X\n", Controller, + Bus, Device, Function, PCI_Address); + else DAC960_Error("PCI Bus %d Device %d Function %d I/O Address " + "0x%X PCI Address 0x%X\n", Controller, + Bus, Device, Function, IO_Address, PCI_Address); + if (Controller == NULL) break; + if (Controller->MemoryMappedAddress != NULL) + iounmap(Controller->MemoryMappedAddress); + if (Controller->IRQ_Channel > 0) + free_irq(IRQ_Channel, Controller); + } +} + + +/* + DAC960_SortControllers sorts the Controllers by PCI Bus and Device Number. +*/ + +static void DAC960_SortControllers(void) +{ + int ControllerNumber, LastInterchange, Bound, j; + LastInterchange = DAC960_ControllerCount-1; + while (LastInterchange > 0) + { + Bound = LastInterchange; + LastInterchange = 0; + for (j = 0; j < Bound; j++) + { + DAC960_Controller_T *Controller1 = DAC960_Controllers[j]; + DAC960_Controller_T *Controller2 = DAC960_Controllers[j+1]; + if (Controller1->Bus > Controller2->Bus || + (Controller1->Bus == Controller2->Bus && + (Controller1->Device > Controller2->Device))) + { + Controller2->ControllerNumber = j; + DAC960_Controllers[j] = Controller2; + Controller1->ControllerNumber = j+1; + DAC960_Controllers[j+1] = Controller1; + LastInterchange = j; + } + } + } + for (ControllerNumber = 0; + ControllerNumber < DAC960_ControllerCount; + ControllerNumber++) + { + DAC960_Controller_T *Controller = DAC960_Controllers[ControllerNumber]; + if (!Controller->ControllerDetectionSuccessful) + { + DAC960_Controllers[ControllerNumber] = NULL; + kfree(Controller); + } + } +} + + +/* + DAC960_InitializeController initializes Controller. +*/ + +static void DAC960_InitializeController(DAC960_Controller_T *Controller) +{ + if (DAC960_ReadControllerConfiguration(Controller) && + DAC960_ReportControllerConfiguration(Controller) && + DAC960_CreateAuxiliaryStructures(Controller) && + DAC960_ReadDeviceConfiguration(Controller) && + DAC960_ReportDeviceConfiguration(Controller) && + DAC960_RegisterBlockDevice(Controller)) + { + /* + Initialize the Monitoring Timer. + */ + init_timer(&Controller->MonitoringTimer); + Controller->MonitoringTimer.expires = + jiffies + DAC960_MonitoringTimerInterval; Controller->MonitoringTimer.data = (unsigned long) Controller; Controller->MonitoringTimer.function = DAC960_MonitoringTimerFunction; add_timer(&Controller->MonitoringTimer); @@ -1299,28 +2437,46 @@ if (Controller->ControllerInitialized) { del_timer(&Controller->MonitoringTimer); - DAC960_Notice("Flushing Cache...", Controller); - DAC960_ExecuteType3(Controller, DAC960_Flush, NULL); - DAC960_Notice("done\n", Controller); - switch (Controller->ControllerType) - { - case DAC960_V5_Controller: - if (!Controller->DualModeMemoryMailboxInterface) - DAC960_V5_SaveMemoryMailboxInfo(Controller); - break; - case DAC960_V4_Controller: - if (!Controller->DualModeMemoryMailboxInterface) - DAC960_V4_SaveMemoryMailboxInfo(Controller); - break; - case DAC960_V3_Controller: - break; + if (Controller->FirmwareType == DAC960_V1_Controller) + { + DAC960_Notice("Flushing Cache...", Controller); + DAC960_V1_ExecuteType3(Controller, DAC960_V1_Flush, NULL); + DAC960_Notice("done\n", Controller); + switch (Controller->HardwareType) + { + case DAC960_LA_Controller: + if (Controller->V1.DualModeMemoryMailboxInterface) + free_pages(Controller->MemoryMailboxPagesAddress, + Controller->MemoryMailboxPagesOrder); + else DAC960_LA_SaveMemoryMailboxInfo(Controller); + break; + case DAC960_PG_Controller: + if (Controller->V1.DualModeMemoryMailboxInterface) + free_pages(Controller->MemoryMailboxPagesAddress, + Controller->MemoryMailboxPagesOrder); + else DAC960_PG_SaveMemoryMailboxInfo(Controller); + break; + case DAC960_PD_Controller: + release_region(Controller->IO_Address, 0x80); + break; + default: + break; + } } + else + { + DAC960_Notice("Flushing Cache...", Controller); + DAC960_V2_DeviceOperation(Controller, DAC960_V2_PauseDevice, + DAC960_V2_RAID_Controller); + DAC960_Notice("done\n", Controller); + free_pages(Controller->MemoryMailboxPagesAddress, + Controller->MemoryMailboxPagesOrder); + } } free_irq(Controller->IRQ_Channel, Controller); iounmap(Controller->MemoryMappedAddress); - if (Controller->IO_Address > 0) - release_region(Controller->IO_Address, 0x80); DAC960_UnregisterBlockDevice(Controller); + DAC960_DestroyAuxiliaryStructures(Controller); DAC960_Controllers[Controller->ControllerNumber] = NULL; kfree(Controller); } @@ -1333,9 +2489,12 @@ void DAC960_Initialize(void) { int ControllerNumber; - DAC960_DetectControllers(DAC960_V5_Controller); - DAC960_DetectControllers(DAC960_V4_Controller); - DAC960_DetectControllers(DAC960_V3_Controller); + DAC960_DetectControllers(DAC960_BA_Controller); + DAC960_DetectControllers(DAC960_LP_Controller); + DAC960_DetectControllers(DAC960_LA_Controller); + DAC960_DetectControllers(DAC960_PG_Controller); + DAC960_DetectControllers(DAC960_PD_Controller); + DAC960_SortControllers(); if (DAC960_ActiveControllerCount == 0) return; for (ControllerNumber = 0; ControllerNumber < DAC960_ControllerCount; @@ -1371,68 +2530,38 @@ /* - DAC960_ProcessRequest attempts to remove one I/O Request from Controller's - I/O Request Queue and queues it to the Controller. WaitForCommand is true if - this function should wait for a Command to become available if necessary. - This function returns true if an I/O Request was queued and false otherwise. + DAC960_V1_QueueReadWriteCommand prepares and queues a Read/Write Command for + DAC960 V1 Firmware Controllers. */ -static boolean DAC960_ProcessRequest(DAC960_Controller_T *Controller, - boolean WaitForCommand) +static void DAC960_V1_QueueReadWriteCommand(DAC960_Command_T *Command) { - IO_Request_T **RequestQueuePointer = - &blk_dev[DAC960_MAJOR + Controller->ControllerNumber].current_request; - IO_Request_T *Request; - DAC960_Command_T *Command; - char *RequestBuffer; - while (true) - { - Request = *RequestQueuePointer; - if (Request == NULL || Request->rq_status == RQ_INACTIVE) return false; - Command = DAC960_AllocateCommand(Controller); - if (Command != NULL) break; - if (!WaitForCommand) return false; - DAC960_WaitForCommand(Controller); - } - DAC960_ClearCommand(Command); - if (Request->cmd == READ) - Command->CommandType = DAC960_ReadCommand; - else Command->CommandType = DAC960_WriteCommand; - Command->Semaphore = Request->sem; - Command->LogicalDriveNumber = DAC960_LogicalDriveNumber(Request->rq_dev); - Command->BlockNumber = - Request->sector - + Controller->GenericDiskInfo.part[MINOR(Request->rq_dev)].start_sect; - Command->BlockCount = Request->nr_sectors; - Command->SegmentCount = Request->nr_segments; - Command->BufferHeader = Request->bh; - RequestBuffer = Request->buffer; - Request->rq_status = RQ_INACTIVE; - *RequestQueuePointer = Request->next; - wake_up(&wait_for_request); + DAC960_Controller_T *Controller = Command->Controller; + DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox; + DAC960_V1_ClearCommand(Command); if (Command->SegmentCount == 1) { - DAC960_CommandMailbox_T *CommandMailbox = &Command->CommandMailbox; if (Command->CommandType == DAC960_ReadCommand) - CommandMailbox->Type5.CommandOpcode = DAC960_Read; - else CommandMailbox->Type5.CommandOpcode = DAC960_Write; + CommandMailbox->Type5.CommandOpcode = DAC960_V1_Read; + else CommandMailbox->Type5.CommandOpcode = DAC960_V1_Write; CommandMailbox->Type5.LD.TransferLength = Command->BlockCount; CommandMailbox->Type5.LD.LogicalDriveNumber = Command->LogicalDriveNumber; CommandMailbox->Type5.LogicalBlockAddress = Command->BlockNumber; - CommandMailbox->Type5.BusAddress = Virtual_to_Bus(RequestBuffer); + CommandMailbox->Type5.BusAddress = Virtual_to_Bus(Command->RequestBuffer); } else { - DAC960_CommandMailbox_T *CommandMailbox = &Command->CommandMailbox; - DAC960_ScatterGatherSegment_T - *ScatterGatherList = Command->ScatterGatherList; + DAC960_V1_ScatterGatherSegment_T + *ScatterGatherList = Command->V1.ScatterGatherList; BufferHeader_T *BufferHeader = Command->BufferHeader; char *LastDataEndPointer = NULL; int SegmentNumber = 0; if (Command->CommandType == DAC960_ReadCommand) - CommandMailbox->Type5.CommandOpcode = DAC960_ReadWithOldScatterGather; + CommandMailbox->Type5.CommandOpcode = + DAC960_V1_ReadWithOldScatterGather; else - CommandMailbox->Type5.CommandOpcode = DAC960_WriteWithOldScatterGather; + CommandMailbox->Type5.CommandOpcode = + DAC960_V1_WriteWithOldScatterGather; CommandMailbox->Type5.LD.TransferLength = Command->BlockCount; CommandMailbox->Type5.LD.LogicalDriveNumber = Command->LogicalDriveNumber; CommandMailbox->Type5.LogicalBlockAddress = Command->BlockNumber; @@ -1453,7 +2582,7 @@ ScatterGatherList[SegmentNumber].SegmentByteCount = BufferHeader->b_size; LastDataEndPointer = BufferHeader->b_data + BufferHeader->b_size; - if (SegmentNumber++ > Controller->MaxScatterGatherSegments) + if (SegmentNumber++ > Controller->DriverScatterGatherLimit) panic("DAC960: Scatter/Gather Segment Overflow\n"); } BufferHeader = BufferHeader->b_reqnext; @@ -1462,6 +2591,138 @@ panic("DAC960: SegmentNumber != SegmentCount\n"); } DAC960_QueueCommand(Command); +} + + +/* + DAC960_V2_QueueReadWriteCommand prepares and queues a Read/Write Command for + DAC960 V2 Firmware Controllers. +*/ + +static void DAC960_V2_QueueReadWriteCommand(DAC960_Command_T *Command) +{ + DAC960_Controller_T *Controller = Command->Controller; + DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox; + DAC960_V2_ClearCommand(Command); + CommandMailbox->SCSI_10.CommandOpcode = DAC960_V2_SCSI_10; + CommandMailbox->SCSI_10.CommandControlBits.DataTransferControllerToHost = + (Command->CommandType == DAC960_ReadCommand); + CommandMailbox->SCSI_10.DataTransferSize = + Command->BlockCount << DAC960_BlockSizeBits; + CommandMailbox->SCSI_10.RequestSenseBusAddress = + Virtual_to_Bus(&Command->V2.RequestSense); + CommandMailbox->SCSI_10.PhysicalDevice = + Controller->V2.LogicalDriveToVirtualDevice[Command->LogicalDriveNumber]; + CommandMailbox->SCSI_10.RequestSenseSize = + sizeof(DAC960_SCSI_RequestSense_T); + CommandMailbox->SCSI_10.CDBLength = 10; + CommandMailbox->SCSI_10.SCSI_CDB[0] = + (Command->CommandType == DAC960_ReadCommand ? 0x28 : 0x2A); + CommandMailbox->SCSI_10.SCSI_CDB[2] = Command->BlockNumber >> 24; + CommandMailbox->SCSI_10.SCSI_CDB[3] = Command->BlockNumber >> 16; + CommandMailbox->SCSI_10.SCSI_CDB[4] = Command->BlockNumber >> 8; + CommandMailbox->SCSI_10.SCSI_CDB[5] = Command->BlockNumber; + CommandMailbox->SCSI_10.SCSI_CDB[7] = Command->BlockCount >> 8; + CommandMailbox->SCSI_10.SCSI_CDB[8] = Command->BlockCount; + if (Command->SegmentCount == 1) + { + CommandMailbox->SCSI_10.DataTransferMemoryAddress + .ScatterGatherSegments[0] + .SegmentDataPointer = + Virtual_to_Bus(Command->RequestBuffer); + CommandMailbox->SCSI_10.DataTransferMemoryAddress + .ScatterGatherSegments[0] + .SegmentByteCount = + CommandMailbox->SCSI_10.DataTransferSize; + } + else + { + DAC960_V2_ScatterGatherSegment_T + *ScatterGatherList = Command->V2.ScatterGatherList; + BufferHeader_T *BufferHeader = Command->BufferHeader; + char *LastDataEndPointer = NULL; + int SegmentNumber = 0; + if (Command->SegmentCount > 2) + { + CommandMailbox->SCSI_10.CommandControlBits + .AdditionalScatterGatherListMemory = true; + CommandMailbox->SCSI_10.DataTransferMemoryAddress + .ExtendedScatterGather.ScatterGatherList0Length = + Command->SegmentCount; + CommandMailbox->SCSI_10.DataTransferMemoryAddress + .ExtendedScatterGather.ScatterGatherList0Address = + Virtual_to_Bus(ScatterGatherList); + } + else + ScatterGatherList = + CommandMailbox->SCSI_10.DataTransferMemoryAddress + .ScatterGatherSegments; + while (BufferHeader != NULL) + { + if (BufferHeader->b_data == LastDataEndPointer) + { + ScatterGatherList[SegmentNumber-1].SegmentByteCount += + BufferHeader->b_size; + LastDataEndPointer += BufferHeader->b_size; + } + else + { + ScatterGatherList[SegmentNumber].SegmentDataPointer = + Virtual_to_Bus(BufferHeader->b_data); + ScatterGatherList[SegmentNumber].SegmentByteCount = + BufferHeader->b_size; + LastDataEndPointer = BufferHeader->b_data + BufferHeader->b_size; + if (SegmentNumber++ > Controller->DriverScatterGatherLimit) + panic("DAC960: Scatter/Gather Segment Overflow\n"); + } + BufferHeader = BufferHeader->b_reqnext; + } + if (SegmentNumber != Command->SegmentCount) + panic("DAC960: SegmentNumber != SegmentCount\n"); + } + DAC960_QueueCommand(Command); +} + + +/* + DAC960_ProcessRequest attempts to remove one I/O Request from Controller's + I/O Request Queue and queues it to the Controller. WaitForCommand is true if + this function should wait for a Command to become available if necessary. + This function returns true if an I/O Request was queued and false otherwise. +*/ + +static boolean DAC960_ProcessRequest(DAC960_Controller_T *Controller, + boolean WaitForCommand) +{ + IO_Request_T **RequestQueuePointer = + &blk_dev[DAC960_MAJOR + Controller->ControllerNumber].current_request; + IO_Request_T *Request; + DAC960_Command_T *Command; + while (true) + { + Request = *RequestQueuePointer; + if (Request == NULL || Request->rq_status == RQ_INACTIVE) return false; + Command = DAC960_AllocateCommand(Controller); + if (Command != NULL) break; + if (!WaitForCommand) return false; + DAC960_WaitForCommand(Controller); + } + if (Request->cmd == READ) + Command->CommandType = DAC960_ReadCommand; + else Command->CommandType = DAC960_WriteCommand; + Command->Semaphore = Request->sem; + Command->LogicalDriveNumber = DAC960_LogicalDriveNumber(Request->rq_dev); + Command->BlockNumber = + Request->sector + + Controller->GenericDiskInfo.part[MINOR(Request->rq_dev)].start_sect; + Command->BlockCount = Request->nr_sectors; + Command->SegmentCount = Request->nr_segments; + Command->BufferHeader = Request->bh; + Command->RequestBuffer = Request->buffer; + Request->rq_status = RQ_INACTIVE; + *RequestQueuePointer = Request->next; + DAC960_QueueReadWriteCommand(Command); + wake_up(&wait_for_request); return true; } @@ -1662,15 +2923,27 @@ } +/* + DAC960_ProcessCompletedBuffer performs completion processing for an + individual Buffer. +*/ + +static inline void DAC960_ProcessCompletedBuffer(BufferHeader_T *BufferHeader, + boolean SuccessfulIO) +{ + BufferHeader->b_end_io(BufferHeader, SuccessfulIO); +} + + /* - DAC960_ReadWriteError prints an appropriate error message for Command when - an error occurs on a Read or Write operation. + DAC960_V1_ReadWriteError prints an appropriate error message for Command + when an error occurs on a Read or Write operation. */ -static void DAC960_ReadWriteError(DAC960_Command_T *Command) +static void DAC960_V1_ReadWriteError(DAC960_Command_T *Command) { DAC960_Controller_T *Controller = Command->Controller; - char *CommandName = "UNKNOWN"; + unsigned char *CommandName = "UNKNOWN"; switch (Command->CommandType) { case DAC960_ReadCommand: @@ -1686,26 +2959,26 @@ case DAC960_QueuedCommand: break; } - switch (Command->CommandStatus) + switch (Command->V1.CommandStatus) { - case DAC960_IrrecoverableDataError: + case DAC960_V1_IrrecoverableDataError: DAC960_Error("Irrecoverable Data Error on %s:\n", Controller, CommandName); break; - case DAC960_LogicalDriveNonexistentOrOffline: + case DAC960_V1_LogicalDriveNonexistentOrOffline: DAC960_Error("Logical Drive Nonexistent or Offline on %s:\n", Controller, CommandName); break; - case DAC960_AccessBeyondEndOfLogicalDrive: + case DAC960_V1_AccessBeyondEndOfLogicalDrive: DAC960_Error("Attempt to Access Beyond End of Logical Drive " "on %s:\n", Controller, CommandName); break; - case DAC960_BadDataEncountered: + case DAC960_V1_BadDataEncountered: DAC960_Error("Bad Data Encountered on %s:\n", Controller, CommandName); break; default: DAC960_Error("Unexpected Error Status %04X on %s:\n", - Controller, Command->CommandStatus, CommandName); + Controller, Command->V1.CommandStatus, CommandName); break; } DAC960_Error(" /dev/rd/c%dd%d: absolute blocks %d..%d\n", @@ -1723,33 +2996,22 @@ /* - DAC960_ProcessCompletedBuffer performs completion processing for an - individual Buffer. -*/ - -static inline void DAC960_ProcessCompletedBuffer(BufferHeader_T *BufferHeader, - boolean SuccessfulIO) -{ - BufferHeader->b_end_io(BufferHeader, SuccessfulIO); -} - - -/* - DAC960_ProcessCompletedCommand performs completion processing for Command. + DAC960_V1_ProcessCompletedCommand performs completion processing for Command + for DAC960 V1 Firmware Controllers. */ -static void DAC960_ProcessCompletedCommand(DAC960_Command_T *Command) +static void DAC960_V1_ProcessCompletedCommand(DAC960_Command_T *Command) { DAC960_Controller_T *Controller = Command->Controller; DAC960_CommandType_T CommandType = Command->CommandType; - DAC960_CommandOpcode_T CommandOpcode = - Command->CommandMailbox.Common.CommandOpcode; - DAC960_CommandStatus_T CommandStatus = Command->CommandStatus; + DAC960_V1_CommandOpcode_T CommandOpcode = + Command->V1.CommandMailbox.Common.CommandOpcode; + DAC960_V1_CommandStatus_T CommandStatus = Command->V1.CommandStatus; BufferHeader_T *BufferHeader = Command->BufferHeader; if (CommandType == DAC960_ReadCommand || CommandType == DAC960_WriteCommand) { - if (CommandStatus == DAC960_NormalCompletion) + if (CommandStatus == DAC960_V1_NormalCompletion) { /* Perform completion processing for all buffers in this I/O Request. @@ -1771,21 +3033,22 @@ } add_blkdev_randomness(DAC960_MAJOR + Controller->ControllerNumber); } - else if ((CommandStatus == DAC960_IrrecoverableDataError || - CommandStatus == DAC960_BadDataEncountered) && + else if ((CommandStatus == DAC960_V1_IrrecoverableDataError || + CommandStatus == DAC960_V1_BadDataEncountered) && BufferHeader != NULL && BufferHeader->b_reqnext != NULL) { - DAC960_CommandMailbox_T *CommandMailbox = &Command->CommandMailbox; + DAC960_V1_CommandMailbox_T *CommandMailbox = + &Command->V1.CommandMailbox; if (CommandType == DAC960_ReadCommand) { Command->CommandType = DAC960_ReadRetryCommand; - CommandMailbox->Type5.CommandOpcode = DAC960_Read; + CommandMailbox->Type5.CommandOpcode = DAC960_V1_Read; } else { Command->CommandType = DAC960_WriteRetryCommand; - CommandMailbox->Type5.CommandOpcode = DAC960_Write; + CommandMailbox->Type5.CommandOpcode = DAC960_V1_Write; } Command->BlockCount = BufferHeader->b_size >> DAC960_BlockSizeBits; CommandMailbox->Type5.LD.TransferLength = Command->BlockCount; @@ -1796,8 +3059,8 @@ } else { - if (CommandStatus != DAC960_LogicalDriveNonexistentOrOffline) - DAC960_ReadWriteError(Command); + if (CommandStatus != DAC960_V1_LogicalDriveNonexistentOrOffline) + DAC960_V1_ReadWriteError(Command); /* Perform completion processing for all buffers in this I/O Request. */ @@ -1826,17 +3089,18 @@ /* Perform completion processing for this single buffer. */ - if (CommandStatus == DAC960_NormalCompletion) + if (CommandStatus == DAC960_V1_NormalCompletion) DAC960_ProcessCompletedBuffer(BufferHeader, true); else { - if (CommandStatus != DAC960_LogicalDriveNonexistentOrOffline) - DAC960_ReadWriteError(Command); + if (CommandStatus != DAC960_V1_LogicalDriveNonexistentOrOffline) + DAC960_V1_ReadWriteError(Command); DAC960_ProcessCompletedBuffer(BufferHeader, false); } if (NextBufferHeader != NULL) { - DAC960_CommandMailbox_T *CommandMailbox = &Command->CommandMailbox; + DAC960_V1_CommandMailbox_T *CommandMailbox = + &Command->V1.CommandMailbox; Command->BlockNumber += BufferHeader->b_size >> DAC960_BlockSizeBits; Command->BlockCount = @@ -1851,30 +3115,43 @@ } } else if (CommandType == DAC960_MonitoringCommand || - CommandOpcode == DAC960_Enquiry || - CommandOpcode == DAC960_GetRebuildProgress) + CommandOpcode == DAC960_V1_Enquiry || + CommandOpcode == DAC960_V1_GetRebuildProgress) { if (CommandType != DAC960_MonitoringCommand) { - if (CommandOpcode == DAC960_Enquiry) - memcpy(&Controller->Enquiry[Controller->EnquiryIndex ^ 1], - Bus_to_Virtual(Command->CommandMailbox.Type3.BusAddress), - sizeof(DAC960_Enquiry_T)); - else if (CommandOpcode == DAC960_GetRebuildProgress) - memcpy(&Controller->RebuildProgress, - Bus_to_Virtual(Command->CommandMailbox.Type3.BusAddress), - sizeof(DAC960_RebuildProgress_T)); - } - if (CommandOpcode == DAC960_Enquiry) - { - DAC960_Enquiry_T *OldEnquiry = - &Controller->Enquiry[Controller->EnquiryIndex]; - DAC960_Enquiry_T *NewEnquiry = - &Controller->Enquiry[Controller->EnquiryIndex ^= 1]; + if (CommandOpcode == DAC960_V1_Enquiry) + memcpy(&Controller->V1.NewEnquiry, + Bus_to_Virtual(Command->V1.CommandMailbox.Type3.BusAddress), + sizeof(DAC960_V1_Enquiry_T)); + else if (CommandOpcode == DAC960_V1_GetRebuildProgress) + memcpy(&Controller->V1.RebuildProgress, + Bus_to_Virtual(Command->V1.CommandMailbox.Type3.BusAddress), + sizeof(DAC960_V1_RebuildProgress_T)); + } + if (CommandOpcode == DAC960_V1_Enquiry && + Controller->ControllerInitialized) + { + DAC960_V1_Enquiry_T *OldEnquiry = &Controller->V1.Enquiry; + DAC960_V1_Enquiry_T *NewEnquiry = &Controller->V1.NewEnquiry; unsigned int OldCriticalLogicalDriveCount = OldEnquiry->CriticalLogicalDriveCount; unsigned int NewCriticalLogicalDriveCount = NewEnquiry->CriticalLogicalDriveCount; + if (NewEnquiry->NumberOfLogicalDrives > Controller->LogicalDriveCount) + { + int LogicalDriveNumber = Controller->LogicalDriveCount; + while (LogicalDriveNumber < NewEnquiry->NumberOfLogicalDrives) + { + DAC960_Critical("Logical Drive %d (/dev/rd/c%dd%d) " + "Now Exists\n", Controller, + LogicalDriveNumber, + Controller->ControllerNumber, + LogicalDriveNumber); + LogicalDriveNumber++; + } + Controller->LogicalDriveCount = LogicalDriveNumber; + } if (NewEnquiry->StatusFlags.DeferredWriteError != OldEnquiry->StatusFlags.DeferredWriteError) DAC960_Critical("Deferred Write Error Flag is now %s\n", Controller, @@ -1894,72 +3171,86 @@ (jiffies - Controller->SecondaryMonitoringTime >= DAC960_SecondaryMonitoringInterval)) { - Controller->NeedLogicalDriveInformation = true; - Controller->NewEventLogSequenceNumber = + Controller->V1.NeedLogicalDriveInformation = true; + Controller->V1.NewEventLogSequenceNumber = NewEnquiry->EventLogSequenceNumber; - Controller->NeedErrorTableInformation = true; - Controller->NeedDeviceStateInformation = true; - Controller->DeviceStateChannel = 0; - Controller->DeviceStateTargetID = -1; + Controller->V1.NeedErrorTableInformation = true; + Controller->V1.NeedDeviceStateInformation = true; + Controller->V1.DeviceStateChannel = 0; + Controller->V1.DeviceStateTargetID = -1; Controller->SecondaryMonitoringTime = jiffies; + } + if (NewEnquiry->RebuildFlag == DAC960_V1_StandbyRebuildInProgress || + NewEnquiry->RebuildFlag + == DAC960_V1_BackgroundRebuildInProgress || + OldEnquiry->RebuildFlag == DAC960_V1_StandbyRebuildInProgress || + OldEnquiry->RebuildFlag == DAC960_V1_BackgroundRebuildInProgress) + { + Controller->V1.NeedRebuildProgress = true; + Controller->V1.RebuildProgressFirst = + (NewEnquiry->CriticalLogicalDriveCount < + OldEnquiry->CriticalLogicalDriveCount); } - if (NewEnquiry->RebuildFlag == DAC960_StandbyRebuildInProgress || - NewEnquiry->RebuildFlag == DAC960_BackgroundRebuildInProgress || - OldEnquiry->RebuildFlag == DAC960_StandbyRebuildInProgress || - OldEnquiry->RebuildFlag == DAC960_BackgroundRebuildInProgress) - Controller->NeedRebuildProgress = true; - if (OldEnquiry->RebuildFlag == DAC960_BackgroundCheckInProgress) + if (OldEnquiry->RebuildFlag == DAC960_V1_BackgroundCheckInProgress) switch (NewEnquiry->RebuildFlag) { - case DAC960_NoStandbyRebuildOrCheckInProgress: + case DAC960_V1_NoStandbyRebuildOrCheckInProgress: DAC960_Progress("Consistency Check Completed Successfully\n", Controller); break; - case DAC960_StandbyRebuildInProgress: - case DAC960_BackgroundRebuildInProgress: + case DAC960_V1_StandbyRebuildInProgress: + case DAC960_V1_BackgroundRebuildInProgress: break; - case DAC960_BackgroundCheckInProgress: - Controller->NeedConsistencyCheckProgress = true; + case DAC960_V1_BackgroundCheckInProgress: + Controller->V1.NeedConsistencyCheckProgress = true; break; - case DAC960_StandbyRebuildCompletedWithError: + case DAC960_V1_StandbyRebuildCompletedWithError: DAC960_Progress("Consistency Check Completed with Error\n", Controller); break; - case DAC960_BackgroundRebuildOrCheckFailed_DriveFailed: + case DAC960_V1_BackgroundRebuildOrCheckFailed_DriveFailed: DAC960_Progress("Consistency Check Failed - " - "Physical Drive Failed\n", Controller); + "Physical Device Failed\n", Controller); break; - case DAC960_BackgroundRebuildOrCheckFailed_LogicalDriveFailed: + case DAC960_V1_BackgroundRebuildOrCheckFailed_LogicalDriveFailed: DAC960_Progress("Consistency Check Failed - " "Logical Drive Failed\n", Controller); break; - case DAC960_BackgroundRebuildOrCheckFailed_OtherCauses: + case DAC960_V1_BackgroundRebuildOrCheckFailed_OtherCauses: DAC960_Progress("Consistency Check Failed - Other Causes\n", Controller); break; - case DAC960_BackgroundRebuildOrCheckSuccessfullyTerminated: + case DAC960_V1_BackgroundRebuildOrCheckSuccessfullyTerminated: DAC960_Progress("Consistency Check Successfully Terminated\n", Controller); break; } - else if (NewEnquiry->RebuildFlag == DAC960_BackgroundCheckInProgress) - Controller->NeedConsistencyCheckProgress = true; + else if (NewEnquiry->RebuildFlag + == DAC960_V1_BackgroundCheckInProgress) + Controller->V1.NeedConsistencyCheckProgress = true; + Controller->MonitoringAlertMode = + (NewEnquiry->CriticalLogicalDriveCount > 0 || + NewEnquiry->OfflineLogicalDriveCount > 0 || + NewEnquiry->DeadDriveCount > 0); if (CommandType != DAC960_MonitoringCommand && - Controller->RebuildFlagPending) + Controller->V1.RebuildFlagPending) { - DAC960_Enquiry_T *Enquiry = (DAC960_Enquiry_T *) - Bus_to_Virtual(Command->CommandMailbox.Type3.BusAddress); - Enquiry->RebuildFlag = Controller->PendingRebuildFlag; - Controller->RebuildFlagPending = false; + DAC960_V1_Enquiry_T *Enquiry = (DAC960_V1_Enquiry_T *) + Bus_to_Virtual(Command->V1.CommandMailbox.Type3.BusAddress); + Enquiry->RebuildFlag = Controller->V1.PendingRebuildFlag; + Controller->V1.RebuildFlagPending = false; } else if (CommandType == DAC960_MonitoringCommand && - NewEnquiry->RebuildFlag > DAC960_BackgroundCheckInProgress) + NewEnquiry->RebuildFlag > + DAC960_V1_BackgroundCheckInProgress) { - Controller->PendingRebuildFlag = NewEnquiry->RebuildFlag; - Controller->RebuildFlagPending = true; + Controller->V1.PendingRebuildFlag = NewEnquiry->RebuildFlag; + Controller->V1.RebuildFlagPending = true; } + memcpy(&Controller->V1.Enquiry, &Controller->V1.NewEnquiry, + sizeof(DAC960_V1_Enquiry_T)); } - else if (CommandOpcode == DAC960_PerformEventLogOperation) + else if (CommandOpcode == DAC960_V1_PerformEventLogOperation) { static char *DAC960_EventMessages[] = @@ -1976,37 +3267,39 @@ "killed because of selection timeout", "killed due to SCSI phase sequence error", "killed due to unknown status" }; - DAC960_EventLogEntry_T *EventLogEntry = &Controller->EventLogEntry; + DAC960_V1_EventLogEntry_T *EventLogEntry = + &Controller->V1.EventLogEntry; if (EventLogEntry->SequenceNumber == - Controller->OldEventLogSequenceNumber) + Controller->V1.OldEventLogSequenceNumber) { unsigned char SenseKey = EventLogEntry->SenseKey; unsigned char AdditionalSenseCode = EventLogEntry->AdditionalSenseCode; unsigned char AdditionalSenseCodeQualifier = EventLogEntry->AdditionalSenseCodeQualifier; - if (SenseKey == 9 && + if (SenseKey == DAC960_SenseKey_VendorSpecific && AdditionalSenseCode == 0x80 && AdditionalSenseCodeQualifier < sizeof(DAC960_EventMessages) / sizeof(char *)) - DAC960_Critical("Physical Drive %d:%d %s\n", Controller, + DAC960_Critical("Physical Device %d:%d %s\n", Controller, EventLogEntry->Channel, EventLogEntry->TargetID, DAC960_EventMessages[ AdditionalSenseCodeQualifier]); - else if (SenseKey == 6 && AdditionalSenseCode == 0x29) + else if (SenseKey == DAC960_SenseKey_UnitAttention && + AdditionalSenseCode == 0x29) { if (Controller->MonitoringTimerCount > 0) - Controller->DeviceResetCount[EventLogEntry->Channel] - [EventLogEntry->TargetID]++; + Controller->V1.DeviceResetCount[EventLogEntry->Channel] + [EventLogEntry->TargetID]++; } - else if (!(SenseKey == 0 || - (SenseKey == 2 && + else if (!(SenseKey == DAC960_SenseKey_NoSense || + (SenseKey == DAC960_SenseKey_NotReady && AdditionalSenseCode == 0x04 && (AdditionalSenseCodeQualifier == 0x01 || AdditionalSenseCodeQualifier == 0x02)))) { - DAC960_Critical("Physical Drive %d:%d Error Log: " + DAC960_Critical("Physical Device %d:%d Error Log: " "Sense Key = %d, ASC = %02X, ASCQ = %02X\n", Controller, EventLogEntry->Channel, @@ -2014,7 +3307,7 @@ SenseKey, AdditionalSenseCode, AdditionalSenseCodeQualifier); - DAC960_Critical("Physical Drive %d:%d Error Log: " + DAC960_Critical("Physical Device %d:%d Error Log: " "Information = %02X%02X%02X%02X " "%02X%02X%02X%02X\n", Controller, @@ -2030,21 +3323,19 @@ EventLogEntry->CommandSpecificInformation[3]); } } - Controller->OldEventLogSequenceNumber++; + Controller->V1.OldEventLogSequenceNumber++; } - else if (CommandOpcode == DAC960_GetErrorTable) + else if (CommandOpcode == DAC960_V1_GetErrorTable) { - DAC960_ErrorTable_T *OldErrorTable = - &Controller->ErrorTable[Controller->ErrorTableIndex]; - DAC960_ErrorTable_T *NewErrorTable = - &Controller->ErrorTable[Controller->ErrorTableIndex ^= 1]; + DAC960_V1_ErrorTable_T *OldErrorTable = &Controller->V1.ErrorTable; + DAC960_V1_ErrorTable_T *NewErrorTable = &Controller->V1.NewErrorTable; int Channel, TargetID; for (Channel = 0; Channel < Controller->Channels; Channel++) - for (TargetID = 0; TargetID < DAC960_MaxTargets; TargetID++) + for (TargetID = 0; TargetID < Controller->Targets; TargetID++) { - DAC960_ErrorTableEntry_T *NewErrorEntry = + DAC960_V1_ErrorTableEntry_T *NewErrorEntry = &NewErrorTable->ErrorTableEntries[Channel][TargetID]; - DAC960_ErrorTableEntry_T *OldErrorEntry = + DAC960_V1_ErrorTableEntry_T *OldErrorEntry = &OldErrorTable->ErrorTableEntries[Channel][TargetID]; if ((NewErrorEntry->ParityErrorCount != OldErrorEntry->ParityErrorCount) || @@ -2054,7 +3345,7 @@ OldErrorEntry->HardErrorCount) || (NewErrorEntry->MiscErrorCount != OldErrorEntry->MiscErrorCount)) - DAC960_Critical("Physical Drive %d:%d Errors: " + DAC960_Critical("Physical Device %d:%d Errors: " "Parity = %d, Soft = %d, " "Hard = %d, Misc = %d\n", Controller, Channel, TargetID, @@ -2063,51 +3354,49 @@ NewErrorEntry->HardErrorCount, NewErrorEntry->MiscErrorCount); } + memcpy(&Controller->V1.ErrorTable, &Controller->V1.NewErrorTable, + sizeof(DAC960_V1_ErrorTable_T)); } - else if (CommandOpcode == DAC960_GetDeviceState) + else if (CommandOpcode == DAC960_V1_GetDeviceState) { - DAC960_DeviceState_T *OldDeviceState = - &Controller->DeviceState[Controller->DeviceStateIndex] - [Controller->DeviceStateChannel] - [Controller->DeviceStateTargetID]; - DAC960_DeviceState_T *NewDeviceState = - &Controller->DeviceState[Controller->DeviceStateIndex ^ 1] - [Controller->DeviceStateChannel] - [Controller->DeviceStateTargetID]; + DAC960_V1_DeviceState_T *OldDeviceState = + &Controller->V1.DeviceState[Controller->V1.DeviceStateChannel] + [Controller->V1.DeviceStateTargetID]; + DAC960_V1_DeviceState_T *NewDeviceState = + &Controller->V1.NewDeviceState; if (NewDeviceState->DeviceState != OldDeviceState->DeviceState) - DAC960_Critical("Physical Drive %d:%d is now %s\n", Controller, - Controller->DeviceStateChannel, - Controller->DeviceStateTargetID, - (NewDeviceState->DeviceState == DAC960_Device_Dead + DAC960_Critical("Physical Device %d:%d is now %s\n", Controller, + Controller->V1.DeviceStateChannel, + Controller->V1.DeviceStateTargetID, + (NewDeviceState->DeviceState + == DAC960_V1_Device_Dead ? "DEAD" : NewDeviceState->DeviceState - == DAC960_Device_WriteOnly + == DAC960_V1_Device_WriteOnly ? "WRITE-ONLY" : NewDeviceState->DeviceState - == DAC960_Device_Online + == DAC960_V1_Device_Online ? "ONLINE" : "STANDBY")); - if (OldDeviceState->DeviceState == DAC960_Device_Dead && - NewDeviceState->DeviceState != DAC960_Device_Dead) + if (OldDeviceState->DeviceState == DAC960_V1_Device_Dead && + NewDeviceState->DeviceState != DAC960_V1_Device_Dead) { - Controller->NeedDeviceInquiryInformation = true; - Controller->NeedDeviceSerialNumberInformation = true; + Controller->V1.NeedDeviceInquiryInformation = true; + Controller->V1.NeedDeviceSerialNumberInformation = true; } + memcpy(OldDeviceState, NewDeviceState, + sizeof(DAC960_V1_DeviceState_T)); } - else if (CommandOpcode == DAC960_GetLogicalDriveInformation) + else if (CommandOpcode == DAC960_V1_GetLogicalDriveInformation) { int LogicalDriveNumber; for (LogicalDriveNumber = 0; LogicalDriveNumber < Controller->LogicalDriveCount; LogicalDriveNumber++) { - DAC960_LogicalDriveInformation_T *OldLogicalDriveInformation = - &Controller->LogicalDriveInformation - [Controller->LogicalDriveInformationIndex] - [LogicalDriveNumber]; - DAC960_LogicalDriveInformation_T *NewLogicalDriveInformation = - &Controller->LogicalDriveInformation - [Controller->LogicalDriveInformationIndex ^ 1] - [LogicalDriveNumber]; + DAC960_V1_LogicalDriveInformation_T *OldLogicalDriveInformation = + &Controller->V1.LogicalDriveInformation[LogicalDriveNumber]; + DAC960_V1_LogicalDriveInformation_T *NewLogicalDriveInformation = + &Controller->V1.NewLogicalDriveInformation[LogicalDriveNumber]; if (NewLogicalDriveInformation->LogicalDriveState != OldLogicalDriveInformation->LogicalDriveState) DAC960_Critical("Logical Drive %d (/dev/rd/c%dd%d) " @@ -2116,11 +3405,11 @@ Controller->ControllerNumber, LogicalDriveNumber, (NewLogicalDriveInformation->LogicalDriveState - == DAC960_LogicalDrive_Online + == DAC960_V1_LogicalDrive_Online ? "ONLINE" : NewLogicalDriveInformation->LogicalDriveState - == DAC960_LogicalDrive_Critical - ? "CRITICAL" : "OFFLINE")); + == DAC960_V1_LogicalDrive_Critical + ? "CRITICAL" : "OFFLINE")); if (NewLogicalDriveInformation->WriteBack != OldLogicalDriveInformation->WriteBack) DAC960_Critical("Logical Drive %d (/dev/rd/c%dd%d) " @@ -2131,22 +3420,24 @@ (NewLogicalDriveInformation->WriteBack ? "WRITE BACK" : "WRITE THRU")); } - Controller->LogicalDriveInformationIndex ^= 1; + memcpy(&Controller->V1.LogicalDriveInformation, + &Controller->V1.NewLogicalDriveInformation, + sizeof(DAC960_V1_LogicalDriveInformationArray_T)); } - else if (CommandOpcode == DAC960_GetRebuildProgress) + else if (CommandOpcode == DAC960_V1_GetRebuildProgress) { unsigned int LogicalDriveNumber = - Controller->RebuildProgress.LogicalDriveNumber; + Controller->V1.RebuildProgress.LogicalDriveNumber; unsigned int LogicalDriveSize = - Controller->RebuildProgress.LogicalDriveSize; + Controller->V1.RebuildProgress.LogicalDriveSize; unsigned int BlocksCompleted = - LogicalDriveSize - Controller->RebuildProgress.RemainingBlocks; - if (CommandStatus == DAC960_NoRebuildOrCheckInProgress && - Controller->LastRebuildStatus == DAC960_NormalCompletion) - CommandStatus = DAC960_RebuildSuccessful; + LogicalDriveSize - Controller->V1.RebuildProgress.RemainingBlocks; + if (CommandStatus == DAC960_V1_NoRebuildOrCheckInProgress && + Controller->V1.LastRebuildStatus == DAC960_V1_NormalCompletion) + CommandStatus = DAC960_V1_RebuildSuccessful; switch (CommandStatus) { - case DAC960_NormalCompletion: + case DAC960_V1_NormalCompletion: Controller->EphemeralProgressMessage = true; DAC960_Progress("Rebuild in Progress: " "Logical Drive %d (/dev/rd/c%dd%d) " @@ -2158,244 +3449,1061 @@ / (LogicalDriveSize >> 7)); Controller->EphemeralProgressMessage = false; break; - case DAC960_RebuildFailed_LogicalDriveFailure: + case DAC960_V1_RebuildFailed_LogicalDriveFailure: DAC960_Progress("Rebuild Failed due to " "Logical Drive Failure\n", Controller); break; - case DAC960_RebuildFailed_BadBlocksOnOther: + case DAC960_V1_RebuildFailed_BadBlocksOnOther: DAC960_Progress("Rebuild Failed due to " "Bad Blocks on Other Drives\n", Controller); break; - case DAC960_RebuildFailed_NewDriveFailed: + case DAC960_V1_RebuildFailed_NewDriveFailed: DAC960_Progress("Rebuild Failed due to " "Failure of Drive Being Rebuilt\n", Controller); break; - case DAC960_NoRebuildOrCheckInProgress: + case DAC960_V1_NoRebuildOrCheckInProgress: break; - case DAC960_RebuildSuccessful: + case DAC960_V1_RebuildSuccessful: DAC960_Progress("Rebuild Completed Successfully\n", Controller); break; - case DAC960_RebuildSuccessfullyTerminated: + case DAC960_V1_RebuildSuccessfullyTerminated: DAC960_Progress("Rebuild Successfully Terminated\n", Controller); break; } - Controller->LastRebuildStatus = CommandStatus; + Controller->V1.LastRebuildStatus = CommandStatus; if (CommandType != DAC960_MonitoringCommand && - Controller->RebuildStatusPending) + Controller->V1.RebuildStatusPending) + { + Command->V1.CommandStatus = Controller->V1.PendingRebuildStatus; + Controller->V1.RebuildStatusPending = false; + } + else if (CommandType == DAC960_MonitoringCommand && + CommandStatus != DAC960_V1_NormalCompletion && + CommandStatus != DAC960_V1_NoRebuildOrCheckInProgress) + { + Controller->V1.PendingRebuildStatus = CommandStatus; + Controller->V1.RebuildStatusPending = true; + } + } + else if (CommandOpcode == DAC960_V1_RebuildStat) + { + unsigned int LogicalDriveNumber = + Controller->V1.RebuildProgress.LogicalDriveNumber; + unsigned int LogicalDriveSize = + Controller->V1.RebuildProgress.LogicalDriveSize; + unsigned int BlocksCompleted = + LogicalDriveSize - Controller->V1.RebuildProgress.RemainingBlocks; + if (CommandStatus == DAC960_V1_NormalCompletion) + { + Controller->EphemeralProgressMessage = true; + DAC960_Progress("Consistency Check in Progress: " + "Logical Drive %d (/dev/rd/c%dd%d) " + "%d%% completed\n", + Controller, LogicalDriveNumber, + Controller->ControllerNumber, + LogicalDriveNumber, + (100 * (BlocksCompleted >> 7)) + / (LogicalDriveSize >> 7)); + Controller->EphemeralProgressMessage = false; + } + } + } + if (CommandType == DAC960_MonitoringCommand) + { + if (Controller->V1.NewEventLogSequenceNumber + - Controller->V1.OldEventLogSequenceNumber > 0) + { + Command->V1.CommandMailbox.Type3E.CommandOpcode = + DAC960_V1_PerformEventLogOperation; + Command->V1.CommandMailbox.Type3E.OperationType = + DAC960_V1_GetEventLogEntry; + Command->V1.CommandMailbox.Type3E.OperationQualifier = 1; + Command->V1.CommandMailbox.Type3E.SequenceNumber = + Controller->V1.OldEventLogSequenceNumber; + Command->V1.CommandMailbox.Type3E.BusAddress = + Virtual_to_Bus(&Controller->V1.EventLogEntry); + DAC960_QueueCommand(Command); + return; + } + if (Controller->V1.NeedErrorTableInformation) + { + Controller->V1.NeedErrorTableInformation = false; + Command->V1.CommandMailbox.Type3.CommandOpcode = + DAC960_V1_GetErrorTable; + Command->V1.CommandMailbox.Type3.BusAddress = + Virtual_to_Bus(&Controller->V1.NewErrorTable); + DAC960_QueueCommand(Command); + return; + } + if (Controller->V1.NeedRebuildProgress && + Controller->V1.RebuildProgressFirst) + { + Controller->V1.NeedRebuildProgress = false; + Command->V1.CommandMailbox.Type3.CommandOpcode = + DAC960_V1_GetRebuildProgress; + Command->V1.CommandMailbox.Type3.BusAddress = + Virtual_to_Bus(&Controller->V1.RebuildProgress); + DAC960_QueueCommand(Command); + return; + } + if (Controller->V1.NeedDeviceStateInformation) + { + if (Controller->V1.NeedDeviceInquiryInformation) + { + DAC960_V1_DCDB_T *DCDB = &Controller->V1.MonitoringDCDB; + DAC960_SCSI_Inquiry_T *InquiryStandardData = + &Controller->V1.InquiryStandardData + [Controller->V1.DeviceStateChannel] + [Controller->V1.DeviceStateTargetID]; + InquiryStandardData->PeripheralDeviceType = 0x1F; + Command->V1.CommandMailbox.Type3.CommandOpcode = DAC960_V1_DCDB; + Command->V1.CommandMailbox.Type3.BusAddress = + Virtual_to_Bus(DCDB); + DCDB->Channel = Controller->V1.DeviceStateChannel; + DCDB->TargetID = Controller->V1.DeviceStateTargetID; + DCDB->Direction = DAC960_V1_DCDB_DataTransferDeviceToSystem; + DCDB->EarlyStatus = false; + DCDB->Timeout = DAC960_V1_DCDB_Timeout_10_seconds; + DCDB->NoAutomaticRequestSense = false; + DCDB->DisconnectPermitted = true; + DCDB->TransferLength = sizeof(DAC960_SCSI_Inquiry_T); + DCDB->BusAddress = Virtual_to_Bus(InquiryStandardData); + DCDB->CDBLength = 6; + DCDB->TransferLengthHigh4 = 0; + DCDB->SenseLength = sizeof(DCDB->SenseData); + DCDB->CDB[0] = 0x12; /* INQUIRY */ + DCDB->CDB[1] = 0; /* EVPD = 0 */ + DCDB->CDB[2] = 0; /* Page Code */ + DCDB->CDB[3] = 0; /* Reserved */ + DCDB->CDB[4] = sizeof(DAC960_SCSI_Inquiry_T); + DCDB->CDB[5] = 0; /* Control */ + DAC960_QueueCommand(Command); + Controller->V1.NeedDeviceInquiryInformation = false; + return; + } + if (Controller->V1.NeedDeviceSerialNumberInformation) + { + DAC960_V1_DCDB_T *DCDB = &Controller->V1.MonitoringDCDB; + DAC960_SCSI_Inquiry_UnitSerialNumber_T *InquiryUnitSerialNumber = + &Controller->V1.InquiryUnitSerialNumber + [Controller->V1.DeviceStateChannel] + [Controller->V1.DeviceStateTargetID]; + InquiryUnitSerialNumber->PeripheralDeviceType = 0x1F; + Command->V1.CommandMailbox.Type3.CommandOpcode = DAC960_V1_DCDB; + Command->V1.CommandMailbox.Type3.BusAddress = + Virtual_to_Bus(DCDB); + DCDB->Channel = Controller->V1.DeviceStateChannel; + DCDB->TargetID = Controller->V1.DeviceStateTargetID; + DCDB->Direction = DAC960_V1_DCDB_DataTransferDeviceToSystem; + DCDB->EarlyStatus = false; + DCDB->Timeout = DAC960_V1_DCDB_Timeout_10_seconds; + DCDB->NoAutomaticRequestSense = false; + DCDB->DisconnectPermitted = true; + DCDB->TransferLength = + sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T); + DCDB->BusAddress = Virtual_to_Bus(InquiryUnitSerialNumber); + DCDB->CDBLength = 6; + DCDB->TransferLengthHigh4 = 0; + DCDB->SenseLength = sizeof(DCDB->SenseData); + DCDB->CDB[0] = 0x12; /* INQUIRY */ + DCDB->CDB[1] = 1; /* EVPD = 1 */ + DCDB->CDB[2] = 0x80; /* Page Code */ + DCDB->CDB[3] = 0; /* Reserved */ + DCDB->CDB[4] = sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T); + DCDB->CDB[5] = 0; /* Control */ + DAC960_QueueCommand(Command); + Controller->V1.NeedDeviceSerialNumberInformation = false; + return; + } + if (++Controller->V1.DeviceStateTargetID == Controller->Targets) + { + Controller->V1.DeviceStateChannel++; + Controller->V1.DeviceStateTargetID = 0; + } + while (Controller->V1.DeviceStateChannel < Controller->Channels) + { + DAC960_V1_DeviceState_T *OldDeviceState = + &Controller->V1.DeviceState[Controller->V1.DeviceStateChannel] + [Controller->V1.DeviceStateTargetID]; + if (OldDeviceState->Present && + OldDeviceState->DeviceType == DAC960_V1_DiskType) + { + Command->V1.CommandMailbox.Type3D.CommandOpcode = + DAC960_V1_GetDeviceState; + Command->V1.CommandMailbox.Type3D.Channel = + Controller->V1.DeviceStateChannel; + Command->V1.CommandMailbox.Type3D.TargetID = + Controller->V1.DeviceStateTargetID; + Command->V1.CommandMailbox.Type3D.BusAddress = + Virtual_to_Bus(&Controller->V1.NewDeviceState); + DAC960_QueueCommand(Command); + return; + } + if (++Controller->V1.DeviceStateTargetID == Controller->Targets) + { + Controller->V1.DeviceStateChannel++; + Controller->V1.DeviceStateTargetID = 0; + } + } + Controller->V1.NeedDeviceStateInformation = false; + } + if (Controller->V1.NeedLogicalDriveInformation) + { + Controller->V1.NeedLogicalDriveInformation = false; + Command->V1.CommandMailbox.Type3.CommandOpcode = + DAC960_V1_GetLogicalDriveInformation; + Command->V1.CommandMailbox.Type3.BusAddress = + Virtual_to_Bus(&Controller->V1.NewLogicalDriveInformation); + DAC960_QueueCommand(Command); + return; + } + if (Controller->V1.NeedRebuildProgress) + { + Controller->V1.NeedRebuildProgress = false; + Command->V1.CommandMailbox.Type3.CommandOpcode = + DAC960_V1_GetRebuildProgress; + Command->V1.CommandMailbox.Type3.BusAddress = + Virtual_to_Bus(&Controller->V1.RebuildProgress); + DAC960_QueueCommand(Command); + return; + } + if (Controller->V1.NeedConsistencyCheckProgress) + { + Controller->V1.NeedConsistencyCheckProgress = false; + Command->V1.CommandMailbox.Type3.CommandOpcode = + DAC960_V1_RebuildStat; + Command->V1.CommandMailbox.Type3.BusAddress = + Virtual_to_Bus(&Controller->V1.RebuildProgress); + DAC960_QueueCommand(Command); + return; + } + Controller->MonitoringTimerCount++; + Controller->MonitoringTimer.expires = + jiffies + DAC960_MonitoringTimerInterval; + add_timer(&Controller->MonitoringTimer); + } + if (CommandType == DAC960_ImmediateCommand) + { + up(Command->Semaphore); + Command->Semaphore = NULL; + return; + } + if (CommandType == DAC960_QueuedCommand) + { + DAC960_V1_KernelCommand_T *KernelCommand = Command->V1.KernelCommand; + KernelCommand->CommandStatus = Command->V1.CommandStatus; + Command->V1.KernelCommand = NULL; + if (CommandOpcode == DAC960_V1_DCDB) + Controller->V1.DirectCommandActive[KernelCommand->DCDB->Channel] + [KernelCommand->DCDB->TargetID] = + false; + DAC960_DeallocateCommand(Command); + KernelCommand->CompletionFunction(KernelCommand); + return; + } + /* + Queue a Status Monitoring Command to the Controller using the just + completed Command if one was deferred previously due to lack of a + free Command when the Monitoring Timer Function was called. + */ + if (Controller->MonitoringCommandDeferred) + { + Controller->MonitoringCommandDeferred = false; + DAC960_V1_QueueMonitoringCommand(Command); + return; + } + /* + Deallocate the Command. + */ + DAC960_DeallocateCommand(Command); + /* + Wake up any processes waiting on a free Command. + */ + wake_up(&Controller->CommandWaitQueue); +} + + +/* + DAC960_V2_ReadWriteError prints an appropriate error message for Command + when an error occurs on a Read or Write operation. +*/ + +static void DAC960_V2_ReadWriteError(DAC960_Command_T *Command) +{ + DAC960_Controller_T *Controller = Command->Controller; + unsigned char *SenseErrors[] = { "NO SENSE", "RECOVERED ERROR", + "NOT READY", "MEDIUM ERROR", + "HARDWARE ERROR", "ILLEGAL REQUEST", + "UNIT ATTENTION", "DATA PROTECT", + "BLANK CHECK", "VENDOR-SPECIFIC", + "COPY ABORTED", "ABORTED COMMAND", + "EQUAL", "VOLUME OVERFLOW", + "MISCOMPARE", "RESERVED" }; + unsigned char *CommandName = "UNKNOWN"; + switch (Command->CommandType) + { + case DAC960_ReadCommand: + case DAC960_ReadRetryCommand: + CommandName = "READ"; + break; + case DAC960_WriteCommand: + case DAC960_WriteRetryCommand: + CommandName = "WRITE"; + break; + case DAC960_MonitoringCommand: + case DAC960_ImmediateCommand: + case DAC960_QueuedCommand: + break; + } + DAC960_Error("Error Condition %s on %s:\n", Controller, + SenseErrors[Command->V2.RequestSense.SenseKey], CommandName); + DAC960_Error(" /dev/rd/c%dd%d: absolute blocks %d..%d\n", + Controller, Controller->ControllerNumber, + Command->LogicalDriveNumber, Command->BlockNumber, + Command->BlockNumber + Command->BlockCount - 1); + if (DAC960_PartitionNumber(Command->BufferHeader->b_rdev) > 0) + DAC960_Error(" /dev/rd/c%dd%dp%d: relative blocks %d..%d\n", + Controller, Controller->ControllerNumber, + Command->LogicalDriveNumber, + DAC960_PartitionNumber(Command->BufferHeader->b_rdev), + Command->BufferHeader->b_rsector, + Command->BufferHeader->b_rsector + Command->BlockCount - 1); +} + + +/* + DAC960_V2_ReportEvent prints an appropriate message when a Controller Event + occurs. +*/ + +static void DAC960_V2_ReportEvent(DAC960_Controller_T *Controller, + DAC960_V2_Event_T *Event) +{ + DAC960_SCSI_RequestSense_T *RequestSense = + (DAC960_SCSI_RequestSense_T *) &Event->RequestSenseData; + unsigned char MessageBuffer[DAC960_LineBufferSize]; + static struct { int EventCode; unsigned char *EventMessage; } EventList[] = + { /* Physical Device Events (0x0000 - 0x007F) */ + { 0x0001, "P Online" }, + { 0x0002, "P Standby" }, + { 0x0005, "P Automatic Rebuild Started" }, + { 0x0006, "P Manual Rebuild Started" }, + { 0x0007, "P Rebuild Completed" }, + { 0x0008, "P Rebuild Cancelled" }, + { 0x0009, "P Rebuild Failed for Unknown Reasons" }, + { 0x000A, "P Rebuild Failed due to New Physical Device" }, + { 0x000B, "P Rebuild Failed due to Logical Drive Failure" }, + { 0x000C, "S Offline" }, + { 0x000D, "P Found" }, + { 0x000E, "P Gone" }, + { 0x000F, "P Unconfigured" }, + { 0x0010, "P Expand Capacity Started" }, + { 0x0011, "P Expand Capacity Completed" }, + { 0x0012, "P Expand Capacity Failed" }, + { 0x0016, "P Parity Error" }, + { 0x0017, "P Soft Error" }, + { 0x0018, "P Miscellaneous Error" }, + { 0x0019, "P Reset" }, + { 0x001A, "P Active Spare Found" }, + { 0x001B, "P Warm Spare Found" }, + { 0x001C, "S Sense Data Received" }, + { 0x001D, "P Initialization Started" }, + { 0x001E, "P Initialization Completed" }, + { 0x001F, "P Initialization Failed" }, + { 0x0020, "P Initialization Cancelled" }, + { 0x0021, "P Failed because Write Recovery Failed" }, + { 0x0022, "P Failed because SCSI Bus Reset Failed" }, + { 0x0023, "P Failed because of Double Check Condition" }, + { 0x0024, "P Failed because Device Cannot Be Accessed" }, + { 0x0025, "P Failed because of Gross Error on SCSI Processor" }, + { 0x0026, "P Failed because of Bad Tag from Device" }, + { 0x0027, "P Failed because of Command Timeout" }, + { 0x0028, "P Failed because of System Reset" }, + { 0x0029, "P Failed because of Busy Status or Parity Error" }, + { 0x002A, "P Failed because Host Set Device to Failed State" }, + { 0x002B, "P Failed because of Selection Timeout" }, + { 0x002C, "P Failed because of SCSI Bus Phase Error" }, + { 0x002D, "P Failed because Device Returned Unknown Status" }, + { 0x002E, "P Failed because Device Not Ready" }, + { 0x002F, "P Failed because Device Not Found at Startup" }, + { 0x0030, "P Failed because COD Write Operation Failed" }, + { 0x0031, "P Failed because BDT Write Operation Failed" }, + { 0x0039, "P Missing at Startup" }, + { 0x003A, "P Start Rebuild Failed due to Physical Drive Too Small" }, + /* Logical Device Events (0x0080 - 0x00FF) */ + { 0x0080, "M Consistency Check Started" }, + { 0x0081, "M Consistency Check Completed" }, + { 0x0082, "M Consistency Check Cancelled" }, + { 0x0083, "M Consistency Check Completed With Errors" }, + { 0x0084, "M Consistency Check Failed due to Logical Drive Failure" }, + { 0x0085, "M Consistency Check Failed due to Physical Device Failure" }, + { 0x0086, "L Offline" }, + { 0x0087, "L Critical" }, + { 0x0088, "L Online" }, + { 0x0089, "M Automatic Rebuild Started" }, + { 0x008A, "M Manual Rebuild Started" }, + { 0x008B, "M Rebuild Completed" }, + { 0x008C, "M Rebuild Cancelled" }, + { 0x008D, "M Rebuild Failed for Unknown Reasons" }, + { 0x008E, "M Rebuild Failed due to New Physical Device" }, + { 0x008F, "M Rebuild Failed due to Logical Drive Failure" }, + { 0x0090, "L Initialization Started" }, + { 0x0091, "L Initialization Completed" }, + { 0x0092, "L Initialization Cancelled" }, + { 0x0093, "L Initialization Failed" }, + { 0x0094, "L Found" }, + { 0x0095, "L Gone" }, + { 0x0096, "L Expand Capacity Started" }, + { 0x0097, "L Expand Capacity Completed" }, + { 0x0098, "L Expand Capacity Failed" }, + { 0x0099, "L Bad Block Found" }, + { 0x009A, "L Size Changed" }, + { 0x009B, "L Type Changed" }, + { 0x009C, "L Bad Data Block Found" }, + { 0x009E, "L Read of Data Block in BDT" }, + { 0x009F, "L Write Back Data for Disk Block Lost" }, + /* Fault Management Events (0x0100 - 0x017F) */ + { 0x0140, "E Fan %d Failed" }, + { 0x0141, "E Fan %d OK" }, + { 0x0142, "E Fan %d Not Present" }, + { 0x0143, "E Power Supply %d Failed" }, + { 0x0144, "E Power Supply %d OK" }, + { 0x0145, "E Power Supply %d Not Present" }, + { 0x0146, "E Temperature Sensor %d Failed" }, + { 0x0147, "E Temperature Sensor %d Critical" }, + { 0x0148, "E Temperature Sensor %d OK" }, + { 0x0149, "E Temperature Sensor %d Not Present" }, + { 0x014A, "E Unit %d Access Critical" }, + { 0x014B, "E Unit %d Access OK" }, + { 0x014C, "E Unit %d Access Offline" }, + /* Controller Events (0x0180 - 0x01FF) */ + { 0x0181, "C Cache Write Back Error" }, + { 0x0188, "C Battery Backup Unit Found" }, + { 0x0189, "C Battery Backup Unit Charge Level Low" }, + { 0x018A, "C Battery Backup Unit Charge Level OK" }, + { 0x0193, "C Installation Aborted" }, + { 0x0195, "C Mirror Race Recovery In Progress" }, + { 0x0196, "C Mirror Race on Critical Drive" }, + { 0x019E, "C Memory Soft ECC Error" }, + { 0x019F, "C Memory Hard ECC Error" }, + { 0x01A2, "C Battery Backup Unit Failed" }, + { 0, "" } }; + int EventListIndex = 0, EventCode; + unsigned char EventType, *EventMessage; + while (true) + { + EventCode = EventList[EventListIndex].EventCode; + if (EventCode == Event->EventCode || EventCode == 0) break; + EventListIndex++; + } + EventType = EventList[EventListIndex].EventMessage[0]; + EventMessage = &EventList[EventListIndex].EventMessage[2]; + if (EventCode == 0) + { + DAC960_Critical("Unknown Controller Event Code %04X\n", + Controller, Event->EventCode); + return; + } + switch (EventType) + { + case 'P': + DAC960_Critical("Physical Device %d:%d %s\n", Controller, + Event->Channel, Event->TargetID, EventMessage); + break; + case 'L': + DAC960_Critical("Logical Drive %d (/dev/rd/c%dd%d) %s\n", Controller, + Event->LogicalUnit, Controller->ControllerNumber, + Event->LogicalUnit, EventMessage); + break; + case 'M': + DAC960_Progress("Logical Drive %d (/dev/rd/c%dd%d) %s\n", Controller, + Event->LogicalUnit, Controller->ControllerNumber, + Event->LogicalUnit, EventMessage); + break; + case 'S': + if (RequestSense->SenseKey == DAC960_SenseKey_NoSense || + (RequestSense->SenseKey == DAC960_SenseKey_NotReady && + RequestSense->AdditionalSenseCode == 0x04 && + (RequestSense->AdditionalSenseCodeQualifier == 0x01 || + RequestSense->AdditionalSenseCodeQualifier == 0x02))) + break; + DAC960_Critical("Physical Device %d:%d %s\n", Controller, + Event->Channel, Event->TargetID, EventMessage); + DAC960_Critical("Physical Device %d:%d Request Sense: " + "Sense Key = %d, ASC = %02X, ASCQ = %02X\n", + Controller, + Event->Channel, + Event->TargetID, + RequestSense->SenseKey, + RequestSense->AdditionalSenseCode, + RequestSense->AdditionalSenseCodeQualifier); + DAC960_Critical("Physical Device %d:%d Request Sense: " + "Information = %02X%02X%02X%02X " + "%02X%02X%02X%02X\n", + Controller, + Event->Channel, + Event->TargetID, + RequestSense->Information[0], + RequestSense->Information[1], + RequestSense->Information[2], + RequestSense->Information[3], + RequestSense->CommandSpecificInformation[0], + RequestSense->CommandSpecificInformation[1], + RequestSense->CommandSpecificInformation[2], + RequestSense->CommandSpecificInformation[3]); + break; + case 'E': + sprintf(MessageBuffer, EventMessage, Event->LogicalUnit); + DAC960_Critical("Enclosure %d %s\n", Controller, + Event->TargetID, MessageBuffer); + break; + case 'C': + DAC960_Critical("Controller %s\n", Controller, EventMessage); + break; + default: + DAC960_Critical("Unknown Controller Event Code %04X\n", + Controller, Event->EventCode); + break; + } +} + + +/* + DAC960_V2_ReportProgress prints an appropriate progress message for + Logical Device Long Operations. +*/ + +static void DAC960_V2_ReportProgress(DAC960_Controller_T *Controller, + unsigned char *MessageString, + unsigned int LogicalDeviceNumber, + unsigned long BlocksCompleted, + unsigned long LogicalDeviceSize) +{ + Controller->EphemeralProgressMessage = true; + DAC960_Progress("%s in Progress: Logical Drive %d (/dev/rd/c%dd%d) " + "%d%% completed\n", Controller, + MessageString, + LogicalDeviceNumber, + Controller->ControllerNumber, + LogicalDeviceNumber, + (100 * (BlocksCompleted >> 7)) / (LogicalDeviceSize >> 7)); + Controller->EphemeralProgressMessage = false; +} + + +/* + DAC960_V2_ProcessCompletedCommand performs completion processing for Command + for DAC960 V2 Firmware Controllers. +*/ + +static void DAC960_V2_ProcessCompletedCommand(DAC960_Command_T *Command) +{ + DAC960_Controller_T *Controller = Command->Controller; + DAC960_CommandType_T CommandType = Command->CommandType; + DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox; + DAC960_V2_IOCTL_Opcode_T CommandOpcode = CommandMailbox->Common.IOCTL_Opcode; + DAC960_V2_CommandStatus_T CommandStatus = Command->V2.CommandStatus; + BufferHeader_T *BufferHeader = Command->BufferHeader; + if (CommandType == DAC960_ReadCommand || + CommandType == DAC960_WriteCommand) + { + if (CommandStatus == DAC960_V2_NormalCompletion) + { + /* + Perform completion processing for all buffers in this I/O Request. + */ + while (BufferHeader != NULL) { - Command->CommandStatus = Controller->PendingRebuildStatus; - Controller->RebuildStatusPending = false; + BufferHeader_T *NextBufferHeader = BufferHeader->b_reqnext; + BufferHeader->b_reqnext = NULL; + DAC960_ProcessCompletedBuffer(BufferHeader, true); + BufferHeader = NextBufferHeader; } - else if (CommandType == DAC960_MonitoringCommand && - CommandStatus != DAC960_NormalCompletion && - CommandStatus != DAC960_NoRebuildOrCheckInProgress) + /* + Wake up requestor for swap file paging requests. + */ + if (Command->Semaphore != NULL) { - Controller->PendingRebuildStatus = CommandStatus; - Controller->RebuildStatusPending = true; + up(Command->Semaphore); + Command->Semaphore = NULL; } + add_blkdev_randomness(DAC960_MAJOR + Controller->ControllerNumber); } - else if (CommandOpcode == DAC960_RebuildStat) + else if (Command->V2.RequestSense.SenseKey + == DAC960_SenseKey_MediumError && + BufferHeader != NULL && + BufferHeader->b_reqnext != NULL) { - unsigned int LogicalDriveNumber = - Controller->RebuildProgress.LogicalDriveNumber; - unsigned int LogicalDriveSize = - Controller->RebuildProgress.LogicalDriveSize; - unsigned int BlocksCompleted = - LogicalDriveSize - Controller->RebuildProgress.RemainingBlocks; - if (CommandStatus == DAC960_NormalCompletion) + if (CommandType == DAC960_ReadCommand) + Command->CommandType = DAC960_ReadRetryCommand; + else Command->CommandType = DAC960_WriteRetryCommand; + Command->BlockCount = BufferHeader->b_size >> DAC960_BlockSizeBits; + CommandMailbox->SCSI_10.CommandControlBits + .AdditionalScatterGatherListMemory = false; + CommandMailbox->SCSI_10.DataTransferSize = + Command->BlockCount << DAC960_BlockSizeBits; + CommandMailbox->SCSI_10.DataTransferMemoryAddress + .ScatterGatherSegments[0].SegmentDataPointer = + Virtual_to_Bus(BufferHeader->b_data); + CommandMailbox->SCSI_10.DataTransferMemoryAddress + .ScatterGatherSegments[0].SegmentByteCount = + CommandMailbox->SCSI_10.DataTransferSize; + CommandMailbox->SCSI_10.SCSI_CDB[7] = Command->BlockCount >> 8; + CommandMailbox->SCSI_10.SCSI_CDB[8] = Command->BlockCount; + DAC960_QueueCommand(Command); + return; + } + else + { + if (Command->V2.RequestSense.SenseKey != DAC960_SenseKey_NotReady) + DAC960_V2_ReadWriteError(Command); + /* + Perform completion processing for all buffers in this I/O Request. + */ + while (BufferHeader != NULL) { - Controller->EphemeralProgressMessage = true; - DAC960_Progress("Consistency Check in Progress: " - "Logical Drive %d (/dev/rd/c%dd%d) " - "%d%% completed\n", - Controller, LogicalDriveNumber, - Controller->ControllerNumber, - LogicalDriveNumber, - (100 * (BlocksCompleted >> 7)) - / (LogicalDriveSize >> 7)); - Controller->EphemeralProgressMessage = false; + BufferHeader_T *NextBufferHeader = BufferHeader->b_reqnext; + BufferHeader->b_reqnext = NULL; + DAC960_ProcessCompletedBuffer(BufferHeader, false); + BufferHeader = NextBufferHeader; + } + /* + Wake up requestor for swap file paging requests. + */ + if (Command->Semaphore != NULL) + { + up(Command->Semaphore); + Command->Semaphore = NULL; } } } - if (CommandType == DAC960_MonitoringCommand) + else if (CommandType == DAC960_ReadRetryCommand || + CommandType == DAC960_WriteRetryCommand) { - if (Controller->NewEventLogSequenceNumber - - Controller->OldEventLogSequenceNumber > 0) + BufferHeader_T *NextBufferHeader = BufferHeader->b_reqnext; + BufferHeader->b_reqnext = NULL; + /* + Perform completion processing for this single buffer. + */ + if (CommandStatus == DAC960_V2_NormalCompletion) + DAC960_ProcessCompletedBuffer(BufferHeader, true); + else { - Command->CommandMailbox.Type3E.CommandOpcode = - DAC960_PerformEventLogOperation; - Command->CommandMailbox.Type3E.OperationType = - DAC960_GetEventLogEntry; - Command->CommandMailbox.Type3E.OperationQualifier = 1; - Command->CommandMailbox.Type3E.SequenceNumber = - Controller->OldEventLogSequenceNumber; - Command->CommandMailbox.Type3E.BusAddress = - Virtual_to_Bus(&Controller->EventLogEntry); - DAC960_QueueCommand(Command); - return; + if (Command->V2.RequestSense.SenseKey != DAC960_SenseKey_NotReady) + DAC960_V2_ReadWriteError(Command); + DAC960_ProcessCompletedBuffer(BufferHeader, false); } - if (Controller->NeedErrorTableInformation) + if (NextBufferHeader != NULL) { - Controller->NeedErrorTableInformation = false; - Command->CommandMailbox.Type3.CommandOpcode = DAC960_GetErrorTable; - Command->CommandMailbox.Type3.BusAddress = - Virtual_to_Bus( - &Controller->ErrorTable[Controller->ErrorTableIndex ^ 1]); - DAC960_QueueCommand(Command); - return; - } - if (Controller->NeedRebuildProgress && - Controller->Enquiry[Controller->EnquiryIndex] - .CriticalLogicalDriveCount < - Controller->Enquiry[Controller->EnquiryIndex ^ 1] - .CriticalLogicalDriveCount) - { - Controller->NeedRebuildProgress = false; - Command->CommandMailbox.Type3.CommandOpcode = - DAC960_GetRebuildProgress; - Command->CommandMailbox.Type3.BusAddress = - Virtual_to_Bus(&Controller->RebuildProgress); + Command->BlockNumber += + BufferHeader->b_size >> DAC960_BlockSizeBits; + Command->BlockCount = + NextBufferHeader->b_size >> DAC960_BlockSizeBits; + Command->BufferHeader = NextBufferHeader; + CommandMailbox->SCSI_10.DataTransferSize = + Command->BlockCount << DAC960_BlockSizeBits; + CommandMailbox->SCSI_10.DataTransferMemoryAddress + .ScatterGatherSegments[0] + .SegmentDataPointer = + Virtual_to_Bus(NextBufferHeader->b_data); + CommandMailbox->SCSI_10.DataTransferMemoryAddress + .ScatterGatherSegments[0] + .SegmentByteCount = + CommandMailbox->SCSI_10.DataTransferSize; + CommandMailbox->SCSI_10.SCSI_CDB[2] = Command->BlockNumber >> 24; + CommandMailbox->SCSI_10.SCSI_CDB[3] = Command->BlockNumber >> 16; + CommandMailbox->SCSI_10.SCSI_CDB[4] = Command->BlockNumber >> 8; + CommandMailbox->SCSI_10.SCSI_CDB[5] = Command->BlockNumber; + CommandMailbox->SCSI_10.SCSI_CDB[7] = Command->BlockCount >> 8; + CommandMailbox->SCSI_10.SCSI_CDB[8] = Command->BlockCount; DAC960_QueueCommand(Command); return; } - if (Controller->NeedDeviceStateInformation) + } + else if (CommandType == DAC960_MonitoringCommand) + { + if (CommandOpcode == DAC960_V2_GetControllerInfo) { - if (Controller->NeedDeviceInquiryInformation) + DAC960_V2_ControllerInfo_T *NewControllerInfo = + &Controller->V2.NewControllerInformation; + DAC960_V2_ControllerInfo_T *ControllerInfo = + &Controller->V2.ControllerInformation; + Controller->LogicalDriveCount = + NewControllerInfo->LogicalDevicesPresent; + Controller->V2.NeedLogicalDeviceInformation = true; + Controller->V2.NewLogicalDeviceInformation.LogicalDeviceNumber = 0; + Controller->V2.NeedPhysicalDeviceInformation = true; + Controller->V2.PhysicalDeviceIndex = 0; + Controller->V2.NewPhysicalDeviceInformation.Channel = 0; + Controller->V2.NewPhysicalDeviceInformation.TargetID = 0; + Controller->V2.NewPhysicalDeviceInformation.LogicalUnit = 0; + Controller->MonitoringAlertMode = + (NewControllerInfo->LogicalDevicesCritical > 0 || + NewControllerInfo->LogicalDevicesOffline > 0 || + NewControllerInfo->PhysicalDisksCritical > 0 || + NewControllerInfo->PhysicalDisksOffline > 0); + memcpy(ControllerInfo, NewControllerInfo, + sizeof(DAC960_V2_ControllerInfo_T)); + } + else if (CommandOpcode == DAC960_V2_GetEvent) + { + if (CommandStatus == DAC960_V2_NormalCompletion) + DAC960_V2_ReportEvent(Controller, &Controller->V2.Event); + Controller->V2.NextEventSequenceNumber++; + } + else if (CommandOpcode == DAC960_V2_GetPhysicalDeviceInfoValid && + CommandStatus == DAC960_V2_NormalCompletion) + { + DAC960_V2_PhysicalDeviceInfo_T *NewPhysicalDeviceInfo = + &Controller->V2.NewPhysicalDeviceInformation; + unsigned int PhysicalDeviceIndex = Controller->V2.PhysicalDeviceIndex; + DAC960_V2_PhysicalDeviceInfo_T *PhysicalDeviceInfo = + Controller->V2.PhysicalDeviceInformation[PhysicalDeviceIndex]; + DAC960_SCSI_Inquiry_UnitSerialNumber_T *InquiryUnitSerialNumber; + if (PhysicalDeviceInfo == NULL || + (NewPhysicalDeviceInfo->Channel != + PhysicalDeviceInfo->Channel) || + (NewPhysicalDeviceInfo->TargetID != + PhysicalDeviceInfo->TargetID) || + (NewPhysicalDeviceInfo->LogicalUnit != + PhysicalDeviceInfo->LogicalUnit)) { - DAC960_DCDB_T *DCDB = &Controller->MonitoringDCDB; - DAC960_SCSI_Inquiry_T *InquiryStandardData = - &Controller->InquiryStandardData - [Controller->DeviceStateChannel] - [Controller->DeviceStateTargetID]; - InquiryStandardData->PeripheralDeviceType = 0x1F; - Command->CommandMailbox.Type3.CommandOpcode = DAC960_DCDB; - Command->CommandMailbox.Type3.BusAddress = Virtual_to_Bus(DCDB); - DCDB->Channel = Controller->DeviceStateChannel; - DCDB->TargetID = Controller->DeviceStateTargetID; - DCDB->Direction = DAC960_DCDB_DataTransferDeviceToSystem; - DCDB->EarlyStatus = false; - DCDB->Timeout = DAC960_DCDB_Timeout_10_seconds; - DCDB->NoAutomaticRequestSense = false; - DCDB->DisconnectPermitted = true; - DCDB->TransferLength = sizeof(DAC960_SCSI_Inquiry_T); - DCDB->BusAddress = Virtual_to_Bus(InquiryStandardData); - DCDB->CDBLength = 6; - DCDB->TransferLengthHigh4 = 0; - DCDB->SenseLength = sizeof(DCDB->SenseData); - DCDB->CDB[0] = 0x12; /* INQUIRY */ - DCDB->CDB[1] = 0; /* EVPD = 0 */ - DCDB->CDB[2] = 0; /* Page Code */ - DCDB->CDB[3] = 0; /* Reserved */ - DCDB->CDB[4] = sizeof(DAC960_SCSI_Inquiry_T); - DCDB->CDB[5] = 0; /* Control */ - DAC960_QueueCommand(Command); - Controller->NeedDeviceInquiryInformation = false; - return; + unsigned int DeviceIndex; + PhysicalDeviceInfo = (DAC960_V2_PhysicalDeviceInfo_T *) + kmalloc(sizeof(DAC960_V2_PhysicalDeviceInfo_T), GFP_ATOMIC); + InquiryUnitSerialNumber = + (DAC960_SCSI_Inquiry_UnitSerialNumber_T *) + kmalloc(sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T), + GFP_ATOMIC); + if (InquiryUnitSerialNumber == NULL) + { + kfree(PhysicalDeviceInfo); + PhysicalDeviceInfo = NULL; + } + DAC960_Critical("Physical Device %d:%d Now Exists%s\n", + Controller, + NewPhysicalDeviceInfo->Channel, + NewPhysicalDeviceInfo->TargetID, + (PhysicalDeviceInfo != NULL + ? "" : " - Allocation Failed")); + if (PhysicalDeviceInfo != NULL) + { + for (DeviceIndex = PhysicalDeviceIndex; + DeviceIndex < DAC960_V2_MaxPhysicalDevices - 1; + DeviceIndex++) + { + Controller->V2.PhysicalDeviceInformation[DeviceIndex+1] = + Controller->V2.PhysicalDeviceInformation[DeviceIndex]; + Controller->V2.InquiryUnitSerialNumber[DeviceIndex+1] = + Controller->V2.InquiryUnitSerialNumber[DeviceIndex]; + Controller->V2.PhysicalDeviceInformation + [PhysicalDeviceIndex] = + PhysicalDeviceInfo; + Controller->V2.InquiryUnitSerialNumber + [PhysicalDeviceIndex] = + InquiryUnitSerialNumber; + } + memset(PhysicalDeviceInfo, 0, + sizeof(DAC960_V2_PhysicalDeviceInfo_T)); + PhysicalDeviceInfo->PhysicalDeviceState = + DAC960_V2_Device_InvalidState; + memset(InquiryUnitSerialNumber, 0, + sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T)); + InquiryUnitSerialNumber->PeripheralDeviceType = 0x1F; + Controller->V2.NeedDeviceSerialNumberInformation = true; + } } - if (Controller->NeedDeviceSerialNumberInformation) + if (PhysicalDeviceInfo != NULL) { - DAC960_DCDB_T *DCDB = &Controller->MonitoringDCDB; - DAC960_SCSI_Inquiry_UnitSerialNumber_T *InquiryUnitSerialNumber = - &Controller->InquiryUnitSerialNumber - [Controller->DeviceStateChannel] - [Controller->DeviceStateTargetID]; - InquiryUnitSerialNumber->PeripheralDeviceType = 0x1F; - Command->CommandMailbox.Type3.CommandOpcode = DAC960_DCDB; - Command->CommandMailbox.Type3.BusAddress = Virtual_to_Bus(DCDB); - DCDB->Channel = Controller->DeviceStateChannel; - DCDB->TargetID = Controller->DeviceStateTargetID; - DCDB->Direction = DAC960_DCDB_DataTransferDeviceToSystem; - DCDB->EarlyStatus = false; - DCDB->Timeout = DAC960_DCDB_Timeout_10_seconds; - DCDB->NoAutomaticRequestSense = false; - DCDB->DisconnectPermitted = true; - DCDB->TransferLength = - sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T); - DCDB->BusAddress = Virtual_to_Bus(InquiryUnitSerialNumber); - DCDB->CDBLength = 6; - DCDB->TransferLengthHigh4 = 0; - DCDB->SenseLength = sizeof(DCDB->SenseData); - DCDB->CDB[0] = 0x12; /* INQUIRY */ - DCDB->CDB[1] = 1; /* EVPD = 1 */ - DCDB->CDB[2] = 0x80; /* Page Code */ - DCDB->CDB[3] = 0; /* Reserved */ - DCDB->CDB[4] = sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T); - DCDB->CDB[5] = 0; /* Control */ - DAC960_QueueCommand(Command); - Controller->NeedDeviceSerialNumberInformation = false; - return; + if (NewPhysicalDeviceInfo->PhysicalDeviceState != + PhysicalDeviceInfo->PhysicalDeviceState) + DAC960_Critical("Physical Device %d:%d is now %s\n", Controller, + NewPhysicalDeviceInfo->Channel, + NewPhysicalDeviceInfo->TargetID, + (NewPhysicalDeviceInfo->PhysicalDeviceState + == DAC960_V2_Device_Unconfigured + ? "UNCONFIGURED" + : NewPhysicalDeviceInfo->PhysicalDeviceState + == DAC960_V2_Device_Online + ? "ONLINE" + : NewPhysicalDeviceInfo->PhysicalDeviceState + == DAC960_V2_Device_WriteOnly + ? "WRITE-ONLY" + : NewPhysicalDeviceInfo + ->PhysicalDeviceState + == DAC960_V2_Device_Dead + ? "DEAD" : "STANDBY")); + if ((NewPhysicalDeviceInfo->ParityErrors != + PhysicalDeviceInfo->ParityErrors) || + (NewPhysicalDeviceInfo->SoftErrors != + PhysicalDeviceInfo->SoftErrors) || + (NewPhysicalDeviceInfo->HardErrors != + PhysicalDeviceInfo->HardErrors) || + (NewPhysicalDeviceInfo->MiscellaneousErrors != + PhysicalDeviceInfo->MiscellaneousErrors) || + (NewPhysicalDeviceInfo->CommandTimeouts != + PhysicalDeviceInfo->CommandTimeouts) || + (NewPhysicalDeviceInfo->Retries != + PhysicalDeviceInfo->Retries) || + (NewPhysicalDeviceInfo->Aborts != + PhysicalDeviceInfo->Aborts) || + (NewPhysicalDeviceInfo->PredictedFailuresDetected != + PhysicalDeviceInfo->PredictedFailuresDetected)) + { + DAC960_Critical("Physical Device %d:%d Errors: " + "Parity = %d, Soft = %d, " + "Hard = %d, Misc = %d\n", + Controller, + NewPhysicalDeviceInfo->Channel, + NewPhysicalDeviceInfo->TargetID, + NewPhysicalDeviceInfo->ParityErrors, + NewPhysicalDeviceInfo->SoftErrors, + NewPhysicalDeviceInfo->HardErrors, + NewPhysicalDeviceInfo->MiscellaneousErrors); + DAC960_Critical("Physical Device %d:%d Errors: " + "Timeouts = %d, Retries = %d, " + "Aborts = %d, Predicted = %d\n", + Controller, + NewPhysicalDeviceInfo->Channel, + NewPhysicalDeviceInfo->TargetID, + NewPhysicalDeviceInfo->CommandTimeouts, + NewPhysicalDeviceInfo->Retries, + NewPhysicalDeviceInfo->Aborts, + NewPhysicalDeviceInfo + ->PredictedFailuresDetected); + } + if (PhysicalDeviceInfo->PhysicalDeviceState + == DAC960_V2_Device_Dead && + NewPhysicalDeviceInfo->PhysicalDeviceState + != DAC960_V2_Device_Dead) + Controller->V2.NeedDeviceSerialNumberInformation = true; + memcpy(PhysicalDeviceInfo, NewPhysicalDeviceInfo, + sizeof(DAC960_V2_PhysicalDeviceInfo_T)); } - if (++Controller->DeviceStateTargetID == DAC960_MaxTargets) + NewPhysicalDeviceInfo->LogicalUnit++; + Controller->V2.PhysicalDeviceIndex++; + } + else if (CommandOpcode == DAC960_V2_GetPhysicalDeviceInfoValid) + Controller->V2.NeedPhysicalDeviceInformation = false; + else if (CommandOpcode == DAC960_V2_GetLogicalDeviceInfoValid && + CommandStatus == DAC960_V2_NormalCompletion) + { + DAC960_V2_LogicalDeviceInfo_T *NewLogicalDeviceInfo = + &Controller->V2.NewLogicalDeviceInformation; + unsigned short LogicalDeviceNumber = + NewLogicalDeviceInfo->LogicalDeviceNumber; + DAC960_V2_LogicalDeviceInfo_T *LogicalDeviceInfo = + Controller->V2.LogicalDeviceInformation[LogicalDeviceNumber]; + if (LogicalDeviceInfo == NULL) { - Controller->DeviceStateChannel++; - Controller->DeviceStateTargetID = 0; + DAC960_V2_PhysicalDevice_T PhysicalDevice; + PhysicalDevice.Controller = 0; + PhysicalDevice.Channel = NewLogicalDeviceInfo->Channel; + PhysicalDevice.TargetID = NewLogicalDeviceInfo->TargetID; + PhysicalDevice.LogicalUnit = NewLogicalDeviceInfo->LogicalUnit; + Controller->V2.LogicalDriveToVirtualDevice[LogicalDeviceNumber] = + PhysicalDevice; + LogicalDeviceInfo = (DAC960_V2_LogicalDeviceInfo_T *) + kmalloc(sizeof(DAC960_V2_LogicalDeviceInfo_T), GFP_ATOMIC); + Controller->V2.LogicalDeviceInformation[LogicalDeviceNumber] = + LogicalDeviceInfo; + DAC960_Critical("Logical Drive %d (/dev/rd/c%dd%d) " + "Now Exists%s\n", Controller, + LogicalDeviceNumber, + Controller->ControllerNumber, + LogicalDeviceNumber, + (LogicalDeviceInfo != NULL + ? "" : " - Allocation Failed")); + if (LogicalDeviceInfo != NULL) + memset(LogicalDeviceInfo, 0, + sizeof(DAC960_V2_LogicalDeviceInfo_T)); } - while (Controller->DeviceStateChannel < Controller->Channels) + if (LogicalDeviceInfo != NULL) { - DAC960_DeviceState_T *OldDeviceState = - &Controller->DeviceState[Controller->DeviceStateIndex] - [Controller->DeviceStateChannel] - [Controller->DeviceStateTargetID]; - if (OldDeviceState->Present && - OldDeviceState->DeviceType == DAC960_DiskType) - { - Command->CommandMailbox.Type3D.CommandOpcode = - DAC960_GetDeviceState; - Command->CommandMailbox.Type3D.Channel = - Controller->DeviceStateChannel; - Command->CommandMailbox.Type3D.TargetID = - Controller->DeviceStateTargetID; - Command->CommandMailbox.Type3D.BusAddress = - Virtual_to_Bus(&Controller->DeviceState - [Controller->DeviceStateIndex ^ 1] - [Controller->DeviceStateChannel] - [Controller->DeviceStateTargetID]); - DAC960_QueueCommand(Command); - return; - } - if (++Controller->DeviceStateTargetID == DAC960_MaxTargets) - { - Controller->DeviceStateChannel++; - Controller->DeviceStateTargetID = 0; - } + unsigned long LogicalDeviceSize = + NewLogicalDeviceInfo->ConfigurableDeviceSizeIn512ByteBlocksOrMB; + if (NewLogicalDeviceInfo->LogicalDeviceState != + LogicalDeviceInfo->LogicalDeviceState) + DAC960_Critical("Logical Drive %d (/dev/rd/c%dd%d) " + "is now %s\n", Controller, + LogicalDeviceNumber, + Controller->ControllerNumber, + LogicalDeviceNumber, + (NewLogicalDeviceInfo->LogicalDeviceState + == DAC960_V2_LogicalDevice_Online + ? "ONLINE" + : NewLogicalDeviceInfo->LogicalDeviceState + == DAC960_V2_LogicalDevice_Critical + ? "CRITICAL" : "OFFLINE")); + if ((NewLogicalDeviceInfo->SoftErrors != + LogicalDeviceInfo->SoftErrors) || + (NewLogicalDeviceInfo->CommandsFailed != + LogicalDeviceInfo->CommandsFailed) || + (NewLogicalDeviceInfo->DeferredWriteErrors != + LogicalDeviceInfo->DeferredWriteErrors)) + DAC960_Critical("Logical Drive %d (/dev/rd/c%dd%d) Errors: " + "Soft = %d, Failed = %d, Deferred Write = %d\n", + Controller, LogicalDeviceNumber, + Controller->ControllerNumber, + LogicalDeviceNumber, + NewLogicalDeviceInfo->SoftErrors, + NewLogicalDeviceInfo->CommandsFailed, + NewLogicalDeviceInfo->DeferredWriteErrors); + if (NewLogicalDeviceInfo->ConsistencyCheckInProgress) + DAC960_V2_ReportProgress(Controller, + "Consistency Check", + LogicalDeviceNumber, + NewLogicalDeviceInfo + ->ConsistencyCheckBlockNumber, + LogicalDeviceSize); + else if (NewLogicalDeviceInfo->RebuildInProgress) + DAC960_V2_ReportProgress(Controller, + "Rebuild", + LogicalDeviceNumber, + NewLogicalDeviceInfo + ->RebuildBlockNumber, + LogicalDeviceSize); + else if (NewLogicalDeviceInfo->BackgroundInitializationInProgress) + DAC960_V2_ReportProgress(Controller, + "BackgroundInitialization", + LogicalDeviceNumber, + NewLogicalDeviceInfo + ->BackgroundInitializationBlockNumber, + LogicalDeviceSize); + else if (NewLogicalDeviceInfo->ForegroundInitializationInProgress) + DAC960_V2_ReportProgress(Controller, + "Foreground Initialization", + LogicalDeviceNumber, + NewLogicalDeviceInfo + ->ForegroundInitializationBlockNumber, + LogicalDeviceSize); + else if (NewLogicalDeviceInfo->DataMigrationInProgress) + DAC960_V2_ReportProgress(Controller, + "Data Migration", + LogicalDeviceNumber, + NewLogicalDeviceInfo + ->DataMigrationBlockNumber, + LogicalDeviceSize); + else if (NewLogicalDeviceInfo->PatrolOperationInProgress) + DAC960_V2_ReportProgress(Controller, + "Patrol Operation", + LogicalDeviceNumber, + NewLogicalDeviceInfo + ->PatrolOperationBlockNumber, + LogicalDeviceSize); + memcpy(LogicalDeviceInfo, NewLogicalDeviceInfo, + sizeof(DAC960_V2_LogicalDeviceInfo_T)); } - Controller->NeedDeviceStateInformation = false; - Controller->DeviceStateIndex ^= 1; + NewLogicalDeviceInfo->LogicalDeviceNumber++; } - if (Controller->NeedLogicalDriveInformation) - { - Controller->NeedLogicalDriveInformation = false; - Command->CommandMailbox.Type3.CommandOpcode = - DAC960_GetLogicalDriveInformation; - Command->CommandMailbox.Type3.BusAddress = - Virtual_to_Bus( - &Controller->LogicalDriveInformation - [Controller->LogicalDriveInformationIndex ^ 1]); + else if (CommandOpcode == DAC960_V2_GetLogicalDeviceInfoValid) + Controller->V2.NeedLogicalDeviceInformation = false; + if (Controller->V2.HealthStatusBuffer->NextEventSequenceNumber + - Controller->V2.NextEventSequenceNumber > 0) + { + CommandMailbox->GetEvent.CommandOpcode = DAC960_V2_IOCTL; + CommandMailbox->GetEvent.DataTransferSize = sizeof(DAC960_V2_Event_T); + CommandMailbox->GetEvent.EventSequenceNumberHigh16 = + Controller->V2.NextEventSequenceNumber >> 16; + CommandMailbox->GetEvent.ControllerNumber = 0; + CommandMailbox->GetEvent.IOCTL_Opcode = + DAC960_V2_GetEvent; + CommandMailbox->GetEvent.EventSequenceNumberLow16 = + Controller->V2.NextEventSequenceNumber & 0xFFFF; + CommandMailbox->GetEvent.DataTransferMemoryAddress + .ScatterGatherSegments[0] + .SegmentDataPointer = + Virtual_to_Bus(&Controller->V2.Event); + CommandMailbox->GetEvent.DataTransferMemoryAddress + .ScatterGatherSegments[0] + .SegmentByteCount = + CommandMailbox->GetEvent.DataTransferSize; DAC960_QueueCommand(Command); return; } - if (Controller->NeedRebuildProgress) + if (Controller->V2.NeedPhysicalDeviceInformation) { - Controller->NeedRebuildProgress = false; - Command->CommandMailbox.Type3.CommandOpcode = - DAC960_GetRebuildProgress; - Command->CommandMailbox.Type3.BusAddress = - Virtual_to_Bus(&Controller->RebuildProgress); + if (Controller->V2.NeedDeviceSerialNumberInformation) + { + DAC960_SCSI_Inquiry_UnitSerialNumber_T *InquiryUnitSerialNumber = + Controller->V2.InquiryUnitSerialNumber + [Controller->V2.PhysicalDeviceIndex - 1]; + InquiryUnitSerialNumber->PeripheralDeviceType = 0x1F; + CommandMailbox->SCSI_10.CommandOpcode = + DAC960_V2_SCSI_10_Passthru; + CommandMailbox->SCSI_10.DataTransferSize = + sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T); + CommandMailbox->SCSI_10.PhysicalDevice.LogicalUnit = + Controller->V2.NewPhysicalDeviceInformation.LogicalUnit - 1; + CommandMailbox->SCSI_10.PhysicalDevice.TargetID = + Controller->V2.NewPhysicalDeviceInformation.TargetID; + CommandMailbox->SCSI_10.PhysicalDevice.Channel = + Controller->V2.NewPhysicalDeviceInformation.Channel; + CommandMailbox->SCSI_10.CDBLength = 6; + CommandMailbox->SCSI_10.SCSI_CDB[0] = 0x12; /* INQUIRY */ + CommandMailbox->SCSI_10.SCSI_CDB[1] = 1; /* EVPD = 1 */ + CommandMailbox->SCSI_10.SCSI_CDB[2] = 0x80; /* Page Code */ + CommandMailbox->SCSI_10.SCSI_CDB[3] = 0; /* Reserved */ + CommandMailbox->SCSI_10.SCSI_CDB[4] = + sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T); + CommandMailbox->SCSI_10.SCSI_CDB[5] = 0; /* Control */ + CommandMailbox->SCSI_10.DataTransferMemoryAddress + .ScatterGatherSegments[0] + .SegmentDataPointer = + Virtual_to_Bus(InquiryUnitSerialNumber); + CommandMailbox->SCSI_10.DataTransferMemoryAddress + .ScatterGatherSegments[0] + .SegmentByteCount = + CommandMailbox->SCSI_10.DataTransferSize; + DAC960_QueueCommand(Command); + Controller->V2.NeedDeviceSerialNumberInformation = false; + return; + } + CommandMailbox->PhysicalDeviceInfo.CommandOpcode = DAC960_V2_IOCTL; + CommandMailbox->PhysicalDeviceInfo.DataTransferSize = + sizeof(DAC960_V2_PhysicalDeviceInfo_T); + CommandMailbox->PhysicalDeviceInfo.PhysicalDevice.LogicalUnit = + Controller->V2.NewPhysicalDeviceInformation.LogicalUnit; + CommandMailbox->PhysicalDeviceInfo.PhysicalDevice.TargetID = + Controller->V2.NewPhysicalDeviceInformation.TargetID; + CommandMailbox->PhysicalDeviceInfo.PhysicalDevice.Channel = + Controller->V2.NewPhysicalDeviceInformation.Channel; + CommandMailbox->PhysicalDeviceInfo.IOCTL_Opcode = + DAC960_V2_GetPhysicalDeviceInfoValid; + CommandMailbox->PhysicalDeviceInfo.DataTransferMemoryAddress + .ScatterGatherSegments[0] + .SegmentDataPointer = + Virtual_to_Bus(&Controller->V2.NewPhysicalDeviceInformation); + CommandMailbox->PhysicalDeviceInfo.DataTransferMemoryAddress + .ScatterGatherSegments[0] + .SegmentByteCount = + CommandMailbox->PhysicalDeviceInfo.DataTransferSize; DAC960_QueueCommand(Command); return; } - if (Controller->NeedConsistencyCheckProgress) + if (Controller->V2.NeedLogicalDeviceInformation) { - Controller->NeedConsistencyCheckProgress = false; - Command->CommandMailbox.Type3.CommandOpcode = DAC960_RebuildStat; - Command->CommandMailbox.Type3.BusAddress = - Virtual_to_Bus(&Controller->RebuildProgress); + CommandMailbox->LogicalDeviceInfo.CommandOpcode = DAC960_V2_IOCTL; + CommandMailbox->LogicalDeviceInfo.DataTransferSize = + sizeof(DAC960_V2_LogicalDeviceInfo_T); + CommandMailbox->LogicalDeviceInfo.LogicalDevice.LogicalDeviceNumber = + Controller->V2.NewLogicalDeviceInformation.LogicalDeviceNumber; + CommandMailbox->LogicalDeviceInfo.IOCTL_Opcode = + DAC960_V2_GetLogicalDeviceInfoValid; + CommandMailbox->LogicalDeviceInfo.DataTransferMemoryAddress + .ScatterGatherSegments[0] + .SegmentDataPointer = + Virtual_to_Bus(&Controller->V2.NewLogicalDeviceInformation); + CommandMailbox->LogicalDeviceInfo.DataTransferMemoryAddress + .ScatterGatherSegments[0] + .SegmentByteCount = + CommandMailbox->LogicalDeviceInfo.DataTransferSize; DAC960_QueueCommand(Command); return; } Controller->MonitoringTimerCount++; Controller->MonitoringTimer.expires = - jiffies + DAC960_MonitoringTimerInterval; + jiffies + DAC960_HealthStatusMonitoringInterval; add_timer(&Controller->MonitoringTimer); } if (CommandType == DAC960_ImmediateCommand) @@ -2406,12 +4514,11 @@ } if (CommandType == DAC960_QueuedCommand) { - DAC960_KernelCommand_T *KernelCommand = Command->KernelCommand; - KernelCommand->CommandStatus = Command->CommandStatus; - Command->KernelCommand = NULL; - if (CommandOpcode == DAC960_DCDB) - Controller->DirectCommandActive[KernelCommand->DCDB->Channel] - [KernelCommand->DCDB->TargetID] = false; + DAC960_V2_KernelCommand_T *KernelCommand = Command->V2.KernelCommand; + KernelCommand->CommandStatus = CommandStatus; + KernelCommand->RequestSenseLength = Command->V2.RequestSenseLength; + KernelCommand->DataTransferLength = Command->V2.DataTransferResidue; + Command->V2.KernelCommand = NULL; DAC960_DeallocateCommand(Command); KernelCommand->CompletionFunction(KernelCommand); return; @@ -2424,7 +4531,7 @@ if (Controller->MonitoringCommandDeferred) { Controller->MonitoringCommandDeferred = false; - DAC960_QueueMonitoringCommand(Command); + DAC960_V2_QueueMonitoringCommand(Command); return; } /* @@ -2438,17 +4545,209 @@ } +/* + DAC960_BA_InterruptHandler handles hardware interrupts from DAC960 BA Series + Controllers. +*/ + +static void DAC960_BA_InterruptHandler(int IRQ_Channel, + void *DeviceIdentifier, + Registers_T *InterruptRegisters) +{ + DAC960_Controller_T *Controller = (DAC960_Controller_T *) DeviceIdentifier; + void *ControllerBaseAddress = Controller->BaseAddress; + DAC960_V2_StatusMailbox_T *NextStatusMailbox; + ProcessorFlags_T ProcessorFlags; + /* + Acquire exclusive access to Controller. + */ + DAC960_AcquireControllerLockIH(Controller, &ProcessorFlags); + /* + Process Hardware Interrupts for Controller. + */ + DAC960_BA_AcknowledgeInterrupt(ControllerBaseAddress); + NextStatusMailbox = Controller->V2.NextStatusMailbox; + while (NextStatusMailbox->Fields.CommandIdentifier > 0) + { + DAC960_V2_CommandIdentifier_T CommandIdentifier = + NextStatusMailbox->Fields.CommandIdentifier; + DAC960_Command_T *Command = Controller->Commands[CommandIdentifier-1]; + Command->V2.CommandStatus = NextStatusMailbox->Fields.CommandStatus; + Command->V2.RequestSenseLength = + NextStatusMailbox->Fields.RequestSenseLength; + Command->V2.DataTransferResidue = + NextStatusMailbox->Fields.DataTransferResidue; + NextStatusMailbox->Words[0] = 0; + if (++NextStatusMailbox > Controller->V2.LastStatusMailbox) + NextStatusMailbox = Controller->V2.FirstStatusMailbox; + DAC960_V2_ProcessCompletedCommand(Command); + } + Controller->V2.NextStatusMailbox = NextStatusMailbox; + /* + Attempt to remove additional I/O Requests from the Controller's + I/O Request Queue and queue them to the Controller. + */ + while (DAC960_ProcessRequest(Controller, false)) ; + /* + Release exclusive access to Controller. + */ + DAC960_ReleaseControllerLockIH(Controller, &ProcessorFlags); +} + + +/* + DAC960_LP_InterruptHandler handles hardware interrupts from DAC960 LP Series + Controllers. +*/ + +static void DAC960_LP_InterruptHandler(int IRQ_Channel, + void *DeviceIdentifier, + Registers_T *InterruptRegisters) +{ + DAC960_Controller_T *Controller = (DAC960_Controller_T *) DeviceIdentifier; + void *ControllerBaseAddress = Controller->BaseAddress; + DAC960_V2_StatusMailbox_T *NextStatusMailbox; + ProcessorFlags_T ProcessorFlags; + /* + Acquire exclusive access to Controller. + */ + DAC960_AcquireControllerLockIH(Controller, &ProcessorFlags); + /* + Process Hardware Interrupts for Controller. + */ + DAC960_LP_AcknowledgeInterrupt(ControllerBaseAddress); + NextStatusMailbox = Controller->V2.NextStatusMailbox; + while (NextStatusMailbox->Fields.CommandIdentifier > 0) + { + DAC960_V2_CommandIdentifier_T CommandIdentifier = + NextStatusMailbox->Fields.CommandIdentifier; + DAC960_Command_T *Command = Controller->Commands[CommandIdentifier-1]; + Command->V2.CommandStatus = NextStatusMailbox->Fields.CommandStatus; + Command->V2.RequestSenseLength = + NextStatusMailbox->Fields.RequestSenseLength; + Command->V2.DataTransferResidue = + NextStatusMailbox->Fields.DataTransferResidue; + NextStatusMailbox->Words[0] = 0; + if (++NextStatusMailbox > Controller->V2.LastStatusMailbox) + NextStatusMailbox = Controller->V2.FirstStatusMailbox; + DAC960_V2_ProcessCompletedCommand(Command); + } + Controller->V2.NextStatusMailbox = NextStatusMailbox; + /* + Attempt to remove additional I/O Requests from the Controller's + I/O Request Queue and queue them to the Controller. + */ + while (DAC960_ProcessRequest(Controller, false)) ; + /* + Release exclusive access to Controller. + */ + DAC960_ReleaseControllerLockIH(Controller, &ProcessorFlags); +} + + +/* + DAC960_LA_InterruptHandler handles hardware interrupts from DAC960 LA Series + Controllers. +*/ + +static void DAC960_LA_InterruptHandler(int IRQ_Channel, + void *DeviceIdentifier, + Registers_T *InterruptRegisters) +{ + DAC960_Controller_T *Controller = (DAC960_Controller_T *) DeviceIdentifier; + void *ControllerBaseAddress = Controller->BaseAddress; + DAC960_V1_StatusMailbox_T *NextStatusMailbox; + ProcessorFlags_T ProcessorFlags; + /* + Acquire exclusive access to Controller. + */ + DAC960_AcquireControllerLockIH(Controller, &ProcessorFlags); + /* + Process Hardware Interrupts for Controller. + */ + DAC960_LA_AcknowledgeInterrupt(ControllerBaseAddress); + NextStatusMailbox = Controller->V1.NextStatusMailbox; + while (NextStatusMailbox->Fields.Valid) + { + DAC960_V1_CommandIdentifier_T CommandIdentifier = + NextStatusMailbox->Fields.CommandIdentifier; + DAC960_Command_T *Command = Controller->Commands[CommandIdentifier-1]; + Command->V1.CommandStatus = NextStatusMailbox->Fields.CommandStatus; + NextStatusMailbox->Word = 0; + if (++NextStatusMailbox > Controller->V1.LastStatusMailbox) + NextStatusMailbox = Controller->V1.FirstStatusMailbox; + DAC960_V1_ProcessCompletedCommand(Command); + } + Controller->V1.NextStatusMailbox = NextStatusMailbox; + /* + Attempt to remove additional I/O Requests from the Controller's + I/O Request Queue and queue them to the Controller. + */ + while (DAC960_ProcessRequest(Controller, false)) ; + /* + Release exclusive access to Controller. + */ + DAC960_ReleaseControllerLockIH(Controller, &ProcessorFlags); +} + + +/* + DAC960_PG_InterruptHandler handles hardware interrupts from DAC960 PG Series + Controllers. +*/ + +static void DAC960_PG_InterruptHandler(int IRQ_Channel, + void *DeviceIdentifier, + Registers_T *InterruptRegisters) +{ + DAC960_Controller_T *Controller = (DAC960_Controller_T *) DeviceIdentifier; + void *ControllerBaseAddress = Controller->BaseAddress; + DAC960_V1_StatusMailbox_T *NextStatusMailbox; + ProcessorFlags_T ProcessorFlags; + /* + Acquire exclusive access to Controller. + */ + DAC960_AcquireControllerLockIH(Controller, &ProcessorFlags); + /* + Process Hardware Interrupts for Controller. + */ + DAC960_PG_AcknowledgeInterrupt(ControllerBaseAddress); + NextStatusMailbox = Controller->V1.NextStatusMailbox; + while (NextStatusMailbox->Fields.Valid) + { + DAC960_V1_CommandIdentifier_T CommandIdentifier = + NextStatusMailbox->Fields.CommandIdentifier; + DAC960_Command_T *Command = Controller->Commands[CommandIdentifier-1]; + Command->V1.CommandStatus = NextStatusMailbox->Fields.CommandStatus; + NextStatusMailbox->Word = 0; + if (++NextStatusMailbox > Controller->V1.LastStatusMailbox) + NextStatusMailbox = Controller->V1.FirstStatusMailbox; + DAC960_V1_ProcessCompletedCommand(Command); + } + Controller->V1.NextStatusMailbox = NextStatusMailbox; + /* + Attempt to remove additional I/O Requests from the Controller's + I/O Request Queue and queue them to the Controller. + */ + while (DAC960_ProcessRequest(Controller, false)) ; + /* + Release exclusive access to Controller. + */ + DAC960_ReleaseControllerLockIH(Controller, &ProcessorFlags); +} + + /* - DAC960_InterruptHandler handles hardware interrupts from DAC960 Controllers. + DAC960_PD_InterruptHandler handles hardware interrupts from DAC960 PD Series + Controllers. */ -static void DAC960_InterruptHandler(int IRQ_Channel, - void *DeviceIdentifier, - Registers_T *InterruptRegisters) +static void DAC960_PD_InterruptHandler(int IRQ_Channel, + void *DeviceIdentifier, + Registers_T *InterruptRegisters) { DAC960_Controller_T *Controller = (DAC960_Controller_T *) DeviceIdentifier; void *ControllerBaseAddress = Controller->BaseAddress; - DAC960_StatusMailbox_T *NextStatusMailbox; ProcessorFlags_T ProcessorFlags; /* Acquire exclusive access to Controller. @@ -2457,53 +4756,16 @@ /* Process Hardware Interrupts for Controller. */ - switch (Controller->ControllerType) + while (DAC960_PD_StatusAvailableP(ControllerBaseAddress)) { - case DAC960_V5_Controller: - DAC960_V5_AcknowledgeInterrupt(ControllerBaseAddress); - NextStatusMailbox = Controller->NextStatusMailbox; - while (NextStatusMailbox->Fields.Valid) - { - DAC960_CommandIdentifier_T CommandIdentifier = - NextStatusMailbox->Fields.CommandIdentifier; - DAC960_Command_T *Command = &Controller->Commands[CommandIdentifier]; - Command->CommandStatus = NextStatusMailbox->Fields.CommandStatus; - NextStatusMailbox->Word = 0; - if (++NextStatusMailbox > Controller->LastStatusMailbox) - NextStatusMailbox = Controller->FirstStatusMailbox; - DAC960_ProcessCompletedCommand(Command); - } - Controller->NextStatusMailbox = NextStatusMailbox; - break; - case DAC960_V4_Controller: - DAC960_V4_AcknowledgeInterrupt(ControllerBaseAddress); - NextStatusMailbox = Controller->NextStatusMailbox; - while (NextStatusMailbox->Fields.Valid) - { - DAC960_CommandIdentifier_T CommandIdentifier = - NextStatusMailbox->Fields.CommandIdentifier; - DAC960_Command_T *Command = &Controller->Commands[CommandIdentifier]; - Command->CommandStatus = NextStatusMailbox->Fields.CommandStatus; - NextStatusMailbox->Word = 0; - if (++NextStatusMailbox > Controller->LastStatusMailbox) - NextStatusMailbox = Controller->FirstStatusMailbox; - DAC960_ProcessCompletedCommand(Command); - } - Controller->NextStatusMailbox = NextStatusMailbox; - break; - case DAC960_V3_Controller: - while (DAC960_V3_StatusAvailableP(ControllerBaseAddress)) - { - DAC960_CommandIdentifier_T CommandIdentifier = - DAC960_V3_ReadStatusCommandIdentifier(ControllerBaseAddress); - DAC960_Command_T *Command = &Controller->Commands[CommandIdentifier]; - Command->CommandStatus = - DAC960_V3_ReadStatusRegister(ControllerBaseAddress); - DAC960_V3_AcknowledgeInterrupt(ControllerBaseAddress); - DAC960_V3_AcknowledgeStatus(ControllerBaseAddress); - DAC960_ProcessCompletedCommand(Command); - } - break; + DAC960_V1_CommandIdentifier_T CommandIdentifier = + DAC960_PD_ReadStatusCommandIdentifier(ControllerBaseAddress); + DAC960_Command_T *Command = Controller->Commands[CommandIdentifier-1]; + Command->V1.CommandStatus = + DAC960_PD_ReadStatusRegister(ControllerBaseAddress); + DAC960_PD_AcknowledgeInterrupt(ControllerBaseAddress); + DAC960_PD_AcknowledgeStatus(ControllerBaseAddress); + DAC960_V1_ProcessCompletedCommand(Command); } /* Attempt to remove additional I/O Requests from the Controller's @@ -2517,19 +4779,51 @@ } +/* + DAC960_V1_QueueMonitoringCommand queues a Monitoring Command to DAC960 V1 + Firmware Controllers. +*/ + +static void DAC960_V1_QueueMonitoringCommand(DAC960_Command_T *Command) +{ + DAC960_Controller_T *Controller = Command->Controller; + DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox; + DAC960_V1_ClearCommand(Command); + Command->CommandType = DAC960_MonitoringCommand; + CommandMailbox->Type3.CommandOpcode = DAC960_V1_Enquiry; + CommandMailbox->Type3.BusAddress = Virtual_to_Bus(&Controller->V1.NewEnquiry); + DAC960_QueueCommand(Command); +} + + /* - DAC960_QueueMonitoringCommand queues a Monitoring Command to Controller. + DAC960_V2_QueueMonitoringCommand queues a Monitoring Command to DAC960 V2 + Firmware Controllers. */ -static void DAC960_QueueMonitoringCommand(DAC960_Command_T *Command) +static void DAC960_V2_QueueMonitoringCommand(DAC960_Command_T *Command) { DAC960_Controller_T *Controller = Command->Controller; - DAC960_CommandMailbox_T *CommandMailbox = &Command->CommandMailbox; - DAC960_ClearCommand(Command); + DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox; + DAC960_V2_ClearCommand(Command); Command->CommandType = DAC960_MonitoringCommand; - CommandMailbox->Type3.CommandOpcode = DAC960_Enquiry; - CommandMailbox->Type3.BusAddress = - Virtual_to_Bus(&Controller->Enquiry[Controller->EnquiryIndex ^ 1]); + CommandMailbox->ControllerInfo.CommandOpcode = DAC960_V2_IOCTL; + CommandMailbox->ControllerInfo.CommandControlBits + .DataTransferControllerToHost = true; + CommandMailbox->ControllerInfo.CommandControlBits + .NoAutoRequestSense = true; + CommandMailbox->ControllerInfo.DataTransferSize = + sizeof(DAC960_V2_ControllerInfo_T); + CommandMailbox->ControllerInfo.ControllerNumber = 0; + CommandMailbox->ControllerInfo.IOCTL_Opcode = DAC960_V2_GetControllerInfo; + CommandMailbox->ControllerInfo.DataTransferMemoryAddress + .ScatterGatherSegments[0] + .SegmentDataPointer = + Virtual_to_Bus(&Controller->V2.NewControllerInformation); + CommandMailbox->ControllerInfo.DataTransferMemoryAddress + .ScatterGatherSegments[0] + .SegmentByteCount = + CommandMailbox->ControllerInfo.DataTransferSize; DAC960_QueueCommand(Command); } @@ -2544,21 +4838,69 @@ DAC960_Controller_T *Controller = (DAC960_Controller_T *) TimerData; DAC960_Command_T *Command; ProcessorFlags_T ProcessorFlags; - /* - Acquire exclusive access to Controller. - */ - DAC960_AcquireControllerLock(Controller, &ProcessorFlags); - /* - Queue a Status Monitoring Command to Controller. - */ - Command = DAC960_AllocateCommand(Controller); - if (Command != NULL) - DAC960_QueueMonitoringCommand(Command); - else Controller->MonitoringCommandDeferred = true; - /* - Release exclusive access to Controller. - */ - DAC960_ReleaseControllerLock(Controller, &ProcessorFlags); + if (Controller->FirmwareType == DAC960_V1_Controller) + { + /* + Acquire exclusive access to Controller. + */ + DAC960_AcquireControllerLock(Controller, &ProcessorFlags); + /* + Queue a Status Monitoring Command to Controller. + */ + Command = DAC960_AllocateCommand(Controller); + if (Command != NULL) + DAC960_V1_QueueMonitoringCommand(Command); + else Controller->MonitoringCommandDeferred = true; + /* + Release exclusive access to Controller. + */ + DAC960_ReleaseControllerLock(Controller, &ProcessorFlags); + } + else + { + DAC960_V2_ControllerInfo_T *ControllerInfo = + &Controller->V2.ControllerInformation; + unsigned int StatusChangeCounter = + Controller->V2.HealthStatusBuffer->StatusChangeCounter; + if (StatusChangeCounter == Controller->V2.StatusChangeCounter && + Controller->V2.HealthStatusBuffer->NextEventSequenceNumber + == Controller->V2.NextEventSequenceNumber && + (ControllerInfo->BackgroundInitializationsActive + + ControllerInfo->LogicalDeviceInitializationsActive + + ControllerInfo->PhysicalDeviceInitializationsActive + + ControllerInfo->ConsistencyChecksActive + + ControllerInfo->RebuildsActive + + ControllerInfo->OnlineExpansionsActive == 0 || + jiffies - Controller->PrimaryMonitoringTime + < DAC960_MonitoringTimerInterval)) + { + Controller->MonitoringTimer.expires = + jiffies + DAC960_HealthStatusMonitoringInterval; + add_timer(&Controller->MonitoringTimer); + return; + } + Controller->V2.StatusChangeCounter = StatusChangeCounter; + Controller->PrimaryMonitoringTime = jiffies; + /* + Acquire exclusive access to Controller. + */ + DAC960_AcquireControllerLock(Controller, &ProcessorFlags); + /* + Queue a Status Monitoring Command to Controller. + */ + Command = DAC960_AllocateCommand(Controller); + if (Command != NULL) + DAC960_V2_QueueMonitoringCommand(Command); + else Controller->MonitoringCommandDeferred = true; + /* + Release exclusive access to Controller. + */ + DAC960_ReleaseControllerLock(Controller, &ProcessorFlags); + /* + Wake up any processes waiting on a Health Status Buffer change. + */ + wake_up(&Controller->HealthStatusWaitQueue); + } } @@ -2577,19 +4919,28 @@ if (ControllerNumber < 0 || ControllerNumber > DAC960_ControllerCount - 1) return -ENXIO; Controller = DAC960_Controllers[ControllerNumber]; - if (Controller == NULL || - LogicalDriveNumber > Controller->LogicalDriveCount - 1) - return -ENXIO; - if (Controller->LogicalDriveInformation - [Controller->LogicalDriveInformationIndex] - [LogicalDriveNumber].LogicalDriveState - == DAC960_LogicalDrive_Offline) - return -ENXIO; - if (Controller->LogicalDriveInitialState[LogicalDriveNumber] - == DAC960_LogicalDrive_Offline) + if (Controller == NULL) return -ENXIO; + if (Controller->FirmwareType == DAC960_V1_Controller) + { + if (LogicalDriveNumber > Controller->LogicalDriveCount - 1) + return -ENXIO; + if (Controller->V1.LogicalDriveInformation + [LogicalDriveNumber].LogicalDriveState + == DAC960_V1_LogicalDrive_Offline) + return -ENXIO; + } + else + { + DAC960_V2_LogicalDeviceInfo_T *LogicalDeviceInfo = + Controller->V2.LogicalDeviceInformation[LogicalDriveNumber]; + if (LogicalDeviceInfo == NULL || + LogicalDeviceInfo->LogicalDeviceState + == DAC960_V2_LogicalDevice_Offline) + return -ENXIO; + } + if (!Controller->LogicalDriveInitiallyAccessible[LogicalDriveNumber]) { - Controller->LogicalDriveInitialState[LogicalDriveNumber] = - DAC960_LogicalDrive_Online; + Controller->LogicalDriveInitiallyAccessible[LogicalDriveNumber] = true; DAC960_InitializeGenericDiskInfo(&Controller->GenericDiskInfo); resetup_one_dev(&Controller->GenericDiskInfo, LogicalDriveNumber); } @@ -2650,25 +5001,51 @@ if (ControllerNumber < 0 || ControllerNumber > DAC960_ControllerCount - 1) return -ENXIO; Controller = DAC960_Controllers[ControllerNumber]; - if (Controller == NULL || - LogicalDriveNumber > Controller->LogicalDriveCount - 1) - return -ENXIO; + if (Controller == NULL) return -ENXIO; switch (Request) { case HDIO_GETGEO: /* Get BIOS Disk Geometry. */ UserGeometry = (DiskGeometry_T *) Argument; if (UserGeometry == NULL) return -EINVAL; - Geometry.heads = Controller->GeometryTranslationHeads; - Geometry.sectors = Controller->GeometryTranslationSectors; - Geometry.cylinders = - Controller->LogicalDriveInformation - [Controller->LogicalDriveInformationIndex] - [LogicalDriveNumber].LogicalDriveSize - / (Controller->GeometryTranslationHeads * - Controller->GeometryTranslationSectors); - Geometry.start = Controller->GenericDiskInfo.part[MINOR(Inode->i_rdev)] - .start_sect; + if (Controller->FirmwareType == DAC960_V1_Controller) + { + if (LogicalDriveNumber > Controller->LogicalDriveCount - 1) + return -ENXIO; + Geometry.heads = Controller->V1.GeometryTranslationHeads; + Geometry.sectors = Controller->V1.GeometryTranslationSectors; + Geometry.cylinders = + Controller->V1.LogicalDriveInformation[LogicalDriveNumber] + .LogicalDriveSize + / (Geometry.heads * Geometry.sectors); + } + else + { + DAC960_V2_LogicalDeviceInfo_T *LogicalDeviceInfo = + Controller->V2.LogicalDeviceInformation[LogicalDriveNumber]; + if (LogicalDeviceInfo == NULL) + return -EINVAL; + switch(LogicalDeviceInfo->DriveGeometry) + { + case DAC960_V2_Geometry_128_32: + Geometry.heads = 128; + Geometry.sectors = 32; + break; + case DAC960_V2_Geometry_255_63: + Geometry.heads = 255; + Geometry.sectors = 63; + break; + default: + DAC960_Error("Illegal Logical Device Geometry %d\n", + Controller, LogicalDeviceInfo->DriveGeometry); + return -EINVAL; + } + Geometry.cylinders = + LogicalDeviceInfo->ConfigurableDeviceSizeIn512ByteBlocksOrMB + / (Geometry.heads * Geometry.sectors); + } + Geometry.start = + Controller->GenericDiskInfo.part[MINOR(Inode->i_rdev)].start_sect; return copy_to_user(UserGeometry, &Geometry, sizeof(DiskGeometry_T)); case BLKGETSIZE: /* Get Device Size. */ @@ -2764,59 +5141,63 @@ ControllerNumber > DAC960_ControllerCount - 1) return -ENXIO; Controller = DAC960_Controllers[ControllerNumber]; - if (Controller == NULL) - return -ENXIO; + if (Controller == NULL) return -ENXIO; memset(&ControllerInfo, 0, sizeof(DAC960_ControllerInfo_T)); ControllerInfo.ControllerNumber = ControllerNumber; + ControllerInfo.FirmwareType = Controller->FirmwareType; + ControllerInfo.Channels = Controller->Channels; + ControllerInfo.Targets = Controller->Targets; ControllerInfo.PCI_Bus = Controller->Bus; ControllerInfo.PCI_Device = Controller->Device; ControllerInfo.PCI_Function = Controller->Function; ControllerInfo.IRQ_Channel = Controller->IRQ_Channel; - ControllerInfo.Channels = Controller->Channels; ControllerInfo.PCI_Address = Controller->PCI_Address; strcpy(ControllerInfo.ModelName, Controller->ModelName); strcpy(ControllerInfo.FirmwareVersion, Controller->FirmwareVersion); return copy_to_user(UserSpaceControllerInfo, &ControllerInfo, sizeof(DAC960_ControllerInfo_T)); } - case DAC960_IOCTL_EXECUTE_COMMAND: + case DAC960_IOCTL_V1_EXECUTE_COMMAND: { - DAC960_UserCommand_T *UserSpaceUserCommand = - (DAC960_UserCommand_T *) Argument; - DAC960_UserCommand_T UserCommand; + DAC960_V1_UserCommand_T *UserSpaceUserCommand = + (DAC960_V1_UserCommand_T *) Argument; + DAC960_V1_UserCommand_T UserCommand; DAC960_Controller_T *Controller; DAC960_Command_T *Command = NULL; - DAC960_CommandOpcode_T CommandOpcode; - DAC960_CommandStatus_T CommandStatus; - DAC960_DCDB_T DCDB; + DAC960_V1_CommandOpcode_T CommandOpcode; + DAC960_V1_CommandStatus_T CommandStatus; + DAC960_V1_DCDB_T DCDB; ProcessorFlags_T ProcessorFlags; int ControllerNumber, DataTransferLength; unsigned char *DataTransferBuffer = NULL; if (UserSpaceUserCommand == NULL) return -EINVAL; ErrorCode = copy_from_user(&UserCommand, UserSpaceUserCommand, - sizeof(DAC960_UserCommand_T)); - if (ErrorCode != 0) goto Failure; + sizeof(DAC960_V1_UserCommand_T)); + if (ErrorCode != 0) goto Failure1; ControllerNumber = UserCommand.ControllerNumber; if (ControllerNumber < 0 || ControllerNumber > DAC960_ControllerCount - 1) return -ENXIO; Controller = DAC960_Controllers[ControllerNumber]; - if (Controller == NULL) - return -ENXIO; + if (Controller == NULL) return -ENXIO; + if (Controller->FirmwareType != DAC960_V1_Controller) return -EINVAL; CommandOpcode = UserCommand.CommandMailbox.Common.CommandOpcode; DataTransferLength = UserCommand.DataTransferLength; if (CommandOpcode & 0x80) return -EINVAL; - if (CommandOpcode == DAC960_DCDB) + if (CommandOpcode == DAC960_V1_DCDB) { ErrorCode = - copy_from_user(&DCDB, UserCommand.DCDB, sizeof(DAC960_DCDB_T)); - if (ErrorCode != 0) goto Failure; + copy_from_user(&DCDB, UserCommand.DCDB, sizeof(DAC960_V1_DCDB_T)); + if (ErrorCode != 0) goto Failure1; if (!((DataTransferLength == 0 && - DCDB.Direction == DAC960_DCDB_NoDataTransfer) || + DCDB.Direction + == DAC960_V1_DCDB_NoDataTransfer) || (DataTransferLength > 0 && - DCDB.Direction == DAC960_DCDB_DataTransferDeviceToSystem) || + DCDB.Direction + == DAC960_V1_DCDB_DataTransferDeviceToSystem) || (DataTransferLength < 0 && - DCDB.Direction == DAC960_DCDB_DataTransferSystemToDevice))) + DCDB.Direction + == DAC960_V1_DCDB_DataTransferSystemToDevice))) return -EINVAL; if (((DCDB.TransferLengthHigh4 << 16) | DCDB.TransferLength) != abs(DataTransferLength)) @@ -2835,23 +5216,24 @@ ErrorCode = copy_from_user(DataTransferBuffer, UserCommand.DataTransferBuffer, -DataTransferLength); - if (ErrorCode != 0) goto Failure; + if (ErrorCode != 0) goto Failure1; } - if (CommandOpcode == DAC960_DCDB) + if (CommandOpcode == DAC960_V1_DCDB) { DAC960_AcquireControllerLock(Controller, &ProcessorFlags); - while (Controller->DirectCommandActive[DCDB.Channel] - [DCDB.TargetID] || + while (Controller->V1.DirectCommandActive[DCDB.Channel] + [DCDB.TargetID] || (Command = DAC960_AllocateCommand(Controller)) == NULL) DAC960_WaitForCommand(Controller); - Controller->DirectCommandActive[DCDB.Channel] - [DCDB.TargetID] = true; + Controller->V1.DirectCommandActive[DCDB.Channel] + [DCDB.TargetID] = true; DAC960_ReleaseControllerLock(Controller, &ProcessorFlags); - DAC960_ClearCommand(Command); + DAC960_V1_ClearCommand(Command); Command->CommandType = DAC960_ImmediateCommand; - memcpy(&Command->CommandMailbox, &UserCommand.CommandMailbox, - sizeof(DAC960_CommandMailbox_T)); - Command->CommandMailbox.Type3.BusAddress = Virtual_to_Bus(&DCDB); + memcpy(&Command->V1.CommandMailbox, &UserCommand.CommandMailbox, + sizeof(DAC960_V1_CommandMailbox_T)); + Command->V1.CommandMailbox.Type3.BusAddress = + Virtual_to_Bus(&DCDB); DCDB.BusAddress = Virtual_to_Bus(DataTransferBuffer); } else @@ -2860,38 +5242,213 @@ while ((Command = DAC960_AllocateCommand(Controller)) == NULL) DAC960_WaitForCommand(Controller); DAC960_ReleaseControllerLock(Controller, &ProcessorFlags); - DAC960_ClearCommand(Command); + DAC960_V1_ClearCommand(Command); Command->CommandType = DAC960_ImmediateCommand; - memcpy(&Command->CommandMailbox, &UserCommand.CommandMailbox, - sizeof(DAC960_CommandMailbox_T)); + memcpy(&Command->V1.CommandMailbox, &UserCommand.CommandMailbox, + sizeof(DAC960_V1_CommandMailbox_T)); if (DataTransferBuffer != NULL) - Command->CommandMailbox.Type3.BusAddress = + Command->V1.CommandMailbox.Type3.BusAddress = Virtual_to_Bus(DataTransferBuffer); } DAC960_ExecuteCommand(Command); - CommandStatus = Command->CommandStatus; + CommandStatus = Command->V1.CommandStatus; DAC960_AcquireControllerLock(Controller, &ProcessorFlags); DAC960_DeallocateCommand(Command); DAC960_ReleaseControllerLock(Controller, &ProcessorFlags); - if (CommandStatus == DAC960_NormalCompletion && + if (CommandStatus == DAC960_V1_NormalCompletion && DataTransferLength > 0) { ErrorCode = copy_to_user(UserCommand.DataTransferBuffer, DataTransferBuffer, DataTransferLength); - if (ErrorCode != 0) goto Failure; + if (ErrorCode != 0) goto Failure1; } - if (CommandOpcode == DAC960_DCDB) + if (CommandOpcode == DAC960_V1_DCDB) { - Controller->DirectCommandActive[DCDB.Channel] - [DCDB.TargetID] = false; + Controller->V1.DirectCommandActive[DCDB.Channel] + [DCDB.TargetID] = false; ErrorCode = - copy_to_user(UserCommand.DCDB, &DCDB, sizeof(DAC960_DCDB_T)); - if (ErrorCode != 0) goto Failure; + copy_to_user(UserCommand.DCDB, &DCDB, sizeof(DAC960_V1_DCDB_T)); + if (ErrorCode != 0) goto Failure1; + } + ErrorCode = CommandStatus; + Failure1: + if (DataTransferBuffer != NULL) + kfree(DataTransferBuffer); + return ErrorCode; + } + case DAC960_IOCTL_V2_EXECUTE_COMMAND: + { + DAC960_V2_UserCommand_T *UserSpaceUserCommand = + (DAC960_V2_UserCommand_T *) Argument; + DAC960_V2_UserCommand_T UserCommand; + DAC960_Controller_T *Controller; + DAC960_Command_T *Command = NULL; + DAC960_V2_CommandMailbox_T *CommandMailbox; + DAC960_V2_CommandStatus_T CommandStatus; + ProcessorFlags_T ProcessorFlags; + int ControllerNumber, DataTransferLength; + int DataTransferResidue, RequestSenseLength; + unsigned char *DataTransferBuffer = NULL; + unsigned char *RequestSenseBuffer = NULL; + if (UserSpaceUserCommand == NULL) return -EINVAL; + ErrorCode = copy_from_user(&UserCommand, UserSpaceUserCommand, + sizeof(DAC960_V2_UserCommand_T)); + if (ErrorCode != 0) goto Failure2; + ControllerNumber = UserCommand.ControllerNumber; + if (ControllerNumber < 0 || + ControllerNumber > DAC960_ControllerCount - 1) + return -ENXIO; + Controller = DAC960_Controllers[ControllerNumber]; + if (Controller == NULL) return -ENXIO; + if (Controller->FirmwareType != DAC960_V2_Controller) return -EINVAL; + DataTransferLength = UserCommand.DataTransferLength; + if (DataTransferLength > 0) + { + DataTransferBuffer = kmalloc(DataTransferLength, GFP_KERNEL); + if (DataTransferBuffer == NULL) return -ENOMEM; + memset(DataTransferBuffer, 0, DataTransferLength); + } + else if (DataTransferLength < 0) + { + DataTransferBuffer = kmalloc(-DataTransferLength, GFP_KERNEL); + if (DataTransferBuffer == NULL) return -ENOMEM; + ErrorCode = copy_from_user(DataTransferBuffer, + UserCommand.DataTransferBuffer, + -DataTransferLength); + if (ErrorCode != 0) goto Failure2; } + RequestSenseLength = UserCommand.RequestSenseLength; + if (RequestSenseLength > 0) + { + RequestSenseBuffer = kmalloc(RequestSenseLength, GFP_KERNEL); + if (RequestSenseBuffer == NULL) + { + ErrorCode = -ENOMEM; + goto Failure2; + } + memset(RequestSenseBuffer, 0, RequestSenseLength); + } + DAC960_AcquireControllerLock(Controller, &ProcessorFlags); + while ((Command = DAC960_AllocateCommand(Controller)) == NULL) + DAC960_WaitForCommand(Controller); + DAC960_ReleaseControllerLock(Controller, &ProcessorFlags); + DAC960_V2_ClearCommand(Command); + Command->CommandType = DAC960_ImmediateCommand; + CommandMailbox = &Command->V2.CommandMailbox; + memcpy(CommandMailbox, &UserCommand.CommandMailbox, + sizeof(DAC960_V2_CommandMailbox_T)); + CommandMailbox->Common.CommandControlBits + .AdditionalScatterGatherListMemory = false; + CommandMailbox->Common.CommandControlBits + .NoAutoRequestSense = true; + CommandMailbox->Common.DataTransferSize = 0; + CommandMailbox->Common.DataTransferPageNumber = 0; + memset(&CommandMailbox->Common.DataTransferMemoryAddress, 0, + sizeof(DAC960_V2_DataTransferMemoryAddress_T)); + if (DataTransferLength != 0) + { + if (DataTransferLength > 0) + { + CommandMailbox->Common.CommandControlBits + .DataTransferControllerToHost = true; + CommandMailbox->Common.DataTransferSize = DataTransferLength; + } + else + { + CommandMailbox->Common.CommandControlBits + .DataTransferControllerToHost = false; + CommandMailbox->Common.DataTransferSize = -DataTransferLength; + } + CommandMailbox->Common.DataTransferMemoryAddress + .ScatterGatherSegments[0] + .SegmentDataPointer = + Virtual_to_Bus(DataTransferBuffer); + CommandMailbox->Common.DataTransferMemoryAddress + .ScatterGatherSegments[0] + .SegmentByteCount = + CommandMailbox->Common.DataTransferSize; + } + if (RequestSenseLength > 0) + { + CommandMailbox->Common.CommandControlBits + .NoAutoRequestSense = false; + CommandMailbox->Common.RequestSenseSize = RequestSenseLength; + CommandMailbox->Common.RequestSenseBusAddress = + Virtual_to_Bus(RequestSenseBuffer); + } + DAC960_ExecuteCommand(Command); + CommandStatus = Command->V2.CommandStatus; + RequestSenseLength = Command->V2.RequestSenseLength; + DataTransferResidue = Command->V2.DataTransferResidue; + DAC960_AcquireControllerLock(Controller, &ProcessorFlags); + DAC960_DeallocateCommand(Command); + DAC960_ReleaseControllerLock(Controller, &ProcessorFlags); + if (RequestSenseLength > UserCommand.RequestSenseLength) + RequestSenseLength = UserCommand.RequestSenseLength; + ErrorCode = copy_to_user(&UserSpaceUserCommand->DataTransferLength, + &DataTransferResidue, + sizeof(DataTransferResidue)); + if (ErrorCode != 0) goto Failure2; + ErrorCode = copy_to_user(&UserSpaceUserCommand->RequestSenseLength, + &RequestSenseLength, + sizeof(RequestSenseLength)); + if (ErrorCode != 0) goto Failure2; + if (CommandStatus == DAC960_V2_NormalCompletion && + DataTransferLength > 0) + { + ErrorCode = copy_to_user(UserCommand.DataTransferBuffer, + DataTransferBuffer, DataTransferLength); + if (ErrorCode != 0) goto Failure2; + } + if (RequestSenseLength > 0) + { + ErrorCode = copy_to_user(UserCommand.RequestSenseBuffer, + RequestSenseBuffer, RequestSenseLength); + if (ErrorCode != 0) goto Failure2; + } ErrorCode = CommandStatus; - Failure: + Failure2: if (DataTransferBuffer != NULL) kfree(DataTransferBuffer); + if (RequestSenseBuffer != NULL) + kfree(RequestSenseBuffer); + return ErrorCode; + } + case DAC960_IOCTL_V2_GET_HEALTH_STATUS: + { + DAC960_V2_GetHealthStatus_T *UserSpaceGetHealthStatus = + (DAC960_V2_GetHealthStatus_T *) Argument; + DAC960_V2_GetHealthStatus_T GetHealthStatus; + DAC960_V2_HealthStatusBuffer_T HealthStatusBuffer; + DAC960_Controller_T *Controller; + int ControllerNumber; + if (UserSpaceGetHealthStatus == NULL) return -EINVAL; + ErrorCode = copy_from_user(&GetHealthStatus, UserSpaceGetHealthStatus, + sizeof(DAC960_V2_GetHealthStatus_T)); + if (ErrorCode != 0) return ErrorCode; + ControllerNumber = GetHealthStatus.ControllerNumber; + if (ControllerNumber < 0 || + ControllerNumber > DAC960_ControllerCount - 1) + return -ENXIO; + Controller = DAC960_Controllers[ControllerNumber]; + if (Controller == NULL) return -ENXIO; + if (Controller->FirmwareType != DAC960_V2_Controller) return -EINVAL; + ErrorCode = copy_from_user(&HealthStatusBuffer, + GetHealthStatus.HealthStatusBuffer, + sizeof(DAC960_V2_HealthStatusBuffer_T)); + if (ErrorCode != 0) return ErrorCode; + while (Controller->V2.HealthStatusBuffer->StatusChangeCounter + == HealthStatusBuffer.StatusChangeCounter && + Controller->V2.HealthStatusBuffer->NextEventSequenceNumber + == HealthStatusBuffer.NextEventSequenceNumber) + { + interruptible_sleep_on_timeout(&Controller->HealthStatusWaitQueue, + DAC960_MonitoringTimerInterval); + if (signal_pending(current)) return -EINTR; + } + ErrorCode = copy_to_user(GetHealthStatus.HealthStatusBuffer, + Controller->V2.HealthStatusBuffer, + sizeof(DAC960_V2_HealthStatusBuffer_T)); return ErrorCode; } } @@ -2921,28 +5478,29 @@ ControllerNumber > DAC960_ControllerCount - 1) return -ENXIO; Controller = DAC960_Controllers[ControllerNumber]; - if (Controller == NULL) - return -ENXIO; + if (Controller == NULL) return -ENXIO; memset(ControllerInfo, 0, sizeof(DAC960_ControllerInfo_T)); ControllerInfo->ControllerNumber = ControllerNumber; + ControllerInfo->FirmwareType = Controller->FirmwareType; + ControllerInfo->Channels = Controller->Channels; + ControllerInfo->Targets = Controller->Targets; ControllerInfo->PCI_Bus = Controller->Bus; ControllerInfo->PCI_Device = Controller->Device; ControllerInfo->PCI_Function = Controller->Function; ControllerInfo->IRQ_Channel = Controller->IRQ_Channel; - ControllerInfo->Channels = Controller->Channels; ControllerInfo->PCI_Address = Controller->PCI_Address; strcpy(ControllerInfo->ModelName, Controller->ModelName); strcpy(ControllerInfo->FirmwareVersion, Controller->FirmwareVersion); return 0; } - case DAC960_IOCTL_EXECUTE_COMMAND: + case DAC960_IOCTL_V1_EXECUTE_COMMAND: { - DAC960_KernelCommand_T *KernelCommand = - (DAC960_KernelCommand_T *) Argument; + DAC960_V1_KernelCommand_T *KernelCommand = + (DAC960_V1_KernelCommand_T *) Argument; DAC960_Controller_T *Controller; DAC960_Command_T *Command = NULL; - DAC960_CommandOpcode_T CommandOpcode; - DAC960_DCDB_T *DCDB = NULL; + DAC960_V1_CommandOpcode_T CommandOpcode; + DAC960_V1_DCDB_T *DCDB = NULL; ProcessorFlags_T ProcessorFlags; int ControllerNumber, DataTransferLength; unsigned char *DataTransferBuffer = NULL; @@ -2952,21 +5510,23 @@ ControllerNumber > DAC960_ControllerCount - 1) return -ENXIO; Controller = DAC960_Controllers[ControllerNumber]; - if (Controller == NULL) - return -ENXIO; + if (Controller == NULL) return -ENXIO; + if (Controller->FirmwareType != DAC960_V1_Controller) return -EINVAL; CommandOpcode = KernelCommand->CommandMailbox.Common.CommandOpcode; DataTransferLength = KernelCommand->DataTransferLength; DataTransferBuffer = KernelCommand->DataTransferBuffer; if (CommandOpcode & 0x80) return -EINVAL; - if (CommandOpcode == DAC960_DCDB) + if (CommandOpcode == DAC960_V1_DCDB) { DCDB = KernelCommand->DCDB; if (!((DataTransferLength == 0 && - DCDB->Direction == DAC960_DCDB_NoDataTransfer) || + DCDB->Direction == DAC960_V1_DCDB_NoDataTransfer) || (DataTransferLength > 0 && - DCDB->Direction == DAC960_DCDB_DataTransferDeviceToSystem) || + DCDB->Direction + == DAC960_V1_DCDB_DataTransferDeviceToSystem) || (DataTransferLength < 0 && - DCDB->Direction == DAC960_DCDB_DataTransferSystemToDevice))) + DCDB->Direction + == DAC960_V1_DCDB_DataTransferSystemToDevice))) return -EINVAL; if (((DCDB->TransferLengthHigh4 << 16) | DCDB->TransferLength) != abs(DataTransferLength)) @@ -2976,25 +5536,26 @@ return -EINVAL; if (DataTransferLength > 0) memset(DataTransferBuffer, 0, DataTransferLength); - if (CommandOpcode == DAC960_DCDB) + if (CommandOpcode == DAC960_V1_DCDB) { DAC960_AcquireControllerLock(Controller, &ProcessorFlags); - if (!Controller->DirectCommandActive[DCDB->Channel] - [DCDB->TargetID]) + if (!Controller->V1.DirectCommandActive[DCDB->Channel] + [DCDB->TargetID]) Command = DAC960_AllocateCommand(Controller); if (Command == NULL) { DAC960_ReleaseControllerLock(Controller, &ProcessorFlags); return -EBUSY; } - else Controller->DirectCommandActive[DCDB->Channel] - [DCDB->TargetID] = true; - DAC960_ClearCommand(Command); + else Controller->V1.DirectCommandActive[DCDB->Channel] + [DCDB->TargetID] = true; + DAC960_V1_ClearCommand(Command); Command->CommandType = DAC960_QueuedCommand; - memcpy(&Command->CommandMailbox, &KernelCommand->CommandMailbox, - sizeof(DAC960_CommandMailbox_T)); - Command->CommandMailbox.Type3.BusAddress = Virtual_to_Bus(DCDB); - Command->KernelCommand = KernelCommand; + memcpy(&Command->V1.CommandMailbox, &KernelCommand->CommandMailbox, + sizeof(DAC960_V1_CommandMailbox_T)); + Command->V1.CommandMailbox.Type3.BusAddress = + Virtual_to_Bus(DCDB); + Command->V1.KernelCommand = KernelCommand; DCDB->BusAddress = Virtual_to_Bus(DataTransferBuffer); DAC960_QueueCommand(Command); DAC960_ReleaseControllerLock(Controller, &ProcessorFlags); @@ -3008,42 +5569,153 @@ DAC960_ReleaseControllerLock(Controller, &ProcessorFlags); return -EBUSY; } - DAC960_ClearCommand(Command); + DAC960_V1_ClearCommand(Command); Command->CommandType = DAC960_QueuedCommand; - memcpy(&Command->CommandMailbox, &KernelCommand->CommandMailbox, - sizeof(DAC960_CommandMailbox_T)); + memcpy(&Command->V1.CommandMailbox, &KernelCommand->CommandMailbox, + sizeof(DAC960_V1_CommandMailbox_T)); if (DataTransferBuffer != NULL) - Command->CommandMailbox.Type3.BusAddress = + Command->V1.CommandMailbox.Type3.BusAddress = Virtual_to_Bus(DataTransferBuffer); - Command->KernelCommand = KernelCommand; + Command->V1.KernelCommand = KernelCommand; DAC960_QueueCommand(Command); DAC960_ReleaseControllerLock(Controller, &ProcessorFlags); } return 0; } + case DAC960_IOCTL_V2_EXECUTE_COMMAND: + { + DAC960_V2_KernelCommand_T *KernelCommand = + (DAC960_V2_KernelCommand_T *) Argument; + DAC960_Controller_T *Controller; + DAC960_Command_T *Command = NULL; + DAC960_V2_CommandMailbox_T *CommandMailbox; + ProcessorFlags_T ProcessorFlags; + int ControllerNumber, DataTransferLength, RequestSenseLength; + unsigned char *DataTransferBuffer = NULL; + unsigned char *RequestSenseBuffer = NULL; + if (KernelCommand == NULL) return -EINVAL; + ControllerNumber = KernelCommand->ControllerNumber; + if (ControllerNumber < 0 || + ControllerNumber > DAC960_ControllerCount - 1) + return -ENXIO; + Controller = DAC960_Controllers[ControllerNumber]; + if (Controller == NULL) return -ENXIO; + if (Controller->FirmwareType != DAC960_V2_Controller) return -EINVAL; + DataTransferLength = KernelCommand->DataTransferLength; + RequestSenseLength = KernelCommand->RequestSenseLength; + DataTransferBuffer = KernelCommand->DataTransferBuffer; + RequestSenseBuffer = KernelCommand->RequestSenseBuffer; + if (DataTransferLength != 0 && DataTransferBuffer == NULL) + return -EINVAL; + if (RequestSenseLength < 0) + return -EINVAL; + if (RequestSenseLength > 0 && RequestSenseBuffer == NULL) + return -EINVAL; + if (DataTransferLength > 0) + memset(DataTransferBuffer, 0, DataTransferLength); + if (RequestSenseLength > 0) + memset(RequestSenseBuffer, 0, RequestSenseLength); + DAC960_AcquireControllerLock(Controller, &ProcessorFlags); + Command = DAC960_AllocateCommand(Controller); + if (Command == NULL) + { + DAC960_ReleaseControllerLock(Controller, &ProcessorFlags); + return -EBUSY; + } + DAC960_V2_ClearCommand(Command); + Command->CommandType = DAC960_QueuedCommand; + CommandMailbox = &Command->V2.CommandMailbox; + memcpy(CommandMailbox, &KernelCommand->CommandMailbox, + sizeof(DAC960_V2_CommandMailbox_T)); + CommandMailbox->Common.CommandControlBits + .AdditionalScatterGatherListMemory = false; + CommandMailbox->Common.CommandControlBits + .NoAutoRequestSense = true; + CommandMailbox->Common.DataTransferSize = 0; + CommandMailbox->Common.DataTransferPageNumber = 0; + memset(&CommandMailbox->Common.DataTransferMemoryAddress, 0, + sizeof(DAC960_V2_DataTransferMemoryAddress_T)); + if (DataTransferLength != 0) + { + if (DataTransferLength > 0) + { + CommandMailbox->Common.CommandControlBits + .DataTransferControllerToHost = true; + CommandMailbox->Common.DataTransferSize = DataTransferLength; + } + else + { + CommandMailbox->Common.CommandControlBits + .DataTransferControllerToHost = false; + CommandMailbox->Common.DataTransferSize = -DataTransferLength; + } + CommandMailbox->Common.DataTransferMemoryAddress + .ScatterGatherSegments[0] + .SegmentDataPointer = + Virtual_to_Bus(DataTransferBuffer); + CommandMailbox->Common.DataTransferMemoryAddress + .ScatterGatherSegments[0] + .SegmentByteCount = + CommandMailbox->Common.DataTransferSize; + } + if (RequestSenseLength > 0) + { + CommandMailbox->Common.CommandControlBits + .NoAutoRequestSense = false; + CommandMailbox->Common.RequestSenseBusAddress = + Virtual_to_Bus(RequestSenseBuffer); + } + Command->V2.KernelCommand = KernelCommand; + DAC960_QueueCommand(Command); + DAC960_ReleaseControllerLock(Controller, &ProcessorFlags); + return 0; + } } return -EINVAL; } /* - DAC960_GenericDiskInit is the Generic Disk Information Initialization - Function for the DAC960 Driver. -*/ - -static void DAC960_InitializeGenericDiskInfo(GenericDiskInfo_T *GenericDiskInfo) -{ - DAC960_Controller_T *Controller = - (DAC960_Controller_T *) GenericDiskInfo->real_devices; - DAC960_LogicalDriveInformation_T *LogicalDriveInformation = - Controller->LogicalDriveInformation - [Controller->LogicalDriveInformationIndex]; - int LogicalDriveNumber; - for (LogicalDriveNumber = 0; - LogicalDriveNumber < Controller->LogicalDriveCount; - LogicalDriveNumber++) - GenericDiskInfo->part[DAC960_MinorNumber(LogicalDriveNumber, 0)].nr_sects = - LogicalDriveInformation[LogicalDriveNumber].LogicalDriveSize; + DAC960_CheckStatusBuffer verifies that there is room to hold ByteCount + additional bytes in the Combined Status Buffer and grows the buffer if + necessary. It returns true if there is enough room and false otherwise. +*/ + +static boolean DAC960_CheckStatusBuffer(DAC960_Controller_T *Controller, + unsigned int ByteCount) +{ + unsigned char *NewStatusBuffer; + if (Controller->InitialStatusLength + 1 + + Controller->CurrentStatusLength + ByteCount + 1 <= + Controller->CombinedStatusBufferLength) + return true; + if (Controller->CombinedStatusBufferLength == 0) + { + unsigned int NewStatusBufferLength = DAC960_InitialStatusBufferSize; + while (NewStatusBufferLength < ByteCount) + NewStatusBufferLength *= 2; + Controller->CombinedStatusBuffer = + (unsigned char *) kmalloc(NewStatusBufferLength, GFP_ATOMIC); + if (Controller->CombinedStatusBuffer == NULL) return false; + Controller->CombinedStatusBufferLength = NewStatusBufferLength; + return true; + } + NewStatusBuffer = (unsigned char *) + kmalloc(2 * Controller->CombinedStatusBufferLength, GFP_ATOMIC); + if (NewStatusBuffer == NULL) + { + DAC960_Warning("Unable to expand Combined Status Buffer - Truncating\n", + Controller); + return false; + } + memcpy(NewStatusBuffer, Controller->CombinedStatusBuffer, + Controller->CombinedStatusBufferLength); + kfree(Controller->CombinedStatusBuffer); + Controller->CombinedStatusBuffer = NewStatusBuffer; + Controller->CombinedStatusBufferLength *= 2; + Controller->CurrentStatusBuffer = + &NewStatusBuffer[Controller->InitialStatusLength + 1]; + return true; } @@ -3052,11 +5724,11 @@ */ static void DAC960_Message(DAC960_MessageLevel_T MessageLevel, - char *Format, + unsigned char *Format, DAC960_Controller_T *Controller, ...) { - static char Buffer[DAC960_LineBufferSize]; + static unsigned char Buffer[DAC960_LineBufferSize]; static boolean BeginningOfLine = true; va_list Arguments; int Length = 0; @@ -3071,9 +5743,16 @@ { if (!Controller->ControllerInitialized) { - strcpy(&Controller->InitialStatusBuffer[ - Controller->InitialStatusLength], Buffer); - Controller->InitialStatusLength += Length; + if (DAC960_CheckStatusBuffer(Controller, Length)) + { + strcpy(&Controller->CombinedStatusBuffer + [Controller->InitialStatusLength], + Buffer); + Controller->InitialStatusLength += Length; + Controller->CurrentStatusBuffer = + &Controller->CombinedStatusBuffer + [Controller->InitialStatusLength + 1]; + } if (MessageLevel == DAC960_AnnounceLevel) { static int AnnouncementLines = 0; @@ -3093,7 +5772,7 @@ else printk("%s", Buffer); } } - else + else if (DAC960_CheckStatusBuffer(Controller, Length)) { strcpy(&Controller->CurrentStatusBuffer[ Controller->CurrentStatusLength], Buffer); @@ -3102,8 +5781,8 @@ } else if (MessageLevel == DAC960_ProgressLevel) { - strcpy(Controller->RebuildProgressBuffer, Buffer); - Controller->RebuildProgressLength = Length; + strcpy(Controller->ProgressBuffer, Buffer); + Controller->ProgressBufferLength = Length; if (Controller->EphemeralProgressMessage) { if (jiffies - Controller->LastProgressReportTime @@ -3138,15 +5817,15 @@ /* - DAC960_ParsePhysicalDrive parses spaces followed by a Physical Drive + DAC960_ParsePhysicalDevice parses spaces followed by a Physical Device Channel:TargetID specification from a User Command string. It updates - Channel and TargetID and returns true on success and returns false otherwise. + Channel and TargetID and returns true on success and false on failure. */ -static boolean DAC960_ParsePhysicalDrive(DAC960_Controller_T *Controller, - char *UserCommandString, - unsigned char *Channel, - unsigned char *TargetID) +static boolean DAC960_ParsePhysicalDevice(DAC960_Controller_T *Controller, + char *UserCommandString, + unsigned char *Channel, + unsigned char *TargetID) { char *NewUserCommandString = UserCommandString; unsigned long XChannel, XTargetID; @@ -3162,7 +5841,7 @@ XTargetID = simple_strtoul(UserCommandString, &NewUserCommandString, 10); if (NewUserCommandString == UserCommandString || *NewUserCommandString != '\0' || - XTargetID >= DAC960_MaxTargets) + XTargetID >= Controller->Targets) return false; *Channel = XChannel; *TargetID = XTargetID; @@ -3173,7 +5852,7 @@ /* DAC960_ParseLogicalDrive parses spaces followed by a Logical Drive Number specification from a User Command string. It updates LogicalDriveNumber and - returns true on success and returns false otherwise. + returns true on success and false on failure. */ static boolean DAC960_ParseLogicalDrive(DAC960_Controller_T *Controller, @@ -3189,7 +5868,7 @@ simple_strtoul(UserCommandString, &NewUserCommandString, 10); if (NewUserCommandString == UserCommandString || *NewUserCommandString != '\0' || - XLogicalDriveNumber >= Controller->LogicalDriveCount) + XLogicalDriveNumber > DAC960_MaxLogicalDrives - 1) return false; *LogicalDriveNumber = XLogicalDriveNumber; return true; @@ -3197,68 +5876,71 @@ /* - DAC960_SetDeviceState sets the Device State for a Physical Drive. + DAC960_V1_SetDeviceState sets the Device State for a Physical Device for + DAC960 V1 Firmware Controllers. */ -static void DAC960_SetDeviceState(DAC960_Controller_T *Controller, - DAC960_Command_T *Command, - unsigned char Channel, - unsigned char TargetID, - DAC960_PhysicalDeviceState_T DeviceState, - const char *DeviceStateString) +static void DAC960_V1_SetDeviceState(DAC960_Controller_T *Controller, + DAC960_Command_T *Command, + unsigned char Channel, + unsigned char TargetID, + DAC960_V1_PhysicalDeviceState_T + DeviceState, + const unsigned char *DeviceStateString) { - DAC960_CommandMailbox_T *CommandMailbox = &Command->CommandMailbox; - CommandMailbox->Type3D.CommandOpcode = DAC960_StartDevice; + DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox; + CommandMailbox->Type3D.CommandOpcode = DAC960_V1_StartDevice; CommandMailbox->Type3D.Channel = Channel; CommandMailbox->Type3D.TargetID = TargetID; CommandMailbox->Type3D.DeviceState = DeviceState; CommandMailbox->Type3D.Modifier = 0; DAC960_ExecuteCommand(Command); - switch (Command->CommandStatus) + switch (Command->V1.CommandStatus) { - case DAC960_NormalCompletion: - DAC960_UserCritical("%s of Physical Drive %d:%d Succeeded\n", Controller, + case DAC960_V1_NormalCompletion: + DAC960_UserCritical("%s of Physical Device %d:%d Succeeded\n", Controller, DeviceStateString, Channel, TargetID); break; - case DAC960_UnableToStartDevice: - DAC960_UserCritical("%s of Physical Drive %d:%d Failed - " + case DAC960_V1_UnableToStartDevice: + DAC960_UserCritical("%s of Physical Device %d:%d Failed - " "Unable to Start Device\n", Controller, DeviceStateString, Channel, TargetID); break; - case DAC960_NoDeviceAtAddress: - DAC960_UserCritical("%s of Physical Drive %d:%d Failed - " + case DAC960_V1_NoDeviceAtAddress: + DAC960_UserCritical("%s of Physical Device %d:%d Failed - " "No Device at Address\n", Controller, DeviceStateString, Channel, TargetID); break; - case DAC960_InvalidChannelOrTargetOrModifier: - DAC960_UserCritical("%s of Physical Drive %d:%d Failed - " + case DAC960_V1_InvalidChannelOrTargetOrModifier: + DAC960_UserCritical("%s of Physical Device %d:%d Failed - " "Invalid Channel or Target or Modifier\n", Controller, DeviceStateString, Channel, TargetID); break; - case DAC960_ChannelBusy: - DAC960_UserCritical("%s of Physical Drive %d:%d Failed - " + case DAC960_V1_ChannelBusy: + DAC960_UserCritical("%s of Physical Device %d:%d Failed - " "Channel Busy\n", Controller, DeviceStateString, Channel, TargetID); break; default: - DAC960_UserCritical("%s of Physical Drive %d:%d Failed - " + DAC960_UserCritical("%s of Physical Device %d:%d Failed - " "Unexpected Status %04X\n", Controller, DeviceStateString, Channel, TargetID, - Command->CommandStatus); + Command->V1.CommandStatus); break; } } /* - DAC960_ExecuteUserCommand executes a User Command. + DAC960_V1_ExecuteUserCommand executes a User Command for DAC960 V1 Firmware + Controllers. */ -static boolean DAC960_ExecuteUserCommand(DAC960_Controller_T *Controller, - char *UserCommand) +static boolean DAC960_V1_ExecuteUserCommand(DAC960_Controller_T *Controller, + unsigned char *UserCommand) { DAC960_Command_T *Command; - DAC960_CommandMailbox_T *CommandMailbox; + DAC960_V1_CommandMailbox_T *CommandMailbox; ProcessorFlags_T ProcessorFlags; unsigned char Channel, TargetID, LogicalDriveNumber; DAC960_AcquireControllerLock(Controller, &ProcessorFlags); @@ -3266,100 +5948,98 @@ DAC960_WaitForCommand(Controller); DAC960_ReleaseControllerLock(Controller, &ProcessorFlags); Controller->UserStatusLength = 0; - DAC960_ClearCommand(Command); + DAC960_V1_ClearCommand(Command); Command->CommandType = DAC960_ImmediateCommand; - CommandMailbox = &Command->CommandMailbox; + CommandMailbox = &Command->V1.CommandMailbox; if (strcmp(UserCommand, "flush-cache") == 0) { - CommandMailbox->Type3.CommandOpcode = DAC960_Flush; + CommandMailbox->Type3.CommandOpcode = DAC960_V1_Flush; DAC960_ExecuteCommand(Command); DAC960_UserCritical("Cache Flush Completed\n", Controller); } else if (strncmp(UserCommand, "kill", 4) == 0 && - DAC960_ParsePhysicalDrive(Controller, &UserCommand[4], - &Channel, &TargetID)) + DAC960_ParsePhysicalDevice(Controller, &UserCommand[4], + &Channel, &TargetID)) { - DAC960_DeviceState_T *DeviceState = - &Controller->DeviceState[Controller->DeviceStateIndex] - [Channel][TargetID]; + DAC960_V1_DeviceState_T *DeviceState = + &Controller->V1.DeviceState[Channel][TargetID]; if (DeviceState->Present && - DeviceState->DeviceType == DAC960_DiskType && - DeviceState->DeviceState != DAC960_Device_Dead) - DAC960_SetDeviceState(Controller, Command, Channel, TargetID, - DAC960_Device_Dead, "Kill"); - else DAC960_UserCritical("Kill of Physical Drive %d:%d Illegal\n", + DeviceState->DeviceType == DAC960_V1_DiskType && + DeviceState->DeviceState != DAC960_V1_Device_Dead) + DAC960_V1_SetDeviceState(Controller, Command, Channel, TargetID, + DAC960_V1_Device_Dead, "Kill"); + else DAC960_UserCritical("Kill of Physical Device %d:%d Illegal\n", Controller, Channel, TargetID); } else if (strncmp(UserCommand, "make-online", 11) == 0 && - DAC960_ParsePhysicalDrive(Controller, &UserCommand[11], - &Channel, &TargetID)) + DAC960_ParsePhysicalDevice(Controller, &UserCommand[11], + &Channel, &TargetID)) { - DAC960_DeviceState_T *DeviceState = - &Controller->DeviceState[Controller->DeviceStateIndex] - [Channel][TargetID]; + DAC960_V1_DeviceState_T *DeviceState = + &Controller->V1.DeviceState[Channel][TargetID]; if (DeviceState->Present && - DeviceState->DeviceType == DAC960_DiskType && - DeviceState->DeviceState == DAC960_Device_Dead) - DAC960_SetDeviceState(Controller, Command, Channel, TargetID, - DAC960_Device_Online, "Make Online"); - else DAC960_UserCritical("Make Online of Physical Drive %d:%d Illegal\n", + DeviceState->DeviceType == DAC960_V1_DiskType && + DeviceState->DeviceState == DAC960_V1_Device_Dead) + DAC960_V1_SetDeviceState(Controller, Command, Channel, TargetID, + DAC960_V1_Device_Online, "Make Online"); + else DAC960_UserCritical("Make Online of Physical Device %d:%d Illegal\n", Controller, Channel, TargetID); } else if (strncmp(UserCommand, "make-standby", 12) == 0 && - DAC960_ParsePhysicalDrive(Controller, &UserCommand[12], - &Channel, &TargetID)) + DAC960_ParsePhysicalDevice(Controller, &UserCommand[12], + &Channel, &TargetID)) { - DAC960_DeviceState_T *DeviceState = - &Controller->DeviceState[Controller->DeviceStateIndex] - [Channel][TargetID]; + DAC960_V1_DeviceState_T *DeviceState = + &Controller->V1.DeviceState[Channel][TargetID]; if (DeviceState->Present && - DeviceState->DeviceType == DAC960_DiskType && - DeviceState->DeviceState == DAC960_Device_Dead) - DAC960_SetDeviceState(Controller, Command, Channel, TargetID, - DAC960_Device_Standby, "Make Standby"); - else DAC960_UserCritical("Make Standby of Physical Drive %d:%d Illegal\n", + DeviceState->DeviceType == DAC960_V1_DiskType && + DeviceState->DeviceState == DAC960_V1_Device_Dead) + DAC960_V1_SetDeviceState(Controller, Command, Channel, TargetID, + DAC960_V1_Device_Standby, "Make Standby"); + else DAC960_UserCritical("Make Standby of Physical " + "Device %d:%d Illegal\n", Controller, Channel, TargetID); } else if (strncmp(UserCommand, "rebuild", 7) == 0 && - DAC960_ParsePhysicalDrive(Controller, &UserCommand[7], - &Channel, &TargetID)) + DAC960_ParsePhysicalDevice(Controller, &UserCommand[7], + &Channel, &TargetID)) { - CommandMailbox->Type3D.CommandOpcode = DAC960_RebuildAsync; + CommandMailbox->Type3D.CommandOpcode = DAC960_V1_RebuildAsync; CommandMailbox->Type3D.Channel = Channel; CommandMailbox->Type3D.TargetID = TargetID; DAC960_ExecuteCommand(Command); - switch (Command->CommandStatus) + switch (Command->V1.CommandStatus) { - case DAC960_NormalCompletion: - DAC960_UserCritical("Rebuild of Physical Drive %d:%d Initiated\n", + case DAC960_V1_NormalCompletion: + DAC960_UserCritical("Rebuild of Physical Device %d:%d Initiated\n", Controller, Channel, TargetID); break; - case DAC960_AttemptToRebuildOnlineDrive: - DAC960_UserCritical("Rebuild of Physical Drive %d:%d Failed - " + case DAC960_V1_AttemptToRebuildOnlineDrive: + DAC960_UserCritical("Rebuild of Physical Device %d:%d Failed - " "Attempt to Rebuild Online or " "Unresponsive Drive\n", Controller, Channel, TargetID); break; - case DAC960_NewDiskFailedDuringRebuild: - DAC960_UserCritical("Rebuild of Physical Drive %d:%d Failed - " + case DAC960_V1_NewDiskFailedDuringRebuild: + DAC960_UserCritical("Rebuild of Physical Device %d:%d Failed - " "New Disk Failed During Rebuild\n", Controller, Channel, TargetID); break; - case DAC960_InvalidDeviceAddress: - DAC960_UserCritical("Rebuild of Physical Drive %d:%d Failed - " + case DAC960_V1_InvalidDeviceAddress: + DAC960_UserCritical("Rebuild of Physical Device %d:%d Failed - " "Invalid Device Address\n", Controller, Channel, TargetID); break; - case DAC960_RebuildOrCheckAlreadyInProgress: - DAC960_UserCritical("Rebuild of Physical Drive %d:%d Failed - " + case DAC960_V1_RebuildOrCheckAlreadyInProgress: + DAC960_UserCritical("Rebuild of Physical Device %d:%d Failed - " "Rebuild or Consistency Check Already " "in Progress\n", Controller, Channel, TargetID); break; default: - DAC960_UserCritical("Rebuild of Physical Drive %d:%d Failed - " + DAC960_UserCritical("Rebuild of Physical Device %d:%d Failed - " "Unexpected Status %04X\n", Controller, - Channel, TargetID, Command->CommandStatus); + Channel, TargetID, Command->V1.CommandStatus); break; } } @@ -3367,28 +6047,28 @@ DAC960_ParseLogicalDrive(Controller, &UserCommand[17], &LogicalDriveNumber)) { - CommandMailbox->Type3C.CommandOpcode = DAC960_CheckConsistencyAsync; + CommandMailbox->Type3C.CommandOpcode = DAC960_V1_CheckConsistencyAsync; CommandMailbox->Type3C.LogicalDriveNumber = LogicalDriveNumber; CommandMailbox->Type3C.AutoRestore = true; DAC960_ExecuteCommand(Command); - switch (Command->CommandStatus) + switch (Command->V1.CommandStatus) { - case DAC960_NormalCompletion: + case DAC960_V1_NormalCompletion: DAC960_UserCritical("Consistency Check of Logical Drive %d " "(/dev/rd/c%dd%d) Initiated\n", Controller, LogicalDriveNumber, Controller->ControllerNumber, LogicalDriveNumber); break; - case DAC960_DependentDiskIsDead: + case DAC960_V1_DependentDiskIsDead: DAC960_UserCritical("Consistency Check of Logical Drive %d " "(/dev/rd/c%dd%d) Failed - " - "Dependent Physical Drive is DEAD\n", + "Dependent Physical Device is DEAD\n", Controller, LogicalDriveNumber, Controller->ControllerNumber, LogicalDriveNumber); break; - case DAC960_InvalidOrNonredundantLogicalDrive: + case DAC960_V1_InvalidOrNonredundantLogicalDrive: DAC960_UserCritical("Consistency Check of Logical Drive %d " "(/dev/rd/c%dd%d) Failed - " "Invalid or Nonredundant Logical Drive\n", @@ -3396,7 +6076,7 @@ Controller->ControllerNumber, LogicalDriveNumber); break; - case DAC960_RebuildOrCheckAlreadyInProgress: + case DAC960_V1_RebuildOrCheckAlreadyInProgress: DAC960_UserCritical("Consistency Check of Logical Drive %d " "(/dev/rd/c%dd%d) Failed - Rebuild or " "Consistency Check Already in Progress\n", @@ -3410,7 +6090,7 @@ "Unexpected Status %04X\n", Controller, LogicalDriveNumber, Controller->ControllerNumber, - LogicalDriveNumber, Command->CommandStatus); + LogicalDriveNumber, Command->V1.CommandStatus); break; } } @@ -3418,14 +6098,14 @@ strcmp(UserCommand, "cancel-consistency-check") == 0) { unsigned char OldRebuildRateConstant; - CommandMailbox->Type3R.CommandOpcode = DAC960_RebuildControl; + CommandMailbox->Type3R.CommandOpcode = DAC960_V1_RebuildControl; CommandMailbox->Type3R.RebuildRateConstant = 0xFF; CommandMailbox->Type3R.BusAddress = Virtual_to_Bus(&OldRebuildRateConstant); DAC960_ExecuteCommand(Command); - switch (Command->CommandStatus) + switch (Command->V1.CommandStatus) { - case DAC960_NormalCompletion: + case DAC960_V1_NormalCompletion: DAC960_UserCritical("Rebuild or Consistency Check Cancelled\n", Controller); break; @@ -3433,7 +6113,7 @@ DAC960_UserCritical("Cancellation of Rebuild or " "Consistency Check Failed - " "Unexpected Status %04X\n", - Controller, Command->CommandStatus); + Controller, Command->V1.CommandStatus); break; } } @@ -3447,25 +6127,235 @@ /* + DAC960_V2_TranslatePhysicalDevice translates a Physical Device Channel and + TargetID into a Logical Device. It returns true on success and false + on failure. +*/ + +static boolean DAC960_V2_TranslatePhysicalDevice(DAC960_Command_T *Command, + unsigned char Channel, + unsigned char TargetID, + unsigned short + *LogicalDeviceNumber) +{ + DAC960_V2_CommandMailbox_T SavedCommandMailbox, *CommandMailbox; + DAC960_V2_PhysicalToLogicalDevice_T PhysicalToLogicalDevice; + CommandMailbox = &Command->V2.CommandMailbox; + memcpy(&SavedCommandMailbox, CommandMailbox, + sizeof(DAC960_V2_CommandMailbox_T)); + CommandMailbox->PhysicalDeviceInfo.CommandOpcode = DAC960_V2_IOCTL; + CommandMailbox->PhysicalDeviceInfo.CommandControlBits + .DataTransferControllerToHost = true; + CommandMailbox->PhysicalDeviceInfo.CommandControlBits + .NoAutoRequestSense = true; + CommandMailbox->PhysicalDeviceInfo.DataTransferSize = + sizeof(DAC960_V2_PhysicalToLogicalDevice_T); + CommandMailbox->PhysicalDeviceInfo.PhysicalDevice.TargetID = TargetID; + CommandMailbox->PhysicalDeviceInfo.PhysicalDevice.Channel = Channel; + CommandMailbox->PhysicalDeviceInfo.IOCTL_Opcode = + DAC960_V2_TranslatePhysicalToLogicalDevice; + CommandMailbox->Common.DataTransferMemoryAddress + .ScatterGatherSegments[0] + .SegmentDataPointer = + Virtual_to_Bus(&PhysicalToLogicalDevice); + CommandMailbox->Common.DataTransferMemoryAddress + .ScatterGatherSegments[0] + .SegmentByteCount = + CommandMailbox->Common.DataTransferSize; + DAC960_ExecuteCommand(Command); + memcpy(CommandMailbox, &SavedCommandMailbox, + sizeof(DAC960_V2_CommandMailbox_T)); + *LogicalDeviceNumber = PhysicalToLogicalDevice.LogicalDeviceNumber; + return (Command->V2.CommandStatus == DAC960_V2_NormalCompletion); +} + + +/* + DAC960_V2_ExecuteUserCommand executes a User Command for DAC960 V2 Firmware + Controllers. +*/ + +static boolean DAC960_V2_ExecuteUserCommand(DAC960_Controller_T *Controller, + unsigned char *UserCommand) +{ + DAC960_Command_T *Command; + DAC960_V2_CommandMailbox_T *CommandMailbox; + ProcessorFlags_T ProcessorFlags; + unsigned char Channel, TargetID, LogicalDriveNumber; + unsigned short LogicalDeviceNumber; + DAC960_AcquireControllerLock(Controller, &ProcessorFlags); + while ((Command = DAC960_AllocateCommand(Controller)) == NULL) + DAC960_WaitForCommand(Controller); + DAC960_ReleaseControllerLock(Controller, &ProcessorFlags); + Controller->UserStatusLength = 0; + DAC960_V2_ClearCommand(Command); + Command->CommandType = DAC960_ImmediateCommand; + CommandMailbox = &Command->V2.CommandMailbox; + CommandMailbox->Common.CommandOpcode = DAC960_V2_IOCTL; + CommandMailbox->Common.CommandControlBits.DataTransferControllerToHost = true; + CommandMailbox->Common.CommandControlBits.NoAutoRequestSense = true; + if (strcmp(UserCommand, "flush-cache") == 0) + { + CommandMailbox->DeviceOperation.IOCTL_Opcode = DAC960_V2_PauseDevice; + CommandMailbox->DeviceOperation.OperationDevice = + DAC960_V2_RAID_Controller; + DAC960_ExecuteCommand(Command); + DAC960_UserCritical("Cache Flush Completed\n", Controller); + } + else if (strncmp(UserCommand, "kill", 4) == 0 && + DAC960_ParsePhysicalDevice(Controller, &UserCommand[4], + &Channel, &TargetID) && + DAC960_V2_TranslatePhysicalDevice(Command, Channel, TargetID, + &LogicalDeviceNumber)) + { + CommandMailbox->SetDeviceState.LogicalDevice.LogicalDeviceNumber = + LogicalDeviceNumber; + CommandMailbox->SetDeviceState.IOCTL_Opcode = + DAC960_V2_SetDeviceState; + CommandMailbox->SetDeviceState.DeviceState.PhysicalDeviceState = + DAC960_V2_Device_Dead; + DAC960_ExecuteCommand(Command); + DAC960_UserCritical("Kill of Physical Device %d:%d %s\n", + Controller, Channel, TargetID, + (Command->V2.CommandStatus + == DAC960_V2_NormalCompletion + ? "Succeeded" : "Failed")); + } + else if (strncmp(UserCommand, "make-online", 11) == 0 && + DAC960_ParsePhysicalDevice(Controller, &UserCommand[11], + &Channel, &TargetID) && + DAC960_V2_TranslatePhysicalDevice(Command, Channel, TargetID, + &LogicalDeviceNumber)) + { + CommandMailbox->SetDeviceState.LogicalDevice.LogicalDeviceNumber = + LogicalDeviceNumber; + CommandMailbox->SetDeviceState.IOCTL_Opcode = + DAC960_V2_SetDeviceState; + CommandMailbox->SetDeviceState.DeviceState.PhysicalDeviceState = + DAC960_V2_Device_Online; + DAC960_ExecuteCommand(Command); + DAC960_UserCritical("Make Online of Physical Device %d:%d %s\n", + Controller, Channel, TargetID, + (Command->V2.CommandStatus + == DAC960_V2_NormalCompletion + ? "Succeeded" : "Failed")); + } + else if (strncmp(UserCommand, "make-standby", 12) == 0 && + DAC960_ParsePhysicalDevice(Controller, &UserCommand[12], + &Channel, &TargetID) && + DAC960_V2_TranslatePhysicalDevice(Command, Channel, TargetID, + &LogicalDeviceNumber)) + { + CommandMailbox->SetDeviceState.LogicalDevice.LogicalDeviceNumber = + LogicalDeviceNumber; + CommandMailbox->SetDeviceState.IOCTL_Opcode = + DAC960_V2_SetDeviceState; + CommandMailbox->SetDeviceState.DeviceState.PhysicalDeviceState = + DAC960_V2_Device_Standby; + DAC960_ExecuteCommand(Command); + DAC960_UserCritical("Make Standby of Physical Device %d:%d %s\n", + Controller, Channel, TargetID, + (Command->V2.CommandStatus + == DAC960_V2_NormalCompletion + ? "Succeeded" : "Failed")); + } + else if (strncmp(UserCommand, "rebuild", 7) == 0 && + DAC960_ParsePhysicalDevice(Controller, &UserCommand[7], + &Channel, &TargetID) && + DAC960_V2_TranslatePhysicalDevice(Command, Channel, TargetID, + &LogicalDeviceNumber)) + { + CommandMailbox->LogicalDeviceInfo.LogicalDevice.LogicalDeviceNumber = + LogicalDeviceNumber; + CommandMailbox->LogicalDeviceInfo.IOCTL_Opcode = + DAC960_V2_RebuildDeviceStart; + DAC960_ExecuteCommand(Command); + DAC960_UserCritical("Rebuild of Physical Device %d:%d %s\n", + Controller, Channel, TargetID, + (Command->V2.CommandStatus + == DAC960_V2_NormalCompletion + ? "Initiated" : "Not Initiated")); + } + else if (strncmp(UserCommand, "cancel-rebuild", 14) == 0 && + DAC960_ParsePhysicalDevice(Controller, &UserCommand[14], + &Channel, &TargetID) && + DAC960_V2_TranslatePhysicalDevice(Command, Channel, TargetID, + &LogicalDeviceNumber)) + { + CommandMailbox->LogicalDeviceInfo.LogicalDevice.LogicalDeviceNumber = + LogicalDeviceNumber; + CommandMailbox->LogicalDeviceInfo.IOCTL_Opcode = + DAC960_V2_RebuildDeviceStop; + DAC960_ExecuteCommand(Command); + DAC960_UserCritical("Rebuild of Physical Device %d:%d %s\n", + Controller, Channel, TargetID, + (Command->V2.CommandStatus + == DAC960_V2_NormalCompletion + ? "Cancelled" : "Not Cancelled")); + } + else if (strncmp(UserCommand, "check-consistency", 17) == 0 && + DAC960_ParseLogicalDrive(Controller, &UserCommand[17], + &LogicalDriveNumber)) + { + CommandMailbox->ConsistencyCheck.LogicalDevice.LogicalDeviceNumber = + LogicalDriveNumber; + CommandMailbox->ConsistencyCheck.IOCTL_Opcode = + DAC960_V2_ConsistencyCheckStart; + CommandMailbox->ConsistencyCheck.RestoreConsistency = true; + CommandMailbox->ConsistencyCheck.InitializedAreaOnly = false; + DAC960_ExecuteCommand(Command); + DAC960_UserCritical("Consistency Check of Logical Drive %d " + "(/dev/rd/c%dd%d) %s\n", + Controller, LogicalDriveNumber, + Controller->ControllerNumber, + LogicalDriveNumber, + (Command->V2.CommandStatus + == DAC960_V2_NormalCompletion + ? "Initiated" : "Not Initiated")); + } + else if (strncmp(UserCommand, "cancel-consistency-check", 24) == 0 && + DAC960_ParseLogicalDrive(Controller, &UserCommand[24], + &LogicalDriveNumber)) + { + CommandMailbox->ConsistencyCheck.LogicalDevice.LogicalDeviceNumber = + LogicalDriveNumber; + CommandMailbox->ConsistencyCheck.IOCTL_Opcode = + DAC960_V2_ConsistencyCheckStop; + DAC960_ExecuteCommand(Command); + DAC960_UserCritical("Consistency Check of Logical Drive %d " + "(/dev/rd/c%dd%d) %s\n", + Controller, LogicalDriveNumber, + Controller->ControllerNumber, + LogicalDriveNumber, + (Command->V2.CommandStatus + == DAC960_V2_NormalCompletion + ? "Cancelled" : "Not Cancelled")); + } + else DAC960_UserCritical("Illegal User Command: '%s'\n", + Controller, UserCommand); + DAC960_AcquireControllerLock(Controller, &ProcessorFlags); + DAC960_DeallocateCommand(Command); + DAC960_ReleaseControllerLock(Controller, &ProcessorFlags); + return true; +} + + +/* DAC960_ProcReadStatus implements reading /proc/rd/status. */ static int DAC960_ProcReadStatus(char *Page, char **Start, off_t Offset, int Count, int *EOF, void *Data) { - char *StatusMessage = "OK\n"; + unsigned char *StatusMessage = "OK\n"; int ControllerNumber, BytesAvailable; for (ControllerNumber = 0; ControllerNumber < DAC960_ControllerCount; ControllerNumber++) { DAC960_Controller_T *Controller = DAC960_Controllers[ControllerNumber]; - DAC960_Enquiry_T *Enquiry; if (Controller == NULL) continue; - Enquiry = &Controller->Enquiry[Controller->EnquiryIndex]; - if (Enquiry->CriticalLogicalDriveCount > 0 || - Enquiry->OfflineLogicalDriveCount > 0 || - Enquiry->DeadDriveCount > 0) + if (Controller->MonitoringAlertMode) { StatusMessage = "ALERT\n"; break; @@ -3500,7 +6390,7 @@ } if (Count <= 0) return 0; *Start = Page; - memcpy(Page, &Controller->InitialStatusBuffer[Offset], Count); + memcpy(Page, &Controller->CombinedStatusBuffer[Offset], Count); return Count; } @@ -3513,6 +6403,9 @@ int Count, int *EOF, void *Data) { DAC960_Controller_T *Controller = (DAC960_Controller_T *) Data; + unsigned char *StatusMessage = + "No Rebuild or Consistency Check in Progress\n"; + int ProgressMessageLength = strlen(StatusMessage); int BytesAvailable; if (jiffies != Controller->LastCurrentStatusTime) { @@ -3520,22 +6413,20 @@ DAC960_AnnounceDriver(Controller); DAC960_ReportControllerConfiguration(Controller); DAC960_ReportDeviceConfiguration(Controller); - Controller->CurrentStatusBuffer[Controller->CurrentStatusLength++] = ' '; - Controller->CurrentStatusBuffer[Controller->CurrentStatusLength++] = ' '; - if (Controller->RebuildProgressLength > 0) - { - strcpy(&Controller->CurrentStatusBuffer - [Controller->CurrentStatusLength], - Controller->RebuildProgressBuffer); - Controller->CurrentStatusLength += Controller->RebuildProgressLength; - } - else - { - char *StatusMessage = "No Rebuild or Consistency Check in Progress\n"; - strcpy(&Controller->CurrentStatusBuffer - [Controller->CurrentStatusLength], - StatusMessage); - Controller->CurrentStatusLength += strlen(StatusMessage); + if (Controller->ProgressBufferLength > 0) + ProgressMessageLength = Controller->ProgressBufferLength; + if (DAC960_CheckStatusBuffer(Controller, 2 + ProgressMessageLength)) + { + unsigned char *CurrentStatusBuffer = Controller->CurrentStatusBuffer; + CurrentStatusBuffer[Controller->CurrentStatusLength++] = ' '; + CurrentStatusBuffer[Controller->CurrentStatusLength++] = ' '; + if (Controller->ProgressBufferLength > 0) + strcpy(&CurrentStatusBuffer[Controller->CurrentStatusLength], + Controller->ProgressBuffer); + else + strcpy(&CurrentStatusBuffer[Controller->CurrentStatusLength], + StatusMessage); + Controller->CurrentStatusLength += ProgressMessageLength; } Controller->LastCurrentStatusTime = jiffies; } @@ -3581,7 +6472,7 @@ unsigned long Count, void *Data) { DAC960_Controller_T *Controller = (DAC960_Controller_T *) Data; - char CommandBuffer[80]; + unsigned char CommandBuffer[80]; int Length; if (Count > sizeof(CommandBuffer)-1) return -EINVAL; copy_from_user(CommandBuffer, Buffer, Count); @@ -3589,8 +6480,12 @@ Length = strlen(CommandBuffer); if (CommandBuffer[Length-1] == '\n') CommandBuffer[--Length] = '\0'; - return (DAC960_ExecuteUserCommand(Controller, CommandBuffer) - ? Count : -EBUSY); + if (Controller->FirmwareType == DAC960_V1_Controller) + return (DAC960_V1_ExecuteUserCommand(Controller, CommandBuffer) + ? Count : -EBUSY); + else + return (DAC960_V2_ExecuteUserCommand(Controller, CommandBuffer) + ? Count : -EBUSY); } Index: oldkernel/linux/drivers/block/DAC960.h diff -u linux/drivers/block/DAC960.h:1.2 linux/drivers/block/DAC960.h:1.3 --- linux/drivers/block/DAC960.h:1.2 Wed May 31 14:57:57 2000 +++ linux/drivers/block/DAC960.h Fri Jul 7 15:36:42 2000 @@ -1,8 +1,8 @@ /* - Linux Driver for Mylex DAC960 and DAC1100 PCI RAID Controllers + Linux Driver for Mylex DAC960/AcceleRAID/eXtremeRAID PCI RAID Controllers - Copyright 1998-1999 by Leonard N. Zubkoff + Copyright 1998-2000 by Leonard N. Zubkoff This program is free software; you may redistribute and/or modify it under the terms of the GNU General Public License Version 2 as published by the @@ -27,27 +27,41 @@ /* - Define the maximum number of Controller Channels supported by this driver. + Define the maximum number of Controller Channels supported by DAC960 + V1 and V2 Firmware Controllers. */ -#define DAC960_MaxChannels 3 +#define DAC960_V1_MaxChannels 3 +#define DAC960_V2_MaxChannels 4 /* - Define the maximum number of Targets per Channel supported by this driver. + Define the maximum number of Targets per Channel supported by DAC960 + V1 and V2 Firmware Controllers. */ -#define DAC960_MaxTargets 16 +#define DAC960_V1_MaxTargets 16 +#define DAC960_V2_MaxTargets 128 /* - Define the maximum number of Logical Drives supported by any DAC960 model. + Define the maximum number of Logical Drives supported by DAC960 + V1 and V2 Firmware Controllers. */ #define DAC960_MaxLogicalDrives 32 /* + Define the maximum number of Physical Devices supported by DAC960 + V1 and V2 Firmware Controllers. +*/ + +#define DAC960_V1_MaxPhysicalDevices 45 +#define DAC960_V2_MaxPhysicalDevices 272 + + +/* Define a Boolean data type. */ @@ -71,150 +85,265 @@ /* Define a 32 bit Bus Address data type. */ + +typedef unsigned int DAC960_BusAddress32_T; + + +/* + Define a 64 bit Bus Address data type. +*/ -typedef unsigned int DAC960_BusAddress_T; +typedef unsigned long long DAC960_BusAddress64_T; /* Define a 32 bit Byte Count data type. */ + +typedef unsigned int DAC960_ByteCount32_T; + + +/* + Define a 64 bit Byte Count data type. +*/ + +typedef unsigned long long DAC960_ByteCount64_T; + + +/* + Define the SCSI INQUIRY Standard Data structure. +*/ + +typedef struct DAC960_SCSI_Inquiry +{ + unsigned char PeripheralDeviceType:5; /* Byte 0 Bits 0-4 */ + unsigned char PeripheralQualifier:3; /* Byte 0 Bits 5-7 */ + unsigned char DeviceTypeModifier:7; /* Byte 1 Bits 0-6 */ + boolean RMB:1; /* Byte 1 Bit 7 */ + unsigned char ANSI_ApprovedVersion:3; /* Byte 2 Bits 0-2 */ + unsigned char ECMA_Version:3; /* Byte 2 Bits 3-5 */ + unsigned char ISO_Version:2; /* Byte 2 Bits 6-7 */ + unsigned char ResponseDataFormat:4; /* Byte 3 Bits 0-3 */ + unsigned char :2; /* Byte 3 Bits 4-5 */ + boolean TrmIOP:1; /* Byte 3 Bit 6 */ + boolean AENC:1; /* Byte 3 Bit 7 */ + unsigned char AdditionalLength; /* Byte 4 */ + unsigned char :8; /* Byte 5 */ + unsigned char :8; /* Byte 6 */ + boolean SftRe:1; /* Byte 7 Bit 0 */ + boolean CmdQue:1; /* Byte 7 Bit 1 */ + boolean :1; /* Byte 7 Bit 2 */ + boolean Linked:1; /* Byte 7 Bit 3 */ + boolean Sync:1; /* Byte 7 Bit 4 */ + boolean WBus16:1; /* Byte 7 Bit 5 */ + boolean WBus32:1; /* Byte 7 Bit 6 */ + boolean RelAdr:1; /* Byte 7 Bit 7 */ + unsigned char VendorIdentification[8]; /* Bytes 8-15 */ + unsigned char ProductIdentification[16]; /* Bytes 16-31 */ + unsigned char ProductRevisionLevel[4]; /* Bytes 32-35 */ +} +DAC960_SCSI_Inquiry_T; + + +/* + Define the SCSI INQUIRY Unit Serial Number structure. +*/ + +typedef struct DAC960_SCSI_Inquiry_UnitSerialNumber +{ + unsigned char PeripheralDeviceType:5; /* Byte 0 Bits 0-4 */ + unsigned char PeripheralQualifier:3; /* Byte 0 Bits 5-7 */ + unsigned char PageCode; /* Byte 1 */ + unsigned char :8; /* Byte 2 */ + unsigned char PageLength; /* Byte 3 */ + unsigned char ProductSerialNumber[28]; /* Bytes 4-31 */ +} +DAC960_SCSI_Inquiry_UnitSerialNumber_T; + + +/* + Define the SCSI REQUEST SENSE Sense Key type. +*/ + +typedef enum +{ + DAC960_SenseKey_NoSense = 0x0, + DAC960_SenseKey_RecoveredError = 0x1, + DAC960_SenseKey_NotReady = 0x2, + DAC960_SenseKey_MediumError = 0x3, + DAC960_SenseKey_HardwareError = 0x4, + DAC960_SenseKey_IllegalRequest = 0x5, + DAC960_SenseKey_UnitAttention = 0x6, + DAC960_SenseKey_DataProtect = 0x7, + DAC960_SenseKey_BlankCheck = 0x8, + DAC960_SenseKey_VendorSpecific = 0x9, + DAC960_SenseKey_CopyAborted = 0xA, + DAC960_SenseKey_AbortedCommand = 0xB, + DAC960_SenseKey_Equal = 0xC, + DAC960_SenseKey_VolumeOverflow = 0xD, + DAC960_SenseKey_Miscompare = 0xE, + DAC960_SenseKey_Reserved = 0xF +} +__attribute__ ((packed)) +DAC960_SCSI_RequestSenseKey_T; + + +/* + Define the SCSI REQUEST SENSE structure. +*/ -typedef unsigned int DAC960_ByteCount_T; +typedef struct DAC960_SCSI_RequestSense +{ + unsigned char ErrorCode:7; /* Byte 0 Bits 0-6 */ + boolean Valid:1; /* Byte 0 Bit 7 */ + unsigned char SegmentNumber; /* Byte 1 */ + DAC960_SCSI_RequestSenseKey_T SenseKey:4; /* Byte 2 Bits 0-3 */ + unsigned char :1; /* Byte 2 Bit 4 */ + boolean ILI:1; /* Byte 2 Bit 5 */ + boolean EOM:1; /* Byte 2 Bit 6 */ + boolean Filemark:1; /* Byte 2 Bit 7 */ + unsigned char Information[4]; /* Bytes 3-6 */ + unsigned char AdditionalSenseLength; /* Byte 7 */ + unsigned char CommandSpecificInformation[4]; /* Bytes 8-11 */ + unsigned char AdditionalSenseCode; /* Byte 12 */ + unsigned char AdditionalSenseCodeQualifier; /* Byte 13 */ +} +DAC960_SCSI_RequestSense_T; /* - Define the DAC960 Command Opcodes. + Define the DAC960 V1 Firmware Command Opcodes. */ typedef enum { /* I/O Commands */ - DAC960_ReadExtended = 0x33, - DAC960_WriteExtended = 0x34, - DAC960_ReadAheadExtended = 0x35, - DAC960_ReadExtendedWithScatterGather = 0xB3, - DAC960_WriteExtendedWithScatterGather = 0xB4, - DAC960_Read = 0x36, - DAC960_ReadWithOldScatterGather = 0xB6, - DAC960_Write = 0x37, - DAC960_WriteWithOldScatterGather = 0xB7, - DAC960_DCDB = 0x04, - DAC960_DCDBWithScatterGather = 0x84, - DAC960_Flush = 0x0A, + DAC960_V1_ReadExtended = 0x33, + DAC960_V1_WriteExtended = 0x34, + DAC960_V1_ReadAheadExtended = 0x35, + DAC960_V1_ReadExtendedWithScatterGather = 0xB3, + DAC960_V1_WriteExtendedWithScatterGather = 0xB4, + DAC960_V1_Read = 0x36, + DAC960_V1_ReadWithOldScatterGather = 0xB6, + DAC960_V1_Write = 0x37, + DAC960_V1_WriteWithOldScatterGather = 0xB7, + DAC960_V1_DCDB = 0x04, + DAC960_V1_DCDBWithScatterGather = 0x84, + DAC960_V1_Flush = 0x0A, /* Controller Status Related Commands */ - DAC960_Enquiry = 0x53, - DAC960_Enquiry2 = 0x1C, - DAC960_GetLogicalDriveElement = 0x55, - DAC960_GetLogicalDriveInformation = 0x19, - DAC960_IOPortRead = 0x39, - DAC960_IOPortWrite = 0x3A, - DAC960_GetSDStats = 0x3E, - DAC960_GetPDStats = 0x3F, - DAC960_PerformEventLogOperation = 0x72, + DAC960_V1_Enquiry = 0x53, + DAC960_V1_Enquiry2 = 0x1C, + DAC960_V1_GetLogicalDriveElement = 0x55, + DAC960_V1_GetLogicalDriveInformation = 0x19, + DAC960_V1_IOPortRead = 0x39, + DAC960_V1_IOPortWrite = 0x3A, + DAC960_V1_GetSDStats = 0x3E, + DAC960_V1_GetPDStats = 0x3F, + DAC960_V1_PerformEventLogOperation = 0x72, /* Device Related Commands */ - DAC960_StartDevice = 0x10, - DAC960_GetDeviceState = 0x50, - DAC960_StopChannel = 0x13, - DAC960_StartChannel = 0x12, - DAC960_ResetChannel = 0x1A, + DAC960_V1_StartDevice = 0x10, + DAC960_V1_GetDeviceState = 0x50, + DAC960_V1_StopChannel = 0x13, + DAC960_V1_StartChannel = 0x12, + DAC960_V1_ResetChannel = 0x1A, /* Commands Associated with Data Consistency and Errors */ - DAC960_Rebuild = 0x09, - DAC960_RebuildAsync = 0x16, - DAC960_CheckConsistency = 0x0F, - DAC960_CheckConsistencyAsync = 0x1E, - DAC960_RebuildStat = 0x0C, - DAC960_GetRebuildProgress = 0x27, - DAC960_RebuildControl = 0x1F, - DAC960_ReadBadBlockTable = 0x0B, - DAC960_ReadBadDataTable = 0x25, - DAC960_ClearBadDataTable = 0x26, - DAC960_GetErrorTable = 0x17, - DAC960_AddCapacityAsync = 0x2A, + DAC960_V1_Rebuild = 0x09, + DAC960_V1_RebuildAsync = 0x16, + DAC960_V1_CheckConsistency = 0x0F, + DAC960_V1_CheckConsistencyAsync = 0x1E, + DAC960_V1_RebuildStat = 0x0C, + DAC960_V1_GetRebuildProgress = 0x27, + DAC960_V1_RebuildControl = 0x1F, + DAC960_V1_ReadBadBlockTable = 0x0B, + DAC960_V1_ReadBadDataTable = 0x25, + DAC960_V1_ClearBadDataTable = 0x26, + DAC960_V1_GetErrorTable = 0x17, + DAC960_V1_AddCapacityAsync = 0x2A, /* Configuration Related Commands */ - DAC960_ReadConfig2 = 0x3D, - DAC960_WriteConfig2 = 0x3C, - DAC960_ReadConfigurationOnDisk = 0x4A, - DAC960_WriteConfigurationOnDisk = 0x4B, - DAC960_ReadConfiguration = 0x4E, - DAC960_ReadBackupConfiguration = 0x4D, - DAC960_WriteConfiguration = 0x4F, - DAC960_AddConfiguration = 0x4C, - DAC960_ReadConfigurationLabel = 0x48, - DAC960_WriteConfigurationLabel = 0x49, + DAC960_V1_ReadConfig2 = 0x3D, + DAC960_V1_WriteConfig2 = 0x3C, + DAC960_V1_ReadConfigurationOnDisk = 0x4A, + DAC960_V1_WriteConfigurationOnDisk = 0x4B, + DAC960_V1_ReadConfiguration = 0x4E, + DAC960_V1_ReadBackupConfiguration = 0x4D, + DAC960_V1_WriteConfiguration = 0x4F, + DAC960_V1_AddConfiguration = 0x4C, + DAC960_V1_ReadConfigurationLabel = 0x48, + DAC960_V1_WriteConfigurationLabel = 0x49, /* Firmware Upgrade Related Commands */ - DAC960_LoadImage = 0x20, - DAC960_StoreImage = 0x21, - DAC960_ProgramImage = 0x22, + DAC960_V1_LoadImage = 0x20, + DAC960_V1_StoreImage = 0x21, + DAC960_V1_ProgramImage = 0x22, /* Diagnostic Commands */ - DAC960_SetDiagnosticMode = 0x31, - DAC960_RunDiagnostic = 0x32, + DAC960_V1_SetDiagnosticMode = 0x31, + DAC960_V1_RunDiagnostic = 0x32, /* Subsystem Service Commands */ - DAC960_GetSubsystemData = 0x70, - DAC960_SetSubsystemParameters = 0x71 + DAC960_V1_GetSubsystemData = 0x70, + DAC960_V1_SetSubsystemParameters = 0x71 } __attribute__ ((packed)) -DAC960_CommandOpcode_T; +DAC960_V1_CommandOpcode_T; /* - Define the DAC960 Command Identifier type. + Define the DAC960 V1 Firmware Command Identifier type. */ -typedef unsigned char DAC960_CommandIdentifier_T; +typedef unsigned char DAC960_V1_CommandIdentifier_T; /* - Define the DAC960 Command Status Codes. + Define the DAC960 V1 Firmware Command Status Codes. */ -#define DAC960_NormalCompletion 0x0000 /* Common */ -#define DAC960_CheckConditionReceived 0x0002 /* Common */ -#define DAC960_NoDeviceAtAddress 0x0102 /* Common */ -#define DAC960_InvalidDeviceAddress 0x0105 /* Common */ -#define DAC960_InvalidParameter 0x0105 /* Common */ -#define DAC960_IrrecoverableDataError 0x0001 /* I/O */ -#define DAC960_LogicalDriveNonexistentOrOffline 0x0002 /* I/O */ -#define DAC960_AccessBeyondEndOfLogicalDrive 0x0105 /* I/O */ -#define DAC960_BadDataEncountered 0x010C /* I/O */ -#define DAC960_DeviceBusy 0x0008 /* DCDB */ -#define DAC960_DeviceNonresponsive 0x000E /* DCDB */ -#define DAC960_CommandTerminatedAbnormally 0x000F /* DCDB */ -#define DAC960_UnableToStartDevice 0x0002 /* Device */ -#define DAC960_InvalidChannelOrTargetOrModifier 0x0105 /* Device */ -#define DAC960_ChannelBusy 0x0106 /* Device */ -#define DAC960_ChannelNotStopped 0x0002 /* Device */ -#define DAC960_AttemptToRebuildOnlineDrive 0x0002 /* Consistency */ -#define DAC960_RebuildBadBlocksEncountered 0x0003 /* Consistency */ -#define DAC960_NewDiskFailedDuringRebuild 0x0004 /* Consistency */ -#define DAC960_RebuildOrCheckAlreadyInProgress 0x0106 /* Consistency */ -#define DAC960_DependentDiskIsDead 0x0002 /* Consistency */ -#define DAC960_InconsistentBlocksFound 0x0003 /* Consistency */ -#define DAC960_InvalidOrNonredundantLogicalDrive 0x0105 /* Consistency */ -#define DAC960_NoRebuildOrCheckInProgress 0x0105 /* Consistency */ -#define DAC960_RebuildInProgress_DataValid 0x0000 /* Consistency */ -#define DAC960_RebuildFailed_LogicalDriveFailure 0x0002 /* Consistency */ -#define DAC960_RebuildFailed_BadBlocksOnOther 0x0003 /* Consistency */ -#define DAC960_RebuildFailed_NewDriveFailed 0x0004 /* Consistency */ -#define DAC960_RebuildSuccessful 0x0100 /* Consistency */ -#define DAC960_RebuildSuccessfullyTerminated 0x0107 /* Consistency */ -#define DAC960_AddCapacityInProgress 0x0004 /* Consistency */ -#define DAC960_AddCapacityFailedOrSuspended 0x00F4 /* Consistency */ -#define DAC960_Config2ChecksumError 0x0002 /* Configuration */ -#define DAC960_ConfigurationSuspended 0x0106 /* Configuration */ -#define DAC960_FailedToConfigureNVRAM 0x0105 /* Configuration */ -#define DAC960_ConfigurationNotSavedStateChange 0x0106 /* Configuration */ -#define DAC960_SubsystemNotInstalled 0x0001 /* Subsystem */ -#define DAC960_SubsystemFailed 0x0002 /* Subsystem */ -#define DAC960_SubsystemBusy 0x0106 /* Subsystem */ +#define DAC960_V1_NormalCompletion 0x0000 /* Common */ +#define DAC960_V1_CheckConditionReceived 0x0002 /* Common */ +#define DAC960_V1_NoDeviceAtAddress 0x0102 /* Common */ +#define DAC960_V1_InvalidDeviceAddress 0x0105 /* Common */ +#define DAC960_V1_InvalidParameter 0x0105 /* Common */ +#define DAC960_V1_IrrecoverableDataError 0x0001 /* I/O */ +#define DAC960_V1_LogicalDriveNonexistentOrOffline 0x0002 /* I/O */ +#define DAC960_V1_AccessBeyondEndOfLogicalDrive 0x0105 /* I/O */ +#define DAC960_V1_BadDataEncountered 0x010C /* I/O */ +#define DAC960_V1_DeviceBusy 0x0008 /* DCDB */ +#define DAC960_V1_DeviceNonresponsive 0x000E /* DCDB */ +#define DAC960_V1_CommandTerminatedAbnormally 0x000F /* DCDB */ +#define DAC960_V1_UnableToStartDevice 0x0002 /* Device */ +#define DAC960_V1_InvalidChannelOrTargetOrModifier 0x0105 /* Device */ +#define DAC960_V1_ChannelBusy 0x0106 /* Device */ +#define DAC960_V1_ChannelNotStopped 0x0002 /* Device */ +#define DAC960_V1_AttemptToRebuildOnlineDrive 0x0002 /* Consistency */ +#define DAC960_V1_RebuildBadBlocksEncountered 0x0003 /* Consistency */ +#define DAC960_V1_NewDiskFailedDuringRebuild 0x0004 /* Consistency */ +#define DAC960_V1_RebuildOrCheckAlreadyInProgress 0x0106 /* Consistency */ +#define DAC960_V1_DependentDiskIsDead 0x0002 /* Consistency */ +#define DAC960_V1_InconsistentBlocksFound 0x0003 /* Consistency */ +#define DAC960_V1_InvalidOrNonredundantLogicalDrive 0x0105 /* Consistency */ +#define DAC960_V1_NoRebuildOrCheckInProgress 0x0105 /* Consistency */ +#define DAC960_V1_RebuildInProgress_DataValid 0x0000 /* Consistency */ +#define DAC960_V1_RebuildFailed_LogicalDriveFailure 0x0002 /* Consistency */ +#define DAC960_V1_RebuildFailed_BadBlocksOnOther 0x0003 /* Consistency */ +#define DAC960_V1_RebuildFailed_NewDriveFailed 0x0004 /* Consistency */ +#define DAC960_V1_RebuildSuccessful 0x0100 /* Consistency */ +#define DAC960_V1_RebuildSuccessfullyTerminated 0x0107 /* Consistency */ +#define DAC960_V1_AddCapacityInProgress 0x0004 /* Consistency */ +#define DAC960_V1_AddCapacityFailedOrSuspended 0x00F4 /* Consistency */ +#define DAC960_V1_Config2ChecksumError 0x0002 /* Configuration */ +#define DAC960_V1_ConfigurationSuspended 0x0106 /* Configuration */ +#define DAC960_V1_FailedToConfigureNVRAM 0x0105 /* Configuration */ +#define DAC960_V1_ConfigurationNotSavedStateChange 0x0106 /* Configuration */ +#define DAC960_V1_SubsystemNotInstalled 0x0001 /* Subsystem */ +#define DAC960_V1_SubsystemFailed 0x0002 /* Subsystem */ +#define DAC960_V1_SubsystemBusy 0x0106 /* Subsystem */ -typedef unsigned short DAC960_CommandStatus_T; +typedef unsigned short DAC960_V1_CommandStatus_T; /* - Define the Enquiry reply structure. + Define the DAC960 V1 Firmware Enquiry Command reply structure. */ -typedef struct DAC960_Enquiry +typedef struct DAC960_V1_Enquiry { unsigned char NumberOfLogicalDrives; /* Byte 0 */ unsigned int :24; /* Bytes 1-3 */ @@ -229,15 +358,15 @@ unsigned char MinorFirmwareVersion; /* Byte 136 */ unsigned char MajorFirmwareVersion; /* Byte 137 */ enum { - DAC960_NoStandbyRebuildOrCheckInProgress = 0x00, - DAC960_StandbyRebuildInProgress = 0x01, - DAC960_BackgroundRebuildInProgress = 0x02, - DAC960_BackgroundCheckInProgress = 0x03, - DAC960_StandbyRebuildCompletedWithError = 0xFF, - DAC960_BackgroundRebuildOrCheckFailed_DriveFailed = 0xF0, - DAC960_BackgroundRebuildOrCheckFailed_LogicalDriveFailed = 0xF1, - DAC960_BackgroundRebuildOrCheckFailed_OtherCauses = 0xF2, - DAC960_BackgroundRebuildOrCheckSuccessfullyTerminated = 0xF3 + DAC960_V1_NoStandbyRebuildOrCheckInProgress = 0x00, + DAC960_V1_StandbyRebuildInProgress = 0x01, + DAC960_V1_BackgroundRebuildInProgress = 0x02, + DAC960_V1_BackgroundCheckInProgress = 0x03, + DAC960_V1_StandbyRebuildCompletedWithError = 0xFF, + DAC960_V1_BackgroundRebuildOrCheckFailed_DriveFailed = 0xF0, + DAC960_V1_BackgroundRebuildOrCheckFailed_LogicalDriveFailed = 0xF1, + DAC960_V1_BackgroundRebuildOrCheckFailed_OtherCauses = 0xF2, + DAC960_V1_BackgroundRebuildOrCheckSuccessfullyTerminated = 0xF3 } __attribute__ ((packed)) RebuildFlag; /* Byte 138 */ unsigned char MaxCommands; /* Byte 139 */ unsigned char OfflineLogicalDriveCount; /* Byte 140 */ @@ -261,40 +390,40 @@ unsigned char Reserved[62]; /* Bytes 195-255 */ } __attribute__ ((packed)) -DAC960_Enquiry_T; +DAC960_V1_Enquiry_T; /* - Define the Enquiry2 reply structure. + Define the DAC960 V1 Firmware Enquiry2 Command reply structure. */ -typedef struct DAC960_Enquiry2 +typedef struct DAC960_V1_Enquiry2 { struct { enum { - DAC960_P_PD_PU = 0x01, - DAC960_PL = 0x02, - DAC960_PG = 0x10, - DAC960_PJ = 0x11, - DAC960_PR = 0x12, - DAC960_PT = 0x13, - DAC960_PTL0 = 0x14, - DAC960_PRL = 0x15, - DAC960_PTL1 = 0x16, - DAC1164_P = 0x20 + DAC960_V1_P_PD_PU = 0x01, + DAC960_V1_PL = 0x02, + DAC960_V1_PG = 0x10, + DAC960_V1_PJ = 0x11, + DAC960_V1_PR = 0x12, + DAC960_V1_PT = 0x13, + DAC960_V1_PTL0 = 0x14, + DAC960_V1_PRL = 0x15, + DAC960_V1_PTL1 = 0x16, + DAC960_V1_1164P = 0x20 } __attribute__ ((packed)) SubModel; /* Byte 0 */ unsigned char ActualChannels; /* Byte 1 */ enum { - DAC960_FiveChannelBoard = 0x01, - DAC960_ThreeChannelBoard = 0x02, - DAC960_TwoChannelBoard = 0x03, - DAC960_ThreeChannelASIC_DAC = 0x04 + DAC960_V1_FiveChannelBoard = 0x01, + DAC960_V1_ThreeChannelBoard = 0x02, + DAC960_V1_TwoChannelBoard = 0x03, + DAC960_V1_ThreeChannelASIC_DAC = 0x04 } __attribute__ ((packed)) Model; /* Byte 2 */ enum { - DAC960_EISA_Controller = 0x01, - DAC960_MicroChannel_Controller = 0x02, - DAC960_PCI_Controller = 0x03, - DAC960_SCSItoSCSI_Controller = 0x08 + DAC960_V1_EISA_Controller = 0x01, + DAC960_V1_MicroChannel_Controller = 0x02, + DAC960_V1_PCI_Controller = 0x03, + DAC960_V1_SCSItoSCSI_Controller = 0x08 } __attribute__ ((packed)) ProductFamily; /* Byte 3 */ } HardwareID; /* Bytes 0-3 */ /* MajorVersion.MinorVersion-FirmwareType-TurnID */ @@ -321,14 +450,14 @@ unsigned int NonVolatileMemorySize; /* Bytes 36-39 */ struct { enum { - DAC960_DRAM = 0x00, - DAC960_EDO = 0x01, - DAC960_SDRAM = 0x02 + DAC960_V1_DRAM = 0x0, + DAC960_V1_EDO = 0x1, + DAC960_V1_SDRAM = 0x2 } __attribute__ ((packed)) RamType:3; /* Byte 40 Bits 0-2 */ enum { - DAC960_None = 0x00, - DAC960_Parity = 0x01, - DAC960_ECC = 0x02 + DAC960_V1_None = 0x0, + DAC960_V1_Parity = 0x1, + DAC960_V1_ECC = 0x2 } __attribute__ ((packed)) ErrorCorrection:3; /* Byte 40 Bits 3-5 */ boolean FastPageMode:1; /* Byte 40 Bit 6 */ boolean LowPowerMemory:1; /* Byte 40 Bit 7 */ @@ -367,14 +496,14 @@ unsigned short CacheLineSize; /* Bytes 104-105 */ struct { enum { - DAC960_Narrow_8bit = 0x00, - DAC960_Wide_16bit = 0x01, - DAC960_Wide_32bit = 0x02 + DAC960_V1_Narrow_8bit = 0x0, + DAC960_V1_Wide_16bit = 0x1, + DAC960_V1_Wide_32bit = 0x2 } __attribute__ ((packed)) BusWidth:2; /* Byte 106 Bits 0-1 */ enum { - DAC960_Fast = 0x00, - DAC960_Ultra = 0x01, - DAC960_Ultra2 = 0x02 + DAC960_V1_Fast = 0x0, + DAC960_V1_Ultra = 0x1, + DAC960_V1_Ultra2 = 0x2 } __attribute__ ((packed)) BusSpeed:2; /* Byte 106 Bits 2-3 */ boolean Differential:1; /* Byte 106 Bit 4 */ unsigned char :3; /* Byte 106 Bits 5-7 */ @@ -383,12 +512,12 @@ unsigned int :32; /* Bytes 108-111 */ unsigned short FirmwareBuildNumber; /* Bytes 112-113 */ enum { - DAC960_AEMI = 0x01, - DAC960_OEM1 = 0x02, - DAC960_OEM2 = 0x04, - DAC960_OEM3 = 0x08, - DAC960_Conner = 0x10, - DAC960_SAFTE = 0x20 + DAC960_V1_AEMI = 0x01, + DAC960_V1_OEM1 = 0x02, + DAC960_V1_OEM2 = 0x04, + DAC960_V1_OEM3 = 0x08, + DAC960_V1_Conner = 0x10, + DAC960_V1_SAFTE = 0x20 } __attribute__ ((packed)) FaultManagementType; /* Byte 114 */ unsigned char :8; /* Byte 115 */ struct { @@ -399,55 +528,64 @@ unsigned int :32; /* Bytes 120-123 */ unsigned int :32; /* Bytes 124-127 */ } -DAC960_Enquiry2_T; +DAC960_V1_Enquiry2_T; /* - Define the Logical Drive State type. + Define the DAC960 V1 Firmware Logical Drive State type. */ typedef enum { - DAC960_LogicalDrive_Online = 0x03, - DAC960_LogicalDrive_Critical = 0x04, - DAC960_LogicalDrive_Offline = 0xFF + DAC960_V1_LogicalDrive_Online = 0x03, + DAC960_V1_LogicalDrive_Critical = 0x04, + DAC960_V1_LogicalDrive_Offline = 0xFF } __attribute__ ((packed)) -DAC960_LogicalDriveState_T; +DAC960_V1_LogicalDriveState_T; /* - Define the Get Logical Drive Information reply structure. + Define the DAC960 V1 Firmware Logical Drive Information structure. */ -typedef struct DAC960_LogicalDriveInformation +typedef struct DAC960_V1_LogicalDriveInformation { unsigned int LogicalDriveSize; /* Bytes 0-3 */ - DAC960_LogicalDriveState_T LogicalDriveState; /* Byte 4 */ + DAC960_V1_LogicalDriveState_T LogicalDriveState; /* Byte 4 */ unsigned char RAIDLevel:7; /* Byte 5 Bits 0-6 */ boolean WriteBack:1; /* Byte 5 Bit 7 */ - unsigned int :16; /* Bytes 6-7 */ + unsigned short :16; /* Bytes 6-7 */ } -DAC960_LogicalDriveInformation_T; +DAC960_V1_LogicalDriveInformation_T; + +/* + Define the DAC960 V1 Firmware Get Logical Drive Information Command + reply structure. +*/ + +typedef DAC960_V1_LogicalDriveInformation_T + DAC960_V1_LogicalDriveInformationArray_T[DAC960_MaxLogicalDrives]; + /* - Define the Perform Event Log Operation Types. + Define the DAC960 V1 Firmware Perform Event Log Operation Types. */ typedef enum { - DAC960_GetEventLogEntry = 0x00 + DAC960_V1_GetEventLogEntry = 0x00 } __attribute__ ((packed)) -DAC960_PerformEventLogOpType_T; +DAC960_V1_PerformEventLogOpType_T; /* - Define the Get Event Log Entry reply structure. + Define the DAC960 V1 Firmware Get Event Log Entry Command reply structure. */ -typedef struct DAC960_EventLogEntry +typedef struct DAC960_V1_EventLogEntry { unsigned char MessageType; /* Byte 0 */ unsigned char MessageLength; /* Byte 1 */ @@ -459,7 +597,7 @@ unsigned char ErrorCode:7; /* Byte 6 Bits 0-6 */ boolean Valid:1; /* Byte 6 Bit 7 */ unsigned char SegmentNumber; /* Byte 7 */ - unsigned char SenseKey:4; /* Byte 8 Bits 0-3 */ + DAC960_SCSI_RequestSenseKey_T SenseKey:4; /* Byte 8 Bits 0-3 */ unsigned char :1; /* Byte 8 Bit 4 */ boolean ILI:1; /* Byte 8 Bit 5 */ boolean EOM:1; /* Byte 8 Bit 6 */ @@ -471,37 +609,37 @@ unsigned char AdditionalSenseCodeQualifier; /* Byte 19 */ unsigned char Dummy[12]; /* Bytes 20-31 */ } -DAC960_EventLogEntry_T; +DAC960_V1_EventLogEntry_T; /* - Define the Physical Device State type. + Define the DAC960 V1 Firmware Physical Device State type. */ typedef enum { - DAC960_Device_Dead = 0x00, - DAC960_Device_WriteOnly = 0x02, - DAC960_Device_Online = 0x03, - DAC960_Device_Standby = 0x10 + DAC960_V1_Device_Dead = 0x00, + DAC960_V1_Device_WriteOnly = 0x02, + DAC960_V1_Device_Online = 0x03, + DAC960_V1_Device_Standby = 0x10 } __attribute__ ((packed)) -DAC960_PhysicalDeviceState_T; +DAC960_V1_PhysicalDeviceState_T; /* - Define the Get Device State reply structure. + Define the DAC960 V1 Firmware Get Device State Command reply structure. */ -typedef struct DAC960_DeviceState +typedef struct DAC960_V1_DeviceState { boolean Present:1; /* Byte 0 Bit 0 */ unsigned char :7; /* Byte 0 Bits 1-7 */ enum { - DAC960_OtherType = 0x00, - DAC960_DiskType = 0x01, - DAC960_SequentialType = 0x02, - DAC960_CDROM_or_WORM_Type = 0x03 + DAC960_V1_OtherType = 0x0, + DAC960_V1_DiskType = 0x1, + DAC960_V1_SequentialType = 0x2, + DAC960_V1_CDROM_or_WORM_Type = 0x3 } __attribute__ ((packed)) DeviceType:2; /* Byte 1 Bits 0-1 */ boolean :1; /* Byte 1 Bit 2 */ boolean Fast20:1; /* Byte 1 Bit 3 */ @@ -509,60 +647,60 @@ boolean Fast:1; /* Byte 1 Bit 5 */ boolean Wide:1; /* Byte 1 Bit 6 */ boolean TaggedQueuingSupported:1; /* Byte 1 Bit 7 */ - DAC960_PhysicalDeviceState_T DeviceState; /* Byte 2 */ + DAC960_V1_PhysicalDeviceState_T DeviceState; /* Byte 2 */ unsigned char :8; /* Byte 3 */ unsigned char SynchronousMultiplier; /* Byte 4 */ unsigned char SynchronousOffset:5; /* Byte 5 Bits 0-4 */ unsigned char :3; /* Byte 5 Bits 5-7 */ unsigned int DiskSize __attribute__ ((packed)); /* Bytes 6-9 */ } -DAC960_DeviceState_T; +DAC960_V1_DeviceState_T; /* - Define the Get Rebuild Progress reply structure. + Define the DAC960 V1 Firmware Get Rebuild Progress Command reply structure. */ -typedef struct DAC960_RebuildProgress +typedef struct DAC960_V1_RebuildProgress { unsigned int LogicalDriveNumber; /* Bytes 0-3 */ unsigned int LogicalDriveSize; /* Bytes 4-7 */ unsigned int RemainingBlocks; /* Bytes 8-11 */ } -DAC960_RebuildProgress_T; +DAC960_V1_RebuildProgress_T; /* - Define the Error Table Entry and Get Error Table reply structure. + Define the DAC960 V1 Firmware Error Table Entry structure. */ -typedef struct DAC960_ErrorTableEntry +typedef struct DAC960_V1_ErrorTableEntry { unsigned char ParityErrorCount; /* Byte 0 */ unsigned char SoftErrorCount; /* Byte 1 */ unsigned char HardErrorCount; /* Byte 2 */ unsigned char MiscErrorCount; /* Byte 3 */ } -DAC960_ErrorTableEntry_T; +DAC960_V1_ErrorTableEntry_T; /* - Define the Get Error Table reply structure. + Define the DAC960 V1 Firmware Get Error Table Command reply structure. */ -typedef struct DAC960_ErrorTable +typedef struct DAC960_V1_ErrorTable { - DAC960_ErrorTableEntry_T - ErrorTableEntries[DAC960_MaxChannels][DAC960_MaxTargets]; + DAC960_V1_ErrorTableEntry_T + ErrorTableEntries[DAC960_V1_MaxChannels][DAC960_V1_MaxTargets]; } -DAC960_ErrorTable_T; +DAC960_V1_ErrorTable_T; /* - Define the Config2 reply structure. + Define the DAC960 V1 Firmware Read Config2 Command reply structure. */ -typedef struct DAC960_Config2 +typedef struct DAC960_V1_Config2 { unsigned char :1; /* Byte 0 Bit 0 */ boolean ActiveNegationEnabled:1; /* Byte 0 Bit 1 */ @@ -576,12 +714,12 @@ boolean AEMI_OFM:1; /* Byte 1 Bit 6 */ unsigned char :1; /* Byte 1 Bit 7 */ enum { - DAC960_OEMID_Mylex = 0x00, - DAC960_OEMID_IBM = 0x08, - DAC960_OEMID_HP = 0x0A, - DAC960_OEMID_DEC = 0x0C, - DAC960_OEMID_Siemens = 0x10, - DAC960_OEMID_Intel = 0x12 + DAC960_V1_OEMID_Mylex = 0x00, + DAC960_V1_OEMID_IBM = 0x08, + DAC960_V1_OEMID_HP = 0x0A, + DAC960_V1_OEMID_DEC = 0x0C, + DAC960_V1_OEMID_Siemens = 0x10, + DAC960_V1_OEMID_Intel = 0x12 } __attribute__ ((packed)) OEMID; /* Byte 2 */ unsigned char OEMModelNumber; /* Byte 3 */ unsigned char PhysicalSector; /* Byte 4 */ @@ -600,21 +738,21 @@ unsigned char BlocksPerStripe; /* Byte 11 */ struct { enum { - DAC960_Async = 0x00, - DAC960_Sync_8MHz = 0x01, - DAC960_Sync_5MHz = 0x02, - DAC960_Sync_10or20MHz = 0x03 /* Bits 0-1 */ + DAC960_V1_Async = 0x0, + DAC960_V1_Sync_8MHz = 0x1, + DAC960_V1_Sync_5MHz = 0x2, + DAC960_V1_Sync_10or20MHz = 0x3 /* Byte 11 Bits 0-1 */ } __attribute__ ((packed)) Speed:2; - boolean Force8Bit:1; /* Bit 2 */ - boolean DisableFast20:1; /* Bit 3 */ - unsigned char :3; /* Bits 4-6 */ - boolean EnableTaggedQueuing:1; /* Bit 7 */ + boolean Force8Bit:1; /* Byte 11 Bit 2 */ + boolean DisableFast20:1; /* Byte 11 Bit 3 */ + unsigned char :3; /* Byte 11 Bits 4-6 */ + boolean EnableTaggedQueuing:1; /* Byte 11 Bit 7 */ } __attribute__ ((packed)) ChannelParameters[6]; /* Bytes 12-17 */ unsigned char SCSIInitiatorID; /* Byte 18 */ unsigned char :8; /* Byte 19 */ enum { - DAC960_StartupMode_ControllerSpinUp = 0x00, - DAC960_StartupMode_PowerOnSpinUp = 0x01 + DAC960_V1_StartupMode_ControllerSpinUp = 0x00, + DAC960_V1_StartupMode_PowerOnSpinUp = 0x01 } __attribute__ ((packed)) StartupMode; /* Byte 20 */ unsigned char SimultaneousDeviceSpinUpCount; /* Byte 21 */ unsigned char SecondsDelayBetweenSpinUps; /* Byte 22 */ @@ -623,44 +761,44 @@ boolean CDROMBootEnabled:1; /* Byte 52 Bit 1 */ unsigned char :3; /* Byte 52 Bits 2-4 */ enum { - DAC960_Geometry_128_32 = 0x00, - DAC960_Geometry_255_63 = 0x01, - DAC960_Geometry_Reserved1 = 0x02, - DAC960_Geometry_Reserved2 = 0x03 + DAC960_V1_Geometry_128_32 = 0x0, + DAC960_V1_Geometry_255_63 = 0x1, + DAC960_V1_Geometry_Reserved1 = 0x2, + DAC960_V1_Geometry_Reserved2 = 0x3 } __attribute__ ((packed)) DriveGeometry:2; /* Byte 52 Bits 5-6 */ unsigned char :1; /* Byte 52 Bit 7 */ unsigned char Reserved2[9]; /* Bytes 53-61 */ unsigned short Checksum; /* Bytes 62-63 */ } -DAC960_Config2_T; +DAC960_V1_Config2_T; /* - Define the DCDB request structure. + Define the DAC960 V1 Firmware DCDB request structure. */ -typedef struct DAC960_DCDB +typedef struct DAC960_V1_DCDB { unsigned char TargetID:4; /* Byte 0 Bits 0-3 */ unsigned char Channel:4; /* Byte 0 Bits 4-7 */ enum { - DAC960_DCDB_NoDataTransfer = 0, - DAC960_DCDB_DataTransferDeviceToSystem = 1, - DAC960_DCDB_DataTransferSystemToDevice = 2, - DAC960_DCDB_IllegalDataTransfer = 3 + DAC960_V1_DCDB_NoDataTransfer = 0, + DAC960_V1_DCDB_DataTransferDeviceToSystem = 1, + DAC960_V1_DCDB_DataTransferSystemToDevice = 2, + DAC960_V1_DCDB_IllegalDataTransfer = 3 } __attribute__ ((packed)) Direction:2; /* Byte 1 Bits 0-1 */ boolean EarlyStatus:1; /* Byte 1 Bit 2 */ unsigned char :1; /* Byte 1 Bit 3 */ enum { - DAC960_DCDB_Timeout_24_hours = 0, - DAC960_DCDB_Timeout_10_seconds = 1, - DAC960_DCDB_Timeout_60_seconds = 2, - DAC960_DCDB_Timeout_10_minutes = 3 + DAC960_V1_DCDB_Timeout_24_hours = 0, + DAC960_V1_DCDB_Timeout_10_seconds = 1, + DAC960_V1_DCDB_Timeout_60_seconds = 2, + DAC960_V1_DCDB_Timeout_10_minutes = 3 } __attribute__ ((packed)) Timeout:2; /* Byte 1 Bits 4-5 */ boolean NoAutomaticRequestSense:1; /* Byte 1 Bit 6 */ boolean DisconnectPermitted:1; /* Byte 1 Bit 7 */ unsigned short TransferLength; /* Bytes 2-3 */ - DAC960_BusAddress_T BusAddress; /* Bytes 4-7 */ + DAC960_BusAddress32_T BusAddress; /* Bytes 4-7 */ unsigned char CDBLength:4; /* Byte 8 Bits 0-3 */ unsigned char TransferLengthHigh4:4; /* Byte 8 Bits 4-7 */ unsigned char SenseLength; /* Byte 9 */ @@ -668,388 +806,1289 @@ unsigned char SenseData[64]; /* Bytes 22-85 */ unsigned char Status; /* Byte 86 */ unsigned char :8; /* Byte 87 */ -} -DAC960_DCDB_T; - - -/* - Define the SCSI INQUIRY Standard Data reply structure. -*/ - -typedef struct DAC960_SCSI_Inquiry -{ - unsigned char PeripheralDeviceType:5; /* Byte 0 Bits 0-4 */ - unsigned char PeripheralQualifier:3; /* Byte 0 Bits 5-7 */ - unsigned char DeviceTypeModifier:7; /* Byte 1 Bits 0-6 */ - boolean RMB:1; /* Byte 1 Bit 7 */ - unsigned char ANSI_ApprovedVersion:3; /* Byte 2 Bits 0-2 */ - unsigned char ECMA_Version:3; /* Byte 2 Bits 3-5 */ - unsigned char ISO_Version:2; /* Byte 2 Bits 6-7 */ - unsigned char ResponseDataFormat:4; /* Byte 3 Bits 0-3 */ - unsigned char :2; /* Byte 3 Bits 4-5 */ - boolean TrmIOP:1; /* Byte 3 Bit 6 */ - boolean AENC:1; /* Byte 3 Bit 7 */ - unsigned char AdditionalLength; /* Byte 4 */ - unsigned char :8; /* Byte 5 */ - unsigned char :8; /* Byte 6 */ - boolean SftRe:1; /* Byte 7 Bit 0 */ - boolean CmdQue:1; /* Byte 7 Bit 1 */ - boolean :1; /* Byte 7 Bit 2 */ - boolean Linked:1; /* Byte 7 Bit 3 */ - boolean Sync:1; /* Byte 7 Bit 4 */ - boolean WBus16:1; /* Byte 7 Bit 5 */ - boolean WBus32:1; /* Byte 7 Bit 6 */ - boolean RelAdr:1; /* Byte 7 Bit 7 */ - unsigned char VendorIdentification[8]; /* Bytes 8-15 */ - unsigned char ProductIdentification[16]; /* Bytes 16-31 */ - unsigned char ProductRevisionLevel[4]; /* Bytes 32-35 */ -} -DAC960_SCSI_Inquiry_T; - - -/* - Define the SCSI INQUIRY Unit Serial Number reply structure. -*/ - -typedef struct DAC960_SCSI_Inquiry_UnitSerialNumber -{ - unsigned char PeripheralDeviceType:5; /* Byte 0 Bits 0-4 */ - unsigned char PeripheralQualifier:3; /* Byte 0 Bits 5-7 */ - unsigned char PageCode; /* Byte 1 */ - unsigned char :8; /* Byte 2 */ - unsigned char PageLength; /* Byte 3 */ - unsigned char ProductSerialNumber[28]; /* Bytes 4 - 31 */ } -DAC960_SCSI_Inquiry_UnitSerialNumber_T; +DAC960_V1_DCDB_T; /* - Define the Scatter/Gather List Type 1 32 Bit Address 32 Bit Byte Count - structure. + Define the DAC960 V1 Firmware Scatter/Gather List Type 1 32 Bit Address + 32 Bit Byte Count structure. */ -typedef struct DAC960_ScatterGatherSegment +typedef struct DAC960_V1_ScatterGatherSegment { - DAC960_BusAddress_T SegmentDataPointer; /* Bytes 0-3 */ - DAC960_ByteCount_T SegmentByteCount; /* Bytes 4-7 */ + DAC960_BusAddress32_T SegmentDataPointer; /* Bytes 0-3 */ + DAC960_ByteCount32_T SegmentByteCount; /* Bytes 4-7 */ } -DAC960_ScatterGatherSegment_T; +DAC960_V1_ScatterGatherSegment_T; /* - Define the 13 Byte DAC960 Command Mailbox structure. Bytes 13-15 are - not used. The Command Mailbox structure is padded to 16 bytes for + Define the 13 Byte DAC960 V1 Firmware Command Mailbox structure. Bytes 13-15 + are not used. The Command Mailbox structure is padded to 16 bytes for efficient access. */ -typedef union DAC960_CommandMailbox +typedef union DAC960_V1_CommandMailbox { unsigned int Words[4]; /* Words 0-3 */ unsigned char Bytes[16]; /* Bytes 0-15 */ struct { - DAC960_CommandOpcode_T CommandOpcode; /* Byte 0 */ - DAC960_CommandIdentifier_T CommandIdentifier; /* Byte 1 */ + DAC960_V1_CommandOpcode_T CommandOpcode; /* Byte 0 */ + DAC960_V1_CommandIdentifier_T CommandIdentifier; /* Byte 1 */ unsigned char Dummy[14]; /* Bytes 2-15 */ } __attribute__ ((packed)) Common; struct { - DAC960_CommandOpcode_T CommandOpcode; /* Byte 0 */ - DAC960_CommandIdentifier_T CommandIdentifier; /* Byte 1 */ + DAC960_V1_CommandOpcode_T CommandOpcode; /* Byte 0 */ + DAC960_V1_CommandIdentifier_T CommandIdentifier; /* Byte 1 */ unsigned char Dummy1[6]; /* Bytes 2-7 */ - DAC960_BusAddress_T BusAddress; /* Bytes 8-11 */ + DAC960_BusAddress32_T BusAddress; /* Bytes 8-11 */ unsigned char Dummy2[4]; /* Bytes 12-15 */ } __attribute__ ((packed)) Type3; struct { - DAC960_CommandOpcode_T CommandOpcode; /* Byte 0 */ - DAC960_CommandIdentifier_T CommandIdentifier; /* Byte 1 */ + DAC960_V1_CommandOpcode_T CommandOpcode; /* Byte 0 */ + DAC960_V1_CommandIdentifier_T CommandIdentifier; /* Byte 1 */ unsigned char Dummy1[5]; /* Bytes 2-6 */ unsigned char LogicalDriveNumber:6; /* Byte 7 Bits 0-6 */ boolean AutoRestore:1; /* Byte 7 Bit 7 */ unsigned char Dummy2[8]; /* Bytes 8-15 */ } __attribute__ ((packed)) Type3C; struct { - DAC960_CommandOpcode_T CommandOpcode; /* Byte 0 */ - DAC960_CommandIdentifier_T CommandIdentifier; /* Byte 1 */ + DAC960_V1_CommandOpcode_T CommandOpcode; /* Byte 0 */ + DAC960_V1_CommandIdentifier_T CommandIdentifier; /* Byte 1 */ unsigned char Channel; /* Byte 2 */ unsigned char TargetID; /* Byte 3 */ - DAC960_PhysicalDeviceState_T DeviceState:5; /* Byte 4 Bits 0-4 */ + DAC960_V1_PhysicalDeviceState_T DeviceState:5; /* Byte 4 Bits 0-4 */ unsigned char Modifier:3; /* Byte 4 Bits 5-7 */ unsigned char Dummy1[3]; /* Bytes 5-7 */ - DAC960_BusAddress_T BusAddress; /* Bytes 8-11 */ + DAC960_BusAddress32_T BusAddress; /* Bytes 8-11 */ unsigned char Dummy2[4]; /* Bytes 12-15 */ } __attribute__ ((packed)) Type3D; struct { - DAC960_CommandOpcode_T CommandOpcode; /* Byte 0 */ - DAC960_CommandIdentifier_T CommandIdentifier; /* Byte 1 */ - DAC960_PerformEventLogOpType_T OperationType; /* Byte 2 */ + DAC960_V1_CommandOpcode_T CommandOpcode; /* Byte 0 */ + DAC960_V1_CommandIdentifier_T CommandIdentifier; /* Byte 1 */ + DAC960_V1_PerformEventLogOpType_T OperationType; /* Byte 2 */ unsigned char OperationQualifier; /* Byte 3 */ unsigned short SequenceNumber; /* Bytes 4-5 */ unsigned char Dummy1[2]; /* Bytes 6-7 */ - DAC960_BusAddress_T BusAddress; /* Bytes 8-11 */ + DAC960_BusAddress32_T BusAddress; /* Bytes 8-11 */ unsigned char Dummy2[4]; /* Bytes 12-15 */ } __attribute__ ((packed)) Type3E; struct { - DAC960_CommandOpcode_T CommandOpcode; /* Byte 0 */ - DAC960_CommandIdentifier_T CommandIdentifier; /* Byte 1 */ + DAC960_V1_CommandOpcode_T CommandOpcode; /* Byte 0 */ + DAC960_V1_CommandIdentifier_T CommandIdentifier; /* Byte 1 */ unsigned char Dummy1[2]; /* Bytes 2-3 */ unsigned char RebuildRateConstant; /* Byte 4 */ unsigned char Dummy2[3]; /* Bytes 5-7 */ - DAC960_BusAddress_T BusAddress; /* Bytes 8-11 */ + DAC960_BusAddress32_T BusAddress; /* Bytes 8-11 */ unsigned char Dummy3[4]; /* Bytes 12-15 */ } __attribute__ ((packed)) Type3R; struct { - DAC960_CommandOpcode_T CommandOpcode; /* Byte 0 */ - DAC960_CommandIdentifier_T CommandIdentifier; /* Byte 1 */ + DAC960_V1_CommandOpcode_T CommandOpcode; /* Byte 0 */ + DAC960_V1_CommandIdentifier_T CommandIdentifier; /* Byte 1 */ unsigned short TransferLength; /* Bytes 2-3 */ unsigned int LogicalBlockAddress; /* Bytes 4-7 */ - DAC960_BusAddress_T BusAddress; /* Bytes 8-11 */ + DAC960_BusAddress32_T BusAddress; /* Bytes 8-11 */ unsigned char LogicalDriveNumber; /* Byte 12 */ unsigned char Dummy[3]; /* Bytes 13-15 */ } __attribute__ ((packed)) Type4; struct { - DAC960_CommandOpcode_T CommandOpcode; /* Byte 0 */ - DAC960_CommandIdentifier_T CommandIdentifier; /* Byte 1 */ + DAC960_V1_CommandOpcode_T CommandOpcode; /* Byte 0 */ + DAC960_V1_CommandIdentifier_T CommandIdentifier; /* Byte 1 */ struct { unsigned short TransferLength:11; /* Bytes 2-3 */ unsigned char LogicalDriveNumber:5; /* Byte 3 Bits 3-7 */ } __attribute__ ((packed)) LD; unsigned int LogicalBlockAddress; /* Bytes 4-7 */ - DAC960_BusAddress_T BusAddress; /* Bytes 8-11 */ + DAC960_BusAddress32_T BusAddress; /* Bytes 8-11 */ unsigned char ScatterGatherCount:6; /* Byte 12 Bits 0-5 */ enum { - DAC960_ScatterGather_32BitAddress_32BitByteCount = 0x0, - DAC960_ScatterGather_32BitAddress_16BitByteCount = 0x1, - DAC960_ScatterGather_32BitByteCount_32BitAddress = 0x2, - DAC960_ScatterGather_16BitByteCount_32BitAddress = 0x3 + DAC960_V1_ScatterGather_32BitAddress_32BitByteCount = 0x0, + DAC960_V1_ScatterGather_32BitAddress_16BitByteCount = 0x1, + DAC960_V1_ScatterGather_32BitByteCount_32BitAddress = 0x2, + DAC960_V1_ScatterGather_16BitByteCount_32BitAddress = 0x3 } __attribute__ ((packed)) ScatterGatherType:2; /* Byte 12 Bits 6-7 */ unsigned char Dummy[3]; /* Bytes 13-15 */ } __attribute__ ((packed)) Type5; struct { - DAC960_CommandOpcode_T CommandOpcode; /* Byte 0 */ - DAC960_CommandIdentifier_T CommandIdentifier; /* Byte 1 */ + DAC960_V1_CommandOpcode_T CommandOpcode; /* Byte 0 */ + DAC960_V1_CommandIdentifier_T CommandIdentifier; /* Byte 1 */ unsigned char CommandOpcode2; /* Byte 2 */ unsigned char :8; /* Byte 3 */ - DAC960_BusAddress_T CommandMailboxesBusAddress; /* Bytes 4-7 */ - DAC960_BusAddress_T StatusMailboxesBusAddress; /* Bytes 8-11 */ + DAC960_BusAddress32_T CommandMailboxesBusAddress; /* Bytes 4-7 */ + DAC960_BusAddress32_T StatusMailboxesBusAddress; /* Bytes 8-11 */ unsigned char Dummy[4]; /* Bytes 12-15 */ } __attribute__ ((packed)) TypeX; } -DAC960_CommandMailbox_T; +DAC960_V1_CommandMailbox_T; /* - Define the DAC960 Driver IOCTL requests. + Define the DAC960 V2 Firmware Command Opcodes. */ -#define DAC960_IOCTL_GET_CONTROLLER_COUNT 0xDAC001 -#define DAC960_IOCTL_GET_CONTROLLER_INFO 0xDAC002 -#define DAC960_IOCTL_EXECUTE_COMMAND 0xDAC003 +typedef enum +{ + DAC960_V2_MemCopy = 0x01, + DAC960_V2_SCSI_10_Passthru = 0x02, + DAC960_V2_SCSI_255_Passthru = 0x03, + DAC960_V2_SCSI_10 = 0x04, + DAC960_V2_SCSI_256 = 0x05, + DAC960_V2_IOCTL = 0x20 +} +__attribute__ ((packed)) +DAC960_V2_CommandOpcode_T; /* - Define the DAC960_IOCTL_GET_CONTROLLER_INFO reply structure. + Define the DAC960 V2 Firmware IOCTL Opcodes. */ -typedef struct DAC960_ControllerInfo +typedef enum { - unsigned char ControllerNumber; - unsigned char PCI_Bus; - unsigned char PCI_Device; - unsigned char PCI_Function; - unsigned char IRQ_Channel; - unsigned char Channels; - DAC960_PCI_Address_T PCI_Address; - unsigned char ModelName[16]; - unsigned char FirmwareVersion[16]; + DAC960_V2_GetControllerInfo = 0x01, + DAC960_V2_GetLogicalDeviceInfoValid = 0x03, + DAC960_V2_GetPhysicalDeviceInfoValid = 0x05, + DAC960_V2_GetHealthStatus = 0x11, + DAC960_V2_GetEvent = 0x15, + DAC960_V2_SetDeviceState = 0x82, + DAC960_V2_RebuildDeviceStart = 0x88, + DAC960_V2_RebuildDeviceStop = 0x89, + DAC960_V2_ConsistencyCheckStart = 0x8C, + DAC960_V2_ConsistencyCheckStop = 0x8D, + DAC960_V2_SetMemoryMailbox = 0x8E, + DAC960_V2_PauseDevice = 0x92, + DAC960_V2_TranslatePhysicalToLogicalDevice = 0xC5 } -DAC960_ControllerInfo_T; +__attribute__ ((packed)) +DAC960_V2_IOCTL_Opcode_T; /* - Define the User Mode DAC960_IOCTL_EXECUTE_COMMAND request structure. + Define the DAC960 V2 Firmware Command Identifier type. */ -typedef struct DAC960_UserCommand -{ - unsigned char ControllerNumber; - DAC960_CommandMailbox_T CommandMailbox; - int DataTransferLength; - void *DataTransferBuffer; - DAC960_DCDB_T *DCDB; -} -DAC960_UserCommand_T; +typedef unsigned short DAC960_V2_CommandIdentifier_T; /* - Define the Kernel Mode DAC960_IOCTL_EXECUTE_COMMAND request structure. + Define the DAC960 V2 Firmware Command Status Codes. */ -typedef struct DAC960_KernelCommand -{ - unsigned char ControllerNumber; - DAC960_CommandMailbox_T CommandMailbox; - int DataTransferLength; - void *DataTransferBuffer; - DAC960_DCDB_T *DCDB; - DAC960_CommandStatus_T CommandStatus; - void (*CompletionFunction)(struct DAC960_KernelCommand *); - void *CompletionData; -} -DAC960_KernelCommand_T; +#define DAC960_V2_NormalCompletion 0x00 +#define DAC960_V2_AbormalCompletion 0x02 +#define DAC960_V2_DeviceNonresponsive 0x0E +typedef unsigned char DAC960_V2_CommandStatus_T; + /* - Import the Kernel Mode IOCTL interface. + Define the DAC960 V2 Firmware Memory Type structure. */ -extern int DAC960_KernelIOCTL(unsigned int Request, void *Argument); +typedef struct DAC960_V2_MemoryType +{ + enum { + DAC960_V2_MemoryType_Reserved = 0x00, + DAC960_V2_MemoryType_DRAM = 0x01, + DAC960_V2_MemoryType_EDRAM = 0x02, + DAC960_V2_MemoryType_EDO = 0x03, + DAC960_V2_MemoryType_SDRAM = 0x04 + } __attribute__ ((packed)) MemoryType:5; /* Byte 0 Bits 0-4 */ + boolean :1; /* Byte 0 Bit 5 */ + boolean MemoryParity:1; /* Byte 0 Bit 6 */ + boolean MemoryECC:1; /* Byte 0 Bit 7 */ +} +DAC960_V2_MemoryType_T; /* - Virtual_to_Bus maps from Kernel Virtual Addresses to PCI Bus Addresses. + Define the DAC960 V2 Firmware Processor Type structure. */ -static inline DAC960_BusAddress_T Virtual_to_Bus(void *VirtualAddress) +typedef enum { - return (DAC960_BusAddress_T) virt_to_bus(VirtualAddress); + DAC960_V2_ProcessorType_i960CA = 0x01, + DAC960_V2_ProcessorType_i960RD = 0x02, + DAC960_V2_ProcessorType_i960RN = 0x03, + DAC960_V2_ProcessorType_i960RP = 0x04, + DAC960_V2_ProcessorType_NorthBay = 0x05, + DAC960_V2_ProcessorType_StrongArm = 0x06, + DAC960_V2_ProcessorType_i960RM = 0x07 } +__attribute__ ((packed)) +DAC960_V2_ProcessorType_T; /* - Bus_to_Virtual maps from PCI Bus Addresses to Kernel Virtual Addresses. + Define the DAC960 V2 Firmware Get Controller Info reply structure. */ -static inline void *Bus_to_Virtual(DAC960_BusAddress_T BusAddress) +typedef struct DAC960_V2_ControllerInfo { - return (void *) bus_to_virt(BusAddress); + unsigned char :8; /* Byte 0 */ + enum { + DAC960_V2_SCSI_Bus = 0x00, + DAC960_V2_Fibre_Bus = 0x01, + DAC960_V2_PCI_Bus = 0x03 + } __attribute__ ((packed)) BusInterfaceType; /* Byte 1 */ + enum { + DAC960_V2_DAC960E = 0x01, + DAC960_V2_DAC960M = 0x08, + DAC960_V2_DAC960PD = 0x10, + DAC960_V2_DAC960PL = 0x11, + DAC960_V2_DAC960PU = 0x12, + DAC960_V2_DAC960PE = 0x13, + DAC960_V2_DAC960PG = 0x14, + DAC960_V2_DAC960PJ = 0x15, + DAC960_V2_DAC960PTL0 = 0x16, + DAC960_V2_DAC960PR = 0x17, + DAC960_V2_DAC960PRL = 0x18, + DAC960_V2_DAC960PT = 0x19, + DAC960_V2_DAC1164P = 0x1A, + DAC960_V2_DAC960PTL1 = 0x1B, + DAC960_V2_EXR2000P = 0x1C, + DAC960_V2_EXR3000P = 0x1D, + DAC960_V2_AcceleRAID352 = 0x1E, + DAC960_V2_AcceleRAID351 = 0x1F, + DAC960_V2_DAC960S = 0x60, + DAC960_V2_DAC960SU = 0x61, + DAC960_V2_DAC960SX = 0x62, + DAC960_V2_DAC960SF = 0x63, + DAC960_V2_DAC960SS = 0x64, + DAC960_V2_DAC960FL = 0x65, + DAC960_V2_DAC960LL = 0x66, + DAC960_V2_DAC960FF = 0x67, + DAC960_V2_DAC960HP = 0x68, + DAC960_V2_RAIDBRICK = 0x69, + DAC960_V2_METEOR_FL = 0x6A, + DAC960_V2_METEOR_FF = 0x6B + } __attribute__ ((packed)) ControllerType; /* Byte 2 */ + unsigned char :8; /* Byte 3 */ + unsigned short BusInterfaceSpeedMHz; /* Bytes 4-5 */ + unsigned char BusWidthBits; /* Byte 6 */ + unsigned char Reserved1[9]; /* Bytes 7-15 */ + unsigned char BusInterfaceName[16]; /* Bytes 16-31 */ + unsigned char ControllerName[16]; /* Bytes 32-47 */ + unsigned char Reserved2[16]; /* Bytes 48-63 */ + /* Firmware Release Information */ + unsigned char FirmwareMajorVersion; /* Byte 64 */ + unsigned char FirmwareMinorVersion; /* Byte 65 */ + unsigned char FirmwareTurnNumber; /* Byte 66 */ + unsigned char FirmwareBuildNumber; /* Byte 67 */ + unsigned char FirmwareReleaseDay; /* Byte 68 */ + unsigned char FirmwareReleaseMonth; /* Byte 69 */ + unsigned char FirmwareReleaseYearHigh2Digits; /* Byte 70 */ + unsigned char FirmwareReleaseYearLow2Digits; /* Byte 71 */ + /* Hardware Release Information */ + unsigned char HardwareRevision; /* Byte 72 */ + unsigned int :24; /* Bytes 73-75 */ + unsigned char HardwareReleaseDay; /* Byte 76 */ + unsigned char HardwareReleaseMonth; /* Byte 77 */ + unsigned char HardwareReleaseYearHigh2Digits; /* Byte 78 */ + unsigned char HardwareReleaseYearLow2Digits; /* Byte 79 */ + /* Hardware Manufacturing Information */ + unsigned char ManufacturingBatchNumber; /* Byte 80 */ + unsigned char :8; /* Byte 81 */ + unsigned char ManufacturingPlantNumber; /* Byte 82 */ + unsigned char :8; /* Byte 83 */ + unsigned char HardwareManufacturingDay; /* Byte 84 */ + unsigned char HardwareManufacturingMonth; /* Byte 85 */ + unsigned char HardwareManufacturingYearHigh2Digits; /* Byte 86 */ + unsigned char HardwareManufacturingYearLow2Digits; /* Byte 87 */ + unsigned char MaximumNumberOfPDDperXLDD; /* Byte 88 */ + unsigned char MaximumNumberOfILDDperXLDD; /* Byte 89 */ + unsigned short NonvolatileMemorySizeKB; /* Bytes 90-91 */ + unsigned char MaximumNumberOfXLDD; /* Byte 92 */ + unsigned int :24; /* Bytes 93-95 */ + /* Unique Information per Controller */ + unsigned char ControllerSerialNumber[16]; /* Bytes 96-111 */ + unsigned char Reserved3[16]; /* Bytes 112-127 */ + /* Vendor Information */ + unsigned int :24; /* Bytes 128-130 */ + unsigned char OEM_Information; /* Byte 131 */ + unsigned char VendorName[16]; /* Bytes 132-147 */ + /* Other Physical/Controller/Operation Information */ + boolean BBU_Present:1; /* Byte 148 Bit 0 */ + boolean ActiveActiveClusteringMode:1; /* Byte 148 Bit 1 */ + unsigned char :6; /* Byte 148 Bits 2-7 */ + unsigned char :8; /* Byte 149 */ + unsigned short :16; /* Bytes 150-151 */ + /* Physical Device Scan Information */ + boolean PhysicalScanActive:1; /* Byte 152 Bit 0 */ + unsigned char :7; /* Byte 152 Bits 1-7 */ + unsigned char PhysicalDeviceChannelNumber; /* Byte 153 */ + unsigned char PhysicalDeviceTargetID; /* Byte 154 */ + unsigned char PhysicalDeviceLogicalUnit; /* Byte 155 */ + /* Maximum Command Data Transfer Sizes */ + unsigned short MaximumDataTransferSizeInBlocks; /* Bytes 156-157 */ + unsigned short MaximumScatterGatherEntries; /* Bytes 158-159 */ + /* Logical/Physical Device Counts */ + unsigned short LogicalDevicesPresent; /* Bytes 160-161 */ + unsigned short LogicalDevicesCritical; /* Bytes 162-163 */ + unsigned short LogicalDevicesOffline; /* Bytes 164-165 */ + unsigned short PhysicalDevicesPresent; /* Bytes 166-167 */ + unsigned short PhysicalDisksPresent; /* Bytes 168-169 */ + unsigned short PhysicalDisksCritical; /* Bytes 170-171 */ + unsigned short PhysicalDisksOffline; /* Bytes 172-173 */ + unsigned short MaximumParallelCommands; /* Bytes 174-175 */ + /* Channel and Target ID Information */ + unsigned char NumberOfPhysicalChannelsPresent; /* Byte 176 */ + unsigned char NumberOfVirtualChannelsPresent; /* Byte 177 */ + unsigned char NumberOfPhysicalChannelsPossible; /* Byte 178 */ + unsigned char NumberOfVirtualChannelsPossible; /* Byte 179 */ + unsigned char MaximumTargetsPerChannel[16]; /* Bytes 180-195 */ + unsigned char Reserved4[12]; /* Bytes 196-207 */ + /* Memory/Cache Information */ + unsigned short MemorySizeMB; /* Bytes 208-209 */ + unsigned short CacheSizeMB; /* Bytes 210-211 */ + unsigned int ValidCacheSizeInBytes; /* Bytes 212-215 */ + unsigned int DirtyCacheSizeInBytes; /* Bytes 216-219 */ + unsigned short MemorySpeedMHz; /* Bytes 220-221 */ + unsigned char MemoryDataWidthBits; /* Byte 222 */ + DAC960_V2_MemoryType_T MemoryType; /* Byte 223 */ + unsigned char CacheMemoryTypeName[16]; /* Bytes 224-239 */ + /* Execution Memory Information */ + unsigned short ExecutionMemorySizeMB; /* Bytes 240-241 */ + unsigned short ExecutionL2CacheSizeMB; /* Bytes 242-243 */ + unsigned char Reserved5[8]; /* Bytes 244-251 */ + unsigned short ExecutionMemorySpeedMHz; /* Bytes 252-253 */ + unsigned char ExecutionMemoryDataWidthBits; /* Byte 254 */ + DAC960_V2_MemoryType_T ExecutionMemoryType; /* Byte 255 */ + unsigned char ExecutionMemoryTypeName[16]; /* Bytes 256-271 */ + /* First CPU Type Information */ + unsigned short FirstProcessorSpeedMHz; /* Bytes 272-273 */ + DAC960_V2_ProcessorType_T FirstProcessorType; /* Byte 274 */ + unsigned char FirstProcessorCount; /* Byte 275 */ + unsigned char Reserved6[12]; /* Bytes 276-287 */ + unsigned char FirstProcessorName[16]; /* Bytes 288-303 */ + /* Second CPU Type Information */ + unsigned short SecondProcessorSpeedMHz; /* Bytes 304-305 */ + DAC960_V2_ProcessorType_T SecondProcessorType; /* Byte 306 */ + unsigned char SecondProcessorCount; /* Byte 307 */ + unsigned char Reserved7[12]; /* Bytes 308-319 */ + unsigned char SecondProcessorName[16]; /* Bytes 320-335 */ + /* Debugging/Profiling/Command Time Tracing Information */ + unsigned short CurrentProfilingDataPageNumber; /* Bytes 336-337 */ + unsigned short ProgramsAwaitingProfilingData; /* Bytes 338-339 */ + unsigned short CurrentCommandTimeTraceDataPageNumber; /* Bytes 340-341 */ + unsigned short ProgramsAwaitingCommandTimeTraceData; /* Bytes 342-343 */ + unsigned char Reserved8[8]; /* Bytes 344-351 */ + /* Error Counters on Physical Devices */ + unsigned short PhysicalDeviceBusResets; /* Bytes 352-353 */ + unsigned short PhysicalDeviceParityErrors; /* Bytes 355-355 */ + unsigned short PhysicalDeviceSoftErrors; /* Bytes 356-357 */ + unsigned short PhysicalDeviceCommandsFailed; /* Bytes 358-359 */ + unsigned short PhysicalDeviceMiscellaneousErrors; /* Bytes 360-361 */ + unsigned short PhysicalDeviceCommandTimeouts; /* Bytes 362-363 */ + unsigned short PhysicalDeviceSelectionTimeouts; /* Bytes 364-365 */ + unsigned short PhysicalDeviceRetriesDone; /* Bytes 366-367 */ + unsigned short PhysicalDeviceAbortsDone; /* Bytes 368-369 */ + unsigned short PhysicalDeviceHostCommandAbortsDone; /* Bytes 370-371 */ + unsigned short PhysicalDevicePredictedFailuresDetected; /* Bytes 372-373 */ + unsigned short PhysicalDeviceHostCommandsFailed; /* Bytes 374-375 */ + unsigned char Reserved9[8]; /* Bytes 376-383 */ + /* Error Counters on Logical Devices */ + unsigned short LogicalDeviceSoftErrors; /* Bytes 384-385 */ + unsigned short LogicalDeviceCommandsFailed; /* Bytes 386-387 */ + unsigned short LogicalDeviceHostCommandAbortsDone; /* Bytes 388-389 */ + unsigned short :16; /* Bytes 390-391 */ + unsigned short ControllerMemoryErrors; /* Bytes 392-393 */ + unsigned short ControllerHostCommandAbortsDone; /* Bytes 394-395 */ + unsigned int :32; /* Bytes 396-399 */ + /* Long Duration Activity Information */ + unsigned short BackgroundInitializationsActive; /* Bytes 400-401 */ + unsigned short LogicalDeviceInitializationsActive; /* Bytes 402-403 */ + unsigned short PhysicalDeviceInitializationsActive; /* Bytes 404-405 */ + unsigned short ConsistencyChecksActive; /* Bytes 406-407 */ + unsigned short RebuildsActive; /* Bytes 408-409 */ + unsigned short OnlineExpansionsActive; /* Bytes 410-411 */ + unsigned short PatrolActivitiesActive; /* Bytes 412-413 */ + unsigned char LongOperationStatus; /* Byte 414 */ + unsigned char :8; /* Byte 415 */ + /* Flash ROM Information */ + unsigned char FlashType; /* Byte 416 */ + unsigned char :8; /* Byte 417 */ + unsigned short FlashSizeMB; /* Bytes 418-419 */ + unsigned int FlashLimit; /* Bytes 420-423 */ + unsigned int FlashCount; /* Bytes 424-427 */ + unsigned int :32; /* Bytes 428-431 */ + unsigned char FlashTypeName[16]; /* Bytes 432-447 */ + /* Firmware Run Time Information */ + unsigned char RebuildRate; /* Byte 448 */ + unsigned char BackgroundInitializationRate; /* Byte 449 */ + unsigned char ForegroundInitializationRate; /* Byte 450 */ + unsigned char ConsistencyCheckRate; /* Byte 451 */ + unsigned int :32; /* Bytes 452-455 */ + unsigned int MaximumDP; /* Bytes 456-459 */ + unsigned int FreeDP; /* Bytes 460-463 */ + unsigned int MaximumIOP; /* Bytes 464-467 */ + unsigned int FreeIOP; /* Bytes 468-471 */ + unsigned short MaximumCombLengthInBlocks; /* Bytes 472-473 */ + unsigned short NumberOfConfigurationGroups; /* Bytes 474-475 */ + boolean InstallationAbortStatus:1; /* Byte 476 Bit 0 */ + boolean MaintenanceModeStatus:1; /* Byte 476 Bit 1 */ + unsigned int :6; /* Byte 476 Bits 2-7 */ + unsigned int :24; /* Bytes 477-479 */ + unsigned char Reserved10[32]; /* Bytes 480-511 */ + unsigned char Reserved11[512]; /* Bytes 512-1023 */ } +DAC960_V2_ControllerInfo_T; /* - DAC960_DriverVersion protects the private portion of this file. + Define the DAC960 V2 Firmware Logical Device State type. */ -#ifdef DAC960_DriverVersion +typedef enum +{ + DAC960_V2_LogicalDevice_Online = 0x01, + DAC960_V2_LogicalDevice_Offline = 0x08, + DAC960_V2_LogicalDevice_Critical = 0x09 +} +__attribute__ ((packed)) +DAC960_V2_LogicalDeviceState_T; /* - Define the maximum Driver Queue Depth and Controller Queue Depth supported - by any DAC960 model. + Define the DAC960 V2 Firmware Get Logical Device Info reply structure. */ -#define DAC960_MaxDriverQueueDepth 127 -#define DAC960_MaxControllerQueueDepth 128 +typedef struct DAC960_V2_LogicalDeviceInfo +{ + unsigned char :8; /* Byte 0 */ + unsigned char Channel; /* Byte 1 */ + unsigned char TargetID; /* Byte 2 */ + unsigned char LogicalUnit; /* Byte 3 */ + DAC960_V2_LogicalDeviceState_T LogicalDeviceState; /* Byte 4 */ + unsigned char RAIDLevel; /* Byte 5 */ + unsigned char StripeSize; /* Byte 6 */ + unsigned char CacheLineSize; /* Byte 7 */ + struct { + enum { + DAC960_V2_ReadCacheDisabled = 0x0, + DAC960_V2_ReadCacheEnabled = 0x1, + DAC960_V2_ReadAheadEnabled = 0x2, + DAC960_V2_IntelligentReadAheadEnabled = 0x3 + } __attribute__ ((packed)) ReadCache:3; /* Byte 8 Bits 0-2 */ + enum { + DAC960_V2_WriteCacheDisabled = 0x0, + DAC960_V2_LogicalDeviceReadOnly = 0x1, + DAC960_V2_WriteCacheEnabled = 0x2, + DAC960_V2_IntelligentWriteCacheEnabled = 0x3 + } __attribute__ ((packed)) WriteCache:3; /* Byte 8 Bits 3-5 */ + boolean :1; /* Byte 8 Bit 6 */ + boolean LogicalDeviceInitialized:1; /* Byte 8 Bit 7 */ + } LogicalDeviceControl; /* Byte 8 */ + /* Logical Device Operations Status */ + boolean ConsistencyCheckInProgress:1; /* Byte 9 Bit 0 */ + boolean RebuildInProgress:1; /* Byte 9 Bit 1 */ + boolean BackgroundInitializationInProgress:1; /* Byte 9 Bit 2 */ + boolean ForegroundInitializationInProgress:1; /* Byte 9 Bit 3 */ + boolean DataMigrationInProgress:1; /* Byte 9 Bit 4 */ + boolean PatrolOperationInProgress:1; /* Byte 9 Bit 5 */ + unsigned char :2; /* Byte 9 Bits 6-7 */ + unsigned char RAID5WriteUpdate; /* Byte 10 */ + unsigned char RAID5Algorithm; /* Byte 11 */ + unsigned short LogicalDeviceNumber; /* Bytes 12-13 */ + /* BIOS Info */ + boolean BIOSDisabled:1; /* Byte 14 Bit 0 */ + boolean CDROMBootEnabled:1; /* Byte 14 Bit 1 */ + boolean DriveCoercionEnabled:1; /* Byte 14 Bit 2 */ + boolean WriteSameDisabled:1; /* Byte 14 Bit 3 */ + boolean HBA_ModeEnabled:1; /* Byte 14 Bit 4 */ + enum { + DAC960_V2_Geometry_128_32 = 0x0, + DAC960_V2_Geometry_255_63 = 0x1, + DAC960_V2_Geometry_Reserved1 = 0x2, + DAC960_V2_Geometry_Reserved2 = 0x3 + } __attribute__ ((packed)) DriveGeometry:2; /* Byte 14 Bits 5-6 */ + unsigned char :1; /* Byte 14 Bit 7 */ + unsigned char :8; /* Byte 15 */ + /* Error Counters */ + unsigned short SoftErrors; /* Bytes 16-17 */ + unsigned short CommandsFailed; /* Bytes 18-19 */ + unsigned short HostCommandAbortsDone; /* Bytes 20-21 */ + unsigned short DeferredWriteErrors; /* Bytes 22-23 */ + unsigned int :32; /* Bytes 24-27 */ + unsigned int :32; /* Bytes 28-31 */ + /* Device Size Information */ + unsigned short :16; /* Bytes 32-33 */ + unsigned short DeviceBlockSizeInBytes; /* Bytes 34-35 */ + unsigned int OriginalDeviceSizeIn512ByteBlocksOrMB; /* Bytes 36-39 */ + unsigned int ConfigurableDeviceSizeIn512ByteBlocksOrMB; /* Bytes 40-43 */ + unsigned int :32; /* Bytes 44-47 */ + unsigned char LogicalDeviceName[32]; /* Bytes 48-79 */ + unsigned char SCSI_InquiryData[36]; /* Bytes 80-115 */ + unsigned char Reserved1[12]; /* Bytes 116-127 */ + DAC960_ByteCount64_T LastReadBlockNumber; /* Bytes 128-135 */ + DAC960_ByteCount64_T LastWrittenBlockNumber; /* Bytes 136-143 */ + DAC960_ByteCount64_T ConsistencyCheckBlockNumber; /* Bytes 144-151 */ + DAC960_ByteCount64_T RebuildBlockNumber; /* Bytes 152-159 */ + DAC960_ByteCount64_T BackgroundInitializationBlockNumber; /* Bytes 160-167 */ + DAC960_ByteCount64_T ForegroundInitializationBlockNumber; /* Bytes 168-175 */ + DAC960_ByteCount64_T DataMigrationBlockNumber; /* Bytes 176-183 */ + DAC960_ByteCount64_T PatrolOperationBlockNumber; /* Bytes 184-191 */ + unsigned char Reserved2[64]; /* Bytes 192-255 */ +} +DAC960_V2_LogicalDeviceInfo_T; /* - Define the maximum number of Scatter/Gather Segments supported by any - DAC960 model. + Define the DAC960 V2 Firmware Physical Device State type. */ -#define DAC960_MaxScatterGatherSegments 33 +typedef enum +{ + DAC960_V2_Device_Unconfigured = 0x00, + DAC960_V2_Device_Online = 0x01, + DAC960_V2_Device_WriteOnly = 0x03, + DAC960_V2_Device_Dead = 0x08, + DAC960_V2_Device_Standby = 0x21, + DAC960_V2_Device_InvalidState = 0xFF +} +__attribute__ ((packed)) +DAC960_V2_PhysicalDeviceState_T; /* - Define the number of Command Mailboxes and Status Mailboxes used by the - Memory Mailbox Interface. + Define the DAC960 V2 Firmware Get Physical Device Info reply structure. */ -#define DAC960_CommandMailboxCount 256 -#define DAC960_StatusMailboxCount 1024 +typedef struct DAC960_V2_PhysicalDeviceInfo +{ + unsigned char :8; /* Byte 0 */ + unsigned char Channel; /* Byte 1 */ + unsigned char TargetID; /* Byte 2 */ + unsigned char LogicalUnit; /* Byte 3 */ + /* Configuration Status Bits */ + boolean PhysicalDeviceFaultTolerant:1; /* Byte 4 Bit 0 */ + boolean :1; /* Byte 4 Bit 1 */ + boolean PhysicalDeviceLocalToController:1; /* Byte 4 Bit 2 */ + unsigned char :5; /* Byte 4 Bits 3-7 */ + /* Multiple Host/Controller Status Bits */ + boolean RemoteHostSystemDead:1; /* Byte 5 Bit 0 */ + boolean RemoteControllerDead:1; /* Byte 5 Bit 1 */ + unsigned char :6; /* Byte 5 Bits 2-7 */ + DAC960_V2_PhysicalDeviceState_T PhysicalDeviceState; /* Byte 6 */ + unsigned char NegotiatedDataWidthBits; /* Byte 7 */ + unsigned short NegotiatedSynchronousMegaTransfers; /* Bytes 8-9 */ + /* Multiported Physical Device Information */ + unsigned char NumberOfPortConnections; /* Byte 10 */ + unsigned char DriveAccessibilityBitmap; /* Byte 11 */ + unsigned int :32; /* Bytes 12-15 */ + unsigned char NetworkAddress[16]; /* Bytes 16-31 */ + unsigned short MaximumTags; /* Bytes 32-33 */ + /* Physical Device Operations Status */ + boolean ConsistencyCheckInProgress:1; /* Byte 34 Bit 0 */ + boolean RebuildInProgress:1; /* Byte 34 Bit 1 */ + boolean MakingDataConsistentInProgress:1; /* Byte 34 Bit 2 */ + boolean PhysicalDeviceInitializationInProgress:1; /* Byte 34 Bit 3 */ + boolean DataMigrationInProgress:1; /* Byte 34 Bit 4 */ + boolean PatrolOperationInProgress:1; /* Byte 34 Bit 5 */ + unsigned char :2; /* Byte 34 Bits 6-7 */ + unsigned char LongOperationStatus; /* Byte 35 */ + unsigned char ParityErrors; /* Byte 36 */ + unsigned char SoftErrors; /* Byte 37 */ + unsigned char HardErrors; /* Byte 38 */ + unsigned char MiscellaneousErrors; /* Byte 39 */ + unsigned char CommandTimeouts; /* Byte 40 */ + unsigned char Retries; /* Byte 41 */ + unsigned char Aborts; /* Byte 42 */ + unsigned char PredictedFailuresDetected; /* Byte 43 */ + unsigned int :32; /* Bytes 44-47 */ + unsigned short :16; /* Bytes 48-49 */ + unsigned short DeviceBlockSizeInBytes; /* Bytes 50-51 */ + unsigned int OriginalDeviceSizeIn512ByteBlocksOrMB; /* Bytes 52-55 */ + unsigned int ConfigurableDeviceSizeIn512ByteBlocksOrMB; /* Bytes 56-59 */ + unsigned int :32; /* Bytes 60-63 */ + unsigned char PhysicalDeviceName[16]; /* Bytes 64-79 */ + unsigned char Reserved1[16]; /* Bytes 80-95 */ + unsigned char Reserved2[32]; /* Bytes 96-127 */ + unsigned char SCSI_InquiryData[36]; /* Bytes 128-163 */ + unsigned char Reserved3[12]; /* Bytes 164-175 */ + unsigned char Reserved4[16]; /* Bytes 176-191 */ + DAC960_ByteCount64_T LastReadBlockNumber; /* Bytes 192-199 */ + DAC960_ByteCount64_T LastWrittenBlockNumber; /* Bytes 200-207 */ + DAC960_ByteCount64_T ConsistencyCheckBlockNumber; /* Bytes 208-215 */ + DAC960_ByteCount64_T RebuildBlockNumber; /* Bytes 216-223 */ + DAC960_ByteCount64_T MakingDataConsistentBlockNumber; /* Bytes 224-231 */ + DAC960_ByteCount64_T DeviceInitializationBlockNumber; /* Bytes 232-239 */ + DAC960_ByteCount64_T DataMigrationBlockNumber; /* Bytes 240-247 */ + DAC960_ByteCount64_T PatrolOperationBlockNumber; /* Bytes 248-255 */ + unsigned char Reserved5[256]; /* Bytes 256-511 */ +} +DAC960_V2_PhysicalDeviceInfo_T; + + +/* + Define the DAC960 V2 Firmware Health Status Buffer structure. +*/ + +typedef struct DAC960_V2_HealthStatusBuffer +{ + unsigned int MicrosecondsFromControllerStartTime; /* Bytes 0-3 */ + unsigned int MillisecondsFromControllerStartTime; /* Bytes 4-7 */ + unsigned int SecondsFrom1January1970; /* Bytes 8-11 */ + unsigned int :32; /* Bytes 12-15 */ + unsigned int StatusChangeCounter; /* Bytes 16-19 */ + unsigned int :32; /* Bytes 20-23 */ + unsigned int DebugOutputMessageBufferIndex; /* Bytes 24-27 */ + unsigned int CodedMessageBufferIndex; /* Bytes 28-31 */ + unsigned int CurrentTimeTracePageNumber; /* Bytes 32-35 */ + unsigned int CurrentProfilerPageNumber; /* Bytes 36-39 */ + unsigned int NextEventSequenceNumber; /* Bytes 40-43 */ + unsigned int :32; /* Bytes 44-47 */ + unsigned char Reserved1[16]; /* Bytes 48-63 */ + unsigned char Reserved2[64]; /* Bytes 64-127 */ +} +DAC960_V2_HealthStatusBuffer_T; /* - Define the DAC960 Controller Monitoring Timer Interval. + Define the DAC960 V2 Firmware Get Event reply structure. */ -#define DAC960_MonitoringTimerInterval (10 * HZ) +typedef struct DAC960_V2_Event +{ + unsigned int EventSequenceNumber; /* Bytes 0-3 */ + unsigned int EventTime; /* Bytes 4-7 */ + unsigned int EventCode; /* Bytes 8-11 */ + unsigned char :8; /* Byte 12 */ + unsigned char Channel; /* Byte 13 */ + unsigned char TargetID; /* Byte 14 */ + unsigned char LogicalUnit; /* Byte 15 */ + unsigned int :32; /* Bytes 16-19 */ + unsigned int EventSpecificParameter; /* Bytes 20-23 */ + unsigned char RequestSenseData[40]; /* Bytes 24-63 */ +} +DAC960_V2_Event_T; /* - Define the DAC960 Controller Secondary Monitoring Interval. + Define the DAC960 V2 Firmware Command Control Bits structure. */ -#define DAC960_SecondaryMonitoringInterval (60 * HZ) +typedef struct DAC960_V2_CommandControlBits +{ + boolean ForceUnitAccess:1; /* Byte 0 Bit 0 */ + boolean DisablePageOut:1; /* Byte 0 Bit 1 */ + boolean :1; /* Byte 0 Bit 2 */ + boolean AdditionalScatterGatherListMemory:1; /* Byte 0 Bit 3 */ + boolean DataTransferControllerToHost:1; /* Byte 0 Bit 4 */ + boolean :1; /* Byte 0 Bit 5 */ + boolean NoAutoRequestSense:1; /* Byte 0 Bit 6 */ + boolean DisconnectProhibited:1; /* Byte 0 Bit 7 */ +} +DAC960_V2_CommandControlBits_T; /* - Define the DAC960 Controller Progress Reporting Interval. + Define the DAC960 V2 Firmware Command Timeout structure. */ -#define DAC960_ProgressReportingInterval (60 * HZ) +typedef struct DAC960_V2_CommandTimeout +{ + unsigned char TimeoutValue:6; /* Byte 0 Bits 0-5 */ + enum { + DAC960_V2_TimeoutScale_Seconds = 0, + DAC960_V2_TimeoutScale_Minutes = 1, + DAC960_V2_TimeoutScale_Hours = 2, + DAC960_V2_TimeoutScale_Reserved = 3 + } __attribute__ ((packed)) TimeoutScale:2; /* Byte 0 Bits 6-7 */ +} +DAC960_V2_CommandTimeout_T; /* - Define the maximum number of Partitions allowed for each Logical Drive. + Define the DAC960 V2 Firmware Physical Device structure. */ -#define DAC960_MaxPartitions 8 -#define DAC960_MaxPartitionsBits 3 +typedef struct DAC960_V2_PhysicalDevice +{ + unsigned char LogicalUnit; /* Byte 0 */ + unsigned char TargetID; /* Byte 1 */ + unsigned char Channel:3; /* Byte 2 Bits 0-2 */ + unsigned char Controller:5; /* Byte 2 Bits 3-7 */ +} +__attribute__ ((packed)) +DAC960_V2_PhysicalDevice_T; /* - Define macros to extract the Controller Number, Logical Drive Number, and - Partition Number from a Kernel Device, and to construct a Major Number, Minor - Number, and Kernel Device from the Controller Number, Logical Drive Number, - and Partition Number. There is one Major Number assigned to each Controller. - The associated Minor Number is divided into the Logical Drive Number and - Partition Number. + Define the DAC960 V2 Firmware Logical Device structure. */ -#define DAC960_ControllerNumber(Device) \ - (MAJOR(Device) - DAC960_MAJOR) +typedef struct DAC960_V2_LogicalDevice +{ + unsigned short LogicalDeviceNumber; /* Bytes 0-1 */ + unsigned char :3; /* Byte 2 Bits 0-2 */ + unsigned char Controller:5; /* Byte 2 Bits 3-7 */ +} +__attribute__ ((packed)) +DAC960_V2_LogicalDevice_T; -#define DAC960_LogicalDriveNumber(Device) \ - (MINOR(Device) >> DAC960_MaxPartitionsBits) -#define DAC960_PartitionNumber(Device) \ - (MINOR(Device) & (DAC960_MaxPartitions - 1)) +/* + Define the DAC960 V2 Firmware Operation Device type. +*/ -#define DAC960_MajorNumber(ControllerNumber) \ - (DAC960_MAJOR + (ControllerNumber)) +typedef enum +{ + DAC960_V2_Physical_Device = 0x00, + DAC960_V2_RAID_Device = 0x01, + DAC960_V2_Physical_Channel = 0x02, + DAC960_V2_RAID_Channel = 0x03, + DAC960_V2_Physical_Controller = 0x04, + DAC960_V2_RAID_Controller = 0x05, + DAC960_V2_Configuration_Group = 0x10 +} +__attribute__ ((packed)) +DAC960_V2_OperationDevice_T; -#define DAC960_MinorNumber(LogicalDriveNumber, PartitionNumber) \ - (((LogicalDriveNumber) << DAC960_MaxPartitionsBits) | (PartitionNumber)) -#define DAC960_MinorCount (DAC960_MaxLogicalDrives \ - * DAC960_MaxPartitions) +/* + Define the DAC960 V2 Firmware Translate Physical To Logical Device structure. +*/ -#define DAC960_KernelDevice(ControllerNumber, \ - LogicalDriveNumber, \ - PartitionNumber) \ - MKDEV(DAC960_MajorNumber(ControllerNumber), \ - DAC960_MinorNumber(LogicalDriveNumber, PartitionNumber)) +typedef struct DAC960_V2_PhysicalToLogicalDevice +{ + unsigned short LogicalDeviceNumber; /* Bytes 0-1 */ + unsigned short :16; /* Bytes 2-3 */ + unsigned char PreviousBootController; /* Byte 4 */ + unsigned char PreviousBootChannel; /* Byte 5 */ + unsigned char PreviousBootTargetID; /* Byte 6 */ + unsigned char PreviousBootLogicalUnit; /* Byte 7 */ +} +DAC960_V2_PhysicalToLogicalDevice_T; + /* - Define the DAC960 Controller fixed Block Size and Block Size Bits. + Define the DAC960 V2 Firmware Scatter/Gather List Entry structure. */ -#define DAC960_BlockSize 512 +typedef struct DAC960_V2_ScatterGatherSegment +{ + DAC960_BusAddress64_T SegmentDataPointer; /* Bytes 0-7 */ + DAC960_ByteCount64_T SegmentByteCount; /* Bytes 8-15 */ +} +DAC960_V2_ScatterGatherSegment_T; + + +/* + Define the DAC960 V2 Firmware Data Transfer Memory Address structure. +*/ + +typedef union DAC960_V2_DataTransferMemoryAddress +{ + DAC960_V2_ScatterGatherSegment_T ScatterGatherSegments[2]; /* Bytes 0-31 */ + struct { + unsigned short ScatterGatherList0Length; /* Bytes 0-1 */ + unsigned short ScatterGatherList1Length; /* Bytes 2-3 */ + unsigned short ScatterGatherList2Length; /* Bytes 4-5 */ + unsigned short :16; /* Bytes 6-7 */ + DAC960_BusAddress64_T ScatterGatherList0Address; /* Bytes 8-15 */ + DAC960_BusAddress64_T ScatterGatherList1Address; /* Bytes 16-23 */ + DAC960_BusAddress64_T ScatterGatherList2Address; /* Bytes 24-31 */ + } ExtendedScatterGather; +} +DAC960_V2_DataTransferMemoryAddress_T; + + +/* + Define the 64 Byte DAC960 V2 Firmware Command Mailbox structure. +*/ + +typedef union DAC960_V2_CommandMailbox +{ + unsigned int Words[16]; /* Words 0-15 */ + struct { + DAC960_V2_CommandIdentifier_T CommandIdentifier; /* Bytes 0-1 */ + DAC960_V2_CommandOpcode_T CommandOpcode; /* Byte 2 */ + DAC960_V2_CommandControlBits_T CommandControlBits; /* Byte 3 */ + DAC960_ByteCount32_T DataTransferSize:24; /* Bytes 4-6 */ + unsigned char DataTransferPageNumber; /* Byte 7 */ + DAC960_BusAddress64_T RequestSenseBusAddress; /* Bytes 8-15 */ + unsigned int :24; /* Bytes 16-18 */ + DAC960_V2_CommandTimeout_T CommandTimeout; /* Byte 19 */ + unsigned char RequestSenseSize; /* Byte 20 */ + unsigned char IOCTL_Opcode; /* Byte 21 */ + unsigned char Reserved[10]; /* Bytes 22-31 */ + DAC960_V2_DataTransferMemoryAddress_T + DataTransferMemoryAddress; /* Bytes 32-63 */ + } Common; + struct { + DAC960_V2_CommandIdentifier_T CommandIdentifier; /* Bytes 0-1 */ + DAC960_V2_CommandOpcode_T CommandOpcode; /* Byte 2 */ + DAC960_V2_CommandControlBits_T CommandControlBits; /* Byte 3 */ + DAC960_ByteCount32_T DataTransferSize:24; /* Bytes 4-6 */ + unsigned char DataTransferPageNumber; /* Byte 7 */ + DAC960_BusAddress64_T RequestSenseBusAddress; /* Bytes 8-15 */ + DAC960_V2_PhysicalDevice_T PhysicalDevice; /* Bytes 16-18 */ + DAC960_V2_CommandTimeout_T CommandTimeout; /* Byte 19 */ + unsigned char RequestSenseSize; /* Byte 20 */ + unsigned char CDBLength; /* Byte 21 */ + unsigned char SCSI_CDB[10]; /* Bytes 22-31 */ + DAC960_V2_DataTransferMemoryAddress_T + DataTransferMemoryAddress; /* Bytes 32-63 */ + } SCSI_10; + struct { + DAC960_V2_CommandIdentifier_T CommandIdentifier; /* Bytes 0-1 */ + DAC960_V2_CommandOpcode_T CommandOpcode; /* Byte 2 */ + DAC960_V2_CommandControlBits_T CommandControlBits; /* Byte 3 */ + DAC960_ByteCount32_T DataTransferSize:24; /* Bytes 4-6 */ + unsigned char DataTransferPageNumber; /* Byte 7 */ + DAC960_BusAddress64_T RequestSenseBusAddress; /* Bytes 8-15 */ + DAC960_V2_PhysicalDevice_T PhysicalDevice; /* Bytes 16-18 */ + DAC960_V2_CommandTimeout_T CommandTimeout; /* Byte 19 */ + unsigned char RequestSenseSize; /* Byte 20 */ + unsigned char CDBLength; /* Byte 21 */ + unsigned short :16; /* Bytes 22-23 */ + DAC960_BusAddress64_T SCSI_CDB_BusAddress; /* Bytes 24-31 */ + DAC960_V2_DataTransferMemoryAddress_T + DataTransferMemoryAddress; /* Bytes 32-63 */ + } SCSI_255; + struct { + DAC960_V2_CommandIdentifier_T CommandIdentifier; /* Bytes 0-1 */ + DAC960_V2_CommandOpcode_T CommandOpcode; /* Byte 2 */ + DAC960_V2_CommandControlBits_T CommandControlBits; /* Byte 3 */ + DAC960_ByteCount32_T DataTransferSize:24; /* Bytes 4-6 */ + unsigned char DataTransferPageNumber; /* Byte 7 */ + DAC960_BusAddress64_T RequestSenseBusAddress; /* Bytes 8-15 */ + unsigned short :16; /* Bytes 16-17 */ + unsigned char ControllerNumber; /* Byte 18 */ + DAC960_V2_CommandTimeout_T CommandTimeout; /* Byte 19 */ + unsigned char RequestSenseSize; /* Byte 20 */ + unsigned char IOCTL_Opcode; /* Byte 21 */ + unsigned char Reserved[10]; /* Bytes 22-31 */ + DAC960_V2_DataTransferMemoryAddress_T + DataTransferMemoryAddress; /* Bytes 32-63 */ + } ControllerInfo; + struct { + DAC960_V2_CommandIdentifier_T CommandIdentifier; /* Bytes 0-1 */ + DAC960_V2_CommandOpcode_T CommandOpcode; /* Byte 2 */ + DAC960_V2_CommandControlBits_T CommandControlBits; /* Byte 3 */ + DAC960_ByteCount32_T DataTransferSize:24; /* Bytes 4-6 */ + unsigned char DataTransferPageNumber; /* Byte 7 */ + DAC960_BusAddress64_T RequestSenseBusAddress; /* Bytes 8-15 */ + DAC960_V2_LogicalDevice_T LogicalDevice; /* Bytes 16-18 */ + DAC960_V2_CommandTimeout_T CommandTimeout; /* Byte 19 */ + unsigned char RequestSenseSize; /* Byte 20 */ + unsigned char IOCTL_Opcode; /* Byte 21 */ + unsigned char Reserved[10]; /* Bytes 22-31 */ + DAC960_V2_DataTransferMemoryAddress_T + DataTransferMemoryAddress; /* Bytes 32-63 */ + } LogicalDeviceInfo; + struct { + DAC960_V2_CommandIdentifier_T CommandIdentifier; /* Bytes 0-1 */ + DAC960_V2_CommandOpcode_T CommandOpcode; /* Byte 2 */ + DAC960_V2_CommandControlBits_T CommandControlBits; /* Byte 3 */ + DAC960_ByteCount32_T DataTransferSize:24; /* Bytes 4-6 */ + unsigned char DataTransferPageNumber; /* Byte 7 */ + DAC960_BusAddress64_T RequestSenseBusAddress; /* Bytes 8-15 */ + DAC960_V2_PhysicalDevice_T PhysicalDevice; /* Bytes 16-18 */ + DAC960_V2_CommandTimeout_T CommandTimeout; /* Byte 19 */ + unsigned char RequestSenseSize; /* Byte 20 */ + unsigned char IOCTL_Opcode; /* Byte 21 */ + unsigned char Reserved[10]; /* Bytes 22-31 */ + DAC960_V2_DataTransferMemoryAddress_T + DataTransferMemoryAddress; /* Bytes 32-63 */ + } PhysicalDeviceInfo; + struct { + DAC960_V2_CommandIdentifier_T CommandIdentifier; /* Bytes 0-1 */ + DAC960_V2_CommandOpcode_T CommandOpcode; /* Byte 2 */ + DAC960_V2_CommandControlBits_T CommandControlBits; /* Byte 3 */ + DAC960_ByteCount32_T DataTransferSize:24; /* Bytes 4-6 */ + unsigned char DataTransferPageNumber; /* Byte 7 */ + DAC960_BusAddress64_T RequestSenseBusAddress; /* Bytes 8-15 */ + unsigned short EventSequenceNumberHigh16; /* Bytes 16-17 */ + unsigned char ControllerNumber; /* Byte 18 */ + DAC960_V2_CommandTimeout_T CommandTimeout; /* Byte 19 */ + unsigned char RequestSenseSize; /* Byte 20 */ + unsigned char IOCTL_Opcode; /* Byte 21 */ + unsigned short EventSequenceNumberLow16; /* Bytes 22-23 */ + unsigned char Reserved[8]; /* Bytes 24-31 */ + DAC960_V2_DataTransferMemoryAddress_T + DataTransferMemoryAddress; /* Bytes 32-63 */ + } GetEvent; + struct { + DAC960_V2_CommandIdentifier_T CommandIdentifier; /* Bytes 0-1 */ + DAC960_V2_CommandOpcode_T CommandOpcode; /* Byte 2 */ + DAC960_V2_CommandControlBits_T CommandControlBits; /* Byte 3 */ + DAC960_ByteCount32_T DataTransferSize:24; /* Bytes 4-6 */ + unsigned char DataTransferPageNumber; /* Byte 7 */ + DAC960_BusAddress64_T RequestSenseBusAddress; /* Bytes 8-15 */ + DAC960_V2_LogicalDevice_T LogicalDevice; /* Bytes 16-18 */ + DAC960_V2_CommandTimeout_T CommandTimeout; /* Byte 19 */ + unsigned char RequestSenseSize; /* Byte 20 */ + unsigned char IOCTL_Opcode; /* Byte 21 */ + union { + DAC960_V2_LogicalDeviceState_T LogicalDeviceState; + DAC960_V2_PhysicalDeviceState_T PhysicalDeviceState; + } DeviceState; /* Byte 22 */ + unsigned char Reserved[9]; /* Bytes 23-31 */ + DAC960_V2_DataTransferMemoryAddress_T + DataTransferMemoryAddress; /* Bytes 32-63 */ + } SetDeviceState; + struct { + DAC960_V2_CommandIdentifier_T CommandIdentifier; /* Bytes 0-1 */ + DAC960_V2_CommandOpcode_T CommandOpcode; /* Byte 2 */ + DAC960_V2_CommandControlBits_T CommandControlBits; /* Byte 3 */ + DAC960_ByteCount32_T DataTransferSize:24; /* Bytes 4-6 */ + unsigned char DataTransferPageNumber; /* Byte 7 */ + DAC960_BusAddress64_T RequestSenseBusAddress; /* Bytes 8-15 */ + DAC960_V2_LogicalDevice_T LogicalDevice; /* Bytes 16-18 */ + DAC960_V2_CommandTimeout_T CommandTimeout; /* Byte 19 */ + unsigned char RequestSenseSize; /* Byte 20 */ + unsigned char IOCTL_Opcode; /* Byte 21 */ + boolean RestoreConsistency:1; /* Byte 22 Bit 0 */ + boolean InitializedAreaOnly:1; /* Byte 22 Bit 1 */ + unsigned char :6; /* Byte 22 Bits 2-7 */ + unsigned char Reserved[9]; /* Bytes 23-31 */ + DAC960_V2_DataTransferMemoryAddress_T + DataTransferMemoryAddress; /* Bytes 32-63 */ + } ConsistencyCheck; + struct { + DAC960_V2_CommandIdentifier_T CommandIdentifier; /* Bytes 0-1 */ + DAC960_V2_CommandOpcode_T CommandOpcode; /* Byte 2 */ + DAC960_V2_CommandControlBits_T CommandControlBits; /* Byte 3 */ + unsigned char FirstCommandMailboxSizeKB; /* Byte 4 */ + unsigned char FirstStatusMailboxSizeKB; /* Byte 5 */ + unsigned char SecondCommandMailboxSizeKB; /* Byte 6 */ + unsigned char SecondStatusMailboxSizeKB; /* Byte 7 */ + DAC960_BusAddress64_T RequestSenseBusAddress; /* Bytes 8-15 */ + unsigned int :24; /* Bytes 16-18 */ + DAC960_V2_CommandTimeout_T CommandTimeout; /* Byte 19 */ + unsigned char RequestSenseSize; /* Byte 20 */ + unsigned char IOCTL_Opcode; /* Byte 21 */ + unsigned char HealthStatusBufferSizeKB; /* Byte 22 */ + unsigned char :8; /* Byte 23 */ + DAC960_BusAddress64_T HealthStatusBufferBusAddress; /* Bytes 24-31 */ + DAC960_BusAddress64_T FirstCommandMailboxBusAddress; /* Bytes 32-39 */ + DAC960_BusAddress64_T FirstStatusMailboxBusAddress; /* Bytes 40-47 */ + DAC960_BusAddress64_T SecondCommandMailboxBusAddress; /* Bytes 48-55 */ + DAC960_BusAddress64_T SecondStatusMailboxBusAddress; /* Bytes 56-63 */ + } SetMemoryMailbox; + struct { + DAC960_V2_CommandIdentifier_T CommandIdentifier; /* Bytes 0-1 */ + DAC960_V2_CommandOpcode_T CommandOpcode; /* Byte 2 */ + DAC960_V2_CommandControlBits_T CommandControlBits; /* Byte 3 */ + DAC960_ByteCount32_T DataTransferSize:24; /* Bytes 4-6 */ + unsigned char DataTransferPageNumber; /* Byte 7 */ + DAC960_BusAddress64_T RequestSenseBusAddress; /* Bytes 8-15 */ + DAC960_V2_PhysicalDevice_T PhysicalDevice; /* Bytes 16-18 */ + DAC960_V2_CommandTimeout_T CommandTimeout; /* Byte 19 */ + unsigned char RequestSenseSize; /* Byte 20 */ + unsigned char IOCTL_Opcode; /* Byte 21 */ + DAC960_V2_OperationDevice_T OperationDevice; /* Byte 22 */ + unsigned char Reserved[9]; /* Bytes 23-31 */ + DAC960_V2_DataTransferMemoryAddress_T + DataTransferMemoryAddress; /* Bytes 32-63 */ + } DeviceOperation; +} +__attribute__ ((packed)) +DAC960_V2_CommandMailbox_T; + + +/* + Define the DAC960 Driver IOCTL requests. +*/ + +#define DAC960_IOCTL_GET_CONTROLLER_COUNT 0xDAC001 +#define DAC960_IOCTL_GET_CONTROLLER_INFO 0xDAC002 +#define DAC960_IOCTL_V1_EXECUTE_COMMAND 0xDAC003 +#define DAC960_IOCTL_V2_EXECUTE_COMMAND 0xDAC004 +#define DAC960_IOCTL_V2_GET_HEALTH_STATUS 0xDAC005 + + +/* + Define the DAC960_IOCTL_GET_CONTROLLER_INFO reply structure. +*/ + +typedef struct DAC960_ControllerInfo +{ + unsigned char ControllerNumber; + unsigned char FirmwareType; + unsigned char Channels; + unsigned char Targets; + unsigned char PCI_Bus; + unsigned char PCI_Device; + unsigned char PCI_Function; + unsigned char IRQ_Channel; + DAC960_PCI_Address_T PCI_Address; + unsigned char ModelName[20]; + unsigned char FirmwareVersion[12]; +} +DAC960_ControllerInfo_T; + + +/* + Define the User Mode DAC960_IOCTL_V1_EXECUTE_COMMAND request structure. +*/ + +typedef struct DAC960_V1_UserCommand +{ + unsigned char ControllerNumber; + DAC960_V1_CommandMailbox_T CommandMailbox; + int DataTransferLength; + void *DataTransferBuffer; + DAC960_V1_DCDB_T *DCDB; +} +DAC960_V1_UserCommand_T; + + +/* + Define the Kernel Mode DAC960_IOCTL_V1_EXECUTE_COMMAND request structure. +*/ + +typedef struct DAC960_V1_KernelCommand +{ + unsigned char ControllerNumber; + DAC960_V1_CommandMailbox_T CommandMailbox; + int DataTransferLength; + void *DataTransferBuffer; + DAC960_V1_DCDB_T *DCDB; + DAC960_V1_CommandStatus_T CommandStatus; + void (*CompletionFunction)(struct DAC960_V1_KernelCommand *); + void *CompletionData; +} +DAC960_V1_KernelCommand_T; + + +/* + Define the User Mode DAC960_IOCTL_V2_EXECUTE_COMMAND request structure. +*/ + +typedef struct DAC960_V2_UserCommand +{ + unsigned char ControllerNumber; + DAC960_V2_CommandMailbox_T CommandMailbox; + int DataTransferLength; + int RequestSenseLength; + void *DataTransferBuffer; + void *RequestSenseBuffer; +} +DAC960_V2_UserCommand_T; + + +/* + Define the Kernel Mode DAC960_IOCTL_V2_EXECUTE_COMMAND request structure. +*/ + +typedef struct DAC960_V2_KernelCommand +{ + unsigned char ControllerNumber; + DAC960_V2_CommandMailbox_T CommandMailbox; + int DataTransferLength; + int RequestSenseLength; + void *DataTransferBuffer; + void *RequestSenseBuffer; + DAC960_V2_CommandStatus_T CommandStatus; + void (*CompletionFunction)(struct DAC960_V2_KernelCommand *); + void *CompletionData; +} +DAC960_V2_KernelCommand_T; + + +/* + Define the User Mode DAC960_IOCTL_V2_GET_HEALTH_STATUS request structure. +*/ + +typedef struct DAC960_V2_GetHealthStatus +{ + unsigned char ControllerNumber; + DAC960_V2_HealthStatusBuffer_T *HealthStatusBuffer; +} +DAC960_V2_GetHealthStatus_T; + + +/* + Import the Kernel Mode IOCTL interface. +*/ + +extern int DAC960_KernelIOCTL(unsigned int Request, void *Argument); + + +/* + Virtual_to_Bus maps from Kernel Virtual Addresses to PCI Bus Addresses. +*/ + +static inline DAC960_BusAddress32_T Virtual_to_Bus(void *VirtualAddress) +{ + return (DAC960_BusAddress32_T) virt_to_bus(VirtualAddress); +} + + +/* + Bus_to_Virtual maps from PCI Bus Addresses to Kernel Virtual Addresses. +*/ + +static inline void *Bus_to_Virtual(DAC960_BusAddress32_T BusAddress) +{ + return (void *) bus_to_virt(BusAddress); +} + + +/* + DAC960_DriverVersion protects the private portion of this file. +*/ + +#ifdef DAC960_DriverVersion + + +/* + Define the maximum Driver Queue Depth and Controller Queue Depth supported + by DAC960 V1 and V2 Firmware Controllers. +*/ + +#define DAC960_MaxDriverQueueDepth 511 +#define DAC960_MaxControllerQueueDepth 512 + + +/* + Define the maximum number of Scatter/Gather Segments supported for any + DAC960 V1 and V2 Firmware controller. +*/ + +#define DAC960_V1_ScatterGatherLimit 33 +#define DAC960_V2_ScatterGatherLimit 128 + + +/* + Define the number of Command Mailboxes and Status Mailboxes used by the + DAC960 V1 and V2 Firmware Memory Mailbox Interface. +*/ + +#define DAC960_V1_CommandMailboxCount 256 +#define DAC960_V1_StatusMailboxCount 1024 +#define DAC960_V2_CommandMailboxCount 512 +#define DAC960_V2_StatusMailboxCount 512 + + +/* + Define the DAC960 Controller Monitoring Timer Interval. +*/ + +#define DAC960_MonitoringTimerInterval (10 * HZ) + + +/* + Define the DAC960 Controller Secondary Monitoring Interval. +*/ + +#define DAC960_SecondaryMonitoringInterval (60 * HZ) + + +/* + Define the DAC960 Controller Health Status Monitoring Interval. +*/ + +#define DAC960_HealthStatusMonitoringInterval (1 * HZ) + + +/* + Define the DAC960 Controller Progress Reporting Interval. +*/ + +#define DAC960_ProgressReportingInterval (60 * HZ) + + +/* + Define the maximum number of Partitions allowed for each Logical Drive. +*/ + +#define DAC960_MaxPartitions 8 +#define DAC960_MaxPartitionsBits 3 + + +/* + Define macros to extract the Controller Number, Logical Drive Number, and + Partition Number from a Kernel Device, and to construct a Major Number, Minor + Number, and Kernel Device from the Controller Number, Logical Drive Number, + and Partition Number. There is one Major Number assigned to each Controller. + The associated Minor Number is divided into the Logical Drive Number and + Partition Number. +*/ + +#define DAC960_ControllerNumber(Device) \ + (MAJOR(Device) - DAC960_MAJOR) + +#define DAC960_LogicalDriveNumber(Device) \ + (MINOR(Device) >> DAC960_MaxPartitionsBits) + +#define DAC960_PartitionNumber(Device) \ + (MINOR(Device) & (DAC960_MaxPartitions - 1)) + +#define DAC960_MajorNumber(ControllerNumber) \ + (DAC960_MAJOR + (ControllerNumber)) + +#define DAC960_MinorNumber(LogicalDriveNumber, PartitionNumber) \ + (((LogicalDriveNumber) << DAC960_MaxPartitionsBits) | (PartitionNumber)) + +#define DAC960_MinorCount (DAC960_MaxLogicalDrives \ + * DAC960_MaxPartitions) + +#define DAC960_KernelDevice(ControllerNumber, \ + LogicalDriveNumber, \ + PartitionNumber) \ + MKDEV(DAC960_MajorNumber(ControllerNumber), \ + DAC960_MinorNumber(LogicalDriveNumber, PartitionNumber)) + + +/* + Define the DAC960 Controller fixed Block Size and Block Size Bits. +*/ + +#define DAC960_BlockSize 512 #define DAC960_BlockSizeBits 9 +/* + Define the number of Command structures that should be allocated as a + group to optimize kernel memory allocation. +*/ + +#define DAC960_V1_CommandAllocationGroupSize 11 +#define DAC960_V2_CommandAllocationGroupSize 29 + + /* - Define the Controller Line Buffer, Status Buffer, Rebuild Progress, - and User Message Sizes. + Define the Controller Line Buffer, Progress Buffer, User Message, and + Initial Status Buffer sizes. */ #define DAC960_LineBufferSize 100 -#define DAC960_StatusBufferSize 16384 -#define DAC960_RebuildProgressSize 200 +#define DAC960_ProgressBufferSize 200 #define DAC960_UserMessageSize 200 +#define DAC960_InitialStatusBufferSize (8192-32) + + +/* + Define the DAC960 Controller Firmware Types. +*/ + +typedef enum +{ + DAC960_V1_Controller = 1, + DAC960_V2_Controller = 2 +} +DAC960_FirmwareType_T; /* - Define the types of DAC960 Controllers that are supported. + Define the DAC960 Controller Hardware Types. */ typedef enum { - DAC960_V5_Controller = 1, /* DAC1164P */ - DAC960_V4_Controller = 2, /* DAC960PTL/PJ/PG */ - DAC960_V3_Controller = 3 /* DAC960PU/PD/PL */ + DAC960_BA_Controller = 1, /* eXtremeRAID 2000 */ + DAC960_LP_Controller = 2, /* AcceleRAID 352 */ + DAC960_LA_Controller = 3, /* DAC1164P */ + DAC960_PG_Controller = 4, /* DAC960PTL/PJ/PG */ + DAC960_PD_Controller = 5 /* DAC960PU/PD/PL */ } -DAC960_ControllerType_T; +DAC960_HardwareType_T; /* @@ -1130,286 +2169,1000 @@ typedef struct wait_queue WaitQueue_T; +/* + Define the DAC960 V1 Firmware Controller Status Mailbox structure. +*/ + +typedef union DAC960_V1_StatusMailbox +{ + unsigned int Word; /* Word 0 */ + struct { + DAC960_V1_CommandIdentifier_T CommandIdentifier; /* Byte 0 */ + unsigned char :7; /* Byte 1 Bits 0-6 */ + boolean Valid:1; /* Byte 1 Bit 7 */ + DAC960_V1_CommandStatus_T CommandStatus; /* Bytes 2-3 */ + } Fields; +} +DAC960_V1_StatusMailbox_T; + + +/* + Define the DAC960 V2 Firmware Controller Status Mailbox structure. +*/ + +typedef union DAC960_V2_StatusMailbox +{ + unsigned int Words[2]; /* Words 0-1 */ + struct { + DAC960_V2_CommandIdentifier_T CommandIdentifier; /* Bytes 0-1 */ + DAC960_V2_CommandStatus_T CommandStatus; /* Byte 2 */ + unsigned char RequestSenseLength; /* Byte 3 */ + int DataTransferResidue; /* Bytes 4-7 */ + } Fields; +} +DAC960_V2_StatusMailbox_T; + + +/* + Define the DAC960 Driver Command Types. +*/ + +typedef enum +{ + DAC960_ReadCommand = 1, + DAC960_WriteCommand = 2, + DAC960_ReadRetryCommand = 3, + DAC960_WriteRetryCommand = 4, + DAC960_MonitoringCommand = 5, + DAC960_ImmediateCommand = 6, + DAC960_QueuedCommand = 7 +} +DAC960_CommandType_T; + + +/* + Define the DAC960 Driver Command structure. +*/ + +typedef struct DAC960_Command +{ + int CommandIdentifier; + DAC960_CommandType_T CommandType; + struct DAC960_Controller *Controller; + struct DAC960_Command *Next; + Semaphore_T *Semaphore; + unsigned int LogicalDriveNumber; + unsigned int BlockNumber; + unsigned int BlockCount; + unsigned int SegmentCount; + BufferHeader_T *BufferHeader; + void *RequestBuffer; + union { + struct { + DAC960_V1_CommandMailbox_T CommandMailbox; + DAC960_V1_KernelCommand_T *KernelCommand; + DAC960_V1_CommandStatus_T CommandStatus; + DAC960_V1_ScatterGatherSegment_T + ScatterGatherList[DAC960_V1_ScatterGatherLimit] + __attribute__ ((aligned (sizeof(DAC960_V1_ScatterGatherSegment_T)))); + unsigned int EndMarker[0]; + } V1; + struct { + DAC960_V2_CommandMailbox_T CommandMailbox; + DAC960_V2_KernelCommand_T *KernelCommand; + DAC960_V2_CommandStatus_T CommandStatus; + unsigned char RequestSenseLength; + int DataTransferResidue; + DAC960_V2_ScatterGatherSegment_T + ScatterGatherList[DAC960_V2_ScatterGatherLimit] + __attribute__ ((aligned (sizeof(DAC960_V2_ScatterGatherSegment_T)))); + DAC960_SCSI_RequestSense_T RequestSense + __attribute__ ((aligned (sizeof(int)))); + unsigned int EndMarker[0]; + } V2; + } FW; +} +DAC960_Command_T; + + +/* + Define the DAC960 Driver Controller structure. +*/ + +typedef struct DAC960_Controller +{ + void *BaseAddress; + void *MemoryMappedAddress; + DAC960_FirmwareType_T FirmwareType; + DAC960_HardwareType_T HardwareType; + DAC960_IO_Address_T IO_Address; + DAC960_PCI_Address_T PCI_Address; + unsigned char ControllerNumber; + unsigned char ControllerName[4]; + unsigned char ModelName[20]; + unsigned char FullModelName[28]; + unsigned char FirmwareVersion[12]; + unsigned char Bus; + unsigned char Device; + unsigned char Function; + unsigned char IRQ_Channel; + unsigned char Channels; + unsigned char Targets; + unsigned char MemorySize; + unsigned char LogicalDriveCount; + unsigned short CommandAllocationGroupSize; + unsigned short ControllerQueueDepth; + unsigned short DriverQueueDepth; + unsigned short MaxBlocksPerCommand; + unsigned short ControllerScatterGatherLimit; + unsigned short DriverScatterGatherLimit; + unsigned int ControllerUsageCount; + unsigned int CombinedStatusBufferLength; + unsigned int InitialStatusLength; + unsigned int CurrentStatusLength; + unsigned int ProgressBufferLength; + unsigned int UserStatusLength; + unsigned long MemoryMailboxPagesAddress; + unsigned long MemoryMailboxPagesOrder; + unsigned long MonitoringTimerCount; + unsigned long PrimaryMonitoringTime; + unsigned long SecondaryMonitoringTime; + unsigned long LastProgressReportTime; + unsigned long LastCurrentStatusTime; + boolean ControllerDetectionSuccessful; + boolean ControllerInitialized; + boolean MonitoringCommandDeferred; + boolean EphemeralProgressMessage; + boolean DriveSpinUpMessageDisplayed; + boolean MonitoringAlertMode; + Timer_T MonitoringTimer; + GenericDiskInfo_T GenericDiskInfo; + DAC960_Command_T *FreeCommands; + unsigned char *CombinedStatusBuffer; + unsigned char *CurrentStatusBuffer; + PROC_DirectoryEntry_T ControllerProcEntry; + PROC_DirectoryEntry_T InitialStatusProcEntry; + PROC_DirectoryEntry_T CurrentStatusProcEntry; + PROC_DirectoryEntry_T UserCommandProcEntry; + WaitQueue_T *CommandWaitQueue; + WaitQueue_T *HealthStatusWaitQueue; + DAC960_Command_T InitialCommand; + DAC960_Command_T *Commands[DAC960_MaxDriverQueueDepth]; + unsigned int LogicalDriveUsageCount[DAC960_MaxLogicalDrives]; + boolean LogicalDriveInitiallyAccessible[DAC960_MaxLogicalDrives]; + void (*QueueCommand)(DAC960_Command_T *Command); + boolean (*ReadControllerConfiguration)(struct DAC960_Controller *); + boolean (*ReadDeviceConfiguration)(struct DAC960_Controller *); + boolean (*ReportDeviceConfiguration)(struct DAC960_Controller *); + void (*QueueReadWriteCommand)(DAC960_Command_T *Command); + union { + struct { + unsigned char GeometryTranslationHeads; + unsigned char GeometryTranslationSectors; + unsigned char PendingRebuildFlag; + unsigned short StripeSize; + unsigned short SegmentSize; + unsigned short NewEventLogSequenceNumber; + unsigned short OldEventLogSequenceNumber; + unsigned short DeviceStateChannel; + unsigned short DeviceStateTargetID; + boolean DualModeMemoryMailboxInterface; + boolean SAFTE_EnclosureManagementEnabled; + boolean NeedLogicalDriveInformation; + boolean NeedErrorTableInformation; + boolean NeedDeviceStateInformation; + boolean NeedDeviceInquiryInformation; + boolean NeedDeviceSerialNumberInformation; + boolean NeedRebuildProgress; + boolean NeedConsistencyCheckProgress; + boolean RebuildProgressFirst; + boolean RebuildFlagPending; + boolean RebuildStatusPending; + DAC960_V1_CommandMailbox_T *FirstCommandMailbox; + DAC960_V1_CommandMailbox_T *LastCommandMailbox; + DAC960_V1_CommandMailbox_T *NextCommandMailbox; + DAC960_V1_CommandMailbox_T *PreviousCommandMailbox1; + DAC960_V1_CommandMailbox_T *PreviousCommandMailbox2; + DAC960_V1_StatusMailbox_T *FirstStatusMailbox; + DAC960_V1_StatusMailbox_T *LastStatusMailbox; + DAC960_V1_StatusMailbox_T *NextStatusMailbox; + DAC960_V1_DCDB_T MonitoringDCDB; + DAC960_V1_Enquiry_T Enquiry; + DAC960_V1_Enquiry_T NewEnquiry; + DAC960_V1_ErrorTable_T ErrorTable; + DAC960_V1_ErrorTable_T NewErrorTable; + DAC960_V1_EventLogEntry_T EventLogEntry; + DAC960_V1_RebuildProgress_T RebuildProgress; + DAC960_V1_CommandStatus_T LastRebuildStatus; + DAC960_V1_CommandStatus_T PendingRebuildStatus; + DAC960_V1_LogicalDriveInformationArray_T LogicalDriveInformation; + DAC960_V1_LogicalDriveInformationArray_T NewLogicalDriveInformation; + DAC960_V1_DeviceState_T + DeviceState[DAC960_V1_MaxChannels][DAC960_V1_MaxTargets]; + DAC960_V1_DeviceState_T NewDeviceState; + DAC960_SCSI_Inquiry_T + InquiryStandardData[DAC960_V1_MaxChannels][DAC960_V1_MaxTargets]; + DAC960_SCSI_Inquiry_UnitSerialNumber_T + InquiryUnitSerialNumber[DAC960_V1_MaxChannels][DAC960_V1_MaxTargets]; + int DeviceResetCount[DAC960_V1_MaxChannels][DAC960_V1_MaxTargets]; + boolean DirectCommandActive[DAC960_V1_MaxChannels][DAC960_V1_MaxTargets]; + } V1; + struct { + unsigned int StatusChangeCounter; + unsigned int NextEventSequenceNumber; + unsigned int PhysicalDeviceIndex; + boolean NeedLogicalDeviceInformation; + boolean NeedPhysicalDeviceInformation; + boolean NeedDeviceSerialNumberInformation; + DAC960_V2_CommandMailbox_T *FirstCommandMailbox; + DAC960_V2_CommandMailbox_T *LastCommandMailbox; + DAC960_V2_CommandMailbox_T *NextCommandMailbox; + DAC960_V2_CommandMailbox_T *PreviousCommandMailbox1; + DAC960_V2_CommandMailbox_T *PreviousCommandMailbox2; + DAC960_V2_StatusMailbox_T *FirstStatusMailbox; + DAC960_V2_StatusMailbox_T *LastStatusMailbox; + DAC960_V2_StatusMailbox_T *NextStatusMailbox; + DAC960_V2_HealthStatusBuffer_T *HealthStatusBuffer; + DAC960_V2_ControllerInfo_T ControllerInformation; + DAC960_V2_ControllerInfo_T NewControllerInformation; + DAC960_V2_LogicalDeviceInfo_T + *LogicalDeviceInformation[DAC960_MaxLogicalDrives]; + DAC960_V2_LogicalDeviceInfo_T NewLogicalDeviceInformation; + DAC960_V2_PhysicalDeviceInfo_T + *PhysicalDeviceInformation[DAC960_V2_MaxPhysicalDevices]; + DAC960_V2_PhysicalDeviceInfo_T NewPhysicalDeviceInformation; + DAC960_SCSI_Inquiry_UnitSerialNumber_T + *InquiryUnitSerialNumber[DAC960_V2_MaxPhysicalDevices]; + DAC960_V2_PhysicalDevice_T + LogicalDriveToVirtualDevice[DAC960_MaxLogicalDrives]; + DAC960_V2_Event_T Event; + } V2; + } FW; + DiskPartition_T DiskPartitions[DAC960_MinorCount]; + int PartitionSizes[DAC960_MinorCount]; + int BlockSizes[DAC960_MinorCount]; + int MaxSectorsPerRequest[DAC960_MinorCount]; + int MaxSegmentsPerRequest[DAC960_MinorCount]; + unsigned char ProgressBuffer[DAC960_ProgressBufferSize]; + unsigned char UserStatusBuffer[DAC960_UserMessageSize]; +} +DAC960_Controller_T; + + +/* + Simplify access to Firmware Version Dependent Data Structure Components + and Functions. +*/ + +#define V1 FW.V1 +#define V2 FW.V2 +#define DAC960_QueueCommand(Command) \ + (Controller->QueueCommand)(Command) +#define DAC960_ReadControllerConfiguration(Controller) \ + (Controller->ReadControllerConfiguration)(Controller) +#define DAC960_ReadDeviceConfiguration(Controller) \ + (Controller->ReadDeviceConfiguration)(Controller) +#define DAC960_ReportDeviceConfiguration(Controller) \ + (Controller->ReportDeviceConfiguration)(Controller) +#define DAC960_QueueReadWriteCommand(Command) \ + (Controller->QueueReadWriteCommand)(Command) + + +/* + DAC960_AcquireControllerLock acquires exclusive access to Controller. +*/ + +static inline +void DAC960_AcquireControllerLock(DAC960_Controller_T *Controller, + ProcessorFlags_T *ProcessorFlags) +{ + spin_lock_irqsave(&io_request_lock, *ProcessorFlags); +} + + +/* + DAC960_ReleaseControllerLock releases exclusive access to Controller. +*/ + +static inline +void DAC960_ReleaseControllerLock(DAC960_Controller_T *Controller, + ProcessorFlags_T *ProcessorFlags) +{ + spin_unlock_irqrestore(&io_request_lock, *ProcessorFlags); +} + + +/* + DAC960_AcquireControllerLockRF acquires exclusive access to Controller, + but is only called from the request function with the io_request_lock held. +*/ + +static inline +void DAC960_AcquireControllerLockRF(DAC960_Controller_T *Controller, + ProcessorFlags_T *ProcessorFlags) +{ +} + + +/* + DAC960_ReleaseControllerLockRF releases exclusive access to Controller, + but is only called from the request function with the io_request_lock held. +*/ + +static inline +void DAC960_ReleaseControllerLockRF(DAC960_Controller_T *Controller, + ProcessorFlags_T *ProcessorFlags) +{ +} + + +/* + DAC960_AcquireControllerLockIH acquires exclusive access to Controller, + but is only called from the interrupt handler. +*/ + +static inline +void DAC960_AcquireControllerLockIH(DAC960_Controller_T *Controller, + ProcessorFlags_T *ProcessorFlags) +{ + spin_lock_irqsave(&io_request_lock, *ProcessorFlags); +} + + +/* + DAC960_ReleaseControllerLockIH releases exclusive access to Controller, + but is only called from the interrupt handler. +*/ + +static inline +void DAC960_ReleaseControllerLockIH(DAC960_Controller_T *Controller, + ProcessorFlags_T *ProcessorFlags) +{ + spin_unlock_irqrestore(&io_request_lock, *ProcessorFlags); +} + + +/* + Define the DAC960 BA Series Controller Interface Register Offsets. +*/ + +#define DAC960_BA_RegisterWindowSize 0x80 + +typedef enum +{ + DAC960_BA_InboundDoorBellRegisterOffset = 0x60, + DAC960_BA_OutboundDoorBellRegisterOffset = 0x61, + DAC960_BA_InterruptStatusRegisterOffset = 0x30, + DAC960_BA_InterruptMaskRegisterOffset = 0x34, + DAC960_BA_CommandMailboxBusAddressOffset = 0x50, + DAC960_BA_CommandStatusOffset = 0x58, + DAC960_BA_ErrorStatusRegisterOffset = 0x63 +} +DAC960_BA_RegisterOffsets_T; + + +/* + Define the structure of the DAC960 BA Series Inbound Door Bell Register. +*/ + +typedef union DAC960_BA_InboundDoorBellRegister +{ + unsigned char All; + struct { + boolean HardwareMailboxNewCommand:1; /* Bit 0 */ + boolean AcknowledgeHardwareMailboxStatus:1; /* Bit 1 */ + boolean GenerateInterrupt:1; /* Bit 2 */ + boolean ControllerReset:1; /* Bit 3 */ + boolean MemoryMailboxNewCommand:1; /* Bit 4 */ + unsigned char :3; /* Bits 5-7 */ + } Write; + struct { + boolean HardwareMailboxEmpty:1; /* Bit 0 */ + boolean InitializationNotInProgress:1; /* Bit 1 */ + unsigned char :6; /* Bits 2-7 */ + } Read; +} +DAC960_BA_InboundDoorBellRegister_T; + + +/* + Define the structure of the DAC960 BA Series Outbound Door Bell Register. +*/ + +typedef union DAC960_BA_OutboundDoorBellRegister +{ + unsigned char All; + struct { + boolean AcknowledgeHardwareMailboxInterrupt:1; /* Bit 0 */ + boolean AcknowledgeMemoryMailboxInterrupt:1; /* Bit 1 */ + unsigned char :6; /* Bits 2-7 */ + } Write; + struct { + boolean HardwareMailboxStatusAvailable:1; /* Bit 0 */ + boolean MemoryMailboxStatusAvailable:1; /* Bit 1 */ + unsigned char :6; /* Bits 2-7 */ + } Read; +} +DAC960_BA_OutboundDoorBellRegister_T; + + +/* + Define the structure of the DAC960 BA Series Interrupt Mask Register. +*/ + +typedef union DAC960_BA_InterruptMaskRegister +{ + unsigned char All; + struct { + unsigned int :2; /* Bits 0-1 */ + boolean DisableInterrupts:1; /* Bit 2 */ + boolean DisableInterruptsI2O:1; /* Bit 3 */ + unsigned int :4; /* Bits 4-7 */ + } Bits; +} +DAC960_BA_InterruptMaskRegister_T; + + +/* + Define the structure of the DAC960 BA Series Error Status Register. +*/ + +typedef union DAC960_BA_ErrorStatusRegister +{ + unsigned char All; + struct { + unsigned int :2; /* Bits 0-1 */ + boolean ErrorStatusPending:1; /* Bit 2 */ + unsigned int :5; /* Bits 3-7 */ + } Bits; +} +DAC960_BA_ErrorStatusRegister_T; + + +/* + Define inline functions to provide an abstraction for reading and writing the + DAC960 BA Series Controller Interface Registers. +*/ + +static inline +void DAC960_BA_HardwareMailboxNewCommand(void *ControllerBaseAddress) +{ + DAC960_BA_InboundDoorBellRegister_T InboundDoorBellRegister; + InboundDoorBellRegister.All = 0; + InboundDoorBellRegister.Write.HardwareMailboxNewCommand = true; + writeb(InboundDoorBellRegister.All, + ControllerBaseAddress + DAC960_BA_InboundDoorBellRegisterOffset); +} + +static inline +void DAC960_BA_AcknowledgeHardwareMailboxStatus(void *ControllerBaseAddress) +{ + DAC960_BA_InboundDoorBellRegister_T InboundDoorBellRegister; + InboundDoorBellRegister.All = 0; + InboundDoorBellRegister.Write.AcknowledgeHardwareMailboxStatus = true; + writeb(InboundDoorBellRegister.All, + ControllerBaseAddress + DAC960_BA_InboundDoorBellRegisterOffset); +} + +static inline +void DAC960_BA_GenerateInterrupt(void *ControllerBaseAddress) +{ + DAC960_BA_InboundDoorBellRegister_T InboundDoorBellRegister; + InboundDoorBellRegister.All = 0; + InboundDoorBellRegister.Write.GenerateInterrupt = true; + writeb(InboundDoorBellRegister.All, + ControllerBaseAddress + DAC960_BA_InboundDoorBellRegisterOffset); +} + +static inline +void DAC960_BA_ControllerReset(void *ControllerBaseAddress) +{ + DAC960_BA_InboundDoorBellRegister_T InboundDoorBellRegister; + InboundDoorBellRegister.All = 0; + InboundDoorBellRegister.Write.ControllerReset = true; + writeb(InboundDoorBellRegister.All, + ControllerBaseAddress + DAC960_BA_InboundDoorBellRegisterOffset); +} + +static inline +void DAC960_BA_MemoryMailboxNewCommand(void *ControllerBaseAddress) +{ + DAC960_BA_InboundDoorBellRegister_T InboundDoorBellRegister; + InboundDoorBellRegister.All = 0; + InboundDoorBellRegister.Write.MemoryMailboxNewCommand = true; + writeb(InboundDoorBellRegister.All, + ControllerBaseAddress + DAC960_BA_InboundDoorBellRegisterOffset); +} + +static inline +boolean DAC960_BA_HardwareMailboxFullP(void *ControllerBaseAddress) +{ + DAC960_BA_InboundDoorBellRegister_T InboundDoorBellRegister; + InboundDoorBellRegister.All = + readb(ControllerBaseAddress + DAC960_BA_InboundDoorBellRegisterOffset); + return !InboundDoorBellRegister.Read.HardwareMailboxEmpty; +} + +static inline +boolean DAC960_BA_InitializationInProgressP(void *ControllerBaseAddress) +{ + DAC960_BA_InboundDoorBellRegister_T InboundDoorBellRegister; + InboundDoorBellRegister.All = + readb(ControllerBaseAddress + DAC960_BA_InboundDoorBellRegisterOffset); + return !InboundDoorBellRegister.Read.InitializationNotInProgress; +} + +static inline +void DAC960_BA_AcknowledgeHardwareMailboxInterrupt(void *ControllerBaseAddress) +{ + DAC960_BA_OutboundDoorBellRegister_T OutboundDoorBellRegister; + OutboundDoorBellRegister.All = 0; + OutboundDoorBellRegister.Write.AcknowledgeHardwareMailboxInterrupt = true; + writeb(OutboundDoorBellRegister.All, + ControllerBaseAddress + DAC960_BA_OutboundDoorBellRegisterOffset); +} + +static inline +void DAC960_BA_AcknowledgeMemoryMailboxInterrupt(void *ControllerBaseAddress) +{ + DAC960_BA_OutboundDoorBellRegister_T OutboundDoorBellRegister; + OutboundDoorBellRegister.All = 0; + OutboundDoorBellRegister.Write.AcknowledgeMemoryMailboxInterrupt = true; + writeb(OutboundDoorBellRegister.All, + ControllerBaseAddress + DAC960_BA_OutboundDoorBellRegisterOffset); +} + +static inline +void DAC960_BA_AcknowledgeInterrupt(void *ControllerBaseAddress) +{ + DAC960_BA_OutboundDoorBellRegister_T OutboundDoorBellRegister; + OutboundDoorBellRegister.All = 0; + OutboundDoorBellRegister.Write.AcknowledgeHardwareMailboxInterrupt = true; + OutboundDoorBellRegister.Write.AcknowledgeMemoryMailboxInterrupt = true; + writeb(OutboundDoorBellRegister.All, + ControllerBaseAddress + DAC960_BA_OutboundDoorBellRegisterOffset); +} + +static inline +boolean DAC960_BA_HardwareMailboxStatusAvailableP(void *ControllerBaseAddress) +{ + DAC960_BA_OutboundDoorBellRegister_T OutboundDoorBellRegister; + OutboundDoorBellRegister.All = + readb(ControllerBaseAddress + DAC960_BA_OutboundDoorBellRegisterOffset); + return OutboundDoorBellRegister.Read.HardwareMailboxStatusAvailable; +} + +static inline +boolean DAC960_BA_MemoryMailboxStatusAvailableP(void *ControllerBaseAddress) +{ + DAC960_BA_OutboundDoorBellRegister_T OutboundDoorBellRegister; + OutboundDoorBellRegister.All = + readb(ControllerBaseAddress + DAC960_BA_OutboundDoorBellRegisterOffset); + return OutboundDoorBellRegister.Read.MemoryMailboxStatusAvailable; +} + +static inline +void DAC960_BA_EnableInterrupts(void *ControllerBaseAddress) +{ + DAC960_BA_InterruptMaskRegister_T InterruptMaskRegister; + InterruptMaskRegister.All = 0xFF; + InterruptMaskRegister.Bits.DisableInterrupts = false; + InterruptMaskRegister.Bits.DisableInterruptsI2O = true; + writeb(InterruptMaskRegister.All, + ControllerBaseAddress + DAC960_BA_InterruptMaskRegisterOffset); +} + +static inline +void DAC960_BA_DisableInterrupts(void *ControllerBaseAddress) +{ + DAC960_BA_InterruptMaskRegister_T InterruptMaskRegister; + InterruptMaskRegister.All = 0xFF; + InterruptMaskRegister.Bits.DisableInterrupts = true; + InterruptMaskRegister.Bits.DisableInterruptsI2O = true; + writeb(InterruptMaskRegister.All, + ControllerBaseAddress + DAC960_BA_InterruptMaskRegisterOffset); +} + +static inline +boolean DAC960_BA_InterruptsEnabledP(void *ControllerBaseAddress) +{ + DAC960_BA_InterruptMaskRegister_T InterruptMaskRegister; + InterruptMaskRegister.All = + readb(ControllerBaseAddress + DAC960_BA_InterruptMaskRegisterOffset); + return !InterruptMaskRegister.Bits.DisableInterrupts; +} + +static inline +void DAC960_BA_WriteCommandMailbox(DAC960_V2_CommandMailbox_T + *MemoryCommandMailbox, + DAC960_V2_CommandMailbox_T + *CommandMailbox) +{ + memcpy(&MemoryCommandMailbox->Words[1], &CommandMailbox->Words[1], + sizeof(DAC960_V2_CommandMailbox_T) - sizeof(unsigned int)); + wmb(); + MemoryCommandMailbox->Words[0] = CommandMailbox->Words[0]; + mb(); +} + +static inline +void DAC960_BA_WriteHardwareMailbox(void *ControllerBaseAddress, + DAC960_V2_CommandMailbox_T *CommandMailbox) +{ + writel(Virtual_to_Bus(CommandMailbox), + ControllerBaseAddress + DAC960_BA_CommandMailboxBusAddressOffset); +} + +static inline DAC960_V2_CommandIdentifier_T +DAC960_BA_ReadCommandIdentifier(void *ControllerBaseAddress) +{ + return readw(ControllerBaseAddress + DAC960_BA_CommandStatusOffset); +} + +static inline DAC960_V2_CommandStatus_T +DAC960_BA_ReadCommandStatus(void *ControllerBaseAddress) +{ + return readw(ControllerBaseAddress + DAC960_BA_CommandStatusOffset + 2); +} + +static inline boolean +DAC960_BA_ReadErrorStatus(void *ControllerBaseAddress, + unsigned char *ErrorStatus, + unsigned char *Parameter0, + unsigned char *Parameter1) +{ + DAC960_BA_ErrorStatusRegister_T ErrorStatusRegister; + ErrorStatusRegister.All = + readb(ControllerBaseAddress + DAC960_BA_ErrorStatusRegisterOffset); + if (!ErrorStatusRegister.Bits.ErrorStatusPending) return false; + ErrorStatusRegister.Bits.ErrorStatusPending = false; + *ErrorStatus = ErrorStatusRegister.All; + *Parameter0 = + readb(ControllerBaseAddress + DAC960_BA_CommandMailboxBusAddressOffset + 0); + *Parameter1 = + readb(ControllerBaseAddress + DAC960_BA_CommandMailboxBusAddressOffset + 1); + writeb(0xFF, ControllerBaseAddress + DAC960_BA_ErrorStatusRegisterOffset); + return true; +} + + /* - Define the DAC960 Controller Status Mailbox structure. + Define the DAC960 LP Series Controller Interface Register Offsets. */ -typedef union DAC960_StatusMailbox +#define DAC960_LP_RegisterWindowSize 0x80 + +typedef enum { - unsigned int Word; /* Bytes 0-3 */ - struct { - DAC960_CommandIdentifier_T CommandIdentifier; /* Byte 0 */ - unsigned char :7; /* Byte 1 Bits 0-6 */ - boolean Valid:1; /* Byte 1 Bit 7 */ - DAC960_CommandStatus_T CommandStatus; /* Bytes 2-3 */ - } Fields; + DAC960_LP_InboundDoorBellRegisterOffset = 0x20, + DAC960_LP_OutboundDoorBellRegisterOffset = 0x2C, + DAC960_LP_InterruptStatusRegisterOffset = 0x30, + DAC960_LP_InterruptMaskRegisterOffset = 0x34, + DAC960_LP_CommandMailboxBusAddressOffset = 0x10, + DAC960_LP_CommandStatusOffset = 0x18, + DAC960_LP_ErrorStatusRegisterOffset = 0x2E } -DAC960_StatusMailbox_T; +DAC960_LP_RegisterOffsets_T; /* - Define the DAC960 Driver Command Types. + Define the structure of the DAC960 LP Series Inbound Door Bell Register. */ -typedef enum +typedef union DAC960_LP_InboundDoorBellRegister { - DAC960_ReadCommand = 1, - DAC960_WriteCommand = 2, - DAC960_ReadRetryCommand = 3, - DAC960_WriteRetryCommand = 4, - DAC960_MonitoringCommand = 5, - DAC960_ImmediateCommand = 6, - DAC960_QueuedCommand = 7 + unsigned char All; + struct { + boolean HardwareMailboxNewCommand:1; /* Bit 0 */ + boolean AcknowledgeHardwareMailboxStatus:1; /* Bit 1 */ + boolean GenerateInterrupt:1; /* Bit 2 */ + boolean ControllerReset:1; /* Bit 3 */ + boolean MemoryMailboxNewCommand:1; /* Bit 4 */ + unsigned char :3; /* Bits 5-7 */ + } Write; + struct { + boolean HardwareMailboxFull:1; /* Bit 0 */ + boolean InitializationInProgress:1; /* Bit 1 */ + unsigned char :6; /* Bits 2-7 */ + } Read; } -DAC960_CommandType_T; +DAC960_LP_InboundDoorBellRegister_T; /* - Define the DAC960 Driver Command structure. + Define the structure of the DAC960 LP Series Outbound Door Bell Register. */ -typedef struct DAC960_Command +typedef union DAC960_LP_OutboundDoorBellRegister { - DAC960_CommandType_T CommandType; - DAC960_CommandMailbox_T CommandMailbox; - DAC960_CommandStatus_T CommandStatus; - struct DAC960_Controller *Controller; - struct DAC960_Command *Next; - Semaphore_T *Semaphore; - unsigned int LogicalDriveNumber; - unsigned int BlockNumber; - unsigned int BlockCount; - unsigned int SegmentCount; - BufferHeader_T *BufferHeader; - DAC960_KernelCommand_T *KernelCommand; - DAC960_ScatterGatherSegment_T - ScatterGatherList[DAC960_MaxScatterGatherSegments]; + unsigned char All; + struct { + boolean AcknowledgeHardwareMailboxInterrupt:1; /* Bit 0 */ + boolean AcknowledgeMemoryMailboxInterrupt:1; /* Bit 1 */ + unsigned char :6; /* Bits 2-7 */ + } Write; + struct { + boolean HardwareMailboxStatusAvailable:1; /* Bit 0 */ + boolean MemoryMailboxStatusAvailable:1; /* Bit 1 */ + unsigned char :6; /* Bits 2-7 */ + } Read; } -DAC960_Command_T; +DAC960_LP_OutboundDoorBellRegister_T; /* - Define the DAC960 Driver Controller structure. + Define the structure of the DAC960 LP Series Interrupt Mask Register. */ -typedef struct DAC960_Controller +typedef union DAC960_LP_InterruptMaskRegister { - void *BaseAddress; - void *MemoryMappedAddress; - DAC960_ControllerType_T ControllerType; - DAC960_IO_Address_T IO_Address; - DAC960_PCI_Address_T PCI_Address; - unsigned char ControllerNumber; - unsigned char ControllerName[4]; - unsigned char ModelName[12]; - unsigned char FullModelName[18]; - unsigned char FirmwareVersion[14]; - unsigned char Bus; - unsigned char Device; - unsigned char Function; - unsigned char IRQ_Channel; - unsigned char Channels; - unsigned char MemorySize; - unsigned char LogicalDriveCount; - unsigned char GeometryTranslationHeads; - unsigned char GeometryTranslationSectors; - unsigned char PendingRebuildFlag; - unsigned short ControllerQueueDepth; - unsigned short DriverQueueDepth; - unsigned short MaxBlocksPerCommand; - unsigned short MaxScatterGatherSegments; - unsigned short StripeSize; - unsigned short SegmentSize; - unsigned short NewEventLogSequenceNumber; - unsigned short OldEventLogSequenceNumber; - unsigned short InitialStatusLength; - unsigned short CurrentStatusLength; - unsigned short UserStatusLength; - unsigned short RebuildProgressLength; - unsigned int ControllerUsageCount; - unsigned int EnquiryIndex; - unsigned int LogicalDriveInformationIndex; - unsigned int ErrorTableIndex; - unsigned int DeviceStateIndex; - unsigned int DeviceStateChannel; - unsigned int DeviceStateTargetID; - unsigned long MonitoringTimerCount; - unsigned long SecondaryMonitoringTime; - unsigned long LastProgressReportTime; - unsigned long LastCurrentStatusTime; - boolean DualModeMemoryMailboxInterface; - boolean SAFTE_EnclosureManagementEnabled; - boolean ControllerInitialized; - boolean MonitoringCommandDeferred; - boolean NeedLogicalDriveInformation; - boolean NeedErrorTableInformation; - boolean NeedDeviceStateInformation; - boolean NeedDeviceInquiryInformation; - boolean NeedDeviceSerialNumberInformation; - boolean NeedRebuildProgress; - boolean NeedConsistencyCheckProgress; - boolean EphemeralProgressMessage; - boolean RebuildFlagPending; - boolean RebuildStatusPending; - boolean DriveSpinUpMessageDisplayed; - Timer_T MonitoringTimer; - GenericDiskInfo_T GenericDiskInfo; - DAC960_Command_T *FreeCommands; - DAC960_CommandMailbox_T *FirstCommandMailbox; - DAC960_CommandMailbox_T *LastCommandMailbox; - DAC960_CommandMailbox_T *NextCommandMailbox; - DAC960_CommandMailbox_T *PreviousCommandMailbox1; - DAC960_CommandMailbox_T *PreviousCommandMailbox2; - DAC960_StatusMailbox_T *FirstStatusMailbox; - DAC960_StatusMailbox_T *LastStatusMailbox; - DAC960_StatusMailbox_T *NextStatusMailbox; - PROC_DirectoryEntry_T ControllerProcEntry; - PROC_DirectoryEntry_T InitialStatusProcEntry; - PROC_DirectoryEntry_T CurrentStatusProcEntry; - PROC_DirectoryEntry_T UserCommandProcEntry; - WaitQueue_T *CommandWaitQueue; - DAC960_DCDB_T MonitoringDCDB; - DAC960_Enquiry_T Enquiry[2]; - DAC960_ErrorTable_T ErrorTable[2]; - DAC960_EventLogEntry_T EventLogEntry; - DAC960_RebuildProgress_T RebuildProgress; - DAC960_CommandStatus_T LastRebuildStatus; - DAC960_CommandStatus_T PendingRebuildStatus; - DAC960_LogicalDriveInformation_T - LogicalDriveInformation[2][DAC960_MaxLogicalDrives]; - DAC960_LogicalDriveState_T LogicalDriveInitialState[DAC960_MaxLogicalDrives]; - DAC960_DeviceState_T DeviceState[2][DAC960_MaxChannels][DAC960_MaxTargets]; - DAC960_Command_T Commands[DAC960_MaxDriverQueueDepth]; - DAC960_SCSI_Inquiry_T - InquiryStandardData[DAC960_MaxChannels][DAC960_MaxTargets]; - DAC960_SCSI_Inquiry_UnitSerialNumber_T - InquiryUnitSerialNumber[DAC960_MaxChannels][DAC960_MaxTargets]; - DiskPartition_T DiskPartitions[DAC960_MinorCount]; - int LogicalDriveUsageCount[DAC960_MaxLogicalDrives]; - int PartitionSizes[DAC960_MinorCount]; - int BlockSizes[DAC960_MinorCount]; - int MaxSectorsPerRequest[DAC960_MinorCount]; - int MaxSegmentsPerRequest[DAC960_MinorCount]; - int DeviceResetCount[DAC960_MaxChannels][DAC960_MaxTargets]; - boolean DirectCommandActive[DAC960_MaxChannels][DAC960_MaxTargets]; - char InitialStatusBuffer[DAC960_StatusBufferSize]; - char CurrentStatusBuffer[DAC960_StatusBufferSize]; - char UserStatusBuffer[DAC960_UserMessageSize]; - char RebuildProgressBuffer[DAC960_RebuildProgressSize]; + unsigned char All; + struct { + unsigned int :2; /* Bits 0-1 */ + boolean DisableInterrupts:1; /* Bit 2 */ + unsigned int :5; /* Bits 3-7 */ + } Bits; } -DAC960_Controller_T; +DAC960_LP_InterruptMaskRegister_T; /* - DAC960_AcquireControllerLock acquires exclusive access to Controller. + Define the structure of the DAC960 LP Series Error Status Register. */ -static inline -void DAC960_AcquireControllerLock(DAC960_Controller_T *Controller, - ProcessorFlags_T *ProcessorFlags) +typedef union DAC960_LP_ErrorStatusRegister { - spin_lock_irqsave(&io_request_lock, *ProcessorFlags); + unsigned char All; + struct { + unsigned int :2; /* Bits 0-1 */ + boolean ErrorStatusPending:1; /* Bit 2 */ + unsigned int :5; /* Bits 3-7 */ + } Bits; } +DAC960_LP_ErrorStatusRegister_T; /* - DAC960_ReleaseControllerLock releases exclusive access to Controller. + Define inline functions to provide an abstraction for reading and writing the + DAC960 LP Series Controller Interface Registers. */ static inline -void DAC960_ReleaseControllerLock(DAC960_Controller_T *Controller, - ProcessorFlags_T *ProcessorFlags) +void DAC960_LP_HardwareMailboxNewCommand(void *ControllerBaseAddress) { - spin_unlock_irqrestore(&io_request_lock, *ProcessorFlags); + DAC960_LP_InboundDoorBellRegister_T InboundDoorBellRegister; + InboundDoorBellRegister.All = 0; + InboundDoorBellRegister.Write.HardwareMailboxNewCommand = true; + writeb(InboundDoorBellRegister.All, + ControllerBaseAddress + DAC960_LP_InboundDoorBellRegisterOffset); } +static inline +void DAC960_LP_AcknowledgeHardwareMailboxStatus(void *ControllerBaseAddress) +{ + DAC960_LP_InboundDoorBellRegister_T InboundDoorBellRegister; + InboundDoorBellRegister.All = 0; + InboundDoorBellRegister.Write.AcknowledgeHardwareMailboxStatus = true; + writeb(InboundDoorBellRegister.All, + ControllerBaseAddress + DAC960_LP_InboundDoorBellRegisterOffset); +} -/* - DAC960_AcquireControllerLockRF acquires exclusive access to Controller, - but is only called from the request function with the io_request_lock held. -*/ +static inline +void DAC960_LP_GenerateInterrupt(void *ControllerBaseAddress) +{ + DAC960_LP_InboundDoorBellRegister_T InboundDoorBellRegister; + InboundDoorBellRegister.All = 0; + InboundDoorBellRegister.Write.GenerateInterrupt = true; + writeb(InboundDoorBellRegister.All, + ControllerBaseAddress + DAC960_LP_InboundDoorBellRegisterOffset); +} static inline -void DAC960_AcquireControllerLockRF(DAC960_Controller_T *Controller, - ProcessorFlags_T *ProcessorFlags) +void DAC960_LP_ControllerReset(void *ControllerBaseAddress) { + DAC960_LP_InboundDoorBellRegister_T InboundDoorBellRegister; + InboundDoorBellRegister.All = 0; + InboundDoorBellRegister.Write.ControllerReset = true; + writeb(InboundDoorBellRegister.All, + ControllerBaseAddress + DAC960_LP_InboundDoorBellRegisterOffset); } +static inline +void DAC960_LP_MemoryMailboxNewCommand(void *ControllerBaseAddress) +{ + DAC960_LP_InboundDoorBellRegister_T InboundDoorBellRegister; + InboundDoorBellRegister.All = 0; + InboundDoorBellRegister.Write.MemoryMailboxNewCommand = true; + writeb(InboundDoorBellRegister.All, + ControllerBaseAddress + DAC960_LP_InboundDoorBellRegisterOffset); +} -/* - DAC960_ReleaseControllerLockRF releases exclusive access to Controller, - but is only called from the request function with the io_request_lock held. -*/ +static inline +boolean DAC960_LP_HardwareMailboxFullP(void *ControllerBaseAddress) +{ + DAC960_LP_InboundDoorBellRegister_T InboundDoorBellRegister; + InboundDoorBellRegister.All = + readb(ControllerBaseAddress + DAC960_LP_InboundDoorBellRegisterOffset); + return InboundDoorBellRegister.Read.HardwareMailboxFull; +} static inline -void DAC960_ReleaseControllerLockRF(DAC960_Controller_T *Controller, - ProcessorFlags_T *ProcessorFlags) +boolean DAC960_LP_InitializationInProgressP(void *ControllerBaseAddress) { + DAC960_LP_InboundDoorBellRegister_T InboundDoorBellRegister; + InboundDoorBellRegister.All = + readb(ControllerBaseAddress + DAC960_LP_InboundDoorBellRegisterOffset); + return InboundDoorBellRegister.Read.InitializationInProgress; } +static inline +void DAC960_LP_AcknowledgeHardwareMailboxInterrupt(void *ControllerBaseAddress) +{ + DAC960_LP_OutboundDoorBellRegister_T OutboundDoorBellRegister; + OutboundDoorBellRegister.All = 0; + OutboundDoorBellRegister.Write.AcknowledgeHardwareMailboxInterrupt = true; + writeb(OutboundDoorBellRegister.All, + ControllerBaseAddress + DAC960_LP_OutboundDoorBellRegisterOffset); +} -/* - DAC960_AcquireControllerLockIH acquires exclusive access to Controller, - but is only called from the interrupt handler. -*/ +static inline +void DAC960_LP_AcknowledgeMemoryMailboxInterrupt(void *ControllerBaseAddress) +{ + DAC960_LP_OutboundDoorBellRegister_T OutboundDoorBellRegister; + OutboundDoorBellRegister.All = 0; + OutboundDoorBellRegister.Write.AcknowledgeMemoryMailboxInterrupt = true; + writeb(OutboundDoorBellRegister.All, + ControllerBaseAddress + DAC960_LP_OutboundDoorBellRegisterOffset); +} static inline -void DAC960_AcquireControllerLockIH(DAC960_Controller_T *Controller, - ProcessorFlags_T *ProcessorFlags) +void DAC960_LP_AcknowledgeInterrupt(void *ControllerBaseAddress) { - spin_lock_irqsave(&io_request_lock, *ProcessorFlags); + DAC960_LP_OutboundDoorBellRegister_T OutboundDoorBellRegister; + OutboundDoorBellRegister.All = 0; + OutboundDoorBellRegister.Write.AcknowledgeHardwareMailboxInterrupt = true; + OutboundDoorBellRegister.Write.AcknowledgeMemoryMailboxInterrupt = true; + writeb(OutboundDoorBellRegister.All, + ControllerBaseAddress + DAC960_LP_OutboundDoorBellRegisterOffset); } +static inline +boolean DAC960_LP_HardwareMailboxStatusAvailableP(void *ControllerBaseAddress) +{ + DAC960_LP_OutboundDoorBellRegister_T OutboundDoorBellRegister; + OutboundDoorBellRegister.All = + readb(ControllerBaseAddress + DAC960_LP_OutboundDoorBellRegisterOffset); + return OutboundDoorBellRegister.Read.HardwareMailboxStatusAvailable; +} -/* - DAC960_ReleaseControllerLockIH releases exclusive access to Controller, - but is only called from the interrupt handler. -*/ +static inline +boolean DAC960_LP_MemoryMailboxStatusAvailableP(void *ControllerBaseAddress) +{ + DAC960_LP_OutboundDoorBellRegister_T OutboundDoorBellRegister; + OutboundDoorBellRegister.All = + readb(ControllerBaseAddress + DAC960_LP_OutboundDoorBellRegisterOffset); + return OutboundDoorBellRegister.Read.MemoryMailboxStatusAvailable; +} static inline -void DAC960_ReleaseControllerLockIH(DAC960_Controller_T *Controller, - ProcessorFlags_T *ProcessorFlags) +void DAC960_LP_EnableInterrupts(void *ControllerBaseAddress) { - spin_unlock_irqrestore(&io_request_lock, *ProcessorFlags); + DAC960_LP_InterruptMaskRegister_T InterruptMaskRegister; + InterruptMaskRegister.All = 0xFF; + InterruptMaskRegister.Bits.DisableInterrupts = false; + writeb(InterruptMaskRegister.All, + ControllerBaseAddress + DAC960_LP_InterruptMaskRegisterOffset); +} + +static inline +void DAC960_LP_DisableInterrupts(void *ControllerBaseAddress) +{ + DAC960_LP_InterruptMaskRegister_T InterruptMaskRegister; + InterruptMaskRegister.All = 0xFF; + InterruptMaskRegister.Bits.DisableInterrupts = true; + writeb(InterruptMaskRegister.All, + ControllerBaseAddress + DAC960_LP_InterruptMaskRegisterOffset); +} + +static inline +boolean DAC960_LP_InterruptsEnabledP(void *ControllerBaseAddress) +{ + DAC960_LP_InterruptMaskRegister_T InterruptMaskRegister; + InterruptMaskRegister.All = + readb(ControllerBaseAddress + DAC960_LP_InterruptMaskRegisterOffset); + return !InterruptMaskRegister.Bits.DisableInterrupts; +} + +static inline +void DAC960_LP_WriteCommandMailbox(DAC960_V2_CommandMailbox_T + *MemoryCommandMailbox, + DAC960_V2_CommandMailbox_T + *CommandMailbox) +{ + memcpy(&MemoryCommandMailbox->Words[1], &CommandMailbox->Words[1], + sizeof(DAC960_V2_CommandMailbox_T) - sizeof(unsigned int)); + wmb(); + MemoryCommandMailbox->Words[0] = CommandMailbox->Words[0]; + mb(); +} + +static inline +void DAC960_LP_WriteHardwareMailbox(void *ControllerBaseAddress, + DAC960_V2_CommandMailbox_T *CommandMailbox) +{ + writel(Virtual_to_Bus(CommandMailbox), + ControllerBaseAddress + DAC960_LP_CommandMailboxBusAddressOffset); +} + +static inline DAC960_V2_CommandIdentifier_T +DAC960_LP_ReadCommandIdentifier(void *ControllerBaseAddress) +{ + return readw(ControllerBaseAddress + DAC960_LP_CommandStatusOffset); +} + +static inline DAC960_V2_CommandStatus_T +DAC960_LP_ReadCommandStatus(void *ControllerBaseAddress) +{ + return readw(ControllerBaseAddress + DAC960_LP_CommandStatusOffset + 2); +} + +static inline boolean +DAC960_LP_ReadErrorStatus(void *ControllerBaseAddress, + unsigned char *ErrorStatus, + unsigned char *Parameter0, + unsigned char *Parameter1) +{ + DAC960_LP_ErrorStatusRegister_T ErrorStatusRegister; + ErrorStatusRegister.All = + readb(ControllerBaseAddress + DAC960_LP_ErrorStatusRegisterOffset); + if (!ErrorStatusRegister.Bits.ErrorStatusPending) return false; + ErrorStatusRegister.Bits.ErrorStatusPending = false; + *ErrorStatus = ErrorStatusRegister.All; + *Parameter0 = + readb(ControllerBaseAddress + DAC960_LP_CommandMailboxBusAddressOffset + 0); + *Parameter1 = + readb(ControllerBaseAddress + DAC960_LP_CommandMailboxBusAddressOffset + 1); + writeb(0xFF, ControllerBaseAddress + DAC960_LP_ErrorStatusRegisterOffset); + return true; } /* - Define the DAC960 V5 Controller Interface Register Offsets. + Define the DAC960 LA Series Controller Interface Register Offsets. */ -#define DAC960_V5_RegisterWindowSize 0x80 +#define DAC960_LA_RegisterWindowSize 0x80 typedef enum { - DAC960_V5_InboundDoorBellRegisterOffset = 0x60, - DAC960_V5_OutboundDoorBellRegisterOffset = 0x61, - DAC960_V5_InterruptMaskRegisterOffset = 0x34, - DAC960_V5_CommandOpcodeRegisterOffset = 0x50, - DAC960_V5_CommandIdentifierRegisterOffset = 0x51, - DAC960_V5_MailboxRegister2Offset = 0x52, - DAC960_V5_MailboxRegister3Offset = 0x53, - DAC960_V5_MailboxRegister4Offset = 0x54, - DAC960_V5_MailboxRegister5Offset = 0x55, - DAC960_V5_MailboxRegister6Offset = 0x56, - DAC960_V5_MailboxRegister7Offset = 0x57, - DAC960_V5_MailboxRegister8Offset = 0x58, - DAC960_V5_MailboxRegister9Offset = 0x59, - DAC960_V5_MailboxRegister10Offset = 0x5A, - DAC960_V5_MailboxRegister11Offset = 0x5B, - DAC960_V5_MailboxRegister12Offset = 0x5C, - DAC960_V5_StatusCommandIdentifierRegOffset = 0x5D, - DAC960_V5_StatusRegisterOffset = 0x5E, - DAC960_V5_ErrorStatusRegisterOffset = 0x63 + DAC960_LA_InboundDoorBellRegisterOffset = 0x60, + DAC960_LA_OutboundDoorBellRegisterOffset = 0x61, + DAC960_LA_InterruptMaskRegisterOffset = 0x34, + DAC960_LA_CommandOpcodeRegisterOffset = 0x50, + DAC960_LA_CommandIdentifierRegisterOffset = 0x51, + DAC960_LA_MailboxRegister2Offset = 0x52, + DAC960_LA_MailboxRegister3Offset = 0x53, + DAC960_LA_MailboxRegister4Offset = 0x54, + DAC960_LA_MailboxRegister5Offset = 0x55, + DAC960_LA_MailboxRegister6Offset = 0x56, + DAC960_LA_MailboxRegister7Offset = 0x57, + DAC960_LA_MailboxRegister8Offset = 0x58, + DAC960_LA_MailboxRegister9Offset = 0x59, + DAC960_LA_MailboxRegister10Offset = 0x5A, + DAC960_LA_MailboxRegister11Offset = 0x5B, + DAC960_LA_MailboxRegister12Offset = 0x5C, + DAC960_LA_StatusCommandIdentifierRegOffset = 0x5D, + DAC960_LA_StatusRegisterOffset = 0x5E, + DAC960_LA_ErrorStatusRegisterOffset = 0x63 } -DAC960_V5_RegisterOffsets_T; +DAC960_LA_RegisterOffsets_T; /* - Define the structure of the DAC960 V5 Inbound Door Bell Register. + Define the structure of the DAC960 LA Series Inbound Door Bell Register. */ -typedef union DAC960_V5_InboundDoorBellRegister +typedef union DAC960_LA_InboundDoorBellRegister { unsigned char All; struct { @@ -1426,14 +3179,14 @@ unsigned char :6; /* Bits 2-7 */ } Read; } -DAC960_V5_InboundDoorBellRegister_T; +DAC960_LA_InboundDoorBellRegister_T; /* - Define the structure of the DAC960 V5 Outbound Door Bell Register. + Define the structure of the DAC960 LA Series Outbound Door Bell Register. */ -typedef union DAC960_V5_OutboundDoorBellRegister +typedef union DAC960_LA_OutboundDoorBellRegister { unsigned char All; struct { @@ -1447,14 +3200,14 @@ unsigned char :6; /* Bits 2-7 */ } Read; } -DAC960_V5_OutboundDoorBellRegister_T; +DAC960_LA_OutboundDoorBellRegister_T; /* - Define the structure of the DAC960 V5 Interrupt Mask Register. + Define the structure of the DAC960 LA Series Interrupt Mask Register. */ -typedef union DAC960_V5_InterruptMaskRegister +typedef union DAC960_LA_InterruptMaskRegister { unsigned char All; struct { @@ -1463,14 +3216,14 @@ unsigned char :5; /* Bits 3-7 */ } Bits; } -DAC960_V5_InterruptMaskRegister_T; +DAC960_LA_InterruptMaskRegister_T; /* - Define the structure of the DAC960 V5 Error Status Register. + Define the structure of the DAC960 LA Series Error Status Register. */ -typedef union DAC960_V5_ErrorStatusRegister +typedef union DAC960_LA_ErrorStatusRegister { unsigned char All; struct { @@ -1479,288 +3232,290 @@ unsigned int :5; /* Bits 3-7 */ } Bits; } -DAC960_V5_ErrorStatusRegister_T; +DAC960_LA_ErrorStatusRegister_T; /* Define inline functions to provide an abstraction for reading and writing the - DAC960 V5 Controller Interface Registers. + DAC960 LA Series Controller Interface Registers. */ static inline -void DAC960_V5_HardwareMailboxNewCommand(void *ControllerBaseAddress) +void DAC960_LA_HardwareMailboxNewCommand(void *ControllerBaseAddress) { - DAC960_V5_InboundDoorBellRegister_T InboundDoorBellRegister; + DAC960_LA_InboundDoorBellRegister_T InboundDoorBellRegister; InboundDoorBellRegister.All = 0; InboundDoorBellRegister.Write.HardwareMailboxNewCommand = true; writeb(InboundDoorBellRegister.All, - ControllerBaseAddress + DAC960_V5_InboundDoorBellRegisterOffset); + ControllerBaseAddress + DAC960_LA_InboundDoorBellRegisterOffset); } static inline -void DAC960_V5_AcknowledgeHardwareMailboxStatus(void *ControllerBaseAddress) +void DAC960_LA_AcknowledgeHardwareMailboxStatus(void *ControllerBaseAddress) { - DAC960_V5_InboundDoorBellRegister_T InboundDoorBellRegister; + DAC960_LA_InboundDoorBellRegister_T InboundDoorBellRegister; InboundDoorBellRegister.All = 0; InboundDoorBellRegister.Write.AcknowledgeHardwareMailboxStatus = true; writeb(InboundDoorBellRegister.All, - ControllerBaseAddress + DAC960_V5_InboundDoorBellRegisterOffset); + ControllerBaseAddress + DAC960_LA_InboundDoorBellRegisterOffset); } static inline -void DAC960_V5_GenerateInterrupt(void *ControllerBaseAddress) +void DAC960_LA_GenerateInterrupt(void *ControllerBaseAddress) { - DAC960_V5_InboundDoorBellRegister_T InboundDoorBellRegister; + DAC960_LA_InboundDoorBellRegister_T InboundDoorBellRegister; InboundDoorBellRegister.All = 0; InboundDoorBellRegister.Write.GenerateInterrupt = true; writeb(InboundDoorBellRegister.All, - ControllerBaseAddress + DAC960_V5_InboundDoorBellRegisterOffset); + ControllerBaseAddress + DAC960_LA_InboundDoorBellRegisterOffset); } static inline -void DAC960_V5_ControllerReset(void *ControllerBaseAddress) +void DAC960_LA_ControllerReset(void *ControllerBaseAddress) { - DAC960_V5_InboundDoorBellRegister_T InboundDoorBellRegister; + DAC960_LA_InboundDoorBellRegister_T InboundDoorBellRegister; InboundDoorBellRegister.All = 0; InboundDoorBellRegister.Write.ControllerReset = true; writeb(InboundDoorBellRegister.All, - ControllerBaseAddress + DAC960_V5_InboundDoorBellRegisterOffset); + ControllerBaseAddress + DAC960_LA_InboundDoorBellRegisterOffset); } static inline -void DAC960_V5_MemoryMailboxNewCommand(void *ControllerBaseAddress) +void DAC960_LA_MemoryMailboxNewCommand(void *ControllerBaseAddress) { - DAC960_V5_InboundDoorBellRegister_T InboundDoorBellRegister; + DAC960_LA_InboundDoorBellRegister_T InboundDoorBellRegister; InboundDoorBellRegister.All = 0; InboundDoorBellRegister.Write.MemoryMailboxNewCommand = true; writeb(InboundDoorBellRegister.All, - ControllerBaseAddress + DAC960_V5_InboundDoorBellRegisterOffset); + ControllerBaseAddress + DAC960_LA_InboundDoorBellRegisterOffset); } static inline -boolean DAC960_V5_HardwareMailboxFullP(void *ControllerBaseAddress) +boolean DAC960_LA_HardwareMailboxFullP(void *ControllerBaseAddress) { - DAC960_V5_InboundDoorBellRegister_T InboundDoorBellRegister; + DAC960_LA_InboundDoorBellRegister_T InboundDoorBellRegister; InboundDoorBellRegister.All = - readb(ControllerBaseAddress + DAC960_V5_InboundDoorBellRegisterOffset); + readb(ControllerBaseAddress + DAC960_LA_InboundDoorBellRegisterOffset); return !InboundDoorBellRegister.Read.HardwareMailboxEmpty; } static inline -boolean DAC960_V5_InitializationInProgressP(void *ControllerBaseAddress) +boolean DAC960_LA_InitializationInProgressP(void *ControllerBaseAddress) { - DAC960_V5_InboundDoorBellRegister_T InboundDoorBellRegister; + DAC960_LA_InboundDoorBellRegister_T InboundDoorBellRegister; InboundDoorBellRegister.All = - readb(ControllerBaseAddress + DAC960_V5_InboundDoorBellRegisterOffset); + readb(ControllerBaseAddress + DAC960_LA_InboundDoorBellRegisterOffset); return !InboundDoorBellRegister.Read.InitializationNotInProgress; } static inline -void DAC960_V5_AcknowledgeHardwareMailboxInterrupt(void *ControllerBaseAddress) +void DAC960_LA_AcknowledgeHardwareMailboxInterrupt(void *ControllerBaseAddress) { - DAC960_V5_OutboundDoorBellRegister_T OutboundDoorBellRegister; + DAC960_LA_OutboundDoorBellRegister_T OutboundDoorBellRegister; OutboundDoorBellRegister.All = 0; OutboundDoorBellRegister.Write.AcknowledgeHardwareMailboxInterrupt = true; writeb(OutboundDoorBellRegister.All, - ControllerBaseAddress + DAC960_V5_OutboundDoorBellRegisterOffset); + ControllerBaseAddress + DAC960_LA_OutboundDoorBellRegisterOffset); } static inline -void DAC960_V5_AcknowledgeMemoryMailboxInterrupt(void *ControllerBaseAddress) +void DAC960_LA_AcknowledgeMemoryMailboxInterrupt(void *ControllerBaseAddress) { - DAC960_V5_OutboundDoorBellRegister_T OutboundDoorBellRegister; + DAC960_LA_OutboundDoorBellRegister_T OutboundDoorBellRegister; OutboundDoorBellRegister.All = 0; OutboundDoorBellRegister.Write.AcknowledgeMemoryMailboxInterrupt = true; writeb(OutboundDoorBellRegister.All, - ControllerBaseAddress + DAC960_V5_OutboundDoorBellRegisterOffset); + ControllerBaseAddress + DAC960_LA_OutboundDoorBellRegisterOffset); } static inline -void DAC960_V5_AcknowledgeInterrupt(void *ControllerBaseAddress) +void DAC960_LA_AcknowledgeInterrupt(void *ControllerBaseAddress) { - DAC960_V5_OutboundDoorBellRegister_T OutboundDoorBellRegister; + DAC960_LA_OutboundDoorBellRegister_T OutboundDoorBellRegister; OutboundDoorBellRegister.All = 0; OutboundDoorBellRegister.Write.AcknowledgeHardwareMailboxInterrupt = true; OutboundDoorBellRegister.Write.AcknowledgeMemoryMailboxInterrupt = true; writeb(OutboundDoorBellRegister.All, - ControllerBaseAddress + DAC960_V5_OutboundDoorBellRegisterOffset); + ControllerBaseAddress + DAC960_LA_OutboundDoorBellRegisterOffset); } static inline -boolean DAC960_V5_HardwareMailboxStatusAvailableP(void *ControllerBaseAddress) +boolean DAC960_LA_HardwareMailboxStatusAvailableP(void *ControllerBaseAddress) { - DAC960_V5_OutboundDoorBellRegister_T OutboundDoorBellRegister; + DAC960_LA_OutboundDoorBellRegister_T OutboundDoorBellRegister; OutboundDoorBellRegister.All = - readb(ControllerBaseAddress + DAC960_V5_OutboundDoorBellRegisterOffset); + readb(ControllerBaseAddress + DAC960_LA_OutboundDoorBellRegisterOffset); return OutboundDoorBellRegister.Read.HardwareMailboxStatusAvailable; } static inline -boolean DAC960_V5_MemoryMailboxStatusAvailableP(void *ControllerBaseAddress) +boolean DAC960_LA_MemoryMailboxStatusAvailableP(void *ControllerBaseAddress) { - DAC960_V5_OutboundDoorBellRegister_T OutboundDoorBellRegister; + DAC960_LA_OutboundDoorBellRegister_T OutboundDoorBellRegister; OutboundDoorBellRegister.All = - readb(ControllerBaseAddress + DAC960_V5_OutboundDoorBellRegisterOffset); + readb(ControllerBaseAddress + DAC960_LA_OutboundDoorBellRegisterOffset); return OutboundDoorBellRegister.Read.MemoryMailboxStatusAvailable; } static inline -void DAC960_V5_EnableInterrupts(void *ControllerBaseAddress) +void DAC960_LA_EnableInterrupts(void *ControllerBaseAddress) { - DAC960_V5_InterruptMaskRegister_T InterruptMaskRegister; + DAC960_LA_InterruptMaskRegister_T InterruptMaskRegister; InterruptMaskRegister.All = 0xFF; InterruptMaskRegister.Bits.DisableInterrupts = false; writeb(InterruptMaskRegister.All, - ControllerBaseAddress + DAC960_V5_InterruptMaskRegisterOffset); + ControllerBaseAddress + DAC960_LA_InterruptMaskRegisterOffset); } static inline -void DAC960_V5_DisableInterrupts(void *ControllerBaseAddress) +void DAC960_LA_DisableInterrupts(void *ControllerBaseAddress) { - DAC960_V5_InterruptMaskRegister_T InterruptMaskRegister; + DAC960_LA_InterruptMaskRegister_T InterruptMaskRegister; InterruptMaskRegister.All = 0xFF; InterruptMaskRegister.Bits.DisableInterrupts = true; writeb(InterruptMaskRegister.All, - ControllerBaseAddress + DAC960_V5_InterruptMaskRegisterOffset); + ControllerBaseAddress + DAC960_LA_InterruptMaskRegisterOffset); } static inline -boolean DAC960_V5_InterruptsEnabledP(void *ControllerBaseAddress) +boolean DAC960_LA_InterruptsEnabledP(void *ControllerBaseAddress) { - DAC960_V5_InterruptMaskRegister_T InterruptMaskRegister; + DAC960_LA_InterruptMaskRegister_T InterruptMaskRegister; InterruptMaskRegister.All = - readb(ControllerBaseAddress + DAC960_V5_InterruptMaskRegisterOffset); + readb(ControllerBaseAddress + DAC960_LA_InterruptMaskRegisterOffset); return !InterruptMaskRegister.Bits.DisableInterrupts; } static inline -void DAC960_V5_WriteCommandMailbox(DAC960_CommandMailbox_T *NextCommandMailbox, - DAC960_CommandMailbox_T *CommandMailbox) -{ - NextCommandMailbox->Words[1] = CommandMailbox->Words[1]; - NextCommandMailbox->Words[2] = CommandMailbox->Words[2]; - NextCommandMailbox->Words[3] = CommandMailbox->Words[3]; +void DAC960_LA_WriteCommandMailbox(DAC960_V1_CommandMailbox_T + *MemoryCommandMailbox, + DAC960_V1_CommandMailbox_T + *CommandMailbox) +{ + MemoryCommandMailbox->Words[1] = CommandMailbox->Words[1]; + MemoryCommandMailbox->Words[2] = CommandMailbox->Words[2]; + MemoryCommandMailbox->Words[3] = CommandMailbox->Words[3]; wmb(); - NextCommandMailbox->Words[0] = CommandMailbox->Words[0]; + MemoryCommandMailbox->Words[0] = CommandMailbox->Words[0]; mb(); } static inline -void DAC960_V5_WriteHardwareMailbox(void *ControllerBaseAddress, - DAC960_CommandMailbox_T *CommandMailbox) +void DAC960_LA_WriteHardwareMailbox(void *ControllerBaseAddress, + DAC960_V1_CommandMailbox_T *CommandMailbox) { writel(CommandMailbox->Words[0], - ControllerBaseAddress + DAC960_V5_CommandOpcodeRegisterOffset); + ControllerBaseAddress + DAC960_LA_CommandOpcodeRegisterOffset); writel(CommandMailbox->Words[1], - ControllerBaseAddress + DAC960_V5_MailboxRegister4Offset); + ControllerBaseAddress + DAC960_LA_MailboxRegister4Offset); writel(CommandMailbox->Words[2], - ControllerBaseAddress + DAC960_V5_MailboxRegister8Offset); + ControllerBaseAddress + DAC960_LA_MailboxRegister8Offset); writeb(CommandMailbox->Bytes[12], - ControllerBaseAddress + DAC960_V5_MailboxRegister12Offset); + ControllerBaseAddress + DAC960_LA_MailboxRegister12Offset); } -static inline DAC960_CommandIdentifier_T -DAC960_V5_ReadStatusCommandIdentifier(void *ControllerBaseAddress) +static inline DAC960_V1_CommandIdentifier_T +DAC960_LA_ReadStatusCommandIdentifier(void *ControllerBaseAddress) { return readb(ControllerBaseAddress - + DAC960_V5_StatusCommandIdentifierRegOffset); + + DAC960_LA_StatusCommandIdentifierRegOffset); } -static inline DAC960_CommandStatus_T -DAC960_V5_ReadStatusRegister(void *ControllerBaseAddress) +static inline DAC960_V1_CommandStatus_T +DAC960_LA_ReadStatusRegister(void *ControllerBaseAddress) { - return readw(ControllerBaseAddress + DAC960_V5_StatusRegisterOffset); + return readw(ControllerBaseAddress + DAC960_LA_StatusRegisterOffset); } static inline boolean -DAC960_V5_ReadErrorStatus(void *ControllerBaseAddress, +DAC960_LA_ReadErrorStatus(void *ControllerBaseAddress, unsigned char *ErrorStatus, unsigned char *Parameter0, unsigned char *Parameter1) { - DAC960_V5_ErrorStatusRegister_T ErrorStatusRegister; + DAC960_LA_ErrorStatusRegister_T ErrorStatusRegister; ErrorStatusRegister.All = - readb(ControllerBaseAddress + DAC960_V5_ErrorStatusRegisterOffset); + readb(ControllerBaseAddress + DAC960_LA_ErrorStatusRegisterOffset); if (!ErrorStatusRegister.Bits.ErrorStatusPending) return false; ErrorStatusRegister.Bits.ErrorStatusPending = false; *ErrorStatus = ErrorStatusRegister.All; *Parameter0 = - readb(ControllerBaseAddress + DAC960_V5_CommandOpcodeRegisterOffset); + readb(ControllerBaseAddress + DAC960_LA_CommandOpcodeRegisterOffset); *Parameter1 = - readb(ControllerBaseAddress + DAC960_V5_CommandIdentifierRegisterOffset); - writeb(0xFF, ControllerBaseAddress + DAC960_V5_ErrorStatusRegisterOffset); + readb(ControllerBaseAddress + DAC960_LA_CommandIdentifierRegisterOffset); + writeb(0xFF, ControllerBaseAddress + DAC960_LA_ErrorStatusRegisterOffset); return true; } static inline -void DAC960_V5_SaveMemoryMailboxInfo(DAC960_Controller_T *Controller) +void DAC960_LA_SaveMemoryMailboxInfo(DAC960_Controller_T *Controller) { void *ControllerBaseAddress = Controller->BaseAddress; writel(0x743C485E, - ControllerBaseAddress + DAC960_V5_CommandOpcodeRegisterOffset); - writel((unsigned long) Controller->FirstCommandMailbox, - ControllerBaseAddress + DAC960_V5_MailboxRegister4Offset); - writew(Controller->NextCommandMailbox - Controller->FirstCommandMailbox, - ControllerBaseAddress + DAC960_V5_MailboxRegister8Offset); - writew(Controller->NextStatusMailbox - Controller->FirstStatusMailbox, - ControllerBaseAddress + DAC960_V5_MailboxRegister10Offset); + ControllerBaseAddress + DAC960_LA_CommandOpcodeRegisterOffset); + writel((unsigned long) Controller->V1.FirstCommandMailbox, + ControllerBaseAddress + DAC960_LA_MailboxRegister4Offset); + writew(Controller->V1.NextCommandMailbox - Controller->V1.FirstCommandMailbox, + ControllerBaseAddress + DAC960_LA_MailboxRegister8Offset); + writew(Controller->V1.NextStatusMailbox - Controller->V1.FirstStatusMailbox, + ControllerBaseAddress + DAC960_LA_MailboxRegister10Offset); } static inline -void DAC960_V5_RestoreMemoryMailboxInfo(DAC960_Controller_T *Controller, +void DAC960_LA_RestoreMemoryMailboxInfo(DAC960_Controller_T *Controller, void **MemoryMailboxAddress, short *NextCommandMailboxIndex, short *NextStatusMailboxIndex) { void *ControllerBaseAddress = Controller->BaseAddress; if (readl(ControllerBaseAddress - + DAC960_V5_CommandOpcodeRegisterOffset) != 0x743C485E) + + DAC960_LA_CommandOpcodeRegisterOffset) != 0x743C485E) return; *MemoryMailboxAddress = - (void *) readl(ControllerBaseAddress + DAC960_V5_MailboxRegister4Offset); + (void *) readl(ControllerBaseAddress + DAC960_LA_MailboxRegister4Offset); *NextCommandMailboxIndex = - readw(ControllerBaseAddress + DAC960_V5_MailboxRegister8Offset); + readw(ControllerBaseAddress + DAC960_LA_MailboxRegister8Offset); *NextStatusMailboxIndex = - readw(ControllerBaseAddress + DAC960_V5_MailboxRegister10Offset); + readw(ControllerBaseAddress + DAC960_LA_MailboxRegister10Offset); } /* - Define the DAC960 V4 Controller Interface Register Offsets. + Define the DAC960 PG Series Controller Interface Register Offsets. */ -#define DAC960_V4_RegisterWindowSize 0x2000 +#define DAC960_PG_RegisterWindowSize 0x2000 typedef enum { - DAC960_V4_InboundDoorBellRegisterOffset = 0x0020, - DAC960_V4_OutboundDoorBellRegisterOffset = 0x002C, - DAC960_V4_InterruptMaskRegisterOffset = 0x0034, - DAC960_V4_CommandOpcodeRegisterOffset = 0x1000, - DAC960_V4_CommandIdentifierRegisterOffset = 0x1001, - DAC960_V4_MailboxRegister2Offset = 0x1002, - DAC960_V4_MailboxRegister3Offset = 0x1003, - DAC960_V4_MailboxRegister4Offset = 0x1004, - DAC960_V4_MailboxRegister5Offset = 0x1005, - DAC960_V4_MailboxRegister6Offset = 0x1006, - DAC960_V4_MailboxRegister7Offset = 0x1007, - DAC960_V4_MailboxRegister8Offset = 0x1008, - DAC960_V4_MailboxRegister9Offset = 0x1009, - DAC960_V4_MailboxRegister10Offset = 0x100A, - DAC960_V4_MailboxRegister11Offset = 0x100B, - DAC960_V4_MailboxRegister12Offset = 0x100C, - DAC960_V4_StatusCommandIdentifierRegOffset = 0x1018, - DAC960_V4_StatusRegisterOffset = 0x101A, - DAC960_V4_ErrorStatusRegisterOffset = 0x103F + DAC960_PG_InboundDoorBellRegisterOffset = 0x0020, + DAC960_PG_OutboundDoorBellRegisterOffset = 0x002C, + DAC960_PG_InterruptMaskRegisterOffset = 0x0034, + DAC960_PG_CommandOpcodeRegisterOffset = 0x1000, + DAC960_PG_CommandIdentifierRegisterOffset = 0x1001, + DAC960_PG_MailboxRegister2Offset = 0x1002, + DAC960_PG_MailboxRegister3Offset = 0x1003, + DAC960_PG_MailboxRegister4Offset = 0x1004, + DAC960_PG_MailboxRegister5Offset = 0x1005, + DAC960_PG_MailboxRegister6Offset = 0x1006, + DAC960_PG_MailboxRegister7Offset = 0x1007, + DAC960_PG_MailboxRegister8Offset = 0x1008, + DAC960_PG_MailboxRegister9Offset = 0x1009, + DAC960_PG_MailboxRegister10Offset = 0x100A, + DAC960_PG_MailboxRegister11Offset = 0x100B, + DAC960_PG_MailboxRegister12Offset = 0x100C, + DAC960_PG_StatusCommandIdentifierRegOffset = 0x1018, + DAC960_PG_StatusRegisterOffset = 0x101A, + DAC960_PG_ErrorStatusRegisterOffset = 0x103F } -DAC960_V4_RegisterOffsets_T; +DAC960_PG_RegisterOffsets_T; /* - Define the structure of the DAC960 V4 Inbound Door Bell Register. + Define the structure of the DAC960 PG Series Inbound Door Bell Register. */ -typedef union DAC960_V4_InboundDoorBellRegister +typedef union DAC960_PG_InboundDoorBellRegister { unsigned int All; struct { @@ -1777,14 +3532,14 @@ unsigned int :30; /* Bits 2-31 */ } Read; } -DAC960_V4_InboundDoorBellRegister_T; +DAC960_PG_InboundDoorBellRegister_T; /* - Define the structure of the DAC960 V4 Outbound Door Bell Register. + Define the structure of the DAC960 PG Series Outbound Door Bell Register. */ -typedef union DAC960_V4_OutboundDoorBellRegister +typedef union DAC960_PG_OutboundDoorBellRegister { unsigned int All; struct { @@ -1798,14 +3553,14 @@ unsigned int :30; /* Bits 2-31 */ } Read; } -DAC960_V4_OutboundDoorBellRegister_T; +DAC960_PG_OutboundDoorBellRegister_T; /* - Define the structure of the DAC960 V4 Interrupt Mask Register. + Define the structure of the DAC960 PG Series Interrupt Mask Register. */ -typedef union DAC960_V4_InterruptMaskRegister +typedef union DAC960_PG_InterruptMaskRegister { unsigned int All; struct { @@ -1815,14 +3570,14 @@ unsigned int Reserved0:24; /* Bits 8-31 */ } Bits; } -DAC960_V4_InterruptMaskRegister_T; +DAC960_PG_InterruptMaskRegister_T; /* - Define the structure of the DAC960 V4 Error Status Register. + Define the structure of the DAC960 PG Series Error Status Register. */ -typedef union DAC960_V4_ErrorStatusRegister +typedef union DAC960_PG_ErrorStatusRegister { unsigned char All; struct { @@ -1831,292 +3586,294 @@ unsigned int :5; /* Bits 3-7 */ } Bits; } -DAC960_V4_ErrorStatusRegister_T; +DAC960_PG_ErrorStatusRegister_T; /* Define inline functions to provide an abstraction for reading and writing the - DAC960 V4 Controller Interface Registers. + DAC960 PG Series Controller Interface Registers. */ static inline -void DAC960_V4_HardwareMailboxNewCommand(void *ControllerBaseAddress) +void DAC960_PG_HardwareMailboxNewCommand(void *ControllerBaseAddress) { - DAC960_V4_InboundDoorBellRegister_T InboundDoorBellRegister; + DAC960_PG_InboundDoorBellRegister_T InboundDoorBellRegister; InboundDoorBellRegister.All = 0; InboundDoorBellRegister.Write.HardwareMailboxNewCommand = true; writel(InboundDoorBellRegister.All, - ControllerBaseAddress + DAC960_V4_InboundDoorBellRegisterOffset); + ControllerBaseAddress + DAC960_PG_InboundDoorBellRegisterOffset); } static inline -void DAC960_V4_AcknowledgeHardwareMailboxStatus(void *ControllerBaseAddress) +void DAC960_PG_AcknowledgeHardwareMailboxStatus(void *ControllerBaseAddress) { - DAC960_V4_InboundDoorBellRegister_T InboundDoorBellRegister; + DAC960_PG_InboundDoorBellRegister_T InboundDoorBellRegister; InboundDoorBellRegister.All = 0; InboundDoorBellRegister.Write.AcknowledgeHardwareMailboxStatus = true; writel(InboundDoorBellRegister.All, - ControllerBaseAddress + DAC960_V4_InboundDoorBellRegisterOffset); + ControllerBaseAddress + DAC960_PG_InboundDoorBellRegisterOffset); } static inline -void DAC960_V4_GenerateInterrupt(void *ControllerBaseAddress) +void DAC960_PG_GenerateInterrupt(void *ControllerBaseAddress) { - DAC960_V4_InboundDoorBellRegister_T InboundDoorBellRegister; + DAC960_PG_InboundDoorBellRegister_T InboundDoorBellRegister; InboundDoorBellRegister.All = 0; InboundDoorBellRegister.Write.GenerateInterrupt = true; writel(InboundDoorBellRegister.All, - ControllerBaseAddress + DAC960_V4_InboundDoorBellRegisterOffset); + ControllerBaseAddress + DAC960_PG_InboundDoorBellRegisterOffset); } static inline -void DAC960_V4_ControllerReset(void *ControllerBaseAddress) +void DAC960_PG_ControllerReset(void *ControllerBaseAddress) { - DAC960_V4_InboundDoorBellRegister_T InboundDoorBellRegister; + DAC960_PG_InboundDoorBellRegister_T InboundDoorBellRegister; InboundDoorBellRegister.All = 0; InboundDoorBellRegister.Write.ControllerReset = true; writel(InboundDoorBellRegister.All, - ControllerBaseAddress + DAC960_V4_InboundDoorBellRegisterOffset); + ControllerBaseAddress + DAC960_PG_InboundDoorBellRegisterOffset); } static inline -void DAC960_V4_MemoryMailboxNewCommand(void *ControllerBaseAddress) +void DAC960_PG_MemoryMailboxNewCommand(void *ControllerBaseAddress) { - DAC960_V4_InboundDoorBellRegister_T InboundDoorBellRegister; + DAC960_PG_InboundDoorBellRegister_T InboundDoorBellRegister; InboundDoorBellRegister.All = 0; InboundDoorBellRegister.Write.MemoryMailboxNewCommand = true; writel(InboundDoorBellRegister.All, - ControllerBaseAddress + DAC960_V4_InboundDoorBellRegisterOffset); + ControllerBaseAddress + DAC960_PG_InboundDoorBellRegisterOffset); } static inline -boolean DAC960_V4_HardwareMailboxFullP(void *ControllerBaseAddress) +boolean DAC960_PG_HardwareMailboxFullP(void *ControllerBaseAddress) { - DAC960_V4_InboundDoorBellRegister_T InboundDoorBellRegister; + DAC960_PG_InboundDoorBellRegister_T InboundDoorBellRegister; InboundDoorBellRegister.All = - readl(ControllerBaseAddress + DAC960_V4_InboundDoorBellRegisterOffset); + readl(ControllerBaseAddress + DAC960_PG_InboundDoorBellRegisterOffset); return InboundDoorBellRegister.Read.HardwareMailboxFull; } static inline -boolean DAC960_V4_InitializationInProgressP(void *ControllerBaseAddress) +boolean DAC960_PG_InitializationInProgressP(void *ControllerBaseAddress) { - DAC960_V4_InboundDoorBellRegister_T InboundDoorBellRegister; + DAC960_PG_InboundDoorBellRegister_T InboundDoorBellRegister; InboundDoorBellRegister.All = - readl(ControllerBaseAddress + DAC960_V4_InboundDoorBellRegisterOffset); + readl(ControllerBaseAddress + DAC960_PG_InboundDoorBellRegisterOffset); return InboundDoorBellRegister.Read.InitializationInProgress; } static inline -void DAC960_V4_AcknowledgeHardwareMailboxInterrupt(void *ControllerBaseAddress) +void DAC960_PG_AcknowledgeHardwareMailboxInterrupt(void *ControllerBaseAddress) { - DAC960_V4_OutboundDoorBellRegister_T OutboundDoorBellRegister; + DAC960_PG_OutboundDoorBellRegister_T OutboundDoorBellRegister; OutboundDoorBellRegister.All = 0; OutboundDoorBellRegister.Write.AcknowledgeHardwareMailboxInterrupt = true; writel(OutboundDoorBellRegister.All, - ControllerBaseAddress + DAC960_V4_OutboundDoorBellRegisterOffset); + ControllerBaseAddress + DAC960_PG_OutboundDoorBellRegisterOffset); } static inline -void DAC960_V4_AcknowledgeMemoryMailboxInterrupt(void *ControllerBaseAddress) +void DAC960_PG_AcknowledgeMemoryMailboxInterrupt(void *ControllerBaseAddress) { - DAC960_V4_OutboundDoorBellRegister_T OutboundDoorBellRegister; + DAC960_PG_OutboundDoorBellRegister_T OutboundDoorBellRegister; OutboundDoorBellRegister.All = 0; OutboundDoorBellRegister.Write.AcknowledgeMemoryMailboxInterrupt = true; writel(OutboundDoorBellRegister.All, - ControllerBaseAddress + DAC960_V4_OutboundDoorBellRegisterOffset); + ControllerBaseAddress + DAC960_PG_OutboundDoorBellRegisterOffset); } static inline -void DAC960_V4_AcknowledgeInterrupt(void *ControllerBaseAddress) +void DAC960_PG_AcknowledgeInterrupt(void *ControllerBaseAddress) { - DAC960_V4_OutboundDoorBellRegister_T OutboundDoorBellRegister; + DAC960_PG_OutboundDoorBellRegister_T OutboundDoorBellRegister; OutboundDoorBellRegister.All = 0; OutboundDoorBellRegister.Write.AcknowledgeHardwareMailboxInterrupt = true; OutboundDoorBellRegister.Write.AcknowledgeMemoryMailboxInterrupt = true; writel(OutboundDoorBellRegister.All, - ControllerBaseAddress + DAC960_V4_OutboundDoorBellRegisterOffset); + ControllerBaseAddress + DAC960_PG_OutboundDoorBellRegisterOffset); } static inline -boolean DAC960_V4_HardwareMailboxStatusAvailableP(void *ControllerBaseAddress) +boolean DAC960_PG_HardwareMailboxStatusAvailableP(void *ControllerBaseAddress) { - DAC960_V4_OutboundDoorBellRegister_T OutboundDoorBellRegister; + DAC960_PG_OutboundDoorBellRegister_T OutboundDoorBellRegister; OutboundDoorBellRegister.All = - readl(ControllerBaseAddress + DAC960_V4_OutboundDoorBellRegisterOffset); + readl(ControllerBaseAddress + DAC960_PG_OutboundDoorBellRegisterOffset); return OutboundDoorBellRegister.Read.HardwareMailboxStatusAvailable; } static inline -boolean DAC960_V4_MemoryMailboxStatusAvailableP(void *ControllerBaseAddress) +boolean DAC960_PG_MemoryMailboxStatusAvailableP(void *ControllerBaseAddress) { - DAC960_V4_OutboundDoorBellRegister_T OutboundDoorBellRegister; + DAC960_PG_OutboundDoorBellRegister_T OutboundDoorBellRegister; OutboundDoorBellRegister.All = - readl(ControllerBaseAddress + DAC960_V4_OutboundDoorBellRegisterOffset); + readl(ControllerBaseAddress + DAC960_PG_OutboundDoorBellRegisterOffset); return OutboundDoorBellRegister.Read.MemoryMailboxStatusAvailable; } static inline -void DAC960_V4_EnableInterrupts(void *ControllerBaseAddress) +void DAC960_PG_EnableInterrupts(void *ControllerBaseAddress) { - DAC960_V4_InterruptMaskRegister_T InterruptMaskRegister; + DAC960_PG_InterruptMaskRegister_T InterruptMaskRegister; InterruptMaskRegister.All = 0; InterruptMaskRegister.Bits.MessageUnitInterruptMask1 = 0x3; InterruptMaskRegister.Bits.DisableInterrupts = false; InterruptMaskRegister.Bits.MessageUnitInterruptMask2 = 0x1F; writel(InterruptMaskRegister.All, - ControllerBaseAddress + DAC960_V4_InterruptMaskRegisterOffset); + ControllerBaseAddress + DAC960_PG_InterruptMaskRegisterOffset); } static inline -void DAC960_V4_DisableInterrupts(void *ControllerBaseAddress) +void DAC960_PG_DisableInterrupts(void *ControllerBaseAddress) { - DAC960_V4_InterruptMaskRegister_T InterruptMaskRegister; + DAC960_PG_InterruptMaskRegister_T InterruptMaskRegister; InterruptMaskRegister.All = 0; InterruptMaskRegister.Bits.MessageUnitInterruptMask1 = 0x3; InterruptMaskRegister.Bits.DisableInterrupts = true; InterruptMaskRegister.Bits.MessageUnitInterruptMask2 = 0x1F; writel(InterruptMaskRegister.All, - ControllerBaseAddress + DAC960_V4_InterruptMaskRegisterOffset); + ControllerBaseAddress + DAC960_PG_InterruptMaskRegisterOffset); } static inline -boolean DAC960_V4_InterruptsEnabledP(void *ControllerBaseAddress) +boolean DAC960_PG_InterruptsEnabledP(void *ControllerBaseAddress) { - DAC960_V4_InterruptMaskRegister_T InterruptMaskRegister; + DAC960_PG_InterruptMaskRegister_T InterruptMaskRegister; InterruptMaskRegister.All = - readl(ControllerBaseAddress + DAC960_V4_InterruptMaskRegisterOffset); + readl(ControllerBaseAddress + DAC960_PG_InterruptMaskRegisterOffset); return !InterruptMaskRegister.Bits.DisableInterrupts; } static inline -void DAC960_V4_WriteCommandMailbox(DAC960_CommandMailbox_T *NextCommandMailbox, - DAC960_CommandMailbox_T *CommandMailbox) -{ - NextCommandMailbox->Words[1] = CommandMailbox->Words[1]; - NextCommandMailbox->Words[2] = CommandMailbox->Words[2]; - NextCommandMailbox->Words[3] = CommandMailbox->Words[3]; +void DAC960_PG_WriteCommandMailbox(DAC960_V1_CommandMailbox_T + *MemoryCommandMailbox, + DAC960_V1_CommandMailbox_T + *CommandMailbox) +{ + MemoryCommandMailbox->Words[1] = CommandMailbox->Words[1]; + MemoryCommandMailbox->Words[2] = CommandMailbox->Words[2]; + MemoryCommandMailbox->Words[3] = CommandMailbox->Words[3]; wmb(); - NextCommandMailbox->Words[0] = CommandMailbox->Words[0]; + MemoryCommandMailbox->Words[0] = CommandMailbox->Words[0]; mb(); } static inline -void DAC960_V4_WriteHardwareMailbox(void *ControllerBaseAddress, - DAC960_CommandMailbox_T *CommandMailbox) +void DAC960_PG_WriteHardwareMailbox(void *ControllerBaseAddress, + DAC960_V1_CommandMailbox_T *CommandMailbox) { writel(CommandMailbox->Words[0], - ControllerBaseAddress + DAC960_V4_CommandOpcodeRegisterOffset); + ControllerBaseAddress + DAC960_PG_CommandOpcodeRegisterOffset); writel(CommandMailbox->Words[1], - ControllerBaseAddress + DAC960_V4_MailboxRegister4Offset); + ControllerBaseAddress + DAC960_PG_MailboxRegister4Offset); writel(CommandMailbox->Words[2], - ControllerBaseAddress + DAC960_V4_MailboxRegister8Offset); + ControllerBaseAddress + DAC960_PG_MailboxRegister8Offset); writeb(CommandMailbox->Bytes[12], - ControllerBaseAddress + DAC960_V4_MailboxRegister12Offset); + ControllerBaseAddress + DAC960_PG_MailboxRegister12Offset); } -static inline DAC960_CommandIdentifier_T -DAC960_V4_ReadStatusCommandIdentifier(void *ControllerBaseAddress) +static inline DAC960_V1_CommandIdentifier_T +DAC960_PG_ReadStatusCommandIdentifier(void *ControllerBaseAddress) { return readb(ControllerBaseAddress - + DAC960_V4_StatusCommandIdentifierRegOffset); + + DAC960_PG_StatusCommandIdentifierRegOffset); } -static inline DAC960_CommandStatus_T -DAC960_V4_ReadStatusRegister(void *ControllerBaseAddress) +static inline DAC960_V1_CommandStatus_T +DAC960_PG_ReadStatusRegister(void *ControllerBaseAddress) { - return readw(ControllerBaseAddress + DAC960_V4_StatusRegisterOffset); + return readw(ControllerBaseAddress + DAC960_PG_StatusRegisterOffset); } static inline boolean -DAC960_V4_ReadErrorStatus(void *ControllerBaseAddress, +DAC960_PG_ReadErrorStatus(void *ControllerBaseAddress, unsigned char *ErrorStatus, unsigned char *Parameter0, unsigned char *Parameter1) { - DAC960_V4_ErrorStatusRegister_T ErrorStatusRegister; + DAC960_PG_ErrorStatusRegister_T ErrorStatusRegister; ErrorStatusRegister.All = - readb(ControllerBaseAddress + DAC960_V4_ErrorStatusRegisterOffset); + readb(ControllerBaseAddress + DAC960_PG_ErrorStatusRegisterOffset); if (!ErrorStatusRegister.Bits.ErrorStatusPending) return false; ErrorStatusRegister.Bits.ErrorStatusPending = false; *ErrorStatus = ErrorStatusRegister.All; *Parameter0 = - readb(ControllerBaseAddress + DAC960_V4_CommandOpcodeRegisterOffset); + readb(ControllerBaseAddress + DAC960_PG_CommandOpcodeRegisterOffset); *Parameter1 = - readb(ControllerBaseAddress + DAC960_V4_CommandIdentifierRegisterOffset); - writeb(0, ControllerBaseAddress + DAC960_V4_ErrorStatusRegisterOffset); + readb(ControllerBaseAddress + DAC960_PG_CommandIdentifierRegisterOffset); + writeb(0, ControllerBaseAddress + DAC960_PG_ErrorStatusRegisterOffset); return true; } static inline -void DAC960_V4_SaveMemoryMailboxInfo(DAC960_Controller_T *Controller) +void DAC960_PG_SaveMemoryMailboxInfo(DAC960_Controller_T *Controller) { void *ControllerBaseAddress = Controller->BaseAddress; writel(0x743C485E, - ControllerBaseAddress + DAC960_V4_CommandOpcodeRegisterOffset); - writel((unsigned long) Controller->FirstCommandMailbox, - ControllerBaseAddress + DAC960_V4_MailboxRegister4Offset); - writew(Controller->NextCommandMailbox - Controller->FirstCommandMailbox, - ControllerBaseAddress + DAC960_V4_MailboxRegister8Offset); - writew(Controller->NextStatusMailbox - Controller->FirstStatusMailbox, - ControllerBaseAddress + DAC960_V4_MailboxRegister10Offset); + ControllerBaseAddress + DAC960_PG_CommandOpcodeRegisterOffset); + writel((unsigned long) Controller->V1.FirstCommandMailbox, + ControllerBaseAddress + DAC960_PG_MailboxRegister4Offset); + writew(Controller->V1.NextCommandMailbox - Controller->V1.FirstCommandMailbox, + ControllerBaseAddress + DAC960_PG_MailboxRegister8Offset); + writew(Controller->V1.NextStatusMailbox - Controller->V1.FirstStatusMailbox, + ControllerBaseAddress + DAC960_PG_MailboxRegister10Offset); } static inline -void DAC960_V4_RestoreMemoryMailboxInfo(DAC960_Controller_T *Controller, +void DAC960_PG_RestoreMemoryMailboxInfo(DAC960_Controller_T *Controller, void **MemoryMailboxAddress, short *NextCommandMailboxIndex, short *NextStatusMailboxIndex) { void *ControllerBaseAddress = Controller->BaseAddress; if (readl(ControllerBaseAddress - + DAC960_V4_CommandOpcodeRegisterOffset) != 0x743C485E) + + DAC960_PG_CommandOpcodeRegisterOffset) != 0x743C485E) return; *MemoryMailboxAddress = - (void *) readl(ControllerBaseAddress + DAC960_V4_MailboxRegister4Offset); + (void *) readl(ControllerBaseAddress + DAC960_PG_MailboxRegister4Offset); *NextCommandMailboxIndex = - readw(ControllerBaseAddress + DAC960_V4_MailboxRegister8Offset); + readw(ControllerBaseAddress + DAC960_PG_MailboxRegister8Offset); *NextStatusMailboxIndex = - readw(ControllerBaseAddress + DAC960_V4_MailboxRegister10Offset); + readw(ControllerBaseAddress + DAC960_PG_MailboxRegister10Offset); } /* - Define the DAC960 V3 Controller Interface Register Offsets. + Define the DAC960 PD Series Controller Interface Register Offsets. */ -#define DAC960_V3_RegisterWindowSize 0x80 +#define DAC960_PD_RegisterWindowSize 0x80 typedef enum { - DAC960_V3_CommandOpcodeRegisterOffset = 0x00, - DAC960_V3_CommandIdentifierRegisterOffset = 0x01, - DAC960_V3_MailboxRegister2Offset = 0x02, - DAC960_V3_MailboxRegister3Offset = 0x03, - DAC960_V3_MailboxRegister4Offset = 0x04, - DAC960_V3_MailboxRegister5Offset = 0x05, - DAC960_V3_MailboxRegister6Offset = 0x06, - DAC960_V3_MailboxRegister7Offset = 0x07, - DAC960_V3_MailboxRegister8Offset = 0x08, - DAC960_V3_MailboxRegister9Offset = 0x09, - DAC960_V3_MailboxRegister10Offset = 0x0A, - DAC960_V3_MailboxRegister11Offset = 0x0B, - DAC960_V3_MailboxRegister12Offset = 0x0C, - DAC960_V3_StatusCommandIdentifierRegOffset = 0x0D, - DAC960_V3_StatusRegisterOffset = 0x0E, - DAC960_V3_ErrorStatusRegisterOffset = 0x3F, - DAC960_V3_InboundDoorBellRegisterOffset = 0x40, - DAC960_V3_OutboundDoorBellRegisterOffset = 0x41, - DAC960_V3_InterruptEnableRegisterOffset = 0x43 + DAC960_PD_CommandOpcodeRegisterOffset = 0x00, + DAC960_PD_CommandIdentifierRegisterOffset = 0x01, + DAC960_PD_MailboxRegister2Offset = 0x02, + DAC960_PD_MailboxRegister3Offset = 0x03, + DAC960_PD_MailboxRegister4Offset = 0x04, + DAC960_PD_MailboxRegister5Offset = 0x05, + DAC960_PD_MailboxRegister6Offset = 0x06, + DAC960_PD_MailboxRegister7Offset = 0x07, + DAC960_PD_MailboxRegister8Offset = 0x08, + DAC960_PD_MailboxRegister9Offset = 0x09, + DAC960_PD_MailboxRegister10Offset = 0x0A, + DAC960_PD_MailboxRegister11Offset = 0x0B, + DAC960_PD_MailboxRegister12Offset = 0x0C, + DAC960_PD_StatusCommandIdentifierRegOffset = 0x0D, + DAC960_PD_StatusRegisterOffset = 0x0E, + DAC960_PD_ErrorStatusRegisterOffset = 0x3F, + DAC960_PD_InboundDoorBellRegisterOffset = 0x40, + DAC960_PD_OutboundDoorBellRegisterOffset = 0x41, + DAC960_PD_InterruptEnableRegisterOffset = 0x43 } -DAC960_V3_RegisterOffsets_T; +DAC960_PD_RegisterOffsets_T; /* - Define the structure of the DAC960 V3 Inbound Door Bell Register. + Define the structure of the DAC960 PD Series Inbound Door Bell Register. */ -typedef union DAC960_V3_InboundDoorBellRegister +typedef union DAC960_PD_InboundDoorBellRegister { unsigned char All; struct { @@ -2132,14 +3889,14 @@ unsigned char :6; /* Bits 2-7 */ } Read; } -DAC960_V3_InboundDoorBellRegister_T; +DAC960_PD_InboundDoorBellRegister_T; /* - Define the structure of the DAC960 V3 Outbound Door Bell Register. + Define the structure of the DAC960 PD Series Outbound Door Bell Register. */ -typedef union DAC960_V3_OutboundDoorBellRegister +typedef union DAC960_PD_OutboundDoorBellRegister { unsigned char All; struct { @@ -2151,14 +3908,14 @@ unsigned char :7; /* Bits 1-7 */ } Read; } -DAC960_V3_OutboundDoorBellRegister_T; +DAC960_PD_OutboundDoorBellRegister_T; /* - Define the structure of the DAC960 V3 Interrupt Enable Register. + Define the structure of the DAC960 PD Series Interrupt Enable Register. */ -typedef union DAC960_V3_InterruptEnableRegister +typedef union DAC960_PD_InterruptEnableRegister { unsigned char All; struct { @@ -2166,14 +3923,14 @@ unsigned char :7; /* Bits 1-7 */ } Bits; } -DAC960_V3_InterruptEnableRegister_T; +DAC960_PD_InterruptEnableRegister_T; /* - Define the structure of the DAC960 V3 Error Status Register. + Define the structure of the DAC960 PD Series Error Status Register. */ -typedef union DAC960_V3_ErrorStatusRegister +typedef union DAC960_PD_ErrorStatusRegister { unsigned char All; struct { @@ -2182,187 +3939,176 @@ unsigned int :5; /* Bits 3-7 */ } Bits; } -DAC960_V3_ErrorStatusRegister_T; +DAC960_PD_ErrorStatusRegister_T; /* Define inline functions to provide an abstraction for reading and writing the - DAC960 V3 Controller Interface Registers. + DAC960 PD Series Controller Interface Registers. */ static inline -void DAC960_V3_NewCommand(void *ControllerBaseAddress) +void DAC960_PD_NewCommand(void *ControllerBaseAddress) { - DAC960_V3_InboundDoorBellRegister_T InboundDoorBellRegister; + DAC960_PD_InboundDoorBellRegister_T InboundDoorBellRegister; InboundDoorBellRegister.All = 0; InboundDoorBellRegister.Write.NewCommand = true; writeb(InboundDoorBellRegister.All, - ControllerBaseAddress + DAC960_V3_InboundDoorBellRegisterOffset); + ControllerBaseAddress + DAC960_PD_InboundDoorBellRegisterOffset); } static inline -void DAC960_V3_AcknowledgeStatus(void *ControllerBaseAddress) +void DAC960_PD_AcknowledgeStatus(void *ControllerBaseAddress) { - DAC960_V3_InboundDoorBellRegister_T InboundDoorBellRegister; + DAC960_PD_InboundDoorBellRegister_T InboundDoorBellRegister; InboundDoorBellRegister.All = 0; InboundDoorBellRegister.Write.AcknowledgeStatus = true; writeb(InboundDoorBellRegister.All, - ControllerBaseAddress + DAC960_V3_InboundDoorBellRegisterOffset); + ControllerBaseAddress + DAC960_PD_InboundDoorBellRegisterOffset); } static inline -void DAC960_V3_GenerateInterrupt(void *ControllerBaseAddress) +void DAC960_PD_GenerateInterrupt(void *ControllerBaseAddress) { - DAC960_V3_InboundDoorBellRegister_T InboundDoorBellRegister; + DAC960_PD_InboundDoorBellRegister_T InboundDoorBellRegister; InboundDoorBellRegister.All = 0; InboundDoorBellRegister.Write.GenerateInterrupt = true; writeb(InboundDoorBellRegister.All, - ControllerBaseAddress + DAC960_V3_InboundDoorBellRegisterOffset); + ControllerBaseAddress + DAC960_PD_InboundDoorBellRegisterOffset); } static inline -void DAC960_V3_ControllerReset(void *ControllerBaseAddress) +void DAC960_PD_ControllerReset(void *ControllerBaseAddress) { - DAC960_V3_InboundDoorBellRegister_T InboundDoorBellRegister; + DAC960_PD_InboundDoorBellRegister_T InboundDoorBellRegister; InboundDoorBellRegister.All = 0; InboundDoorBellRegister.Write.ControllerReset = true; writeb(InboundDoorBellRegister.All, - ControllerBaseAddress + DAC960_V3_InboundDoorBellRegisterOffset); + ControllerBaseAddress + DAC960_PD_InboundDoorBellRegisterOffset); } static inline -boolean DAC960_V3_MailboxFullP(void *ControllerBaseAddress) +boolean DAC960_PD_MailboxFullP(void *ControllerBaseAddress) { - DAC960_V3_InboundDoorBellRegister_T InboundDoorBellRegister; + DAC960_PD_InboundDoorBellRegister_T InboundDoorBellRegister; InboundDoorBellRegister.All = - readb(ControllerBaseAddress + DAC960_V3_InboundDoorBellRegisterOffset); + readb(ControllerBaseAddress + DAC960_PD_InboundDoorBellRegisterOffset); return InboundDoorBellRegister.Read.MailboxFull; } static inline -boolean DAC960_V3_InitializationInProgressP(void *ControllerBaseAddress) +boolean DAC960_PD_InitializationInProgressP(void *ControllerBaseAddress) { - DAC960_V3_InboundDoorBellRegister_T InboundDoorBellRegister; + DAC960_PD_InboundDoorBellRegister_T InboundDoorBellRegister; InboundDoorBellRegister.All = - readb(ControllerBaseAddress + DAC960_V3_InboundDoorBellRegisterOffset); + readb(ControllerBaseAddress + DAC960_PD_InboundDoorBellRegisterOffset); return InboundDoorBellRegister.Read.InitializationInProgress; } static inline -void DAC960_V3_AcknowledgeInterrupt(void *ControllerBaseAddress) +void DAC960_PD_AcknowledgeInterrupt(void *ControllerBaseAddress) { - DAC960_V3_OutboundDoorBellRegister_T OutboundDoorBellRegister; + DAC960_PD_OutboundDoorBellRegister_T OutboundDoorBellRegister; OutboundDoorBellRegister.All = 0; OutboundDoorBellRegister.Write.AcknowledgeInterrupt = true; writeb(OutboundDoorBellRegister.All, - ControllerBaseAddress + DAC960_V3_OutboundDoorBellRegisterOffset); + ControllerBaseAddress + DAC960_PD_OutboundDoorBellRegisterOffset); } static inline -boolean DAC960_V3_StatusAvailableP(void *ControllerBaseAddress) +boolean DAC960_PD_StatusAvailableP(void *ControllerBaseAddress) { - DAC960_V3_OutboundDoorBellRegister_T OutboundDoorBellRegister; + DAC960_PD_OutboundDoorBellRegister_T OutboundDoorBellRegister; OutboundDoorBellRegister.All = - readb(ControllerBaseAddress + DAC960_V3_OutboundDoorBellRegisterOffset); + readb(ControllerBaseAddress + DAC960_PD_OutboundDoorBellRegisterOffset); return OutboundDoorBellRegister.Read.StatusAvailable; } static inline -void DAC960_V3_EnableInterrupts(void *ControllerBaseAddress) +void DAC960_PD_EnableInterrupts(void *ControllerBaseAddress) { - DAC960_V3_InterruptEnableRegister_T InterruptEnableRegister; + DAC960_PD_InterruptEnableRegister_T InterruptEnableRegister; InterruptEnableRegister.All = 0; InterruptEnableRegister.Bits.EnableInterrupts = true; writeb(InterruptEnableRegister.All, - ControllerBaseAddress + DAC960_V3_InterruptEnableRegisterOffset); + ControllerBaseAddress + DAC960_PD_InterruptEnableRegisterOffset); } static inline -void DAC960_V3_DisableInterrupts(void *ControllerBaseAddress) +void DAC960_PD_DisableInterrupts(void *ControllerBaseAddress) { - DAC960_V3_InterruptEnableRegister_T InterruptEnableRegister; + DAC960_PD_InterruptEnableRegister_T InterruptEnableRegister; InterruptEnableRegister.All = 0; InterruptEnableRegister.Bits.EnableInterrupts = false; writeb(InterruptEnableRegister.All, - ControllerBaseAddress + DAC960_V3_InterruptEnableRegisterOffset); + ControllerBaseAddress + DAC960_PD_InterruptEnableRegisterOffset); } static inline -boolean DAC960_V3_InterruptsEnabledP(void *ControllerBaseAddress) +boolean DAC960_PD_InterruptsEnabledP(void *ControllerBaseAddress) { - DAC960_V3_InterruptEnableRegister_T InterruptEnableRegister; + DAC960_PD_InterruptEnableRegister_T InterruptEnableRegister; InterruptEnableRegister.All = - readb(ControllerBaseAddress + DAC960_V3_InterruptEnableRegisterOffset); + readb(ControllerBaseAddress + DAC960_PD_InterruptEnableRegisterOffset); return InterruptEnableRegister.Bits.EnableInterrupts; } static inline -void DAC960_V3_WriteCommandMailbox(void *ControllerBaseAddress, - DAC960_CommandMailbox_T *CommandMailbox) +void DAC960_PD_WriteCommandMailbox(void *ControllerBaseAddress, + DAC960_V1_CommandMailbox_T *CommandMailbox) { writel(CommandMailbox->Words[0], - ControllerBaseAddress + DAC960_V3_CommandOpcodeRegisterOffset); + ControllerBaseAddress + DAC960_PD_CommandOpcodeRegisterOffset); writel(CommandMailbox->Words[1], - ControllerBaseAddress + DAC960_V3_MailboxRegister4Offset); + ControllerBaseAddress + DAC960_PD_MailboxRegister4Offset); writel(CommandMailbox->Words[2], - ControllerBaseAddress + DAC960_V3_MailboxRegister8Offset); + ControllerBaseAddress + DAC960_PD_MailboxRegister8Offset); writeb(CommandMailbox->Bytes[12], - ControllerBaseAddress + DAC960_V3_MailboxRegister12Offset); + ControllerBaseAddress + DAC960_PD_MailboxRegister12Offset); } -static inline DAC960_CommandIdentifier_T -DAC960_V3_ReadStatusCommandIdentifier(void *ControllerBaseAddress) +static inline DAC960_V1_CommandIdentifier_T +DAC960_PD_ReadStatusCommandIdentifier(void *ControllerBaseAddress) { return readb(ControllerBaseAddress - + DAC960_V3_StatusCommandIdentifierRegOffset); + + DAC960_PD_StatusCommandIdentifierRegOffset); } -static inline DAC960_CommandStatus_T -DAC960_V3_ReadStatusRegister(void *ControllerBaseAddress) +static inline DAC960_V1_CommandStatus_T +DAC960_PD_ReadStatusRegister(void *ControllerBaseAddress) { - return readw(ControllerBaseAddress + DAC960_V3_StatusRegisterOffset); + return readw(ControllerBaseAddress + DAC960_PD_StatusRegisterOffset); } static inline boolean -DAC960_V3_ReadErrorStatus(void *ControllerBaseAddress, +DAC960_PD_ReadErrorStatus(void *ControllerBaseAddress, unsigned char *ErrorStatus, unsigned char *Parameter0, unsigned char *Parameter1) { - DAC960_V3_ErrorStatusRegister_T ErrorStatusRegister; + DAC960_PD_ErrorStatusRegister_T ErrorStatusRegister; ErrorStatusRegister.All = - readb(ControllerBaseAddress + DAC960_V3_ErrorStatusRegisterOffset); + readb(ControllerBaseAddress + DAC960_PD_ErrorStatusRegisterOffset); if (!ErrorStatusRegister.Bits.ErrorStatusPending) return false; ErrorStatusRegister.Bits.ErrorStatusPending = false; *ErrorStatus = ErrorStatusRegister.All; *Parameter0 = - readb(ControllerBaseAddress + DAC960_V3_CommandOpcodeRegisterOffset); + readb(ControllerBaseAddress + DAC960_PD_CommandOpcodeRegisterOffset); *Parameter1 = - readb(ControllerBaseAddress + DAC960_V3_CommandIdentifierRegisterOffset); - writeb(0, ControllerBaseAddress + DAC960_V3_ErrorStatusRegisterOffset); + readb(ControllerBaseAddress + DAC960_PD_CommandIdentifierRegisterOffset); + writeb(0, ControllerBaseAddress + DAC960_PD_ErrorStatusRegisterOffset); return true; } /* - Define compatibility macros between Linux 2.0 and Linux 2.1. -*/ - -#if LINUX_VERSION_CODE < 0x20100 - -#define MODULE_PARM(Variable, Type) -#define ioremap_nocache(Offset, Size) vremap(Offset, Size) -#define iounmap(Address) vfree(Address) - -#endif - - -/* Define prototypes for the forward referenced DAC960 Driver Internal Functions. */ static void DAC960_FinalizeController(DAC960_Controller_T *); static int DAC960_Finalize(NotifierBlock_T *, unsigned long, void *); +static void DAC960_V1_QueueReadWriteCommand(DAC960_Command_T *); +static void DAC960_V2_QueueReadWriteCommand(DAC960_Command_T *); static void DAC960_RequestFunction0(void); static void DAC960_RequestFunction1(void); static void DAC960_RequestFunction2(void); @@ -2371,15 +4117,20 @@ static void DAC960_RequestFunction5(void); static void DAC960_RequestFunction6(void); static void DAC960_RequestFunction7(void); -static void DAC960_InterruptHandler(int, void *, Registers_T *); -static void DAC960_QueueMonitoringCommand(DAC960_Command_T *); +static void DAC960_BA_InterruptHandler(int, void *, Registers_T *); +static void DAC960_LP_InterruptHandler(int, void *, Registers_T *); +static void DAC960_LA_InterruptHandler(int, void *, Registers_T *); +static void DAC960_PG_InterruptHandler(int, void *, Registers_T *); +static void DAC960_PD_InterruptHandler(int, void *, Registers_T *); +static void DAC960_V1_QueueMonitoringCommand(DAC960_Command_T *); +static void DAC960_V2_QueueMonitoringCommand(DAC960_Command_T *); static void DAC960_MonitoringTimerFunction(unsigned long); static int DAC960_Open(Inode_T *, File_T *); static int DAC960_Release(Inode_T *, File_T *); static int DAC960_IOCTL(Inode_T *, File_T *, unsigned int, unsigned long); static int DAC960_UserIOCTL(Inode_T *, File_T *, unsigned int, unsigned long); static void DAC960_InitializeGenericDiskInfo(GenericDiskInfo_T *); -static void DAC960_Message(DAC960_MessageLevel_T, char *, +static void DAC960_Message(DAC960_MessageLevel_T, unsigned char *, DAC960_Controller_T *, ...); static void DAC960_CreateProcEntries(void); static void DAC960_DestroyProcEntries(void); Index: oldkernel/linux/drivers/block/Makefile diff -u linux/drivers/block/Makefile:1.2 linux/drivers/block/Makefile:1.3 --- linux/drivers/block/Makefile:1.2 Thu Jun 1 14:51:28 2000 +++ linux/drivers/block/Makefile Fri Jul 7 15:36:42 2000 @@ -322,6 +322,14 @@ endif endif +ifeq ($(CONFIG_BLK_DEV_3WARE), y) + LX_OBJS += 3w-xxxx.o +else + ifeq ($(CONFIG_BLK_DEV_3WARE), m) + MX_OBJS += 3w-xxxx.o + endif +endif + include $(TOPDIR)/Rules.make ide-mod.o: ide.o $(IDE_OBJS) Index: oldkernel/linux/drivers/block/ide.c diff -u linux/drivers/block/ide.c:1.1.1.1 linux/drivers/block/ide.c:1.2 --- linux/drivers/block/ide.c:1.1.1.1 Wed May 31 12:33:50 2000 +++ linux/drivers/block/ide.c Fri Jul 7 15:36:42 2000 @@ -2285,6 +2285,10 @@ drive->nice1 = (arg >> IDE_NICE_1) & 1; return 0; + case BLKELVGET: + case BLKELVSET: + return blkelv_ioctl(inode->i_rdev, cmd, arg); + RO_IOCTLS(inode->i_rdev, arg); default: Index: oldkernel/linux/drivers/block/ll_rw_blk.c diff -u linux/drivers/block/ll_rw_blk.c:1.3 linux/drivers/block/ll_rw_blk.c:1.4 --- linux/drivers/block/ll_rw_blk.c:1.3 Thu Jun 1 17:02:44 2000 +++ linux/drivers/block/ll_rw_blk.c Fri Jul 7 15:36:42 2000 @@ -3,6 +3,7 @@ * * Copyright (C) 1991, 1992 Linus Torvalds * Copyright (C) 1994, Karl Keyte: Added support for disk statistics + * Elevator latency, (C) 2000 Andrea Arcangeli SuSE */ /* @@ -20,6 +21,7 @@ #include #include +#include #include #include @@ -148,6 +150,17 @@ return &blk_dev[major].current_request; } +static inline int get_request_latency(elevator_t * elevator, int rw) +{ + int latency; + + latency = elevator->read_latency; + if (rw != READ) + latency = elevator->write_latency; + + return latency; +} + /* * remove the plug and let it rip.. */ @@ -328,6 +341,196 @@ } } +static int blkelvget_ioctl(elevator_t * elevator, blkelv_ioctl_arg_t * arg) +{ + int ret; + blkelv_ioctl_arg_t output; + + output.queue_ID = elevator; + output.read_latency = elevator->read_latency; + output.write_latency = elevator->write_latency; + output.max_bomb_segments = elevator->max_bomb_segments; + + ret = -EFAULT; + if (copy_to_user(arg, &output, sizeof(blkelv_ioctl_arg_t))) + goto out; + ret = 0; + out: + return ret; +} + +static int blkelvset_ioctl(elevator_t * elevator, const blkelv_ioctl_arg_t * arg) +{ + blkelv_ioctl_arg_t input; + int ret; + + ret = -EFAULT; + if (copy_from_user(&input, arg, sizeof(blkelv_ioctl_arg_t))) + goto out; + + ret = -EINVAL; + if (input.read_latency < 0) + goto out; + if (input.write_latency < 0) + goto out; + if (input.max_bomb_segments <= 0) + goto out; + + elevator->read_latency = input.read_latency; + elevator->write_latency = input.write_latency; + elevator->max_bomb_segments = input.max_bomb_segments; + + ret = 0; + out: + return ret; +} + +int blkelv_ioctl(kdev_t dev, unsigned long cmd, unsigned long arg) +{ + elevator_t * elevator = &blk_dev[MAJOR(dev)].elevator; + blkelv_ioctl_arg_t * __arg = (blkelv_ioctl_arg_t *) arg; + + switch (cmd) { + case BLKELVGET: + return blkelvget_ioctl(elevator, __arg); + case BLKELVSET: + return blkelvset_ioctl(elevator, __arg); + } +} + +static inline int seek_to_not_starving_chunk(struct request ** req, int * lat) +{ + struct request * tmp = *req; + int found = 0, pos = 0; + int last_pos = 0, __lat = *lat; + + do { + if (tmp->elevator_latency <= 0) + { + *req = tmp; + found = 1; + last_pos = pos; + if (last_pos >= __lat) + break; + } + pos += tmp->nr_segments; + } while ((tmp = tmp->next)); + *lat -= last_pos; + + return found; +} + +#define CASE_COALESCE_BUT_FIRST_REQUEST_MAYBE_BUSY \ + case IDE0_MAJOR: /* same as HD_MAJOR */ \ + case IDE1_MAJOR: \ + case FLOPPY_MAJOR: \ + case IDE2_MAJOR: \ + case IDE3_MAJOR: \ + case IDE4_MAJOR: \ + case IDE5_MAJOR: \ + case ACSI_MAJOR: \ + case MFM_ACORN_MAJOR: \ + case MDISK_MAJOR: \ + case DASD_MAJOR: +#define CASE_COALESCE_ALSO_FIRST_REQUEST \ + case SCSI_DISK0_MAJOR: \ + case SCSI_DISK1_MAJOR: \ + case SCSI_DISK2_MAJOR: \ + case SCSI_DISK3_MAJOR: \ + case SCSI_DISK4_MAJOR: \ + case SCSI_DISK5_MAJOR: \ + case SCSI_DISK6_MAJOR: \ + case SCSI_DISK7_MAJOR: \ + case SCSI_CDROM_MAJOR: \ + case DAC960_MAJOR+0: \ + case DAC960_MAJOR+1: \ + case DAC960_MAJOR+2: \ + case DAC960_MAJOR+3: \ + case DAC960_MAJOR+4: \ + case DAC960_MAJOR+5: \ + case DAC960_MAJOR+6: \ + case DAC960_MAJOR+7: \ + case COMPAQ_SMART2_MAJOR+0: \ + case COMPAQ_SMART2_MAJOR+1: \ + case COMPAQ_SMART2_MAJOR+2: \ + case COMPAQ_SMART2_MAJOR+3: \ + case COMPAQ_SMART2_MAJOR+4: \ + case COMPAQ_SMART2_MAJOR+5: \ + case COMPAQ_SMART2_MAJOR+6: \ + case COMPAQ_SMART2_MAJOR+7: + +#define elevator_starve_rest_of_queue(req) \ +do { \ + struct request * tmp = (req); \ + for ((tmp) = (tmp)->next; (tmp); (tmp) = (tmp)->next) \ + (tmp)->elevator_latency--; \ +} while (0) + +static inline void elevator_queue(struct request * req, + struct request * tmp, + int latency, + struct blk_dev_struct * dev, + struct request ** queue_head) +{ + struct request * __tmp; + int starving, __latency; + + starving = seek_to_not_starving_chunk(&tmp, &latency); + __tmp = tmp; + __latency = latency; + + for (;; tmp = tmp->next) + { + if ((latency -= tmp->nr_segments) <= 0) + { + tmp = __tmp; + latency = __latency - tmp->nr_segments; + + if (starving) + break; + + switch (MAJOR(req->rq_dev)) + { + CASE_COALESCE_BUT_FIRST_REQUEST_MAYBE_BUSY + if (tmp == dev->current_request) + default: + goto link; + CASE_COALESCE_ALSO_FIRST_REQUEST + } + + latency += tmp->nr_segments; + req->next = tmp; + *queue_head = req; + goto after_link; + } + + if (!tmp->next) + break; + + { + const int after_current = IN_ORDER(tmp,req); + const int before_next = IN_ORDER(req,tmp->next); + + if (!IN_ORDER(tmp,tmp->next)) { + if (after_current || before_next) + break; + } else { + if (after_current && before_next) + break; + } + } + } + + link: + req->next = tmp->next; + tmp->next = req; + + after_link: + req->elevator_latency = latency; + + elevator_starve_rest_of_queue(req); +} + /* * add-request adds a request to the linked list. * It disables interrupts (aquires the request spinlock) so that it can muck @@ -346,6 +549,7 @@ short disk_index; unsigned long flags; int queue_new_request = 0; + int latency; switch (major) { case DAC960_MAJOR+0: @@ -370,7 +574,7 @@ break; } - req->next = NULL; + latency = get_request_latency(&dev->elevator, req->cmd); /* * We use the goto to reduce locking complexity @@ -381,28 +585,17 @@ if (req->bh) mark_buffer_clean(req->bh); if (!(tmp = *current_request)) { + req->next = NULL; + req->elevator_latency = latency; *current_request = req; if (dev->current_request != &dev->plug) queue_new_request = 1; goto out; - } - for ( ; tmp->next ; tmp = tmp->next) { - const int after_current = IN_ORDER(tmp,req); - const int before_next = IN_ORDER(req,tmp->next); - - if (!IN_ORDER(tmp,tmp->next)) { - if (after_current || before_next) - break; - } else { - if (after_current && before_next) - break; - } } - req->next = tmp->next; - tmp->next = req; + elevator_queue(req, tmp, latency, dev, current_request); /* for SCSI devices, call request_fn unconditionally */ - if (scsi_blk_major(major) || + if ((0 && scsi_blk_major(major)) || (major >= DAC960_MAJOR+0 && major <= DAC960_MAJOR+7) || (major >= COMPAQ_SMART2_MAJOR+0 && major <= COMPAQ_SMART2_MAJOR+7)) @@ -436,6 +629,8 @@ total_segments--; if (total_segments > max_segments) return; + if (next->elevator_latency < req->elevator_latency) + req->elevator_latency = next->elevator_latency; req->bhtail->b_reqnext = next->bh; req->bhtail = next->bhtail; req->nr_sectors += next->nr_sectors; @@ -445,12 +640,28 @@ wake_up (&wait_for_request); } +#define read_pendings(req) \ +({ \ + int __ret = 0; \ + struct request * tmp = (req); \ + do { \ + if (tmp->cmd == READ) \ + { \ + __ret = 1; \ + break; \ + } \ + tmp = tmp->next; \ + } while (tmp); \ + __ret; \ +}) + void make_request(kdev_t dev, int rw, struct buffer_head * bh) { unsigned int sector, count; - struct request * req; + struct request * req, * prev; int rw_ahead, max_req, max_sectors, max_segments; unsigned long flags; + int latency, starving; int major, minor; major = MAJOR (dev); @@ -535,6 +746,8 @@ max_sectors = get_max_sectors(bh->b_rdev); max_segments = get_max_segments(bh->b_rdev); + latency = get_request_latency(&blk_dev[major].elevator, rw); + /* * Now we acquire the request spinlock, we have to be mega careful * not to schedule or do something nonatomic @@ -547,17 +760,7 @@ major != DDV_MAJOR && major != NBD_MAJOR) plug_device(blk_dev + major); /* is atomic */ } else switch (major) { - case IDE0_MAJOR: /* same as HD_MAJOR */ - case IDE1_MAJOR: - case FLOPPY_MAJOR: - case IDE2_MAJOR: - case IDE3_MAJOR: - case IDE4_MAJOR: - case IDE5_MAJOR: - case ACSI_MAJOR: - case MFM_ACORN_MAJOR: - case MDISK_MAJOR: - case DASD_MAJOR: + CASE_COALESCE_BUT_FIRST_REQUEST_MAYBE_BUSY /* * The scsi disk and cdrom drivers completely remove the request * from the queue when they start processing an entry. For this @@ -568,37 +771,20 @@ * entry may be busy being processed and we thus can't change it. */ if (req == blk_dev[major].current_request) - req = req->next; - if (!req) - break; + { + if (!(req = req->next)) + break; + latency -= req->nr_segments; + } /* fall through */ + CASE_COALESCE_ALSO_FIRST_REQUEST - case SCSI_DISK0_MAJOR: - case SCSI_DISK1_MAJOR: - case SCSI_DISK2_MAJOR: - case SCSI_DISK3_MAJOR: - case SCSI_DISK4_MAJOR: - case SCSI_DISK5_MAJOR: - case SCSI_DISK6_MAJOR: - case SCSI_DISK7_MAJOR: - case SCSI_CDROM_MAJOR: - case DAC960_MAJOR+0: - case DAC960_MAJOR+1: - case DAC960_MAJOR+2: - case DAC960_MAJOR+3: - case DAC960_MAJOR+4: - case DAC960_MAJOR+5: - case DAC960_MAJOR+6: - case DAC960_MAJOR+7: - case COMPAQ_SMART2_MAJOR+0: - case COMPAQ_SMART2_MAJOR+1: - case COMPAQ_SMART2_MAJOR+2: - case COMPAQ_SMART2_MAJOR+3: - case COMPAQ_SMART2_MAJOR+4: - case COMPAQ_SMART2_MAJOR+5: - case COMPAQ_SMART2_MAJOR+6: - case COMPAQ_SMART2_MAJOR+7: + /* avoid write-bombs to not hurt iteractiveness of reads */ + if (rw != READ && read_pendings(req)) + max_segments = blk_dev[major].elevator.max_bomb_segments; + starving = seek_to_not_starving_chunk(&req, &latency); + prev = NULL; do { if (req->sem) continue; @@ -610,24 +796,34 @@ continue; /* Can we add it to the end of this request? */ if (req->sector + req->nr_sectors == sector) { + if (latency - req->nr_segments < 0) + break; if (req->bhtail->b_data + req->bhtail->b_size != bh->b_data) { if (req->nr_segments < max_segments) req->nr_segments++; - else continue; + else break; } req->bhtail->b_reqnext = bh; req->bhtail = bh; req->nr_sectors += count; + + /* latency stuff */ + if ((latency -= req->nr_segments) < req->elevator_latency) + req->elevator_latency = latency; + elevator_starve_rest_of_queue(req); + /* Can we now merge this req with the next? */ attempt_merge(req, max_sectors, max_segments); /* or to the beginning? */ } else if (req->sector - count == sector) { + if (!prev && starving) + break; if (bh->b_data + bh->b_size != req->bh->b_data) { if (req->nr_segments < max_segments) req->nr_segments++; - else continue; + else break; } bh->b_reqnext = req->bh; req->bh = bh; @@ -635,6 +831,14 @@ req->current_nr_sectors = count; req->sector = sector; req->nr_sectors += count; + + /* latency stuff */ + if (latency < --req->elevator_latency) + req->elevator_latency = latency; + elevator_starve_rest_of_queue(req); + + if (prev) + attempt_merge(prev, max_sectors, max_segments); } else continue; @@ -642,7 +846,8 @@ spin_unlock_irqrestore(&io_request_lock,flags); return; - } while ((req = req->next) != NULL); + } while (prev = req, + (latency -= req->nr_segments) >= 0 && (req = req->next) != NULL); } /* find an unused request. */ @@ -668,7 +873,6 @@ req->sem = NULL; req->bh = bh; req->bhtail = bh; - req->next = NULL; add_request(major+blk_dev,req); return; @@ -837,12 +1041,12 @@ dev->plug_tq.sync = 0; dev->plug_tq.routine = &unplug_device; dev->plug_tq.data = dev; + dev->elevator = ELEVATOR_DEFAULTS; } req = all_requests + NR_REQUEST; while (--req >= all_requests) { req->rq_status = RQ_INACTIVE; - req->next = NULL; } memset(ro_bits,0,sizeof(ro_bits)); memset(max_readahead, 0, sizeof(max_readahead)); Index: oldkernel/linux/drivers/block/loop.c diff -u linux/drivers/block/loop.c:1.3 linux/drivers/block/loop.c:1.4 --- linux/drivers/block/loop.c:1.3 Thu Jun 1 15:46:10 2000 +++ linux/drivers/block/loop.c Fri Jul 7 15:36:42 2000 @@ -143,12 +143,12 @@ int size; if (S_ISREG(lo->lo_dentry->d_inode->i_mode)) - size = (lo->lo_dentry->d_inode->i_size - lo->lo_offset) >> BLOCK_SIZE_BITS; + size = (lo->lo_dentry->d_inode->i_size - lo->lo_offset) / BLOCK_SIZE; else { kdev_t lodev = lo->lo_device; if (blk_size[MAJOR(lodev)]) size = blk_size[MAJOR(lodev)][MINOR(lodev)] - - (lo->lo_offset >> BLOCK_SIZE_BITS); + lo->lo_offset / BLOCK_SIZE; else size = MAX_DISK_SIZE; } Index: oldkernel/linux/drivers/block/md.c diff -u linux/drivers/block/md.c:1.3 linux/drivers/block/md.c:1.4 --- linux/drivers/block/md.c:1.3 Thu Jun 1 17:03:15 2000 +++ linux/drivers/block/md.c Fri Jul 7 15:36:42 2000 @@ -827,16 +827,16 @@ int ret; mdp_super_t *tmp1, *tmp2; - tmp1 = kmalloc(sizeof(*tmp1),GFP_KERNEL); - tmp2 = kmalloc(sizeof(*tmp2),GFP_KERNEL); + tmp1 = kmalloc(MD_SB_BYTES,GFP_KERNEL); + tmp2 = kmalloc(MD_SB_BYTES,GFP_KERNEL); if (!tmp1 || !tmp2) { ret = 0; goto abort; } - *tmp1 = *sb1; - *tmp2 = *sb2; + memcpy(tmp1, sb1, MD_SB_BYTES); + memcpy(tmp2, sb2, MD_SB_BYTES); /* * nr_disks is not constant @@ -985,7 +985,7 @@ if (rdev->faulty) continue; sb = rdev->sb; - *sb = *mddev->sb; + memcpy(sb, mddev->sb, MD_SB_BYTES); set_this_disk(mddev, rdev); sb->sb_csum = calc_sb_csum(sb); } @@ -1249,7 +1249,7 @@ printk(OUT_OF_DATE); printk("freshest: %s\n", partition_name(freshest->dev)); } - memcpy (sb, freshest->sb, sizeof(*sb)); + memcpy (sb, freshest->sb, MD_SB_BYTES); /* * at this point we have picked the 'best' superblock Index: oldkernel/linux/drivers/block/xor.c diff -u linux/drivers/block/xor.c:1.2 linux/drivers/block/xor.c:1.3 --- linux/drivers/block/xor.c:1.2 Thu Jun 1 15:06:21 2000 +++ linux/drivers/block/xor.c Fri Jul 7 15:36:42 2000 @@ -22,10 +22,6 @@ #include #include #endif -#ifdef __i386__ -#include -#include -#endif /* * we use the 'XOR function template' to register multiple xor @@ -70,7 +66,7 @@ #ifdef __i386__ -#ifdef CONFIG_X86_CPU_OPTIMIZATIONS +#ifdef CONFIG_X86_XMM /* * Cache avoiding checksumming functions utilizing KNI instructions * Copyright (C) 1999 Zach Brown (with obvious credit due Ingo) @@ -78,13 +74,21 @@ XORBLOCK_TEMPLATE(pIII_kni) { - char xmm_space[64]; - int lines = (bh_ptr[0]->b_size>>8); - int recursive = 0; - unsigned long flags; + char xmm_save[16*4]; + int cr0; + int lines = (bh_ptr[0]->b_size>>8); + + __asm__ __volatile__ ( + "movl %%cr0,%0 ;\n\t" + "clts ;\n\t" + "movups %%xmm0,(%1) ;\n\t" + "movups %%xmm1,0x10(%1) ;\n\t" + "movups %%xmm2,0x20(%1) ;\n\t" + "movups %%xmm3,0x30(%1) ;\n\t" + : "=r" (cr0) + : "r" (xmm_save) + : "memory" ); - kernel_take_fpu_kni(recursive,&xmm_space[0],NULL,flags); - #define OFFS(x) "8*("#x"*2)" #define PF0(x) \ " prefetcht0 "OFFS(x)"(%1) ;\n" @@ -153,7 +157,7 @@ " jnz 1b ;\n" : - : "m" (lines), + : "r" (lines), "r" (bh_ptr[0]->b_data), "r" (bh_ptr[1]->b_data) : "memory" ); @@ -203,7 +207,7 @@ " decl %0 ;\n" " jnz 1b ;\n" : - : "m" (lines), + : "r" (lines), "r" (bh_ptr[0]->b_data), "r" (bh_ptr[1]->b_data), "r" (bh_ptr[2]->b_data) @@ -262,7 +266,7 @@ " jnz 1b ;\n" : - : "m" (lines), + : "r" (lines), "r" (bh_ptr[0]->b_data), "r" (bh_ptr[1]->b_data), "r" (bh_ptr[2]->b_data), @@ -329,7 +333,7 @@ " jnz 1b ;\n" : - : "m" (lines), + : "r" (lines), "r" (bh_ptr[0]->b_data), "r" (bh_ptr[1]->b_data), "r" (bh_ptr[2]->b_data), @@ -339,7 +343,16 @@ break; } - kernel_release_fpu_kni(recursive,&xmm_space[0],flags); + __asm__ __volatile__ ( + "sfence ;\n\t" + "movups (%1),%%xmm0 ;\n\t" + "movups 0x10(%1),%%xmm1 ;\n\t" + "movups 0x20(%1),%%xmm2 ;\n\t" + "movups 0x30(%1),%%xmm3 ;\n\t" + "movl %0,%%cr0 ;\n\t" + : + : "r" (cr0), "r" (xmm_save) + : "memory" ); } #undef OFFS @@ -358,7 +371,7 @@ #undef XO5 #undef BLOCK -#endif /* CONFIG_X86_CPU_OPTIMIZATIONS */ +#endif /* CONFIG_X86_XMM */ /* * high-speed RAID5 checksumming functions utilizing MMX instructions @@ -366,12 +379,13 @@ */ XORBLOCK_TEMPLATE(pII_mmx) { + char fpu_save[108]; int lines = (bh_ptr[0]->b_size>>7); - char mmx_space[32]; - int recursive = 0; - unsigned long flags; + + if (!(current->flags & PF_USEDFPU)) + __asm__ __volatile__ ( " clts;\n"); - kernel_take_fpu_mmx(recursive,&mmx_space[0],NULL,flags); + __asm__ __volatile__ ( " fsave %0; fwait\n"::"m"(fpu_save[0]) ); #define LD(x,y) \ " movq 8*("#x")(%1), %%mm"#y" ;\n" @@ -417,7 +431,7 @@ " decl %0 ;\n" " jnz 1b ;\n" : - : "m" (lines), + : "r" (lines), "r" (bh_ptr[0]->b_data), "r" (bh_ptr[1]->b_data) : "memory"); @@ -457,7 +471,7 @@ " decl %0 ;\n" " jnz 1b ;\n" : - : "m" (lines), + : "r" (lines), "r" (bh_ptr[0]->b_data), "r" (bh_ptr[1]->b_data), "r" (bh_ptr[2]->b_data) @@ -503,7 +517,7 @@ " decl %0 ;\n" " jnz 1b ;\n" : - : "m" (lines), + : "r" (lines), "r" (bh_ptr[0]->b_data), "r" (bh_ptr[1]->b_data), "r" (bh_ptr[2]->b_data), @@ -555,7 +569,7 @@ " decl %0 ;\n" " jnz 1b ;\n" : - : "m" (lines), + : "r" (lines), "r" (bh_ptr[0]->b_data), "r" (bh_ptr[1]->b_data), "r" (bh_ptr[2]->b_data), @@ -565,7 +579,10 @@ break; } - kernel_release_fpu_mmx(recursive,&mmx_space[0],flags); + __asm__ __volatile__ ( " frstor %0;\n"::"m"(fpu_save[0]) ); + + if (!(current->flags & PF_USEDFPU)) + stts(); } #undef LD @@ -578,12 +595,13 @@ XORBLOCK_TEMPLATE(p5_mmx) { + char fpu_save[108]; int lines = (bh_ptr[0]->b_size>>6); - char mmx_space[32]; - int recursive = 0; - unsigned long flags; + + if (!(current->flags & PF_USEDFPU)) + __asm__ __volatile__ ( " clts;\n"); - kernel_take_fpu_mmx(recursive,&mmx_space[0],NULL,flags); + __asm__ __volatile__ ( " fsave %0; fwait\n"::"m"(fpu_save[0]) ); switch(count) { case 2: @@ -600,21 +618,21 @@ " movq 24(%1), %%mm3 ;\n" " movq %%mm1, 8(%1) ;\n" " pxor 16(%2), %%mm2 ;\n" - " movq 32(%1), %%mm0 ;\n" + " movq 32(%1), %%mm4 ;\n" " movq %%mm2, 16(%1) ;\n" " pxor 24(%2), %%mm3 ;\n" - " movq 40(%1), %%mm1 ;\n" + " movq 40(%1), %%mm5 ;\n" " movq %%mm3, 24(%1) ;\n" - " pxor 32(%2), %%mm0 ;\n" - " movq 48(%1), %%mm2 ;\n" - " movq %%mm0, 32(%1) ;\n" - " pxor 40(%2), %%mm1 ;\n" - " movq 56(%1), %%mm3 ;\n" - " movq %%mm1, 40(%1) ;\n" - " pxor 48(%2), %%mm2 ;\n" - " pxor 56(%2), %%mm3 ;\n" - " movq %%mm2, 48(%1) ;\n" - " movq %%mm3, 56(%1) ;\n" + " pxor 32(%2), %%mm4 ;\n" + " movq 48(%1), %%mm6 ;\n" + " movq %%mm4, 32(%1) ;\n" + " pxor 40(%2), %%mm5 ;\n" + " movq 56(%1), %%mm7 ;\n" + " movq %%mm5, 40(%1) ;\n" + " pxor 48(%2), %%mm6 ;\n" + " pxor 56(%2), %%mm7 ;\n" + " movq %%mm6, 48(%1) ;\n" + " movq %%mm7, 56(%1) ;\n" " addl $64, %1 ;\n" " addl $64, %2 ;\n" @@ -622,7 +640,7 @@ " jnz 1b ;\n" : - : "m" (lines), + : "r" (lines), "r" (bh_ptr[0]->b_data), "r" (bh_ptr[1]->b_data) : "memory" ); @@ -644,26 +662,26 @@ " pxor 16(%3), %%mm2 ;\n" " movq 24(%1), %%mm3 ;\n" " movq %%mm1, 8(%1) ;\n" - " movq 32(%1), %%mm0 ;\n" - " movq 40(%1), %%mm1 ;\n" + " movq 32(%1), %%mm4 ;\n" + " movq 40(%1), %%mm5 ;\n" " pxor 24(%2), %%mm3 ;\n" " movq %%mm2, 16(%1) ;\n" - " pxor 32(%2), %%mm0 ;\n" + " pxor 32(%2), %%mm4 ;\n" " pxor 24(%3), %%mm3 ;\n" - " pxor 40(%2), %%mm1 ;\n" + " pxor 40(%2), %%mm5 ;\n" " movq %%mm3, 24(%1) ;\n" - " pxor 32(%3), %%mm0 ;\n" - " pxor 40(%3), %%mm1 ;\n" - " movq 48(%1), %%mm2 ;\n" - " movq %%mm0, 32(%1) ;\n" - " movq 56(%1), %%mm3 ;\n" - " pxor 48(%2), %%mm2 ;\n" - " movq %%mm1, 40(%1) ;\n" - " pxor 56(%2), %%mm3 ;\n" - " pxor 48(%3), %%mm2 ;\n" - " pxor 56(%3), %%mm3 ;\n" - " movq %%mm2, 48(%1) ;\n" - " movq %%mm3, 56(%1) ;\n" + " pxor 32(%3), %%mm4 ;\n" + " pxor 40(%3), %%mm5 ;\n" + " movq 48(%1), %%mm6 ;\n" + " movq %%mm4, 32(%1) ;\n" + " movq 56(%1), %%mm7 ;\n" + " pxor 48(%2), %%mm6 ;\n" + " movq %%mm5, 40(%1) ;\n" + " pxor 56(%2), %%mm7 ;\n" + " pxor 48(%3), %%mm6 ;\n" + " pxor 56(%3), %%mm7 ;\n" + " movq %%mm6, 48(%1) ;\n" + " movq %%mm7, 56(%1) ;\n" " addl $64, %1 ;\n" " addl $64, %2 ;\n" @@ -672,7 +690,7 @@ " jnz 1b ;\n" : - : "m" (lines), + : "r" (lines), "r" (bh_ptr[0]->b_data), "r" (bh_ptr[1]->b_data), "r" (bh_ptr[2]->b_data) @@ -696,33 +714,33 @@ " pxor 16(%3), %%mm2 ;\n" " pxor 8(%4), %%mm1 ;\n" " movq %%mm0, (%1) ;\n" - " movq 32(%1), %%mm0 ;\n" + " movq 32(%1), %%mm4 ;\n" " pxor 24(%2), %%mm3 ;\n" " pxor 16(%4), %%mm2 ;\n" " movq %%mm1, 8(%1) ;\n" - " movq 40(%1), %%mm1 ;\n" - " pxor 32(%2), %%mm0 ;\n" + " movq 40(%1), %%mm5 ;\n" + " pxor 32(%2), %%mm4 ;\n" " pxor 24(%3), %%mm3 ;\n" " movq %%mm2, 16(%1) ;\n" - " pxor 40(%2), %%mm1 ;\n" - " pxor 32(%3), %%mm0 ;\n" + " pxor 40(%2), %%mm5 ;\n" + " pxor 32(%3), %%mm4 ;\n" " pxor 24(%4), %%mm3 ;\n" " movq %%mm3, 24(%1) ;\n" - " movq 56(%1), %%mm3 ;\n" - " movq 48(%1), %%mm2 ;\n" - " pxor 40(%3), %%mm1 ;\n" - " pxor 32(%4), %%mm0 ;\n" - " pxor 48(%2), %%mm2 ;\n" - " movq %%mm0, 32(%1) ;\n" - " pxor 56(%2), %%mm3 ;\n" - " pxor 40(%4), %%mm1 ;\n" - " pxor 48(%3), %%mm2 ;\n" - " pxor 56(%3), %%mm3 ;\n" - " movq %%mm1, 40(%1) ;\n" - " pxor 48(%4), %%mm2 ;\n" - " pxor 56(%4), %%mm3 ;\n" - " movq %%mm2, 48(%1) ;\n" - " movq %%mm3, 56(%1) ;\n" + " movq 56(%1), %%mm7 ;\n" + " movq 48(%1), %%mm6 ;\n" + " pxor 40(%3), %%mm5 ;\n" + " pxor 32(%4), %%mm4 ;\n" + " pxor 48(%2), %%mm6 ;\n" + " movq %%mm4, 32(%1) ;\n" + " pxor 56(%2), %%mm7 ;\n" + " pxor 40(%4), %%mm5 ;\n" + " pxor 48(%3), %%mm6 ;\n" + " pxor 56(%3), %%mm7 ;\n" + " movq %%mm5, 40(%1) ;\n" + " pxor 48(%4), %%mm6 ;\n" + " pxor 56(%4), %%mm7 ;\n" + " movq %%mm6, 48(%1) ;\n" + " movq %%mm7, 56(%1) ;\n" " addl $64, %1 ;\n" " addl $64, %2 ;\n" @@ -732,7 +750,7 @@ " jnz 1b ;\n" : - : "m" (lines), + : "r" (lines), "r" (bh_ptr[0]->b_data), "r" (bh_ptr[1]->b_data), "r" (bh_ptr[2]->b_data), @@ -764,34 +782,34 @@ " movq %%mm1, 8(%1) ;\n" " pxor 16(%5), %%mm2 ;\n" " pxor 24(%3), %%mm3 ;\n" - " movq 32(%1), %%mm0 ;\n" + " movq 32(%1), %%mm4 ;\n" " movq %%mm2, 16(%1) ;\n" " pxor 24(%4), %%mm3 ;\n" - " pxor 32(%2), %%mm0 ;\n" - " movq 40(%1), %%mm1 ;\n" + " pxor 32(%2), %%mm4 ;\n" + " movq 40(%1), %%mm5 ;\n" " pxor 24(%5), %%mm3 ;\n" - " pxor 32(%3), %%mm0 ;\n" - " pxor 40(%2), %%mm1 ;\n" + " pxor 32(%3), %%mm4 ;\n" + " pxor 40(%2), %%mm5 ;\n" " movq %%mm3, 24(%1) ;\n" - " pxor 32(%4), %%mm0 ;\n" - " pxor 40(%3), %%mm1 ;\n" - " movq 48(%1), %%mm2 ;\n" - " movq 56(%1), %%mm3 ;\n" - " pxor 32(%5), %%mm0 ;\n" - " pxor 40(%4), %%mm1 ;\n" - " pxor 48(%2), %%mm2 ;\n" - " pxor 56(%2), %%mm3 ;\n" - " movq %%mm0, 32(%1) ;\n" - " pxor 48(%3), %%mm2 ;\n" - " pxor 56(%3), %%mm3 ;\n" - " pxor 40(%5), %%mm1 ;\n" - " pxor 48(%4), %%mm2 ;\n" - " pxor 56(%4), %%mm3 ;\n" - " movq %%mm1, 40(%1) ;\n" - " pxor 48(%5), %%mm2 ;\n" - " pxor 56(%5), %%mm3 ;\n" - " movq %%mm2, 48(%1) ;\n" - " movq %%mm3, 56(%1) ;\n" + " pxor 32(%4), %%mm4 ;\n" + " pxor 40(%3), %%mm5 ;\n" + " movq 48(%1), %%mm6 ;\n" + " movq 56(%1), %%mm7 ;\n" + " pxor 32(%5), %%mm4 ;\n" + " pxor 40(%4), %%mm5 ;\n" + " pxor 48(%2), %%mm6 ;\n" + " pxor 56(%2), %%mm7 ;\n" + " movq %%mm4, 32(%1) ;\n" + " pxor 48(%3), %%mm6 ;\n" + " pxor 56(%3), %%mm7 ;\n" + " pxor 40(%5), %%mm5 ;\n" + " pxor 48(%4), %%mm6 ;\n" + " pxor 56(%4), %%mm7 ;\n" + " movq %%mm5, 40(%1) ;\n" + " pxor 48(%5), %%mm6 ;\n" + " pxor 56(%5), %%mm7 ;\n" + " movq %%mm6, 48(%1) ;\n" + " movq %%mm7, 56(%1) ;\n" " addl $64, %1 ;\n" " addl $64, %2 ;\n" @@ -802,7 +820,7 @@ " jnz 1b ;\n" : - : "m" (lines), + : "r" (lines), "r" (bh_ptr[0]->b_data), "r" (bh_ptr[1]->b_data), "r" (bh_ptr[2]->b_data), @@ -812,7 +830,10 @@ break; } - kernel_release_fpu_mmx(recursive,&mmx_space[0],flags); + __asm__ __volatile__ ( " frstor %0;\n"::"m"(fpu_save[0]) ); + + if (!(current->flags & PF_USEDFPU)) + stts(); } #endif /* __i386__ */ #endif /* !__sparc_v9__ */ @@ -1790,12 +1811,11 @@ if (f->speed > fastest->speed) fastest = f; } -#ifdef CONFIG_X86_CPU_OPTIMIZATIONS - if ( (boot_cpu_data.mmu_cr4_features & X86_CR4_OSFXSR) && - (boot_cpu_data.x86_capability & X86_FEATURE_XMM) ) { +#ifdef CONFIG_X86_XMM + if (boot_cpu_data.mmu_cr4_features & X86_CR4_OSXMMEXCPT) { fastest = &t_xor_block_pIII_kni; } -#endif /* CONFIG_X86_CPU_OPTIMIZATIONS */ +#endif xor_block = fastest->xor_block; printk( "using fastest function: %s (%d.%03d MB/sec)\n", fastest->name, fastest->speed / 1000, fastest->speed % 1000); @@ -1827,9 +1847,8 @@ xor_speed(&t_xor_block_SPARC,&b1,&b2); #endif -#ifdef CONFIG_X86_CPU_OPTIMIZATIONS - if ( (boot_cpu_data.mmu_cr4_features & X86_CR4_OSFXSR) && - (boot_cpu_data.x86_capability & X86_FEATURE_XMM) ) { +#ifdef CONFIG_X86_XMM + if (boot_cpu_data.mmu_cr4_features & X86_CR4_OSXMMEXCPT) { printk(KERN_INFO "raid5: KNI detected, trying cache-avoiding KNI checksum routine\n"); /* we force the use of the KNI xor block because it @@ -1840,7 +1859,7 @@ */ xor_speed(&t_xor_block_pIII_kni,&b1,&b2); } -#endif /* CONFIG_X86_CPU_OPTIMIZATIONS */ +#endif /* CONFIG_X86_XMM */ #ifdef __i386__ Index: oldkernel/linux/drivers/char/ip2main.c diff -u linux/drivers/char/ip2main.c:1.1.1.1 linux/drivers/char/ip2main.c:1.2 --- linux/drivers/char/ip2main.c:1.1.1.1 Wed May 31 12:33:51 2000 +++ linux/drivers/char/ip2main.c Fri Jul 7 15:36:42 2000 @@ -3174,7 +3174,7 @@ if (off >= len+begin) return 0; - *start = page + (begin-off); + *start = page + (off-begin); return ((count < begin+len-off) ? count : begin+len-off); } Index: oldkernel/linux/drivers/char/serial.c diff -u linux/drivers/char/serial.c:1.2 linux/drivers/char/serial.c:1.3 --- linux/drivers/char/serial.c:1.2 Thu Jun 1 15:35:12 2000 +++ linux/drivers/char/serial.c Fri Jul 7 15:36:43 2000 @@ -2,6 +2,8 @@ * linux/drivers/char/serial.c * * Copyright (C) 1991, 1992 Linus Torvalds + * Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, + * 1998, 1999 Theodore Ts'o * * Extensively rewritten by Theodore Ts'o, 8/16/92 -- 9/14/92. Now * much more extensible to support other serial cards based on the @@ -32,11 +34,23 @@ * 4/98: Added changes to support the ARM architecture proposed by * Russell King * + * 5/99: Updated to include support for the XR16C850 and ST16C654 + * uarts. Stuart MacDonald + * + * 8/99: Generalized PCI support added. Theodore Ts'o + * + * 3/00: Rid circular buffer of redundant xmit_cnt. Fix a + * few races on freeing buffers too. + * Alan Modra + * * This module exports the following rs232 io functions: * * int rs_init(void); */ +static char *serial_version = "4.94"; +static char *serial_revdate = "2000-04-25"; + /* * Serial driver configuration section. Here are the various options: * @@ -61,15 +75,16 @@ * Check the magic number for the async_structure where * ever possible. */ + #include +#include #undef SERIAL_PARANOIA_CHECK #define CONFIG_SERIAL_NOPAUSE_IO #define SERIAL_DO_RESTART #if 0 -/* Normally these defines are controlled by the autoconf.h */ - +/* These defines are normally controlled by the autoconf.h */ #define CONFIG_SERIAL_MANY_PORTS #define CONFIG_SERIAL_SHARE_IRQ #define CONFIG_SERIAL_DETECT_IRQ @@ -77,6 +92,31 @@ #define CONFIG_HUB6 #endif +#ifdef CONFIG_PCI +#define ENABLE_SERIAL_PCI +#ifndef CONFIG_SERIAL_SHARE_IRQ +#define CONFIG_SERIAL_SHARE_IRQ +#endif +#ifndef CONFIG_SERIAL_MANY_PORTS +#define CONFIG_SERIAL_MANY_PORTS +#endif +#endif + +#if defined(CONFIG_ISAPNP)|| (defined(CONFIG_ISAPNP_MODULE) && defined(MODULE)) +#ifndef ENABLE_SERIAL_PNP +#define ENABLE_SERIAL_PNP +#endif +#endif + +/* Set of debugging defines */ + +#undef SERIAL_DEBUG_INTR +#undef SERIAL_DEBUG_OPEN +#undef SERIAL_DEBUG_FLOW +#undef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT +#undef SERIAL_DEBUG_PCI +#undef SERIAL_DEBUG_AUTOCONF + /* Sanity checks */ #ifdef CONFIG_SERIAL_MULTIPORT @@ -94,33 +134,33 @@ #endif #endif -/* Set of debugging defines */ - -#undef SERIAL_DEBUG_INTR -#undef SERIAL_DEBUG_OPEN -#undef SERIAL_DEBUG_FLOW -#undef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT - #define RS_STROBE_TIME (10*HZ) #define RS_ISR_PASS_LIMIT 256 - -#define IRQ_T(state) \ - ((state->flags & ASYNC_SHARE_IRQ) ? SA_SHIRQ : SA_INTERRUPT) +#if defined(__i386__) && (defined(CONFIG_M386) || defined(CONFIG_M486)) #define SERIAL_INLINE - -#if defined(MODULE) && defined(SERIAL_DEBUG_MCOUNT) -#define DBG_CNT(s) printk("(%s): [%x] refc=%d, serc=%d, ttyc=%d -> %s\n", \ - kdevname(tty->device), (info->flags), serial_refcount,info->count,tty->count,s) -#else -#define DBG_CNT(s) #endif - + /* * End of serial driver configuration section. */ +#ifdef MODVERSIONS +#include +#endif #include + +#include +#ifdef LOCAL_HEADERS +#include "serial_local.h" +#else +#include +#include +#include +#include +#define LOCAL_VERSTRING "" +#endif + #include #include #include @@ -128,8 +168,6 @@ #include #include #include -#include -#include #include #include #include @@ -137,31 +175,64 @@ #include #include #include +#if (LINUX_VERSION_CODE >= 131343) #include +#endif +#if (LINUX_VERSION_CODE >= 131336) +#include +#endif #include #ifdef CONFIG_SERIAL_CONSOLE #include #endif +#ifdef ENABLE_SERIAL_PCI +#include +#endif +#ifdef ENABLE_SERIAL_PNP +#include +#endif +#ifdef CONFIG_MAGIC_SYSRQ +#include +#endif +/* + * All of the compatibilty code so we can compile serial.c against + * older kernels is hidden in serial_compat.h + */ +#if defined(LOCAL_HEADERS) || (LINUX_VERSION_CODE < 0x020317) /* 2.3.23 */ +#include "serial_compat.h" +#endif + #include #include #include -#include #include -#include + +#ifdef CONFIG_MAC_SERIAL +#define SERIAL_DEV_OFFSET 2 +#else +#define SERIAL_DEV_OFFSET 0 +#endif #ifdef SERIAL_INLINE #define _INLINE_ inline +#else +#define _INLINE_ #endif - + static char *serial_name = "Serial driver"; -static char *serial_version = "4.27"; static DECLARE_TASK_QUEUE(tq_serial); static struct tty_driver serial_driver, callout_driver; static int serial_refcount; +/* serial subtype definitions */ +#ifndef SERIAL_TYPE_NORMAL +#define SERIAL_TYPE_NORMAL 1 +#define SERIAL_TYPE_CALLOUT 2 +#endif + /* number of characters left in xmit buffer before we ask for more */ #define WAKEUP_CHARS 256 @@ -177,10 +248,11 @@ static int IRQ_timeout[NR_IRQS]; #ifdef CONFIG_SERIAL_CONSOLE static struct console sercons; +static unsigned long break_pressed; /* break, really ... */ #endif static unsigned detect_uart_irq (struct serial_state * state); -static void autoconfig(struct serial_state * info); +static void autoconfig(struct serial_state * state); static void change_speed(struct async_struct *info, struct termios *old); static void rs_wait_until_sent(struct tty_struct *tty, int timeout); @@ -194,26 +266,64 @@ { "16450", 1, 0 }, { "16550", 1, 0 }, { "16550A", 16, UART_CLEAR_FIFO | UART_USE_FIFO }, - { "cirrus", 1, 0 }, - { "ST16650", 1, UART_CLEAR_FIFO | UART_STARTECH }, + { "cirrus", 1, 0 }, /* usurped by cyclades.c */ + { "ST16650", 1, UART_CLEAR_FIFO |UART_STARTECH }, { "ST16650V2", 32, UART_CLEAR_FIFO | UART_USE_FIFO | UART_STARTECH }, { "TI16750", 64, UART_CLEAR_FIFO | UART_USE_FIFO}, + { "Startech", 1, 0}, /* usurped by cyclades.c */ + { "16C950/954", 128, UART_CLEAR_FIFO | UART_USE_FIFO}, + { "ST16654", 64, UART_CLEAR_FIFO | UART_USE_FIFO | + UART_STARTECH }, + { "XR16850", 128, UART_CLEAR_FIFO | UART_USE_FIFO | + UART_STARTECH }, { 0, 0} }; -static struct serial_state rs_table[] = { +static struct serial_state rs_table[RS_TABLE_SIZE] = { SERIAL_PORT_DFNS /* Defined in serial.h */ }; #define NR_PORTS (sizeof(rs_table)/sizeof(struct serial_state)) +#if (defined(ENABLE_SERIAL_PCI) || defined(ENABLE_SERIAL_PNP)) +#define NR_PCI_BOARDS 8 +#ifdef MODULE +/* We don't unregister PCI boards right now */ +static struct pci_board_inst serial_pci_board[NR_PCI_BOARDS]; +static int serial_pci_board_idx = 0; +#endif +#ifndef IS_PCI_REGION_IOPORT +#define IS_PCI_REGION_IOPORT(dev, r) (pci_resource_flags((dev), (r)) & \ + IORESOURCE_IO) +#endif +#ifndef PCI_IRQ_RESOURCE +#define PCI_IRQ_RESOURCE(dev, r) ((dev)->irq_resource[r].start) +#endif +#ifndef pci_get_subvendor +#define pci_get_subvendor(dev) ((dev)->subsystem_vendor) +#define pci_get_subdevice(dev) ((dev)->subsystem_device) +#endif +#endif /* ENABLE_SERIAL_PCI || ENABLE_SERIAL_PNP */ + +#ifndef PREPARE_FUNC +#define PREPARE_FUNC(dev) (dev->prepare) +#define ACTIVATE_FUNC(dev) (dev->activate) +#define DEACTIVATE_FUNC(dev) (dev->deactivate) +#endif + +#define HIGH_BITS_OFFSET ((sizeof(long)-sizeof(int))*8) + static struct tty_struct *serial_table[NR_PORTS]; static struct termios *serial_termios[NR_PORTS]; static struct termios *serial_termios_locked[NR_PORTS]; -#ifndef MIN -#define MIN(a,b) ((a) < (b) ? (a) : (b)) + +#if defined(MODULE) && defined(SERIAL_DEBUG_MCOUNT) +#define DBG_CNT(s) printk("(%s): [%x] refc=%d, serc=%d, ttyc=%d -> %s\n", \ + kdevname(tty->device), (info->flags), serial_refcount,info->count,tty->count,s) +#else +#define DBG_CNT(s) #endif /* @@ -226,8 +336,13 @@ * memory if large numbers of serial ports are open. */ static unsigned char *tmp_buf; +#ifdef DECLARE_MUTEX +static DECLARE_MUTEX(tmp_buf_sem); +#else static struct semaphore tmp_buf_sem = MUTEX; +#endif + static inline int serial_paranoia_check(struct async_struct *info, kdev_t device, const char *routine) { @@ -249,57 +364,78 @@ return 0; } -static inline unsigned int serial_in(struct async_struct *info, int offset) +static _INLINE_ unsigned int serial_in(struct async_struct *info, int offset) { + switch (info->io_type) { #ifdef CONFIG_HUB6 - if (info->hub6) { - outb(info->hub6 - 1 + offset, info->port); - return inb(info->port+1); - } else + case SERIAL_IO_HUB6: + outb(info->hub6 - 1 + offset, info->port); + return inb(info->port+1); +#endif + case SERIAL_IO_MEM: + return readb((unsigned long) info->iomem_base + + (offset<iomem_reg_shift)); +#ifdef CONFIG_SERIAL_GSC + case SERIAL_IO_GSC: + return gsc_readb(info->iomem_base + offset); #endif - return inb(info->port + offset); + default: + return inb(info->port + offset); + } } -static inline unsigned int serial_inp(struct async_struct *info, int offset) +static _INLINE_ void serial_out(struct async_struct *info, int offset, + int value) { + switch (info->io_type) { #ifdef CONFIG_HUB6 - if (info->hub6) { - outb(info->hub6 - 1 + offset, info->port); - return inb_p(info->port+1); - } else + case SERIAL_IO_HUB6: + outb(info->hub6 - 1 + offset, info->port); + outb(value, info->port+1); + break; #endif -#ifdef CONFIG_SERIAL_NOPAUSE_IO - return inb(info->port + offset); -#else - return inb_p(info->port + offset); + case SERIAL_IO_MEM: + writeb(value, (unsigned long) info->iomem_base + + (offset<iomem_reg_shift)); + break; +#ifdef CONFIG_SERIAL_GSC + case SERIAL_IO_GSC: + gsc_writeb(value, info->iomem_base + offset); + break; #endif + default: + outb(value, info->port+offset); + } } + +/* + * We used to support using pause I/O for certain machines. We + * haven't supported this for a while, but just in case it's badly + * needed for certain old 386 machines, I've left these #define's + * in.... + */ +#define serial_inp(info, offset) serial_in(info, offset) +#define serial_outp(info, offset, value) serial_out(info, offset, value) -static inline void serial_out(struct async_struct *info, int offset, int value) + +/* + * For the 16C950 + */ +void serial_icr_write(struct async_struct *info, int offset, int value) { -#ifdef CONFIG_HUB6 - if (info->hub6) { - outb(info->hub6 - 1 + offset, info->port); - outb(value, info->port+1); - } else -#endif - outb(value, info->port+offset); + serial_out(info, UART_SCR, offset); + serial_out(info, UART_ICR, value); } -static inline void serial_outp(struct async_struct *info, int offset, - int value) +unsigned int serial_icr_read(struct async_struct *info, int offset) { -#ifdef CONFIG_HUB6 - if (info->hub6) { - outb(info->hub6 - 1 + offset, info->port); - outb_p(value, info->port+1); - } else -#endif -#ifdef CONFIG_SERIAL_NOPAUSE_IO - outb(value, info->port+offset); -#else - outb_p(value, info->port+offset); -#endif + int value; + + serial_icr_write(info, UART_ACR, info->ACR | UART_ACR_ICRRD); + serial_out(info, UART_SCR, offset); + value = serial_in(info, UART_ICR); + serial_icr_write(info, UART_ACR, info->ACR); + return value; } /* @@ -323,6 +459,10 @@ info->IER &= ~UART_IER_THRI; serial_out(info, UART_IER, info->IER); } + if (info->state->type == PORT_16C950) { + info->ACR |= UART_ACR_TXDIS; + serial_icr_write(info, UART_ACR, info->ACR); + } restore_flags(flags); } @@ -335,10 +475,16 @@ return; save_flags(flags); cli(); - if (info->xmit_cnt && info->xmit_buf && !(info->IER & UART_IER_THRI)) { + if (info->xmit.head != info->xmit.tail + && info->xmit.buf + && !(info->IER & UART_IER_THRI)) { info->IER |= UART_IER_THRI; serial_out(info, UART_IER, info->IER); } + if (info->state->type == PORT_16C950) { + info->ACR &= ~UART_ACR_TXDIS; + serial_icr_write(info, UART_ACR, info->ACR); + } restore_flags(flags); } @@ -376,7 +522,7 @@ } static _INLINE_ void receive_chars(struct async_struct *info, - int *status) + int *status, struct pt_regs * regs) { struct tty_struct *tty = info->tty; unsigned char ch; @@ -387,7 +533,7 @@ do { ch = serial_inp(info, UART_RX); if (tty->flip.count >= TTY_FLIPBUF_SIZE) - break; + goto ignore_char; *tty->flip.char_buf_ptr = ch; icount->rx++; @@ -426,6 +572,15 @@ #ifdef SERIAL_DEBUG_INTR printk("handling break...."); #endif +#if defined(CONFIG_SERIAL_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) && !defined(MODULE) + if (info->line == sercons.index) { + if (!break_pressed) { + break_pressed = jiffies; + goto ignore_char; + } + break_pressed = 0; + } +#endif *tty->flip.flag_buf_ptr = TTY_BREAK; if (info->flags & ASYNC_SAK) do_SAK(tty); @@ -439,27 +594,42 @@ * reported immediately, and doesn't * affect the current character */ - if (tty->flip.count < TTY_FLIPBUF_SIZE) { - tty->flip.count++; - tty->flip.flag_buf_ptr++; - tty->flip.char_buf_ptr++; - *tty->flip.flag_buf_ptr = TTY_OVERRUN; - } + tty->flip.count++; + tty->flip.flag_buf_ptr++; + tty->flip.char_buf_ptr++; + *tty->flip.flag_buf_ptr = TTY_OVERRUN; + if (tty->flip.count >= TTY_FLIPBUF_SIZE) + goto ignore_char; } } +#if defined(CONFIG_SERIAL_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) && !defined(MODULE) + if (break_pressed && info->line == sercons.index) { + if (ch != 0 && + time_before(jiffies, break_pressed + HZ*5)) { + handle_sysrq(ch, regs, NULL, NULL); + break_pressed = 0; + goto ignore_char; + } + break_pressed = 0; + } +#endif tty->flip.flag_buf_ptr++; tty->flip.char_buf_ptr++; tty->flip.count++; ignore_char: *status = serial_inp(info, UART_LSR); } while (*status & UART_LSR_DR); +#if (LINUX_VERSION_CODE > 131394) /* 2.1.66 */ tty_flip_buffer_push(tty); +#else + queue_task_irq_off(&tty->flip.tqueue, &tq_timer); +#endif } static _INLINE_ void transmit_chars(struct async_struct *info, int *intr_done) { int count; - + if (info->x_char) { serial_outp(info, UART_TX, info->x_char); info->state->icount.tx++; @@ -468,8 +638,9 @@ *intr_done = 0; return; } - if ((info->xmit_cnt <= 0) || info->tty->stopped || - info->tty->hw_stopped) { + if (info->xmit.head == info->xmit.tail + || info->tty->stopped + || info->tty->hw_stopped) { info->IER &= ~UART_IER_THRI; serial_out(info, UART_IER, info->IER); return; @@ -477,14 +648,16 @@ count = info->xmit_fifo_size; do { - serial_out(info, UART_TX, info->xmit_buf[info->xmit_tail++]); - info->xmit_tail = info->xmit_tail & (SERIAL_XMIT_SIZE-1); + serial_out(info, UART_TX, info->xmit.buf[info->xmit.tail]); + info->xmit.tail = (info->xmit.tail + 1) & (SERIAL_XMIT_SIZE-1); info->state->icount.tx++; - if (--info->xmit_cnt <= 0) + if (info->xmit.head == info->xmit.tail) break; } while (--count > 0); - if (info->xmit_cnt < WAKEUP_CHARS) + if (CIRC_CNT(info->xmit.head, + info->xmit.tail, + SERIAL_XMIT_SIZE) < WAKEUP_CHARS) rs_sched_event(info, RS_EVENT_WRITE_WAKEUP); #ifdef SERIAL_DEBUG_INTR @@ -493,7 +666,7 @@ if (intr_done) *intr_done = 0; - if (info->xmit_cnt <= 0) { + if (info->xmit.head == info->xmit.tail) { info->IER &= ~UART_IER_THRI; serial_out(info, UART_IER, info->IER); } @@ -585,11 +758,11 @@ #ifdef SERIAL_DEBUG_INTR printk("rs_interrupt(%d)...", irq); #endif - + info = IRQ_ports[irq]; if (!info) return; - + #ifdef CONFIG_SERIAL_MULTIPORT multi = &rs_multiport[irq]; if (multi->port_monitor) @@ -612,7 +785,7 @@ printk("status = %x...", status); #endif if (status & UART_LSR_DR) - receive_chars(info, &status); + receive_chars(info, &status, regs); check_modem_status(info); if (status & UART_LSR_THRE) transmit_chars(info, 0); @@ -659,7 +832,7 @@ #ifdef SERIAL_DEBUG_INTR printk("rs_interrupt_single(%d)...", irq); #endif - + info = IRQ_ports[irq]; if (!info || !info->tty) return; @@ -676,7 +849,7 @@ printk("status = %x...", status); #endif if (status & UART_LSR_DR) - receive_chars(info, &status); + receive_chars(info, &status, regs); check_modem_status(info); if (status & UART_LSR_THRE) transmit_chars(info, 0); @@ -714,7 +887,7 @@ #ifdef SERIAL_DEBUG_INTR printk("rs_interrupt_multi(%d)...", irq); #endif - + info = IRQ_ports[irq]; if (!info) return; @@ -739,7 +912,7 @@ printk("status = %x...", status); #endif if (status & UART_LSR_DR) - receive_chars(info, &status); + receive_chars(info, &status, regs); check_modem_status(info); if (status & UART_LSR_THRE) transmit_chars(info, 0); @@ -750,11 +923,16 @@ continue; info = IRQ_ports[irq]; + /* + * The user was a bonehead, and misconfigured their + * multiport info. Rather than lock up the kernel + * in an infinite loop, if we loop too many times, + * print a message and break out of the loop. + */ if (pass_counter++ > RS_ISR_PASS_LIMIT) { -#if 1 - printk("rs_multi loop break\n"); -#endif - break; /* Prevent infinite loops */ + printk("Misconfigured multiport serial info " + "for irq %d. Breaking out irq loop\n", irq); + break; } if (multi->port_monitor) printk("rs port monitor irq %d: 0x%x, 0x%x\n", @@ -834,7 +1012,7 @@ unsigned long flags; if ((jiffies - last_strobe) >= RS_STROBE_TIME) { - for (i=1; i < NR_IRQS; i++) { + for (i=0; i < NR_IRQS; i++) { info = IRQ_ports[i]; if (!info) continue; @@ -847,7 +1025,7 @@ serial_out(info, UART_IER, info->IER); info = info->next_port; } while (info); -#ifdef CONFIG_SERIAL_MULTIPORT +#ifdef CONFIG_SERIAL_MULTIPORT if (rs_multiport[i].port1) rs_interrupt_multi(i, NULL, NULL); else @@ -921,7 +1099,7 @@ unsigned short ICP; #endif - page = get_free_page(GFP_KERNEL); + page = get_zeroed_page(GFP_KERNEL); if (!page) return -ENOMEM; @@ -932,16 +1110,16 @@ goto errout; } - if (!state->port || !state->type) { + if (!CONFIGURED_SERIAL_PORT(state) || !state->type) { if (info->tty) set_bit(TTY_IO_ERROR, &info->tty->flags); free_page(page); goto errout; } - if (info->xmit_buf) + if (info->xmit.buf) free_page(page); else - info->xmit_buf = (unsigned char *) page; + info->xmit.buf = (unsigned char *) page; #ifdef SERIAL_DEBUG_OPEN printk("starting up ttys%d (irq %d)...", info->line, state->irq); @@ -951,8 +1129,28 @@ /* Wake up UART */ serial_outp(info, UART_LCR, 0xBF); serial_outp(info, UART_EFR, UART_EFR_ECB); + /* + * Turn off LCR == 0xBF so we actually set the IER + * register on the XR16C850 + */ + serial_outp(info, UART_LCR, 0); serial_outp(info, UART_IER, 0); + /* + * Now reset LCR so we can turn off the ECB bit + */ + serial_outp(info, UART_LCR, 0xBF); serial_outp(info, UART_EFR, 0); + /* + * For a XR16C850, we need to set the trigger levels + */ + if (info->state->type == PORT_16850) { + serial_outp(info, UART_FCTR, UART_FCTR_TRGD | + UART_FCTR_RX); + serial_outp(info, UART_TRG, UART_TRG_96); + serial_outp(info, UART_FCTR, UART_FCTR_TRGD | + UART_FCTR_TX); + serial_outp(info, UART_TRG, UART_TRG_96); + } serial_outp(info, UART_LCR, 0); } @@ -961,20 +1159,47 @@ serial_outp(info, UART_IER, 0); } + if (info->state->type == PORT_16C950) { + /* Wake up and initialize UART */ + info->ACR = 0; + serial_outp(info, UART_LCR, 0xBF); + serial_outp(info, UART_EFR, UART_EFR_ECB); + serial_outp(info, UART_IER, 0); + serial_outp(info, UART_LCR, 0); + serial_icr_write(info, UART_CSR, 0); /* Reset the UART */ + serial_outp(info, UART_LCR, 0xBF); + serial_outp(info, UART_EFR, UART_EFR_ECB); + serial_outp(info, UART_LCR, 0); + } + /* * Clear the FIFO buffers and disable them * (they will be reenabled in change_speed()) */ - if (uart_config[state->type].flags & UART_CLEAR_FIFO) - serial_outp(info, UART_FCR, (UART_FCR_CLEAR_RCVR | + if (uart_config[state->type].flags & UART_CLEAR_FIFO) { + serial_outp(info, UART_FCR, UART_FCR_ENABLE_FIFO); + serial_outp(info, UART_FCR, (UART_FCR_ENABLE_FIFO | + UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT)); + serial_outp(info, UART_FCR, 0); + } + + /* + * Clear the interrupt registers. + */ + (void) serial_inp(info, UART_LSR); + (void) serial_inp(info, UART_RX); + (void) serial_inp(info, UART_IIR); + (void) serial_inp(info, UART_MSR); /* * At this point there's no way the LSR could still be 0xFF; * if it is, then bail out, because there's likely no UART * here. */ - if (serial_inp(info, UART_LSR) == 0xff) { + if (!(info->flags & ASYNC_BUGGY_UART) && + (serial_inp(info, UART_LSR) == 0xff)) { + printk("LSR safety check engaged!\n"); if (capable(CAP_SYS_ADMIN)) { if (info->tty) set_bit(TTY_IO_ERROR, &info->tty->flags); @@ -990,7 +1215,7 @@ !IRQ_ports[state->irq]->next_port)) { if (IRQ_ports[state->irq]) { #ifdef CONFIG_SERIAL_SHARE_IRQ - free_irq(state->irq, NULL); + free_irq(state->irq, &IRQ_ports[state->irq]); #ifdef CONFIG_SERIAL_MULTIPORT if (rs_multiport[state->irq].port1) handler = rs_interrupt_multi; @@ -1004,8 +1229,8 @@ } else handler = rs_interrupt_single; - retval = request_irq(state->irq, handler, IRQ_T(state), - "serial", NULL); + retval = request_irq(state->irq, handler, SA_SHIRQ, + "serial", &IRQ_ports[state->irq]); if (retval) { if (capable(CAP_SYS_ADMIN)) { if (info->tty) @@ -1028,14 +1253,6 @@ figure_IRQ_timeout(state->irq); /* - * Clear the interrupt registers. - */ - /* (void) serial_inp(info, UART_LSR); */ /* (see above) */ - (void) serial_inp(info, UART_RX); - (void) serial_inp(info, UART_IIR); - (void) serial_inp(info, UART_MSR); - - /* * Now, initialize the UART */ serial_outp(info, UART_LCR, UART_LCR_WLEN8); /* reset DLAB */ @@ -1053,12 +1270,7 @@ if (state->irq != 0) info->MCR |= UART_MCR_OUT2; } -#if defined(__alpha__) && !defined(CONFIG_PCI) - /* - * DEC did something gratutiously wrong.... - */ - info->MCR |= UART_MCR_OUT1 | UART_MCR_OUT2; -#endif + info->MCR |= ALPHA_KLUDGE_MCR; /* Don't ask */ serial_outp(info, UART_MCR, info->MCR); /* @@ -1086,7 +1298,7 @@ if (info->tty) clear_bit(TTY_IO_ERROR, &info->tty->flags); - info->xmit_cnt = info->xmit_head = info->xmit_tail = 0; + info->xmit.head = info->xmit.tail = 0; /* * Set up serial timers... @@ -1097,6 +1309,7 @@ /* * Set up the tty->alt_speed kludge */ +#if (LINUX_VERSION_CODE >= 131394) /* Linux 2.1.66 */ if (info->tty) { if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI) info->tty->alt_speed = 57600; @@ -1107,6 +1320,7 @@ if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP) info->tty->alt_speed = 460800; } +#endif /* * and set the speed of the serial port @@ -1167,20 +1381,22 @@ if (state->irq && (!IRQ_ports[state->irq] || !IRQ_ports[state->irq]->next_port)) { if (IRQ_ports[state->irq]) { - free_irq(state->irq, NULL); + free_irq(state->irq, &IRQ_ports[state->irq]); retval = request_irq(state->irq, rs_interrupt_single, - IRQ_T(state), "serial", NULL); + SA_SHIRQ, "serial", + &IRQ_ports[state->irq]); if (retval) printk("serial shutdown: request_irq: error %d" " Couldn't reacquire IRQ.\n", retval); } else - free_irq(state->irq, NULL); + free_irq(state->irq, &IRQ_ports[state->irq]); } - if (info->xmit_buf) { - free_page((unsigned long) info->xmit_buf); - info->xmit_buf = 0; + if (info->xmit.buf) { + unsigned long pg = (unsigned long) info->xmit.buf; + info->xmit.buf = 0; + free_page(pg); } info->IER = 0; @@ -1193,12 +1409,7 @@ } else #endif info->MCR &= ~UART_MCR_OUT2; -#if defined(__alpha__) && !defined(CONFIG_PCI) - /* - * DEC did something gratutiously wrong.... - */ - info->MCR |= UART_MCR_OUT1 | UART_MCR_OUT2; -#endif + info->MCR |= ALPHA_KLUDGE_MCR; /* Don't ask */ /* disable break condition */ serial_out(info, UART_LCR, serial_inp(info, UART_LCR) & ~UART_LCR_SBC); @@ -1208,8 +1419,11 @@ serial_outp(info, UART_MCR, info->MCR); /* disable FIFO's */ - serial_outp(info, UART_FCR, (UART_FCR_CLEAR_RCVR | + serial_outp(info, UART_FCR, (UART_FCR_ENABLE_FIFO | + UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT)); + serial_outp(info, UART_FCR, 0); + (void)serial_in(info, UART_RX); /* read data port to reset things */ if (info->tty) @@ -1230,6 +1444,37 @@ restore_flags(flags); } +#if (LINUX_VERSION_CODE < 131394) /* Linux 2.1.66 */ +static int baud_table[] = { + 0, 50, 75, 110, 134, 150, 200, 300, + 600, 1200, 1800, 2400, 4800, 9600, 19200, + 38400, 57600, 115200, 230400, 460800, 0 }; + +static int tty_get_baud_rate(struct tty_struct *tty) +{ + struct async_struct * info = (struct async_struct *)tty->driver_data; + unsigned int cflag, i; + + cflag = tty->termios->c_cflag; + + i = cflag & CBAUD; + if (i & CBAUDEX) { + i &= ~CBAUDEX; + if (i < 1 || i > 2) + tty->termios->c_cflag &= ~CBAUDEX; + else + i += 15; + } + if (i == 15) { + if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI) + i += 1; + if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI) + i += 2; + } + return baud_table[i]; +} +#endif + /* * This routine is called to set the UART divisor registers to match * the specified baud rate for a serial port. @@ -1237,7 +1482,6 @@ static void change_speed(struct async_struct *info, struct termios *old_termios) { - unsigned short port; int quot = 0, baud_base, baud; unsigned cflag, cval, fcr = 0; int bits; @@ -1246,7 +1490,7 @@ if (!info->tty || !info->tty->termios) return; cflag = info->tty->termios->c_cflag; - if (!(port = info->port)) + if (!CONFIGURED_SERIAL_PORT(info)) return; /* byte size and parity */ @@ -1278,6 +1522,18 @@ if (!baud) baud = 9600; /* B0 transition handled in rs_set_termios */ baud_base = info->state->baud_base; + if (info->state->type == PORT_16C950) { + if (baud <= baud_base) + serial_icr_write(info, UART_TCR, 0); + else if (baud <= 2*baud_base) { + serial_icr_write(info, UART_TCR, 0x8); + baud_base = baud_base * 2; + } else if (baud <= 4*baud_base) { + serial_icr_write(info, UART_TCR, 0x4); + baud_base = baud_base * 4; + } else + serial_icr_write(info, UART_TCR, 0); + } if (baud == 38400 && ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST)) quot = info->state->custom_divisor; @@ -1309,6 +1565,15 @@ /* As a last resort, if the quotient is zero, default to 9600 bps */ if (!quot) quot = baud_base / 9600; + /* + * Work around a bug in the Oxford Semiconductor 952 rev B + * chip which causes it to seriously miscalculate baud rates + * when DLL is 0. + */ + if (((quot & 0xFF) == 0) && (info->state->type == PORT_16C950) && + (info->state->revision == 0x5201)) + quot++; + info->quot = quot; info->timeout = ((info->xmit_fifo_size*HZ*bits*quot) / baud_base); info->timeout += HZ/50; /* Add .02 seconds of slop */ @@ -1383,11 +1648,12 @@ if (info->state->type == PORT_16750) serial_outp(info, UART_FCR, fcr); /* set fcr */ serial_outp(info, UART_LCR, cval); /* reset DLAB */ - if (info->state->type != PORT_16750) { - if (fcr & UART_FCR_ENABLE_FIFO) { - /* emulated UARTs (Lucent Venus 167x) need two steps */ - serial_outp(info, UART_FCR, UART_FCR_ENABLE_FIFO); - } + info->LCR = cval; /* Save LCR */ + if (info->state->type != PORT_16750) { + if (fcr & UART_FCR_ENABLE_FIFO) { + /* emulated UARTs (Lucent Venus 167x) need two steps */ + serial_outp(info, UART_FCR, UART_FCR_ENABLE_FIFO); + } serial_outp(info, UART_FCR, fcr); /* set fcr */ } restore_flags(flags); @@ -1401,18 +1667,19 @@ if (serial_paranoia_check(info, tty->device, "rs_put_char")) return; - if (!tty || !info->xmit_buf) + if (!tty || !info->xmit.buf) return; save_flags(flags); cli(); - if (info->xmit_cnt >= SERIAL_XMIT_SIZE - 1) { + if (CIRC_SPACE(info->xmit.head, + info->xmit.tail, + SERIAL_XMIT_SIZE) == 0) { restore_flags(flags); return; } - info->xmit_buf[info->xmit_head++] = ch; - info->xmit_head &= SERIAL_XMIT_SIZE-1; - info->xmit_cnt++; + info->xmit.buf[info->xmit.head] = ch; + info->xmit.head = (info->xmit.head + 1) & (SERIAL_XMIT_SIZE-1); restore_flags(flags); } @@ -1424,8 +1691,10 @@ if (serial_paranoia_check(info, tty->device, "rs_flush_chars")) return; - if (info->xmit_cnt <= 0 || tty->stopped || tty->hw_stopped || - !info->xmit_buf) + if (info->xmit.head == info->xmit.tail + || tty->stopped + || tty->hw_stopped + || !info->xmit.buf) return; save_flags(flags); cli(); @@ -1444,16 +1713,19 @@ if (serial_paranoia_check(info, tty->device, "rs_write")) return 0; - if (!tty || !info->xmit_buf || !tmp_buf) + if (!tty || !info->xmit.buf || !tmp_buf) return 0; save_flags(flags); if (from_user) { down(&tmp_buf_sem); while (1) { - c = MIN(count, - MIN(SERIAL_XMIT_SIZE - info->xmit_cnt - 1, - SERIAL_XMIT_SIZE - info->xmit_head)); + int c1; + c = CIRC_SPACE_TO_END(info->xmit.head, + info->xmit.tail, + SERIAL_XMIT_SIZE); + if (count < c) + c = count; if (c <= 0) break; @@ -1464,12 +1736,14 @@ break; } cli(); - c = MIN(c, MIN(SERIAL_XMIT_SIZE - info->xmit_cnt - 1, - SERIAL_XMIT_SIZE - info->xmit_head)); - memcpy(info->xmit_buf + info->xmit_head, tmp_buf, c); - info->xmit_head = ((info->xmit_head + c) & + c1 = CIRC_SPACE_TO_END(info->xmit.head, + info->xmit.tail, + SERIAL_XMIT_SIZE); + if (c1 < c) + c = c1; + memcpy(info->xmit.buf + info->xmit.head, tmp_buf, c); + info->xmit.head = ((info->xmit.head + c) & (SERIAL_XMIT_SIZE-1)); - info->xmit_cnt += c; restore_flags(flags); buf += c; count -= c; @@ -1477,27 +1751,29 @@ } up(&tmp_buf_sem); } else { + cli(); while (1) { - cli(); - c = MIN(count, - MIN(SERIAL_XMIT_SIZE - info->xmit_cnt - 1, - SERIAL_XMIT_SIZE - info->xmit_head)); + c = CIRC_SPACE_TO_END(info->xmit.head, + info->xmit.tail, + SERIAL_XMIT_SIZE); + if (count < c) + c = count; if (c <= 0) { - restore_flags(flags); break; } - memcpy(info->xmit_buf + info->xmit_head, buf, c); - info->xmit_head = ((info->xmit_head + c) & + memcpy(info->xmit.buf + info->xmit.head, buf, c); + info->xmit.head = ((info->xmit.head + c) & (SERIAL_XMIT_SIZE-1)); - info->xmit_cnt += c; - restore_flags(flags); buf += c; count -= c; ret += c; } + restore_flags(flags); } - if (info->xmit_cnt && !tty->stopped && !tty->hw_stopped && - !(info->IER & UART_IER_THRI)) { + if (info->xmit.head != info->xmit.tail + && !tty->stopped + && !tty->hw_stopped + && !(info->IER & UART_IER_THRI)) { info->IER |= UART_IER_THRI; serial_out(info, UART_IER, info->IER); } @@ -1507,14 +1783,10 @@ static int rs_write_room(struct tty_struct *tty) { struct async_struct *info = (struct async_struct *)tty->driver_data; - int ret; - + if (serial_paranoia_check(info, tty->device, "rs_write_room")) return 0; - ret = SERIAL_XMIT_SIZE - info->xmit_cnt - 1; - if (ret < 0) - ret = 0; - return ret; + return CIRC_SPACE(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE); } static int rs_chars_in_buffer(struct tty_struct *tty) @@ -1523,7 +1795,7 @@ if (serial_paranoia_check(info, tty->device, "rs_chars_in_buffer")) return 0; - return info->xmit_cnt; + return CIRC_CNT(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE); } static void rs_flush_buffer(struct tty_struct *tty) @@ -1534,7 +1806,7 @@ if (serial_paranoia_check(info, tty->device, "rs_flush_buffer")) return; save_flags(flags); cli(); - info->xmit_cnt = info->xmit_head = info->xmit_tail = 0; + info->xmit.head = info->xmit.tail = 0; restore_flags(flags); wake_up_interruptible(&tty->write_wait); if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) && @@ -1639,6 +1911,10 @@ tmp.type = state->type; tmp.line = state->line; tmp.port = state->port; + if (HIGH_BITS_OFFSET) + tmp.port_high = state->port >> HIGH_BITS_OFFSET; + else + tmp.port_high = 0; tmp.irq = state->irq; tmp.flags = state->flags; tmp.xmit_fifo_size = state->xmit_fifo_size; @@ -1647,6 +1923,7 @@ tmp.closing_wait = state->closing_wait; tmp.custom_divisor = state->custom_divisor; tmp.hub6 = state->hub6; + tmp.io_type = state->io_type; if (copy_to_user(retinfo,&tmp,sizeof(*retinfo))) return -EFAULT; return 0; @@ -1659,14 +1936,19 @@ struct serial_state old_state, *state; unsigned int i,change_irq,change_port; int retval = 0; + unsigned long new_port; if (copy_from_user(&new_serial,new_info,sizeof(new_serial))) return -EFAULT; state = info->state; old_state = *state; - + + new_port = new_serial.port; + if (HIGH_BITS_OFFSET) + new_port += new_serial.port_high << HIGH_BITS_OFFSET; + change_irq = new_serial.irq != state->irq; - change_port = (new_serial.port != state->port) || + change_port = (new_port != ((int) state->port)) || (new_serial.hub6 != state->hub6); if (!capable(CAP_SYS_ADMIN)) { @@ -1688,7 +1970,7 @@ new_serial.irq = irq_cannonicalize(new_serial.irq); - if ((new_serial.irq >= NR_IRQS) || (new_serial.port > 0xffff) || + if ((new_serial.irq >= NR_IRQS) || (new_serial.baud_base < 9600)|| (new_serial.type < PORT_UNKNOWN) || (new_serial.type > PORT_MAX) || (new_serial.type == PORT_CIRRUS) || (new_serial.type == PORT_STARTECH)) { @@ -1704,7 +1986,7 @@ if (new_serial.type) { for (i = 0 ; i < NR_PORTS; i++) if ((state != &rs_table[i]) && - (rs_table[i].port == new_serial.port) && + (rs_table[i].port == new_port) && rs_table[i].type) return -EADDRINUSE; } @@ -1723,14 +2005,17 @@ info->flags = ((state->flags & ~ASYNC_INTERNAL_FLAGS) | (info->flags & ASYNC_INTERNAL_FLAGS)); state->custom_divisor = new_serial.custom_divisor; - state->type = new_serial.type; state->close_delay = new_serial.close_delay * HZ/100; state->closing_wait = new_serial.closing_wait * HZ/100; +#if (LINUX_VERSION_CODE > 0x20100) info->tty->low_latency = (info->flags & ASYNC_LOW_LATENCY) ? 1 : 0; +#endif info->xmit_fifo_size = state->xmit_fifo_size = new_serial.xmit_fifo_size; - release_region(state->port,8); + if ((state->type != PORT_UNKNOWN) && state->port) + release_region(state->port,8); + state->type = new_serial.type; if (change_port || change_irq) { /* * We need to shutdown the serial port at the old @@ -1738,10 +2023,14 @@ */ shutdown(info); state->irq = new_serial.irq; - info->port = state->port = new_serial.port; + info->port = state->port = new_port; info->hub6 = state->hub6 = new_serial.hub6; + if (info->hub6) + info->io_type = state->io_type = SERIAL_IO_HUB6; + else if (info->io_type == SERIAL_IO_HUB6) + info->io_type = state->io_type = SERIAL_IO_PORT; } - if (state->type != PORT_UNKNOWN) + if ((state->type != PORT_UNKNOWN) && state->port) request_region(state->port,8,"serial(set)"); @@ -1752,6 +2041,7 @@ if (((old_state.flags & ASYNC_SPD_MASK) != (state->flags & ASYNC_SPD_MASK)) || (old_state.custom_divisor != state->custom_divisor)) { +#if (LINUX_VERSION_CODE >= 131394) /* Linux 2.1.66 */ if ((state->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI) info->tty->alt_speed = 57600; if ((state->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI) @@ -1760,6 +2050,7 @@ info->tty->alt_speed = 230400; if ((state->flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP) info->tty->alt_speed = 460800; +#endif change_speed(info, 0); } } else @@ -1788,7 +2079,22 @@ status = serial_in(info, UART_LSR); restore_flags(flags); result = ((status & UART_LSR_TEMT) ? TIOCSER_TEMT : 0); - return put_user(result,value); + + /* + * If we're about to load something into the transmit + * register, we'll pretend the transmitter isn't empty to + * avoid a race condition (depending on when the transmit + * interrupt happens). + */ + if (info->x_char || + ((CIRC_CNT(info->xmit.head, info->xmit.tail, + SERIAL_XMIT_SIZE) > 0) && + !info->tty->stopped && !info->tty->hw_stopped)) + result &= TIOCSER_TEMT; + + if (copy_to_user(value, &result, sizeof(int))) + return -EFAULT; + return 0; } @@ -1812,19 +2118,21 @@ | ((status & UART_MSR_RI) ? TIOCM_RNG : 0) | ((status & UART_MSR_DSR) ? TIOCM_DSR : 0) | ((status & UART_MSR_CTS) ? TIOCM_CTS : 0); - return put_user(result,value); + + if (copy_to_user(value, &result, sizeof(int))) + return -EFAULT; + return 0; } static int set_modem_info(struct async_struct * info, unsigned int cmd, unsigned int *value) { - int error; unsigned int arg; unsigned long flags; + + if (copy_from_user(&arg, value, sizeof(int))) + return -EFAULT; - error = get_user(arg, value); - if (error) - return error; switch (cmd) { case TIOCMBIS: if (arg & TIOCM_RTS) @@ -1837,6 +2145,8 @@ if (arg & TIOCM_OUT2) info->MCR |= UART_MCR_OUT2; #endif + if (arg & TIOCM_LOOP) + info->MCR |= UART_MCR_LOOP; break; case TIOCMBIC: if (arg & TIOCM_RTS) @@ -1849,6 +2159,8 @@ if (arg & TIOCM_OUT2) info->MCR &= ~UART_MCR_OUT2; #endif + if (arg & TIOCM_LOOP) + info->MCR &= ~UART_MCR_LOOP; break; case TIOCMSET: info->MCR = ((info->MCR & ~(UART_MCR_RTS | @@ -1856,18 +2168,21 @@ UART_MCR_OUT1 | UART_MCR_OUT2 | #endif + UART_MCR_LOOP | UART_MCR_DTR)) | ((arg & TIOCM_RTS) ? UART_MCR_RTS : 0) #ifdef TIOCM_OUT1 | ((arg & TIOCM_OUT1) ? UART_MCR_OUT1 : 0) | ((arg & TIOCM_OUT2) ? UART_MCR_OUT2 : 0) #endif + | ((arg & TIOCM_LOOP) ? UART_MCR_LOOP : 0) | ((arg & TIOCM_DTR) ? UART_MCR_DTR : 0)); break; default: return -EINVAL; } save_flags(flags); cli(); + info->MCR |= ALPHA_KLUDGE_MCR; /* Don't ask */ serial_out(info, UART_MCR, info->MCR); restore_flags(flags); return 0; @@ -1900,6 +2215,22 @@ /* * rs_break() --- routine which turns the break handling on or off */ +#if (LINUX_VERSION_CODE < 131394) /* Linux 2.1.66 */ +static void send_break( struct async_struct * info, int duration) +{ + if (!CONFIGURED_SERIAL_PORT(info)) + return; + current->state = TASK_INTERRUPTIBLE; + current->timeout = jiffies + duration; + cli(); + info->LCR |= UART_LCR_SBC; + serial_out(info, UART_LCR, info->LCR); + schedule(); + info->LCR &= ~UART_LCR_SBC; + serial_out(info, UART_LCR, info->LCR); + sti(); +} +#else static void rs_break(struct tty_struct *tty, int break_state) { struct async_struct * info = (struct async_struct *)tty->driver_data; @@ -1908,17 +2239,17 @@ if (serial_paranoia_check(info, tty->device, "rs_break")) return; - if (!info->port) + if (!CONFIGURED_SERIAL_PORT(info)) return; save_flags(flags); cli(); if (break_state == -1) - serial_out(info, UART_LCR, - serial_inp(info, UART_LCR) | UART_LCR_SBC); + info->LCR |= UART_LCR_SBC; else - serial_out(info, UART_LCR, - serial_inp(info, UART_LCR) & ~UART_LCR_SBC); + info->LCR &= ~UART_LCR_SBC; + serial_out(info, UART_LCR, info->LCR); restore_flags(flags); } +#endif #ifdef CONFIG_SERIAL_MULTIPORT static int get_multiport_struct(struct async_struct * info, @@ -2017,14 +2348,14 @@ if (IRQ_ports[state->irq]->next_port && (was_multi != now_multi)) { - free_irq(state->irq, NULL); + free_irq(state->irq, &IRQ_ports[state->irq]); if (now_multi) handler = rs_interrupt_multi; else handler = rs_interrupt; - retval = request_irq(state->irq, handler, IRQ_T(state), - "serial", NULL); + retval = request_irq(state->irq, handler, SA_SHIRQ, + "serial", &IRQ_ports[state->irq]); if (retval) { printk("Couldn't reallocate serial interrupt " "driver!!\n"); @@ -2037,11 +2368,13 @@ static int rs_ioctl(struct tty_struct *tty, struct file * file, unsigned int cmd, unsigned long arg) { - int error; struct async_struct * info = (struct async_struct *)tty->driver_data; struct async_icount cprev, cnow; /* kernel counter temps */ - struct serial_icounter_struct *p_cuser; /* user space */ + struct serial_icounter_struct icount; unsigned long flags; +#if (LINUX_VERSION_CODE < 131394) /* Linux 2.1.66 */ + int retval, tmp; +#endif if (serial_paranoia_check(info, tty->device, "rs_ioctl")) return -ENODEV; @@ -2054,6 +2387,45 @@ } switch (cmd) { +#if (LINUX_VERSION_CODE < 131394) /* Linux 2.1.66 */ + case TCSBRK: /* SVID version: non-zero arg --> no break */ + retval = tty_check_change(tty); + if (retval) + return retval; + tty_wait_until_sent(tty, 0); + if (signal_pending(current)) + return -EINTR; + if (!arg) { + send_break(info, HZ/4); /* 1/4 second */ + if (signal_pending(current)) + return -EINTR; + } + return 0; + case TCSBRKP: /* support for POSIX tcsendbreak() */ + retval = tty_check_change(tty); + if (retval) + return retval; + tty_wait_until_sent(tty, 0); + if (signal_pending(current)) + return -EINTR; + send_break(info, arg ? arg*(HZ/10) : HZ/4); + if (signal_pending(current)) + return -EINTR; + return 0; + case TIOCGSOFTCAR: + tmp = C_CLOCAL(tty) ? 1 : 0; + if (copy_to_user((void *)arg, &tmp, sizeof(int))) + return -EFAULT; + return 0; + case TIOCSSOFTCAR: + if (copy_from_user(&tmp, (void *)arg, sizeof(int))) + return -EFAULT; + + tty->termios->c_cflag = + ((tty->termios->c_cflag & ~CLOCAL) | + (tmp ? CLOCAL : 0)); + return 0; +#endif case TIOCMGET: return get_modem_info(info, (unsigned int *) arg); case TIOCMBIS: @@ -2129,31 +2501,21 @@ save_flags(flags); cli(); cnow = info->state->icount; restore_flags(flags); - p_cuser = (struct serial_icounter_struct *) arg; - error = put_user(cnow.cts, &p_cuser->cts); - if (error) return error; - error = put_user(cnow.dsr, &p_cuser->dsr); - if (error) return error; - error = put_user(cnow.rng, &p_cuser->rng); - if (error) return error; - error = put_user(cnow.dcd, &p_cuser->dcd); - if (error) return error; - error = put_user(cnow.rx, &p_cuser->rx); - if (error) return error; - error = put_user(cnow.tx, &p_cuser->tx); - if (error) return error; - error = put_user(cnow.frame, &p_cuser->frame); - if (error) return error; - error = put_user(cnow.overrun, &p_cuser->overrun); - if (error) return error; - error = put_user(cnow.parity, &p_cuser->parity); - if (error) return error; - error = put_user(cnow.brk, &p_cuser->brk); - if (error) return error; - error = put_user(cnow.buf_overrun, &p_cuser->buf_overrun); - if (error) return error; + icount.cts = cnow.cts; + icount.dsr = cnow.dsr; + icount.rng = cnow.rng; + icount.dcd = cnow.dcd; + icount.rx = cnow.rx; + icount.tx = cnow.tx; + icount.frame = cnow.frame; + icount.overrun = cnow.overrun; + icount.parity = cnow.parity; + icount.brk = cnow.brk; + icount.buf_overrun = cnow.buf_overrun; + + if (copy_to_user((void *)arg, &icount, sizeof(icount))) + return -EFAULT; return 0; - case TIOCSERGWILD: case TIOCSERSWILD: /* "setserial -W" is called in Debian boot */ @@ -2278,6 +2640,7 @@ return; } info->flags |= ASYNC_CLOSING; + restore_flags(flags); /* * Save the termios structure, since this port may have * separate termios for callout and dialin. @@ -2320,7 +2683,7 @@ info->tty = 0; if (info->blocked_open) { if (info->close_delay) { - current->state = TASK_INTERRUPTIBLE; + set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(info->close_delay); } wake_up_interruptible(&info->open_wait); @@ -2329,7 +2692,6 @@ ASYNC_CLOSING); wake_up_interruptible(&info->close_wait); MOD_DEC_USE_COUNT; - restore_flags(flags); } /* @@ -2363,8 +2725,8 @@ char_time = char_time / 5; if (char_time == 0) char_time = 1; - if (timeout) - char_time = MIN(char_time, timeout); + if (timeout && timeout < char_time) + char_time = timeout; /* * If the transmitter hasn't cleared in twice the approximate * amount of time to send the entire FIFO, it probably won't @@ -2384,15 +2746,14 @@ #ifdef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT printk("lsr = %d (jiff=%lu)...", lsr, jiffies); #endif - current->state = TASK_INTERRUPTIBLE; - current->counter = 0; /* make us low-priority */ + set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(char_time); if (signal_pending(current)) break; if (timeout && time_after(jiffies, orig_jiffies + timeout)) break; } - current->state = TASK_RUNNING; + set_current_state(TASK_RUNNING); #ifdef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT printk("lsr = %d (jiff=%lu)...done\n", lsr, jiffies); #endif @@ -2412,6 +2773,8 @@ state = info->state; rs_flush_buffer(tty); + if (info->flags & ASYNC_CLOSING) + return; shutdown(info); info->event = 0; state->count = 0; @@ -2428,7 +2791,7 @@ static int block_til_ready(struct tty_struct *tty, struct file * filp, struct async_struct *info) { - struct wait_queue wait = { current, NULL }; + DECLARE_WAITQUEUE(wait, current); struct serial_state *state = info->state; int retval; int do_clocal = 0, extra_count = 0; @@ -2517,7 +2880,7 @@ serial_inp(info, UART_MCR) | (UART_MCR_DTR | UART_MCR_RTS)); restore_flags(flags); - current->state = TASK_INTERRUPTIBLE; + set_current_state(TASK_INTERRUPTIBLE); if (tty_hung_up_p(filp) || !(info->flags & ASYNC_INITIALIZED)) { #ifdef SERIAL_DO_RESTART @@ -2545,7 +2908,7 @@ #endif schedule(); } - current->state = TASK_RUNNING; + set_current_state(TASK_RUNNING); remove_wait_queue(&info->open_wait, &wait); if (extra_count) state->count++; @@ -2577,9 +2940,15 @@ return -ENOMEM; } memset(info, 0, sizeof(struct async_struct)); + init_waitqueue_head(&info->open_wait); + init_waitqueue_head(&info->close_wait); + init_waitqueue_head(&info->delta_msr_wait); info->magic = SERIAL_MAGIC; info->port = sstate->port; info->flags = sstate->flags; + info->io_type = sstate->io_type; + info->iomem_base = sstate->iomem_base; + info->iomem_reg_shift = sstate->iomem_reg_shift; info->xmit_fifo_size = sstate->xmit_fifo_size; info->line = line; info->tqueue.routine = do_softint; @@ -2619,21 +2988,20 @@ } tty->driver_data = info; info->tty = tty; - if (serial_paranoia_check(info, tty->device, "rs_open")) { - /* MOD_DEC_USE_COUNT; "info->tty" will cause this */ + if (serial_paranoia_check(info, tty->device, "rs_open")) return -ENODEV; - } #ifdef SERIAL_DEBUG_OPEN printk("rs_open %s%d, count = %d\n", tty->driver.name, info->line, info->state->count); #endif +#if (LINUX_VERSION_CODE > 0x20100) info->tty->low_latency = (info->flags & ASYNC_LOW_LATENCY) ? 1 : 0; +#endif if (!tmp_buf) { - page = get_free_page(GFP_KERNEL); + page = get_zeroed_page(GFP_KERNEL); if (!page) { - /* MOD_DEC_USE_COUNT; "info->tty" will cause this? */ return -ENOMEM; } if (tmp_buf) @@ -2649,7 +3017,6 @@ (info->flags & ASYNC_CLOSING)) { if (info->flags & ASYNC_CLOSING) interruptible_sleep_on(&info->close_wait); - /* MOD_DEC_USE_COUNT; "info->tty" will cause this? */ #ifdef SERIAL_DO_RESTART return ((info->flags & ASYNC_HUP_NOTIFY) ? -EAGAIN : -ERESTARTSYS); @@ -2663,13 +3030,11 @@ */ retval = startup(info); if (retval) { - /* MOD_DEC_USE_COUNT; "info->tty" will cause this? */ return retval; } retval = block_til_ready(tty, filp, info); if (retval) { - /* MOD_DEC_USE_COUNT; "info->tty" will cause this? */ #ifdef SERIAL_DEBUG_OPEN printk("rs_open returning after block_til_ready with %d\n", retval); @@ -2712,7 +3077,7 @@ int ret; unsigned long flags; - ret = sprintf(buf, "%d: uart:%s port:%X irq:%d", + ret = sprintf(buf, "%d: uart:%s port:%lX irq:%d", state->line, uart_config[state->type].name, state->port, state->irq); @@ -2735,9 +3100,9 @@ } save_flags(flags); cli(); status = serial_in(info, UART_MSR); - control = info ? info->MCR : serial_in(info, UART_MCR); + control = info != &scr_info ? info->MCR : serial_in(info, UART_MCR); restore_flags(flags); - + stat_buf[0] = 0; stat_buf[1] = 0; if (control & UART_MCR_RTS) @@ -2786,8 +3151,9 @@ int i, len = 0, l; off_t begin = 0; - len += sprintf(page, "serinfo:1.0 driver:%s\n", serial_version); - for (i = 0; i < NR_PORTS && len < 3900; i++) { + len += sprintf(page, "serinfo:1.0 driver:%s%s revision:%s\n", + serial_version, LOCAL_VERSTRING, serial_revdate); + for (i = 0; i < NR_PORTS && len < 4000; i++) { l = line_info(page + len, &rs_table[i]); len += l; if (len+begin > off+count) @@ -2801,7 +3167,7 @@ done: if (off >= len+begin) return 0; - *start = page + (begin-off); + *start = page + (off-begin); return ((count < begin+len-off) ? count : begin+len-off); } @@ -2818,37 +3184,49 @@ * number, and identifies which options were configured into this * driver. */ -static _INLINE_ void show_serial_version(void) -{ - printk(KERN_INFO "%s version %s with", serial_name, serial_version); +static char serial_options[] __initdata = #ifdef CONFIG_HUB6 - printk(" HUB-6"); + " HUB-6" #define SERIAL_OPT #endif #ifdef CONFIG_SERIAL_MANY_PORTS - printk(" MANY_PORTS"); + " MANY_PORTS" #define SERIAL_OPT #endif #ifdef CONFIG_SERIAL_MULTIPORT - printk(" MULTIPORT"); + " MULTIPORT" #define SERIAL_OPT #endif #ifdef CONFIG_SERIAL_SHARE_IRQ - printk(" SHARE_IRQ"); + " SHARE_IRQ" #define SERIAL_OPT #endif #ifdef CONFIG_SERIAL_DETECT_IRQ - printk(" DETECT_IRQ"); + " DETECT_IRQ" +#define SERIAL_OPT +#endif +#ifdef ENABLE_SERIAL_PCI + " SERIAL_PCI" +#define SERIAL_OPT +#endif +#ifdef ENABLE_SERIAL_PNP + " ISAPNP" #define SERIAL_OPT #endif #ifdef SERIAL_OPT - printk(" enabled\n"); + " enabled\n"; #else - printk(" no serial options enabled\n"); + " no serial options enabled\n"; #endif #undef SERIAL_OPT -} +static _INLINE_ void show_serial_version(void) +{ + printk(KERN_INFO "%s version %s%s (%s) with%s", serial_name, + serial_version, LOCAL_VERSTRING, serial_revdate, + serial_options); +} + /* * This routine detect the IRQ of a serial port by clearing OUT2 when * no UART interrupt are requested (IER = 0) (*GPL*). This seems to work at @@ -2875,11 +3253,15 @@ } #endif scr_info.magic = SERIAL_MAGIC; + scr_info.state = state; scr_info.port = state->port; scr_info.flags = state->flags; #ifdef CONFIG_HUB6 scr_info.hub6 = state->hub6; #endif + scr_info.io_type = state->io_type; + scr_info.iomem_base = state->iomem_base; + scr_info.iomem_reg_shift = state->iomem_reg_shift; /* forget possible initially masked and pending IRQ */ probe_irq_off(probe_irq_on()); @@ -2916,53 +3298,197 @@ } /* + * This is a quickie test to see how big the FIFO is. + * It doesn't work at all the time, more's the pity. + */ +static int size_fifo(struct async_struct *info) +{ + unsigned char old_fcr, old_mcr, old_dll, old_dlm; + int count; + + old_fcr = serial_inp(info, UART_FCR); + old_mcr = serial_inp(info, UART_MCR); + serial_outp(info, UART_FCR, UART_FCR_ENABLE_FIFO | + UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT); + serial_outp(info, UART_MCR, UART_MCR_LOOP); + serial_outp(info, UART_LCR, UART_LCR_DLAB); + old_dll = serial_inp(info, UART_DLL); + old_dlm = serial_inp(info, UART_DLM); + serial_outp(info, UART_DLL, 0x01); + serial_outp(info, UART_DLM, 0x00); + serial_outp(info, UART_LCR, 0x03); + for (count = 0; count < 256; count++) + serial_outp(info, UART_TX, count); + mdelay(20); + for (count = 0; (serial_inp(info, UART_LSR) & UART_LSR_DR) && + (count < 256); count++) + serial_inp(info, UART_RX); + serial_outp(info, UART_FCR, old_fcr); + serial_outp(info, UART_MCR, old_mcr); + serial_outp(info, UART_LCR, UART_LCR_DLAB); + serial_outp(info, UART_DLL, old_dll); + serial_outp(info, UART_DLM, old_dlm); + + return count; +} + +/* + * This is a helper routine to autodetect StarTech/Exar/Oxsemi UART's. + * When this function is called we know it is at least a StarTech + * 16650 V2, but it might be one of several StarTech UARTs, or one of + * its clones. (We treat the broken original StarTech 16650 V1 as a + * 16550, and why not? Startech doesn't seem to even acknowledge its + * existence.) + * + * What evil have men's minds wrought... + */ +static void autoconfig_startech_uarts(struct async_struct *info, + struct serial_state *state, + unsigned long flags) +{ + unsigned char scratch, scratch2, scratch3; + + /* + * First we check to see if it's an Oxford Semiconductor UART. + * + * If we have to do this here because some non-National + * Semiconductor clone chips lock up if you try writing to the + * LSR register (which serial_icr_read does) + */ + if (state->type == PORT_16550A) { + /* + * EFR [4] must be set else this test fails + * + * This shouldn't be necessary, but Mike Hudson + * (Exoray@isys.ca) claims that it's needed for 952 + * dual UART's (which are not recommended for new designs). + */ + serial_out(info, UART_LCR, 0xBF); + serial_out(info, UART_EFR, 0x10); + serial_out(info, UART_LCR, 0x00); + /* Check for Oxford Semiconductor 16C950 */ + scratch = serial_icr_read(info, UART_ID1); + scratch2 = serial_icr_read(info, UART_ID2); + scratch3 = serial_icr_read(info, UART_ID3); + + if (scratch == 0x16 && scratch2 == 0xC9 && + (scratch3 == 0x50 || scratch3 == 0x52 || + scratch3 == 0x54)) { + state->type = PORT_16C950; + state->revision = serial_icr_read(info, UART_REV) | + (scratch3 << 8); + return; + } + } + + /* + * We check for a XR16C850 by setting DLL and DLM to 0, and + * then reading back DLL and DLM. If DLM reads back 0x10, + * then the UART is a XR16C850 and the DLL contains the chip + * revision. If DLM reads back 0x14, then the UART is a + * XR16C854. + * + */ + serial_outp(info, UART_LCR, UART_LCR_DLAB); + serial_outp(info, UART_DLL, 0); + serial_outp(info, UART_DLM, 0); + state->revision = serial_inp(info, UART_DLL); + scratch = serial_inp(info, UART_DLM); + serial_outp(info, UART_LCR, 0); + if (scratch == 0x10 || scratch == 0x14) { + state->type = PORT_16850; + return; + } + + /* + * We distinguish between the '654 and the '650 by counting + * how many bytes are in the FIFO. I'm using this for now, + * since that's the technique that was sent to me in the + * serial driver update, but I'm not convinced this works. + * I've had problems doing this in the past. -TYT + */ + if (size_fifo(info) == 64) + state->type = PORT_16654; + else + state->type = PORT_16650V2; +} + +/* * This routine is called by rs_init() to initialize a specific serial * port. It determines what type of UART chip this serial port is * using: 8250, 16450, 16550, 16550A. The important question is - * whether or not this UART is a 16550A, since this will determine - * whether or not we can use its FIFO features. + * whether or not this UART is a 16550A or not, since this will + * determine whether or not we can use its FIFO features or not. */ static void autoconfig(struct serial_state * state) { - unsigned char status1, status2, scratch, scratch2; + unsigned char status1, status2, scratch, scratch2, scratch3; + unsigned char save_lcr, save_mcr; struct async_struct *info, scr_info; unsigned long flags; state->type = PORT_UNKNOWN; + +#ifdef SERIAL_DEBUG_AUTOCONF + printk("Testing ttyS%d (0x%04lx, 0x%04x)...\n", state->line, + state->port, (unsigned) state->iomem_base); +#endif - if (!state->port) + if (!CONFIGURED_SERIAL_PORT(state)) return; info = &scr_info; /* This is just for serial_{in,out} */ info->magic = SERIAL_MAGIC; + info->state = state; info->port = state->port; info->flags = state->flags; #ifdef CONFIG_HUB6 info->hub6 = state->hub6; #endif + info->io_type = state->io_type; + info->iomem_base = state->iomem_base; + info->iomem_reg_shift = state->iomem_reg_shift; save_flags(flags); cli(); - /* - * Do a simple existence test first; if we fail this, there's - * no point trying anything else. - * - * 0x80 is used as a nonsense port to prevent against false - * positives due to ISA bus float. The assumption is that - * 0x80 is a non-existent port; which should be safe since - * include/asm/io.h also makes this assumption. - */ - scratch = serial_inp(info, UART_IER); - serial_outp(info, UART_IER, 0); - outb(0xff, 0x080); - scratch2 = serial_inp(info, UART_IER); - serial_outp(info, UART_IER, scratch); - if (scratch2) { - restore_flags(flags); - return; /* We failed; there's nothing here */ + if (!(state->flags & ASYNC_BUGGY_UART) && + !state->iomem_base) { + /* + * Do a simple existence test first; if we fail this, + * there's no point trying anything else. + * + * 0x80 is used as a nonsense port to prevent against + * false positives due to ISA bus float. The + * assumption is that 0x80 is a non-existent port; + * which should be safe since include/asm/io.h also + * makes this assumption. + */ + scratch = serial_inp(info, UART_IER); + serial_outp(info, UART_IER, 0); +#ifdef __i386__ + outb(0xff, 0x080); +#endif + scratch2 = serial_inp(info, UART_IER); + serial_outp(info, UART_IER, 0x0F); +#ifdef __i386__ + outb(0, 0x080); +#endif + scratch3 = serial_inp(info, UART_IER); + serial_outp(info, UART_IER, scratch); + if (scratch2 || scratch3 != 0x0F) { +#ifdef SERIAL_DEBUG_AUTOCONF + printk("serial: ttyS%d: simple autoconfig failed\n", + state->line); +#endif + restore_flags(flags); + return; /* We failed; there's nothing here */ + } } + save_mcr = serial_in(info, UART_MCR); + save_lcr = serial_in(info, UART_LCR); + /* * Check to see if a UART is really there. Certain broken * internal modems based on the Rockwell chipset fail this @@ -2973,18 +3499,18 @@ * that conflicts with COM 1-4 --- we hope! */ if (!(state->flags & ASYNC_SKIP_TEST)) { - scratch = serial_inp(info, UART_MCR); - serial_outp(info, UART_MCR, UART_MCR_LOOP | scratch); serial_outp(info, UART_MCR, UART_MCR_LOOP | 0x0A); status1 = serial_inp(info, UART_MSR) & 0xF0; - serial_outp(info, UART_MCR, scratch); + serial_outp(info, UART_MCR, save_mcr); if (status1 != 0x90) { +#ifdef SERIAL_DEBUG_AUTOCONF + printk("serial: ttyS%d: no UART loopback failed\n", + state->line); +#endif restore_flags(flags); return; } - } - - scratch2 = serial_in(info, UART_LCR); + } serial_outp(info, UART_LCR, 0xBF); /* set up for StarTech test */ serial_outp(info, UART_EFR, 0); /* EFR is the same as FCR */ serial_outp(info, UART_LCR, 0); @@ -3006,30 +3532,39 @@ } if (state->type == PORT_16550A) { /* Check for Startech UART's */ - serial_outp(info, UART_LCR, scratch2 | UART_LCR_DLAB); + serial_outp(info, UART_LCR, UART_LCR_DLAB); if (serial_in(info, UART_EFR) == 0) { state->type = PORT_16650; } else { serial_outp(info, UART_LCR, 0xBF); if (serial_in(info, UART_EFR) == 0) - state->type = PORT_16650V2; + autoconfig_startech_uarts(info, state, flags); } } if (state->type == PORT_16550A) { /* Check for TI 16750 */ - serial_outp(info, UART_LCR, scratch2 | UART_LCR_DLAB); + serial_outp(info, UART_LCR, save_lcr | UART_LCR_DLAB); serial_outp(info, UART_FCR, UART_FCR_ENABLE_FIFO | UART_FCR7_64BYTE); scratch = serial_in(info, UART_IIR) >> 5; if (scratch == 7) { + /* + * If this is a 16750, and not a cheap UART + * clone, then it should only go into 64 byte + * mode if the UART_FCR7_64BYTE bit was set + * while UART_LCR_DLAB was latched. + */ + serial_outp(info, UART_FCR, UART_FCR_ENABLE_FIFO); serial_outp(info, UART_LCR, 0); + serial_outp(info, UART_FCR, + UART_FCR_ENABLE_FIFO | UART_FCR7_64BYTE); scratch = serial_in(info, UART_IIR) >> 5; if (scratch == 6) state->type = PORT_16750; } serial_outp(info, UART_FCR, UART_FCR_ENABLE_FIFO); } - serial_outp(info, UART_LCR, scratch2); + serial_outp(info, UART_LCR, save_lcr); if (state->type == PORT_16450) { scratch = serial_in(info, UART_SCR); serial_outp(info, UART_SCR, 0xa5); @@ -3048,22 +3583,17 @@ return; } - request_region(info->port,8,"serial(auto)"); + if (info->port) + request_region(info->port,8,"serial(auto)"); /* * Reset the UART. - */ -#if defined(__alpha__) && !defined(CONFIG_PCI) - /* - * I wonder what DEC did to the OUT1 and OUT2 lines? - * clearing them results in endless interrupts. */ - serial_outp(info, UART_MCR, 0x0c); -#else - serial_outp(info, UART_MCR, 0x00); -#endif - serial_outp(info, UART_FCR, (UART_FCR_CLEAR_RCVR | + serial_outp(info, UART_MCR, save_mcr); + serial_outp(info, UART_FCR, (UART_FCR_ENABLE_FIFO | + UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT)); + serial_outp(info, UART_FCR, 0); (void)serial_in(info, UART_RX); serial_outp(info, UART_IER, 0); @@ -3073,25 +3603,1009 @@ int register_serial(struct serial_struct *req); void unregister_serial(int line); +#if (LINUX_VERSION_CODE > 0x20100) EXPORT_SYMBOL(register_serial); EXPORT_SYMBOL(unregister_serial); +#else +static struct symbol_table serial_syms = { +#include + X(register_serial), + X(unregister_serial), +#include +}; +#endif + + +#if defined(ENABLE_SERIAL_PCI) || defined(ENABLE_SERIAL_PNP) + +static void __init printk_pnp_dev_id(unsigned short vendor, + unsigned short device) +{ + printk("%c%c%c%x%x%x%x", + 'A' + ((vendor >> 2) & 0x3f) - 1, + 'A' + (((vendor & 3) << 3) | ((vendor >> 13) & 7)) - 1, + 'A' + ((vendor >> 8) & 0x1f) - 1, + (device >> 4) & 0x0f, + device & 0x0f, + (device >> 12) & 0x0f, + (device >> 8) & 0x0f); +} + +static _INLINE_ int get_pci_port(struct pci_dev *dev, + struct pci_board *board, + struct serial_struct *state, + int idx) +{ + unsigned long port; + int base_idx; + int max_port; + + base_idx = SPCI_FL_GET_BASE(board->flags); + if (board->flags & SPCI_FL_BASE_TABLE) + base_idx += idx; + + if (board->flags & SPCI_FL_REGION_SZ_CAP) { + max_port = pci_resource_len(dev, base_idx) / 8; + if (idx >= max_port) + return 1; + } + + port = pci_resource_start(dev, base_idx) + board->first_uart_offset; + + if ((board->flags & SPCI_FL_BASE_TABLE) == 0) + port += idx * (board->uart_offset ? board->uart_offset : 8); + + if (IS_PCI_REGION_IOPORT(dev, base_idx)) { + state->port = port; + if (HIGH_BITS_OFFSET) + state->port_high = port >> HIGH_BITS_OFFSET; + else + state->port_high = 0; + return 0; + } + state->io_type = SERIAL_IO_MEM; + state->iomem_base = ioremap(port, board->uart_offset); + state->iomem_reg_shift = board->reg_shift; + state->port = 0; + return 0; +} + +static _INLINE_ int get_pci_irq(struct pci_dev *dev, + struct pci_board *board, + int idx) +{ + int base_idx; + + if ((board->flags & SPCI_FL_IRQRESOURCE) == 0) + return dev->irq; + + base_idx = SPCI_FL_GET_IRQBASE(board->flags); + if (board->flags & SPCI_FL_IRQ_TABLE) + base_idx += idx; + + return PCI_IRQ_RESOURCE(dev, base_idx); +} + +/* + * Common enabler code shared by both PCI and ISAPNP probes + */ +static void __init start_pci_pnp_board(struct pci_dev *dev, + struct pci_board *board) +{ + int k, line; + struct serial_struct fake_state; + int base_baud; + + if (PREPARE_FUNC(dev) && (PREPARE_FUNC(dev))(dev) < 0) { + printk("SERIAL: PNP device '"); + printk_pnp_dev_id(board->vendor, board->device); + printk("' prepare failed\n"); + return; + } + + if (ACTIVATE_FUNC(dev) && (ACTIVATE_FUNC(dev))(dev) < 0) { + printk("SERIAL: PNP device '"); + printk_pnp_dev_id(board->vendor, board->device); + printk("' activate failed\n"); + return; + } + + /* + * Run the initialization function, if any + */ + if (board->init_fn && ((board->init_fn)(dev, board, 1) != 0)) + return; + +#ifdef MODULE + /* + * Register the serial board in the array if we need to + * shutdown the board on a module unload. + */ + if (DEACTIVATE_FUNC(dev) || board->init_fn) { + if (serial_pci_board_idx >= NR_PCI_BOARDS) + return; + serial_pci_board[serial_pci_board_idx].board = *board; + serial_pci_board[serial_pci_board_idx].dev = dev; + serial_pci_board_idx++; + } +#endif + + base_baud = board->base_baud; + if (!base_baud) + base_baud = BASE_BAUD; + memset(&fake_state, 0, sizeof(fake_state)); + + for (k=0; k < board->num_ports; k++) { + fake_state.irq = get_pci_irq(dev, board, k); + if (get_pci_port(dev, board, &fake_state, k)) + break; + fake_state.flags = ASYNC_SKIP_TEST; +#ifdef SERIAL_DEBUG_PCI + printk("Setup PCI/PNP port: port %x, irq %d, type %d\n", + fake_state.port, fake_state.irq, fake_state.io_type); +#endif + line = register_serial(&fake_state); + if (line < 0) + break; + rs_table[line].baud_base = base_baud; + } +} +#endif /* ENABLE_SERIAL_PCI || ENABLE_SERIAL_PNP */ + +#ifdef ENABLE_SERIAL_PCI +/* + * Some PCI serial cards using the PLX 9050 PCI interface chip require + * that the card interrupt be explicitly enabled or disabled. This + * seems to be mainly needed on card using the PLX which also use I/O + * mapped memory. + */ +static int +#ifndef MODULE +__init +#endif +pci_plx9050_fn(struct pci_dev *dev, struct pci_board *board, int enable) +{ + u8 data, *p, irq_config; + int pci_config; + + irq_config = 0x41; + pci_config = PCI_COMMAND_MEMORY; + if (dev->vendor == PCI_VENDOR_ID_PANACOM) + irq_config = 0x43; + if ((dev->vendor == PCI_VENDOR_ID_PLX) && + (dev->device == PCI_VENDOR_ID_PLX_ROMULUS)) { + /* + * As the megawolf cards have the int pins active + * high, and have 2 UART chips, both ints must be + * enabled on the 9050. Also, the UARTS are set in + * 16450 mode by default, so we have to enable the + * 16C950 'enhanced' mode so that we can use the deep + * FIFOs + */ + irq_config = 0x5b; + pci_config = PCI_COMMAND_MEMORY | PCI_COMMAND_IO; + } + + pci_read_config_byte(dev, PCI_COMMAND, &data); + + if (enable) + pci_write_config_byte(dev, PCI_COMMAND, + data | pci_config); + + /* enable/disable interrupts */ + p = ioremap(pci_resource_start(dev, 0), 0x80); + writel(enable ? irq_config : 0x00, (unsigned long)p + 0x4c); + iounmap(p); + + if (!enable) + pci_write_config_byte(dev, PCI_COMMAND, + data & ~pci_config); + return 0; +} + + +/* + * SIIG serial cards have an PCI interface chip which also controls + * the UART clocking frequency. Each UART can be clocked independently + * (except cards equiped with 4 UARTs) and initial clocking settings + * are stored in the EEPROM chip. It can cause problems because this + * version of serial driver doesn't support differently clocked UART's + * on single PCI card. To prevent this, initialization functions set + * high frequency clocking for all UART's on given card. It is safe (I + * hope) because it doesn't touch EEPROM settings to prevent conflicts + * with other OSes (like M$ DOS). + * + * SIIG support added by Andrey Panin , 10/1999 + * + * There is two family of SIIG serial cards with different PCI + * interface chip and different configuration methods: + * - 10x cards have control registers in IO and/or memory space; + * - 20x cards have control registers in standard PCI configuration space. + */ + +#define PCI_DEVICE_ID_SIIG_1S_10x (PCI_DEVICE_ID_SIIG_1S_10x_550 & 0xfffc) +#define PCI_DEVICE_ID_SIIG_2S_10x (PCI_DEVICE_ID_SIIG_2S_10x_550 & 0xfff8) + +static int +#ifndef MODULE +__init +#endif +pci_siig10x_fn(struct pci_dev *dev, struct pci_board *board, int enable) +{ + u16 data, *p; + + if (!enable) return 0; + + p = ioremap(pci_resource_start(dev, 0), 0x80); + + switch (dev->device & 0xfff8) { + case PCI_DEVICE_ID_SIIG_1S_10x: /* 1S */ + data = 0xffdf; + break; + case PCI_DEVICE_ID_SIIG_2S_10x: /* 2S, 2S1P */ + data = 0xf7ff; + break; + default: /* 1S1P, 4S */ + data = 0xfffb; + break; + } + + writew(readw((unsigned long) p + 0x28) & data, (unsigned long) p + 0x28); + iounmap(p); + return 0; +} + +#define PCI_DEVICE_ID_SIIG_2S_20x (PCI_DEVICE_ID_SIIG_2S_20x_550 & 0xfffc) +#define PCI_DEVICE_ID_SIIG_2S1P_20x (PCI_DEVICE_ID_SIIG_2S1P_20x_550 & 0xfffc) + +static int +#ifndef MODULE +__init +#endif +pci_siig20x_fn(struct pci_dev *dev, struct pci_board *board, int enable) +{ + u8 data; + + if (!enable) return 0; + + /* Change clock frequency for the first UART. */ + pci_read_config_byte(dev, 0x6f, &data); + pci_write_config_byte(dev, 0x6f, data & 0xef); + + /* If this card has 2 UART, we have to do the same with second UART. */ + if (((dev->device & 0xfffc) == PCI_DEVICE_ID_SIIG_2S_20x) || + ((dev->device & 0xfffc) == PCI_DEVICE_ID_SIIG_2S1P_20x)) { + pci_read_config_byte(dev, 0x73, &data); + pci_write_config_byte(dev, 0x73, data & 0xef); + } + return 0; +} + +/* Added for EKF Intel i960 serial boards */ +static int +#ifndef MODULE +__init +#endif +pci_inteli960ni_fn(struct pci_dev *dev, + struct pci_board *board, + int enable) +{ + unsigned long oldval; + + if (!(board->subdevice & 0x1000)) + return(-1); + + if (!enable) /* is there something to deinit? */ + return(0); + +#ifdef SERIAL_DEBUG_PCI + printk(KERN_DEBUG " Subsystem ID %lx, at Address: %lx\n", + (unsigned long) board->subdevice, port); +#endif + /* is firmware started? */ + pci_read_config_dword(dev, 0x44, (void*) &oldval); + if (oldval == 0x00001000L) { /* RESET value */ + printk(KERN_DEBUG "Local i960 firmware missing"); + return(-1); + } + return(0); +} + + +/* + * This is the configuration table for all of the PCI serial boards + * which we support. + */ +static struct pci_board pci_boards[] __initdata = { + /* + * Vendor ID, Device ID, + * Subvendor ID, Subdevice ID, + * PCI Flags, Number of Ports, Base (Maximum) Baud Rate, + * Offset to get to next UART's registers, + * Register shift to use for memory-mapped I/O, + * Initialization function, first UART offset + */ + { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V960, + PCI_SUBVENDOR_ID_CONNECT_TECH, + PCI_SUBDEVICE_ID_CONNECT_TECH_BH8_232, + SPCI_FL_BASE1, 8, 1382400 }, + { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V960, + PCI_SUBVENDOR_ID_CONNECT_TECH, + PCI_SUBDEVICE_ID_CONNECT_TECH_BH4_232, + SPCI_FL_BASE1, 4, 1382400 }, + { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V960, + PCI_SUBVENDOR_ID_CONNECT_TECH, + PCI_SUBDEVICE_ID_CONNECT_TECH_BH2_232, + SPCI_FL_BASE1, 2, 1382400 }, + { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V960V2, + PCI_SUBVENDOR_ID_CONNECT_TECH, + PCI_SUBDEVICE_ID_CONNECT_TECH_BH8_232, + SPCI_FL_BASE1, 8, 1382400 }, + { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V960V2, + PCI_SUBVENDOR_ID_CONNECT_TECH, + PCI_SUBDEVICE_ID_CONNECT_TECH_BH4_232, + SPCI_FL_BASE1, 4, 1382400 }, + { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V960V2, + PCI_SUBVENDOR_ID_CONNECT_TECH, + PCI_SUBDEVICE_ID_CONNECT_TECH_BH2_232, + SPCI_FL_BASE1, 2, 1382400 }, + { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V960, + PCI_SUBVENDOR_ID_CONNECT_TECH, + PCI_SUBDEVICE_ID_CONNECT_TECH_BH8_485, + SPCI_FL_BASE1, 8, 921600 }, + { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V960, + PCI_SUBVENDOR_ID_CONNECT_TECH, + PCI_SUBDEVICE_ID_CONNECT_TECH_BH8_485_4_4, + SPCI_FL_BASE1, 8, 921600 }, + { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V960, + PCI_SUBVENDOR_ID_CONNECT_TECH, + PCI_SUBDEVICE_ID_CONNECT_TECH_BH4_485, + SPCI_FL_BASE1, 4, 921600 }, + { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V960, + PCI_SUBVENDOR_ID_CONNECT_TECH, + PCI_SUBDEVICE_ID_CONNECT_TECH_BH4_485_2_2, + SPCI_FL_BASE1, 4, 921600 }, + { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V960, + PCI_SUBVENDOR_ID_CONNECT_TECH, + PCI_SUBDEVICE_ID_CONNECT_TECH_BH2_485, + SPCI_FL_BASE1, 2, 921600 }, + { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V960V2, + PCI_SUBVENDOR_ID_CONNECT_TECH, + PCI_SUBDEVICE_ID_CONNECT_TECH_BH8_485, + SPCI_FL_BASE1, 8, 921600 }, + { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V960V2, + PCI_SUBVENDOR_ID_CONNECT_TECH, + PCI_SUBDEVICE_ID_CONNECT_TECH_BH8_485_4_4, + SPCI_FL_BASE1, 8, 921600 }, + { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V960V2, + PCI_SUBVENDOR_ID_CONNECT_TECH, + PCI_SUBDEVICE_ID_CONNECT_TECH_BH4_485, + SPCI_FL_BASE1, 4, 921600 }, + { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V960V2, + PCI_SUBVENDOR_ID_CONNECT_TECH, + PCI_SUBDEVICE_ID_CONNECT_TECH_BH4_485_2_2, + SPCI_FL_BASE1, 4, 921600 }, + { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V960V2, + PCI_SUBVENDOR_ID_CONNECT_TECH, + PCI_SUBDEVICE_ID_CONNECT_TECH_BH2_485, + SPCI_FL_BASE1, 2, 921600 }, + { PCI_VENDOR_ID_SEALEVEL, PCI_DEVICE_ID_SEALEVEL_U530, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE2 | SPCI_FL_BASE_TABLE, 1, 115200 }, + { PCI_VENDOR_ID_SEALEVEL, PCI_DEVICE_ID_SEALEVEL_UCOMM2, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE2 | SPCI_FL_BASE_TABLE, 2, 115200 }, + { PCI_VENDOR_ID_SEALEVEL, PCI_DEVICE_ID_SEALEVEL_UCOMM422, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE2 | SPCI_FL_BASE_TABLE, 4, 115200 }, + { PCI_VENDOR_ID_SEALEVEL, PCI_DEVICE_ID_SEALEVEL_UCOMM232, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE2 | SPCI_FL_BASE_TABLE, 2, 115200 }, + { PCI_VENDOR_ID_SEALEVEL, PCI_DEVICE_ID_SEALEVEL_COMM4, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE2 | SPCI_FL_BASE_TABLE, 4, 115200 }, + { PCI_VENDOR_ID_SEALEVEL, PCI_DEVICE_ID_SEALEVEL_COMM8, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE2, 8, 115200 }, + { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_GTEK_SERIAL2, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE2 | SPCI_FL_BASE_TABLE, 2, 115200 }, + { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_SPCOM200, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE2 | SPCI_FL_BASE_TABLE, 2, 921600 }, + /* VScom SPCOM800, from sl@s.pl */ + { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_SPCOM800, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE2, 8, 921600 }, + { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050, + PCI_SUBVENDOR_ID_KEYSPAN, + PCI_SUBDEVICE_ID_KEYSPAN_SX2, + SPCI_FL_BASE2, 2, 921600, /* IOMEM */ + 0x400, 7, pci_plx9050_fn }, + { PCI_VENDOR_ID_PANACOM, PCI_DEVICE_ID_PANACOM_QUADMODEM, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE2 | SPCI_FL_BASE_TABLE, 4, 921600, + 0x400, 7, pci_plx9050_fn }, + { PCI_VENDOR_ID_PANACOM, PCI_DEVICE_ID_PANACOM_DUALMODEM, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE2 | SPCI_FL_BASE_TABLE, 2, 921600, + 0x400, 7, pci_plx9050_fn }, + { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050, + PCI_SUBVENDOR_ID_CHASE_PCIFAST, + PCI_SUBDEVICE_ID_CHASE_PCIFAST4, + SPCI_FL_BASE2, 4, 460800 }, + { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050, + PCI_SUBVENDOR_ID_CHASE_PCIFAST, + PCI_SUBDEVICE_ID_CHASE_PCIFAST8, + SPCI_FL_BASE2, 8, 460800 }, + { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050, + PCI_SUBVENDOR_ID_CHASE_PCIFAST, + PCI_SUBDEVICE_ID_CHASE_PCIFAST16, + SPCI_FL_BASE2, 16, 460800 }, + { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050, + PCI_SUBVENDOR_ID_CHASE_PCIFAST, + PCI_SUBDEVICE_ID_CHASE_PCIFAST16FMC, + SPCI_FL_BASE2, 16, 460800 }, + { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050, + PCI_SUBVENDOR_ID_CHASE_PCIRAS, + PCI_SUBDEVICE_ID_CHASE_PCIRAS4, + SPCI_FL_BASE2, 4, 460800 }, + { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050, + PCI_SUBVENDOR_ID_CHASE_PCIRAS, + PCI_SUBDEVICE_ID_CHASE_PCIRAS8, + SPCI_FL_BASE2, 8, 460800 }, + /* Megawolf Romulus PCI Serial Card, from Mike Hudson */ + /* (Exoray@isys.ca) */ + { PCI_VENDOR_ID_PLX, PCI_VENDOR_ID_PLX_ROMULUS, + 0x10b5, 0x106a, + SPCI_FL_BASE2, 4, 921600, + 0x20, 2, pci_plx9050_fn, 0x03 }, + { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_QSC100, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE1, 4, 115200 }, + { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_DSC100, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE1, 2, 115200 }, + { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_ESC100D, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE1, 8, 115200 }, + { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_ESC100M, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE1, 8, 115200 }, + { PCI_VENDOR_ID_SPECIALIX, PCI_DEVICE_ID_OXSEMI_16PCI954, + PCI_VENDOR_ID_SPECIALIX, PCI_SUBDEVICE_ID_SPECIALIX_SPEED4, + SPCI_FL_BASE0 , 4, 921600 }, + { PCI_VENDOR_ID_OXSEMI, PCI_DEVICE_ID_OXSEMI_16PCI954, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE0 , 4, 115200 }, + { PCI_VENDOR_ID_OXSEMI, PCI_DEVICE_ID_OXSEMI_16PCI952, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE0 , 2, 115200 }, + /* This board uses the size of PCI Base region 0 to + * signal now many ports are available */ + { PCI_VENDOR_ID_OXSEMI, PCI_DEVICE_ID_OXSEMI_16PCI95N, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE0 | SPCI_FL_REGION_SZ_CAP, 32, 115200 }, + { PCI_VENDOR_ID_TIMEDIA, PCI_DEVICE_ID_TIMEDIA_1889, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE0 , 2, 921600 }, + { PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_DSERIAL, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE0 | SPCI_FL_BASE_TABLE, 2, 115200 }, + { PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_QUATRO_A, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE0 | SPCI_FL_BASE_TABLE, 2, 115200 }, + { PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_QUATRO_B, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE0 | SPCI_FL_BASE_TABLE, 2, 115200 }, + { PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_PORT_PLUS, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE0 | SPCI_FL_BASE_TABLE, 2, 460800 }, + { PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_QUAD_A, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE0 | SPCI_FL_BASE_TABLE, 2, 460800 }, + { PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_QUAD_B, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE0 | SPCI_FL_BASE_TABLE, 2, 460800 }, + { PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_SSERIAL, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE0 | SPCI_FL_BASE_TABLE, 1, 115200 }, + { PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_PORT_650, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE0 | SPCI_FL_BASE_TABLE, 1, 460800 }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S_10x_550, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE2, 1, 460800, + 0, 0, pci_siig10x_fn }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S_10x_650, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE2, 1, 460800, + 0, 0, pci_siig10x_fn }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S_10x_850, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE2, 1, 460800, + 0, 0, pci_siig10x_fn }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_10x_550, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE2, 1, 921600, + 0, 0, pci_siig10x_fn }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_10x_650, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE2, 1, 921600, + 0, 0, pci_siig10x_fn }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_10x_850, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE2, 1, 921600, + 0, 0, pci_siig10x_fn }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S_10x_550, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE2 | SPCI_FL_BASE_TABLE, 2, 921600, + 0, 0, pci_siig10x_fn }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S_10x_650, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE2 | SPCI_FL_BASE_TABLE, 2, 921600, + 0, 0, pci_siig10x_fn }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S_10x_850, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE2 | SPCI_FL_BASE_TABLE, 2, 921600, + 0, 0, pci_siig10x_fn }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_10x_550, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE2 | SPCI_FL_BASE_TABLE, 2, 921600, + 0, 0, pci_siig10x_fn }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_10x_650, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE2 | SPCI_FL_BASE_TABLE, 2, 921600, + 0, 0, pci_siig10x_fn }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_10x_850, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE2 | SPCI_FL_BASE_TABLE, 2, 921600, + 0, 0, pci_siig10x_fn }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_4S_10x_550, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE2 | SPCI_FL_BASE_TABLE, 4, 921600, + 0, 0, pci_siig10x_fn }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_4S_10x_650, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE2 | SPCI_FL_BASE_TABLE, 4, 921600, + 0, 0, pci_siig10x_fn }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_4S_10x_850, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE2 | SPCI_FL_BASE_TABLE, 4, 921600, + 0, 0, pci_siig10x_fn }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S_20x_550, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE0, 1, 921600, + 0, 0, pci_siig20x_fn }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S_20x_650, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE0, 1, 921600, + 0, 0, pci_siig20x_fn }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S_20x_850, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE0, 1, 921600, + 0, 0, pci_siig20x_fn }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_20x_550, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE0, 1, 921600, + 0, 0, pci_siig20x_fn }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_20x_650, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE0, 1, 921600, + 0, 0, pci_siig20x_fn }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_20x_850, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE0, 1, 921600, + 0, 0, pci_siig20x_fn }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2P1S_20x_550, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE0, 1, 921600, + 0, 0, pci_siig20x_fn }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2P1S_20x_650, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE0, 1, 921600, + 0, 0, pci_siig20x_fn }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2P1S_20x_850, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE0, 1, 921600, + 0, 0, pci_siig20x_fn }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S_20x_550, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE0 | SPCI_FL_BASE_TABLE, 2, 921600, + 0, 0, pci_siig20x_fn }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S_20x_650, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE0 | SPCI_FL_BASE_TABLE, 2, 921600, + 0, 0, pci_siig20x_fn }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S_20x_850, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE0 | SPCI_FL_BASE_TABLE, 2, 921600, + 0, 0, pci_siig20x_fn }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_20x_550, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE0 | SPCI_FL_BASE_TABLE, 2, 921600, + 0, 0, pci_siig20x_fn }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_20x_650, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE0 | SPCI_FL_BASE_TABLE, 2, 921600, + 0, 0, pci_siig20x_fn }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_20x_850, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE0 | SPCI_FL_BASE_TABLE, 2, 921600, + 0, 0, pci_siig20x_fn }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_4S_20x_550, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE0 | SPCI_FL_BASE_TABLE, 4, 921600, + 0, 0, pci_siig20x_fn }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_4S_20x_650, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE0 | SPCI_FL_BASE_TABLE, 4, 921600, + 0, 0, pci_siig20x_fn }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_4S_20x_850, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE0 | SPCI_FL_BASE_TABLE, 4, 921600, + 0, 0, pci_siig20x_fn }, + /* Computone devices submitted by Doug McNash dmcnash@computone.com */ + { PCI_VENDOR_ID_COMPUTONE, PCI_DEVICE_ID_COMPUTONE_PG, + PCI_SUBVENDOR_ID_COMPUTONE, PCI_SUBDEVICE_ID_COMPUTONE_PG4, + SPCI_FL_BASE0, 4, 921600, /* IOMEM */ + 0x40, 2, NULL, 0x200 }, + { PCI_VENDOR_ID_COMPUTONE, PCI_DEVICE_ID_COMPUTONE_PG, + PCI_SUBVENDOR_ID_COMPUTONE, PCI_SUBDEVICE_ID_COMPUTONE_PG8, + SPCI_FL_BASE0, 8, 921600, /* IOMEM */ + 0x40, 2, NULL, 0x200 }, + { PCI_VENDOR_ID_COMPUTONE, PCI_DEVICE_ID_COMPUTONE_PG, + PCI_SUBVENDOR_ID_COMPUTONE, PCI_SUBDEVICE_ID_COMPUTONE_PG6, + SPCI_FL_BASE0, 6, 921600, /* IOMEM */ + 0x40, 2, NULL, 0x200 }, + /* Digitan DS560-558, from jimd@esoft.com */ + { PCI_VENDOR_ID_ATT, PCI_DEVICE_ID_ATT_VENUS_MODEM, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE1, 1, 115200 }, + /* 3Com US Robotics 56k Voice Internal PCI model 5610 */ + { PCI_VENDOR_ID_USR, 0x1008, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE0, 1, 115200 }, + /* Titan Electronic cards */ + { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_100, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE0, 1, 921600 }, + { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_200, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE0, 2, 921600 }, + { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_400, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE0, 4, 921600 }, + { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_800B, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE0, 4, 921600 }, + /* EKF addition for i960 Boards form EKF with serial port */ + { PCI_VENDOR_ID_INTEL, 0x1960, + 0xE4BF, PCI_ANY_ID, + SPCI_FL_BASE0, 32, 921600, /* max 256 ports */ + 8<<2, 2, pci_inteli960ni_fn, 0x10000}, + /* + * Untested PCI modems, sent in from various folks... + */ + /* Elsa Model 56K PCI Modem, from Andreas Rath */ + { PCI_VENDOR_ID_ROCKWELL, 0x1004, + 0x1048, 0x1500, + SPCI_FL_BASE1, 1, 115200 }, +#if 0 /* No definition for PCI_DEVICE_ID_NEC_NILE4 */ + /* + * NEC Vrc-5074 (Nile 4) builtin UART. + */ + { PCI_VENDOR_ID_NEC, PCI_DEVICE_ID_NEC_NILE4, + PCI_ANY_ID, PCI_ANY_ID, + SPCI_FL_BASE0, 1, 520833, + 64, 3, NULL, 0x300 }, +#endif + /* Generic serial board */ + { 0, 0, + 0, 0, + SPCI_FL_BASE0, 1, 115200 }, +}; + +/* + * Given a complete unknown PCI device, try to use some heuristics to + * guess what the configuration might be, based on the pitiful PCI + * serial specs. Returns 0 on success, 1 on failure. + */ +static int _INLINE_ serial_pci_guess_board(struct pci_dev *dev, + struct pci_board *board) +{ + int num_iomem = 0, num_port = 0, first_port = -1; + int i; + + /* + * If it is not a communications device or the programming + * interface is greater than 6, give up. + * + * (Should we try to make guesses for multiport serial devices + * later?) + */ + if ((dev->class >> 8) != PCI_CLASS_COMMUNICATION_SERIAL || + (dev->class & 0xff) > 6) + return 1; + + for (i=0; i < 6; i++) { + if (IS_PCI_REGION_IOPORT(dev, i)) { + num_port = 0; + if (first_port == -1) + first_port = i; + } else { + num_iomem++; + } + } + + /* + * If there is 1 or 0 iomem regions, and exactly one port, use + * it. + */ + if (num_iomem <= 1 && num_port == 1) { + board->flags = first_port; + return 0; + } + return 1; +} + + + +/* + * Query PCI space for known serial boards + * If found, add them to the PCI device space in rs_table[] + * + * Accept a maximum of eight boards + * + */ +static void __init probe_serial_pci(void) +{ + struct pci_dev *dev = NULL; + struct pci_board *board; + +#ifdef SERIAL_DEBUG_PCI + printk(KERN_DEBUG "Entered probe_serial_pci()\n"); +#endif + + if (!pcibios_present()) { +#ifdef SERIAL_DEBUG_PCI + printk(KERN_DEBUG "Leaving probe_serial_pci() (no pcibios)\n"); +#endif + return; + } + + pci_for_each_dev(dev) { + for (board = pci_boards; board->vendor; board++) { + if (board->vendor != (unsigned short) PCI_ANY_ID && + dev->vendor != board->vendor) + continue; + if (board->device != (unsigned short) PCI_ANY_ID && + dev->device != board->device) + continue; + if (board->subvendor != (unsigned short) PCI_ANY_ID && + pci_get_subvendor(dev) != board->subvendor) + continue; + if (board->subdevice != (unsigned short) PCI_ANY_ID && + pci_get_subdevice(dev) != board->subdevice) + continue; + break; + } + + if (board->vendor == 0 && serial_pci_guess_board(dev, board)) + continue; + + start_pci_pnp_board(dev, board); + } + +#ifdef SERIAL_DEBUG_PCI + printk(KERN_DEBUG "Leaving probe_serial_pci() (probe finished)\n"); +#endif + return; +} + +#endif /* ENABLE_SERIAL_PCI */ + +#ifdef ENABLE_SERIAL_PNP + +static struct pci_board pnp_devices[] __initdata = { + /* Rockwell 56K ACF II Fax+Data+Voice Modem */ + { ISAPNP_VENDOR('A', 'K', 'Y'), ISAPNP_DEVICE(0x1021), 0, 0, + SPCI_FL_BASE0 | SPCI_FL_NO_SHIRQ | SPCI_FL_PNPDEFAULT, + 1, 115200 }, + /* ASKEY 56K Plug&Play Modem */ + { ISAPNP_VENDOR('A', 'S', 'K'), ISAPNP_DEVICE(0x0004), 0, 0, + SPCI_FL_BASE0 | SPCI_FL_PNPDEFAULT, 1, 115200 }, + /* AZT3005 PnP SOUND DEVICE */ + { ISAPNP_VENDOR('A', 'Z', 'T'), ISAPNP_DEVICE(0x4001), 0, 0, + SPCI_FL_BASE0 | SPCI_FL_PNPDEFAULT, 1, 115200 }, + /* Best Data Products Inc. Smart One 336F PnP Modem */ + { ISAPNP_VENDOR('B', 'D', 'P'), ISAPNP_DEVICE(0x3336), 0, 0, + SPCI_FL_BASE0 | SPCI_FL_PNPDEFAULT, 1, 115200 }, + /* Boca Research 33,600 ACF Modem */ + { ISAPNP_VENDOR('B', 'R', 'I'), ISAPNP_DEVICE(0x1400), 0, 0, + SPCI_FL_BASE0 | SPCI_FL_PNPDEFAULT, 1, 115200 }, + /* Davicom 33.6 PNP Modem */ + { ISAPNP_VENDOR('D', 'A', 'V'), ISAPNP_DEVICE(0x0336), 0, 0, + SPCI_FL_BASE0 | SPCI_FL_PNPDEFAULT, 1, 115200 }, + /* Creative Modem Blaster Flash56 DI5601-1 */ + { ISAPNP_VENDOR('D', 'M', 'B'), ISAPNP_DEVICE(0x1032), 0, 0, + SPCI_FL_BASE0 | SPCI_FL_PNPDEFAULT, 1, 115200 }, + /* Creative Modem Blaster V.90 DI5660 */ + { ISAPNP_VENDOR('D', 'M', 'B'), ISAPNP_DEVICE(0x2001), 0, 0, + SPCI_FL_BASE0 | SPCI_FL_PNPDEFAULT, 1, 115200 }, + /* Motorola VoiceSURFR 56K Modem */ + { ISAPNP_VENDOR('M', 'O', 'T'), ISAPNP_DEVICE(0x15F0), 0, 0, + SPCI_FL_BASE0 | SPCI_FL_PNPDEFAULT, 1, 115200 }, + /* Pace 56 Voice Internal Plug & Play Modem */ + { ISAPNP_VENDOR('P', 'M', 'C'), ISAPNP_DEVICE(0x2430), 0, 0, + SPCI_FL_BASE0 | SPCI_FL_PNPDEFAULT, 1, 115200 }, + /* SupraExpress 28.8 Data/Fax PnP modem */ + { ISAPNP_VENDOR('S', 'U', 'P'), ISAPNP_DEVICE(0x1310), 0, 0, + SPCI_FL_BASE0 | SPCI_FL_PNPDEFAULT, 1, 115200 }, + /* US Robotics Sporster 33600 Modem */ + { ISAPNP_VENDOR('U', 'S', 'R'), ISAPNP_DEVICE(0x0006), 0, 0, + SPCI_FL_BASE0 | SPCI_FL_PNPDEFAULT, 1, 115200 }, + /* U.S. Robotics 56K FAX INT */ + { ISAPNP_VENDOR('U', 'S', 'R'), ISAPNP_DEVICE(0x3031), 0, 0, + SPCI_FL_BASE0 | SPCI_FL_PNPDEFAULT, 1, 115200 }, + /* U.S. Robotics 56k FAX INT */ + { ISAPNP_VENDOR('U', 'S', 'R'), ISAPNP_DEVICE(0x3050), 0, 0, + SPCI_FL_BASE0 | SPCI_FL_PNPDEFAULT, 1, 115200 }, + /* Viking 56K FAX INT */ + { ISAPNP_VENDOR('R', 'S', 'S'), ISAPNP_DEVICE(0x0262), 0, 0, + SPCI_FL_BASE0 | SPCI_FL_PNPDEFAULT, 1, 115200 }, + + /* These ID's are taken from M$ documentation */ + /* Compaq 14400 Modem */ + { ISAPNP_VENDOR('P', 'N', 'P'), ISAPNP_DEVICE(0xC000), 0, 0, + SPCI_FL_BASE0 | SPCI_FL_PNPDEFAULT, 1, 115200 }, + /* Compaq 2400/9600 Modem */ + { ISAPNP_VENDOR('P', 'N', 'P'), ISAPNP_DEVICE(0xC001), 0, 0, + SPCI_FL_BASE0 | SPCI_FL_PNPDEFAULT, 1, 115200 }, + /* Generic standard PC COM port */ + { ISAPNP_VENDOR('P', 'N', 'P'), ISAPNP_DEVICE(0x0500), 0, 0, + SPCI_FL_BASE0 | SPCI_FL_PNPDEFAULT, 1, 115200 }, + /* Generic 16550A-compatible COM port */ + { ISAPNP_VENDOR('P', 'N', 'P'), ISAPNP_DEVICE(0x0501), 0, 0, + SPCI_FL_BASE0 | SPCI_FL_PNPDEFAULT, 1, 115200 }, + /* Generic ISA PnP serial board */ + { 0, 0, 0, 0, + SPCI_FL_BASE0 | SPCI_FL_NO_SHIRQ | SPCI_FL_PNPDEFAULT, + 1, 115200 }, + { 0, } +}; + +static void inline avoid_irq_share(struct pci_dev *dev) +{ + int i, map = 0x1FF8; + struct serial_state *state = rs_table; + struct isapnp_irq *irq; + struct isapnp_resources *res = dev->sysdata; + + for (i = 0; i < NR_PORTS; i++) { + if (state->type != PORT_UNKNOWN) + clear_bit(state->irq, &map); + state++; + } + + for ( ; res; res = res->alt) + for(irq = res->irq; irq; irq = irq->next) + irq->map = map; +} + +static char *modem_names[] = { + "MODEM", "Modem", "modem", "FAX", "Fax", "fax", + "56K", "56k", "K56", "33.6", "28.8", "14.4", + "33,600", "28,800", "14,400", "33.600", "28.800", "14.400", + "33600", "28800", "14400", "V.90", "V.34", "V.32", 0 +}; + +static int check_name(char *name) +{ + char **tmp = modem_names; + + while (*tmp) { + if (strstr(name, *tmp)) + return 1; + tmp++; + } + return 0; +} + +/* + * Given a complete unknown ISA PnP device, try to use some heuristics to + * detect modems. Currently use such heuristic set: + * - dev->name or dev->bus->name must contain "modem" substring; + * - device must have only one IO region (8 byte long) with base adress + * 0x2e8, 0x3e8, 0x2f8 or 0x3f8. + * + * Such detection looks very ugly, but can detect at least some of numerous + * ISA PnP modems, alternatively we must hardcode all modems in pnp_devices[] + * table. + */ +static int _INLINE_ serial_pnp_guess_board(struct pci_dev *dev, + struct pci_board *board) +{ + struct isapnp_resources *res = (struct isapnp_resources *)dev->sysdata; + struct isapnp_resources *resa; + + if (dev->active) + return 1; + + if (!(check_name(dev->name) || check_name(dev->bus->name))) + return 1; + + if (res->next) + return 1; + + for (resa = res->alt; resa; resa = resa->alt) { + struct isapnp_port *port; + for (port = res->port; port; port = port->next) + if ((port->size == 8) && + ((port->min == 0x2f8) || + (port->min == 0x3f8) || + (port->min == 0x2e8) || + (port->min == 0x3e8))) + return 0; + } + + return 1; +} + +static void __init probe_serial_pnp(void) +{ + struct pci_dev *dev = NULL; + struct pci_board *board; + +#ifdef SERIAL_DEBUG_PNP + printk("Entered probe_serial_pnp()\n"); +#endif + if (!isapnp_present()) { +#ifdef SERIAL_DEBUG_PNP + printk("Leaving probe_serial_pnp() (no isapnp)\n"); +#endif + return; + } + + isapnp_for_each_dev(dev) { + for (board = pnp_devices; board->vendor; board++) + if ((dev->vendor == board->vendor) && + (dev->device == board->device)) + break; + if (board->vendor == 0 && serial_pnp_guess_board(dev, board)) + continue; + + if (board->flags & SPCI_FL_NO_SHIRQ) + avoid_irq_share(dev); + start_pci_pnp_board(dev, board); + } + +#ifdef SERIAL_DEBUG_PNP + printk("Leaving probe_serial_pnp() (probe finished)\n"); +#endif + return; +} + +#endif /* ENABLE_SERIAL_PNP */ + /* * The serial driver boot-time initialization code! */ -__initfunc(int rs_init(void)) +int __init rs_init(void) { int i; struct serial_state * state; - extern void atomwide_serial_init (void); - extern void dualsp_serial_init (void); -#ifdef CONFIG_ATOMWIDE_SERIAL - atomwide_serial_init (); -#endif -#ifdef CONFIG_DUALSP_SERIAL - dualsp_serial_init (); + if (timer_table[RS_TIMER].fn) { + printk("RS_TIMER already set, another serial driver " + "already loaded?\n"); +#ifdef MODULE + printk("Can't load serial driver module over built-in " + "serial driver\n"); #endif + return -EBUSY; + } init_bh(SERIAL_BH, do_serial_bh); timer_table[RS_TIMER].fn = rs_timer; @@ -3123,17 +4637,23 @@ memset(&serial_driver, 0, sizeof(struct tty_driver)); serial_driver.magic = TTY_DRIVER_MAGIC; +#if (LINUX_VERSION_CODE > 0x20100) serial_driver.driver_name = "serial"; +#endif +#if (LINUX_VERSION_CODE > 0x2032D) + serial_driver.name = "tts/%d"; +#else serial_driver.name = "ttyS"; +#endif serial_driver.major = TTY_MAJOR; - serial_driver.minor_start = 64; + serial_driver.minor_start = 64 + SERIAL_DEV_OFFSET; serial_driver.num = NR_PORTS; serial_driver.type = TTY_DRIVER_TYPE_SERIAL; serial_driver.subtype = SERIAL_TYPE_NORMAL; serial_driver.init_termios = tty_std_termios; serial_driver.init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL; - serial_driver.flags = TTY_DRIVER_REAL_RAW; + serial_driver.flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_NO_DEVFS; serial_driver.refcount = &serial_refcount; serial_driver.table = serial_table; serial_driver.termios = serial_termios; @@ -3150,25 +4670,35 @@ serial_driver.ioctl = rs_ioctl; serial_driver.throttle = rs_throttle; serial_driver.unthrottle = rs_unthrottle; - serial_driver.send_xchar = rs_send_xchar; serial_driver.set_termios = rs_set_termios; serial_driver.stop = rs_stop; serial_driver.start = rs_start; serial_driver.hangup = rs_hangup; +#if (LINUX_VERSION_CODE >= 131394) /* Linux 2.1.66 */ serial_driver.break_ctl = rs_break; +#endif +#if (LINUX_VERSION_CODE >= 131343) + serial_driver.send_xchar = rs_send_xchar; serial_driver.wait_until_sent = rs_wait_until_sent; serial_driver.read_proc = rs_read_proc; +#endif /* * The callout device is just like normal device except for * major number and the subtype code. */ callout_driver = serial_driver; +#if (LINUX_VERSION_CODE > 0x2032D) + callout_driver.name = "cua/%d"; +#else callout_driver.name = "cua"; +#endif callout_driver.major = TTYAUX_MAJOR; callout_driver.subtype = SERIAL_TYPE_CALLOUT; +#if (LINUX_VERSION_CODE >= 131343) callout_driver.read_proc = 0; callout_driver.proc_entry = 0; +#endif if (tty_register_driver(&serial_driver)) panic("Couldn't register serial driver\n"); @@ -3190,15 +4720,13 @@ state->icount.frame = state->icount.parity = 0; state->icount.overrun = state->icount.brk = 0; state->irq = irq_cannonicalize(state->irq); - if (check_region(state->port,8)) + if (state->hub6) + state->io_type = SERIAL_IO_HUB6; + if (state->port && check_region(state->port,8)) continue; if (state->flags & ASYNC_BOOT_AUTOCONF) autoconfig(state); } - /* - * Detect the IRQ only once every port is initialised, - * because some 16450 do not reset to 0 the MCR register. - */ for (i = 0, state = rs_table; i < NR_PORTS; i++,state++) { if (state->type == PORT_UNKNOWN) continue; @@ -3206,29 +4734,60 @@ && (state->flags & ASYNC_AUTO_IRQ) && (state->port != 0)) state->irq = detect_uart_irq(state); - printk(KERN_INFO "ttyS%02d%s at 0x%04x (irq = %d) is a %s\n", - state->line, + printk(KERN_INFO "ttyS%02d%s at 0x%04lx (irq = %d) is a %s\n", + state->line + SERIAL_DEV_OFFSET, (state->flags & ASYNC_FOURPORT) ? " FourPort" : "", state->port, state->irq, uart_config[state->type].name); + tty_register_devfs(&serial_driver, 0, + serial_driver.minor_start + state->line); + tty_register_devfs(&callout_driver, 0, + callout_driver.minor_start + state->line); } +#ifdef ENABLE_SERIAL_PCI + probe_serial_pci(); +#endif +#ifdef ENABLE_SERIAL_PNP + probe_serial_pnp(); +#endif return 0; } /* - * register_serial and unregister_serial allows for serial ports to be + * register_serial and unregister_serial allows for 16x50 serial ports to be * configured at run-time, to support PCMCIA modems. */ + +/** + * register_serial - configure a 16x50 serial port at runtime + * @req: request structure + * + * Configure the serial port specified by the request. If the + * port exists and is in use an error is returned. If the port + * is not currently in the table it is added. + * + * The port is then probed and if neccessary the IRQ is autodetected + * If this fails an error is returned. + * + * On success the port is ready to use and the line number is returned. + */ + int register_serial(struct serial_struct *req) { int i; unsigned long flags; struct serial_state *state; + struct async_struct *info; + unsigned long port; - save_flags(flags); - cli(); + port = req->port; + if (HIGH_BITS_OFFSET) + port += req->port_high << HIGH_BITS_OFFSET; + + save_flags(flags); cli(); for (i = 0; i < NR_PORTS; i++) { - if (rs_table[i].port == req->port) + if ((rs_table[i].port == port) && + (rs_table[i].iomem_base == req->iomem_base)) break; } if (i == NR_PORTS) { @@ -3244,14 +4803,25 @@ state = &rs_table[i]; if (rs_table[i].count) { restore_flags(flags); - printk("Couldn't configure serial #%d (port=%d,irq=%d): " - "device already open\n", i, req->port, req->irq); + printk("Couldn't configure serial #%d (port=%ld,irq=%d): " + "device already open\n", i, port, req->irq); return -1; } state->irq = req->irq; - state->port = req->port; + state->port = port; state->flags = req->flags; - + state->io_type = req->io_type; + state->iomem_base = req->iomem_base; + state->iomem_reg_shift = req->iomem_reg_shift; + if (req->baud_base) + state->baud_base = req->baud_base; + if ((info = state->info) != NULL) { + info->port = port; + info->flags = req->flags; + info->io_type = req->io_type; + info->iomem_base = req->iomem_base; + info->iomem_reg_shift = req->iomem_reg_shift; + } autoconfig(state); if (state->type == PORT_UNKNOWN) { restore_flags(flags); @@ -3260,36 +4830,52 @@ } restore_flags(flags); - if ((state->flags & ASYNC_AUTO_IRQ) && (state->port != 0)) + if ((state->flags & ASYNC_AUTO_IRQ) && CONFIGURED_SERIAL_PORT(state)) state->irq = detect_uart_irq(state); - printk(KERN_INFO "tty%02d at 0x%04x (irq = %d) is a %s\n", - state->line, state->port, state->irq, - uart_config[state->type].name); - return state->line; + printk(KERN_INFO "ttyS%02d at %s 0x%04lx (irq = %d) is a %s\n", + state->line + SERIAL_DEV_OFFSET, + state->iomem_base ? "iomem" : "port", + state->iomem_base ? (unsigned long)state->iomem_base : + state->port, state->irq, uart_config[state->type].name); + tty_register_devfs(&serial_driver, 0, + serial_driver.minor_start + state->line); + tty_register_devfs(&callout_driver, 0, + callout_driver.minor_start + state->line); + return state->line + SERIAL_DEV_OFFSET; } +/** + * unregister_serial - deconfigure a 16x50 serial port + * @line: line to deconfigure + * + * The port specified is deconfigured and its resources are freed. Any + * user of the port is disconnected as if carrier was dropped. Line is + * the port number returned by register_serial(). + */ + void unregister_serial(int line) { unsigned long flags; struct serial_state *state = &rs_table[line]; - save_flags(flags); - cli(); + save_flags(flags); cli(); if (state->info && state->info->tty) tty_hangup(state->info->tty); state->type = PORT_UNKNOWN; printk(KERN_INFO "tty%02d unloaded\n", state->line); + /* These will be hidden, because they are devices that will no longer + * be available to the system. (ie, PCMCIA modems, once ejected) + */ + tty_unregister_devfs(&serial_driver, + serial_driver.minor_start + state->line); + tty_unregister_devfs(&callout_driver, + callout_driver.minor_start + state->line); restore_flags(flags); } #ifdef MODULE -int init_module(void) -{ - return rs_init(); -} - -void cleanup_module(void) +void rs_fini(void) { unsigned long flags; int e1, e2; @@ -3297,8 +4883,7 @@ struct async_struct *info; /* printk("Unloading %s: version %s\n", serial_name, serial_version); */ - save_flags(flags); - cli(); + save_flags(flags); cli(); timer_active &= ~(1 << RS_TIMER); timer_table[RS_TIMER].fn = NULL; timer_table[RS_TIMER].expires = 0; @@ -3312,22 +4897,40 @@ restore_flags(flags); for (i = 0; i < NR_PORTS; i++) { - if (rs_table[i].type != PORT_UNKNOWN) - release_region(rs_table[i].port, 8); - info = rs_table[i].info; - if (info) { + if ((info = rs_table[i].info)) { rs_table[i].info = NULL; kfree_s(info, sizeof(struct async_struct)); } + if ((rs_table[i].type != PORT_UNKNOWN) && rs_table[i].port) + release_region(rs_table[i].port, 8); +#if defined(ENABLE_SERIAL_PCI) || defined(ENABLE_SERIAL_PNP) + if (rs_table[i].iomem_base) + iounmap(rs_table[i].iomem_base); +#endif + } +#if defined(ENABLE_SERIAL_PCI) || defined(ENABLE_SERIAL_PNP) + for (i=0; i < serial_pci_board_idx; i++) { + struct pci_board_inst *brd = &serial_pci_board[i]; + + if (brd->board.init_fn) + (brd->board.init_fn)(brd->dev, &brd->board, 0); + + if (DEACTIVATE_FUNC(brd->dev)) + (DEACTIVATE_FUNC(brd->dev))(brd->dev); } +#endif if (tmp_buf) { - free_page((unsigned long) tmp_buf); + unsigned long pg = (unsigned long) tmp_buf; tmp_buf = NULL; + free_page(pg); } } #endif /* MODULE */ +module_init(rs_init); +module_exit(rs_fini); + /* * ------------------------------------------------------------ * Serial console driver @@ -3337,52 +4940,53 @@ #define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE) +static struct async_struct async_sercons; + /* * Wait for transmitter & holding register to empty */ -static inline void wait_for_xmitr(struct serial_state *ser) +static inline void wait_for_xmitr(struct async_struct *info) { - int lsr; unsigned int tmout = 1000000; - do { - lsr = inb(ser->port + UART_LSR); - if (--tmout == 0) break; - } while ((lsr & BOTH_EMPTY) != BOTH_EMPTY); + while (--tmout && + ((serial_in(info, UART_LSR) & BOTH_EMPTY) != BOTH_EMPTY)); } + /* * Print a string to the serial port trying not to disturb * any possible real use of the port... + * + * The console_lock must be held when we get here. */ static void serial_console_write(struct console *co, const char *s, unsigned count) { - struct serial_state *ser; + static struct async_struct *info = &async_sercons; int ier; unsigned i; - ser = rs_table + co->index; /* * First save the IER then disable the interrupts */ - ier = inb(ser->port + UART_IER); - outb(0x00, ser->port + UART_IER); + ier = serial_in(info, UART_IER); + serial_out(info, UART_IER, 0x00); /* * Now, do each character */ for (i = 0; i < count; i++, s++) { - wait_for_xmitr(ser); + wait_for_xmitr(info); /* * Send the character out. * If a LF, also do CR... */ - outb(*s, ser->port + UART_TX); + serial_out(info, UART_TX, *s); if (*s == 10) { - wait_for_xmitr(ser); - outb(13, ser->port + UART_TX); + wait_for_xmitr(info); + serial_out(info, UART_TX, 13); } } @@ -3390,8 +4994,8 @@ * Finally, Wait for transmitter & holding register to empty * and restore the IER */ - wait_for_xmitr(ser); - outb(ier, ser->port + UART_IER); + wait_for_xmitr(info); + serial_out(info, UART_IER, ier); } /* @@ -3399,30 +5003,26 @@ */ static int serial_console_wait_key(struct console *co) { - struct serial_state *ser; - int ier; - int lsr; - int c; + static struct async_struct *info; + int ier, c; - ser = rs_table + co->index; + info = &async_sercons; /* * First save the IER then disable the interrupts so * that the real driver for the port does not get the * character. */ - ier = inb(ser->port + UART_IER); - outb(0x00, ser->port + UART_IER); - - do { - lsr = inb(ser->port + UART_LSR); - } while (!(lsr & UART_LSR_DR)); - c = inb(ser->port + UART_RX); + ier = serial_in(info, UART_IER); + serial_out(info, UART_IER, 0x00); + + while ((serial_in(info, UART_LSR) & UART_LSR_DR) == 0); + c = serial_in(info, UART_RX); /* * Restore the interrupts */ - outb(ier, ser->port + UART_IER); + serial_out(info, UART_IER, ier); return c; } @@ -3438,9 +5038,10 @@ * - initialize the serial port * Return non-zero if we didn't find a serial port. */ -__initfunc(static int serial_console_setup(struct console *co, char *options)) +static int __init serial_console_setup(struct console *co, char *options) { - struct serial_state *ser; + static struct async_struct *info; + struct serial_state *state; unsigned cval; int baud = 9600; int bits = 8; @@ -3448,6 +5049,9 @@ int cflag = CREAD | HUPCL | CLOCAL; int quot = 0; char *s; +#if defined(CONFIG_KDB) + extern int kdb_port; +#endif if (options) { baud = simple_strtoul(options, NULL, 10); @@ -3510,8 +5114,19 @@ /* * Divisor, bytesize and parity */ - ser = rs_table + co->index; - quot = ser->baud_base / baud; + state = rs_table + co->index; + info = &async_sercons; + info->magic = SERIAL_MAGIC; + info->state = state; + info->port = state->port; + info->flags = state->flags; +#ifdef CONFIG_HUB6 + info->hub6 = state->hub6; +#endif + info->io_type = state->io_type; + info->iomem_base = state->iomem_base; + info->iomem_reg_shift = state->iomem_reg_shift; + quot = state->baud_base / baud; cval = cflag & (CSIZE | CSTOPB); #if defined(__powerpc__) || defined(__alpha__) cval >>= 8; @@ -3527,18 +5142,27 @@ * Disable UART interrupts, set DTR and RTS high * and set speed. */ - outb(cval | UART_LCR_DLAB, ser->port + UART_LCR); /* set DLAB */ - outb(quot & 0xff, ser->port + UART_DLL); /* LS of divisor */ - outb(quot >> 8, ser->port + UART_DLM); /* MS of divisor */ - outb(cval, ser->port + UART_LCR); /* reset DLAB */ - outb(0, ser->port + UART_IER); - outb(UART_MCR_DTR | UART_MCR_RTS, ser->port + UART_MCR); + serial_out(info, UART_LCR, cval | UART_LCR_DLAB); /* set DLAB */ + serial_out(info, UART_DLL, quot & 0xff); /* LS of divisor */ + serial_out(info, UART_DLM, quot >> 8); /* MS of divisor */ + serial_out(info, UART_LCR, cval); /* reset DLAB */ + serial_out(info, UART_IER, 0); + serial_out(info, UART_MCR, UART_MCR_DTR | UART_MCR_RTS); /* * If we read 0xff from the LSR, there is no UART here. */ - if (inb(ser->port + UART_LSR) == 0xff) + if (serial_in(info, UART_LSR) == 0xff) return -1; + +#if defined(CONFIG_KDB) + /* + * Remember I/O port for kdb + */ + if (kdb_port == 0 ) + kdb_port = ser->port; +#endif /* CONFIG_KDB */ + return 0; } @@ -3559,9 +5183,14 @@ /* * Register console. */ -__initfunc (long serial_console_init(long kmem_start, long kmem_end)) +void __init serial_console_init(void) { register_console(&sercons); - return kmem_start; } #endif + +/* + Local variables: + compile-command: "gcc -D__KERNEL__ -I../../include -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -fno-strict-aliasing -D__SMP__ -pipe -fno-strength-reduce -march=i586 -DMODULE -DMODVERSIONS -include ../../include/linux/modversions.h -DEXPORT_SYMTAB -c serial.c" + End: +*/ Index: oldkernel/linux/drivers/char/serial_compat.h diff -u /dev/null linux/drivers/char/serial_compat.h:1.1 --- /dev/null Mon Jul 31 21:15:05 2000 +++ linux/drivers/char/serial_compat.h Fri Jul 7 16:18:17 2000 @@ -0,0 +1,388 @@ +/* + * Nasty compatibility functions that don't need to go into the + * mainline kernel. + */ + +#if (LINUX_VERSION_CODE < 131343) /* 2.1.15 -- XX get correct version */ +#define __init +#endif + +#if (LINUX_VERSION_CODE < 0x20000) +typedef dev_t kdev_t; +#endif + +#if (LINUX_VERSION_CODE < 0x02017E) +static signed long schedule_timeout(signed long timeout) +{ + unsigned long expire; + + expire = timeout + jiffies; + + current->timeout = jiffies + timeout; + schedule(); + + timeout = expire - jiffies; + return timeout < 0 ? 0 : timeout; +} +#endif + +#ifndef time_after +#define time_after(a,b) ((long)(b) - (long)(a) < 0) +#endif + +#if (LINUX_VERSION_CODE < 0x020100) +static inline int irq_cannonicalize(int irq) +{ + return ((irq == 2) ? 9 : irq); +} +#endif + +#if (LINUX_VERSION_CODE < 131336) +static int copy_from_user(void *to, const void *from_user, unsigned long len) +{ + int error; + + error = verify_area(VERIFY_READ, from_user, len); + if (error) + return len; + memcpy_fromfs(to, from_user, len); + return 0; +} + +static int copy_to_user(void *to_user, const void *from, unsigned long len) +{ + int error; + + error = verify_area(VERIFY_WRITE, to_user, len); + if (error) + return len; + memcpy_tofs(to_user, from, len); + return 0; +} + +static inline int signal_pending(struct task_struct *p) +{ + return (p->signal & (~p->blocked != 0)); +} + +#endif + +#if (LINUX_VERSION_CODE < 131394) /* 2.1.66 */ +#define test_and_clear_bit(x,y) clear_bit(x,y) + +static inline void remove_bh(int nr) +{ + bh_base[nr] = NULL; + bh_mask &= ~(1 << nr); +} +#endif + +#ifndef set_current_state +#define set_current_state(state_value) \ + do { current->state = state_value; } while (0) +#endif + +#ifndef DECLARE_WAITQUEUE +#define DECLARE_WAITQUEUE(wait, current) \ + struct wait_queue wait = { current, NULL } +#define init_waitqueue_head(head) init_waitqueue(head) +#endif + +#ifndef CAP_SYS_ADMIN +#define capable(x) (suser()) +#endif + +#if (LINUX_VERSION_CODE < 0x020317) /* 2.3.23 */ +#define get_zeroed_page(x) get_free_page(x) +#endif + +/* Deal with the interface change in 2.3.23 */ +#if defined(CONFIG_SERIAL_CONSOLE) && (LINUX_VERSION_CODE < 0x020317) +void __init serial_console_init_real(void); +long __init serial_console_init(long kmem_start, long kmem_end) +{ + serial_console_init_real(); + return kmem_start; +} + +#define serial_console_init serial_console_init_real + +#endif + +#ifndef pci_for_each_dev +#define pci_for_each_dev(dev) for (dev=pci_devices;dev;dev=dev->next) + +/* + * New kernels define dev->subsystem_vendor and dev->subsystem device, + * which we don't have. So we have to play some games... + */ + static u16 compat__tmp; + +#define pci_get_subvendor(dev) (pci_read_config_word(dev, \ + PCI_SUBSYSTEM_VENDOR_ID, &compat__tmp), compat__tmp) +#define pci_get_subdevice(dev) (pci_read_config_word(dev, \ + PCI_SUBSYSTEM_ID, &compat__tmp), compat__tmp) + +#endif + +#ifndef PCI_NUM_RESOURCES +#define IS_PCI_REGION_IOPORT(dev, r) (((dev)->base_address[(r)] & \ + PCI_BASE_ADDRESS_SPACE)) +#define pci_resource_start(dev, r) ((dev)->base_address[(r)] & \ + (IS_PCI_REGION_IOPORT(dev, r) ? PCI_BASE_ADDRESS_IO_MASK : \ + PCI_BASE_ADDRESS_MEM_MASK)) +/* Too hard to figure out, so we just return a minimum size. */ +#define pci_resource_len(dev, r) 8 +#endif + +#ifndef DEVICE_COUNT_IRQ +#define PCI_IRQ_RESOURCE(dev, r) ((dev)->irq) + +/* + * Old kernels don't have ISAPNP support, so they don't have + * dev->prepare and dev->activate. Compensate. + */ +#define PREPARE_FUNC(dev) ((int (*)(struct pci_dev *)) 0) +#define ACTIVATE_FUNC(dev) ((int (*)(struct pci_dev *)) 0) +#define DEACTIVATE_FUNC(dev) ((int (*)(struct pci_dev *)) 0) + +#endif + +#if (LINUX_VERSION_CODE <= 0x2032D) +static void tty_register_devfs (struct tty_driver *driver, unsigned int flags, + unsigned int minor) +{ + return; +} + +static void tty_unregister_devfs (struct tty_driver *driver, unsigned minor) +{ + return; +} +#endif + +/* + * Compatibility with the new module_init() code + */ +#ifndef module_init +#ifdef MODULE +#define module_init(x) int init_module(void) { return x(); } +#define module_exit(x) void cleanup_module(void) { x(); } +#else +#define module_init(x) /* nothing */ +#define module_exit(x) /* nothing */ +#endif +#endif /* module_init */ + + +/* New termbits definitions */ +#ifndef TIOCM_OUT1 +#define TIOCM_OUT1 0x2000 +#define TIOCM_OUT2 0x4000 +#endif + +#ifndef TIOCM_LOOP +#define TIOCM_LOOP 0x8000 +#endif + +#ifndef TTY_DRIVER_NO_DEVFS +#define TTY_DRIVER_NO_DEVFS 0 +#endif + +/* Define new-style CPU configs */ +#if (defined(__i386__) && (defined(CPU))) +#if CPU == 386 +#define CONFIG_M386 +#endif +#if CPU == 486 +#define CONFIG_M486 +#endif +#endif + +/* + * Some PCI identifiers which might not be in pci.h + */ + +#ifndef PCI_VENDOR_ID_V3 +#define PCI_VENDOR_ID_V3 0x11b0 +#define PCI_DEVICE_ID_V3_V960 0x0001 +#define PCI_DEVICE_ID_V3_V350 0x0001 +#define PCI_DEVICE_ID_V3_V960V2 0x0002 +#define PCI_DEVICE_ID_V3_V350V2 0x0002 +#endif + +#ifndef PCI_VENDOR_ID_SEALEVEL +#define PCI_VENDOR_ID_SEALEVEL 0x135e +#define PCI_DEVICE_ID_SEALEVEL_U530 0x7101 +#define PCI_DEVICE_ID_SEALEVEL_UCOMM2 0x7201 +#define PCI_DEVICE_ID_SEALEVEL_UCOMM422 0x7402 +#define PCI_DEVICE_ID_SEALEVEL_UCOMM232 0x7202 +#define PCI_DEVICE_ID_SEALEVEL_COMM4 0x7401 +#define PCI_DEVICE_ID_SEALEVEL_COMM8 0x7801 +#endif + +#ifndef PCI_SUBVENDOR_ID_CONNECT_TECH +#define PCI_SUBVENDOR_ID_CONNECT_TECH 0x12c4 +#define PCI_SUBDEVICE_ID_CONNECT_TECH_BH8_232 0x0001 +#define PCI_SUBDEVICE_ID_CONNECT_TECH_BH4_232 0x0002 +#define PCI_SUBDEVICE_ID_CONNECT_TECH_BH2_232 0x0003 +#define PCI_SUBDEVICE_ID_CONNECT_TECH_BH8_485 0x0004 +#define PCI_SUBDEVICE_ID_CONNECT_TECH_BH8_485_4_4 0x0005 +#define PCI_SUBDEVICE_ID_CONNECT_TECH_BH4_485 0x0006 +#define PCI_SUBDEVICE_ID_CONNECT_TECH_BH4_485_2_2 0x0007 +#define PCI_SUBDEVICE_ID_CONNECT_TECH_BH2_485 0x0008 +#endif + +#ifndef PCI_SUBVENDOR_ID_KEYSPAN +#define PCI_SUBVENDOR_ID_KEYSPAN 0x11a9 +#define PCI_SUBDEVICE_ID_KEYSPAN_SX2 0x5334 +#endif + +#ifndef PCI_DEVICE_ID_PLX_GTEK_SERIAL2 +#define PCI_DEVICE_ID_PLX_GTEK_SERIAL2 0xa001 +#endif + +#ifndef PCI_DEVICE_ID_PLX_SPCOM200 +#define PCI_DEVICE_ID_PLX_SPCOM200 0x1103 +#endif + +#ifndef PCI_DEVICE_ID_PLX_SPCOM800 +#define PCI_DEVICE_ID_PLX_SPCOM800 0x1076 +#endif + +#ifndef PCI_VENDOR_ID_PLX_ROMULUS +#define PCI_VENDOR_ID_PLX_ROMULUS 0x106a +#endif + +#ifndef PCI_VENDOR_ID_TITAN +#define PCI_VENDOR_ID_TITAN 0x14D2 +#define PCI_DEVICE_ID_TITAN_100 0xA001 +#define PCI_DEVICE_ID_TITAN_200 0xA005 +#define PCI_DEVICE_ID_TITAN_400 0xA003 +#define PCI_DEVICE_ID_TITAN_800B 0xA004 +#endif + +#ifndef PCI_VENDOR_ID_PANACOM +#define PCI_VENDOR_ID_PANACOM 0x14d4 +#define PCI_DEVICE_ID_PANACOM_QUADMODEM 0x0400 +#define PCI_DEVICE_ID_PANACOM_DUALMODEM 0x0402 +#endif + +#ifndef PCI_SUBVENDOR_ID_CHASE_PCIFAST +#define PCI_SUBVENDOR_ID_CHASE_PCIFAST 0x12E0 +#define PCI_SUBDEVICE_ID_CHASE_PCIFAST4 0x0031 +#define PCI_SUBDEVICE_ID_CHASE_PCIFAST8 0x0021 +#define PCI_SUBDEVICE_ID_CHASE_PCIFAST16 0x0011 +#define PCI_SUBDEVICE_ID_CHASE_PCIFAST16FMC 0x0041 +#define PCI_SUBVENDOR_ID_CHASE_PCIRAS 0x124D +#define PCI_SUBDEVICE_ID_CHASE_PCIRAS4 0xF001 +#define PCI_SUBDEVICE_ID_CHASE_PCIRAS8 0xF010 +#endif + +#ifndef PCI_VENDOR_ID_QUATECH +#define PCI_VENDOR_ID_QUATECH 0x135C +#define PCI_DEVICE_ID_QUATECH_QSC100 0x0010 +#define PCI_DEVICE_ID_QUATECH_DSC100 0x0020 +#define PCI_DEVICE_ID_QUATECH_DSC200 0x0030 +#define PCI_DEVICE_ID_QUATECH_QSC200 0x0040 +#define PCI_DEVICE_ID_QUATECH_ESC100D 0x0050 +#define PCI_DEVICE_ID_QUATECH_ESC100M 0x0060 +#endif + +#ifndef PCI_VENDOR_ID_ROCKWELL +#define PCI_VENDOR_ID_ROCKWELL 0x127A +#endif + +#ifndef PCI_VENDOR_ID_USR +#define PCI_VENDOR_ID_USR 0x12B9 +#endif + +#ifndef PCI_SUBDEVICE_ID_SPECIALIX_SPEED4 +#define PCI_SUBDEVICE_ID_SPECIALIX_SPEED4 0xa004 +#endif + +#ifndef PCI_VENDOR_ID_OXSEMI +#define PCI_VENDOR_ID_OXSEMI 0x1415 +#define PCI_DEVICE_ID_OXSEMI_16PCI954 0x9501 +#endif + +#ifndef PCI_DEVICE_ID_OXSEMI_16PCI952 +#define PCI_DEVICE_ID_OXSEMI_16PCI952 0x950A +#define PCI_DEVICE_ID_OXSEMI_16PCI95N 0x9511 +#endif + +#ifndef PCI_VENDOR_ID_LAVA +#define PCI_VENDOR_ID_LAVA 0x1407 +#endif + +#ifndef PCI_DEVICE_ID_LAVA_DSERIAL +#define PCI_DEVICE_ID_LAVA_DSERIAL 0x0100 /* 2x 16550 */ +#define PCI_DEVICE_ID_LAVA_QUATRO_A 0x0101 /* 2x 16550, half of 4 port */ +#define PCI_DEVICE_ID_LAVA_QUATRO_B 0x0102 /* 2x 16550, half of 4 port */ +#define PCI_DEVICE_ID_LAVA_PORT_PLUS 0x0200 /* 2x 16650 */ +#define PCI_DEVICE_ID_LAVA_QUAD_A 0x0201 /* 2x 16650, half of 4 port */ +#define PCI_DEVICE_ID_LAVA_QUAD_B 0x0202 /* 2x 16650, half of 4 port */ +#define PCI_DEVICE_ID_LAVA_SSERIAL 0x0500 /* 1x 16550 */ +#define PCI_DEVICE_ID_LAVA_PORT_650 0x0600 /* 1x 16650 */ +#endif + +#ifndef PCI_VENDOR_ID_TIMEDIA +#define PCI_VENDOR_ID_TIMEDIA 0x1409 +#define PCI_DEVICE_ID_TIMEDIA_1889 0x7168 +#endif + +#ifndef PCI_VENDOR_ID_SIIG +#define PCI_VENDOR_ID_SIIG 0x131f +#endif + +#ifndef PCI_DEVICE_ID_SIIG_1S_10x_550 +#define PCI_DEVICE_ID_SIIG_1S_10x_550 0x1000 +#define PCI_DEVICE_ID_SIIG_1S_10x_650 0x1001 +#define PCI_DEVICE_ID_SIIG_1S_10x_850 0x1002 +#define PCI_DEVICE_ID_SIIG_2S_10x_550 0x1030 +#define PCI_DEVICE_ID_SIIG_2S_10x_650 0x1031 +#define PCI_DEVICE_ID_SIIG_2S_10x_850 0x1032 +#define PCI_DEVICE_ID_SIIG_4S_10x_550 0x1050 +#define PCI_DEVICE_ID_SIIG_4S_10x_650 0x1051 +#define PCI_DEVICE_ID_SIIG_4S_10x_850 0x1052 +#define PCI_DEVICE_ID_SIIG_1S_20x_550 0x2000 +#define PCI_DEVICE_ID_SIIG_1S_20x_650 0x2001 +#define PCI_DEVICE_ID_SIIG_1S_20x_850 0x2002 +#define PCI_DEVICE_ID_SIIG_2S_20x_550 0x2030 +#define PCI_DEVICE_ID_SIIG_2S_20x_650 0x2031 +#define PCI_DEVICE_ID_SIIG_2S_20x_850 0x2032 +#define PCI_DEVICE_ID_SIIG_4S_20x_550 0x2050 +#define PCI_DEVICE_ID_SIIG_4S_20x_650 0x2051 +#define PCI_DEVICE_ID_SIIG_4S_20x_850 0x2052 +#define PCI_DEVICE_ID_SIIG_1S1P_10x_550 0x1010 +#define PCI_DEVICE_ID_SIIG_1S1P_10x_650 0x1011 +#define PCI_DEVICE_ID_SIIG_1S1P_10x_850 0x1012 +#define PCI_DEVICE_ID_SIIG_2S1P_10x_550 0x1034 +#define PCI_DEVICE_ID_SIIG_2S1P_10x_650 0x1035 +#define PCI_DEVICE_ID_SIIG_2S1P_10x_850 0x1036 +#define PCI_DEVICE_ID_SIIG_2P1S_20x_550 0x2040 +#define PCI_DEVICE_ID_SIIG_2P1S_20x_650 0x2041 +#define PCI_DEVICE_ID_SIIG_2P1S_20x_850 0x2042 +#define PCI_DEVICE_ID_SIIG_1S1P_20x_550 0x2010 +#define PCI_DEVICE_ID_SIIG_1S1P_20x_650 0x2011 +#define PCI_DEVICE_ID_SIIG_1S1P_20x_850 0x2012 +#define PCI_DEVICE_ID_SIIG_2S1P_20x_550 0x2060 +#define PCI_DEVICE_ID_SIIG_2S1P_20x_650 0x2061 +#define PCI_DEVICE_ID_SIIG_2S1P_20x_850 0x2062 +#endif + +#ifndef PCI_VENDOR_ID_COMPUTONE +#define PCI_VENDOR_ID_COMPUTONE 0x8e0e +#endif + +#ifndef PCI_DEVICE_ID_COMPUTONE_PG +#define PCI_DEVICE_ID_COMPUTONE_PG 0x0302 +#define PCI_SUBVENDOR_ID_COMPUTONE 0x8e0e +#define PCI_SUBDEVICE_ID_COMPUTONE_PG4 0x0001 +#define PCI_SUBDEVICE_ID_COMPUTONE_PG8 0x0002 +#define PCI_SUBDEVICE_ID_COMPUTONE_PG6 0x0003 +#endif + +#ifndef PCI_DEVICE_ID_ATT_VENUS_MODEM +#define PCI_DEVICE_ID_ATT_VENUS_MODEM 0x480 +#endif Index: oldkernel/linux/drivers/char/synclink.c diff -u linux/drivers/char/synclink.c:1.1.1.1 linux/drivers/char/synclink.c:1.2 --- linux/drivers/char/synclink.c:1.1.1.1 Wed May 31 12:33:51 2000 +++ linux/drivers/char/synclink.c Fri Jul 7 15:36:43 2000 @@ -3900,7 +3900,7 @@ done: if (off >= len+begin) return 0; - *start = page + (begin-off); + *start = page + (off-begin); return ((count < begin+len-off) ? count : begin+len-off); } /* end of mgsl_read_proc() */ Index: oldkernel/linux/drivers/isdn/avmb1/capi.c diff -u linux/drivers/isdn/avmb1/capi.c:1.1.1.1 linux/drivers/isdn/avmb1/capi.c:1.2 --- linux/drivers/isdn/avmb1/capi.c:1.1.1.1 Wed May 31 12:33:52 2000 +++ linux/drivers/isdn/avmb1/capi.c Fri Jul 7 15:36:43 2000 @@ -561,7 +561,7 @@ *eof = 1; if (off >= len+begin) return 0; - *start = page + (begin-off); + *start = page + (off-begin); return ((count < begin+len-off) ? count : begin+len-off); } Index: oldkernel/linux/drivers/isdn/avmb1/kcapi.c diff -u linux/drivers/isdn/avmb1/kcapi.c:1.1.1.1 linux/drivers/isdn/avmb1/kcapi.c:1.2 --- linux/drivers/isdn/avmb1/kcapi.c:1.1.1.1 Wed May 31 12:33:52 2000 +++ linux/drivers/isdn/avmb1/kcapi.c Fri Jul 7 15:36:43 2000 @@ -250,7 +250,7 @@ *eof = 1; if (off >= len+begin) return 0; - *start = page + (begin-off); + *start = page + (off-begin); return ((count < begin+len-off) ? count : begin+len-off); } @@ -289,7 +289,7 @@ *eof = 1; if (off >= len+begin) return 0; - *start = page + (begin-off); + *start = page + (off-begin); return ((count < begin+len-off) ? count : begin+len-off); } @@ -321,7 +321,7 @@ *eof = 1; if (off >= len+begin) return 0; - *start = page + (begin-off); + *start = page + (off-begin); return ((count < begin+len-off) ? count : begin+len-off); } @@ -350,7 +350,7 @@ *eof = 1; if (off >= len+begin) return 0; - *start = page + (begin-off); + *start = page + (off-begin); return ((count < begin+len-off) ? count : begin+len-off); } @@ -387,7 +387,7 @@ *eof = 1; if (off >= len+begin) return 0; - *start = page + (begin-off); + *start = page + (off-begin); return ((count < begin+len-off) ? count : begin+len-off); } @@ -424,7 +424,7 @@ *eof = 1; if (off >= len+begin) return 0; - *start = page + (begin-off); + *start = page + (off-begin); return ((count < begin+len-off) ? count : begin+len-off); } @@ -461,7 +461,7 @@ *eof = 1; if (off >= len+begin) return 0; - *start = page + (begin-off); + *start = page + (off-begin); return ((count < begin+len-off) ? count : begin+len-off); } Index: oldkernel/linux/drivers/net/acenic.c diff -u linux/drivers/net/acenic.c:1.2 linux/drivers/net/acenic.c:1.3 --- linux/drivers/net/acenic.c:1.2 Thu Jun 1 15:47:21 2000 +++ linux/drivers/net/acenic.c Fri Jul 7 15:36:43 2000 @@ -29,6 +29,7 @@ * infrastructure and Sparc support * Pierrick Pinasseau (CERN): For lending me an Ultra 5 to test the * driver under Linux/Sparc64 + * Matt Domsch : Detect 1000baseT cards */ #include @@ -70,8 +71,11 @@ #ifndef PCI_VENDOR_ID_ALTEON #define PCI_VENDOR_ID_ALTEON 0x12ae -#define PCI_DEVICE_ID_ALTEON_ACENIC 0x0001 #endif +#ifndef PCI_DEVICE_ID_ALTEON_ACENIC_FIBRE +#define PCI_DEVICE_ID_ALTEON_ACENIC_FIBRE 0x0001 +#define PCI_DEVICE_ID_ALTEON_ACENIC_COPPER 0x0002 +#endif #ifndef PCI_DEVICE_ID_3COM_3C985 #define PCI_DEVICE_ID_3COM_3C985 0x0001 #endif @@ -83,13 +87,13 @@ * They used the DEC vendor ID by mistake */ #ifndef PCI_DEVICE_ID_FARALLON_PN9000SX -#define PCI_DEVICE_ID_FARALLON_PN9000SX 0x1a +#define PCI_DEVICE_ID_FARALLON_PN9000SX 0x1a #endif #ifndef PCI_VENDOR_ID_SGI -#define PCI_VENDOR_ID_SGI 0x10a9 +#define PCI_VENDOR_ID_SGI 0x10a9 #endif #ifndef PCI_DEVICE_ID_SGI_ACENIC -#define PCI_DEVICE_ID_SGI_ACENIC 0x0009 +#define PCI_DEVICE_ID_SGI_ACENIC 0x0009 #endif #ifndef wmb @@ -100,6 +104,17 @@ #define __exit #endif +#ifndef SMP_CACHE_BYTES +#define SMP_CACHE_BYTES L1_CACHE_BYTES +#endif + + +#if (LINUX_VERSION_CODE < 0x02030d) +#define pci_resource_start(dev, bar) dev->base_address[bar] +#elif (LINUX_VERSION_CODE < 0x02032c) +#define pci_resource_start(dev, bar) dev->resource[bar].start +#endif + #if (LINUX_VERSION_CODE < 0x02030e) #define net_device device #endif @@ -121,8 +136,8 @@ return virt_ptr; } #define pci_free_consistent(cookie, size, ptr, dma_ptr) kfree(ptr) -#define pci_map_single(cookie, address, size) virt_to_bus(address) -#define pci_unmap_single(cookie, address, size) +#define pci_map_single(cookie, address, size, dir) virt_to_bus(address) +#define pci_unmap_single(cookie, address, size, dir) #endif #if (LINUX_VERSION_CODE < 0x02032b) @@ -140,18 +155,22 @@ dev->start = 1; } -#define ace_mark_net_bh(foo) mark_bh(foo) -#define ace_if_busy(dev) dev->tbusy -#define ace_if_running(dev) dev->start -#define ace_if_down(dev) {do{dev->start = 0;}while (0);} +#define ace_mark_net_bh(foo) mark_bh(foo) +#define netif_queue_stopped(dev) dev->tbusy +#define netif_running(dev) dev->start +#define ace_if_down(dev) {do{dev->start = 0;}while (0);} #else #define NET_BH 0 #define ace_mark_net_bh(foo) {do{} while(0);} -#define ace_if_busy(dev) test_bit(LINK_STATE_XOFF, &dev->state) -#define ace_if_running(dev) test_bit(LINK_STATE_START, &dev->state) #define ace_if_down(dev) {do{} while(0);} #endif + +#define ACE_MAX_MOD_PARMS 8 +#define BOARD_IDX_STATIC 0 +#define BOARD_IDX_OVERFLOW -1 + + #include "acenic.h" /* @@ -336,30 +355,41 @@ #define ACE_STD_BUFSIZE (ACE_STD_MTU + ETH_HLEN + 2+4+16) #define ACE_JUMBO_BUFSIZE (ACE_JUMBO_MTU + ETH_HLEN + 2+4+16) -#define DEF_TX_RATIO 24 /* * There seems to be a magic difference in the effect between 995 and 996 * but little difference between 900 and 995 ... no idea why. + * + * There is now a default set of tuning parameters which is set, depending + * on whether or not the user enables Jumbo frames. It's assumed that if + * Jumbo frames are enabled, the user wants optimal tuning for that case. */ -#define DEF_TX_COAL 996 +#define DEF_TX_COAL 400 /* 996 */ #define DEF_TX_MAX_DESC 40 -#define DEF_RX_COAL 1000 +#define DEF_RX_COAL 120 /* 1000 */ #define DEF_RX_MAX_DESC 25 +#define DEF_TX_RATIO 21 /* 24 */ + +#define DEF_JUMBO_TX_COAL 20 +#define DEF_JUMBO_TX_MAX_DESC 60 +#define DEF_JUMBO_RX_COAL 30 +#define DEF_JUMBO_RX_MAX_DESC 6 +#define DEF_JUMBO_TX_RATIO 21 + #define TX_COAL_INTS_ONLY 0 /* seems not worth it */ #define DEF_TRACE 0 -#define DEF_STAT 2 * TICKS_PER_SEC +#define DEF_STAT (2 * TICKS_PER_SEC) -static int link[8] = {0, }; -static int trace[8] = {0, }; -static int tx_coal_tick[8] = {0, }; -static int rx_coal_tick[8] = {0, }; -static int max_tx_desc[8] = {0, }; -static int max_rx_desc[8] = {0, }; -static int tx_ratio[8] = {0, }; -static int dis_pci_mem_inval[8] = {1, 1, 1, 1, 1, 1, 1, 1}; +static int link[ACE_MAX_MOD_PARMS] = {0, }; +static int trace[ACE_MAX_MOD_PARMS] = {0, }; +static int tx_coal_tick[ACE_MAX_MOD_PARMS] = {0, }; +static int rx_coal_tick[ACE_MAX_MOD_PARMS] = {0, }; +static int max_tx_desc[ACE_MAX_MOD_PARMS] = {0, }; +static int max_rx_desc[ACE_MAX_MOD_PARMS] = {0, }; +static int tx_ratio[ACE_MAX_MOD_PARMS] = {0, }; +static int dis_pci_mem_inval[ACE_MAX_MOD_PARMS] = {1, 1, 1, 1, 1, 1, 1, 1}; static const char __initdata *version = - "acenic.c: v0.41 02/16/2000 Jes Sorensen, linux-acenic@SunSITE.auc.dk\n" + "acenic.c: v0.44 05/11/2000 Jes Sorensen, linux-acenic@SunSITE.auc.dk\n" " http://home.cern.ch/~jes/gige/acenic.html\n"; static struct net_device *root_dev = NULL; @@ -394,7 +424,8 @@ while ((pdev = pci_find_class(PCI_CLASS_NETWORK_ETHERNET<<8, pdev))) { if (!((pdev->vendor == PCI_VENDOR_ID_ALTEON) && - (pdev->device == PCI_DEVICE_ID_ALTEON_ACENIC)) && + ((pdev->device == PCI_DEVICE_ID_ALTEON_ACENIC_FIBRE) || + (pdev->device == PCI_DEVICE_ID_ALTEON_ACENIC_COPPER)) ) && !((pdev->vendor == PCI_VENDOR_ID_3COM) && (pdev->device == PCI_DEVICE_ID_3COM_3C985)) && !((pdev->vendor == PCI_VENDOR_ID_NETGEAR) && @@ -469,22 +500,12 @@ pci_set_master(pdev); -#ifdef __sparc__ - /* NOTE: Cache line size is in 32-bit word units. */ - pci_write_config_byte(pdev, PCI_CACHE_LINE_SIZE, 0x10); -#endif - /* * Remap the regs into kernel space - this is abuse of * dev->base_addr since it was means for I/O port * addresses but who gives a damn. */ -#if (LINUX_VERSION_CODE < 0x02030d) - dev->base_addr = pdev->base_address[0]; -#else - dev->base_addr = pdev->resource[0].start; -#endif - + dev->base_addr = pci_resource_start(pdev, 0); ap->regs = (struct ace_regs *)ioremap(dev->base_addr, 0x4000); if (!ap->regs) { printk(KERN_ERR "%s: Unable to map I/O register, " @@ -540,8 +561,7 @@ if ((readl(&ap->regs->HostCtrl) >> 28) == 4) { printk(KERN_ERR "%s: Driver compiled without Tigon I" " support - NIC disabled\n", dev->name); - iounmap(ap->regs); - unregister_netdev(dev); + ace_init_cleanup(dev); continue; } #endif @@ -550,13 +570,17 @@ continue; #ifdef MODULE - if (ace_init(dev, boards_found)) - continue; + if (boards_found >= ACE_MAX_MOD_PARMS) + ap->board_idx = BOARD_IDX_OVERFLOW; + else + ap->board_idx = boards_found; #else - if (ace_init(dev, -1)) - continue; + ap->board_idx = BOARD_IDX_STATIC; #endif + if (ace_init(dev)) + continue; + boards_found++; } @@ -566,20 +590,16 @@ * or more boards. Otherwise, return failure (-ENODEV). */ -#ifdef MODULE - return boards_found; -#else if (boards_found > 0) return 0; else return -ENODEV; -#endif } #ifdef MODULE MODULE_AUTHOR("Jes Sorensen "); -MODULE_DESCRIPTION("AceNIC/3C985 Gigabit Ethernet driver"); +MODULE_DESCRIPTION("AceNIC/3C985/GA620 Gigabit Ethernet driver"); MODULE_PARM(link, "1-" __MODULE_STRING(8) "i"); MODULE_PARM(trace, "1-" __MODULE_STRING(8) "i"); MODULE_PARM(tx_coal_tick, "1-" __MODULE_STRING(8) "i"); @@ -597,7 +617,7 @@ while (root_dev) { next = ((struct ace_private *)root_dev->priv)->next; - ap = (struct ace_private *)root_dev->priv; + ap = root_dev->priv; regs = ap->regs; @@ -632,7 +652,8 @@ ap->rx_std_ring[i].size = 0; ap->skb->rx_std_skbuff[i].skb = NULL; pci_unmap_single(ap->pdev, mapping, - ACE_STD_BUFSIZE - (2 + 16)); + ACE_STD_BUFSIZE - (2 + 16), + PCI_DMA_FROMDEVICE); dev_kfree_skb(skb); } } @@ -647,7 +668,8 @@ ap->rx_mini_ring[i].size = 0; ap->skb->rx_mini_skbuff[i].skb = NULL; pci_unmap_single(ap->pdev, mapping, - ACE_MINI_BUFSIZE - (2 + 16)); + ACE_MINI_BUFSIZE - (2 + 16), + PCI_DMA_FROMDEVICE); dev_kfree_skb(skb); } } @@ -662,43 +684,32 @@ ap->rx_jumbo_ring[i].size = 0; ap->skb->rx_jumbo_skbuff[i].skb = NULL; pci_unmap_single(ap->pdev, mapping, - ACE_JUMBO_BUFSIZE - (2 + 16)); + ACE_JUMBO_BUFSIZE - (2 + 16), + PCI_DMA_FROMDEVICE); dev_kfree_skb(skb); } } - - ace_free_descriptors(root_dev); - if (ap->trace_buf) - kfree(ap->trace_buf); - if (ap->info) - pci_free_consistent(ap->pdev, sizeof(struct ace_info), - ap->info, ap->info_dma); - if (ap->skb) - kfree(ap->skb); - if (root_dev->irq) - free_irq(root_dev->irq, root_dev); - unregister_netdev(root_dev); - iounmap(regs); + ace_init_cleanup(root_dev); kfree(root_dev); - root_dev = next; } } +#endif int __init ace_module_init(void) { - int cards; + int status; root_dev = NULL; #ifdef NEW_NETINIT - cards = acenic_probe(); + status = acenic_probe(); #else - cards = acenic_probe(NULL); + status = acenic_probe(NULL); #endif - return cards ? 0 : -ENODEV; + return status; } @@ -713,11 +724,7 @@ { ace_module_cleanup(); } -#endif -#endif - - -#if (LINUX_VERSION_CODE >= 0x02032a) +#else module_init(ace_module_init); module_exit(ace_module_cleanup); #endif @@ -814,10 +821,36 @@ fail: /* Clean up. */ + ace_init_cleanup(dev); + return 1; +} + + +/* + * Generic cleanup handling data allocated during init. Used when the + * module is unloaded or if an error occurs during initialization + */ +static void ace_init_cleanup(struct net_device *dev) +{ + struct ace_private *ap; + + ap = dev->priv; + ace_free_descriptors(dev); - iounmap(ap->regs); + + if (ap->info) + pci_free_consistent(ap->pdev, sizeof(struct ace_info), + ap->info, ap->info_dma); + if (ap->skb) + kfree(ap->skb); + if (ap->trace_buf) + kfree(ap->trace_buf); + + if (dev->irq) + free_irq(dev->irq, dev); + unregister_netdev(dev); - return 1; + iounmap(ap->regs); } @@ -837,19 +870,22 @@ } -static int __init ace_init(struct net_device *dev, int board_idx) +static int __init ace_init(struct net_device *dev) { struct ace_private *ap; struct ace_regs *regs; struct ace_info *info = NULL; unsigned long tmp_ptr, myjif; u32 tig_ver, mac1, mac2, tmp, pci_state; - int ecode = 0; + int board_idx, ecode = 0; short i; + unsigned char cache; ap = dev->priv; regs = ap->regs; + board_idx = ap->board_idx; + /* * aman@sgi.com - its useful to do a NIC reset here to * address the `Firmware not running' problem subsequent @@ -965,6 +1001,21 @@ dev->dev_addr[4] = (mac2 >> 8) & 0xff; dev->dev_addr[5] = mac2 & 0xff; + /* + * Looks like this is necessary to deal with on all architectures, + * even this %$#%$# N440BX Intel based thing doesn't get it right. + * Ie. having two NICs in the machine, one will have the cache + * line set at boot time, the other will not. + */ + pci_read_config_byte(ap->pdev, PCI_CACHE_LINE_SIZE, &cache); + if ((cache << 2) != SMP_CACHE_BYTES) { + printk(KERN_INFO " PCI cache line size set incorrectly " + "(%i bytes) by BIOS/FW, corring to %i\n", + (cache << 2), SMP_CACHE_BYTES); + pci_write_config_byte(ap->pdev, PCI_CACHE_LINE_SIZE, + SMP_CACHE_BYTES >> 2); + } + pci_state = readl(®s->PciState); printk(KERN_INFO " PCI bus width: %i bits, speed: %iMHz, " "latency: %i clks\n", @@ -988,19 +1039,20 @@ /* * Tuning parameters only supported for 8 cards */ - if (board_idx > 7 || dis_pci_mem_inval[board_idx]) { + if (board_idx == BOARD_IDX_OVERFLOW || + dis_pci_mem_inval[board_idx]) { if (ap->pci_command & PCI_COMMAND_INVALIDATE) { ap->pci_command &= ~PCI_COMMAND_INVALIDATE; pci_write_config_word(ap->pdev, PCI_COMMAND, ap->pci_command); - printk(KERN_INFO "%s: disabling PCI memory " - "write and invalidate\n", dev->name); + printk(KERN_INFO " Disabling PCI memory " + "write and invalidate\n"); } } else if (ap->pci_command & PCI_COMMAND_INVALIDATE) { - printk(KERN_INFO "%s: PCI memory write & invalidate " - "enabled by BIOS, enabling counter " - "measures\n", dev->name); - switch(L1_CACHE_BYTES) { + printk(KERN_INFO " PCI memory write & invalidate " + "enabled by BIOS, enabling counter measures\n"); + + switch(SMP_CACHE_BYTES) { case 16: tmp |= DMA_WRITE_MAX_16; break; @@ -1020,8 +1072,37 @@ } } } + +#ifdef __sparc__ + /* + * On this platform, we know what the best dma settings + * are. We use 64-byte maximum bursts, because if we + * burst larger than the cache line size (or even cross + * a 64byte boundry in a single burst) the UltraSparc + * PCI controller will disconnect at 64-byte multiples. + * + * Read-multiple will be properly enabled above, and when + * set will give the PCI controller proper hints about + * prefetching. + */ + tmp = tmp & ~DMA_READ_WRITE_MASK; + tmp |= DMA_READ_MAX_64; + tmp |= DMA_WRITE_MAX_64; +#endif writel(tmp, ®s->PciState); +#if 0 + /* + * I have received reports from people having problems when this + * bit is enabled. + */ + if (!(ap->pci_command & PCI_COMMAND_FAST_BACK)) { + printk(KERN_INFO " Enabling PCI Fast Back to Back\n"); + ap->pci_command |= PCI_COMMAND_FAST_BACK; + pci_write_config_word(ap->pdev, PCI_COMMAND, ap->pci_command); + } +#endif + /* * Initialize the generic info block and the command+event rings * and the control blocks for the transmit and receive rings @@ -1195,21 +1276,15 @@ writel(1, ®s->AssistState); writel(DEF_STAT, ®s->TuneStatTicks); - - writel(DEF_TX_COAL, ®s->TuneTxCoalTicks); - writel(DEF_TX_MAX_DESC, ®s->TuneMaxTxDesc); - writel(DEF_RX_COAL, ®s->TuneRxCoalTicks); - writel(DEF_RX_MAX_DESC, ®s->TuneMaxRxDesc); writel(DEF_TRACE, ®s->TuneTrace); - writel(DEF_TX_RATIO, ®s->TxBufRat); - if (board_idx >= 8) { - printk(KERN_WARNING "%s: more then 8 NICs detected, " - "ignoring module parameters!\n", dev->name); - board_idx = -1; - } + ace_set_rxtx_parms(dev, 0); - if (board_idx >= 0) { + if (board_idx == BOARD_IDX_OVERFLOW) { + printk(KERN_WARNING "%s: more then %i NICs detected, " + "ignoring module parameters!\n", + dev->name, ACE_MAX_MOD_PARMS); + } else if (board_idx >= 0) { if (tx_coal_tick[board_idx]) writel(tx_coal_tick[board_idx], ®s->TuneTxCoalTicks); @@ -1334,8 +1409,6 @@ writel(readl(®s->CpuBCtrl) | CPU_HALT, ®s->CpuBCtrl); writel(0, ®s->Mb0Lo); - free_irq(dev->irq, dev); - dev->irq = 0; ecode = -EBUSY; goto init_error; @@ -1358,27 +1431,63 @@ "the RX mini ring\n", dev->name); } return 0; + init_error: - iounmap(ap->regs); - unregister_netdev(dev); - if (ap->skb) { - kfree(ap->skb); - ap->skb = NULL; - } - if (ap->info) - pci_free_consistent(ap->pdev, sizeof(struct ace_info), - info, ap->info_dma); + ace_init_cleanup(dev); return ecode; } +static void ace_set_rxtx_parms(struct net_device *dev, int jumbo) +{ + struct ace_private *ap; + struct ace_regs *regs; + int board_idx; + + ap = dev->priv; + regs = ap->regs; + + board_idx = ap->board_idx; + + if (board_idx >= 0) { + if (!jumbo) { + if (!tx_coal_tick[board_idx]) + writel(DEF_TX_COAL, ®s->TuneTxCoalTicks); + if (!max_tx_desc[board_idx]) + writel(DEF_TX_MAX_DESC, ®s->TuneMaxTxDesc); + if (!rx_coal_tick[board_idx]) + writel(DEF_RX_COAL, ®s->TuneRxCoalTicks); + if (!max_rx_desc[board_idx]) + writel(DEF_RX_MAX_DESC, ®s->TuneMaxRxDesc); + if (!tx_ratio[board_idx]) + writel(DEF_TX_RATIO, ®s->TxBufRat); + } else { + if (!tx_coal_tick[board_idx]) + writel(DEF_JUMBO_TX_COAL, + ®s->TuneTxCoalTicks); + if (!max_tx_desc[board_idx]) + writel(DEF_JUMBO_TX_MAX_DESC, + ®s->TuneMaxTxDesc); + if (!rx_coal_tick[board_idx]) + writel(DEF_JUMBO_RX_COAL, + ®s->TuneRxCoalTicks); + if (!max_rx_desc[board_idx]) + writel(DEF_JUMBO_RX_MAX_DESC, + ®s->TuneMaxRxDesc); + if (!tx_ratio[board_idx]) + writel(DEF_JUMBO_TX_RATIO, ®s->TxBufRat); + } + } +} + + /* * Monitor the card to detect hangs. */ static void ace_timer(unsigned long data) { struct net_device *dev = (struct net_device *)data; - struct ace_private *ap = (struct ace_private *)dev->priv; + struct ace_private *ap = dev->priv; struct ace_regs *regs = ap->regs; /* @@ -1441,7 +1550,7 @@ { #if 0 if (!ap->trace_buf) - if (!(ap->trace_buf = kmalloc(ACE_TRACE_SIZE, GFP_KERNEL))); + if (!(ap->trace_buf = kmalloc(ACE_TRACE_SIZE, GFP_KERNEL))) return; #endif } @@ -1477,7 +1586,8 @@ */ skb_reserve(skb, 2 + 16); mapping = pci_map_single(ap->pdev, skb->data, - ACE_STD_BUFSIZE - (2 + 16)); + ACE_STD_BUFSIZE - (2 + 16), + PCI_DMA_FROMDEVICE); ap->skb->rx_std_skbuff[idx].skb = skb; ap->skb->rx_std_skbuff[idx].mapping = mapping; @@ -1538,7 +1648,8 @@ */ skb_reserve(skb, 2 + 16); mapping = pci_map_single(ap->pdev, skb->data, - ACE_MINI_BUFSIZE - (2 + 16)); + ACE_MINI_BUFSIZE - (2 + 16), + PCI_DMA_FROMDEVICE); ap->skb->rx_mini_skbuff[idx].skb = skb; ap->skb->rx_mini_skbuff[idx].mapping = mapping; @@ -1596,7 +1707,8 @@ */ skb_reserve(skb, 2 + 16); mapping = pci_map_single(ap->pdev, skb->data, - ACE_JUMBO_BUFSIZE - (2 + 16)); + ACE_JUMBO_BUFSIZE - (2 + 16), + PCI_DMA_FROMDEVICE); ap->skb->rx_jumbo_skbuff[idx].skb = skb; ap->skb->rx_jumbo_skbuff[idx].mapping = mapping; @@ -1643,7 +1755,7 @@ { struct ace_private *ap; - ap = (struct ace_private *)dev->priv; + ap = dev->priv; while (evtcsm != evtprd) { switch (ap->evt_ring[evtcsm].evt) { @@ -1658,16 +1770,23 @@ case E_LNK_STATE: { u16 code = ap->evt_ring[evtcsm].code; - if (code == E_C_LINK_UP) { + switch (code) { + case E_C_LINK_UP: printk(KERN_WARNING "%s: Optical link UP\n", dev->name); - } - else if (code == E_C_LINK_DOWN) + break; + case E_C_LINK_DOWN: printk(KERN_WARNING "%s: Optical link DOWN\n", dev->name); - else + break; + case E_C_LINK_10_100: + printk(KERN_WARNING "%s: 10/100BaseT link " + "UP\n", dev->name); + break; + default: printk(KERN_ERR "%s: Unknown optical link " "state %02x\n", dev->name, code); + } break; } case E_ERROR: @@ -1721,7 +1840,7 @@ static void ace_rx_int(struct net_device *dev, u32 rxretprd, u32 rxretcsm) { - struct ace_private *ap = (struct ace_private *)dev->priv; + struct ace_private *ap = dev->priv; u32 idx; int mini_count = 0, std_count = 0; @@ -1774,7 +1893,8 @@ skb = rip->skb; rip->skb = NULL; - pci_unmap_single(ap->pdev, rip->mapping, mapsize); + pci_unmap_single(ap->pdev, rip->mapping, mapsize, + PCI_DMA_FROMDEVICE); skb_put(skb, retdesc->size); #if 0 /* unncessary */ @@ -1839,7 +1959,7 @@ u32 txcsm, rxretcsm, rxretprd; u32 evtcsm, evtprd; - ap = (struct ace_private *)dev->priv; + ap = dev->priv; regs = ap->regs; /* @@ -1877,11 +1997,16 @@ dma_addr_t mapping; skb = ap->skb->tx_skbuff[idx].skb; + if (skb == NULL) { + idx = (idx + 1) % TX_RING_ENTRIES; + continue; + } mapping = ap->skb->tx_skbuff[idx].mapping; ap->stats.tx_packets++; ap->stats.tx_bytes += skb->len; - pci_unmap_single(ap->pdev, mapping, skb->len); + pci_unmap_single(ap->pdev, mapping, skb->len, + PCI_DMA_TODEVICE); dev_kfree_skb_irq(skb); ap->skb->tx_skbuff[idx].skb = NULL; @@ -1907,7 +2032,7 @@ * Ie. skip the comparison of the tx producer vs. the * consumer. */ - if (ace_if_busy(dev) && xchg(&ap->tx_full, 0)) { + if (netif_queue_stopped(dev) && xchg(&ap->tx_full, 0)) { /* * This does not need to be atomic (and expensive), * I've seen cases where it would fail otherwise ;-( @@ -1938,7 +2063,7 @@ * This has to go last in the interrupt handler and run with * the spin lock released ... what lock? */ - if (ace_if_running(dev)) { + if (netif_running(dev)) { int cur_size; int run_bh = 0; @@ -2087,7 +2212,7 @@ ace_if_down(dev); netif_stop_queue(dev); - ap = (struct ace_private *)dev->priv; + ap = dev->priv; regs = ap->regs; del_timer(&ap->timer); @@ -2122,7 +2247,8 @@ writel(0, &ap->tx_ring[i].addr.addrhi); writel(0, &ap->tx_ring[i].addr.addrlo); writel(0, &ap->tx_ring[i].flagsize); - pci_unmap_single(ap->pdev, mapping, skb->len); + pci_unmap_single(ap->pdev, mapping, skb->len, + PCI_DMA_TODEVICE); dev_kfree_skb(skb); ap->skb->tx_skbuff[i].skb = NULL; } @@ -2144,7 +2270,7 @@ static int ace_start_xmit(struct sk_buff *skb, struct net_device *dev) { - struct ace_private *ap = (struct ace_private *)dev->priv; + struct ace_private *ap = dev->priv; struct ace_regs *regs = ap->regs; unsigned long addr; u32 idx, flagsize; @@ -2172,7 +2298,8 @@ ap->skb->tx_skbuff[idx].skb = skb; ap->skb->tx_skbuff[idx].mapping = - pci_map_single(ap->pdev, skb->data, skb->len); + pci_map_single(ap->pdev, skb->data, skb->len, + PCI_DMA_TODEVICE); addr = (unsigned long) ap->skb->tx_skbuff[idx].mapping; #if (BITS_PER_LONG == 64) writel(addr >> 32, &ap->tx_ring[idx].addr.addrhi); @@ -2243,12 +2370,13 @@ ap->jumbo = 1; if (!test_and_set_bit(0, &ap->jumbo_refill_busy)) ace_load_jumbo_rx_ring(ap, RX_JUMBO_SIZE); - ap->jumbo = 1; + ace_set_rxtx_parms(dev, 1); } } else { netif_stop_queue(dev); while (test_and_set_bit(0, &ap->jumbo_refill_busy)); synchronize_irq(); + ace_set_rxtx_parms(dev, 0); if (ap->jumbo){ struct cmd cmd; @@ -2266,7 +2394,7 @@ static int ace_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) { #ifdef ETHTOOL - struct ace_private *ap = (struct ace_private *) dev->priv; + struct ace_private *ap = dev->priv; struct ace_regs *regs = ap->regs; struct ethtool_cmd ecmd; u32 link, speed; @@ -2408,7 +2536,7 @@ u16 *da; struct cmd cmd; - if(ace_if_running(dev)) + if(netif_running(dev)) return -EBUSY; memcpy(dev->dev_addr, addr->sa_data,dev->addr_len); @@ -2566,7 +2694,7 @@ struct ace_private *ap; struct ace_regs *regs; - ap = (struct ace_private *)dev->priv; + ap = dev->priv; regs = ap->regs; if (!(readl(®s->CpuCtrl) & CPU_HALTED)) { Index: oldkernel/linux/drivers/net/acenic.h diff -u linux/drivers/net/acenic.h:1.2 linux/drivers/net/acenic.h:1.3 --- linux/drivers/net/acenic.h:1.2 Thu Jun 1 15:47:21 2000 +++ linux/drivers/net/acenic.h Fri Jul 7 15:36:43 2000 @@ -233,6 +233,7 @@ #define DMA_WRITE_MAX_128 0xa0 #define DMA_WRITE_MAX_256 0xc0 #define DMA_WRITE_MAX_1K 0xe0 +#define DMA_READ_WRITE_MASK 0xfc #define MEM_READ_MULTIPLE 0x00020000 #define PCI_66MHZ 0x00080000 #define PCI_32BIT 0x00100000 @@ -323,7 +324,7 @@ #define E_LNK_STATE 0x06 #define E_C_LINK_UP 0x01 #define E_C_LINK_DOWN 0x02 -#define E_C_LINK_UP_FAST 0x03 +#define E_C_LINK_10_100 0x03 #define E_ERROR 0x07 #define E_C_ERR_INVAL_CMD 0x01 @@ -635,6 +636,7 @@ unsigned char *trace_buf; struct pci_dev *pdev; struct net_device *next; + int board_idx; u16 pci_command; u8 pci_latency; char name[48]; @@ -698,7 +700,7 @@ /* * Prototypes */ -static int ace_init(struct net_device *dev, int board_idx); +static int ace_init(struct net_device *dev); static void ace_load_std_rx_ring(struct ace_private *ap, int nr_bufs); static void ace_load_mini_rx_ring(struct ace_private *ap, int nr_bufs); static void ace_load_jumbo_rx_ring(struct ace_private *ap, int nr_bufs); @@ -717,8 +719,10 @@ #endif static int ace_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd); static int ace_set_mac_addr(struct net_device *dev, void *p); +static void ace_set_rxtx_parms(struct net_device *dev, int jumbo); static int ace_allocate_descriptors(struct net_device *dev); static void ace_free_descriptors(struct net_device *dev); +static void ace_init_cleanup(struct net_device *dev); static struct net_device_stats *ace_get_stats(struct net_device *dev); static int read_eeprom_byte(struct net_device *dev, unsigned long offset); Index: oldkernel/linux/drivers/net/acenic_firmware.h diff -u linux/drivers/net/acenic_firmware.h:1.2 linux/drivers/net/acenic_firmware.h:1.3 --- linux/drivers/net/acenic_firmware.h:1.2 Thu Jun 1 15:47:21 2000 +++ linux/drivers/net/acenic_firmware.h Fri Jul 7 15:36:43 2000 @@ -5,17 +5,17 @@ */ #define tigonFwReleaseMajor 0xc #define tigonFwReleaseMinor 0x4 -#define tigonFwReleaseFix 0x5 +#define tigonFwReleaseFix 0xb #define tigonFwStartAddr 0x00004000 #define tigonFwTextAddr 0x00004000 -#define tigonFwTextLen 0x11190 -#define tigonFwRodataAddr 0x00015190 +#define tigonFwTextLen 0x11140 +#define tigonFwRodataAddr 0x00015140 #define tigonFwRodataLen 0xac0 -#define tigonFwDataAddr 0x00015c80 +#define tigonFwDataAddr 0x00015c20 #define tigonFwDataLen 0x170 -#define tigonFwSbssAddr 0x00015df0 -#define tigonFwSbssLen 0x34 -#define tigonFwBssAddr 0x00015e30 +#define tigonFwSbssAddr 0x00015d90 +#define tigonFwSbssLen 0x38 +#define tigonFwBssAddr 0x00015dd0 #define tigonFwBssLen 0x2080 u32 tigonFwText[]; u32 tigonFwData[]; @@ -25,16 +25,16 @@ u32 tigonFwText[(MAX_TEXT_LEN/4) + 1] __initdata = { 0x10000003, 0x0, 0xd, 0xd, 0x3c1d0001, -0x8fbd5cb4, 0x3a0f021, 0x3c100000, 0x26104000, +0x8fbd5c54, 0x3a0f021, 0x3c100000, 0x26104000, 0xc00100c, 0x0, 0xd, 0x27bdffd8, 0x3c1cc000, 0x3c1b0013, 0x377bd800, 0xd021, 0x3c170013, 0x36f75418, 0x2e02021, 0x340583e8, 0xafbf0024, 0xc002488, 0xafb00020, 0xc0023e8, -0x0, 0x3c040001, 0x248451f4, 0x24050001, -0x2e03021, 0x3821, 0x3c100001, 0x26107eb0, +0x0, 0x3c040001, 0x248451a4, 0x24050001, +0x2e03021, 0x3821, 0x3c100001, 0x26107e50, 0xafb00010, 0xc002403, 0xafbb0014, 0x3c02000f, 0x3442ffff, 0x2021024, 0x362102b, 0x10400009, -0x24050003, 0x3c040001, 0x24845200, 0x2003021, +0x24050003, 0x3c040001, 0x248451b0, 0x2003021, 0x3603821, 0x3c020010, 0xafa20010, 0xc002403, 0xafa00014, 0x2021, 0x3405c000, 0x3c010001, 0x370821, 0xa02083b0, 0x3c010001, 0x370821, @@ -72,7 +72,7 @@ 0x0, 0x8ee20450, 0x8ee30454, 0xaee304fc, 0x8ee204fc, 0x2442e000, 0x2c422001, 0x1440000d, 0x26e40030, 0x8ee20450, 0x8ee30454, 0x3c040001, -0x2484520c, 0x3c050001, 0xafa00010, 0xafa00014, +0x248451bc, 0x3c050001, 0xafa00010, 0xafa00014, 0x8ee704fc, 0x34a5f000, 0xc002403, 0x603021, 0x26e40030, 0xc002488, 0x24050400, 0x27440080, 0xc002488, 0x24050080, 0x26e4777c, 0xc002488, @@ -82,7 +82,7 @@ 0x3442ca00, 0x2021, 0x24030002, 0xaee30074, 0xaee30070, 0xaee2006c, 0x240203e8, 0xaee20104, 0x24020001, 0xaee30100, 0xaee2010c, 0x3c030001, -0x641821, 0x90635c80, 0x2e41021, 0x24840001, +0x641821, 0x90635c20, 0x2e41021, 0x24840001, 0xa043009c, 0x2c82000f, 0x1440fff8, 0x0, 0x8f820040, 0x2e41821, 0x24840001, 0x21702, 0x24420030, 0xa062009c, 0x2e41021, 0xa040009c, @@ -128,7 +128,7 @@ 0x8ee24e30, 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0x24020007, 0xac820000, 0x24020001, 0xac820004, 0x54c0000c, -0xaee90608, 0x3c040001, 0x24845218, 0xafa00010, +0xaee90608, 0x3c040001, 0x248451c8, 0xafa00010, 0xafa00014, 0x8ee60608, 0x8f470228, 0x3c050009, 0xc002403, 0x34a5f000, 0x8001223, 0x0, 0x8f830120, 0x27623800, 0x24660020, 0xc2102b, @@ -154,21 +154,21 @@ 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0x24020012, 0xac820000, 0x24020001, 0xac820004, 0x14c0001b, 0x0, -0x3c040001, 0x24845220, 0xafa00010, 0xafa00014, +0x3c040001, 0x248451d0, 0xafa00010, 0xafa00014, 0x8ee60608, 0x8f470228, 0x3c050009, 0xc002403, 0x34a5f001, 0x8ee201b0, 0x24420001, 0xaee201b0, -0x8001223, 0x8ee201b0, 0x3c040001, 0x2484522c, +0x8001223, 0x8ee201b0, 0x3c040001, 0x248451dc, 0xafa00014, 0x8ee60608, 0x8f470228, 0x3c050009, 0xc002403, 0x34a5f005, 0x8ee201ac, 0x24420001, 0xaee201ac, 0x8ee201ac, 0x8ee20160, 0x3c040001, -0x24845238, 0x3405f001, 0x24420001, 0xaee20160, +0x248451e8, 0x3405f001, 0x24420001, 0xaee20160, 0x8ee20160, 0x3021, 0x3821, 0xafa00010, 0xc002403, 0xafa00014, 0x8001238, 0x0, 0x3c020001, 0x2442f5a8, 0x21100, 0x21182, 0x431025, 0x3c010001, 0xac221278, 0x96e2045a, 0x30420003, 0x10400025, 0x3c050fff, 0x8ee204c8, 0x34a5ffff, 0x34420a00, 0xaee204c8, 0x8ee304c8, -0x3c040001, 0x24845244, 0x24020001, 0xa2e204ec, +0x3c040001, 0x248451f4, 0x24020001, 0xa2e204ec, 0xa2e204ed, 0x3c020002, 0x621825, 0x3c020001, 0x2442a390, 0x451024, 0x21082, 0xaee304c8, 0x3c030800, 0x431025, 0x3c010001, 0xac221220, @@ -211,7 +211,7 @@ 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0x24020007, 0xac820000, 0x24020001, 0xac820004, 0x54c0000c, 0xaee90608, 0x3c040001, -0x24845218, 0xafa00010, 0xafa00014, 0x8ee60608, +0x248451c8, 0xafa00010, 0xafa00014, 0x8ee60608, 0x8f470228, 0x3c050009, 0xc002403, 0x34a5f000, 0x800136d, 0x0, 0x8f830120, 0x27623800, 0x24660020, 0xc2102b, 0x50400001, 0x27663000, @@ -236,17 +236,17 @@ 0x1021, 0x8ee24e30, 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0x24020012, 0xac820000, 0x24020001, 0xac820004, -0x14c0001b, 0x0, 0x3c040001, 0x24845220, +0x14c0001b, 0x0, 0x3c040001, 0x248451d0, 0xafa00010, 0xafa00014, 0x8ee60608, 0x8f470228, 0x3c050009, 0xc002403, 0x34a5f001, 0x8ee201b0, 0x24420001, 0xaee201b0, 0x800136d, 0x8ee201b0, -0x3c040001, 0x2484522c, 0xafa00014, 0x8ee60608, +0x3c040001, 0x248451dc, 0xafa00014, 0x8ee60608, 0x8f470228, 0x3c050009, 0xc002403, 0x34a5f005, 0x8ee201ac, 0x24420001, 0xaee201ac, 0x8ee201ac, -0x8ee20160, 0x3c040001, 0x24845238, 0x3405f002, +0x8ee20160, 0x3c040001, 0x248451e8, 0x3405f002, 0x24420001, 0xaee20160, 0x8ee20160, 0x3021, 0x3821, 0xafa00010, 0xc002403, 0xafa00014, -0x96e6047a, 0x96e7046a, 0x3c040001, 0x24845250, +0x96e6047a, 0x96e7046a, 0x3c040001, 0x24845200, 0x24050012, 0xafa00010, 0xc002403, 0xafa00014, 0xc004500, 0x0, 0xc002318, 0x0, 0x3c060001, 0x34c63800, 0xaee00608, 0xaf400228, @@ -289,7 +289,7 @@ 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0x24020007, 0xac820000, 0x24020001, 0xac820004, 0x54c0000c, 0xaee90608, 0x3c040001, -0x24845218, 0xafa00010, 0xafa00014, 0x8ee60608, +0x248451c8, 0xafa00010, 0xafa00014, 0x8ee60608, 0x8f470228, 0x3c050009, 0xc002403, 0x34a5f000, 0x80014a5, 0x0, 0x8f830120, 0x27623800, 0x24660020, 0xc2102b, 0x50400001, 0x27663000, @@ -314,11 +314,11 @@ 0x1021, 0x8ee24e30, 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0x24020012, 0xac820000, 0x24020001, 0xac820004, -0x14c0001b, 0x0, 0x3c040001, 0x24845220, +0x14c0001b, 0x0, 0x3c040001, 0x248451d0, 0xafa00010, 0xafa00014, 0x8ee60608, 0x8f470228, 0x3c050009, 0xc002403, 0x34a5f001, 0x8ee201b0, 0x24420001, 0xaee201b0, 0x80014a5, 0x8ee201b0, -0x3c040001, 0x2484522c, 0xafa00014, 0x8ee60608, +0x3c040001, 0x248451dc, 0xafa00014, 0x8ee60608, 0x8f470228, 0x3c050009, 0xc002403, 0x34a5f005, 0x8ee201ac, 0x24420001, 0xaee201ac, 0x8ee201ac, 0x8ee20154, 0x24420001, 0xaee20154, 0xc0014dc, @@ -340,7 +340,7 @@ 0xaee07b8c, 0xaee07b84, 0x3c010001, 0x370821, 0xac2083bc, 0x3c010001, 0x370821, 0x3e00008, 0xa02083b9, 0x27bdffd8, 0xafbf0024, 0xafb00020, -0x8f820054, 0x3c030001, 0x8c635d38, 0x24420067, +0x8f820054, 0x3c030001, 0x8c635cd8, 0x24420067, 0x1060000d, 0xaf820058, 0x3c020001, 0x571021, 0x904283b8, 0x10400005, 0x3c030200, 0x3c010001, 0x370821, 0x8001503, 0xa02083b8, 0x8ee20000, @@ -358,7 +358,7 @@ 0x0, 0x3c030001, 0x771821, 0x8c6383d4, 0x8f8200b4, 0x1462007c, 0x0, 0x3c070001, 0xf73821, 0x8ce783d0, 0x8f8200b0, 0x3c040001, -0x248452c0, 0xafa00014, 0xafa20010, 0x8f8600b0, +0x24845270, 0xafa00014, 0xafa20010, 0x8f8600b0, 0x3c050005, 0xc002403, 0x34a50900, 0x8f82011c, 0x34420002, 0xaf82011c, 0x8f830104, 0x8f8200b0, 0x34420001, 0xaf8200b0, 0xaf830104, 0x8f830120, @@ -386,10 +386,10 @@ 0xac820000, 0x24020001, 0xac820004, 0x8f82011c, 0x2403fffd, 0x431024, 0xaf82011c, 0x8ee201e4, 0x3c070001, 0xf73821, 0x8ce783d0, 0x24420001, -0xaee201e4, 0x8ee201e4, 0x3c040001, 0x248452cc, +0xaee201e4, 0x8ee201e4, 0x3c040001, 0x2484527c, 0x80015bd, 0xafa00010, 0x8f820104, 0x3c010001, 0x370821, 0xac2283d0, 0x8f8200b4, 0x3c070001, -0xf73821, 0x8ce783d0, 0x3c040001, 0x248452d4, +0xf73821, 0x8ce783d0, 0x3c040001, 0x24845284, 0x3c010001, 0x370821, 0xac2283d4, 0xafa00010, 0xafa00014, 0x8f8600b0, 0x3c050005, 0xc002403, 0x34a50900, 0x80015cc, 0x0, 0x8f820104, @@ -422,7 +422,7 @@ 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0x24020012, 0xac820000, 0x24020001, 0xac820004, 0x5600000b, 0x24100001, -0x8ee204e4, 0x3c040001, 0x248452dc, 0xafa00014, +0x8ee204e4, 0x3c040001, 0x2484528c, 0xafa00014, 0xafa20010, 0x8ee60608, 0x8f470228, 0x3c050009, 0xc002403, 0x34a5f006, 0x16000003, 0x24020001, 0x8001650, 0xa2e204f4, 0x8ee20170, 0x24420001, @@ -452,7 +452,7 @@ 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0x24020012, 0xac820000, 0x24020001, 0xac820004, 0x5600000b, 0x24100001, 0x8ee2724c, 0x3c040001, -0x248452e8, 0xafa00014, 0xafa20010, 0x8ee6724c, +0x24845298, 0xafa00014, 0xafa20010, 0x8ee6724c, 0x8f470280, 0x3c050009, 0xc002403, 0x34a5f008, 0x56000001, 0xaee00e1c, 0x8ee20174, 0x24420001, 0xaee20174, 0x8ee20174, 0x8ee24e24, 0x10400019, @@ -563,11 +563,11 @@ 0x8f820054, 0x1221023, 0x2c420033, 0x1440ffa6, 0x0, 0x316300ff, 0x24020001, 0x14620003, 0x3c050009, 0x800197c, 0x24100001, 0x3c040001, -0x248452f4, 0xafa00010, 0xafa00014, 0x8f860120, +0x248452a4, 0xafa00010, 0xafa00014, 0x8f860120, 0x8f870124, 0x800187b, 0x34a5f011, 0x3c040001, -0x24845300, 0xafa00010, 0xafa00014, 0x8f860120, +0x248452b0, 0xafa00010, 0xafa00014, 0x8f860120, 0x8f870124, 0x34a5f010, 0xc002403, 0x8021, -0x800197c, 0x0, 0x3c040001, 0x2484530c, +0x800197c, 0x0, 0x3c040001, 0x248452bc, 0xafa00014, 0x8ee60608, 0x8f470228, 0x3c050009, 0x8001975, 0x34a5f00f, 0x8ee20608, 0x8f430228, 0x24420001, 0x304900ff, 0x512300e2, 0xafa00010, @@ -598,7 +598,7 @@ 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0x24020007, 0xac820000, 0x24020001, 0xac820004, 0x5600000c, 0xaee90608, -0x3c040001, 0x24845318, 0xafa00010, 0xafa00014, +0x3c040001, 0x248452c8, 0xafa00010, 0xafa00014, 0x8ee60608, 0x8f470228, 0x3c050009, 0xc002403, 0x34a5f000, 0x800197c, 0x0, 0x8f830120, 0x27623800, 0x24660020, 0xc2102b, 0x50400001, @@ -624,10 +624,10 @@ 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0x24020012, 0xac820000, 0x24020001, 0xac820004, 0x5600001d, 0x24100001, 0x3c040001, -0x24845320, 0xafa00010, 0xafa00014, 0x8ee60608, +0x248452d0, 0xafa00010, 0xafa00014, 0x8ee60608, 0x8f470228, 0x3c050009, 0xc002403, 0x34a5f001, 0x8ee201b0, 0x24420001, 0xaee201b0, 0x800197c, -0x8ee201b0, 0x3c040001, 0x2484532c, 0xafa00014, +0x8ee201b0, 0x3c040001, 0x248452dc, 0xafa00014, 0x8ee60608, 0x8f470228, 0x3c050009, 0x34a5f005, 0xc002403, 0x0, 0x8ee201ac, 0x8021, 0x24420001, 0xaee201ac, 0x8ee201ac, 0x1200000c, @@ -635,7 +635,7 @@ 0x8f420238, 0x8ee30158, 0x24630001, 0xaee30158, 0x8ee30158, 0x800198c, 0xaee27278, 0x24020001, 0x3c010001, 0x370821, 0xa02283b0, 0x3c020001, -0x8c425d38, 0x10400187, 0x0, 0x8ee27b84, +0x8c425cd8, 0x10400187, 0x0, 0x8ee27b84, 0x24430001, 0x284200c9, 0x144001a4, 0xaee37b84, 0x8ee204d4, 0x30420002, 0x14400119, 0xaee07b84, 0x8ee204d4, 0x3c030600, 0x34631000, 0x34420002, @@ -699,12 +699,12 @@ 0x56000006, 0x240b0001, 0x8f820054, 0x1221023, 0x2c420033, 0x1440ffa6, 0x0, 0x316300ff, 0x24020001, 0x10620022, 0x0, 0x3c040001, -0x248452f4, 0xafa00010, 0xafa00014, 0x8f860120, +0x248452a4, 0xafa00010, 0xafa00014, 0x8f860120, 0x8f870124, 0x3c050009, 0xc002403, 0x34a5f011, -0x8001aad, 0x0, 0x3c040001, 0x24845300, +0x8001aad, 0x0, 0x3c040001, 0x248452b0, 0xafa00014, 0x8f860120, 0x8f870124, 0x3c050009, 0xc002403, 0x34a5f010, 0x8001aad, 0x0, -0x3c040001, 0x2484530c, 0xafa00014, 0x8ee60608, +0x3c040001, 0x248452bc, 0xafa00014, 0x8ee60608, 0x8f470228, 0x3c050009, 0xc002403, 0x34a5f00f, 0x8ee201ac, 0x24420001, 0xaee201ac, 0x8ee201ac, 0x8ee2015c, 0x24420001, 0xaee2015c, 0x8ee2015c, @@ -741,7 +741,7 @@ 0xaf820044, 0x8f820044, 0x34420040, 0xaf820044, 0x8ee27b88, 0x24430001, 0x28421389, 0x14400005, 0xaee37b88, 0x8f820044, 0x38420020, 0xaf820044, -0xaee07b88, 0xc0045f4, 0x0, 0x8fbf0024, +0xaee07b88, 0xc004603, 0x0, 0x8fbf0024, 0x8fb00020, 0x3e00008, 0x27bd0028, 0x27bdffb8, 0xafbf0044, 0xafb60040, 0xafb5003c, 0xafb40038, 0xafb30034, 0xafb20030, 0xafb1002c, 0xafb00028, @@ -751,18 +751,18 @@ 0xaee2016c, 0x80022f4, 0x8ee2016c, 0x32c20001, 0x10400004, 0x24020001, 0xaf820064, 0x80022f4, 0x0, 0x32c20002, 0x1440000c, 0x3c050003, -0x3c040001, 0x248453a4, 0x34a50001, 0x2c03021, +0x3c040001, 0x24845354, 0x34a50001, 0x2c03021, 0x3821, 0xafa00010, 0xc002403, 0xafa00014, 0x2402fff8, 0x80022f4, 0xaf820064, 0x8f43022c, 0x8f42010c, 0x5062000c, 0xafa00010, 0x8f42022c, 0x21080, 0x5a1021, 0x8c420300, 0xafa20020, 0x8f42022c, 0x24070001, 0x24420001, 0x3042003f, -0x8001b80, 0xaf42022c, 0x3c040001, 0x248453b0, +0x8001b80, 0xaf42022c, 0x3c040001, 0x24845360, 0xafa00014, 0x8f46022c, 0x8f47010c, 0x3c050003, 0xc002403, 0x34a5f01f, 0x3821, 0x14e00003, 0x0, 0x80022ed, 0xaf960064, 0x93a20020, 0x2443ffff, 0x2c620011, 0x10400658, 0x31080, -0x3c010001, 0x220821, 0x8c225468, 0x400008, +0x3c010001, 0x220821, 0x8c225418, 0x400008, 0x0, 0x8fa20020, 0x30420fff, 0xaee20e0c, 0x8f820060, 0x34420200, 0xaf820060, 0x8ee20118, 0x24420001, 0xaee20118, 0x80022e8, 0x8ee20118, @@ -778,7 +778,7 @@ 0x8f840054, 0x41442, 0x41c82, 0x431021, 0x41cc2, 0x431023, 0x41d02, 0x431021, 0x41d42, 0x431023, 0x8001bd0, 0xaee20078, -0x3c040001, 0x248453bc, 0xafa00014, 0x8fa60020, +0x3c040001, 0x2484536c, 0xafa00014, 0x8fa60020, 0x3c050003, 0xc002403, 0x34a50004, 0x8ee20110, 0x24420001, 0xaee20110, 0x80022e8, 0x8ee20110, 0x27440212, 0xc0022fe, 0x24050006, 0x3049001f, @@ -794,7 +794,7 @@ 0x2c820080, 0x1440fff8, 0x410c0, 0x4c10010, 0x618c0, 0x610c0, 0x571821, 0x8c63737c, 0x571021, 0xafa30010, 0x8c427380, 0x3c040001, -0x248453c8, 0xafa20014, 0x8f470214, 0x3c050003, +0x24845378, 0xafa20014, 0x8f470214, 0x3c050003, 0xc002403, 0x34a50013, 0x8001c90, 0x3c020800, 0x97440212, 0x771021, 0xa444737e, 0x8f440214, 0x771021, 0x2e31821, 0xac447380, 0x34028000, @@ -812,7 +812,7 @@ 0x24840001, 0x2c820080, 0x1440fff8, 0x410c0, 0x4c10023, 0x618c0, 0x910c0, 0x571821, 0x8c63727c, 0x571021, 0xafa30010, 0x8c427280, -0x3c040001, 0x248453d4, 0xafa20014, 0x8f470214, +0x3c040001, 0x24845384, 0xafa20014, 0x8f470214, 0x3c050003, 0xc002403, 0x34a5f017, 0x8001c90, 0x3c020800, 0x8f430210, 0xb71021, 0xac43777c, 0x8f430214, 0xb71021, 0xac437780, 0x3c020001, @@ -887,13 +887,13 @@ 0x2e22021, 0xac8a0000, 0xac8c0004, 0x54e00006, 0x240b0001, 0x8f820054, 0x1221023, 0x2c420033, 0x1440ffa6, 0x0, 0x316300ff, 0x24020001, -0x10620022, 0x0, 0x3c040001, 0x248453e0, +0x10620022, 0x0, 0x3c040001, 0x24845390, 0xafa00010, 0xafa00014, 0x8f860120, 0x8f870124, 0x3c050009, 0xc002403, 0x34a5f011, 0x8001da0, -0x0, 0x3c040001, 0x248453ec, 0xafa00014, +0x0, 0x3c040001, 0x2484539c, 0xafa00014, 0x8f860120, 0x8f870124, 0x3c050009, 0xc002403, 0x34a5f010, 0x8001da0, 0x0, 0x3c040001, -0x248453f8, 0xafa00014, 0x8ee60608, 0x8f470228, +0x248453a8, 0xafa00014, 0x8ee60608, 0x8f470228, 0x3c050009, 0xc002403, 0x34a5f00f, 0x8ee201ac, 0x24420001, 0xaee201ac, 0x8ee201ac, 0x8ee20124, 0x24420001, 0xaee20124, 0x8001f97, 0x8ee20124, @@ -908,7 +908,7 @@ 0x1221004, 0x21027, 0x621824, 0xaf830228, 0x910c0, 0x2e21821, 0x3402c000, 0x8001e4e, 0xa462727c, 0x8f420214, 0xafa20010, 0x910c0, -0x571021, 0x8c42727c, 0x3c040001, 0x24845404, +0x571021, 0x8c42727c, 0x3c040001, 0x248453b4, 0x3c050003, 0xafa20014, 0x8f470210, 0x34a5f01c, 0xc002403, 0x1203021, 0x8001e83, 0x3c020800, 0xb71021, 0x9443727e, 0x97420212, 0x14620019, @@ -936,7 +936,7 @@ 0x910c0, 0x2e41821, 0x3402c000, 0x15000015, 0xa462737c, 0x910c0, 0x2e21821, 0x34028000, 0x8001e4e, 0xa462727c, 0x571021, 0x8c42727c, -0x3c040001, 0x24845410, 0x3c050003, 0xafa20010, +0x3c040001, 0x248453c0, 0x3c050003, 0xafa20010, 0x710c0, 0x571021, 0x8c42737c, 0x34a5001e, 0x1203021, 0xc002403, 0xafa20014, 0x8001e83, 0x3c020800, 0x2021, 0x428c0, 0xb71021, @@ -1012,12 +1012,12 @@ 0xac8a0000, 0xac8c0004, 0x54e00006, 0x240b0001, 0x8f820054, 0x1221023, 0x2c420033, 0x1440ffa6, 0x0, 0x316300ff, 0x24020001, 0x10620022, -0x0, 0x3c040001, 0x248453e0, 0xafa00010, +0x0, 0x3c040001, 0x24845390, 0xafa00010, 0xafa00014, 0x8f860120, 0x8f870124, 0x3c050009, 0xc002403, 0x34a5f011, 0x8001f93, 0x0, -0x3c040001, 0x248453ec, 0xafa00014, 0x8f860120, +0x3c040001, 0x2484539c, 0xafa00014, 0x8f860120, 0x8f870124, 0x3c050009, 0xc002403, 0x34a5f010, -0x8001f93, 0x0, 0x3c040001, 0x248453f8, +0x8001f93, 0x0, 0x3c040001, 0x248453a8, 0xafa00014, 0x8ee60608, 0x8f470228, 0x3c050009, 0xc002403, 0x34a5f00f, 0x8ee201ac, 0x24420001, 0xaee201ac, 0x8ee201ac, 0x8ee20128, 0x24420001, @@ -1029,7 +1029,7 @@ 0x8f820228, 0xaee204dc, 0x2402ffff, 0xaf820228, 0x24020001, 0x8001fbe, 0xa2e204d8, 0x92e204d8, 0x5040000c, 0xa2e004d8, 0x8ee204dc, 0xaf820228, -0x8001fbe, 0xa2e004d8, 0x3c040001, 0x24845418, +0x8001fbe, 0xa2e004d8, 0x3c040001, 0x248453c8, 0xafa00014, 0x8fa60020, 0x3c050003, 0xc002403, 0x34a5f009, 0x8ee2013c, 0x24420001, 0xaee2013c, 0x80022e8, 0x8ee2013c, 0x8fa20020, 0x21200, @@ -1040,7 +1040,7 @@ 0x370821, 0xa02283b2, 0x8001fea, 0xaee40108, 0x8f820220, 0x3c0308ff, 0x3463fff7, 0x431024, 0xaf820220, 0x3c010001, 0x370821, 0xa02083b2, -0x8001fea, 0xaee40108, 0x3c040001, 0x24845424, +0x8001fea, 0xaee40108, 0x3c040001, 0x248453d4, 0xafa00014, 0x8fa60020, 0x3c050003, 0xc002403, 0x34a5f00a, 0x8ee2012c, 0x24420001, 0xaee2012c, 0x80022e8, 0x8ee2012c, 0x8fa20020, 0x21200, @@ -1052,13 +1052,13 @@ 0x571021, 0x904283b2, 0x3c010001, 0x370821, 0x1440000e, 0xa02083b3, 0x8f820220, 0x3c0308ff, 0x3463fff7, 0x431024, 0x8002018, 0xaf820220, -0x3c040001, 0x24845430, 0xafa00014, 0x8fa60020, +0x3c040001, 0x248453e0, 0xafa00014, 0x8fa60020, 0x3c050003, 0xc002403, 0x34a5f00b, 0x8ee20114, 0x24420001, 0xaee20114, 0x80022e8, 0x8ee20114, 0x27840208, 0x27450200, 0xc00249a, 0x24060008, 0x26e40094, 0x27450200, 0xc00249a, 0x24060008, 0x8ee20134, 0x24420001, 0xaee20134, 0x80022e8, -0x8ee20134, 0x8f460248, 0x2021, 0xc0050e0, +0x8ee20134, 0x8f460248, 0x2021, 0xc005108, 0x24050004, 0x8ee20130, 0x24420001, 0xaee20130, 0x80022e8, 0x8ee20130, 0x8ef301cc, 0x8ef401d0, 0x8ef501d8, 0x8ee20140, 0x26e40030, 0x24420001, @@ -1072,7 +1072,7 @@ 0xaee20104, 0xaee40100, 0xaee3010c, 0x8f820220, 0x30420008, 0x10400004, 0x0, 0xaee30108, 0x8002061, 0x2021, 0xaee40108, 0x2021, -0x3c030001, 0x641821, 0x90635c90, 0x2e41021, +0x3c030001, 0x641821, 0x90635c30, 0x2e41021, 0x24840001, 0xa043009c, 0x2c82000f, 0x1440fff8, 0x0, 0x8f820040, 0x2e41821, 0x24840001, 0x21702, 0x24420030, 0xa062009c, 0x2e41021, @@ -1152,13 +1152,13 @@ 0x2e22021, 0xac8a0000, 0xac8c0004, 0x54e00006, 0x240b0001, 0x8f820054, 0x1221023, 0x2c420033, 0x1440ffa6, 0x0, 0x316300ff, 0x24020001, -0x10620022, 0x0, 0x3c040001, 0x248453e0, +0x10620022, 0x0, 0x3c040001, 0x24845390, 0xafa00010, 0xafa00014, 0x8f860120, 0x8f870124, 0x3c050009, 0xc002403, 0x34a5f011, 0x80021c4, -0x0, 0x3c040001, 0x248453ec, 0xafa00014, +0x0, 0x3c040001, 0x2484539c, 0xafa00014, 0x8f860120, 0x8f870124, 0x3c050009, 0xc002403, 0x34a5f010, 0x80021c4, 0x0, 0x3c040001, -0x248453f8, 0xafa00014, 0x8ee60608, 0x8f470228, +0x248453a8, 0xafa00014, 0x8ee60608, 0x8f470228, 0x3c050009, 0xc002403, 0x34a5f00f, 0x8ee201ac, 0x24420001, 0xaee201ac, 0x8ee201ac, 0x8ee20120, 0x24420001, 0xaee20120, 0x8ee20120, 0x8ee20168, @@ -1168,7 +1168,7 @@ 0x8f820220, 0x30420008, 0x14400002, 0x24020001, 0x24020002, 0xaee20108, 0x8ee2011c, 0x24420001, 0xaee2011c, 0x80022e8, 0x8ee2011c, 0x3c040001, -0x2484543c, 0xafa00010, 0xafa00014, 0x8fa60020, +0x248453ec, 0xafa00010, 0xafa00014, 0x8fa60020, 0x3c050003, 0xc002403, 0x34a5f00f, 0x93a20020, 0x3c030700, 0x34631000, 0x431025, 0xafa20018, 0x8ee20608, 0x8f430228, 0x24420001, 0x304900ff, @@ -1199,7 +1199,7 @@ 0x1021, 0x8ee24e30, 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0x24020007, 0xac820000, 0x24020001, 0xac820004, -0x54e0000c, 0xaee90608, 0x3c040001, 0x24845444, +0x54e0000c, 0xaee90608, 0x3c040001, 0x248453f4, 0xafa00010, 0xafa00014, 0x8ee60608, 0x8f470228, 0x3c050009, 0xc002403, 0x34a5f000, 0x80022e0, 0x0, 0x8f830120, 0x27623800, 0x24660020, @@ -1225,11 +1225,11 @@ 0x8ee24e30, 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0x24020012, 0xac820000, 0x24020001, 0xac820004, 0x14e0001b, -0x0, 0x3c040001, 0x2484544c, 0xafa00010, +0x0, 0x3c040001, 0x248453fc, 0xafa00010, 0xafa00014, 0x8ee60608, 0x8f470228, 0x3c050009, 0xc002403, 0x34a5f001, 0x8ee201b0, 0x24420001, 0xaee201b0, 0x80022e0, 0x8ee201b0, 0x3c040001, -0x24845458, 0xafa00014, 0x8ee60608, 0x8f470228, +0x24845408, 0xafa00014, 0x8ee60608, 0x8f470228, 0x3c050009, 0xc002403, 0x34a5f005, 0x8ee201ac, 0x24420001, 0xaee201ac, 0x8ee201ac, 0x8ee20150, 0x24420001, 0xaee20150, 0x8ee20150, 0x8ee20160, @@ -1256,7 +1256,7 @@ 0xaf82011c, 0x8fbf0010, 0x3e00008, 0x27bd0018, 0x27bdffe0, 0xafbf0018, 0x8f820104, 0xafa20010, 0x8f820100, 0x3c050002, 0xafa20014, 0x8f8600b0, -0x8f87011c, 0x3c040001, 0x24845510, 0xc002403, +0x8f87011c, 0x3c040001, 0x248454c0, 0xc002403, 0x34a5f000, 0x8f8300b0, 0x3c027f00, 0x621824, 0x3c020400, 0x10620029, 0x43102b, 0x14400008, 0x3c022000, 0x3c020100, 0x10620024, 0x3c020200, @@ -1273,7 +1273,7 @@ 0x27bd0020, 0x27bdffe0, 0xafbf001c, 0xafb00018, 0x8f820120, 0xafa20010, 0x8f820124, 0x3c050001, 0xafa20014, 0x8f8600a0, 0x8f87011c, 0x3c040001, -0x2484551c, 0xc002403, 0x34a5f000, 0x8f8300a0, +0x248454cc, 0xc002403, 0x34a5f000, 0x8f8300a0, 0x3c027f00, 0x621824, 0x3c020400, 0x10620053, 0x8021, 0x43102b, 0x14400008, 0x3c042000, 0x3c020100, 0x1062004d, 0x3c020200, 0x1062003a, @@ -1298,43 +1298,43 @@ 0xaee2019c, 0x80023e3, 0x8ee2019c, 0x8f8200a0, 0x34420001, 0xaf8200a0, 0x8fbf001c, 0x8fb00018, 0x3e00008, 0x27bd0020, 0x0, 0x3c020001, -0x8c425cb8, 0x27bdffe8, 0xafbf0014, 0x14400012, -0xafb00010, 0x3c100001, 0x26105e30, 0x2002021, +0x8c425c58, 0x27bdffe8, 0xafbf0014, 0x14400012, +0xafb00010, 0x3c100001, 0x26105dd0, 0x2002021, 0xc002488, 0x24052000, 0x26021fe0, 0x3c010001, -0xac225df4, 0x3c010001, 0xac225df0, 0xaf420250, +0xac225d94, 0x3c010001, 0xac225d90, 0xaf420250, 0x24022000, 0xaf500254, 0xaf420258, 0x24020001, -0x3c010001, 0xac225cb8, 0x8fbf0014, 0x8fb00010, -0x3e00008, 0x27bd0018, 0x3c030001, 0x8c635df4, +0x3c010001, 0xac225c58, 0x8fbf0014, 0x8fb00010, +0x3e00008, 0x27bd0018, 0x3c030001, 0x8c635d94, 0x8c820000, 0x8fa80010, 0x8fa90014, 0xac620000, -0x3c020001, 0x8c425df4, 0x8c830004, 0xac430004, +0x3c020001, 0x8c425d94, 0x8c830004, 0xac430004, 0xac450008, 0x8f840054, 0x2443ffe0, 0xac460010, 0xac470014, 0xac480018, 0xac49001c, 0x3c010001, -0xac235df4, 0xac44000c, 0x3c020001, 0x24425e30, +0xac235d94, 0xac44000c, 0x3c020001, 0x24425dd0, 0x62182b, 0x10600005, 0x0, 0x3c020001, -0x8c425df0, 0x3c010001, 0xac225df4, 0x3c030001, -0x8c635df4, 0x3c020001, 0x8c425ca0, 0xac620000, -0x3c030001, 0x8c635df4, 0x3c020001, 0x8c425ca0, +0x8c425d90, 0x3c010001, 0xac225d94, 0x3c030001, +0x8c635d94, 0x3c020001, 0x8c425c40, 0xac620000, +0x3c030001, 0x8c635d94, 0x3c020001, 0x8c425c40, 0xac620004, 0x3e00008, 0xaf430250, 0x3c030001, -0x8c635df4, 0x3c020001, 0x8c425ca0, 0x27bdffd0, +0x8c635d94, 0x3c020001, 0x8c425c40, 0x27bdffd0, 0xafb40020, 0x8fb40040, 0xafb00010, 0x808021, 0xafb50024, 0x8fb50044, 0x8fa40048, 0xafb10014, 0xa08821, 0xafbf0028, 0xafb3001c, 0xafb20018, -0xac620000, 0x3c050001, 0x8ca55df4, 0x3c020001, -0x8c425ca0, 0xc09021, 0xe09821, 0x10800006, +0xac620000, 0x3c050001, 0x8ca55d94, 0x3c020001, +0x8c425c40, 0xc09021, 0xe09821, 0x10800006, 0xaca20004, 0x24a50008, 0xc002490, 0x24060018, 0x800244e, 0x0, 0x24a40008, 0xc002488, -0x24050018, 0x3c020001, 0x8c425df4, 0x3c050001, -0x24a55e30, 0x2442ffe0, 0x3c010001, 0xac225df4, +0x24050018, 0x3c020001, 0x8c425d94, 0x3c050001, +0x24a55dd0, 0x2442ffe0, 0x3c010001, 0xac225d94, 0x45102b, 0x10400005, 0x0, 0x3c020001, -0x8c425df0, 0x3c010001, 0xac225df4, 0x3c030001, -0x8c635df4, 0x8e020000, 0xac620000, 0x3c030001, -0x8c635df4, 0x8e020004, 0xac620004, 0xac710008, -0x8f840054, 0x2462ffe0, 0x3c010001, 0xac225df4, +0x8c425d90, 0x3c010001, 0xac225d94, 0x3c030001, +0x8c635d94, 0x8e020000, 0xac620000, 0x3c030001, +0x8c635d94, 0x8e020004, 0xac620004, 0xac710008, +0x8f840054, 0x2462ffe0, 0x3c010001, 0xac225d94, 0x45102b, 0xac720010, 0xac730014, 0xac740018, 0xac75001c, 0x10400005, 0xac64000c, 0x3c020001, -0x8c425df0, 0x3c010001, 0xac225df4, 0x3c030001, -0x8c635df4, 0x3c020001, 0x8c425ca0, 0xac620000, -0x3c030001, 0x8c635df4, 0x3c020001, 0x8c425ca0, +0x8c425d90, 0x3c010001, 0xac225d94, 0x3c030001, +0x8c635d94, 0x3c020001, 0x8c425c40, 0xac620000, +0x3c030001, 0x8c635d94, 0x3c020001, 0x8c425c40, 0xac620004, 0xaf430250, 0x8fbf0028, 0x8fb50024, 0x8fb40020, 0x8fb3001c, 0x8fb20018, 0x8fb10014, 0x8fb00010, 0x3e00008, 0x27bd0030, 0x10a00005, @@ -1380,7 +1380,7 @@ 0x210c0, 0x24424e38, 0x2e22021, 0x24020005, 0xac820000, 0x24020001, 0xac820004, 0x1520000a, 0x3c040001, 0xafab0010, 0x8ee27264, 0x3c040001, -0x24845780, 0x3c050004, 0xafa20014, 0x8ee604e4, +0x24845730, 0x3c050004, 0xafa20014, 0x8ee604e4, 0x80028be, 0x34a5f114, 0x8ee27264, 0x34843800, 0x3641821, 0x24420010, 0x43102b, 0x14400073, 0x0, 0x8ee27264, 0x24480010, 0x3641021, @@ -1409,7 +1409,7 @@ 0x210c0, 0x24424e38, 0x2e22021, 0x24020005, 0xac820000, 0x24020001, 0xac820004, 0x1520000a, 0x2508fffc, 0xafab0010, 0x8ee27264, 0x3c040001, -0x24845780, 0x3c050004, 0xafa20014, 0x8ee604e4, +0x24845730, 0x3c050004, 0xafa20014, 0x8ee604e4, 0x80028be, 0x34a5f125, 0x34028100, 0xa5020000, 0x9582000e, 0x800261d, 0xa5020002, 0x8f850100, 0x27623000, 0x24a60020, 0xc2102b, 0x50400001, @@ -1436,7 +1436,7 @@ 0x8ee24e28, 0x210c0, 0x24424e38, 0x2e22021, 0x24020005, 0xac820000, 0x24020001, 0xac820004, 0x1520000a, 0x34028100, 0xafab0010, 0x8ee27264, -0x3c040001, 0x24845780, 0x3c050004, 0xafa20014, +0x3c040001, 0x24845730, 0x3c050004, 0xafa20014, 0x8ee604e4, 0x80028be, 0x34a5f015, 0x8ee37264, 0xa462000c, 0x8ee37264, 0x9582000e, 0xa462000e, 0x8002681, 0x24e70004, 0x8f840100, 0x27623000, @@ -1462,7 +1462,7 @@ 0x24420001, 0xaee24e28, 0x8ee24e28, 0x210c0, 0x24424e38, 0x2e22021, 0x24020005, 0xac820000, 0x24020001, 0xac820004, 0x15200009, 0x3c050004, -0xafab0010, 0x8ee27264, 0x3c040001, 0x24845780, +0xafab0010, 0x8ee27264, 0x3c040001, 0x24845730, 0xafa20014, 0x8ee604e4, 0x80028be, 0x34a5f004, 0x8ee2725c, 0x30e7ffff, 0x471021, 0xaee2725c, 0x8ee204e4, 0x8ee304fc, 0x8ee47258, 0x21100, @@ -1482,7 +1482,7 @@ 0x8f8200f0, 0x24090001, 0x8fa30018, 0x8fa4001c, 0xac430000, 0xac440004, 0xaf8700f0, 0x15200012, 0xd1142, 0x8f8200f0, 0xafa20010, 0x8f8200f4, -0x3c040001, 0x2484578c, 0xafa20014, 0x8fa60018, +0x3c040001, 0x2484573c, 0xafa20014, 0x8fa60018, 0x8fa7001c, 0x3c050004, 0xc002403, 0x34a5f005, 0x8ee20088, 0x24420001, 0xaee20088, 0x8ee20088, 0x80028d3, 0xaee0725c, 0x30430003, 0x24020002, @@ -1524,7 +1524,7 @@ 0xaee24e28, 0x8ee24e28, 0x210c0, 0x24424e38, 0x2e22021, 0x24020005, 0xac820000, 0x24020001, 0xac820004, 0x1520000a, 0x3c040001, 0xafab0010, -0x8ee27264, 0x3c040001, 0x24845780, 0x3c050004, +0x8ee27264, 0x3c040001, 0x24845730, 0x3c050004, 0xafa20014, 0x8ee604e4, 0x80028be, 0x34a5f014, 0x8ee27264, 0x34843800, 0x3641821, 0x24420010, 0x43102b, 0x14400073, 0x0, 0x8ee27264, @@ -1553,7 +1553,7 @@ 0xaee24e28, 0x8ee24e28, 0x210c0, 0x24424e38, 0x2e22021, 0x24020005, 0xac820000, 0x24020001, 0xac820004, 0x1520000a, 0x2508fffc, 0xafab0010, -0x8ee27264, 0x3c040001, 0x24845780, 0x3c050004, +0x8ee27264, 0x3c040001, 0x24845730, 0x3c050004, 0xafa20014, 0x8ee604e4, 0x80028be, 0x34a5f015, 0x34028100, 0xa5020000, 0x9582000e, 0x800285f, 0xa5020002, 0x8f850100, 0x27623000, 0x24a60020, @@ -1580,7 +1580,7 @@ 0x24420001, 0xaee24e28, 0x8ee24e28, 0x210c0, 0x24424e38, 0x2e22021, 0x24020005, 0xac820000, 0x24020001, 0xac820004, 0x1520000a, 0x34028100, -0xafab0010, 0x8ee27264, 0x3c040001, 0x24845780, +0xafab0010, 0x8ee27264, 0x3c040001, 0x24845730, 0x3c050004, 0xafa20014, 0x8ee604e4, 0x80028be, 0x34a5f016, 0x8ee37264, 0xa462000c, 0x8ee37264, 0x9582000e, 0xa462000e, 0x80028c2, 0x24e70004, @@ -1606,7 +1606,7 @@ 0xaee24e28, 0x8ee24e28, 0x210c0, 0x24424e38, 0x2e22021, 0x24020005, 0xac820000, 0x24020001, 0xac820004, 0x1520000b, 0x3c050004, 0x3c040001, -0x24845798, 0xafab0010, 0xafa00014, 0x8ee604e4, +0x24845748, 0xafab0010, 0xafa00014, 0x8ee604e4, 0x34a5f017, 0xc002403, 0x30e7ffff, 0x80028e1, 0x0, 0x8ee27264, 0x3c050001, 0x30e4ffff, 0x441021, 0xaee27264, 0x8ee2725c, 0x8ee37264, @@ -1672,7 +1672,7 @@ 0x24420001, 0xaee24e28, 0x8ee24e28, 0x210c0, 0x24424e38, 0x2e22021, 0x24020005, 0xac820000, 0x24020001, 0xac820004, 0x1540000a, 0x24020001, -0xafa90010, 0x8ee27264, 0x3c040001, 0x24845780, +0xafa90010, 0x8ee27264, 0x3c040001, 0x24845730, 0x3c050004, 0xafa20014, 0x8ee604e4, 0x8002a4f, 0x34a5f204, 0xa2e204ed, 0x8ee204e8, 0x8ee304fc, 0x8ee47258, 0x3c060001, 0x34c63800, 0x3c010001, @@ -1706,7 +1706,7 @@ 0xaee24e28, 0x8ee24e28, 0x210c0, 0x24424e38, 0x2e22021, 0x24020005, 0xac820000, 0x24020001, 0xac820004, 0x1540000c, 0x30e5ffff, 0x3c040001, -0x24845798, 0x3c050004, 0xafa90010, 0xafa00014, +0x24845748, 0x3c050004, 0xafa90010, 0xafa00014, 0x8ee604e4, 0x34a5f237, 0xc002403, 0x30e7ffff, 0x8002a72, 0x0, 0x8ee27264, 0x451021, 0xaee27264, 0x8ee2726c, 0x8ee37264, 0x3c040001, @@ -1730,7 +1730,7 @@ 0x8f830108, 0x21140, 0x621821, 0xaf830108, 0xac800000, 0x8cc20018, 0x2443fffe, 0x2c620013, 0x104000c1, 0x31080, 0x3c010001, 0x220821, -0x8c2257c0, 0x400008, 0x0, 0x8ee204f0, +0x8c225770, 0x400008, 0x0, 0x8ee204f0, 0x471021, 0xaee204f0, 0x8ee204f0, 0x8f43023c, 0x43102b, 0x144000be, 0x0, 0x8ee304e4, 0x8ee204f8, 0x506200ba, 0xa2e004f4, 0x8f830120, @@ -1757,7 +1757,7 @@ 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0x24020012, 0xac820000, 0x24020001, 0xac820004, 0x5600000b, 0x24100001, 0x8ee204e4, -0x3c040001, 0x248457a4, 0xafa00014, 0xafa20010, +0x3c040001, 0x24845754, 0xafa00014, 0xafa20010, 0x8ee60608, 0x8f470228, 0x3c050009, 0xc002403, 0x34a5f006, 0x16000003, 0x24020001, 0x8002b71, 0xa2e204f4, 0x8ee20170, 0x24420001, 0xaee20170, @@ -1778,7 +1778,7 @@ 0x8002b71, 0xaee20000, 0x8ee2014c, 0x3c010001, 0x370821, 0xa02083e0, 0x24420001, 0xaee2014c, 0x8002b71, 0x8ee2014c, 0x94c7000e, 0x8cc2001c, -0x3c040001, 0x248457b0, 0xafa60014, 0xafa20010, +0x3c040001, 0x24845760, 0xafa60014, 0xafa20010, 0x8cc60018, 0x3c050008, 0xc002403, 0x34a50910, 0x8fbf001c, 0x8fb00018, 0x3e00008, 0x27bd0020, 0x27bdff98, 0xafbf0060, 0xafbe005c, 0xafb60058, @@ -1787,7 +1787,7 @@ 0xafa00024, 0x106203e7, 0xafa0002c, 0x3c1e0001, 0x37de3800, 0x3c0bffff, 0x8f930108, 0x8e620018, 0x8f830104, 0x2443fffe, 0x2c620014, 0x104003cf, -0x31080, 0x3c010001, 0x220821, 0x8c225810, +0x31080, 0x3c010001, 0x220821, 0x8c2257c0, 0x400008, 0x0, 0x9663000e, 0x8ee2725c, 0x8ee404f0, 0x431021, 0xaee2725c, 0x8e63001c, 0x96e20458, 0x24840001, 0xaee404f0, 0x24630001, @@ -1816,7 +1816,7 @@ 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0x24020012, 0x240c0001, 0xac820000, 0xac8c0004, 0x5600000d, 0x24100001, 0x8ee204e4, -0x3c040001, 0x248457a4, 0xafa00014, 0xafa20010, +0x3c040001, 0x24845754, 0xafa00014, 0xafa20010, 0x8ee60608, 0x8f470228, 0x3c050009, 0x34a5f006, 0xc002403, 0xafab0038, 0x8fab0038, 0x1200030a, 0x240c0001, 0x8002f19, 0x0, 0x966c001c, @@ -2010,7 +2010,7 @@ 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0x24020012, 0x240c0001, 0xac820000, 0xac8c0004, 0x5600000d, 0x24100001, -0x8ee204e4, 0x3c040001, 0x248457a4, 0xafa00014, +0x8ee204e4, 0x3c040001, 0x24845754, 0xafa00014, 0xafa20010, 0x8ee60608, 0x8f470228, 0x3c050009, 0x34a5f006, 0xc002403, 0xafab0038, 0x8fab0038, 0x16000003, 0x240c0001, 0x8002f5c, 0xa2ec04f4, @@ -2065,7 +2065,7 @@ 0x8821, 0x8f8200e4, 0x24110001, 0x8c430000, 0x8c440004, 0xafa30018, 0xafa4001c, 0x1620000e, 0x3c02ffff, 0x8f8200c4, 0xafa20010, 0x8f8200c8, -0x3c040001, 0x248458c0, 0xafa20014, 0x8f8600e0, +0x3c040001, 0x24845870, 0xafa20014, 0x8f8600e0, 0x8f8700e4, 0x3c050006, 0xc002403, 0x34a5f000, 0x80034cc, 0x0, 0x8fa3001c, 0x8fb20018, 0x3074ffff, 0x2694fffc, 0x621024, 0x10400058, @@ -2163,11 +2163,11 @@ 0x862021, 0xaee400c0, 0xaee500c4, 0x8ee20058, 0x24420001, 0xaee20058, 0x8ee20058, 0x8ee2007c, 0x24420001, 0xaee2007c, 0x8ee2007c, 0x8f8200e0, -0xafa20010, 0x8f8200e4, 0x3c040001, 0x248458c8, +0xafa20010, 0x8f8200e4, 0x3c040001, 0x24845878, 0xafa20014, 0x8fa60018, 0x8fa7001c, 0x3c050006, 0xc002403, 0x34a5f003, 0x80034cc, 0x0, 0x8ee25240, 0xafa20010, 0x8ee25244, 0x3c040001, -0x248458d4, 0xafa20014, 0x8ee60e10, 0x8ee70e18, +0x24845884, 0xafa20014, 0x8ee60e10, 0x8ee70e18, 0x3c050006, 0xc002403, 0x34a5f002, 0x8ee201c0, 0x24420001, 0xaee201c0, 0x8ee20000, 0x8ee301c0, 0x2403ffbf, 0x431024, 0x8003470, 0xaee20000, @@ -2219,7 +2219,7 @@ 0x50550003, 0x1021, 0x8ee24e30, 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0xac960000, 0xac9e0004, 0x16200018, -0x3c050006, 0x8e020018, 0x3c040001, 0x248458e0, +0x3c050006, 0x8e020018, 0x3c040001, 0x24845890, 0xafa20010, 0x8e020000, 0x8e030004, 0x34a5f009, 0x2003021, 0xc002403, 0xafa30014, 0x93a20037, 0x10400216, 0x340f8100, 0x8e420004, 0x8e430008, @@ -2252,7 +2252,7 @@ 0x210c0, 0x24425038, 0x2e22021, 0xac960000, 0xac9e0004, 0x1620000d, 0x0, 0xa60c000a, 0xa60a000e, 0x8f820100, 0xafa20010, 0x8f820104, -0x3c040001, 0x248458ec, 0x3c050006, 0xafa20014, +0x3c040001, 0x2484589c, 0x3c050006, 0xafa20014, 0x8ee6724c, 0x800343b, 0x34a5f00b, 0x3c010001, 0x370821, 0xa02083c0, 0xadab0000, 0x8ee201d8, 0x8ee3724c, 0x2442ffff, 0xaee201d8, 0x8ee201d8, @@ -2284,7 +2284,7 @@ 0x1021, 0x8ee24e30, 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0xac8e0000, 0xac9e0004, 0x5620000d, 0x24110001, -0x8ee2724c, 0x3c040001, 0x248458f8, 0xafa00014, +0x8ee2724c, 0x3c040001, 0x248458a8, 0xafa00014, 0xafa20010, 0x8ee6724c, 0x8f470280, 0x3c050009, 0x34a5f008, 0xc002403, 0xafae0048, 0x8fae0048, 0x56200001, 0xaee00e1c, 0x8ee20188, 0x24420001, @@ -2311,7 +2311,7 @@ 0x8ee24e30, 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0xac8e0000, 0xac9e0004, 0x1620000d, 0x0, 0x8ee2724c, -0x3c040001, 0x248458f8, 0xafa00014, 0xafa20010, +0x3c040001, 0x248458a8, 0xafa00014, 0xafa20010, 0x8ee6724c, 0x8f470280, 0x3c050009, 0x34a5f008, 0xc002403, 0xafae0048, 0x8fae0048, 0x8ee20174, 0x24420001, 0xaee20174, 0x8ee20174, 0x800346e, @@ -2341,7 +2341,7 @@ 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0xac960000, 0xac9e0004, 0x1620001d, 0x0, 0xa60c000a, 0x8f820100, 0xafa20010, 0x8f820104, -0x3c040001, 0x248458ec, 0x3c050006, 0xafa20014, +0x3c040001, 0x2484589c, 0x3c050006, 0xafa20014, 0x8ee6724c, 0x34a5f00d, 0xc002403, 0x2003821, 0x93a20037, 0x10400031, 0x340f8100, 0x8e420004, 0x8e430008, 0x8e44000c, 0xa64f000c, 0xae420000, @@ -2403,7 +2403,7 @@ 0x10430007, 0x4821, 0x8f8200e4, 0x24090001, 0x8c430000, 0x8c440004, 0xafa30018, 0xafa4001c, 0x1520000e, 0x3c02ffff, 0x8f8200c4, 0xafa20010, -0x8f8200c8, 0x3c040001, 0x248458c0, 0xafa20014, +0x8f8200c8, 0x3c040001, 0x24845870, 0xafa20014, 0x8f8600e0, 0x8f8700e4, 0x3c050006, 0xc002403, 0x34a5f000, 0x8003850, 0x0, 0x8fa3001c, 0x8fb20018, 0x3073ffff, 0x2673fffc, 0x621024, @@ -2501,15 +2501,15 @@ 0x862021, 0xaee400c0, 0xaee500c4, 0x8ee20058, 0x24420001, 0xaee20058, 0x8ee20058, 0x8ee2007c, 0x24420001, 0xaee2007c, 0x8ee2007c, 0x8f8200e0, -0xafa20010, 0x8f8200e4, 0x3c040001, 0x248458c8, +0xafa20010, 0x8f8200e4, 0x3c040001, 0x24845878, 0xafa20014, 0x8fa60018, 0x8fa7001c, 0x3c050006, 0xc002403, 0x34a5f003, 0x8003850, 0x0, 0x8ee25240, 0xafa20010, 0x8ee25244, 0x3c040001, -0x248458d4, 0xafa20014, 0x8ee60e10, 0x8ee70e18, +0x24845884, 0xafa20014, 0x8ee60e10, 0x8ee70e18, 0xc002403, 0x34a5f002, 0x8ee201c0, 0x24420001, 0xaee201c0, 0x8ee20000, 0x8ee301c0, 0x2403ffbf, 0x431024, 0x80037f8, 0xaee20000, 0x8ee25240, -0xafa20010, 0x8ee25244, 0x3c040001, 0x248458d4, +0xafa20010, 0x8ee25244, 0x3c040001, 0x24845884, 0xafa20014, 0x8ee60e10, 0x8ee70e18, 0x3c050006, 0xc002403, 0x34a5f002, 0x8ee201c0, 0x24420001, 0xaee201c0, 0x80037f8, 0x8ee201c0, 0x96e20468, @@ -2568,7 +2568,7 @@ 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0x24020007, 0xac820000, 0x24020001, 0xac820004, 0x15200018, 0x3c050006, -0x8e020018, 0x3c040001, 0x248458e0, 0xafa20010, +0x8e020018, 0x3c040001, 0x24845890, 0xafa20010, 0x8e020000, 0x8e030004, 0x34a5f009, 0x2003021, 0xc002403, 0xafa30014, 0x32c200ff, 0x1040002b, 0x34028100, 0x8e430004, 0x8e440008, 0x8e45000c, @@ -2628,7 +2628,7 @@ 0x10430007, 0x3821, 0x8f8200e4, 0x24070001, 0x8c430000, 0x8c440004, 0xafa30018, 0xafa4001c, 0x14e0000e, 0x3c02ffff, 0x8f8200c4, 0xafa20010, -0x8f8200c8, 0x3c040001, 0x24845904, 0xafa20014, +0x8f8200c8, 0x3c040001, 0x248458b4, 0xafa20014, 0x8f8600e0, 0x8f8700e4, 0x3c050006, 0xc002403, 0x34a5f200, 0x8003c5b, 0x0, 0x8fa3001c, 0x8fb20018, 0x3073ffff, 0x2673fffc, 0x621024, @@ -2726,11 +2726,11 @@ 0x862021, 0xaee400c0, 0xaee500c4, 0x8ee20058, 0x24420001, 0xaee20058, 0x8ee20058, 0x8ee2007c, 0x24420001, 0xaee2007c, 0x8ee2007c, 0x8f8200e0, -0xafa20010, 0x8f8200e4, 0x3c040001, 0x24845910, +0xafa20010, 0x8f8200e4, 0x3c040001, 0x248458c0, 0xafa20014, 0x8fa60018, 0x8fa7001c, 0x3c050006, 0xc002403, 0x34a5f203, 0x8003c5b, 0x0, 0x8ee25240, 0xafa20010, 0x8ee25244, 0x3c040001, -0x2484591c, 0xafa20014, 0x8ee60e10, 0x8ee70e18, +0x248458cc, 0xafa20014, 0x8ee60e10, 0x8ee70e18, 0x3c050006, 0xc002403, 0x34a5f202, 0x8ee201c0, 0x24420001, 0xaee201c0, 0x8003c02, 0x8ee201c0, 0x96e20468, 0x53102b, 0x54400001, 0x3c168000, @@ -2826,7 +2826,7 @@ 0x1021, 0x8ee24e30, 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0x24020007, 0xac820000, 0x24020001, 0xac820004, -0x14e00019, 0x3c050006, 0x3c040001, 0x248458e0, +0x14e00019, 0x3c050006, 0x3c040001, 0x24845890, 0x8e220018, 0x34a5f209, 0xafa20010, 0x8e220000, 0x8e230004, 0x2203021, 0x1603821, 0xc002403, 0xafa30014, 0x93a2002f, 0x1040002a, 0x34028100, @@ -2890,7 +2890,7 @@ 0x24020001, 0xac620004, 0x1480000e, 0x24030040, 0x8ee20e14, 0xafa20010, 0x8ee20e18, 0x3c050007, 0xafa20014, 0x8ee60e0c, 0x8ee70e10, 0x3c040001, -0x24845924, 0xc002403, 0x34a5f001, 0x8003cdd, +0x248458d4, 0xc002403, 0x34a5f001, 0x8003cdd, 0x0, 0x8ee20500, 0x24420001, 0x50430003, 0x1021, 0x8ee20500, 0x24420001, 0xaee20500, 0x8ee20500, 0x21080, 0x571021, 0xac490508, @@ -2922,7 +2922,7 @@ 0x24020003, 0xac620000, 0x24020001, 0xac620004, 0x1480000e, 0x24030040, 0x8ee2523c, 0xafa20010, 0x8ee25244, 0x3c050007, 0xafa20014, 0x8ee65238, -0x8ee75240, 0x3c040001, 0x24845930, 0xc002403, +0x8ee75240, 0x3c040001, 0x248458e0, 0xc002403, 0x34a5f010, 0x8003d5f, 0x0, 0x8ee20500, 0x24420001, 0x50430003, 0x1021, 0x8ee20500, 0x24420001, 0xaee20500, 0x8ee20500, 0x21080, @@ -2942,7 +2942,7 @@ 0x8f830128, 0x21140, 0x621821, 0xaf830128, 0xaca00000, 0x8cc20018, 0x2443fffe, 0x2c620012, 0x10400008, 0x31080, 0x3c010001, 0x220821, -0x8c225940, 0x400008, 0x0, 0x24020001, +0x8c2258f0, 0x400008, 0x0, 0x24020001, 0xaee24e24, 0x3e00008, 0x0, 0x27bdffc8, 0xafbf0030, 0xafb5002c, 0xafb40028, 0xafb30024, 0xafb20020, 0xafb1001c, 0xafb00018, 0x8f830128, @@ -2951,7 +2951,7 @@ 0x24140040, 0x8f8c0128, 0x8f820128, 0x24420020, 0xaf820128, 0x9182001b, 0x8f830128, 0x2443fffe, 0x2c620012, 0x1040029c, 0x31080, 0x3c010001, -0x220821, 0x8c225998, 0x400008, 0x0, +0x220821, 0x8c225948, 0x400008, 0x0, 0x8f420218, 0x30420100, 0x10400007, 0x0, 0x95830016, 0x95820018, 0x621823, 0x31402, 0x431021, 0xa5820016, 0x8d82001c, 0x3c038000, @@ -3052,7 +3052,7 @@ 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0x24020007, 0xac820000, 0x24020001, 0xac820004, 0x1600000d, 0x0, -0x8f820120, 0x3c040001, 0x24845988, 0xafa00014, +0x8f820120, 0x3c040001, 0x24845938, 0xafa00014, 0xafa20010, 0x8d86001c, 0x8f870124, 0x3c050008, 0xc002403, 0x34a50001, 0x8004057, 0x0, 0x8ee2724c, 0x24420001, 0x304207ff, 0x11a00006, @@ -3087,7 +3087,7 @@ 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0x24020001, 0xac950000, 0xac820004, 0x5600000b, 0x24100001, 0x8ee2724c, -0x3c040001, 0x248458f8, 0xafa00014, 0xafa20010, +0x3c040001, 0x248458a8, 0xafa00014, 0xafa20010, 0x8ee6724c, 0x8f470280, 0x3c050009, 0xc002403, 0x34a5f008, 0x56000001, 0xaee00e1c, 0x8ee20188, 0x24420001, 0xaee20188, 0x8004050, 0x8ee20188, @@ -3113,7 +3113,7 @@ 0x1021, 0x8ee24e30, 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0x24020001, 0xac950000, 0xac820004, 0x1600000b, -0x0, 0x8ee2724c, 0x3c040001, 0x248458f8, +0x0, 0x8ee2724c, 0x3c040001, 0x248458a8, 0xafa00014, 0xafa20010, 0x8ee6724c, 0x8f470280, 0x3c050009, 0xc002403, 0x34a5f008, 0x8ee20174, 0x24420001, 0xaee20174, 0x8004057, 0x8ee20174, @@ -3125,16 +3125,16 @@ 0xc00249a, 0xafb00010, 0x2021, 0x24100001, 0x2402241f, 0xaf900210, 0xaf900200, 0xaf800204, 0xaf820214, 0x8f460248, 0x24030004, 0x3c020040, -0x3c010001, 0xac235d24, 0x3c010001, 0xac235d28, -0x3c010001, 0xac205dfc, 0x3c010001, 0xac225d20, -0x3c010001, 0xac235d28, 0xc0050e0, 0x24050004, -0xc0047fc, 0x0, 0x8ee20000, 0x3c03feff, +0x3c010001, 0xac235cc4, 0x3c010001, 0xac235cc8, +0x3c010001, 0xac205d9c, 0x3c010001, 0xac225cc0, +0x3c010001, 0xac235cc8, 0xc005108, 0x24050004, +0xc004822, 0x0, 0x8ee20000, 0x3c03feff, 0x3463fffd, 0x431024, 0xaee20000, 0x3c023c00, 0xaf82021c, 0x3c010001, 0x370821, 0xac3083ac, 0x8fbf0014, 0x8fb00010, 0x3e00008, 0x27bd0018, 0x27bdffe0, 0x3c050008, 0x34a50400, 0xafbf0018, 0xafa00010, 0xafa00014, 0x8f860200, 0x3c040001, -0x24845a40, 0xc002403, 0x3821, 0x8ee20280, +0x248459f0, 0xc002403, 0x3821, 0x8ee20280, 0x24420001, 0xaee20280, 0x8ee20280, 0x8f830200, 0x3c023f00, 0x621824, 0x8fbf0018, 0x3c020400, 0x3e00008, 0x27bd0020, 0x27bdffd8, 0xafbf0020, @@ -3146,16 +3146,16 @@ 0xaee20218, 0x8ee20218, 0x80040c6, 0x3c03fdff, 0x8ee2021c, 0x24420001, 0xaee2021c, 0x8ee2021c, 0x3c03fdff, 0x3463ffff, 0x3c0808ff, 0x3508ffff, -0x8ee20000, 0x3c040001, 0x24845a4c, 0x3c050008, +0x8ee20000, 0x3c040001, 0x248459fc, 0x3c050008, 0x2003021, 0x431024, 0xaee20000, 0x8f820220, 0x3821, 0x3c030300, 0x481024, 0x431025, 0xaf820220, 0xafa00010, 0xc002403, 0xafa00014, 0x8004296, 0x0, 0x2111024, 0x1040001f, 0x3c024000, 0x8f830224, 0x24021402, 0x1462000b, -0x3c03fdff, 0x3c040001, 0x24845a58, 0x3c050008, +0x3c03fdff, 0x3c040001, 0x24845a08, 0x3c050008, 0xafa00010, 0xafa00014, 0x8f860224, 0x34a5ffff, 0xc002403, 0x3821, 0x3c03fdff, 0x8ee20000, -0x3463ffff, 0x2002021, 0x431024, 0xc004e2c, +0x3463ffff, 0x2002021, 0x431024, 0xc004e54, 0xaee20000, 0x8ee20220, 0x24420001, 0xaee20220, 0x8ee20220, 0x8f820220, 0x3c0308ff, 0x3463ffff, 0x431024, 0x8004295, 0x511025, 0x2021024, @@ -3226,7 +3226,7 @@ 0x431025, 0xaf820220, 0x8f8600e0, 0x8f8400e4, 0x10c4002a, 0x0, 0x8ee2007c, 0x24420001, 0xaee2007c, 0x8ee2007c, 0x24c2fff8, 0xaf8200e0, -0x3c020001, 0x8c427e90, 0x3c030008, 0x8f8600e0, +0x3c020001, 0x8c427e30, 0x3c030008, 0x8f8600e0, 0x431024, 0x1040001d, 0x0, 0x10c4001b, 0x240dfff8, 0x3c0a000a, 0x354af000, 0x3c0c0080, 0x24850008, 0x27622800, 0x50a20001, 0x27651800, @@ -3262,12 +3262,12 @@ 0x621023, 0x2c420002, 0x1440fffc, 0x0, 0x8f820220, 0x3c0308ff, 0x3463fffb, 0x431024, 0xaf820220, 0x8fbf0020, 0x8fb1001c, 0x8fb00018, -0x3e00008, 0x27bd0028, 0x3c020001, 0x8c425d38, +0x3e00008, 0x27bd0028, 0x3c020001, 0x8c425cd8, 0x27bdffd8, 0x10400012, 0xafbf0020, 0x3c040001, -0x24845a64, 0x3c050008, 0x24020001, 0x3c010001, +0x24845a14, 0x3c050008, 0x24020001, 0x3c010001, 0x370821, 0xac2283ac, 0xafa00010, 0xafa00014, -0x8f860220, 0x34a50498, 0x3c010001, 0xac205d38, -0x3c010001, 0xac225d2c, 0xc002403, 0x3821, +0x8f860220, 0x34a50498, 0x3c010001, 0xac205cd8, +0x3c010001, 0xac225ccc, 0xc002403, 0x3821, 0x8f420268, 0x3c037fff, 0x3463ffff, 0x431024, 0xaf420268, 0x8ee204d0, 0x8ee404d4, 0x2403fffe, 0x431024, 0x30840002, 0x1080011e, 0xaee204d0, @@ -3333,24 +3333,24 @@ 0x54a00006, 0x240b0001, 0x8f820054, 0x1221023, 0x2c420033, 0x1440ffa6, 0x0, 0x316300ff, 0x24020001, 0x54620003, 0xafa00010, 0x80043d6, -0x0, 0x3c040001, 0x24845a70, 0xafa00014, +0x0, 0x3c040001, 0x24845a20, 0xafa00014, 0x8f860120, 0x8f870124, 0x3c050009, 0xc002403, 0x34a5f011, 0x80043d6, 0x0, 0x3c040001, -0x24845a7c, 0xafa00014, 0x8f860120, 0x8f870124, +0x24845a2c, 0xafa00014, 0x8f860120, 0x8f870124, 0x3c050009, 0xc002403, 0x34a5f010, 0x80043d6, -0x0, 0x3c040001, 0x24845a88, 0xafa00014, +0x0, 0x3c040001, 0x24845a38, 0xafa00014, 0x8ee60608, 0x8f470228, 0x3c050009, 0xc002403, 0x34a5f00f, 0x8ee201ac, 0x24420001, 0xaee201ac, 0x8ee201ac, 0x8ee2015c, 0x24420001, 0xaee2015c, 0x8ee2015c, 0x8fbf0020, 0x3e00008, 0x27bd0028, -0x3c020001, 0x8c425d38, 0x27bdffe0, 0x1440000d, -0xafbf0018, 0x3c040001, 0x24845a94, 0x3c050008, +0x3c020001, 0x8c425cd8, 0x27bdffe0, 0x1440000d, +0xafbf0018, 0x3c040001, 0x24845a44, 0x3c050008, 0xafa00010, 0xafa00014, 0x8f860220, 0x34a50499, -0x24020001, 0x3c010001, 0xac225d38, 0xc002403, +0x24020001, 0x3c010001, 0xac225cd8, 0xc002403, 0x3821, 0x8ee204d0, 0x3c030001, 0x771821, 0x946383b2, 0x34420001, 0x10600007, 0xaee204d0, 0x8f820220, 0x3c0308ff, 0x3463ffff, 0x431024, -0x34420008, 0xaf820220, 0x2021, 0xc005276, +0x34420008, 0xaf820220, 0x2021, 0xc0052a2, 0x24050004, 0xaf420268, 0x8fbf0018, 0x3e00008, 0x27bd0020, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, @@ -3368,7 +3368,7 @@ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c120001, -0x26521200, 0x3c140001, 0x8e945cb0, 0x3c100001, +0x26521200, 0x3c140001, 0x8e945c50, 0x3c100001, 0x26101120, 0x3c15c000, 0x36b50060, 0x8e8a0000, 0x8eb30000, 0x26a400b, 0x248000a, 0x200f821, 0x0, 0xd, 0x0, 0x0, @@ -3429,978 +3429,973 @@ 0x1062000c, 0x43102b, 0x14400006, 0x3c026000, 0x3c024000, 0x10620008, 0x24020800, 0x8004539, 0x0, 0x10620004, 0x24020800, 0x8004539, -0x0, 0x24020700, 0x3c010001, 0xac225d3c, -0x3e00008, 0x0, 0x27bdffd0, 0xafbf0028, -0x8f830054, 0x8f820054, 0x3c010001, 0xac205d24, -0x8004544, 0x24630064, 0x8f820054, 0x621023, -0x2c420065, 0x1440fffc, 0x0, 0xc004d49, -0x0, 0x24040001, 0x2821, 0x27a60020, -0x34028000, 0xc004966, 0xa7a20020, 0x8f830054, -0x8f820054, 0x8004555, 0x24630064, 0x8f820054, -0x621023, 0x2c420065, 0x1440fffc, 0x24040001, -0x24050001, 0xc004924, 0x27a60020, 0x8f830054, -0x8f820054, 0x8004561, 0x24630064, 0x8f820054, -0x621023, 0x2c420065, 0x1440fffc, 0x24040001, -0x24050001, 0xc004924, 0x27a60020, 0x8f830054, -0x8f820054, 0x800456d, 0x24630064, 0x8f820054, -0x621023, 0x2c420065, 0x1440fffc, 0x24040001, -0x24050002, 0xc004924, 0x27a60018, 0x8f830054, -0x8f820054, 0x8004579, 0x24630064, 0x8f820054, -0x621023, 0x2c420065, 0x1440fffc, 0x24040001, -0x24050003, 0xc004924, 0x27a6001a, 0x3c040001, -0x24845b00, 0x97a60020, 0x97a70018, 0x97a2001a, -0x3c05000d, 0x34a50100, 0xafa00014, 0xc002403, -0xafa20010, 0x97a20020, 0x10400045, 0x24036040, -0x97a2001a, 0x3042fff0, 0x14430009, 0x24020020, -0x97a30018, 0x54620008, 0x24027830, 0x24020003, -0x3c010001, 0xac225d24, 0x80045a4, 0x24020005, -0x97a30018, 0x24027830, 0x1462000e, 0x24030010, -0x97a2001a, 0x3042fff0, 0x1443000a, 0x24020003, -0x3c010001, 0xac225d24, 0x24020006, 0x3c010001, -0xac225e0c, 0x3c010001, 0xac225e18, 0x80045da, -0x3c09fff0, 0x3c020001, 0x8c425d24, 0x97a30018, -0x34420001, 0x3c010001, 0xac225d24, 0x24020015, -0x1462000e, 0x0, 0x97a2001a, 0x3042fff0, -0x3843f420, 0x2c630001, 0x3842f430, 0x2c420001, -0x621825, 0x10600005, 0x24020003, 0x3c010001, -0xac225e18, 0x80045da, 0x3c09fff0, 0x97a30018, -0x24027810, 0x1462000a, 0x24020002, 0x97a2001a, +0x0, 0x24020700, 0x3c010001, 0xac225cdc, +0x3e00008, 0x0, 0x27bdffd8, 0xafbf0024, +0xafb00020, 0x8f830054, 0x8f820054, 0x3c010001, +0xac205cc4, 0x8004545, 0x24630064, 0x8f820054, +0x621023, 0x2c420065, 0x1440fffc, 0x0, +0xc004d71, 0x0, 0x24040001, 0x2821, +0x27a60018, 0x34028000, 0xc00498e, 0xa7a20018, +0x8f830054, 0x8f820054, 0x8004556, 0x24630064, +0x8f820054, 0x621023, 0x2c420065, 0x1440fffc, +0x24040001, 0x24050001, 0xc00494c, 0x27a60018, +0x8f830054, 0x8f820054, 0x8004562, 0x24630064, +0x8f820054, 0x621023, 0x2c420065, 0x1440fffc, +0x24040001, 0x24050001, 0xc00494c, 0x27a60018, +0x8f830054, 0x8f820054, 0x800456e, 0x24630064, +0x8f820054, 0x621023, 0x2c420065, 0x1440fffc, +0x24040001, 0x3c060001, 0x24c65da0, 0xc00494c, +0x24050002, 0x8f830054, 0x8f820054, 0x800457b, +0x24630064, 0x8f820054, 0x621023, 0x2c420065, +0x1440fffc, 0x24040001, 0x24050003, 0x3c100001, +0x26105da2, 0xc00494c, 0x2003021, 0x97a60018, +0x3c070001, 0x94e75da0, 0x3c040001, 0x24845ab0, +0xafa00014, 0x96020000, 0x3c05000d, 0x34a50100, +0xc002403, 0xafa20010, 0x97a20018, 0x1040004c, +0x24036040, 0x96020000, 0x3042fff0, 0x1443000a, +0x24020020, 0x3c030001, 0x94635da0, 0x54620009, +0x24027830, 0x24020003, 0x3c010001, 0xac225cc4, +0x80045ac, 0x24020005, 0x3c030001, 0x94635da0, +0x24027830, 0x1462000f, 0x24030010, 0x3c020001, +0x94425da2, 0x3042fff0, 0x1443000a, 0x24020003, +0x3c010001, 0xac225cc4, 0x24020006, 0x3c010001, +0xac225db0, 0x3c010001, 0xac225dbc, 0x80045e6, +0x3c09fff0, 0x3c020001, 0x8c425cc4, 0x3c030001, +0x94635da0, 0x34420001, 0x3c010001, 0xac225cc4, +0x24020015, 0x1462000f, 0x0, 0x3c020001, +0x94425da2, 0x3042fff0, 0x3843f420, 0x2c630001, +0x3842f430, 0x2c420001, 0x621825, 0x10600005, +0x24020003, 0x3c010001, 0xac225dbc, 0x80045e6, +0x3c09fff0, 0x3c030001, 0x94635da0, 0x24027810, +0x1462000b, 0x24020002, 0x3c020001, 0x94425da2, 0x3042fff0, 0x14400006, 0x24020002, 0x24020004, -0x3c010001, 0xac225e18, 0x80045da, 0x3c09fff0, -0x3c010001, 0xac225e18, 0x80045da, 0x3c09fff0, -0x3c020001, 0x8c425d24, 0x24030001, 0x3c010001, -0xac235e18, 0x34420004, 0x3c010001, 0xac225d24, -0x3c09fff0, 0x3529bdc0, 0x8f830054, 0x3c060001, -0x8cc65d24, 0x3c070001, 0x8ce75e18, 0x97a80018, -0x3c040001, 0x24845b00, 0x24020001, 0x3c010001, -0xac225d2c, 0xafa80010, 0x97a2001a, 0x3c05000d, -0x34a50100, 0x3c010001, 0xac205d28, 0x691821, -0x3c010001, 0xac235e08, 0xc002403, 0xafa20014, -0x8fbf0028, 0x3e00008, 0x27bd0030, 0x27bdffe8, -0x3c050001, 0x8ca55d28, 0x24060004, 0x24020001, -0x14a20014, 0xafbf0010, 0x3c020001, 0x8c427e9c, -0x30428000, 0x10400005, 0x3c04000f, 0x3c030001, -0x8c635e18, 0x8004608, 0x34844240, 0x3c040004, -0x3c030001, 0x8c635e18, 0x348493e0, 0x24020005, -0x14620016, 0x0, 0x3c04003d, 0x8004620, -0x34840900, 0x3c020001, 0x8c427e98, 0x30428000, -0x10400005, 0x3c04001e, 0x3c030001, 0x8c635e18, -0x800461b, 0x34848480, 0x3c04000f, 0x3c030001, -0x8c635e18, 0x34844240, 0x24020005, 0x14620003, -0x0, 0x3c04007a, 0x34841200, 0x3c020001, -0x8c425e08, 0x8f830054, 0x441021, 0x431023, -0x44102b, 0x14400037, 0x0, 0x3c020001, -0x8c425d30, 0x14400033, 0x0, 0x3c010001, -0x10c00025, 0xac205d40, 0x3c090001, 0x8d295d24, -0x24070001, 0x3c044000, 0x3c080001, 0x25087e9c, -0x250afffc, 0x52842, 0x14a00002, 0x24c6ffff, -0x24050008, 0xa91024, 0x10400010, 0x0, -0x14a70008, 0x0, 0x8d020000, 0x441024, -0x1040000a, 0x0, 0x3c010001, 0x800464c, -0xac255d40, 0x8d420000, 0x441024, 0x10400003, -0x0, 0x3c010001, 0xac275d40, 0x3c020001, -0x8c425d40, 0x6182b, 0x2c420001, 0x431024, -0x5440ffe5, 0x52842, 0x8f820054, 0x3c030001, -0x8c635d40, 0x3c010001, 0xac225e08, 0x1060002a, -0x24020001, 0x3c010001, 0xac255d28, 0x3c010001, -0xac225d2c, 0x3c020001, 0x8c425d40, 0x10400022, -0x0, 0x3c020001, 0x8c425d2c, 0x1040000a, -0x24020001, 0x3c010001, 0xac205d2c, 0x3c010001, -0x370821, 0xac2283ac, 0x3c010001, 0xac205dac, -0x3c010001, 0xac225d64, 0x3c030001, 0x771821, -0x8c6383ac, 0x24020008, 0x10620005, 0x24020001, -0xc004686, 0x0, 0x8004683, 0x0, -0x3c030001, 0x8c635d28, 0x10620007, 0x2402000e, -0x3c030001, 0x8c637e30, 0x10620003, 0x0, -0xc004e2c, 0x8f840220, 0x8fbf0010, 0x3e00008, -0x27bd0018, 0x27bdffe0, 0x3c02fdff, 0xafbf001c, -0xafb00018, 0x8ee30000, 0x3c050001, 0x8ca55d28, -0x3c040001, 0x8c845d50, 0x3442ffff, 0x621824, -0x14a40008, 0xaee30000, 0x3c030001, 0x771821, -0x8c6383ac, 0x3c020001, 0x8c425d54, 0x10620008, -0x0, 0x3c020001, 0x571021, 0x8c4283ac, -0x3c010001, 0xac255d50, 0x3c010001, 0xac225d54, -0x3c030001, 0x8c635d28, 0x24020002, 0x10620150, -0x2c620003, 0x10400005, 0x24020001, 0x10620008, -0x0, 0x80047f5, 0x0, 0x24020004, -0x10620098, 0x24020001, 0x80047f6, 0x0, -0x3c020001, 0x571021, 0x8c4283ac, 0x2443ffff, -0x2c620008, 0x10400141, 0x31080, 0x3c010001, -0x220821, 0x8c225b18, 0x400008, 0x0, -0x3c030001, 0x8c635e18, 0x24020005, 0x14620014, -0x0, 0x3c020001, 0x8c425d34, 0x1040000a, -0x24020003, 0xc0047fc, 0x0, 0x24020002, +0x3c010001, 0xac225dbc, 0x80045e6, 0x3c09fff0, +0x3c010001, 0xac225dbc, 0x80045e6, 0x3c09fff0, +0x3c020001, 0x8c425cc4, 0x24030001, 0x3c010001, +0xac235dbc, 0x34420004, 0x3c010001, 0xac225cc4, +0x3c09fff0, 0x3529bdc0, 0x3c060001, 0x8cc65cc4, +0x3c040001, 0x24845ab0, 0x24020001, 0x3c010001, +0xac225ccc, 0x8f820054, 0x3c070001, 0x8ce75dbc, +0x3c030001, 0x94635da0, 0x3c080001, 0x95085da2, +0x3c05000d, 0x34a50100, 0x3c010001, 0xac205cc8, +0x491021, 0x3c010001, 0xac225dac, 0xafa30010, +0xc002403, 0xafa80014, 0x8fbf0024, 0x8fb00020, +0x3e00008, 0x27bd0028, 0x27bdffe8, 0x3c050001, +0x8ca55cc8, 0x24060004, 0x24020001, 0x14a20014, +0xafbf0010, 0x3c020001, 0x8c427e3c, 0x30428000, +0x10400005, 0x3c04000f, 0x3c030001, 0x8c635dbc, +0x8004617, 0x34844240, 0x3c040004, 0x3c030001, +0x8c635dbc, 0x348493e0, 0x24020005, 0x14620016, +0x0, 0x3c04003d, 0x800462f, 0x34840900, +0x3c020001, 0x8c427e38, 0x30428000, 0x10400005, +0x3c04001e, 0x3c030001, 0x8c635dbc, 0x800462a, +0x34848480, 0x3c04000f, 0x3c030001, 0x8c635dbc, +0x34844240, 0x24020005, 0x14620003, 0x0, +0x3c04007a, 0x34841200, 0x3c020001, 0x8c425dac, +0x8f830054, 0x441021, 0x431023, 0x44102b, +0x14400037, 0x0, 0x3c020001, 0x8c425cd0, +0x14400033, 0x0, 0x3c010001, 0x10c00025, +0xac205ce0, 0x3c090001, 0x8d295cc4, 0x24070001, +0x3c044000, 0x3c080001, 0x25087e3c, 0x250afffc, +0x52842, 0x14a00002, 0x24c6ffff, 0x24050008, +0xa91024, 0x10400010, 0x0, 0x14a70008, +0x0, 0x8d020000, 0x441024, 0x1040000a, +0x0, 0x3c010001, 0x800465b, 0xac255ce0, +0x8d420000, 0x441024, 0x10400003, 0x0, +0x3c010001, 0xac275ce0, 0x3c020001, 0x8c425ce0, +0x6182b, 0x2c420001, 0x431024, 0x5440ffe5, +0x52842, 0x8f820054, 0x3c030001, 0x8c635ce0, +0x3c010001, 0xac225dac, 0x1060002a, 0x24020001, +0x3c010001, 0xac255cc8, 0x3c010001, 0xac225ccc, +0x3c020001, 0x8c425ce0, 0x10400022, 0x0, +0x3c020001, 0x8c425ccc, 0x1040000a, 0x24020001, +0x3c010001, 0xac205ccc, 0x3c010001, 0x370821, +0xac2283ac, 0x3c010001, 0xac205d4c, 0x3c010001, +0xac225d04, 0x3c030001, 0x771821, 0x8c6383ac, +0x24020008, 0x10620005, 0x24020001, 0xc004695, +0x0, 0x8004692, 0x0, 0x3c030001, +0x8c635cc8, 0x10620007, 0x2402000e, 0x3c030001, +0x8c637dd0, 0x10620003, 0x0, 0xc004e54, +0x8f840220, 0x8fbf0010, 0x3e00008, 0x27bd0018, +0x27bdffe0, 0x3c02fdff, 0xafbf0018, 0x8ee30000, +0x3c050001, 0x8ca55cc8, 0x3c040001, 0x8c845cf0, +0x3442ffff, 0x621824, 0x14a40008, 0xaee30000, +0x3c030001, 0x771821, 0x8c6383ac, 0x3c020001, +0x8c425cf4, 0x10620008, 0x0, 0x3c020001, +0x571021, 0x8c4283ac, 0x3c010001, 0xac255cf0, +0x3c010001, 0xac225cf4, 0x3c030001, 0x8c635cc8, +0x24020002, 0x10620169, 0x2c620003, 0x10400005, +0x24020001, 0x10620008, 0x0, 0x800481c, +0x0, 0x24020004, 0x106200b1, 0x24020001, +0x800481d, 0x0, 0x3c020001, 0x571021, +0x8c4283ac, 0x2443ffff, 0x2c620008, 0x1040015a, +0x31080, 0x3c010001, 0x220821, 0x8c225ac8, +0x400008, 0x0, 0x3c030001, 0x8c635dbc, +0x24020005, 0x14620014, 0x0, 0x3c020001, +0x8c425cd4, 0x1040000a, 0x24020003, 0xc004822, +0x0, 0x24020002, 0x3c010001, 0x370821, +0xac2283ac, 0x3c010001, 0x80046e0, 0xac205cd4, 0x3c010001, 0x370821, 0xac2283ac, 0x3c010001, -0x80046d2, 0xac205d34, 0x3c010001, 0x370821, -0xac2283ac, 0x3c010001, 0x80047f8, 0xac205cc0, -0xc0047fc, 0x0, 0x3c020001, 0x8c425d34, -0x3c010001, 0xac205cc0, 0x104000c4, 0x24020002, +0x800481f, 0xac205c60, 0xc004822, 0x0, +0x3c020001, 0x8c425cd4, 0x3c010001, 0xac205c60, +0x104000dd, 0x24020002, 0x3c010001, 0x370821, +0xac2283ac, 0x3c010001, 0x800481f, 0xac205cd4, +0x3c030001, 0x8c635dbc, 0x24020005, 0x14620003, +0x24020001, 0x3c010001, 0xac225d00, 0xc0049cf, +0x0, 0x3c030001, 0x8c635d00, 0x800478e, +0x24020011, 0x3c050001, 0x8ca55cc8, 0x3c060001, +0x8cc67e3c, 0xc005108, 0x2021, 0x24020005, +0x3c010001, 0xac205cd4, 0x3c010001, 0x370821, +0x800481f, 0xac2283ac, 0x3c040001, 0x24845abc, +0x3c05000f, 0x34a50100, 0x3021, 0x3821, +0xafa00010, 0xc002403, 0xafa00014, 0x800481f, +0x0, 0x8f820220, 0x3c03f700, 0x431025, +0x80047b7, 0xaf820220, 0x8f820220, 0x3c030004, +0x431024, 0x144000a9, 0x24020007, 0x8f830054, +0x3c020001, 0x8c425da4, 0x2463d8f0, 0x431023, +0x2c422710, 0x144000f8, 0x24020001, 0x800481d, +0x0, 0x3c050001, 0x8ca55cc8, 0xc0052a2, +0x2021, 0xc005386, 0x2021, 0x3c030001, +0x8c637e34, 0x46100ea, 0x24020001, 0x3c020008, +0x621024, 0x10400006, 0x0, 0x8f820214, +0x3c03ffff, 0x431024, 0x8004741, 0x3442251f, +0x8f820214, 0x3c03ffff, 0x431024, 0x3442241f, +0xaf820214, 0x8ee20000, 0x3c030200, 0x431025, +0xaee20000, 0x8f820220, 0x2403fffb, 0x431024, +0xaf820220, 0x8f820220, 0x34420002, 0xaf820220, +0x24020008, 0x3c010001, 0x370821, 0xac2283ac, +0x8f820220, 0x3c030004, 0x431024, 0x14400005, +0x0, 0x8f820220, 0x3c03f700, 0x431025, +0xaf820220, 0x3c030001, 0x8c635dbc, 0x24020005, +0x1462000a, 0x0, 0x3c020001, 0x94425da2, +0x24429fbc, 0x2c420004, 0x10400004, 0x24040018, +0x24050002, 0xc004d93, 0x24060020, 0xc0043dd, +0x0, 0x3c010001, 0x800481f, 0xac205d50, +0x3c020001, 0x571021, 0x8c4283ac, 0x2443ffff, +0x2c620008, 0x104000ac, 0x31080, 0x3c010001, +0x220821, 0x8c225ae8, 0x400008, 0x0, +0xc00429b, 0x0, 0x3c010001, 0xac205ccc, +0xaf800204, 0x3c010001, 0xc004822, 0xac207e20, +0x24020001, 0x3c010001, 0xac225ce4, 0x24020002, +0x3c010001, 0x370821, 0x800481f, 0xac2283ac, +0xc00489f, 0x0, 0x3c030001, 0x8c635ce4, +0x24020009, 0x14620090, 0x24020003, 0x3c010001, +0x370821, 0x800481f, 0xac2283ac, 0x3c020001, +0x8c427e38, 0x30424000, 0x10400005, 0x0, +0x8f820044, 0x3c03ffff, 0x800479f, 0x34637fff, +0x8f820044, 0x2403ff7f, 0x431024, 0xaf820044, +0x8f830054, 0x80047b9, 0x24020004, 0x8f830054, +0x3c020001, 0x8c425da4, 0x2463d8f0, 0x431023, +0x2c422710, 0x14400074, 0x24020005, 0x3c010001, +0x370821, 0x800481f, 0xac2283ac, 0x8f820220, +0x3c03f700, 0x431025, 0xaf820220, 0xaf800204, +0x3c010001, 0xac207e20, 0x8f830054, 0x24020006, 0x3c010001, 0x370821, 0xac2283ac, 0x3c010001, -0x80047f8, 0xac205d34, 0x24020001, 0x3c010001, -0xc0049a7, 0xac225d60, 0x3c030001, 0x8c635d60, -0x8004767, 0x24020011, 0x3c020001, 0x8c425e18, -0x24100005, 0x10500007, 0x0, 0x3c050001, -0x8ca55d28, 0x3c060001, 0x8cc67e9c, 0xc0050e0, -0x2021, 0x3c010001, 0xac205d34, 0x3c010001, -0x370821, 0x80047f8, 0xac3083ac, 0x3c040001, -0x24845b0c, 0x3c05000f, 0x34a50100, 0x3021, -0x3821, 0xafa00010, 0xc002403, 0xafa00014, -0x80047f8, 0x0, 0x8f820220, 0x3c03f700, -0x431025, 0x8004790, 0xaf820220, 0x8f820220, -0x3c030004, 0x431024, 0x14400091, 0x24020007, -0x8f830054, 0x3c020001, 0x8c425e00, 0x2463d8f0, -0x431023, 0x2c422710, 0x144000e0, 0x24020001, -0x80047f6, 0x0, 0x3c050001, 0x8ca55d28, -0xc005276, 0x2021, 0xc005397, 0x2021, -0x3c030001, 0x8c637e94, 0x46100d2, 0x24020001, -0x3c020008, 0x621024, 0x10400006, 0x0, -0x8f820214, 0x3c03ffff, 0x431024, 0x8004732, -0x3442251f, 0x8f820214, 0x3c03ffff, 0x431024, -0x3442241f, 0xaf820214, 0x8ee20000, 0x3c030200, -0x431025, 0xaee20000, 0x8f820220, 0x2403fffb, -0x431024, 0xaf820220, 0x8f820220, 0x34420002, -0xaf820220, 0x24020008, 0x3c010001, 0x370821, -0xc0043dd, 0xac2283ac, 0x3c010001, 0x80047f8, -0xac205db0, 0x3c020001, 0x571021, 0x8c4283ac, -0x2443ffff, 0x2c620008, 0x104000ac, 0x31080, -0x3c010001, 0x220821, 0x8c225b38, 0x400008, -0x0, 0xc00429b, 0x0, 0x3c010001, -0xac205d2c, 0xaf800204, 0x3c010001, 0xc0047fc, -0xac207e80, 0x24020001, 0x3c010001, 0xac225d44, -0x24020002, 0x3c010001, 0x370821, 0x80047f8, -0xac2283ac, 0xc004879, 0x0, 0x3c030001, -0x8c635d44, 0x24020009, 0x14620090, 0x24020003, -0x3c010001, 0x370821, 0x80047f8, 0xac2283ac, -0x3c020001, 0x8c427e98, 0x30424000, 0x10400005, -0x0, 0x8f820044, 0x3c03ffff, 0x8004778, -0x34637fff, 0x8f820044, 0x2403ff7f, 0x431024, -0xaf820044, 0x8f830054, 0x8004792, 0x24020004, -0x8f830054, 0x3c020001, 0x8c425e00, 0x2463d8f0, -0x431023, 0x2c422710, 0x14400074, 0x24020005, -0x3c010001, 0x370821, 0x80047f8, 0xac2283ac, +0x800481f, 0xac235da4, 0x8f830054, 0x3c020001, +0x8c425da4, 0x2463fff6, 0x431023, 0x2c42000a, +0x14400059, 0x0, 0x24020007, 0x3c010001, +0x370821, 0x800481f, 0xac2283ac, 0x8f820220, +0x3c04f700, 0x441025, 0xaf820220, 0x8f820220, +0x3c030300, 0x431024, 0x14400005, 0x1821, +0x8f820220, 0x24030001, 0x441025, 0xaf820220, +0x10600043, 0x24020001, 0x8f820214, 0x3c03ffff, +0x3c040001, 0x8c845d98, 0x431024, 0x3442251f, +0xaf820214, 0x24020008, 0x3c010001, 0x370821, +0x1080000b, 0xac2283ac, 0x3c020001, 0x8c425d74, +0x14400007, 0x24020001, 0x3c010001, 0xac227dd0, +0xc004e54, 0x8f840220, 0x800480c, 0x0, +0x8f820220, 0x3c030008, 0x431024, 0x14400017, +0x2402000e, 0x3c010001, 0xac227dd0, 0x8ee20000, +0x2021, 0x3c030200, 0x431025, 0xc005386, +0xaee20000, 0x8f820220, 0x2403fffb, 0x431024, +0xaf820220, 0x8f820220, 0x34420002, 0xc0043dd, +0xaf820220, 0x3c050001, 0x8ca55cc8, 0xc0052a2, +0x2021, 0x800481f, 0x0, 0x3c020001, +0x8c425d74, 0x10400010, 0x0, 0x3c020001, +0x8c425d70, 0x2442ffff, 0x3c010001, 0xac225d70, +0x14400009, 0x24020002, 0x3c010001, 0xac205d74, +0x3c010001, 0x800481f, 0xac225d70, 0x24020001, +0x3c010001, 0xac225ccc, 0x8fbf0018, 0x3e00008, +0x27bd0020, 0x8f820200, 0x8f820220, 0x8f820220, +0x34420004, 0xaf820220, 0x8f820200, 0x3c060001, +0x8cc65cc8, 0x34420004, 0xaf820200, 0x24020002, +0x10c2003a, 0x2cc20003, 0x10400005, 0x24020001, +0x10c20008, 0x0, 0x8004868, 0x0, +0x24020004, 0x10c20013, 0x24020001, 0x8004868, +0x0, 0x3c030001, 0x8c635cb8, 0x3c020001, +0x8c425cc0, 0x3c040001, 0x8c845cdc, 0x3c050001, +0x8ca55cbc, 0xaf860200, 0xaf860220, 0x34630022, +0x441025, 0x451025, 0x34420002, 0x8004867, +0xaf830200, 0x3c030001, 0x8c635d98, 0xaf820200, +0x10600009, 0xaf820220, 0x3c020001, 0x8c425d74, +0x14400005, 0x3c033f00, 0x3c020001, 0x8c425cb0, +0x800485b, 0x346300e0, 0x3c020001, 0x8c425cb0, +0x3c033f00, 0x346300e2, 0x431025, 0xaf820200, +0x3c030001, 0x8c635cb4, 0x3c04f700, 0x3c020001, +0x8c425cc0, 0x3c050001, 0x8ca55cdc, 0x641825, +0x431025, 0x451025, 0xaf820220, 0x3e00008, +0x0, 0x8f820220, 0x3c030001, 0x8c635cc8, +0x34420004, 0xaf820220, 0x24020001, 0x1062000f, +0x0, 0x8f830054, 0x8f820054, 0x24630002, +0x621023, 0x2c420003, 0x10400011, 0x0, +0x8f820054, 0x621023, 0x2c420003, 0x1040000c, +0x0, 0x8004879, 0x0, 0x8f830054, +0x8f820054, 0x8004885, 0x24630007, 0x8f820054, +0x621023, 0x2c420008, 0x1440fffc, 0x0, +0x8f8400e0, 0x30820007, 0x1040000d, 0x0, +0x8f820054, 0x8f8300e0, 0x14830009, 0x24450032, +0x8f820054, 0xa21023, 0x2c420033, 0x10400004, +0x0, 0x8f8200e0, 0x1082fff9, 0x0, +0x8f820220, 0x2403fffd, 0x431024, 0xaf820220, +0x3e00008, 0x0, 0x3c030001, 0x8c635ce4, +0x3c020001, 0x8c425ce8, 0x50620004, 0x2463ffff, +0x3c010001, 0xac235ce8, 0x2463ffff, 0x2c620009, +0x1040009d, 0x31080, 0x3c010001, 0x220821, +0x8c225b08, 0x400008, 0x0, 0x8f820044, +0x34428080, 0xaf820044, 0x8f830054, 0x8004938, +0x24020002, 0x8f830054, 0x3c020001, 0x8c425da8, +0x2463d8f0, 0x431023, 0x2c422710, 0x1440008a, +0x24020003, 0x8004945, 0x0, 0x8f820044, +0x3c03ffff, 0x34637fff, 0x431024, 0xaf820044, +0x8f830054, 0x8004938, 0x24020004, 0x8f830054, +0x3c020001, 0x8c425da8, 0x2463fff6, 0x431023, +0x2c42000a, 0x14400078, 0x24020005, 0x8004945, +0x0, 0x8f820220, 0x3c03f700, 0x431025, +0xaf820220, 0x8f820220, 0x2403fffb, 0x431024, +0xaf820220, 0x8f820220, 0x34420002, 0xaf820220, +0x3c023f00, 0x344200e0, 0xaf820200, 0x8f820200, +0x2403fffd, 0x431024, 0xaf820200, 0x24040001, +0x3405ffff, 0xaf840204, 0x8f830054, 0x8f820054, +0x80048ec, 0x24630001, 0x8f820054, 0x621023, +0x2c420002, 0x1440fffc, 0x0, 0x8f820224, +0x42040, 0xa4102b, 0x1040fff2, 0x0, 0x8f820220, 0x3c03f700, 0x431025, 0xaf820220, -0xaf800204, 0x3c010001, 0xac207e80, 0x8f830054, -0x24020006, 0x3c010001, 0x370821, 0xac2283ac, -0x3c010001, 0x80047f8, 0xac235e00, 0x8f830054, -0x3c020001, 0x8c425e00, 0x2463fff6, 0x431023, -0x2c42000a, 0x14400059, 0x0, 0x24020007, -0x3c010001, 0x370821, 0x80047f8, 0xac2283ac, -0x8f820220, 0x3c04f700, 0x441025, 0xaf820220, -0x8f820220, 0x3c030300, 0x431024, 0x14400005, -0x1821, 0x8f820220, 0x24030001, 0x441025, -0xaf820220, 0x10600043, 0x24020001, 0x8f820214, -0x3c03ffff, 0x3c040001, 0x8c845df8, 0x431024, -0x3442251f, 0xaf820214, 0x24020008, 0x3c010001, -0x370821, 0x1080000b, 0xac2283ac, 0x3c020001, -0x8c425dd4, 0x14400007, 0x24020001, 0x3c010001, -0xac227e30, 0xc004e2c, 0x8f840220, 0x80047e5, -0x0, 0x8f820220, 0x3c030008, 0x431024, -0x14400017, 0x2402000e, 0x3c010001, 0xac227e30, -0x8ee20000, 0x2021, 0x3c030200, 0x431025, -0xc005397, 0xaee20000, 0x8f820220, 0x2403fffb, -0x431024, 0xaf820220, 0x8f820220, 0x34420002, -0xc0043dd, 0xaf820220, 0x3c050001, 0x8ca55d28, -0xc005276, 0x2021, 0x80047f8, 0x0, -0x3c020001, 0x8c425dd4, 0x10400010, 0x0, -0x3c020001, 0x8c425dd0, 0x2442ffff, 0x3c010001, -0xac225dd0, 0x14400009, 0x24020002, 0x3c010001, -0xac205dd4, 0x3c010001, 0x80047f8, 0xac225dd0, -0x24020001, 0x3c010001, 0xac225d2c, 0x8fbf001c, -0x8fb00018, 0x3e00008, 0x27bd0020, 0x8f820200, -0x8f820220, 0x8f820220, 0x34420004, 0xaf820220, -0x8f820200, 0x3c060001, 0x8cc65d28, 0x34420004, -0xaf820200, 0x24020002, 0x10c2003a, 0x2cc20003, -0x10400005, 0x24020001, 0x10c20008, 0x0, -0x8004842, 0x0, 0x24020004, 0x10c20013, -0x24020001, 0x8004842, 0x0, 0x3c030001, -0x8c635d18, 0x3c020001, 0x8c425d20, 0x3c040001, -0x8c845d3c, 0x3c050001, 0x8ca55d1c, 0xaf860200, -0xaf860220, 0x34630022, 0x441025, 0x451025, -0x34420002, 0x8004841, 0xaf830200, 0x3c030001, -0x8c635df8, 0xaf820200, 0x10600009, 0xaf820220, -0x3c020001, 0x8c425dd4, 0x14400005, 0x3c033f00, -0x3c020001, 0x8c425d10, 0x8004835, 0x346300e0, -0x3c020001, 0x8c425d10, 0x3c033f00, 0x346300e2, -0x431025, 0xaf820200, 0x3c030001, 0x8c635d14, -0x3c04f700, 0x3c020001, 0x8c425d20, 0x3c050001, -0x8ca55d3c, 0x641825, 0x431025, 0x451025, -0xaf820220, 0x3e00008, 0x0, 0x8f820220, -0x3c030001, 0x8c635d28, 0x34420004, 0xaf820220, -0x24020001, 0x1062000f, 0x0, 0x8f830054, -0x8f820054, 0x24630002, 0x621023, 0x2c420003, -0x10400011, 0x0, 0x8f820054, 0x621023, -0x2c420003, 0x1040000c, 0x0, 0x8004853, -0x0, 0x8f830054, 0x8f820054, 0x800485f, -0x24630007, 0x8f820054, 0x621023, 0x2c420008, -0x1440fffc, 0x0, 0x8f8400e0, 0x30820007, -0x1040000d, 0x0, 0x8f820054, 0x8f8300e0, -0x14830009, 0x24450032, 0x8f820054, 0xa21023, -0x2c420033, 0x10400004, 0x0, 0x8f8200e0, -0x1082fff9, 0x0, 0x8f820220, 0x2403fffd, -0x431024, 0xaf820220, 0x3e00008, 0x0, -0x3c030001, 0x8c635d44, 0x3c020001, 0x8c425d48, -0x50620004, 0x2463ffff, 0x3c010001, 0xac235d48, -0x2463ffff, 0x2c620009, 0x1040009d, 0x31080, -0x3c010001, 0x220821, 0x8c225b58, 0x400008, -0x0, 0x8f820044, 0x34428080, 0xaf820044, -0x8f830054, 0x8004912, 0x24020002, 0x8f830054, -0x3c020001, 0x8c425e04, 0x2463d8f0, 0x431023, -0x2c422710, 0x1440008a, 0x24020003, 0x800491f, -0x0, 0x8f820044, 0x3c03ffff, 0x34637fff, -0x431024, 0xaf820044, 0x8f830054, 0x8004912, -0x24020004, 0x8f830054, 0x3c020001, 0x8c425e04, -0x2463fff6, 0x431023, 0x2c42000a, 0x14400078, -0x24020005, 0x800491f, 0x0, 0x8f820220, -0x3c03f700, 0x431025, 0xaf820220, 0x8f820220, -0x2403fffb, 0x431024, 0xaf820220, 0x8f820220, -0x34420002, 0xaf820220, 0x3c023f00, 0x344200e0, -0xaf820200, 0x8f820200, 0x2403fffd, 0x431024, -0xaf820200, 0x24040001, 0x3405ffff, 0xaf840204, -0x8f830054, 0x8f820054, 0x80048c6, 0x24630001, -0x8f820054, 0x621023, 0x2c420002, 0x1440fffc, -0x0, 0x8f820224, 0x42040, 0xa4102b, -0x1040fff2, 0x0, 0x8f820220, 0x3c03f700, -0x431025, 0xaf820220, 0x8f820214, 0x3c03ffff, -0x431024, 0x3442251f, 0xaf820214, 0x8f820220, -0x2403fffb, 0x431024, 0xaf820220, 0x8f820220, -0x3c04f700, 0x34840008, 0x34420002, 0xaf820220, -0x8f820220, 0x3c033f00, 0x346300e2, 0x441025, -0xaf820220, 0xaf830200, 0x8f8400f0, 0x276217f8, -0x14820002, 0x24850008, 0x27651000, 0x8f8200f4, -0x10a20007, 0x3c038000, 0x34630040, 0x3c020001, -0x24425cd0, 0xac820000, 0xac830004, 0xaf8500f0, -0x8f830054, 0x8004912, 0x24020006, 0x8f830054, -0x3c020001, 0x8c425e04, 0x2463fff6, 0x431023, -0x2c42000a, 0x14400022, 0x24020007, 0x800491f, -0x0, 0x8f8200e0, 0xaf8200e4, 0x8f8200e0, -0xaf8200e8, 0x8f820220, 0x34420004, 0xaf820220, -0x8f820220, 0x2403fff7, 0x431024, 0xaf820220, -0x8f820044, 0x34428080, 0xaf820044, 0x8f830054, -0x24020008, 0x3c010001, 0xac225d44, 0x3c010001, -0x8004921, 0xac235e04, 0x8f830054, 0x3c020001, -0x8c425e04, 0x2463d8f0, 0x431023, 0x2c422710, -0x14400003, 0x24020009, 0x3c010001, 0xac225d44, -0x3e00008, 0x0, 0x0, 0x27bdffd8, +0x8f820214, 0x3c03ffff, 0x431024, 0x3442251f, +0xaf820214, 0x8f820220, 0x2403fffb, 0x431024, +0xaf820220, 0x8f820220, 0x3c04f700, 0x34840008, +0x34420002, 0xaf820220, 0x8f820220, 0x3c033f00, +0x346300e2, 0x441025, 0xaf820220, 0xaf830200, +0x8f8400f0, 0x276217f8, 0x14820002, 0x24850008, +0x27651000, 0x8f8200f4, 0x10a20007, 0x3c038000, +0x34630040, 0x3c020001, 0x24425c70, 0xac820000, +0xac830004, 0xaf8500f0, 0x8f830054, 0x8004938, +0x24020006, 0x8f830054, 0x3c020001, 0x8c425da8, +0x2463fff6, 0x431023, 0x2c42000a, 0x14400022, +0x24020007, 0x8004945, 0x0, 0x8f8200e0, +0xaf8200e4, 0x8f8200e0, 0xaf8200e8, 0x8f820220, +0x34420004, 0xaf820220, 0x8f820220, 0x2403fff7, +0x431024, 0xaf820220, 0x8f820044, 0x34428080, +0xaf820044, 0x8f830054, 0x24020008, 0x3c010001, +0xac225ce4, 0x3c010001, 0x8004947, 0xac235da8, +0x8f830054, 0x3c020001, 0x8c425da8, 0x2463d8f0, +0x431023, 0x2c422710, 0x14400003, 0x24020009, +0x3c010001, 0xac225ce4, 0x3e00008, 0x0, +0x0, 0x0, 0x0, 0x27bdffd8, 0xafb20018, 0x809021, 0xafb3001c, 0xa09821, 0xafb10014, 0xc08821, 0xafb00010, 0x8021, -0xafbf0020, 0xa6200000, 0xc004d23, 0x24040001, +0xafbf0020, 0xa6200000, 0xc004d4b, 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, 0x0, -0xc004d23, 0x2021, 0xc004d23, 0x24040001, -0xc004d23, 0x24040001, 0xc004d23, 0x2021, +0xc004d4b, 0x2021, 0xc004d4b, 0x24040001, +0xc004d4b, 0x24040001, 0xc004d4b, 0x2021, 0x24100010, 0x2501024, 0x10400002, 0x2021, -0x24040001, 0xc004d23, 0x108042, 0x1600fffa, +0x24040001, 0xc004d4b, 0x108042, 0x1600fffa, 0x2501024, 0x24100010, 0x2701024, 0x10400002, -0x2021, 0x24040001, 0xc004d23, 0x108042, -0x1600fffa, 0x2701024, 0xc004d49, 0x34108000, -0xc004d49, 0x0, 0xc004d03, 0x0, +0x2021, 0x24040001, 0xc004d4b, 0x108042, +0x1600fffa, 0x2701024, 0xc004d71, 0x34108000, +0xc004d71, 0x0, 0xc004d2b, 0x0, 0x50400005, 0x108042, 0x96220000, 0x501025, 0xa6220000, 0x108042, 0x1600fff7, 0x0, -0xc004d49, 0x0, 0x8fbf0020, 0x8fb3001c, +0xc004d71, 0x0, 0x8fbf0020, 0x8fb3001c, 0x8fb20018, 0x8fb10014, 0x8fb00010, 0x3e00008, 0x27bd0028, 0x27bdffd8, 0xafb10014, 0x808821, 0xafb20018, 0xa09021, 0xafb3001c, 0xc09821, -0xafb00010, 0x8021, 0xafbf0020, 0xc004d23, +0xafb00010, 0x8021, 0xafbf0020, 0xc004d4b, 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, -0x0, 0xc004d23, 0x2021, 0xc004d23, -0x24040001, 0xc004d23, 0x2021, 0xc004d23, +0x0, 0xc004d4b, 0x2021, 0xc004d4b, +0x24040001, 0xc004d4b, 0x2021, 0xc004d4b, 0x24040001, 0x24100010, 0x2301024, 0x10400002, -0x2021, 0x24040001, 0xc004d23, 0x108042, +0x2021, 0x24040001, 0xc004d4b, 0x108042, 0x1600fffa, 0x2301024, 0x24100010, 0x2501024, -0x10400002, 0x2021, 0x24040001, 0xc004d23, -0x108042, 0x1600fffa, 0x2501024, 0xc004d23, -0x24040001, 0xc004d23, 0x2021, 0x34108000, +0x10400002, 0x2021, 0x24040001, 0xc004d4b, +0x108042, 0x1600fffa, 0x2501024, 0xc004d4b, +0x24040001, 0xc004d4b, 0x2021, 0x34108000, 0x96620000, 0x501024, 0x10400002, 0x2021, -0x24040001, 0xc004d23, 0x108042, 0x1600fff8, -0x0, 0xc004d49, 0x0, 0x8fbf0020, +0x24040001, 0xc004d4b, 0x108042, 0x1600fff8, +0x0, 0xc004d71, 0x0, 0x8fbf0020, 0x8fb3001c, 0x8fb20018, 0x8fb10014, 0x8fb00010, -0x3e00008, 0x27bd0028, 0x3c030001, 0x8c635d60, -0x3c020001, 0x8c425da8, 0x27bdffd8, 0xafbf0020, +0x3e00008, 0x27bd0028, 0x3c030001, 0x8c635d00, +0x3c020001, 0x8c425d48, 0x27bdffd8, 0xafbf0020, 0xafb1001c, 0x10620003, 0xafb00018, 0x3c010001, -0xac235da8, 0x2463ffff, 0x2c620013, 0x10400349, -0x31080, 0x3c010001, 0x220821, 0x8c225b80, -0x400008, 0x0, 0xc004d49, 0x8021, -0x34028000, 0xa7a20010, 0x27b10010, 0xc004d23, +0xac235d48, 0x2463ffff, 0x2c620013, 0x10400349, +0x31080, 0x3c010001, 0x220821, 0x8c225b30, +0x400008, 0x0, 0xc004d71, 0x8021, +0x34028000, 0xa7a20010, 0x27b10010, 0xc004d4b, 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, -0x0, 0xc004d23, 0x2021, 0xc004d23, -0x24040001, 0xc004d23, 0x2021, 0xc004d23, +0x0, 0xc004d4b, 0x2021, 0xc004d4b, +0x24040001, 0xc004d4b, 0x2021, 0xc004d4b, 0x24040001, 0x24100010, 0x32020001, 0x10400002, -0x2021, 0x24040001, 0xc004d23, 0x108042, -0x1600fffa, 0x32020001, 0x24100010, 0xc004d23, +0x2021, 0x24040001, 0xc004d4b, 0x108042, +0x1600fffa, 0x32020001, 0x24100010, 0xc004d4b, 0x2021, 0x108042, 0x1600fffc, 0x0, -0xc004d23, 0x24040001, 0xc004d23, 0x2021, +0xc004d4b, 0x24040001, 0xc004d4b, 0x2021, 0x34108000, 0x96220000, 0x501024, 0x10400002, -0x2021, 0x24040001, 0xc004d23, 0x108042, -0x1600fff8, 0x0, 0xc004d49, 0x0, -0x8004cfc, 0x24020002, 0x27b10010, 0xa7a00010, -0x8021, 0xc004d23, 0x24040001, 0x26100001, -0x2e020020, 0x1440fffb, 0x0, 0xc004d23, -0x2021, 0xc004d23, 0x24040001, 0xc004d23, -0x24040001, 0xc004d23, 0x2021, 0x24100010, +0x2021, 0x24040001, 0xc004d4b, 0x108042, +0x1600fff8, 0x0, 0xc004d71, 0x0, +0x8004d24, 0x24020002, 0x27b10010, 0xa7a00010, +0x8021, 0xc004d4b, 0x24040001, 0x26100001, +0x2e020020, 0x1440fffb, 0x0, 0xc004d4b, +0x2021, 0xc004d4b, 0x24040001, 0xc004d4b, +0x24040001, 0xc004d4b, 0x2021, 0x24100010, 0x32020001, 0x10400002, 0x2021, 0x24040001, -0xc004d23, 0x108042, 0x1600fffa, 0x32020001, -0x24100010, 0xc004d23, 0x2021, 0x108042, -0x1600fffc, 0x0, 0xc004d49, 0x34108000, -0xc004d49, 0x0, 0xc004d03, 0x0, +0xc004d4b, 0x108042, 0x1600fffa, 0x32020001, +0x24100010, 0xc004d4b, 0x2021, 0x108042, +0x1600fffc, 0x0, 0xc004d71, 0x34108000, +0xc004d71, 0x0, 0xc004d2b, 0x0, 0x50400005, 0x108042, 0x96220000, 0x501025, 0xa6220000, 0x108042, 0x1600fff7, 0x0, -0xc004d49, 0x0, 0x97a20010, 0x30428000, -0x144002dc, 0x24020003, 0x8004cfc, 0x0, +0xc004d71, 0x0, 0x97a20010, 0x30428000, +0x144002dc, 0x24020003, 0x8004d24, 0x0, 0x24021200, 0xa7a20010, 0x27b10010, 0x8021, -0xc004d23, 0x24040001, 0x26100001, 0x2e020020, -0x1440fffb, 0x0, 0xc004d23, 0x2021, -0xc004d23, 0x24040001, 0xc004d23, 0x2021, -0xc004d23, 0x24040001, 0x24100010, 0x32020001, -0x10400002, 0x2021, 0x24040001, 0xc004d23, +0xc004d4b, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d4b, 0x2021, +0xc004d4b, 0x24040001, 0xc004d4b, 0x2021, +0xc004d4b, 0x24040001, 0x24100010, 0x32020001, +0x10400002, 0x2021, 0x24040001, 0xc004d4b, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, -0xc004d23, 0x2021, 0x108042, 0x1600fffc, -0x0, 0xc004d23, 0x24040001, 0xc004d23, +0xc004d4b, 0x2021, 0x108042, 0x1600fffc, +0x0, 0xc004d4b, 0x24040001, 0xc004d4b, 0x2021, 0x34108000, 0x96220000, 0x501024, -0x10400002, 0x2021, 0x24040001, 0xc004d23, -0x108042, 0x1600fff8, 0x0, 0xc004d49, -0x0, 0x8f830054, 0x8004cee, 0x24020004, -0x8f830054, 0x3c020001, 0x8c425e14, 0x2463ff9c, +0x10400002, 0x2021, 0x24040001, 0xc004d4b, +0x108042, 0x1600fff8, 0x0, 0xc004d71, +0x0, 0x8f830054, 0x8004d16, 0x24020004, +0x8f830054, 0x3c020001, 0x8c425db8, 0x2463ff9c, 0x431023, 0x2c420064, 0x1440029e, 0x24020002, -0x3c030001, 0x8c635e18, 0x10620297, 0x2c620003, +0x3c030001, 0x8c635dbc, 0x10620297, 0x2c620003, 0x14400296, 0x24020011, 0x24020003, 0x10620005, -0x24020004, 0x10620291, 0x2402000f, 0x8004cfc, -0x24020011, 0x8004cfc, 0x24020005, 0x24020014, -0xa7a20010, 0x27b10010, 0x8021, 0xc004d23, +0x24020004, 0x10620291, 0x2402000f, 0x8004d24, +0x24020011, 0x8004d24, 0x24020005, 0x24020014, +0xa7a20010, 0x27b10010, 0x8021, 0xc004d4b, 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, -0x0, 0xc004d23, 0x2021, 0xc004d23, -0x24040001, 0xc004d23, 0x2021, 0xc004d23, +0x0, 0xc004d4b, 0x2021, 0xc004d4b, +0x24040001, 0xc004d4b, 0x2021, 0xc004d4b, 0x24040001, 0x24100010, 0x32020001, 0x10400002, -0x2021, 0x24040001, 0xc004d23, 0x108042, +0x2021, 0x24040001, 0xc004d4b, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020012, -0x10400002, 0x2021, 0x24040001, 0xc004d23, -0x108042, 0x1600fffa, 0x32020012, 0xc004d23, -0x24040001, 0xc004d23, 0x2021, 0x34108000, +0x10400002, 0x2021, 0x24040001, 0xc004d4b, +0x108042, 0x1600fffa, 0x32020012, 0xc004d4b, +0x24040001, 0xc004d4b, 0x2021, 0x34108000, 0x96220000, 0x501024, 0x10400002, 0x2021, -0x24040001, 0xc004d23, 0x108042, 0x1600fff8, -0x0, 0xc004d49, 0x0, 0x8f830054, -0x8004cee, 0x24020006, 0x8f830054, 0x3c020001, -0x8c425e14, 0x2463ff9c, 0x431023, 0x2c420064, -0x14400250, 0x24020007, 0x8004cfc, 0x0, +0x24040001, 0xc004d4b, 0x108042, 0x1600fff8, +0x0, 0xc004d71, 0x0, 0x8f830054, +0x8004d16, 0x24020006, 0x8f830054, 0x3c020001, +0x8c425db8, 0x2463ff9c, 0x431023, 0x2c420064, +0x14400250, 0x24020007, 0x8004d24, 0x0, 0x24020006, 0xa7a20010, 0x27b10010, 0x8021, -0xc004d23, 0x24040001, 0x26100001, 0x2e020020, -0x1440fffb, 0x0, 0xc004d23, 0x2021, -0xc004d23, 0x24040001, 0xc004d23, 0x2021, -0xc004d23, 0x24040001, 0x24100010, 0x32020001, -0x10400002, 0x2021, 0x24040001, 0xc004d23, +0xc004d4b, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d4b, 0x2021, +0xc004d4b, 0x24040001, 0xc004d4b, 0x2021, +0xc004d4b, 0x24040001, 0x24100010, 0x32020001, +0x10400002, 0x2021, 0x24040001, 0xc004d4b, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020013, 0x10400002, 0x2021, 0x24040001, -0xc004d23, 0x108042, 0x1600fffa, 0x32020013, -0xc004d23, 0x24040001, 0xc004d23, 0x2021, +0xc004d4b, 0x108042, 0x1600fffa, 0x32020013, +0xc004d4b, 0x24040001, 0xc004d4b, 0x2021, 0x34108000, 0x96220000, 0x501024, 0x10400002, -0x2021, 0x24040001, 0xc004d23, 0x108042, -0x1600fff8, 0x0, 0xc004d49, 0x0, -0x8f830054, 0x8004cee, 0x24020008, 0x8f830054, -0x3c020001, 0x8c425e14, 0x2463ff9c, 0x431023, -0x2c420064, 0x1440020f, 0x24020009, 0x8004cfc, +0x2021, 0x24040001, 0xc004d4b, 0x108042, +0x1600fff8, 0x0, 0xc004d71, 0x0, +0x8f830054, 0x8004d16, 0x24020008, 0x8f830054, +0x3c020001, 0x8c425db8, 0x2463ff9c, 0x431023, +0x2c420064, 0x1440020f, 0x24020009, 0x8004d24, 0x0, 0x27b10010, 0xa7a00010, 0x8021, -0xc004d23, 0x24040001, 0x26100001, 0x2e020020, -0x1440fffb, 0x0, 0xc004d23, 0x2021, -0xc004d23, 0x24040001, 0xc004d23, 0x24040001, -0xc004d23, 0x2021, 0x24100010, 0x32020001, -0x10400002, 0x2021, 0x24040001, 0xc004d23, +0xc004d4b, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d4b, 0x2021, +0xc004d4b, 0x24040001, 0xc004d4b, 0x24040001, +0xc004d4b, 0x2021, 0x24100010, 0x32020001, +0x10400002, 0x2021, 0x24040001, 0xc004d4b, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020018, 0x10400002, 0x2021, 0x24040001, -0xc004d23, 0x108042, 0x1600fffa, 0x32020018, -0xc004d49, 0x34108000, 0xc004d49, 0x0, -0xc004d03, 0x0, 0x50400005, 0x108042, +0xc004d4b, 0x108042, 0x1600fffa, 0x32020018, +0xc004d71, 0x34108000, 0xc004d71, 0x0, +0xc004d2b, 0x0, 0x50400005, 0x108042, 0x96220000, 0x501025, 0xa6220000, 0x108042, -0x1600fff7, 0x0, 0xc004d49, 0x8021, +0x1600fff7, 0x0, 0xc004d71, 0x8021, 0x97a20010, 0x27b10010, 0x34420001, 0xa7a20010, -0xc004d23, 0x24040001, 0x26100001, 0x2e020020, -0x1440fffb, 0x0, 0xc004d23, 0x2021, -0xc004d23, 0x24040001, 0xc004d23, 0x2021, -0xc004d23, 0x24040001, 0x24100010, 0x32020001, -0x10400002, 0x2021, 0x24040001, 0xc004d23, +0xc004d4b, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d4b, 0x2021, +0xc004d4b, 0x24040001, 0xc004d4b, 0x2021, +0xc004d4b, 0x24040001, 0x24100010, 0x32020001, +0x10400002, 0x2021, 0x24040001, 0xc004d4b, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020018, 0x10400002, 0x2021, 0x24040001, -0xc004d23, 0x108042, 0x1600fffa, 0x32020018, -0xc004d23, 0x24040001, 0xc004d23, 0x2021, +0xc004d4b, 0x108042, 0x1600fffa, 0x32020018, +0xc004d4b, 0x24040001, 0xc004d4b, 0x2021, 0x34108000, 0x96220000, 0x501024, 0x10400002, -0x2021, 0x24040001, 0xc004d23, 0x108042, -0x1600fff8, 0x0, 0xc004d49, 0x0, -0x8f830054, 0x8004cee, 0x2402000a, 0x8f830054, -0x3c020001, 0x8c425e14, 0x2463ff9c, 0x431023, -0x2c420064, 0x1440019b, 0x2402000b, 0x8004cfc, +0x2021, 0x24040001, 0xc004d4b, 0x108042, +0x1600fff8, 0x0, 0xc004d71, 0x0, +0x8f830054, 0x8004d16, 0x2402000a, 0x8f830054, +0x3c020001, 0x8c425db8, 0x2463ff9c, 0x431023, +0x2c420064, 0x1440019b, 0x2402000b, 0x8004d24, 0x0, 0x27b10010, 0xa7a00010, 0x8021, -0xc004d23, 0x24040001, 0x26100001, 0x2e020020, -0x1440fffb, 0x0, 0xc004d23, 0x2021, -0xc004d23, 0x24040001, 0xc004d23, 0x24040001, -0xc004d23, 0x2021, 0x24100010, 0x32020001, -0x10400002, 0x2021, 0x24040001, 0xc004d23, +0xc004d4b, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d4b, 0x2021, +0xc004d4b, 0x24040001, 0xc004d4b, 0x24040001, +0xc004d4b, 0x2021, 0x24100010, 0x32020001, +0x10400002, 0x2021, 0x24040001, 0xc004d4b, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020017, 0x10400002, 0x2021, 0x24040001, -0xc004d23, 0x108042, 0x1600fffa, 0x32020017, -0xc004d49, 0x34108000, 0xc004d49, 0x0, -0xc004d03, 0x0, 0x50400005, 0x108042, +0xc004d4b, 0x108042, 0x1600fffa, 0x32020017, +0xc004d71, 0x34108000, 0xc004d71, 0x0, +0xc004d2b, 0x0, 0x50400005, 0x108042, 0x96220000, 0x501025, 0xa6220000, 0x108042, -0x1600fff7, 0x0, 0xc004d49, 0x8021, +0x1600fff7, 0x0, 0xc004d71, 0x8021, 0x97a20010, 0x27b10010, 0x34420700, 0xa7a20010, -0xc004d23, 0x24040001, 0x26100001, 0x2e020020, -0x1440fffb, 0x0, 0xc004d23, 0x2021, -0xc004d23, 0x24040001, 0xc004d23, 0x2021, -0xc004d23, 0x24040001, 0x24100010, 0x32020001, -0x10400002, 0x2021, 0x24040001, 0xc004d23, +0xc004d4b, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d4b, 0x2021, +0xc004d4b, 0x24040001, 0xc004d4b, 0x2021, +0xc004d4b, 0x24040001, 0x24100010, 0x32020001, +0x10400002, 0x2021, 0x24040001, 0xc004d4b, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020017, 0x10400002, 0x2021, 0x24040001, -0xc004d23, 0x108042, 0x1600fffa, 0x32020017, -0xc004d23, 0x24040001, 0xc004d23, 0x2021, +0xc004d4b, 0x108042, 0x1600fffa, 0x32020017, +0xc004d4b, 0x24040001, 0xc004d4b, 0x2021, 0x34108000, 0x96220000, 0x501024, 0x10400002, -0x2021, 0x24040001, 0xc004d23, 0x108042, -0x1600fff8, 0x0, 0xc004d49, 0x0, -0x8f830054, 0x8004cee, 0x2402000c, 0x8f830054, -0x3c020001, 0x8c425e14, 0x2463ff9c, 0x431023, -0x2c420064, 0x14400127, 0x24020012, 0x8004cfc, +0x2021, 0x24040001, 0xc004d4b, 0x108042, +0x1600fff8, 0x0, 0xc004d71, 0x0, +0x8f830054, 0x8004d16, 0x2402000c, 0x8f830054, +0x3c020001, 0x8c425db8, 0x2463ff9c, 0x431023, +0x2c420064, 0x14400127, 0x24020012, 0x8004d24, 0x0, 0x27b10010, 0xa7a00010, 0x8021, -0xc004d23, 0x24040001, 0x26100001, 0x2e020020, -0x1440fffb, 0x0, 0xc004d23, 0x2021, -0xc004d23, 0x24040001, 0xc004d23, 0x24040001, -0xc004d23, 0x2021, 0x24100010, 0x32020001, -0x10400002, 0x2021, 0x24040001, 0xc004d23, +0xc004d4b, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d4b, 0x2021, +0xc004d4b, 0x24040001, 0xc004d4b, 0x24040001, +0xc004d4b, 0x2021, 0x24100010, 0x32020001, +0x10400002, 0x2021, 0x24040001, 0xc004d4b, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020014, 0x10400002, 0x2021, 0x24040001, -0xc004d23, 0x108042, 0x1600fffa, 0x32020014, -0xc004d49, 0x34108000, 0xc004d49, 0x0, -0xc004d03, 0x0, 0x50400005, 0x108042, +0xc004d4b, 0x108042, 0x1600fffa, 0x32020014, +0xc004d71, 0x34108000, 0xc004d71, 0x0, +0xc004d2b, 0x0, 0x50400005, 0x108042, 0x96220000, 0x501025, 0xa6220000, 0x108042, -0x1600fff7, 0x0, 0xc004d49, 0x8021, +0x1600fff7, 0x0, 0xc004d71, 0x8021, 0x97a20010, 0x27b10010, 0x34420010, 0xa7a20010, -0xc004d23, 0x24040001, 0x26100001, 0x2e020020, -0x1440fffb, 0x0, 0xc004d23, 0x2021, -0xc004d23, 0x24040001, 0xc004d23, 0x2021, -0xc004d23, 0x24040001, 0x24100010, 0x32020001, -0x10400002, 0x2021, 0x24040001, 0xc004d23, +0xc004d4b, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d4b, 0x2021, +0xc004d4b, 0x24040001, 0xc004d4b, 0x2021, +0xc004d4b, 0x24040001, 0x24100010, 0x32020001, +0x10400002, 0x2021, 0x24040001, 0xc004d4b, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020014, 0x10400002, 0x2021, 0x24040001, -0xc004d23, 0x108042, 0x1600fffa, 0x32020014, -0xc004d23, 0x24040001, 0xc004d23, 0x2021, +0xc004d4b, 0x108042, 0x1600fffa, 0x32020014, +0xc004d4b, 0x24040001, 0xc004d4b, 0x2021, 0x34108000, 0x96220000, 0x501024, 0x10400002, -0x2021, 0x24040001, 0xc004d23, 0x108042, -0x1600fff8, 0x0, 0xc004d49, 0x0, -0x8f830054, 0x8004cee, 0x24020013, 0x8f830054, -0x3c020001, 0x8c425e14, 0x2463ff9c, 0x431023, -0x2c420064, 0x144000b3, 0x2402000d, 0x8004cfc, +0x2021, 0x24040001, 0xc004d4b, 0x108042, +0x1600fff8, 0x0, 0xc004d71, 0x0, +0x8f830054, 0x8004d16, 0x24020013, 0x8f830054, +0x3c020001, 0x8c425db8, 0x2463ff9c, 0x431023, +0x2c420064, 0x144000b3, 0x2402000d, 0x8004d24, 0x0, 0x27b10010, 0xa7a00010, 0x8021, -0xc004d23, 0x24040001, 0x26100001, 0x2e020020, -0x1440fffb, 0x0, 0xc004d23, 0x2021, -0xc004d23, 0x24040001, 0xc004d23, 0x24040001, -0xc004d23, 0x2021, 0x24100010, 0x32020001, -0x10400002, 0x2021, 0x24040001, 0xc004d23, +0xc004d4b, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d4b, 0x2021, +0xc004d4b, 0x24040001, 0xc004d4b, 0x24040001, +0xc004d4b, 0x2021, 0x24100010, 0x32020001, +0x10400002, 0x2021, 0x24040001, 0xc004d4b, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020018, 0x10400002, 0x2021, 0x24040001, -0xc004d23, 0x108042, 0x1600fffa, 0x32020018, -0xc004d49, 0x34108000, 0xc004d49, 0x0, -0xc004d03, 0x0, 0x50400005, 0x108042, +0xc004d4b, 0x108042, 0x1600fffa, 0x32020018, +0xc004d71, 0x34108000, 0xc004d71, 0x0, +0xc004d2b, 0x0, 0x50400005, 0x108042, 0x96220000, 0x501025, 0xa6220000, 0x108042, -0x1600fff7, 0x0, 0xc004d49, 0x8021, +0x1600fff7, 0x0, 0xc004d71, 0x8021, 0x97a20010, 0x27b10010, 0x3042fffe, 0xa7a20010, -0xc004d23, 0x24040001, 0x26100001, 0x2e020020, -0x1440fffb, 0x0, 0xc004d23, 0x2021, -0xc004d23, 0x24040001, 0xc004d23, 0x2021, -0xc004d23, 0x24040001, 0x24100010, 0x32020001, -0x10400002, 0x2021, 0x24040001, 0xc004d23, +0xc004d4b, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d4b, 0x2021, +0xc004d4b, 0x24040001, 0xc004d4b, 0x2021, +0xc004d4b, 0x24040001, 0x24100010, 0x32020001, +0x10400002, 0x2021, 0x24040001, 0xc004d4b, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020018, 0x10400002, 0x2021, 0x24040001, -0xc004d23, 0x108042, 0x1600fffa, 0x32020018, -0xc004d23, 0x24040001, 0xc004d23, 0x2021, +0xc004d4b, 0x108042, 0x1600fffa, 0x32020018, +0xc004d4b, 0x24040001, 0xc004d4b, 0x2021, 0x34108000, 0x96220000, 0x501024, 0x10400002, -0x2021, 0x24040001, 0xc004d23, 0x108042, -0x1600fff8, 0x0, 0xc004d49, 0x0, -0x8f830054, 0x8004cee, 0x2402000e, 0x24020840, -0xa7a20010, 0x27b10010, 0x8021, 0xc004d23, +0x2021, 0x24040001, 0xc004d4b, 0x108042, +0x1600fff8, 0x0, 0xc004d71, 0x0, +0x8f830054, 0x8004d16, 0x2402000e, 0x24020840, +0xa7a20010, 0x27b10010, 0x8021, 0xc004d4b, 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, -0x0, 0xc004d23, 0x2021, 0xc004d23, -0x24040001, 0xc004d23, 0x2021, 0xc004d23, +0x0, 0xc004d4b, 0x2021, 0xc004d4b, +0x24040001, 0xc004d4b, 0x2021, 0xc004d4b, 0x24040001, 0x24100010, 0x32020001, 0x10400002, -0x2021, 0x24040001, 0xc004d23, 0x108042, +0x2021, 0x24040001, 0xc004d4b, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020013, -0x10400002, 0x2021, 0x24040001, 0xc004d23, -0x108042, 0x1600fffa, 0x32020013, 0xc004d23, -0x24040001, 0xc004d23, 0x2021, 0x34108000, +0x10400002, 0x2021, 0x24040001, 0xc004d4b, +0x108042, 0x1600fffa, 0x32020013, 0xc004d4b, +0x24040001, 0xc004d4b, 0x2021, 0x34108000, 0x96220000, 0x501024, 0x10400002, 0x2021, -0x24040001, 0xc004d23, 0x108042, 0x1600fff8, -0x0, 0xc004d49, 0x0, 0x8f830054, -0x24020010, 0x3c010001, 0xac225d60, 0x3c010001, -0x8004cfe, 0xac235e14, 0x8f830054, 0x3c020001, -0x8c425e14, 0x2463ff9c, 0x431023, 0x2c420064, +0x24040001, 0xc004d4b, 0x108042, 0x1600fff8, +0x0, 0xc004d71, 0x0, 0x8f830054, +0x24020010, 0x3c010001, 0xac225d00, 0x3c010001, +0x8004d26, 0xac235db8, 0x8f830054, 0x3c020001, +0x8c425db8, 0x2463ff9c, 0x431023, 0x2c420064, 0x14400004, 0x0, 0x24020011, 0x3c010001, -0xac225d60, 0x8fbf0020, 0x8fb1001c, 0x8fb00018, +0xac225d00, 0x8fbf0020, 0x8fb1001c, 0x8fb00018, 0x3e00008, 0x27bd0028, 0x8f850044, 0x8f820044, 0x3c030001, 0x431025, 0x3c030008, 0xaf820044, -0x8f840054, 0x8f820054, 0xa32824, 0x8004d0f, +0x8f840054, 0x8f820054, 0xa32824, 0x8004d37, 0x24840001, 0x8f820054, 0x821023, 0x2c420002, 0x1440fffc, 0x0, 0x8f820044, 0x3c03fffe, 0x3463ffff, 0x431024, 0xaf820044, 0x8f830054, -0x8f820054, 0x8004d1d, 0x24630001, 0x8f820054, +0x8f820054, 0x8004d45, 0x24630001, 0x8f820054, 0x621023, 0x2c420002, 0x1440fffc, 0x0, 0x3e00008, 0xa01021, 0x8f830044, 0x3c02fff0, 0x3442ffff, 0x42480, 0x621824, 0x3c020002, 0x822025, 0x641825, 0xaf830044, 0x8f820044, 0x3c03fffe, 0x3463ffff, 0x431024, 0xaf820044, -0x8f830054, 0x8f820054, 0x8004d36, 0x24630001, +0x8f830054, 0x8f820054, 0x8004d5e, 0x24630001, 0x8f820054, 0x621023, 0x2c420002, 0x1440fffc, 0x0, 0x8f820044, 0x3c030001, 0x431025, -0xaf820044, 0x8f830054, 0x8f820054, 0x8004d43, +0xaf820044, 0x8f830054, 0x8f820054, 0x8004d6b, 0x24630001, 0x8f820054, 0x621023, 0x2c420002, 0x1440fffc, 0x0, 0x3e00008, 0x0, 0x8f820044, 0x3c03fff0, 0x3463ffff, 0x431024, 0xaf820044, 0x8f820044, 0x3c030001, 0x431025, -0xaf820044, 0x8f830054, 0x8f820054, 0x8004d57, +0xaf820044, 0x8f830054, 0x8f820054, 0x8004d7f, 0x24630001, 0x8f820054, 0x621023, 0x2c420002, 0x1440fffc, 0x0, 0x8f820044, 0x3c03fffe, 0x3463ffff, 0x431024, 0xaf820044, 0x8f830054, -0x8f820054, 0x8004d65, 0x24630001, 0x8f820054, +0x8f820054, 0x8004d8d, 0x24630001, 0x8f820054, 0x621023, 0x2c420002, 0x1440fffc, 0x0, 0x3e00008, 0x0, 0x27bdffc8, 0xafb30024, 0x809821, 0xafb5002c, 0xa0a821, 0xafb20020, 0xc09021, 0x32a2ffff, 0xafbf0030, 0xafb40028, 0xafb1001c, 0xafb00018, 0x14400034, 0xa7b20010, -0x3271ffff, 0x27b20010, 0x8021, 0xc004d23, +0x3271ffff, 0x27b20010, 0x8021, 0xc004d4b, 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, -0x0, 0xc004d23, 0x2021, 0xc004d23, -0x24040001, 0xc004d23, 0x2021, 0xc004d23, +0x0, 0xc004d4b, 0x2021, 0xc004d4b, +0x24040001, 0xc004d4b, 0x2021, 0xc004d4b, 0x24040001, 0x24100010, 0x32020001, 0x10400002, -0x2021, 0x24040001, 0xc004d23, 0x108042, +0x2021, 0x24040001, 0xc004d4b, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x2301024, -0x10400002, 0x2021, 0x24040001, 0xc004d23, -0x108042, 0x1600fffa, 0x2301024, 0xc004d23, -0x24040001, 0xc004d23, 0x2021, 0x34108000, +0x10400002, 0x2021, 0x24040001, 0xc004d4b, +0x108042, 0x1600fffa, 0x2301024, 0xc004d4b, +0x24040001, 0xc004d4b, 0x2021, 0x34108000, 0x96420000, 0x501024, 0x10400002, 0x2021, -0x24040001, 0xc004d23, 0x108042, 0x12000075, -0x0, 0x8004da1, 0x0, 0x3274ffff, -0x27b10010, 0xa7a00010, 0x8021, 0xc004d23, +0x24040001, 0xc004d4b, 0x108042, 0x12000075, +0x0, 0x8004dc9, 0x0, 0x3274ffff, +0x27b10010, 0xa7a00010, 0x8021, 0xc004d4b, 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, -0x0, 0xc004d23, 0x2021, 0xc004d23, -0x24040001, 0xc004d23, 0x24040001, 0xc004d23, +0x0, 0xc004d4b, 0x2021, 0xc004d4b, +0x24040001, 0xc004d4b, 0x24040001, 0xc004d4b, 0x2021, 0x24100010, 0x32020001, 0x10400002, -0x2021, 0x24040001, 0xc004d23, 0x108042, +0x2021, 0x24040001, 0xc004d4b, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x2901024, -0x10400002, 0x2021, 0x24040001, 0xc004d23, -0x108042, 0x1600fffa, 0x2901024, 0xc004d49, -0x34108000, 0xc004d49, 0x0, 0xc004d03, +0x10400002, 0x2021, 0x24040001, 0xc004d4b, +0x108042, 0x1600fffa, 0x2901024, 0xc004d71, +0x34108000, 0xc004d71, 0x0, 0xc004d2b, 0x0, 0x50400005, 0x108042, 0x96220000, 0x501025, 0xa6220000, 0x108042, 0x1600fff7, -0x0, 0xc004d49, 0x0, 0x32a5ffff, +0x0, 0xc004d71, 0x0, 0x32a5ffff, 0x24020001, 0x54a20004, 0x24020002, 0x97a20010, -0x8004dec, 0x521025, 0x14a20006, 0x3271ffff, +0x8004e14, 0x521025, 0x14a20006, 0x3271ffff, 0x97a20010, 0x121827, 0x431024, 0xa7a20010, -0x3271ffff, 0x27b20010, 0x8021, 0xc004d23, +0x3271ffff, 0x27b20010, 0x8021, 0xc004d4b, 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, -0x0, 0xc004d23, 0x2021, 0xc004d23, -0x24040001, 0xc004d23, 0x2021, 0xc004d23, +0x0, 0xc004d4b, 0x2021, 0xc004d4b, +0x24040001, 0xc004d4b, 0x2021, 0xc004d4b, 0x24040001, 0x24100010, 0x32020001, 0x10400002, -0x2021, 0x24040001, 0xc004d23, 0x108042, +0x2021, 0x24040001, 0xc004d4b, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x2301024, -0x10400002, 0x2021, 0x24040001, 0xc004d23, -0x108042, 0x1600fffa, 0x2301024, 0xc004d23, -0x24040001, 0xc004d23, 0x2021, 0x34108000, +0x10400002, 0x2021, 0x24040001, 0xc004d4b, +0x108042, 0x1600fffa, 0x2301024, 0xc004d4b, +0x24040001, 0xc004d4b, 0x2021, 0x34108000, 0x96420000, 0x501024, 0x10400002, 0x2021, -0x24040001, 0xc004d23, 0x108042, 0x1600fff8, -0x0, 0xc004d49, 0x0, 0x8fbf0030, +0x24040001, 0xc004d4b, 0x108042, 0x1600fff8, +0x0, 0xc004d71, 0x0, 0x8fbf0030, 0x8fb5002c, 0x8fb40028, 0x8fb30024, 0x8fb20020, 0x8fb1001c, 0x8fb00018, 0x3e00008, 0x27bd0038, 0x0, 0x0, 0x0, 0x27bdffe8, 0xafbf0010, 0x3c030001, 0x771821, 0x8c6383ac, 0x24020008, 0x1462022c, 0x803021, 0x3c020001, -0x8c425df8, 0x14400033, 0x0, 0x8f850224, +0x8c425d98, 0x14400033, 0x0, 0x8f850224, 0x38a30020, 0x2c630001, 0x38a20010, 0x2c420001, 0x621825, 0x1460000d, 0x38a30030, 0x2c630001, 0x38a20400, 0x2c420001, 0x621825, 0x14600007, 0x38a30402, 0x2c630001, 0x38a20404, 0x2c420001, 0x621825, 0x10600005, 0x0, 0xc00429b, -0x0, 0x8004e65, 0x2402000e, 0xc0043dd, -0x0, 0x3c050001, 0x8ca55d28, 0xc005276, -0x2021, 0x3c030001, 0x8c635d28, 0x24020004, -0x14620005, 0x2403fffb, 0x3c020001, 0x8c425d24, -0x8004e61, 0x2403fff7, 0x3c020001, 0x8c425d24, -0x431024, 0x3c010001, 0xac225d24, 0x2402000e, -0x3c010001, 0xc00429b, 0xac227e30, 0x800505f, +0x0, 0x8004e8d, 0x2402000e, 0xc0043dd, +0x0, 0x3c050001, 0x8ca55cc8, 0xc0052a2, +0x2021, 0x3c030001, 0x8c635cc8, 0x24020004, +0x14620005, 0x2403fffb, 0x3c020001, 0x8c425cc4, +0x8004e89, 0x2403fff7, 0x3c020001, 0x8c425cc4, +0x431024, 0x3c010001, 0xac225cc4, 0x2402000e, +0x3c010001, 0xc00429b, 0xac227dd0, 0x8005087, 0x0, 0x8f820220, 0x3c030400, 0x431024, 0x10400027, 0x2403ffbf, 0x8f850224, 0x3c020001, -0x8c427e3c, 0xa32024, 0x431024, 0x1482000c, -0x0, 0x3c020001, 0x8c427e40, 0x24420001, -0x3c010001, 0xac227e40, 0x2c420002, 0x14400008, -0x24020001, 0x3c010001, 0x8004e85, 0xac227e60, -0x3c010001, 0xac207e40, 0x3c010001, 0xac207e60, -0x3c020001, 0x8c427e60, 0x10400006, 0x30a20040, -0x10400004, 0x24020001, 0x3c010001, 0x8004e90, -0xac227e64, 0x3c010001, 0xac207e64, 0x3c010001, -0xac257e3c, 0x3c010001, 0x8004ea0, 0xac207e70, -0x24020001, 0x3c010001, 0xac227e70, 0x3c010001, -0xac207e60, 0x3c010001, 0xac207e40, 0x3c010001, -0xac207e64, 0x3c010001, 0xac207e3c, 0x3c030001, -0x8c637e30, 0x3c020001, 0x8c427e34, 0x10620003, -0x3c020200, 0x3c010001, 0xac237e34, 0xc21024, +0x8c427ddc, 0xa32024, 0x431024, 0x1482000c, +0x0, 0x3c020001, 0x8c427de0, 0x24420001, +0x3c010001, 0xac227de0, 0x2c420002, 0x14400008, +0x24020001, 0x3c010001, 0x8004ead, 0xac227e00, +0x3c010001, 0xac207de0, 0x3c010001, 0xac207e00, +0x3c020001, 0x8c427e00, 0x10400006, 0x30a20040, +0x10400004, 0x24020001, 0x3c010001, 0x8004eb8, +0xac227e04, 0x3c010001, 0xac207e04, 0x3c010001, +0xac257ddc, 0x3c010001, 0x8004ec8, 0xac207e10, +0x24020001, 0x3c010001, 0xac227e10, 0x3c010001, +0xac207e00, 0x3c010001, 0xac207de0, 0x3c010001, +0xac207e04, 0x3c010001, 0xac207ddc, 0x3c030001, +0x8c637dd0, 0x3c020001, 0x8c427dd4, 0x10620003, +0x3c020200, 0x3c010001, 0xac237dd4, 0xc21024, 0x10400007, 0x2463ffff, 0x8f820220, 0x24030001, -0x3c010001, 0xac235d2c, 0x800505d, 0x3c03f700, +0x3c010001, 0xac235ccc, 0x8005085, 0x3c03f700, 0x2c62000e, 0x104001a8, 0x31080, 0x3c010001, -0x220821, 0x8c225bd0, 0x400008, 0x0, -0x3c010001, 0xac207e60, 0x3c010001, 0xac207e40, -0x3c010001, 0xac207e3c, 0x3c010001, 0xac207e64, -0x3c010001, 0xac207e58, 0x3c010001, 0xac207e50, -0xc004844, 0xaf800224, 0x24020002, 0x3c010001, -0xac227e30, 0x3c020001, 0x8c427e70, 0x14400056, +0x220821, 0x8c225b80, 0x400008, 0x0, +0x3c010001, 0xac207e00, 0x3c010001, 0xac207de0, +0x3c010001, 0xac207ddc, 0x3c010001, 0xac207e04, +0x3c010001, 0xac207df8, 0x3c010001, 0xac207df0, +0xc00486a, 0xaf800224, 0x24020002, 0x3c010001, +0xac227dd0, 0x3c020001, 0x8c427e10, 0x14400056, 0x3c03fdff, 0x8ee20000, 0x3463ffff, 0x431024, 0xc00429b, 0xaee20000, 0xaf800204, 0x8f820200, 0x2403fffd, 0x431024, 0xaf820200, 0x3c010001, -0xac207e80, 0x8f830054, 0x3c020001, 0x8c427e58, -0x24040001, 0x3c010001, 0xac247e6c, 0x24420001, -0x3c010001, 0xac227e58, 0x2c420004, 0x3c010001, -0xac237e54, 0x14400006, 0x24020003, 0x3c010001, -0xac245d2c, 0x3c010001, 0x800505b, 0xac207e58, -0x3c010001, 0x800505b, 0xac227e30, 0x8f830054, -0x3c020001, 0x8c427e54, 0x2463d8f0, 0x431023, +0xac207e20, 0x8f830054, 0x3c020001, 0x8c427df8, +0x24040001, 0x3c010001, 0xac247e0c, 0x24420001, +0x3c010001, 0xac227df8, 0x2c420004, 0x3c010001, +0xac237df4, 0x14400006, 0x24020003, 0x3c010001, +0xac245ccc, 0x3c010001, 0x8005083, 0xac207df8, +0x3c010001, 0x8005083, 0xac227dd0, 0x8f830054, +0x3c020001, 0x8c427df4, 0x2463d8f0, 0x431023, 0x2c422710, 0x14400003, 0x24020004, 0x3c010001, -0xac227e30, 0x3c020001, 0x8c427e70, 0x14400026, +0xac227dd0, 0x3c020001, 0x8c427e10, 0x14400026, 0x3c03fdff, 0x8ee20000, 0x3463ffff, 0x431024, -0x800505b, 0xaee20000, 0x3c040001, 0x8c845dfc, -0x3c010001, 0xc005062, 0xac207e48, 0x3c020001, -0x8c427e7c, 0xaf820204, 0x3c020001, 0x8c427e70, +0x8005083, 0xaee20000, 0x3c040001, 0x8c845d9c, +0x3c010001, 0xc00508a, 0xac207de8, 0x3c020001, +0x8c427e1c, 0xaf820204, 0x3c020001, 0x8c427e10, 0x14400015, 0x3c03fdff, 0x8ee20000, 0x3463ffff, 0x431024, 0xaee20000, 0x8f820204, 0x30420030, -0x1440013c, 0x24020002, 0x3c030001, 0x8c637e7c, -0x24020005, 0x3c010001, 0xac227e30, 0x3c010001, -0x800505b, 0xac237e80, 0x3c020001, 0x8c427e70, -0x10400010, 0x3c03fdff, 0x3c020001, 0x8c425dcc, -0x24420001, 0x3c010001, 0xac225dcc, 0x2c420002, -0x14400131, 0x24020001, 0x3c010001, 0xac225dd4, -0x3c010001, 0xac205dcc, 0x3c010001, 0x800505b, -0xac225d2c, 0x8ee20000, 0x3463ffff, 0x431024, -0xaee20000, 0x3c020001, 0x8c427e60, 0x10400122, -0x0, 0x3c020001, 0x8c427e3c, 0x1040011e, -0x0, 0x3c010001, 0xac227e68, 0x24020003, -0x3c010001, 0xac227e40, 0x8004ffc, 0x24020006, -0x3c010001, 0xac207e48, 0x8f820204, 0x34420040, -0xaf820204, 0x3c020001, 0x8c427e80, 0x24030007, -0x3c010001, 0xac237e30, 0x34420040, 0x3c010001, -0xac227e80, 0x3c020001, 0x8c427e60, 0x10400005, -0x0, 0x3c020001, 0x8c427e3c, 0x104000f9, -0x24020002, 0x3c050001, 0x24a57e40, 0x8ca20000, +0x1440013c, 0x24020002, 0x3c030001, 0x8c637e1c, +0x24020005, 0x3c010001, 0xac227dd0, 0x3c010001, +0x8005083, 0xac237e20, 0x3c020001, 0x8c427e10, +0x10400010, 0x3c03fdff, 0x3c020001, 0x8c425d6c, +0x24420001, 0x3c010001, 0xac225d6c, 0x2c420002, +0x14400131, 0x24020001, 0x3c010001, 0xac225d74, +0x3c010001, 0xac205d6c, 0x3c010001, 0x8005083, +0xac225ccc, 0x8ee20000, 0x3463ffff, 0x431024, +0xaee20000, 0x3c020001, 0x8c427e00, 0x10400122, +0x0, 0x3c020001, 0x8c427ddc, 0x1040011e, +0x0, 0x3c010001, 0xac227e08, 0x24020003, +0x3c010001, 0xac227de0, 0x8005024, 0x24020006, +0x3c010001, 0xac207de8, 0x8f820204, 0x34420040, +0xaf820204, 0x3c020001, 0x8c427e20, 0x24030007, +0x3c010001, 0xac237dd0, 0x34420040, 0x3c010001, +0xac227e20, 0x3c020001, 0x8c427e00, 0x10400005, +0x0, 0x3c020001, 0x8c427ddc, 0x104000f9, +0x24020002, 0x3c050001, 0x24a57de0, 0x8ca20000, 0x2c424e21, 0x104000f3, 0x24020002, 0x3c020001, -0x8c427e64, 0x104000f8, 0x2404ffbf, 0x3c020001, -0x8c427e3c, 0x3c030001, 0x8c637e68, 0x441024, +0x8c427e04, 0x104000f8, 0x2404ffbf, 0x3c020001, +0x8c427ddc, 0x3c030001, 0x8c637e08, 0x441024, 0x641824, 0x10430004, 0x24020001, 0x3c010001, -0x800505b, 0xac227e30, 0x24020003, 0xaca20000, -0x24020008, 0x3c010001, 0xac227e30, 0x3c020001, -0x8c427e6c, 0x1040000c, 0x24020001, 0x3c040001, -0xc00506f, 0x8c847e3c, 0x3c020001, 0x8c427e88, -0x14400005, 0x24020001, 0x3c020001, 0x8c427e84, -0x10400006, 0x24020001, 0x3c010001, 0xac225d2c, -0x3c010001, 0x800505b, 0xac207e58, 0x3c020001, -0x8c427e50, 0x3c030001, 0x8c637e3c, 0x2c420001, -0x210c0, 0x30630008, 0x3c010001, 0xac227e50, -0x3c010001, 0xac237e4c, 0x8f830054, 0x24020009, -0x3c010001, 0xac227e30, 0x3c010001, 0x800505b, -0xac237e54, 0x8f830054, 0x3c020001, 0x8c427e54, +0x8005083, 0xac227dd0, 0x24020003, 0xaca20000, +0x24020008, 0x3c010001, 0xac227dd0, 0x3c020001, +0x8c427e0c, 0x1040000c, 0x24020001, 0x3c040001, +0xc005097, 0x8c847ddc, 0x3c020001, 0x8c427e28, +0x14400005, 0x24020001, 0x3c020001, 0x8c427e24, +0x10400006, 0x24020001, 0x3c010001, 0xac225ccc, +0x3c010001, 0x8005083, 0xac207df8, 0x3c020001, +0x8c427df0, 0x3c030001, 0x8c637ddc, 0x2c420001, +0x210c0, 0x30630008, 0x3c010001, 0xac227df0, +0x3c010001, 0xac237dec, 0x8f830054, 0x24020009, +0x3c010001, 0xac227dd0, 0x3c010001, 0x8005083, +0xac237df4, 0x8f830054, 0x3c020001, 0x8c427df4, 0x2463d8f0, 0x431023, 0x2c422710, 0x144000a8, -0x0, 0x3c020001, 0x8c427e60, 0x10400005, -0x0, 0x3c020001, 0x8c427e3c, 0x104000a9, -0x24020002, 0x3c030001, 0x24637e40, 0x8c620000, +0x0, 0x3c020001, 0x8c427e00, 0x10400005, +0x0, 0x3c020001, 0x8c427ddc, 0x104000a9, +0x24020002, 0x3c030001, 0x24637de0, 0x8c620000, 0x2c424e21, 0x104000a3, 0x24020002, 0x3c020001, -0x8c427e6c, 0x1040000e, 0x0, 0x3c020001, -0x8c427e3c, 0x3c010001, 0xac207e6c, 0x30420080, +0x8c427e0c, 0x1040000e, 0x0, 0x3c020001, +0x8c427ddc, 0x3c010001, 0xac207e0c, 0x30420080, 0x1040002f, 0x2402000c, 0x8f820204, 0x30420080, -0x1440000c, 0x24020003, 0x8004fe9, 0x2402000c, -0x3c020001, 0x8c427e3c, 0x30420080, 0x14400005, +0x1440000c, 0x24020003, 0x8005011, 0x2402000c, +0x3c020001, 0x8c427ddc, 0x30420080, 0x14400005, 0x24020003, 0x8f820204, 0x30420080, 0x1040001f, 0x24020003, 0xac620000, 0x2402000a, 0x3c010001, -0xac227e30, 0x3c040001, 0x24847e78, 0x8c820000, -0x3c030001, 0x8c637e50, 0x431025, 0xaf820204, -0x8c830000, 0x3c040001, 0x8c847e50, 0x2402000b, -0x3c010001, 0xac227e30, 0x641825, 0x3c010001, -0xac237e80, 0x3c050001, 0x24a57e40, 0x8ca20000, +0xac227dd0, 0x3c040001, 0x24847e18, 0x8c820000, +0x3c030001, 0x8c637df0, 0x431025, 0xaf820204, +0x8c830000, 0x3c040001, 0x8c847df0, 0x2402000b, +0x3c010001, 0xac227dd0, 0x641825, 0x3c010001, +0xac237e20, 0x3c050001, 0x24a57de0, 0x8ca20000, 0x2c424e21, 0x1040006f, 0x24020002, 0x3c020001, -0x8c427e70, 0x10400005, 0x0, 0x2402000c, -0x3c010001, 0x800505b, 0xac227e30, 0x3c020001, -0x8c427e60, 0x1040006c, 0x0, 0x3c040001, -0x8c847e3c, 0x1080005e, 0x30820008, 0x3c030001, -0x8c637e4c, 0x10620064, 0x24020003, 0x3c010001, -0xac247e68, 0xaca20000, 0x24020006, 0x3c010001, -0x800505b, 0xac227e30, 0x8f820200, 0x34420002, +0x8c427e10, 0x10400005, 0x0, 0x2402000c, +0x3c010001, 0x8005083, 0xac227dd0, 0x3c020001, +0x8c427e00, 0x1040006c, 0x0, 0x3c040001, +0x8c847ddc, 0x1080005e, 0x30820008, 0x3c030001, +0x8c637dec, 0x10620064, 0x24020003, 0x3c010001, +0xac247e08, 0xaca20000, 0x24020006, 0x3c010001, +0x8005083, 0xac227dd0, 0x8f820200, 0x34420002, 0xaf820200, 0x8f830054, 0x2402000d, 0x3c010001, -0xac227e30, 0x3c010001, 0xac237e54, 0x8f830054, -0x3c020001, 0x8c427e54, 0x2463d8f0, 0x431023, +0xac227dd0, 0x3c010001, 0xac237df4, 0x8f830054, +0x3c020001, 0x8c427df4, 0x2463d8f0, 0x431023, 0x2c422710, 0x1440003a, 0x0, 0x3c020001, -0x8c427e70, 0x10400029, 0x2402000e, 0x3c030001, -0x8c637e84, 0x3c010001, 0x14600015, 0xac227e30, -0xc0043dd, 0x0, 0x3c050001, 0x8ca55d28, -0xc005276, 0x2021, 0x3c030001, 0x8c635d28, +0x8c427e10, 0x10400029, 0x2402000e, 0x3c030001, +0x8c637e24, 0x3c010001, 0x14600015, 0xac227dd0, +0xc0043dd, 0x0, 0x3c050001, 0x8ca55cc8, +0xc0052a2, 0x2021, 0x3c030001, 0x8c635cc8, 0x24020004, 0x14620005, 0x2403fffb, 0x3c020001, -0x8c425d24, 0x800502a, 0x2403fff7, 0x3c020001, -0x8c425d24, 0x431024, 0x3c010001, 0xac225d24, +0x8c425cc4, 0x8005052, 0x2403fff7, 0x3c020001, +0x8c425cc4, 0x431024, 0x3c010001, 0xac225cc4, 0x8ee20000, 0x3c030200, 0x431025, 0xaee20000, -0x8f820224, 0x3c010001, 0xac227e8c, 0x8f820220, +0x8f820224, 0x3c010001, 0xac227e2c, 0x8f820220, 0x2403fffb, 0x431024, 0xaf820220, 0x8f820220, -0x34420002, 0x800505b, 0xaf820220, 0x3c020001, -0x8c427e60, 0x10400005, 0x0, 0x3c020001, -0x8c427e3c, 0x1040000f, 0x24020002, 0x3c020001, -0x8c427e40, 0x2c424e21, 0x1040000a, 0x24020002, -0x3c020001, 0x8c427e60, 0x1040000f, 0x0, -0x3c020001, 0x8c427e3c, 0x1440000b, 0x0, -0x24020002, 0x3c010001, 0x800505b, 0xac227e30, -0x3c020001, 0x8c427e60, 0x10400003, 0x0, +0x34420002, 0x8005083, 0xaf820220, 0x3c020001, +0x8c427e00, 0x10400005, 0x0, 0x3c020001, +0x8c427ddc, 0x1040000f, 0x24020002, 0x3c020001, +0x8c427de0, 0x2c424e21, 0x1040000a, 0x24020002, +0x3c020001, 0x8c427e00, 0x1040000f, 0x0, +0x3c020001, 0x8c427ddc, 0x1440000b, 0x0, +0x24020002, 0x3c010001, 0x8005083, 0xac227dd0, +0x3c020001, 0x8c427e00, 0x10400003, 0x0, 0xc00429b, 0x0, 0x8f820220, 0x3c03f700, 0x431025, 0xaf820220, 0x8fbf0010, 0x3e00008, -0x27bd0018, 0x3c030001, 0x24637e88, 0x8c620000, -0x10400005, 0x34422000, 0x3c010001, 0xac227e7c, -0x800506d, 0xac600000, 0x3c010001, 0xac247e7c, +0x27bd0018, 0x3c030001, 0x24637e28, 0x8c620000, +0x10400005, 0x34422000, 0x3c010001, 0xac227e1c, +0x8005095, 0xac600000, 0x3c010001, 0xac247e1c, 0x3e00008, 0x0, 0x27bdffe0, 0x30820030, -0xafbf0018, 0x3c010001, 0xac227e84, 0x14400067, +0xafbf0018, 0x3c010001, 0xac227e24, 0x14400067, 0x3c02ffff, 0x34421f0e, 0x821024, 0x14400061, 0x24020030, 0x30822000, 0x1040005d, 0x30838000, 0x31a02, 0x30820001, 0x21200, 0x3c040001, -0x8c845dfc, 0x621825, 0x331c2, 0x3c030001, -0x24635dd8, 0x30828000, 0x21202, 0x30840001, +0x8c845d9c, 0x621825, 0x331c2, 0x3c030001, +0x24635d78, 0x30828000, 0x21202, 0x30840001, 0x42200, 0x441025, 0x239c2, 0x61080, 0x431021, 0x471021, 0x90430000, 0x24020001, 0x10620025, 0x0, 0x10600007, 0x24020002, 0x10620013, 0x24020003, 0x1062002c, 0x3c05000f, -0x80050d1, 0x0, 0x8f820200, 0x2403feff, +0x80050f9, 0x0, 0x8f820200, 0x2403feff, 0x431024, 0xaf820200, 0x8f820220, 0x3c03fffe, 0x3463ffff, 0x431024, 0xaf820220, 0x3c010001, -0xac207ea4, 0x3c010001, 0x80050dc, 0xac207eac, +0xac207e44, 0x3c010001, 0x8005104, 0xac207e4c, 0x8f820200, 0x34420100, 0xaf820200, 0x8f820220, 0x3c03fffe, 0x3463ffff, 0x431024, 0xaf820220, -0x24020100, 0x3c010001, 0xac227ea4, 0x3c010001, -0x80050dc, 0xac207eac, 0x8f820200, 0x2403feff, +0x24020100, 0x3c010001, 0xac227e44, 0x3c010001, +0x8005104, 0xac207e4c, 0x8f820200, 0x2403feff, 0x431024, 0xaf820200, 0x8f820220, 0x3c030001, -0x431025, 0xaf820220, 0x3c010001, 0xac207ea4, -0x3c010001, 0x80050dc, 0xac237eac, 0x8f820200, +0x431025, 0xaf820220, 0x3c010001, 0xac207e44, +0x3c010001, 0x8005104, 0xac237e4c, 0x8f820200, 0x34420100, 0xaf820200, 0x8f820220, 0x3c030001, 0x431025, 0xaf820220, 0x24020100, 0x3c010001, -0xac227ea4, 0x3c010001, 0x80050dc, 0xac237eac, -0x34a5ffff, 0x3c040001, 0x24845c08, 0xafa30010, -0xc002403, 0xafa00014, 0x80050dc, 0x0, -0x24020030, 0x3c010001, 0xac227e88, 0x8fbf0018, +0xac227e44, 0x3c010001, 0x8005104, 0xac237e4c, +0x34a5ffff, 0x3c040001, 0x24845bb8, 0xafa30010, +0xc002403, 0xafa00014, 0x8005104, 0x0, +0x24020030, 0x3c010001, 0xac227e28, 0x8fbf0018, 0x3e00008, 0x27bd0020, 0x0, 0x27bdffc8, 0xafb20028, 0x809021, 0xafb3002c, 0xa09821, -0xafb00020, 0xc08021, 0x3c040001, 0x24845c20, -0x3c050009, 0x3c020001, 0x8c425d28, 0x34a59001, +0xafb00020, 0xc08021, 0x3c040001, 0x24845bd0, +0x3c050009, 0x3c020001, 0x8c425cc8, 0x34a59001, 0x2403021, 0x2603821, 0xafbf0030, 0xafb10024, 0xa7a0001a, 0xafb00014, 0xc002403, 0xafa20010, -0x24020002, 0x1262007f, 0x2e620003, 0x10400005, -0x24020001, 0x1262000a, 0x0, 0x800526f, -0x0, 0x24020004, 0x126200f6, 0x24020008, -0x126200f5, 0x3c02ffec, 0x800526f, 0x0, -0x3c020001, 0x8c425d24, 0x30420002, 0x14400004, +0x24020002, 0x12620083, 0x2e620003, 0x10400005, +0x24020001, 0x1262000a, 0x0, 0x800529b, +0x0, 0x24020004, 0x126200fa, 0x24020008, +0x126200f9, 0x3c02ffec, 0x800529b, 0x0, +0x3c020001, 0x8c425cc4, 0x30420002, 0x14400004, 0x128940, 0x3c02fffb, 0x3442ffff, 0x2028024, -0x3c010001, 0x310821, 0xac307e9c, 0x3c024000, -0x2021024, 0x1040004a, 0x1023c2, 0x30840030, -0x101382, 0x3042001c, 0x3c030001, 0x24635d68, +0x3c010001, 0x310821, 0xac307e3c, 0x3c024000, +0x2021024, 0x1040004e, 0x1023c2, 0x30840030, +0x101382, 0x3042001c, 0x3c030001, 0x24635d08, 0x431021, 0x823821, 0x3c020020, 0x2021024, 0x10400006, 0x24020100, 0x3c010001, 0x310821, -0xac227ea0, 0x8005128, 0x3c020080, 0x3c010001, -0x310821, 0xac207ea0, 0x3c020080, 0x2021024, +0xac227e40, 0x8005150, 0x3c020080, 0x3c010001, +0x310821, 0xac207e40, 0x3c020080, 0x2021024, 0x10400006, 0x121940, 0x3c020001, 0x3c010001, -0x230821, 0x8005134, 0xac227ea8, 0x121140, -0x3c010001, 0x220821, 0xac207ea8, 0x94e30000, -0x32024000, 0x10400003, 0xa7a30018, 0x34624000, +0x230821, 0x800515c, 0xac227e48, 0x121140, +0x3c010001, 0x220821, 0xac207e48, 0x94e40000, +0x3c030001, 0x8c635dbc, 0x24020005, 0x10620010, +0xa7a40018, 0x32024000, 0x10400002, 0x34824000, 0xa7a20018, 0x24040001, 0x94e20002, 0x24050004, -0x24e60002, 0x34420001, 0xc004966, 0xa4e20002, -0x24040001, 0x2821, 0xc004966, 0x27a60018, -0x3c020001, 0x8c425d28, 0x24110001, 0x3c010001, -0xac315d34, 0x14530004, 0x32028000, 0xc00429b, +0x24e60002, 0x34420001, 0xc00498e, 0xa4e20002, +0x24040001, 0x2821, 0xc00498e, 0x27a60018, +0x3c020001, 0x8c425cc8, 0x24110001, 0x3c010001, +0xac315cd4, 0x14530004, 0x32028000, 0xc00429b, 0x0, 0x32028000, 0x1040011f, 0x0, -0xc00429b, 0x0, 0x3c030001, 0x8c635e18, +0xc00429b, 0x0, 0x3c030001, 0x8c635dbc, 0x24020005, 0x10620118, 0x24020002, 0x3c010001, -0xac315d2c, 0x3c010001, 0x800526f, 0xac225d28, -0x24040001, 0x24050004, 0x27b0001a, 0xc004966, -0x2003021, 0x24040001, 0x2821, 0xc004966, -0x2003021, 0x3c020001, 0x511021, 0x8c427e94, -0x3c040001, 0x8c845d28, 0x3c03bfff, 0x3463ffff, -0x3c010001, 0xac335d34, 0x431024, 0x3c010001, -0x310821, 0x109300fa, 0xac227e94, 0x800526f, +0xac315ccc, 0x3c010001, 0x800529b, 0xac225cc8, +0x24040001, 0x24050004, 0x27b0001a, 0xc00498e, +0x2003021, 0x24040001, 0x2821, 0xc00498e, +0x2003021, 0x3c020001, 0x511021, 0x8c427e34, +0x3c040001, 0x8c845cc8, 0x3c03bfff, 0x3463ffff, +0x3c010001, 0xac335cd4, 0x431024, 0x3c010001, +0x310821, 0x109300fa, 0xac227e34, 0x800529b, 0x0, 0x3c022000, 0x2021024, 0x10400005, -0x24020001, 0x3c010001, 0xac225df8, 0x8005181, -0x128940, 0x3c010001, 0xac205df8, 0x128940, -0x3c010001, 0x310821, 0xac307e98, 0x3c024000, +0x24020001, 0x3c010001, 0xac225d98, 0x80051ad, +0x128940, 0x3c010001, 0xac205d98, 0x128940, +0x3c010001, 0x310821, 0xac307e38, 0x3c024000, 0x2021024, 0x14400016, 0x0, 0x3c020001, -0x8c425df8, 0x10400008, 0x24040004, 0x24050001, -0xc004d6b, 0x24062000, 0x24020001, 0x3c010001, +0x8c425d98, 0x10400008, 0x24040004, 0x24050001, +0xc004d93, 0x24062000, 0x24020001, 0x3c010001, 0x370821, 0xac2283ac, 0x3c020001, 0x511021, -0x8c427e90, 0x3c03bfff, 0x3463ffff, 0x431024, -0x3c010001, 0x310821, 0x800526d, 0xac227e90, -0x3c020001, 0x8c425df8, 0x10400028, 0x3c0300a0, +0x8c427e30, 0x3c03bfff, 0x3463ffff, 0x431024, +0x3c010001, 0x310821, 0x8005299, 0xac227e30, +0x3c020001, 0x8c425d98, 0x10400028, 0x3c0300a0, 0x2031024, 0x5443000d, 0x3c020020, 0x3c020001, -0x8c425dfc, 0x24030100, 0x3c010001, 0x310821, -0xac237ea4, 0x3c030001, 0x3c010001, 0x310821, -0xac237eac, 0x80051c4, 0x34420400, 0x2021024, -0x10400008, 0x24030100, 0x3c020001, 0x8c425dfc, -0x3c010001, 0x310821, 0xac237ea4, 0x80051c4, +0x8c425d9c, 0x24030100, 0x3c010001, 0x310821, +0xac237e44, 0x3c030001, 0x3c010001, 0x310821, +0xac237e4c, 0x80051f0, 0x34420400, 0x2021024, +0x10400008, 0x24030100, 0x3c020001, 0x8c425d9c, +0x3c010001, 0x310821, 0xac237e44, 0x80051f0, 0x34420800, 0x3c020080, 0x2021024, 0x1040002e, -0x3c030001, 0x3c020001, 0x8c425dfc, 0x3c010001, -0x310821, 0xac237eac, 0x34420c00, 0x3c010001, -0xac225dfc, 0x80051ec, 0x24040001, 0x3c020020, +0x3c030001, 0x3c020001, 0x8c425d9c, 0x3c010001, +0x310821, 0xac237e4c, 0x34420c00, 0x3c010001, +0xac225d9c, 0x8005218, 0x24040001, 0x3c020020, 0x2021024, 0x10400006, 0x24020100, 0x3c010001, -0x310821, 0xac227ea4, 0x80051d5, 0x3c020080, -0x3c010001, 0x310821, 0xac207ea4, 0x3c020080, +0x310821, 0xac227e44, 0x8005201, 0x3c020080, +0x3c010001, 0x310821, 0xac207e44, 0x3c020080, 0x2021024, 0x10400007, 0x121940, 0x3c020001, -0x3c010001, 0x230821, 0xac227eac, 0x80051e3, +0x3c010001, 0x230821, 0xac227e4c, 0x800520f, 0x24040001, 0x121140, 0x3c010001, 0x220821, -0xac207eac, 0x24040001, 0x2821, 0x27b0001e, -0xc004924, 0x2003021, 0x24040001, 0x2821, -0xc004924, 0x2003021, 0x24040001, 0x24050001, -0x27b0001c, 0xc004924, 0x2003021, 0x24040001, -0x24050001, 0xc004924, 0x2003021, 0x800526d, +0xac207e4c, 0x24040001, 0x2821, 0x27b0001e, +0xc00494c, 0x2003021, 0x24040001, 0x2821, +0xc00494c, 0x2003021, 0x24040001, 0x24050001, +0x27b0001c, 0xc00494c, 0x2003021, 0x24040001, +0x24050001, 0xc00494c, 0x2003021, 0x8005299, 0x0, 0x3c02ffec, 0x3442ffff, 0x2028024, 0x3c020008, 0x2028025, 0x121140, 0x3c010001, -0x220821, 0xac307e98, 0x3c022000, 0x2021024, -0x10400009, 0x0, 0x3c020001, 0x8c425dd4, -0x14400005, 0x24020001, 0x3c010001, 0xac225df8, -0x800520e, 0x3c024000, 0x3c010001, 0xac205df8, +0x220821, 0xac307e38, 0x3c022000, 0x2021024, +0x10400009, 0x0, 0x3c020001, 0x8c425d74, +0x14400005, 0x24020001, 0x3c010001, 0xac225d98, +0x800523a, 0x3c024000, 0x3c010001, 0xac205d98, 0x3c024000, 0x2021024, 0x1440001e, 0x0, -0x3c020001, 0x8c425df8, 0x3c010001, 0xac205d40, -0x10400007, 0x24022020, 0x3c010001, 0xac225dfc, +0x3c020001, 0x8c425d98, 0x3c010001, 0xac205ce0, +0x10400007, 0x24022020, 0x3c010001, 0xac225d9c, 0x24020001, 0x3c010001, 0x370821, 0xac2283ac, 0x3c04bfff, 0x121940, 0x3c020001, 0x431021, -0x8c427e90, 0x3c050001, 0x8ca55d28, 0x3484ffff, -0x441024, 0x3c010001, 0x230821, 0xac227e90, -0x24020001, 0x10a20044, 0x0, 0x800526d, -0x0, 0x3c020001, 0x8c425df8, 0x1040001c, -0x24022000, 0x3c010001, 0xac225dfc, 0x3c0300a0, +0x8c427e30, 0x3c050001, 0x8ca55cc8, 0x3484ffff, +0x441024, 0x3c010001, 0x230821, 0xac227e30, +0x24020001, 0x10a20044, 0x0, 0x8005299, +0x0, 0x3c020001, 0x8c425d98, 0x1040001c, +0x24022000, 0x3c010001, 0xac225d9c, 0x3c0300a0, 0x2031024, 0x14430005, 0x121140, 0x3402a000, -0x3c010001, 0x8005268, 0xac225dfc, 0x3c030001, -0x621821, 0x8c637e98, 0x3c020020, 0x621024, -0x10400004, 0x24022001, 0x3c010001, 0x8005268, -0xac225dfc, 0x3c020080, 0x621024, 0x1040001f, -0x3402a001, 0x3c010001, 0x8005268, 0xac225dfc, +0x3c010001, 0x8005294, 0xac225d9c, 0x3c030001, +0x621821, 0x8c637e38, 0x3c020020, 0x621024, +0x10400004, 0x24022001, 0x3c010001, 0x8005294, +0xac225d9c, 0x3c020080, 0x621024, 0x1040001f, +0x3402a001, 0x3c010001, 0x8005294, 0xac225d9c, 0x3c020020, 0x2021024, 0x10400007, 0x121940, -0x24020100, 0x3c010001, 0x230821, 0xac227ea4, -0x800525c, 0x3c020080, 0x121140, 0x3c010001, -0x220821, 0xac207ea4, 0x3c020080, 0x2021024, +0x24020100, 0x3c010001, 0x230821, 0xac227e44, +0x8005288, 0x3c020080, 0x121140, 0x3c010001, +0x220821, 0xac207e44, 0x3c020080, 0x2021024, 0x10400006, 0x121940, 0x3c020001, 0x3c010001, -0x230821, 0x8005268, 0xac227eac, 0x121140, -0x3c010001, 0x220821, 0xac207eac, 0x3c030001, -0x8c635d28, 0x24020001, 0x10620003, 0x0, +0x230821, 0x8005294, 0xac227e4c, 0x121140, +0x3c010001, 0x220821, 0xac207e4c, 0x3c030001, +0x8c635cc8, 0x24020001, 0x10620003, 0x0, 0xc00429b, 0x0, 0x8fbf0030, 0x8fb3002c, 0x8fb20028, 0x8fb10024, 0x8fb00020, 0x3e00008, -0x27bd0038, 0x27bdffc0, 0xafb40038, 0x80a021, -0xafb20030, 0x9021, 0xafb1002c, 0x8821, -0x24020002, 0xafbf003c, 0xafb30034, 0xafb00028, -0xa7a00020, 0xa7a00018, 0xa7a0001a, 0xa7a0001c, -0x10a20108, 0xa7a0001e, 0x2ca20003, 0x10400005, -0x24020001, 0x10a2000a, 0x149940, 0x800538f, -0x2201021, 0x24020004, 0x10a200b2, 0x24020008, -0x10a200b1, 0x142940, 0x800538f, 0x2201021, -0x3c030001, 0x731821, 0x8c637e9c, 0x3c024000, -0x621024, 0x14400009, 0x24040001, 0x3c027fff, -0x3442ffff, 0x628824, 0x3c010001, 0x330821, -0xac317e94, 0x800538f, 0x2201021, 0x2821, -0xc004924, 0x27a60018, 0x24040001, 0x2821, -0xc004924, 0x27a60018, 0x24040001, 0x24050001, -0x27b0001a, 0xc004924, 0x2003021, 0x24040001, -0x24050001, 0xc004924, 0x2003021, 0x24040001, -0x24050004, 0x27b0001c, 0xc004924, 0x2003021, -0x24040001, 0x24050004, 0xc004924, 0x2003021, -0x24040001, 0x24050005, 0x27b0001e, 0xc004924, -0x2003021, 0x24040001, 0x24050005, 0xc004924, -0x2003021, 0x24040001, 0x24050009, 0xc004924, -0x2003021, 0x24040001, 0x24050009, 0xc004924, -0x2003021, 0x24040001, 0x24050001, 0xc004924, -0x27a60018, 0x24040001, 0x24050001, 0xc004924, -0x27a60018, 0x97a20018, 0x30420004, 0x10400034, -0x3c114000, 0x3c020001, 0x8c425e18, 0x2443ffff, -0x2c620006, 0x10400034, 0x31080, 0x3c010001, -0x220821, 0x8c225c38, 0x400008, 0x0, -0x24040001, 0x24050011, 0x27b00020, 0xc004924, -0x2003021, 0x24040001, 0x24050011, 0xc004924, -0x2003021, 0x97a40020, 0x30824000, 0x10400002, -0x3c030010, 0x3c030008, 0x3c120001, 0x8005306, -0x30828000, 0x24040001, 0x24050014, 0x27b00020, -0xc004924, 0x2003021, 0x24040001, 0x24050014, -0xc004924, 0x2003021, 0x97a40020, 0x30821000, -0x10400002, 0x3c030010, 0x3c030008, 0x3c120001, -0x30820800, 0x54400001, 0x3c120002, 0x3c028000, -0x2221025, 0x2431825, 0x8005313, 0x438825, -0x3c110001, 0x2338821, 0x8e317e9c, 0x3c027fff, -0x3442ffff, 0x2228824, 0x3c020001, 0x8c425d38, -0x1040001c, 0x0, 0x3c020001, 0x8c425df8, -0x10400002, 0x3c022000, 0x2228825, 0x141140, -0x3c010001, 0x220821, 0x8c227ea0, 0x10400003, -0x3c020020, 0x8005327, 0x2228825, 0x3c02ffdf, -0x3442ffff, 0x2228824, 0x141140, 0x3c010001, -0x220821, 0x8c227ea8, 0x10400003, 0x3c020080, -0x8005332, 0x2228825, 0x3c02ff7f, 0x3442ffff, -0x2228824, 0x3c040001, 0x24845c2c, 0x3c05000c, -0x34a50326, 0x3c070001, 0x8ce75d28, 0x3021, -0x141140, 0x3c010001, 0x220821, 0xac317e94, -0xafb20010, 0xc002403, 0xafb10014, 0x800538f, -0x2201021, 0x142940, 0x3c030001, 0x651821, -0x8c637e98, 0x3c024000, 0x621024, 0x14400008, -0x3c027fff, 0x3442ffff, 0x628824, 0x3c010001, -0x250821, 0xac317e90, 0x800538f, 0x2201021, -0x3c020001, 0x8c425d38, 0x10400033, 0x3c11c00c, -0x3c020001, 0x8c425dd4, 0x3c04c00c, 0x34842000, -0x3c030001, 0x8c635df8, 0x2102b, 0x21023, -0x441024, 0x10600003, 0x518825, 0x3c022000, -0x2228825, 0x3c020001, 0x451021, 0x8c427ea4, -0x10400003, 0x3c020020, 0x800536c, 0x2228825, -0x3c02ffdf, 0x3442ffff, 0x2228824, 0x141140, -0x3c010001, 0x220821, 0x8c227eac, 0x10400003, -0x3c020080, 0x8005377, 0x2228825, 0x3c02ff7f, -0x3442ffff, 0x2228824, 0x3c020001, 0x8c425dc0, -0x10400002, 0x3c020800, 0x2228825, 0x3c020001, -0x8c425dc4, 0x10400002, 0x3c020400, 0x2228825, -0x3c020001, 0x8c425dc8, 0x10400006, 0x3c020100, -0x800538a, 0x2228825, 0x3c027fff, 0x3442ffff, -0x628824, 0x141140, 0x3c010001, 0x220821, -0xac317e90, 0x2201021, 0x8fbf003c, 0x8fb40038, -0x8fb30034, 0x8fb20030, 0x8fb1002c, 0x8fb00028, -0x3e00008, 0x27bd0040, 0x27bdffd8, 0xafb40020, -0x80a021, 0xafbf0024, 0xafb3001c, 0xafb20018, -0xafb10014, 0xafb00010, 0x8f900200, 0x3c030001, -0x8c635d28, 0x8f930220, 0x24020002, 0x10620063, -0x2c620003, 0x10400005, 0x24020001, 0x1062000a, -0x141940, 0x8005459, 0x0, 0x24020004, -0x1062005a, 0x24020008, 0x10620059, 0x149140, -0x8005459, 0x0, 0x3c040001, 0x832021, -0x8c847e9c, 0x3c110001, 0x2238821, 0x8e317e94, -0x3c024000, 0x821024, 0x1040003e, 0x3c020008, -0x2221024, 0x10400020, 0x36100002, 0x3c020001, -0x431021, 0x8c427ea0, 0x10400005, 0x36100020, -0x36100100, 0x3c020020, 0x80053ce, 0x2228825, -0x2402feff, 0x2028024, 0x3c02ffdf, 0x3442ffff, +0x27bd0038, 0x27bdffd8, 0xafb20020, 0x809021, +0xafb1001c, 0x8821, 0x24020002, 0xafbf0024, +0xafb00018, 0xa7a00012, 0x10a200d3, 0xa7a00010, +0x2ca20003, 0x10400005, 0x24020001, 0x10a2000a, +0x128140, 0x8005380, 0x2201021, 0x24020004, +0x10a2007d, 0x24020008, 0x10a2007c, 0x122940, +0x8005380, 0x2201021, 0x3c030001, 0x701821, +0x8c637e3c, 0x3c024000, 0x621024, 0x14400009, +0x24040001, 0x3c027fff, 0x3442ffff, 0x628824, +0x3c010001, 0x300821, 0xac317e34, 0x8005380, +0x2201021, 0x24050001, 0xc00494c, 0x27a60010, +0x24040001, 0x24050001, 0xc00494c, 0x27a60010, +0x97a20010, 0x30420004, 0x10400034, 0x3c114000, +0x3c020001, 0x8c425dbc, 0x2443ffff, 0x2c620006, +0x10400034, 0x31080, 0x3c010001, 0x220821, +0x8c225be0, 0x400008, 0x0, 0x24040001, +0x24050011, 0x27b00012, 0xc00494c, 0x2003021, +0x24040001, 0x24050011, 0xc00494c, 0x2003021, +0x97a50012, 0x30a24000, 0x10400002, 0x3c040010, +0x3c040008, 0x3c030001, 0x8005301, 0x30a28000, +0x24040001, 0x24050014, 0x27b00012, 0xc00494c, +0x2003021, 0x24040001, 0x24050014, 0xc00494c, +0x2003021, 0x97a50012, 0x30a21000, 0x10400002, +0x3c040010, 0x3c040008, 0x3c030001, 0x30a20800, +0x54400001, 0x3c030002, 0x3c028000, 0x2221025, +0x641825, 0x800530e, 0x438825, 0x3c110001, +0x2308821, 0x8e317e3c, 0x3c027fff, 0x3442ffff, +0x2228824, 0x3c020001, 0x8c425cd8, 0x1040001d, +0x121140, 0x3c020001, 0x8c425d98, 0x10400002, +0x3c022000, 0x2228825, 0x121140, 0x3c010001, +0x220821, 0x8c227e40, 0x10400003, 0x3c020020, +0x8005322, 0x2228825, 0x3c02ffdf, 0x3442ffff, +0x2228824, 0x121140, 0x3c010001, 0x220821, +0x8c227e48, 0x10400003, 0x3c020080, 0x800532d, +0x2228825, 0x3c02ff7f, 0x3442ffff, 0x2228824, +0x121140, 0x3c010001, 0x220821, 0xac317e34, +0x8005380, 0x2201021, 0x122940, 0x3c030001, +0x651821, 0x8c637e38, 0x3c024000, 0x621024, +0x14400008, 0x3c027fff, 0x3442ffff, 0x628824, +0x3c010001, 0x250821, 0xac317e30, 0x8005380, +0x2201021, 0x3c020001, 0x8c425cd8, 0x10400033, +0x3c11c00c, 0x3c020001, 0x8c425d74, 0x3c04c00c, +0x34842000, 0x3c030001, 0x8c635d98, 0x2102b, +0x21023, 0x441024, 0x10600003, 0x518825, +0x3c022000, 0x2228825, 0x3c020001, 0x451021, +0x8c427e44, 0x10400003, 0x3c020020, 0x800535d, +0x2228825, 0x3c02ffdf, 0x3442ffff, 0x2228824, +0x121140, 0x3c010001, 0x220821, 0x8c227e4c, +0x10400003, 0x3c020080, 0x8005368, 0x2228825, +0x3c02ff7f, 0x3442ffff, 0x2228824, 0x3c020001, +0x8c425d60, 0x10400002, 0x3c020800, 0x2228825, +0x3c020001, 0x8c425d64, 0x10400002, 0x3c020400, +0x2228825, 0x3c020001, 0x8c425d68, 0x10400006, +0x3c020100, 0x800537b, 0x2228825, 0x3c027fff, +0x3442ffff, 0x628824, 0x121140, 0x3c010001, +0x220821, 0xac317e30, 0x2201021, 0x8fbf0024, +0x8fb20020, 0x8fb1001c, 0x8fb00018, 0x3e00008, +0x27bd0028, 0x27bdffd8, 0xafb40020, 0x80a021, +0xafbf0024, 0xafb3001c, 0xafb20018, 0xafb10014, +0xafb00010, 0x8f900200, 0x3c030001, 0x8c635cc8, +0x8f930220, 0x24020002, 0x10620063, 0x2c620003, +0x10400005, 0x24020001, 0x1062000a, 0x141940, +0x8005448, 0x0, 0x24020004, 0x1062005a, +0x24020008, 0x10620059, 0x149140, 0x8005448, +0x0, 0x3c040001, 0x832021, 0x8c847e3c, +0x3c110001, 0x2238821, 0x8e317e34, 0x3c024000, +0x821024, 0x1040003e, 0x3c020008, 0x2221024, +0x10400020, 0x36100002, 0x3c020001, 0x431021, +0x8c427e40, 0x10400005, 0x36100020, 0x36100100, +0x3c020020, 0x80053bd, 0x2228825, 0x2402feff, +0x2028024, 0x3c02ffdf, 0x3442ffff, 0x2228824, +0x141140, 0x3c010001, 0x220821, 0x8c227e48, +0x10400005, 0x3c020001, 0x2629825, 0x3c020080, +0x80053dc, 0x2228825, 0x3c02fffe, 0x3442ffff, +0x2629824, 0x3c02ff7f, 0x3442ffff, 0x80053dc, +0x2228824, 0x2402fedf, 0x2028024, 0x3c02fffe, +0x3442ffff, 0x2629824, 0x3c02ff5f, 0x3442ffff, +0x2228824, 0x3c010001, 0x230821, 0xac207e40, +0x3c010001, 0x230821, 0xac207e48, 0xc00486a, +0x0, 0xaf900200, 0xaf930220, 0x8f820220, +0x2403fffb, 0x431024, 0xaf820220, 0x8f820220, +0x34420002, 0xaf820220, 0x80053f3, 0x141140, +0x8f820200, 0x2403fffd, 0x431024, 0xc00486a, +0xaf820200, 0x3c02bfff, 0x3442ffff, 0xc00429b, 0x2228824, 0x141140, 0x3c010001, 0x220821, -0x8c227ea8, 0x10400005, 0x3c020001, 0x2629825, -0x3c020080, 0x80053ed, 0x2228825, 0x3c02fffe, -0x3442ffff, 0x2629824, 0x3c02ff7f, 0x3442ffff, -0x80053ed, 0x2228824, 0x2402fedf, 0x2028024, -0x3c02fffe, 0x3442ffff, 0x2629824, 0x3c02ff5f, -0x3442ffff, 0x2228824, 0x3c010001, 0x230821, -0xac207ea0, 0x3c010001, 0x230821, 0xac207ea8, -0xc004844, 0x0, 0xaf900200, 0xaf930220, +0x8005448, 0xac317e34, 0x149140, 0x3c040001, +0x922021, 0x8c847e38, 0x3c110001, 0x2328821, +0x8e317e30, 0x3c024000, 0x821024, 0x14400011, +0x0, 0x3c020001, 0x8c425d98, 0x14400006, +0x3c02bfff, 0x8f820200, 0x34420002, 0xc00486a, +0xaf820200, 0x3c02bfff, 0x3442ffff, 0xc00429b, +0x2228824, 0x3c010001, 0x320821, 0x8005448, +0xac317e30, 0x3c020001, 0x8c425d98, 0x10400005, +0x3c020020, 0x3c020001, 0x8c425d74, 0x1040002b, +0x3c020020, 0x821024, 0x10400007, 0x36100020, +0x24020100, 0x3c010001, 0x320821, 0xac227e44, +0x8005428, 0x36100100, 0x3c010001, 0x320821, +0xac207e44, 0x2402feff, 0x2028024, 0x3c020080, +0x821024, 0x10400007, 0x141940, 0x3c020001, +0x3c010001, 0x230821, 0xac227e4c, 0x8005439, +0x2629825, 0x141140, 0x3c010001, 0x220821, +0xac207e4c, 0x3c02fffe, 0x3442ffff, 0x2629824, +0xc00486a, 0x0, 0xaf900200, 0xaf930220, 0x8f820220, 0x2403fffb, 0x431024, 0xaf820220, -0x8f820220, 0x34420002, 0xaf820220, 0x8005404, -0x141140, 0x8f820200, 0x2403fffd, 0x431024, -0xc004844, 0xaf820200, 0x3c02bfff, 0x3442ffff, -0xc00429b, 0x2228824, 0x141140, 0x3c010001, -0x220821, 0x8005459, 0xac317e94, 0x149140, -0x3c040001, 0x922021, 0x8c847e98, 0x3c110001, -0x2328821, 0x8e317e90, 0x3c024000, 0x821024, -0x14400011, 0x0, 0x3c020001, 0x8c425df8, -0x14400006, 0x3c02bfff, 0x8f820200, 0x34420002, -0xc004844, 0xaf820200, 0x3c02bfff, 0x3442ffff, -0xc00429b, 0x2228824, 0x3c010001, 0x320821, -0x8005459, 0xac317e90, 0x3c020001, 0x8c425df8, -0x10400005, 0x3c020020, 0x3c020001, 0x8c425dd4, -0x1040002b, 0x3c020020, 0x821024, 0x10400007, -0x36100020, 0x24020100, 0x3c010001, 0x320821, -0xac227ea4, 0x8005439, 0x36100100, 0x3c010001, -0x320821, 0xac207ea4, 0x2402feff, 0x2028024, -0x3c020080, 0x821024, 0x10400007, 0x141940, -0x3c020001, 0x3c010001, 0x230821, 0xac227eac, -0x800544a, 0x2629825, 0x141140, 0x3c010001, -0x220821, 0xac207eac, 0x3c02fffe, 0x3442ffff, -0x2629824, 0xc004844, 0x0, 0xaf900200, -0xaf930220, 0x8f820220, 0x2403fffb, 0x431024, -0xaf820220, 0x8f820220, 0x34420002, 0xaf820220, -0x141140, 0x3c010001, 0x220821, 0xac317e90, -0x8fbf0024, 0x8fb40020, 0x8fb3001c, 0x8fb20018, -0x8fb10014, 0x8fb00010, 0x3e00008, 0x27bd0028, -0x0, 0x0, 0x0, 0x0 }; +0x8f820220, 0x34420002, 0xaf820220, 0x141140, +0x3c010001, 0x220821, 0xac317e30, 0x8fbf0024, +0x8fb40020, 0x8fb3001c, 0x8fb20018, 0x8fb10014, +0x8fb00010, 0x3e00008, 0x27bd0028, 0x0 }; u32 tigonFwRodata[(MAX_RODATA_LEN/4) + 1] __initdata = { 0x24486561, 0x6465723a, 0x202f7072, 0x6f6a6563, 0x74732f72, 0x63732f73, 0x772f6765, @@ -4473,10 +4468,10 @@ 0x32203139, 0x39382f30, 0x342f3237, 0x2032323a, 0x31333a34, 0x30207368, 0x75616e67, 0x20457870, 0x20240000, 0x46575f56, 0x45525349, 0x4f4e3a20, -0x23312053, 0x61742044, 0x65632031, 0x31203136, -0x3a30333a, 0x31392050, 0x53542031, 0x39393900, +0x23312046, 0x72692041, 0x70722037, 0x2031373a, +0x35353a34, 0x38205044, 0x54203230, 0x30300000, 0x46575f43, 0x4f4d5049, 0x4c455f54, 0x494d453a, -0x2031363a, 0x30333a31, 0x39000000, 0x46575f43, +0x2031373a, 0x35353a34, 0x38000000, 0x46575f43, 0x4f4d5049, 0x4c455f42, 0x593a2064, 0x65767263, 0x73000000, 0x46575f43, 0x4f4d5049, 0x4c455f48, 0x4f53543a, 0x20636f6d, 0x70757465, 0x0, @@ -4554,27 +4549,27 @@ 0x2e322031, 0x3939382f, 0x30342f32, 0x37203232, 0x3a31333a, 0x33392073, 0x6875616e, 0x67204578, 0x70202400, 0x50726f62, 0x65506879, 0x0, -0x6c6e6b41, 0x53535254, 0x0, 0x11af4, -0x11b8c, 0x11bac, 0x11bf0, 0x11c1c, -0x11c30, 0x11c6c, 0x11fe0, 0x11d48, -0x11d88, 0x11db4, 0x11df4, 0x11e24, -0x11e60, 0x11e94, 0x11fe0, 0x12228, -0x12240, 0x12268, 0x12288, 0x122b0, -0x123e0, 0x12408, 0x1245c, 0x12484, -0x0, 0x126ec, 0x127bc, 0x12894, -0x12964, 0x129c0, 0x12a9c, 0x12ac4, -0x12ba0, 0x12bc8, 0x12d70, 0x12d98, -0x12f40, 0x13138, 0x133cc, 0x132e0, -0x133cc, 0x133f8, 0x12f68, 0x13110, -0x0, 0x13ae4, 0x13b28, 0x13bc0, -0x13c0c, 0x13c7c, 0x13d14, 0x13d48, -0x13dd0, 0x13e68, 0x13f38, 0x13f78, -0x13ffc, 0x14020, 0x14154, 0x646f4261, +0x6c6e6b41, 0x53535254, 0x0, 0x11b2c, +0x11bc4, 0x11bf8, 0x11c2c, 0x11c58, +0x11c6c, 0x11ca8, 0x1207c, 0x11de4, +0x11e24, 0x11e50, 0x11e90, 0x11ec0, +0x11efc, 0x11f30, 0x1207c, 0x122c0, +0x122d8, 0x12300, 0x12320, 0x12348, +0x12478, 0x124a0, 0x124f4, 0x1251c, +0x0, 0x1278c, 0x1285c, 0x12934, +0x12a04, 0x12a60, 0x12b3c, 0x12b64, +0x12c40, 0x12c68, 0x12e10, 0x12e38, +0x12fe0, 0x131d8, 0x1346c, 0x13380, +0x1346c, 0x13498, 0x13008, 0x131b0, +0x0, 0x13b84, 0x13bc8, 0x13c60, +0x13cac, 0x13d1c, 0x13db4, 0x13de8, +0x13e70, 0x13f08, 0x13fd8, 0x14018, +0x1409c, 0x140c0, 0x141f4, 0x646f4261, 0x73655067, 0x0, 0x0, 0x0, 0x0, 0x73746d61, 0x634c4e4b, 0x0, -0x6765746d, 0x636c6e6b, 0x0, 0x14c4c, -0x14c4c, 0x14b94, 0x14bd8, 0x14c4c, -0x14c4c, 0x0 }; +0x0, 0x14c38, 0x14c38, 0x14b80, +0x14bc4, 0x14c38, 0x14c38, 0x0, +0x0, 0x0 }; u32 tigonFwData[(MAX_DATA_LEN/4) + 1] __initdata = { 0x416c7465, 0x6f6e2041, 0x63654e49, 0x43205600, 0x416c7465, @@ -4604,25 +4599,25 @@ /* Generated by genfw.c */ #define tigon2FwReleaseMajor 0xc #define tigon2FwReleaseMinor 0x4 -#define tigon2FwReleaseFix 0x5 +#define tigon2FwReleaseFix 0xb #define tigon2FwStartAddr 0x00004000 #define tigon2FwTextAddr 0x00004000 -#define tigon2FwTextLen 0x11c50 -#define tigon2FwRodataAddr 0x00015c50 -#define tigon2FwRodataLen 0x10c0 -#define tigon2FwDataAddr 0x00016d40 +#define tigon2FwTextLen 0x11bc0 +#define tigon2FwRodataAddr 0x00015bc0 +#define tigon2FwRodataLen 0x10d0 +#define tigon2FwDataAddr 0x00016cc0 #define tigon2FwDataLen 0x1c0 -#define tigon2FwSbssAddr 0x00016f00 -#define tigon2FwSbssLen 0xc4 -#define tigon2FwBssAddr 0x00016fd0 +#define tigon2FwSbssAddr 0x00016e80 +#define tigon2FwSbssLen 0xcc +#define tigon2FwBssAddr 0x00016f50 #define tigon2FwBssLen 0x20c0 u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] __initdata = { 0x0, 0x10000003, 0x0, 0xd, 0xd, -0x3c1d0001, 0x8fbd6da0, 0x3a0f021, 0x3c100000, +0x3c1d0001, 0x8fbd6d20, 0x3a0f021, 0x3c100000, 0x26104000, 0xc0010c0, 0x0, 0xd, -0x3c1d0001, 0x8fbd6da4, 0x3a0f021, 0x3c100000, -0x26104000, 0xc0017c8, 0x0, 0xd, +0x3c1d0001, 0x8fbd6d24, 0x3a0f021, 0x3c100000, +0x26104000, 0xc0017e0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, @@ -4634,22 +4629,22 @@ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2000008, -0x0, 0x8001717, 0x3c0a0001, 0x8001717, -0x3c0a0002, 0x8001717, 0x0, 0x8002c68, -0x0, 0x8002c0b, 0x0, 0x8001717, -0x3c0a0004, 0x8003272, 0x0, 0x8001a3a, -0x0, 0x8003925, 0x0, 0x80038cc, -0x0, 0x8001717, 0x3c0a0006, 0x8003993, -0x3c0a0007, 0x8001717, 0x3c0a0008, 0x8001717, -0x3c0a0009, 0x80039eb, 0x0, 0x8002e62, -0x0, 0x8001717, 0x3c0a000b, 0x8001717, -0x3c0a000c, 0x8001717, 0x3c0a000d, 0x80028d7, -0x0, 0x800286c, 0x0, 0x8001717, -0x3c0a000e, 0x8002074, 0x0, 0x800194c, -0x0, 0x80019ec, 0x0, 0x8003c7e, -0x0, 0x8003c6c, 0x0, 0x8001717, -0x0, 0x8001902, 0x0, 0x8001717, -0x0, 0x8001717, 0x3c0a0013, 0x8001717, +0x0, 0x800172f, 0x3c0a0001, 0x800172f, +0x3c0a0002, 0x800172f, 0x0, 0x8002cac, +0x0, 0x8002c4f, 0x0, 0x800172f, +0x3c0a0004, 0x800328a, 0x0, 0x8001a52, +0x0, 0x800394d, 0x0, 0x80038f4, +0x0, 0x800172f, 0x3c0a0006, 0x80039bb, +0x3c0a0007, 0x800172f, 0x3c0a0008, 0x800172f, +0x3c0a0009, 0x8003a13, 0x0, 0x8002ea6, +0x0, 0x800172f, 0x3c0a000b, 0x800172f, +0x3c0a000c, 0x800172f, 0x3c0a000d, 0x80028fb, +0x0, 0x8002890, 0x0, 0x800172f, +0x3c0a000e, 0x800208c, 0x0, 0x8001964, +0x0, 0x8001a04, 0x0, 0x8003ca6, +0x0, 0x8003c94, 0x0, 0x800172f, +0x0, 0x800191a, 0x0, 0x800172f, +0x0, 0x800172f, 0x3c0a0013, 0x800172f, 0x3c0a0014, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, @@ -4667,335 +4662,341 @@ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27bdffe0, 0x3c1cc000, 0xafbf001c, 0xafb00018, 0x8f820140, -0x24030003, 0xaf8300ec, 0x34420004, 0xc002afc, -0xaf820140, 0x3c0100c0, 0xc00174b, 0xac203ffc, -0x403021, 0x3c020008, 0x3c010001, 0xac266f18, -0x50c2000d, 0x24020008, 0x3c100010, 0x10d00009, -0x24050100, 0x3c040001, 0x24845d04, 0x3821, -0xafa00010, 0xc002b17, 0xafa00014, 0x3c010001, -0xac306f18, 0x24020008, 0x3c010001, 0xac226f30, -0x2402001f, 0x3c010001, 0xac226f40, 0x24020016, -0x3c010001, 0xac226f14, 0x3c05fffe, 0x34a56f08, -0x3c020001, 0x8c426f18, 0x3c030002, 0x24639090, -0x3c040001, 0x8c846d44, 0x431023, 0x14800002, -0x458021, 0x2610fa38, 0x2402f000, 0x2028024, -0xc00176d, 0x2002021, 0x2022823, 0x3c040020, -0x821823, 0x651823, 0x247bb000, 0x3c03fffe, -0x3463bf08, 0x363b821, 0x3c0600bf, 0x34c6f000, -0x3c070001, 0x8ce76d40, 0x3c0300bf, 0x3463e000, -0x852023, 0x3c010001, 0xac246f24, 0x822023, -0x3c010001, 0xac256f0c, 0x52842, 0x3c010001, -0xac226f00, 0x27620ffc, 0x3c010001, 0xac226da0, -0x27621ffc, 0xdb3023, 0x7b1823, 0x3c010001, -0xac246f04, 0x3c010001, 0xac256f28, 0x3c010001, -0xac226da4, 0xaf860150, 0x10e00011, 0xaf830250, -0x3c1d0001, 0x8fbd6d4c, 0x3a0f021, 0xc001731, -0x0, 0x3c020001, 0x8c426d50, 0x3c030001, -0x8c636d54, 0x2442fe00, 0x24630200, 0x3c010001, -0xac226d50, 0x3c010001, 0x10000004, 0xac236d54, -0x3c1d0001, 0x8fbd6da0, 0x3a0f021, 0x3c020001, -0x8c426d44, 0x1040000d, 0x26fafa38, 0x3c020001, -0x8c426d50, 0x3c030001, 0x8c636d54, 0x3c1a0001, -0x8f5a6d54, 0x2442fa38, 0x246305c8, 0x3c010001, -0xac226d50, 0x3c010001, 0xac236d54, 0x3c020001, -0x8c426d48, 0x14400003, 0x0, 0x3c010001, -0xac206d50, 0xc00114c, 0x0, 0x8fbf001c, -0x8fb00018, 0x3e00008, 0x27bd0020, 0x3c020001, -0x8c426d50, 0x3c030001, 0x8c636d54, 0x27bdffa0, -0xafb00040, 0x3c100001, 0x8e106748, 0x3c040001, -0x24845d10, 0xafbf0058, 0xafbe0054, 0xafb50050, -0xafb3004c, 0xafb20048, 0xafb10044, 0xafa20034, -0xafa30030, 0xafa00010, 0xafa00014, 0x8f860040, -0x24050200, 0xc002b17, 0x2003821, 0x8f830040, -0x3c02f000, 0x621824, 0x3c026000, 0x1062000b, -0xa3a0003f, 0x240e0001, 0x3c040001, 0x24845d18, -0xa3ae003f, 0xafa00010, 0xafa00014, 0x8f860040, -0x24050300, 0xc002b17, 0x2003821, 0x8f820240, -0x3c030001, 0x431025, 0xaf820240, 0xaf800048, -0x8f820048, 0x14400005, 0x0, 0xaf800048, -0x8f820048, 0x10400004, 0x0, 0xaf800048, -0x10000003, 0x2e02021, 0xaf80004c, 0x2e02021, -0x3c050001, 0xc002b84, 0x34a540f8, 0x3402021, -0xc002b84, 0x240505c8, 0x3c020001, 0x8c426f24, -0x3c0d0001, 0x8dad6f04, 0x3c030001, 0x8c636f00, -0x3c080001, 0x8d086f0c, 0x3c090001, 0x8d296f28, -0x3c0a0001, 0x8d4a6f30, 0x3c0b0001, 0x8d6b6f40, -0x3c0c0001, 0x8d8c6f14, 0x3c040001, 0x24845d24, -0x24050400, 0xaf42013c, 0x8f42013c, 0x24060001, -0x24070001, 0xaf400000, 0xaf4d0138, 0xaf430144, -0xaf480148, 0xaf49014c, 0xaf4a0150, 0xaf4b0154, -0xaf4c0158, 0x2442ff80, 0xaf420140, 0x24020001, -0xafa20010, 0xc002b17, 0xafa00014, 0x8f420138, -0xafa20010, 0x8f42013c, 0xafa20014, 0x8f460144, -0x8f470148, 0x3c040001, 0x24845d30, 0xc002b17, -0x24050500, 0xafb70010, 0xafba0014, 0x8f46014c, -0x8f470150, 0x3c040001, 0x24845d3c, 0xc002b17, -0x24050600, 0x3c020001, 0x8c426f18, 0x3603821, -0x3c060002, 0x24c69090, 0x2448ffff, 0x1061824, -0xe81024, 0x43102b, 0x10400006, 0x24050900, -0x3c040001, 0x24845d48, 0xafa80010, 0xc002b17, -0xafa00014, 0x8f82000c, 0xafa20010, 0x8f82003c, -0xafa20014, 0x8f860000, 0x8f870004, 0x3c040001, -0x24845d54, 0xc002b17, 0x24051000, 0x8c020220, -0x8c030224, 0x8c060218, 0x8c07021c, 0x3c040001, -0x24845d5c, 0x24051100, 0xafa20010, 0xc002b17, -0xafa30014, 0xaf800054, 0xaf80011c, 0x8c020218, -0x30420002, 0x10400009, 0x0, 0x8c020220, -0x3c030002, 0x34630004, 0x431025, 0xaf42000c, -0x8c02021c, 0x10000008, 0x34420004, 0x8c020220, -0x3c030002, 0x34630006, 0x431025, 0xaf42000c, -0x8c02021c, 0x34420006, 0xaf420014, 0x8c020218, -0x30420010, 0x1040000a, 0x0, 0x8c02021c, -0x34420004, 0xaf420010, 0x8c020220, 0x3c03000a, -0x34630004, 0x431025, 0x10000009, 0xaf420008, -0x8c020220, 0x3c03000a, 0x34630006, 0x431025, -0xaf420008, 0x8c02021c, 0x34420006, 0xaf420010, -0x24020001, 0xaf8200a0, 0xaf8200b0, 0x8f830054, -0x8f820054, 0x10000002, 0x24630064, 0x8f820054, -0x621023, 0x2c420065, 0x1440fffc, 0x0, -0x8c040208, 0x8c05020c, 0x26e20028, 0xaee20020, -0x24020490, 0xaee20010, 0xaee40008, 0xaee5000c, -0x26e40008, 0x8c820000, 0x8c830004, 0xaf820090, -0xaf830094, 0x8c820018, 0xaf8200b4, 0x9482000a, -0xaf82009c, 0x8f420014, 0xaf8200b0, 0x8f8200b0, -0x30420004, 0x1440fffd, 0x0, 0x8f8200b0, -0x3c03ef00, 0x431024, 0x10400021, 0x0, -0x8f8200b4, 0xafa20010, 0x8f820090, 0x8f830094, -0x3c040001, 0x24845d64, 0xafa30014, 0x8f8600b0, -0x8f87009c, 0x3c050001, 0xc002b17, 0x34a5200d, -0x3c040001, 0x24845d70, 0x240203ac, 0xafa20010, -0xafa00014, 0x8f860144, 0x3c070001, 0x24e75d78, -0xc002b17, 0x3405dead, 0x8f82011c, 0x34420002, -0xaf82011c, 0x8f820220, 0x34420004, 0xaf820220, -0x8f820140, 0x3c030001, 0x431025, 0xaf820140, -0x96e20472, 0x96e60452, 0x96e70462, 0xafa20010, -0x96e20482, 0x3c040001, 0x24845da4, 0x24051200, -0xc002b17, 0xafa20014, 0x96f00452, 0x32020001, -0x10400002, 0xb021, 0x24160001, 0x32020002, -0x54400001, 0x36d60002, 0x32020008, 0x54400001, -0x36d60004, 0x32020010, 0x54400001, 0x36d60008, -0x32020020, 0x54400001, 0x36d60010, 0x32020040, -0x54400001, 0x36d60020, 0x32020080, 0x54400001, -0x36d60040, 0x96e60482, 0x30c20200, 0x54400001, -0x36d64000, 0x96e30472, 0x30620200, 0x10400003, -0x30620100, 0x10000003, 0x36d62000, 0x54400001, -0x36d61000, 0x96f00462, 0x32c24000, 0x14400004, -0x3207009b, 0x30c2009b, 0x14e20007, 0x240e0001, -0x32c22000, 0x1440000d, 0x32020001, 0x3062009b, -0x10e20009, 0x240e0001, 0x3c040001, 0x24845db0, -0x24051300, 0x2003821, 0xa3ae003f, 0xafa30010, -0xc002b17, 0xafa00014, 0x32020001, 0x54400001, -0x36d60080, 0x32020002, 0x54400001, 0x36d60100, -0x32020008, 0x54400001, 0x36d60200, 0x32020010, -0x54400001, 0x36d60400, 0x32020080, 0x54400001, -0x36d60800, 0x8c020218, 0x30420200, 0x10400002, -0x3c020008, 0x2c2b025, 0x8c020218, 0x30420800, -0x10400002, 0x3c020080, 0x2c2b025, 0x8c020218, -0x30420400, 0x10400002, 0x3c020100, 0x2c2b025, -0x8c020218, 0x30420100, 0x10400002, 0x3c020200, -0x2c2b025, 0x8c020218, 0x30420080, 0x10400002, -0x3c020400, 0x2c2b025, 0x8c020218, 0x30422000, -0x10400002, 0x3c020010, 0x2c2b025, 0x8c020218, -0x30424000, 0x10400002, 0x3c020020, 0x2c2b025, -0x8c020218, 0x30421000, 0x10400002, 0x3c020040, -0x2c2b025, 0x8ee20498, 0x8ee3049c, 0xaf420160, -0xaf430164, 0x8ee204a0, 0x8ee304a4, 0xaf420168, -0xaf43016c, 0x8ee204a8, 0x8ee304ac, 0xaf420170, -0xaf430174, 0x8ee20428, 0x8ee3042c, 0xaf420178, -0xaf43017c, 0x8ee20448, 0x8ee3044c, 0xaf420180, -0xaf430184, 0x8ee20458, 0x8ee3045c, 0xaf420188, -0xaf43018c, 0x8ee20468, 0x8ee3046c, 0xaf420190, -0xaf430194, 0x8ee20478, 0x8ee3047c, 0xaf420198, -0xaf43019c, 0x8ee20488, 0x8ee3048c, 0xaf4201a0, -0xaf4301a4, 0x8ee204b0, 0x8ee304b4, 0x24040080, -0xaf4201a8, 0xaf4301ac, 0xc002b84, 0x24050080, -0x8c02025c, 0x27440224, 0xaf4201f0, 0x8c020260, -0x24050200, 0x24060008, 0xc002b9b, 0xaf4201f8, -0x3c043b9a, 0x3484ca00, 0x3821, 0x24020006, -0x24030002, 0xaf4201f4, 0x240203e8, 0xaf430204, -0xaf430200, 0xaf4401fc, 0xaf420294, 0x24020001, -0xaf430290, 0xaf42029c, 0x3c030001, 0x671821, -0x90636d58, 0x3471021, 0x24e70001, 0xa043022c, -0x2ce2000f, 0x1440fff8, 0x3471821, 0x24e70001, -0x3c080001, 0x350840f8, 0x8f820040, 0x3c040001, -0x24845dbc, 0x24051400, 0x21702, 0x24420030, -0xa062022c, 0x3471021, 0xa040022c, 0x8c070218, -0x2c03021, 0x240205c8, 0xafa20010, 0xc002b17, -0xafa80014, 0x3c040001, 0x24845dc8, 0x3c050000, -0x24a55c20, 0x24060010, 0x27b10030, 0x2203821, -0x27b30034, 0xc00178b, 0xafb30010, 0x3c030001, -0x8c636d48, 0x1060000a, 0x408021, 0x8fa30030, -0x2405ff00, 0x8fa20034, 0x246400ff, 0x852024, -0x831823, 0x431023, 0xafa20034, 0xafa40030, -0xafb30010, 0x3c040001, 0x24845dd4, 0x3c050000, -0x24a54100, 0x24060108, 0xc00178b, 0x2203821, -0x409021, 0x32c20003, 0x50400045, 0x2203821, -0x8f820050, 0x3c030010, 0x431024, 0x10400016, -0x0, 0x8c020218, 0x30420040, 0x1040000f, -0x24020001, 0x8f820050, 0x8c030218, 0x240e0001, -0x3c040001, 0x24845de0, 0xa3ae003f, 0xafa20010, -0xafa30014, 0x8f870040, 0x24051500, 0xc002b17, -0x2c03021, 0x10000004, 0x0, 0x3c010001, -0x370821, 0xa02240f4, 0x3c040001, 0x24845dec, -0x3c050001, 0x24a55bd0, 0x3c060001, 0x24c65c3c, -0xc53023, 0x8f420010, 0x27b30030, 0x2603821, -0x27b10034, 0x34420a00, 0xaf420010, 0xc00178b, -0xafb10010, 0x3c040001, 0x24845e00, 0x3c050001, -0x24a5b604, 0x3c060001, 0x24c6b980, 0xc53023, -0x2603821, 0xaf420108, 0xc00178b, 0xafb10010, -0x3c040001, 0x24845e1c, 0x3c050001, 0x24a5bda0, -0x3c060001, 0x24c6c8a0, 0xc53023, 0x2603821, -0x3c010001, 0xac226f70, 0xc00178b, 0xafb10010, -0x3c040001, 0x24845e34, 0x10000024, 0x24051600, -0x3c040001, 0x24845e3c, 0x3c050001, 0x24a5a07c, -0x3c060001, 0x24c6a1a8, 0xc53023, 0xc00178b, -0xafb30010, 0x3c040001, 0x24845e4c, 0x3c050001, -0x24a5b1a0, 0x3c060001, 0x24c6b5fc, 0xc53023, -0x2203821, 0xaf420108, 0xc00178b, 0xafb30010, -0x3c040001, 0x24845e60, 0x3c050001, 0x24a5b988, -0x3c060001, 0x24c6bd98, 0xc53023, 0x2203821, -0x3c010001, 0xac226f70, 0xc00178b, 0xafb30010, -0x3c040001, 0x24845e74, 0x24051650, 0x2c03021, -0x3821, 0x3c010001, 0xac226f74, 0xafa00010, -0xc002b17, 0xafa00014, 0x32c20020, 0x10400021, -0x27a70030, 0x3c040001, 0x24845e80, 0x3c050001, -0x24a5b02c, 0x3c060001, 0x24c6b198, 0xc53023, -0x24022000, 0xaf42001c, 0x27a20034, 0xc00178b, -0xafa20010, 0x21900, 0x31982, 0x3c040800, -0x641825, 0xae430028, 0x24030010, 0xaf43003c, -0x96e30450, 0xaf430040, 0x8f430040, 0x3c040001, -0x24845e94, 0xafa00014, 0xafa30010, 0x8f47001c, -0x24051660, 0x3c010001, 0xac226f6c, 0x10000025, -0x32c60020, 0x8ee20448, 0x8ee3044c, 0xaf43001c, -0x8f42001c, 0x2442e000, 0x2c422001, 0x1440000a, -0x240e0001, 0x3c040001, 0x24845ea0, 0xa3ae003f, -0xafa00010, 0xafa00014, 0x8f46001c, 0x24051700, -0xc002b17, 0x3821, 0x3c020000, 0x24425c5c, -0x21100, 0x21182, 0x3c030800, 0x431025, -0xae420028, 0x24020008, 0xaf42003c, 0x96e20450, -0xaf420040, 0x8f420040, 0x3c040001, 0x24845eac, -0xafa00014, 0xafa20010, 0x8f47001c, 0x24051800, -0x32c60020, 0xc002b17, 0x0, 0x3c030001, -0x8c636f70, 0x3c050fff, 0x34a5ffff, 0x3c020001, -0x8c426f74, 0x3c040800, 0x651824, 0x31882, -0x641825, 0x451024, 0x21082, 0x441025, -0xae420080, 0x32c20180, 0x10400056, 0xae430020, -0x8f82005c, 0x3c030080, 0x431024, 0x1040000d, -0x0, 0x8f820050, 0xafa20010, 0x8f82005c, -0x240e0001, 0x3c040001, 0x24845eb8, 0xa3ae003f, -0xafa20014, 0x8f870040, 0x24051900, 0xc002b17, -0x2c03021, 0x8f820050, 0x3c030010, 0x431024, +0x24030003, 0xaf8300ec, 0x34420004, 0xc002b20, +0xaf820140, 0x3c0100c0, 0xc001763, 0xac203ffc, +0x401821, 0x3c020010, 0x3c010001, 0xac236e9c, +0x10620011, 0x43102b, 0x14400002, 0x3c020020, +0x3c020008, 0x1062000c, 0x24050100, 0x3c060001, +0x8cc66e9c, 0x3c040001, 0x24845c74, 0x3821, +0xafa00010, 0xc002b3b, 0xafa00014, 0x3c020020, +0x3c010001, 0xac226e9c, 0x24020008, 0x3c010001, +0xac226eb4, 0x2402001f, 0x3c010001, 0xac226ec4, +0x24020016, 0x3c010001, 0xac226e98, 0x3c05fffe, +0x34a56f08, 0x3c020001, 0x8c426e9c, 0x3c030002, +0x24639010, 0x3c040001, 0x8c846cc4, 0x431023, +0x14800002, 0x458021, 0x2610fa38, 0x2402f000, +0x2028024, 0xc001785, 0x2002021, 0x2022823, +0x3c040020, 0x821823, 0x651823, 0x247bb000, +0x3c03fffe, 0x3463bf08, 0x363b821, 0x3c0600bf, +0x34c6f000, 0x3c070001, 0x8ce76cc0, 0x3c0300bf, +0x3463e000, 0x852023, 0x3c010001, 0xac246ea8, +0x822023, 0x3c010001, 0xac256e90, 0x52842, +0x3c010001, 0xac226e84, 0x27620ffc, 0x3c010001, +0xac226d20, 0x27621ffc, 0xdb3023, 0x7b1823, +0x3c010001, 0xac246e88, 0x3c010001, 0xac256eac, +0x3c010001, 0xac226d24, 0xaf860150, 0x10e00011, +0xaf830250, 0x3c1d0001, 0x8fbd6ccc, 0x3a0f021, +0xc001749, 0x0, 0x3c020001, 0x8c426cd0, +0x3c030001, 0x8c636cd4, 0x2442fe00, 0x24630200, +0x3c010001, 0xac226cd0, 0x3c010001, 0x10000004, +0xac236cd4, 0x3c1d0001, 0x8fbd6d20, 0x3a0f021, +0x3c020001, 0x8c426cc4, 0x1040000d, 0x26fafa38, +0x3c020001, 0x8c426cd0, 0x3c030001, 0x8c636cd4, +0x3c1a0001, 0x8f5a6cd4, 0x2442fa38, 0x246305c8, +0x3c010001, 0xac226cd0, 0x3c010001, 0xac236cd4, +0x3c020001, 0x8c426cc8, 0x14400003, 0x0, +0x3c010001, 0xac206cd0, 0xc001151, 0x0, +0x8fbf001c, 0x8fb00018, 0x3e00008, 0x27bd0020, +0x3c020001, 0x8c426cd0, 0x3c030001, 0x8c636cd4, +0x27bdff98, 0xafb00048, 0x3c100001, 0x8e1066b8, +0xafb20050, 0x3c120000, 0x26524100, 0xafbf0060, +0xafbe005c, 0xafb50058, 0xafb30054, 0xafb1004c, +0xafa20034, 0xafa30030, 0xafa00010, 0xafa00014, +0x8f860040, 0x3c040001, 0x24845c80, 0x24050200, +0x3c010001, 0xac326e80, 0xc002b3b, 0x2003821, +0x8f830040, 0x3c02f000, 0x621824, 0x3c026000, +0x1062000b, 0xa3a0003f, 0x240e0001, 0x3c040001, +0x24845c88, 0xa3ae003f, 0xafa00010, 0xafa00014, +0x8f860040, 0x24050300, 0xc002b3b, 0x2003821, +0x8f820240, 0x3c030001, 0x431025, 0xaf820240, +0xaf800048, 0x8f820048, 0x14400005, 0x0, +0xaf800048, 0x8f820048, 0x10400004, 0x0, +0xaf800048, 0x10000003, 0x2e02021, 0xaf80004c, +0x2e02021, 0x3c050001, 0xc002ba8, 0x34a540f8, +0x3402021, 0xc002ba8, 0x240505c8, 0x3c020001, +0x8c426ea8, 0x3c0d0001, 0x8dad6e88, 0x3c030001, +0x8c636e84, 0x3c080001, 0x8d086e90, 0x3c090001, +0x8d296eac, 0x3c0a0001, 0x8d4a6eb4, 0x3c0b0001, +0x8d6b6ec4, 0x3c0c0001, 0x8d8c6e98, 0x3c040001, +0x24845c94, 0x24050400, 0xaf42013c, 0x8f42013c, +0x24060001, 0x24070001, 0xaf400000, 0xaf4d0138, +0xaf430144, 0xaf480148, 0xaf49014c, 0xaf4a0150, +0xaf4b0154, 0xaf4c0158, 0x2442ff80, 0xaf420140, +0x24020001, 0xafa20010, 0xc002b3b, 0xafa00014, +0x8f420138, 0xafa20010, 0x8f42013c, 0xafa20014, +0x8f460144, 0x8f470148, 0x3c040001, 0x24845ca0, +0xc002b3b, 0x24050500, 0xafb70010, 0xafba0014, +0x8f46014c, 0x8f470150, 0x3c040001, 0x24845cac, +0xc002b3b, 0x24050600, 0x3c020001, 0x8c426e9c, +0x3603821, 0x3c060002, 0x24c69010, 0x2448ffff, +0x1061824, 0xe81024, 0x43102b, 0x10400006, +0x24050900, 0x3c040001, 0x24845cb8, 0xafa80010, +0xc002b3b, 0xafa00014, 0x8f82000c, 0xafa20010, +0x8f82003c, 0xafa20014, 0x8f860000, 0x8f870004, +0x3c040001, 0x24845cc4, 0xc002b3b, 0x24051000, +0x8c020220, 0x8c030224, 0x8c060218, 0x8c07021c, +0x3c040001, 0x24845ccc, 0x24051100, 0xafa20010, +0xc002b3b, 0xafa30014, 0xaf800054, 0xaf80011c, +0x8c020218, 0x30420002, 0x10400009, 0x0, +0x8c020220, 0x3c030002, 0x34630004, 0x431025, +0xaf42000c, 0x8c02021c, 0x10000008, 0x34420004, +0x8c020220, 0x3c030002, 0x34630006, 0x431025, +0xaf42000c, 0x8c02021c, 0x34420006, 0xaf420014, +0x8c020218, 0x30420010, 0x1040000a, 0x0, +0x8c02021c, 0x34420004, 0xaf420010, 0x8c020220, +0x3c03000a, 0x34630004, 0x431025, 0x10000009, +0xaf420008, 0x8c020220, 0x3c03000a, 0x34630006, +0x431025, 0xaf420008, 0x8c02021c, 0x34420006, +0xaf420010, 0x24020001, 0xaf8200a0, 0xaf8200b0, +0x8f830054, 0x8f820054, 0xaf8000d0, 0xaf8000c0, +0x10000002, 0x24630064, 0x8f820054, 0x621023, +0x2c420065, 0x1440fffc, 0x0, 0x8c040208, +0x8c05020c, 0x26e20028, 0xaee20020, 0x24020490, +0xaee20010, 0xaee40008, 0xaee5000c, 0x26e40008, +0x8c820000, 0x8c830004, 0xaf820090, 0xaf830094, +0x8c820018, 0xaf8200b4, 0x9482000a, 0xaf82009c, +0x8f420014, 0xaf8200b0, 0x8f8200b0, 0x30420004, +0x1440fffd, 0x0, 0x8f8200b0, 0x3c03ef00, +0x431024, 0x10400021, 0x0, 0x8f8200b4, +0xafa20010, 0x8f820090, 0x8f830094, 0x3c040001, +0x24845cd4, 0xafa30014, 0x8f8600b0, 0x8f87009c, +0x3c050001, 0xc002b3b, 0x34a5200d, 0x3c040001, +0x24845ce0, 0x240203c0, 0xafa20010, 0xafa00014, +0x8f860144, 0x3c070001, 0x24e75ce8, 0xc002b3b, +0x3405dead, 0x8f82011c, 0x34420002, 0xaf82011c, +0x8f820220, 0x34420004, 0xaf820220, 0x8f820140, +0x3c030001, 0x431025, 0xaf820140, 0x96e20472, +0x96e60452, 0x96e70462, 0xafa20010, 0x96e20482, +0x3c040001, 0x24845d14, 0x24051200, 0xc002b3b, +0xafa20014, 0x96f00452, 0x32020001, 0x10400002, +0xb021, 0x24160001, 0x32020002, 0x54400001, +0x36d60002, 0x32020008, 0x54400001, 0x36d60004, +0x32020010, 0x54400001, 0x36d60008, 0x32020020, +0x54400001, 0x36d60010, 0x32020040, 0x54400001, +0x36d60020, 0x32020080, 0x54400001, 0x36d60040, +0x96e60482, 0x30c20200, 0x54400001, 0x36d64000, +0x96e30472, 0x30620200, 0x10400003, 0x30620100, +0x10000003, 0x36d62000, 0x54400001, 0x36d61000, +0x96f00462, 0x32c24000, 0x14400004, 0x3207009b, +0x30c2009b, 0x14e20007, 0x240e0001, 0x32c22000, +0x1440000d, 0x32020001, 0x3062009b, 0x10e20009, +0x240e0001, 0x3c040001, 0x24845d20, 0x24051300, +0x2003821, 0xa3ae003f, 0xafa30010, 0xc002b3b, +0xafa00014, 0x32020001, 0x54400001, 0x36d60080, +0x32020002, 0x54400001, 0x36d60100, 0x32020008, +0x54400001, 0x36d60200, 0x32020010, 0x54400001, +0x36d60400, 0x32020080, 0x54400001, 0x36d60800, +0x8c020218, 0x30420200, 0x10400002, 0x3c020008, +0x2c2b025, 0x8c020218, 0x30420800, 0x10400002, +0x3c020080, 0x2c2b025, 0x8c020218, 0x30420400, +0x10400002, 0x3c020100, 0x2c2b025, 0x8c020218, +0x30420100, 0x10400002, 0x3c020200, 0x2c2b025, +0x8c020218, 0x30420080, 0x10400002, 0x3c020400, +0x2c2b025, 0x8c020218, 0x30422000, 0x10400002, +0x3c020010, 0x2c2b025, 0x8c020218, 0x30424000, +0x10400002, 0x3c020020, 0x2c2b025, 0x8c020218, +0x30421000, 0x10400002, 0x3c020040, 0x2c2b025, +0x8ee20498, 0x8ee3049c, 0xaf420160, 0xaf430164, +0x8ee204a0, 0x8ee304a4, 0xaf420168, 0xaf43016c, +0x8ee204a8, 0x8ee304ac, 0xaf420170, 0xaf430174, +0x8ee20428, 0x8ee3042c, 0xaf420178, 0xaf43017c, +0x8ee20448, 0x8ee3044c, 0xaf420180, 0xaf430184, +0x8ee20458, 0x8ee3045c, 0xaf420188, 0xaf43018c, +0x8ee20468, 0x8ee3046c, 0xaf420190, 0xaf430194, +0x8ee20478, 0x8ee3047c, 0xaf420198, 0xaf43019c, +0x8ee20488, 0x8ee3048c, 0xaf4201a0, 0xaf4301a4, +0x8ee204b0, 0x8ee304b4, 0x24040080, 0xaf4201a8, +0xaf4301ac, 0xc002ba8, 0x24050080, 0x8c02025c, +0x27440224, 0xaf4201f0, 0x8c020260, 0x24050200, +0x24060008, 0xc002bbf, 0xaf4201f8, 0x3c043b9a, +0x3484ca00, 0x3821, 0x24020006, 0x24030002, +0xaf4201f4, 0x240203e8, 0xaf430204, 0xaf430200, +0xaf4401fc, 0xaf420294, 0x24020001, 0xaf430290, +0xaf42029c, 0x3c030001, 0x671821, 0x90636cd8, +0x3471021, 0x24e70001, 0xa043022c, 0x2ce2000f, +0x1440fff8, 0x3471821, 0x24e70001, 0x3c080001, +0x350840f8, 0x8f820040, 0x3c040001, 0x24845d2c, +0x24051400, 0x21702, 0x24420030, 0xa062022c, +0x3471021, 0xa040022c, 0x8c070218, 0x2c03021, +0x240205c8, 0xafa20010, 0xc002b3b, 0xafa80014, +0x3c040001, 0x24845d38, 0x3c050000, 0x24a55c80, +0x24060010, 0x27b10030, 0x2203821, 0x27b30034, +0xc0017a3, 0xafb30010, 0x3c030001, 0x8c636cc8, +0x1060000a, 0x408021, 0x8fa30030, 0x2405ff00, +0x8fa20034, 0x246400ff, 0x852024, 0x831823, +0x431023, 0xafa20034, 0xafa40030, 0x3c040001, +0x24845d44, 0x3c050000, 0x24a54100, 0x24060108, +0x2203821, 0xc0017a3, 0xafb30010, 0x409021, +0x32c20003, 0x3c010001, 0xac326e80, 0x10400045, +0x2203821, 0x8f820050, 0x3c030010, 0x431024, 0x10400016, 0x0, 0x8c020218, 0x30420040, 0x1040000f, 0x24020001, 0x8f820050, 0x8c030218, -0x240e0001, 0x3c040001, 0x24845de0, 0xa3ae003f, -0xafa20010, 0xafa30014, 0x8f870040, 0x24052000, -0xc002b17, 0x2c03021, 0x10000004, 0x0, +0x240e0001, 0x3c040001, 0x24845d50, 0xa3ae003f, +0xafa20010, 0xafa30014, 0x8f870040, 0x24051500, +0xc002b3b, 0x2c03021, 0x10000004, 0x0, +0x3c010001, 0x370821, 0xa02240f4, 0x3c040001, +0x24845d5c, 0x3c050001, 0x24a55b40, 0x3c060001, +0x24c65bac, 0xc53023, 0x8f420010, 0x27b30030, +0x2603821, 0x27b10034, 0x34420a00, 0xaf420010, +0xc0017a3, 0xafb10010, 0x3c040001, 0x24845d70, +0x3c050001, 0x24a5b714, 0x3c060001, 0x24c6ba90, +0xc53023, 0x2603821, 0xaf420108, 0xc0017a3, +0xafb10010, 0x3c040001, 0x24845d8c, 0x3c050001, +0x24a5be58, 0x3c060001, 0x24c6c900, 0xc53023, +0x2603821, 0x3c010001, 0xac226ef4, 0xc0017a3, +0xafb10010, 0x3c040001, 0x24845da4, 0x10000024, +0x24051600, 0x3c040001, 0x24845dac, 0x3c050001, +0x24a5a10c, 0x3c060001, 0x24c6a238, 0xc53023, +0xc0017a3, 0xafb30010, 0x3c040001, 0x24845dbc, +0x3c050001, 0x24a5b2b0, 0x3c060001, 0x24c6b70c, +0xc53023, 0x2203821, 0xaf420108, 0xc0017a3, +0xafb30010, 0x3c040001, 0x24845dd0, 0x3c050001, +0x24a5ba98, 0x3c060001, 0x24c6be50, 0xc53023, +0x2203821, 0x3c010001, 0xac226ef4, 0xc0017a3, +0xafb30010, 0x3c040001, 0x24845de4, 0x24051650, +0x2c03021, 0x3821, 0x3c010001, 0xac226ef8, +0xafa00010, 0xc002b3b, 0xafa00014, 0x32c20020, +0x10400021, 0x27a70030, 0x3c040001, 0x24845df0, +0x3c050001, 0x24a5b13c, 0x3c060001, 0x24c6b2a8, +0xc53023, 0x24022000, 0xaf42001c, 0x27a20034, +0xc0017a3, 0xafa20010, 0x21900, 0x31982, +0x3c040800, 0x641825, 0xae430028, 0x24030010, +0xaf43003c, 0x96e30450, 0xaf430040, 0x8f430040, +0x3c040001, 0x24845e04, 0xafa00014, 0xafa30010, +0x8f47001c, 0x24051660, 0x3c010001, 0xac226ef0, +0x10000025, 0x32c60020, 0x8ee20448, 0x8ee3044c, +0xaf43001c, 0x8f42001c, 0x2442e000, 0x2c422001, +0x1440000a, 0x240e0001, 0x3c040001, 0x24845e10, +0xa3ae003f, 0xafa00010, 0xafa00014, 0x8f46001c, +0x24051700, 0xc002b3b, 0x3821, 0x3c020000, +0x24425cbc, 0x21100, 0x21182, 0x3c030800, +0x431025, 0xae420028, 0x24020008, 0xaf42003c, +0x96e20450, 0xaf420040, 0x8f420040, 0x3c040001, +0x24845e1c, 0xafa00014, 0xafa20010, 0x8f47001c, +0x24051800, 0x32c60020, 0xc002b3b, 0x0, +0x3c050fff, 0x3c030001, 0x8c636ef4, 0x34a5ffff, +0x2403021, 0x3c020001, 0x8c426ef8, 0x3c040800, +0x651824, 0x31882, 0x641825, 0x451024, +0x21082, 0x441025, 0xacc20080, 0x32c20180, +0x10400056, 0xacc30020, 0x8f82005c, 0x3c030080, +0x431024, 0x1040000d, 0x0, 0x8f820050, +0xafa20010, 0x8f82005c, 0x240e0001, 0x3c040001, +0x24845e28, 0xa3ae003f, 0xafa20014, 0x8f870040, +0x24051900, 0xc002b3b, 0x2c03021, 0x8f820050, +0x3c030010, 0x431024, 0x10400016, 0x0, +0x8c020218, 0x30420040, 0x1040000f, 0x24020001, +0x8f820050, 0x8c030218, 0x240e0001, 0x3c040001, +0x24845d50, 0xa3ae003f, 0xafa20010, 0xafa30014, +0x8f870040, 0x24052000, 0xc002b3b, 0x2c03021, +0x10000004, 0x0, 0x3c010001, 0x370821, +0xa02240f4, 0x3c040001, 0x24845e34, 0x3c050001, +0x24a55ac0, 0x3c060001, 0x24c65b38, 0xc53023, +0x8f420008, 0x27b30030, 0x2603821, 0x27b10034, +0x34420e00, 0xaf420008, 0xc0017a3, 0xafb10010, +0x3c040001, 0x24845e4c, 0x3c050001, 0x24a5d8b4, +0x3c060001, 0x24c6e3c8, 0xc53023, 0x2603821, +0xaf42010c, 0xc0017a3, 0xafb10010, 0x3c040001, +0x24845e64, 0x3c050001, 0x24a5e9ac, 0x3c060001, +0x24c6f0f0, 0xc53023, 0x2603821, 0x3c010001, +0xac226f04, 0xc0017a3, 0xafb10010, 0x3c040001, +0x24845e7c, 0x10000027, 0x24052100, 0x3c040001, +0x24845e84, 0x3c050001, 0x24a59fc8, 0x3c060001, +0x24c6a104, 0xc53023, 0x27b10030, 0x2203821, +0x27b30034, 0xc0017a3, 0xafb30010, 0x3c040001, +0x24845e94, 0x3c050001, 0x24a5cad4, 0x3c060001, +0x24c6d8ac, 0xc53023, 0x2203821, 0xaf42010c, +0xc0017a3, 0xafb30010, 0x3c040001, 0x24845ea4, +0x3c050001, 0x24a5e84c, 0x3c060001, 0x24c6e9a4, +0xc53023, 0x2203821, 0x3c010001, 0xac226f04, +0xc0017a3, 0xafb30010, 0x3c040001, 0x24845eb8, +0x24052150, 0x2c03021, 0x3821, 0x3c010001, +0xac226f10, 0xafa00010, 0xc002b3b, 0xafa00014, +0x3c110fff, 0x3c030001, 0x8c636f04, 0x3631ffff, +0x2409821, 0x3c020001, 0x8c426f10, 0x3c0e0800, +0x711824, 0x31882, 0x6e1825, 0x511024, +0x21082, 0x4e1025, 0xae630038, 0xae620078, +0x8c020218, 0x30420040, 0x14400004, 0x24020001, 0x3c010001, 0x370821, 0xa02240f4, 0x3c040001, -0x24845ec4, 0x3c050001, 0x24a55b50, 0x3c060001, -0x24c65bc8, 0xc53023, 0x8f420008, 0x27b30030, -0x2603821, 0x27b10034, 0x34420e00, 0xaf420008, -0xc00178b, 0xafb10010, 0x3c040001, 0x24845edc, -0x3c050001, 0x24a5d814, 0x3c060001, 0x24c6e328, -0xc53023, 0x2603821, 0xaf42010c, 0xc00178b, -0xafb10010, 0x3c040001, 0x24845ef4, 0x3c050001, -0x24a5e90c, 0x3c060001, 0x24c6f050, 0xc53023, -0x2603821, 0x3c010001, 0xac226f80, 0xc00178b, -0xafb10010, 0x3c040001, 0x24845f0c, 0x10000027, -0x24052100, 0x3c040001, 0x24845f14, 0x3c050001, -0x24a59f38, 0x3c060001, 0x24c6a074, 0xc53023, -0x27b10030, 0x2203821, 0x27b30034, 0xc00178b, -0xafb30010, 0x3c040001, 0x24845f24, 0x3c050001, -0x24a5ca74, 0x3c060001, 0x24c6d80c, 0xc53023, -0x2203821, 0xaf42010c, 0xc00178b, 0xafb30010, -0x3c040001, 0x24845f34, 0x3c050001, 0x24a5e7ac, -0x3c060001, 0x24c6e904, 0xc53023, 0x2203821, -0x3c010001, 0xac226f80, 0xc00178b, 0xafb30010, -0x3c040001, 0x24845f48, 0x24052150, 0x2c03021, -0x3821, 0x3c010001, 0xac226f8c, 0xafa00010, -0xc002b17, 0xafa00014, 0x3c030001, 0x8c636f80, -0x3c110fff, 0x3631ffff, 0x3c020001, 0x8c426f8c, -0x3c1e0800, 0x711824, 0x31882, 0x7e1825, -0x511024, 0x21082, 0x5e1025, 0xae430038, -0xae420078, 0x8c020218, 0x30420040, 0x14400004, -0x24020001, 0x3c010001, 0x370821, 0xa02240f4, -0x3c040001, 0x24845f54, 0x3c050001, 0x24a5e330, -0x3c060001, 0x24c6e48c, 0xc53023, 0x27b50030, -0x2a03821, 0x27b30034, 0xc00178b, 0xafb30010, -0x3c010001, 0xac226f78, 0x511024, 0x21082, -0x5e1025, 0xae420050, 0x32c22000, 0x10400005, -0x2a03821, 0x3c020000, 0x24425c5c, 0x1000000d, -0x511024, 0x3c040001, 0x24845f68, 0x3c050001, -0x24a5e494, 0x3c060001, 0x24c6e644, 0xc53023, -0xc00178b, 0xafb30010, 0x3c010001, 0xac226f90, -0x511024, 0x21082, 0x5e1025, 0xae420048, -0x32c24000, 0x10400005, 0x27a70030, 0x3c020000, -0x24425c5c, 0x1000000e, 0x21100, 0x3c040001, -0x24845f80, 0x3c050001, 0x24a5e64c, 0x3c060001, -0x24c6e7a4, 0xc53023, 0x27a20034, 0xc00178b, -0xafa20010, 0x3c010001, 0xac226f84, 0x21100, -0x21182, 0x3c030800, 0x431025, 0xae420060, -0x3c040001, 0x24845f98, 0x3c050001, 0x24a581d0, -0x3c060001, 0x24c685f0, 0xc53023, 0x27b10030, -0x2203821, 0x27b30034, 0xc00178b, 0xafb30010, -0x3c1e0fff, 0x37deffff, 0x3c040001, 0x24845fa4, -0x3c050000, 0x24a56408, 0x3c060000, 0x24c66528, -0xc53023, 0x2203821, 0x3c010001, 0xac226f58, -0x5e1024, 0x21082, 0x3c150800, 0x551025, -0xae4200b8, 0xc00178b, 0xafb30010, 0x3c040001, -0x24845fb0, 0x3c050000, 0x24a56530, 0x3c060000, -0x24c667a8, 0xc53023, 0x2203821, 0x3c010001, -0xac226f4c, 0x5e1024, 0x21082, 0x551025, -0xae4200e8, 0xc00178b, 0xafb30010, 0x3c040001, -0x24845fc8, 0x3c050000, 0x24a567b0, 0x3c060000, -0x24c668e0, 0xc53023, 0x2203821, 0x3c010001, -0xac226f44, 0x5e1024, 0x21082, 0x551025, -0xae4200c0, 0xc00178b, 0xafb30010, 0x3c040001, -0x24845fe0, 0x3c050001, 0x24a5fa30, 0x3c060001, -0x24c6fb08, 0xc53023, 0x2203821, 0x3c010001, -0xac226f50, 0x5e1024, 0x21082, 0x551025, -0xae4200c8, 0xc00178b, 0xafb30010, 0x3c040001, -0x24845fec, 0x3c050001, 0x24a5c8dc, 0x3c060001, -0x24c6c9c0, 0xc53023, 0x2203821, 0xaf420110, -0xc00178b, 0xafb30010, 0x3c040001, 0x24845ffc, -0x3c050001, 0x24a5c8b0, 0x3c060001, 0x24c6c8d4, -0xc53023, 0x2203821, 0xaf420124, 0xc00178b, -0xafb30010, 0x3c040001, 0x2484600c, 0x3c050001, -0x24a55b10, 0x3c060001, 0x24c65b3c, 0xc53023, -0x2203821, 0xaf420120, 0xaf420114, 0xc00178b, -0xafb30010, 0x3c040001, 0x24846018, 0x3c050001, -0x24a5f1f8, 0x3c060001, 0x24c6f614, 0xc53023, -0x2203821, 0xaf420118, 0xc00178b, 0xafb30010, -0x3c010001, 0xac226f94, 0x5e1024, 0x21082, -0x551025, 0xc003f9b, 0xae4200d0, 0xc003c18, -0x0, 0xc002784, 0x0, 0xac000228, +0x24845ec4, 0x3c050001, 0x24a5e3d0, 0x3c060001, +0x24c6e52c, 0xc53023, 0x27be0030, 0x3c03821, +0x27b50034, 0xc0017a3, 0xafb50010, 0x3c010001, +0xac226efc, 0x511024, 0x21082, 0x3c0e0800, +0x4e1025, 0xae620050, 0x32c22000, 0x10400006, +0x3c03821, 0x3c020000, 0x24425cbc, 0x2221024, +0x1000000f, 0x21082, 0x3c040001, 0x24845ed8, +0x3c050001, 0x24a5e534, 0x3c060001, 0x24c6e6e4, +0xc53023, 0xc0017a3, 0xafb50010, 0x3c010001, +0xac226f14, 0x511024, 0x21082, 0x3c0e0800, +0x4e1025, 0xae620048, 0x32c24000, 0x10400005, +0x27a70030, 0x3c020000, 0x24425cbc, 0x1000000e, +0x21100, 0x3c040001, 0x24845ef0, 0x3c050001, +0x24a5e6ec, 0x3c060001, 0x24c6e844, 0xc53023, +0x27a20034, 0xc0017a3, 0xafa20010, 0x3c010001, +0xac226f08, 0x21100, 0x21182, 0x3c030800, +0x431025, 0xae420060, 0x3c040001, 0x24845f08, +0x3c050001, 0x24a58230, 0x3c060001, 0x24c68650, +0xc53023, 0x27b10030, 0x2203821, 0x27b30034, +0xc0017a3, 0xafb30010, 0x3c0e0fff, 0x35ceffff, +0x3c040001, 0x24845f14, 0x3c050000, 0x24a56468, +0x3c060000, 0x24c66588, 0xc53023, 0x2203821, +0x240f021, 0x3c010001, 0xac226edc, 0x4e1024, +0x21082, 0x3c150800, 0x551025, 0xafae0044, +0xafc200b8, 0xc0017a3, 0xafb30010, 0x3c040001, +0x24845f20, 0x3c050000, 0x24a56590, 0x3c060000, +0x24c66808, 0x8fae0044, 0xc53023, 0x2203821, +0x3c010001, 0xac226ed0, 0x4e1024, 0x21082, +0x551025, 0xafc200e8, 0xc0017a3, 0xafb30010, +0x3c040001, 0x24845f38, 0x3c050000, 0x24a56810, +0x3c060000, 0x24c66940, 0x8fae0044, 0xc53023, +0x2203821, 0x3c010001, 0xac226ec8, 0x4e1024, +0x21082, 0x551025, 0xafc200c0, 0xc0017a3, +0xafb30010, 0x3c040001, 0x24845f50, 0x3c050001, +0x24a5fad0, 0x3c060001, 0x24c6fba8, 0x8fae0044, +0xc53023, 0x2203821, 0x3c010001, 0xac226ed4, +0x4e1024, 0x21082, 0x551025, 0xafc200c8, +0xc0017a3, 0xafb30010, 0x3c040001, 0x24845f5c, +0x3c050001, 0x24a5c93c, 0x3c060001, 0x24c6ca20, +0xc53023, 0x2203821, 0xaf420110, 0xc0017a3, +0xafb30010, 0x3c040001, 0x24845f6c, 0x3c050001, +0x24a5c910, 0x3c060001, 0x24c6c934, 0xc53023, +0x2203821, 0xaf420124, 0xc0017a3, 0xafb30010, +0x3c040001, 0x24845f7c, 0x3c050001, 0x24a55a80, +0x3c060001, 0x24c65aac, 0xc53023, 0x2203821, +0xaf420120, 0xaf420114, 0xc0017a3, 0xafb30010, +0x3c040001, 0x24845f88, 0x3c050001, 0x24a5f298, +0x3c060001, 0x24c6f6b4, 0xc53023, 0x2203821, +0xaf420118, 0xc0017a3, 0xafb30010, 0x8fae0044, +0x3c010001, 0xac226f18, 0x4e1024, 0x21082, +0x551025, 0xc003fc3, 0xafc200d0, 0xc003c40, +0x0, 0xc0027a8, 0x0, 0xac000228, 0xac00022c, 0x96e20450, 0x2442ffff, 0xaf420038, 0x96e20460, 0xaf420080, 0x32c24000, 0x14400003, 0x0, 0x96e20480, 0xaf420084, 0x96e70490, 0x50e00001, 0x24070800, 0x24e2ffff, 0xaf420088, 0xaf42007c, 0x24020800, 0x10e2000f, 0x32c24000, 0x10400003, 0x24020400, 0x10e2000b, 0x0, -0x240e0001, 0x3c040001, 0x24846028, 0xa3ae003f, +0x240e0001, 0x3c040001, 0x24845f98, 0xa3ae003f, 0x96e60490, 0x24052170, 0x2c03821, 0xafa00010, -0xc002b17, 0xafa00014, 0x8f430138, 0x8f440138, +0xc002b3b, 0xafa00014, 0x8f430138, 0x8f440138, 0x24020001, 0xa34205c2, 0xaf430094, 0xaf440098, 0xafa00010, 0xafa00014, 0x8f460080, 0x8f470084, -0x3c040001, 0x24846034, 0xc002b17, 0x24052200, -0xc002480, 0x3c110800, 0x3c1433d8, 0x3694cb58, -0x3c020800, 0x34420080, 0x3c040001, 0x24846040, -0x3c050000, 0x24a55ca0, 0x3c060000, 0x24c65cbc, +0x3c040001, 0x24845fa4, 0xc002b3b, 0x24052200, +0xc0024a4, 0x3c110800, 0x3c1433d8, 0x3694cb58, +0x3c020800, 0x34420080, 0x3c040001, 0x24845fb0, +0x3c050000, 0x24a55d00, 0x3c060000, 0x24c65d1c, 0xc53023, 0x27a70030, 0xaf820060, 0x2402ffff, -0xaf820064, 0x27a20034, 0xc00178b, 0xafa20010, -0x3c010001, 0xac226f34, 0x21100, 0x21182, -0x511025, 0xc0018e4, 0xae420000, 0x8f820240, +0xaf820064, 0x27a20034, 0xc0017a3, 0xafa20010, +0x3c010001, 0xac226eb8, 0x21100, 0x21182, +0x511025, 0xc0018fc, 0xae420000, 0x8f820240, 0x3c030001, 0x431025, 0xaf820240, 0x3c020000, 0x24424034, 0xaf820244, 0xaf800240, 0x8f820060, 0x511024, 0x14400005, 0x3c030800, 0x8f820060, -0x431024, 0x1040fffd, 0x0, 0xc003c25, +0x431024, 0x1040fffd, 0x0, 0xc003c4d, 0x8821, 0x3c020100, 0xafa20020, 0x8f530018, 0x240200ff, 0x56620001, 0x26710001, 0x8c020228, 0x1622000e, 0x1330c0, 0x8f42033c, 0x24420001, 0xaf42033c, 0x8f42033c, 0x8c020228, 0x3c040001, -0x24845cb4, 0x3c050009, 0xafa00014, 0xafa20010, +0x24845c24, 0x3c050009, 0xafa00014, 0xafa20010, 0x8fa60020, 0x1000003f, 0x34a50100, 0xd71021, 0x8fa30020, 0x8fa40024, 0xac4304c0, 0xac4404c4, 0xc01821, 0x8f440178, 0x8f45017c, 0x1021, @@ -5004,21 +5005,21 @@ 0x24070008, 0xa32821, 0xa3482b, 0x822021, 0x100f809, 0x892021, 0x1440000b, 0x24070008, 0x8f820120, 0xafa20010, 0x8f820124, 0x3c040001, -0x24845cbc, 0x3c050009, 0xafa20014, 0x8fa60020, +0x24845c2c, 0x3c050009, 0xafa20014, 0x8fa60020, 0x1000001c, 0x34a50200, 0x8f440160, 0x8f450164, 0x8f43000c, 0xaf510018, 0x8f860120, 0x24020010, 0xafa20010, 0xafb10014, 0xafa30018, 0x8f42010c, 0x40f809, 0x24c6001c, 0x14400010, 0x0, 0x8f420340, 0x24420001, 0xaf420340, 0x8f420340, 0x8f820120, 0xafa20010, 0x8f820124, 0x3c040001, -0x24845cc4, 0x3c050009, 0xafa20014, 0x8fa60020, -0x34a50300, 0xc002b17, 0x2603821, 0x8f4202e4, +0x24845c34, 0x3c050009, 0xafa20014, 0x8fa60020, +0x34a50300, 0xc002b3b, 0x2603821, 0x8f4202e4, 0x24420001, 0xaf4202e4, 0x8f4202e4, 0x93a2003f, 0x10400069, 0x3c020700, 0x34423000, 0xafa20028, 0x8f530018, 0x240200ff, 0x12620002, 0x8821, 0x26710001, 0x8c020228, 0x1622000e, 0x1330c0, 0x8f42033c, 0x24420001, 0xaf42033c, 0x8f42033c, -0x8c020228, 0x3c040001, 0x24845cb4, 0x3c050009, +0x8c020228, 0x3c040001, 0x24845c24, 0x3c050009, 0xafa00014, 0xafa20010, 0x8fa60028, 0x1000003f, 0x34a50100, 0xd71021, 0x8fa30028, 0x8fa4002c, 0xac4304c0, 0xac4404c4, 0xc01821, 0x8f440178, @@ -5027,18 +5028,18 @@ 0xafa80018, 0x8f48010c, 0x24070008, 0xa32821, 0xa3482b, 0x822021, 0x100f809, 0x892021, 0x1440000b, 0x24070008, 0x8f820120, 0xafa20010, -0x8f820124, 0x3c040001, 0x24845cbc, 0x3c050009, +0x8f820124, 0x3c040001, 0x24845c2c, 0x3c050009, 0xafa20014, 0x8fa60028, 0x1000001c, 0x34a50200, 0x8f440160, 0x8f450164, 0x8f43000c, 0xaf510018, 0x8f860120, 0x24020010, 0xafa20010, 0xafb10014, 0xafa30018, 0x8f42010c, 0x40f809, 0x24c6001c, 0x14400010, 0x0, 0x8f420340, 0x24420001, 0xaf420340, 0x8f420340, 0x8f820120, 0xafa20010, -0x8f820124, 0x3c040001, 0x24845cc4, 0x3c050009, -0xafa20014, 0x8fa60028, 0x34a50300, 0xc002b17, +0x8f820124, 0x3c040001, 0x24845c34, 0x3c050009, +0xafa20014, 0x8fa60028, 0x34a50300, 0xc002b3b, 0x2603821, 0x8f4202f0, 0x24420001, 0xaf4202f0, -0x8f4202f0, 0x3c040001, 0x24846050, 0xafa00010, -0xafa00014, 0x8fa60028, 0x24052300, 0xc002b17, +0x8f4202f0, 0x3c040001, 0x24845fc0, 0xafa00010, +0xafa00014, 0x8fa60028, 0x24052300, 0xc002b3b, 0x3821, 0x10000004, 0x0, 0x8c020264, 0x10400005, 0x0, 0x8f8200a0, 0x30420004, 0x1440fffa, 0x0, 0x8f820044, 0x34420004, @@ -5049,31 +5050,31 @@ 0x431021, 0xaf420090, 0x24020001, 0xaf42008c, 0x32c20008, 0x10400006, 0x0, 0x8f820214, 0x3c038100, 0x3042ffff, 0x431025, 0xaf820214, -0x3c030001, 0x8c636e14, 0x30620002, 0x10400009, -0x30620001, 0x3c040001, 0x2484605c, 0x3c050000, -0x24a56cf0, 0x3c060000, 0x24c67168, 0x10000012, +0x3c030001, 0x8c636d94, 0x30620002, 0x10400009, +0x30620001, 0x3c040001, 0x24845fcc, 0x3c050000, +0x24a56d50, 0x3c060000, 0x24c671c8, 0x10000012, 0xc53023, 0x10400009, 0x0, 0x3c040001, -0x2484606c, 0x3c050000, 0x24a57170, 0x3c060000, -0x24c67618, 0x10000008, 0xc53023, 0x3c040001, -0x2484607c, 0x3c050000, 0x24a568e8, 0x3c060000, -0x24c66ce8, 0xc53023, 0x27a70030, 0x27a20034, -0xc00178b, 0xafa20010, 0x3c010001, 0xac226f48, -0x3c020001, 0x8c426f48, 0x3c030800, 0x21100, +0x24845fdc, 0x3c050000, 0x24a571d0, 0x3c060000, +0x24c67678, 0x10000008, 0xc53023, 0x3c040001, +0x24845fec, 0x3c050000, 0x24a56948, 0x3c060000, +0x24c66d48, 0xc53023, 0x27a70030, 0x27a20034, +0xc0017a3, 0xafa20010, 0x3c010001, 0xac226ecc, +0x3c020001, 0x8c426ecc, 0x3c030800, 0x21100, 0x21182, 0x431025, 0xae420040, 0x8f8200a0, 0xafa20010, 0x8f8200b0, 0xafa20014, 0x8f86005c, -0x8f87011c, 0x3c040001, 0x2484608c, 0x3c010001, -0xac366f20, 0x3c010001, 0xac206f10, 0x3c010001, -0xac3c6f08, 0x3c010001, 0xac3b6f38, 0x3c010001, -0xac376f3c, 0x3c010001, 0xac3a6f1c, 0xc002b17, +0x8f87011c, 0x3c040001, 0x24845ffc, 0x3c010001, +0xac366ea4, 0x3c010001, 0xac206e94, 0x3c010001, +0xac3c6e8c, 0x3c010001, 0xac3b6ebc, 0x3c010001, +0xac376ec0, 0x3c010001, 0xac3a6ea0, 0xc002b3b, 0x24052400, 0x8f820200, 0xafa20010, 0x8f820220, 0xafa20014, 0x8f860044, 0x8f870050, 0x3c040001, -0x24846098, 0xc002b17, 0x24052500, 0x8f830060, +0x24846008, 0xc002b3b, 0x24052500, 0x8f830060, 0x74100b, 0x242000a, 0x200f821, 0x0, -0xd, 0x8fbf0058, 0x8fbe0054, 0x8fb50050, -0x8fb3004c, 0x8fb20048, 0x8fb10044, 0x8fb00040, -0x3e00008, 0x27bd0060, 0x27bdffe0, 0x3c040001, -0x248460a4, 0x24052600, 0x3021, 0x3821, -0xafbf0018, 0xafa00010, 0xc002b17, 0xafa00014, +0xd, 0x8fbf0060, 0x8fbe005c, 0x8fb50058, +0x8fb30054, 0x8fb20050, 0x8fb1004c, 0x8fb00048, +0x3e00008, 0x27bd0068, 0x27bdffe0, 0x3c040001, +0x24846014, 0x24052600, 0x3021, 0x3821, +0xafbf0018, 0xafa00010, 0xc002b3b, 0xafa00014, 0x8fbf0018, 0x3e00008, 0x27bd0020, 0x3e00008, 0x0, 0x3e00008, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, @@ -5083,15 +5084,15 @@ 0xafa40018, 0xa22823, 0xa32824, 0x8ca20000, 0x1044000a, 0x0, 0xafa50010, 0x8ca20000, 0xafa20014, 0x8f860150, 0x8f870250, 0x3c040001, -0x248460ac, 0xc002b17, 0x24052700, 0x8fbf0218, +0x2484601c, 0xc002b3b, 0x24052700, 0x8fbf0218, 0x3e00008, 0x27bd0220, 0x27bdffe0, 0x3c06abba, 0x34c6babe, 0xafb00018, 0x3c100004, 0x3c07007f, 0x34e7ffff, 0xafbf001c, 0x102840, 0x8e040000, 0x8ca30000, 0xaca00000, 0xae060000, 0x8ca20000, 0xaca30000, 0x10460005, 0xae040000, 0xa08021, 0xf0102b, 0x1040fff5, 0x102840, 0x3c040001, -0x248460b8, 0x24052800, 0x2003021, 0x3821, -0xafa00010, 0xc002b17, 0xafa00014, 0x2001021, +0x24846028, 0x24052800, 0x2003021, 0x3821, +0xafa00010, 0xc002b3b, 0xafa00014, 0x2001021, 0x8fbf001c, 0x8fb00018, 0x3e00008, 0x27bd0020, 0x8c020224, 0x3047003f, 0x10e00010, 0x803021, 0x2821, 0x24030020, 0xe31024, 0x10400002, @@ -5106,84 +5107,84 @@ 0x8ea20000, 0x2403fffc, 0xc38024, 0x50102b, 0x1440001b, 0xe08821, 0x8e330000, 0xafb00010, 0x8ea20000, 0xafa20014, 0x8e270000, 0x24053000, -0xc002b17, 0x2403021, 0x8e230000, 0x702021, +0xc002b3b, 0x2403021, 0x8e230000, 0x702021, 0x64102b, 0x10400007, 0x2402821, 0x8ca20000, 0xac620000, 0x24630004, 0x64102b, 0x1440fffb, 0x24a50004, 0x8ea20000, 0x501023, 0xaea20000, 0x8e220000, 0x501021, 0x1000000b, 0xae220000, 0x2402002d, 0xa0820000, 0xafb00010, 0x8ea20000, 0x2409821, 0xafa20014, 0x8e270000, 0x24053100, -0xc002b17, 0x2603021, 0x2601021, 0x8fbf002c, +0xc002b3b, 0x2603021, 0x2601021, 0x8fbf002c, 0x8fb50028, 0x8fb30024, 0x8fb20020, 0x8fb1001c, 0x8fb00018, 0x3e00008, 0x27bd0030, 0x27bdffe8, -0x3c1cc000, 0x3c05fffe, 0x3c030001, 0x8c636f00, -0x3c040001, 0x8c846f0c, 0x34a5bf08, 0x24021ffc, -0x3c010001, 0xac226d50, 0x3c0200c0, 0x3c010001, -0xac226d54, 0x3c020020, 0xafbf0010, 0x3c0100c0, +0x3c1cc000, 0x3c05fffe, 0x3c030001, 0x8c636e84, +0x3c040001, 0x8c846e90, 0x34a5bf08, 0x24021ffc, +0x3c010001, 0xac226cd0, 0x3c0200c0, 0x3c010001, +0xac226cd4, 0x3c020020, 0xafbf0010, 0x3c0100c0, 0xac201ffc, 0x431023, 0x441023, 0x245bb000, -0x365b821, 0x3c1d0001, 0x8fbd6d4c, 0x3a0f021, +0x365b821, 0x3c1d0001, 0x8fbd6ccc, 0x3a0f021, 0x3c0400c0, 0x34840200, 0x3c1a00c0, 0x3c0300c0, -0x346307c8, 0x24021dfc, 0x3c010001, 0xac226d50, -0x24021834, 0x3c010001, 0xac246d54, 0x3c010001, -0xac226d50, 0x3c010001, 0xac236d54, 0xc0017f5, +0x346307c8, 0x24021dfc, 0x3c010001, 0xac226cd0, +0x24021834, 0x3c010001, 0xac246cd4, 0x3c010001, +0xac226cd0, 0x3c010001, 0xac236cd4, 0xc00180d, 0x375a0200, 0x8fbf0010, 0x3e00008, 0x27bd0018, -0x27bdffc8, 0x3c040001, 0x248460c4, 0x24053200, -0x3c020001, 0x8c426d50, 0x3c030001, 0x8c636d54, +0x27bdffc8, 0x3c040001, 0x24846034, 0x24053200, +0x3c020001, 0x8c426cd0, 0x3c030001, 0x8c636cd4, 0x3021, 0x3603821, 0xafbf0030, 0xafb3002c, 0xafb20028, 0xafb10024, 0xafb00020, 0xafa2001c, -0xafa30018, 0xafb70010, 0xc002b17, 0xafba0014, -0xc0018fe, 0x0, 0x8f820240, 0x34420004, +0xafa30018, 0xafb70010, 0xc002b3b, 0xafba0014, +0xc001916, 0x0, 0x8f820240, 0x34420004, 0xaf820240, 0x24020001, 0xaf420000, 0x3c020001, 0x571021, 0x904240f4, 0x10400092, 0x2403fffc, -0x3c100001, 0x2610abe3, 0x3c120001, 0x2652a7bc, +0x3c100001, 0x2610ac73, 0x3c120001, 0x2652a84c, 0x2121023, 0x438024, 0x8fa3001c, 0x3c040001, -0x248460d0, 0x70102b, 0x1440001a, 0x27b30018, +0x24846040, 0x70102b, 0x1440001a, 0x27b30018, 0x8fb10018, 0x24053000, 0x2403021, 0xafb00010, -0xafa30014, 0xc002b17, 0x2203821, 0x8fa30018, +0xafa30014, 0xc002b3b, 0x2203821, 0x8fa30018, 0x702021, 0x64102b, 0x10400007, 0x2403021, 0x8cc20000, 0xac620000, 0x24630004, 0x64102b, 0x1440fffb, 0x24c60004, 0x8fa2001c, 0x501023, 0xafa2001c, 0x8e620000, 0x501021, 0x1000000a, 0xae620000, 0x2408821, 0x24053100, 0xafb00010, 0xafa30014, 0x8fa70018, 0x2203021, 0x2402002d, -0xc002b17, 0xa0820000, 0x24070020, 0x8fa3001c, -0x3c040001, 0x248460ec, 0x24120020, 0x3c010001, -0xac316f2c, 0x2c620020, 0x1440001d, 0x27b10018, -0x8fb00018, 0x24053000, 0x3c060001, 0x24c66fd0, -0xafa70010, 0xafa30014, 0xc002b17, 0x2003821, -0x8fa30018, 0x3c040001, 0x24846fd0, 0x24650020, +0xc002b3b, 0xa0820000, 0x24070020, 0x8fa3001c, +0x3c040001, 0x2484605c, 0x24120020, 0x3c010001, +0xac316eb0, 0x2c620020, 0x1440001d, 0x27b10018, +0x8fb00018, 0x24053000, 0x3c060001, 0x24c66f50, +0xafa70010, 0xafa30014, 0xc002b3b, 0x2003821, +0x8fa30018, 0x3c040001, 0x24846f50, 0x24650020, 0x65102b, 0x10400007, 0x0, 0x8c820000, 0xac620000, 0x24630004, 0x65102b, 0x1440fffb, 0x24840004, 0x8fa2001c, 0x521023, 0xafa2001c, 0x8e220000, 0x521021, 0x1000000b, 0xae220000, -0x3c100001, 0x26106fd0, 0x24053100, 0xafa70010, +0x3c100001, 0x26106f50, 0x24053100, 0xafa70010, 0xafa30014, 0x8fa70018, 0x2003021, 0x2402002d, -0xc002b17, 0xa0820000, 0x24070020, 0x3c040001, -0x24846100, 0x8fa3001c, 0x24120020, 0x3c010001, -0xac306f60, 0x2c620020, 0x1440001d, 0x27b10018, -0x8fb00018, 0x24053000, 0x3c060001, 0x24c66ff0, -0xafa70010, 0xafa30014, 0xc002b17, 0x2003821, -0x8fa30018, 0x3c040001, 0x24846ff0, 0x24650020, +0xc002b3b, 0xa0820000, 0x24070020, 0x3c040001, +0x24846070, 0x8fa3001c, 0x24120020, 0x3c010001, +0xac306ee4, 0x2c620020, 0x1440001d, 0x27b10018, +0x8fb00018, 0x24053000, 0x3c060001, 0x24c66f70, +0xafa70010, 0xafa30014, 0xc002b3b, 0x2003821, +0x8fa30018, 0x3c040001, 0x24846f70, 0x24650020, 0x65102b, 0x10400007, 0x0, 0x8c820000, 0xac620000, 0x24630004, 0x65102b, 0x1440fffb, 0x24840004, 0x8fa2001c, 0x521023, 0xafa2001c, 0x8e220000, 0x521021, 0x1000000b, 0xae220000, -0x3c100001, 0x26106ff0, 0x24053100, 0xafa70010, +0x3c100001, 0x26106f70, 0x24053100, 0xafa70010, 0xafa30014, 0x8fa70018, 0x2003021, 0x2402002d, -0xc002b17, 0xa0820000, 0x3c010001, 0x10000031, -0xac306f5c, 0x3c100001, 0x261081bf, 0x3c120001, -0x2652803c, 0x2121023, 0x438024, 0x8fa3001c, -0x3c040001, 0x24846114, 0x70102b, 0x1440001a, +0xc002b3b, 0xa0820000, 0x3c010001, 0x10000031, +0xac306ee0, 0x3c100001, 0x2610821f, 0x3c120001, +0x2652809c, 0x2121023, 0x438024, 0x8fa3001c, +0x3c040001, 0x24846084, 0x70102b, 0x1440001a, 0x27b30018, 0x8fb10018, 0x24053000, 0x2403021, -0xafb00010, 0xafa30014, 0xc002b17, 0x2203821, +0xafb00010, 0xafa30014, 0xc002b3b, 0x2203821, 0x8fa30018, 0x702021, 0x64102b, 0x10400007, 0x2403021, 0x8cc20000, 0xac620000, 0x24630004, 0x64102b, 0x1440fffb, 0x24c60004, 0x8fa2001c, 0x501023, 0xafa2001c, 0x8e620000, 0x501021, 0x1000000a, 0xae620000, 0x2408821, 0x24053100, 0xafb00010, 0xafa30014, 0x8fa70018, 0x2203021, -0x2402002d, 0xc002b17, 0xa0820000, 0x3c010001, -0xac316f2c, 0x3c030001, 0x8c636f2c, 0x24020400, +0x2402002d, 0xc002b3b, 0xa0820000, 0x3c010001, +0xac316eb0, 0x3c030001, 0x8c636eb0, 0x24020400, 0x60f809, 0xaf820070, 0x8fbf0030, 0x8fb3002c, 0x8fb20028, 0x8fb10024, 0x8fb00020, 0x3e00008, 0x27bd0038, 0x0, 0x0, 0x8f820040, @@ -5197,21 +5198,21 @@ 0xaf820078, 0x27bdffe8, 0xafbf0010, 0x8f820054, 0x244203e8, 0xaf820058, 0x3c020800, 0x2c21024, 0x10400004, 0x3c02f7ff, 0x3442ffff, 0x2c2b024, -0x36940040, 0x3c020001, 0x8c426e28, 0x10400017, -0x3c020200, 0x3c030001, 0x8c636f98, 0x10600016, -0x282a025, 0x3c020001, 0x8c426ec4, 0x14400012, -0x3c020200, 0x3c020001, 0x8c426e14, 0x30420003, +0x36940040, 0x3c020001, 0x8c426da8, 0x10400017, +0x3c020200, 0x3c030001, 0x8c636f1c, 0x10600016, +0x282a025, 0x3c020001, 0x8c426e44, 0x14400012, +0x3c020200, 0x3c020001, 0x8c426d94, 0x30420003, 0x1440000d, 0x3c020200, 0x8f830224, 0x3c020002, -0x8c42906c, 0x10620008, 0x3c020200, 0xc003d87, -0x0, 0x10000004, 0x3c020200, 0xc004161, +0x8c428fec, 0x10620008, 0x3c020200, 0xc003daf, +0x0, 0x10000004, 0x3c020200, 0xc004196, 0x0, 0x3c020200, 0x2c21024, 0x10400003, -0x0, 0xc001f33, 0x0, 0x8f4200d8, +0x0, 0xc001f4b, 0x0, 0x8f4200d8, 0x8f4300dc, 0x24420001, 0xaf4200d8, 0x43102b, 0x14400003, 0x0, 0xaf4000d8, 0x36940080, 0x8c030238, 0x1060000c, 0x0, 0x8f4201b0, 0x244203e8, 0xaf4201b0, 0x43102b, 0x14400006, 0x0, 0x934205c5, 0x14400003, 0x0, -0xc001d88, 0x0, 0x8fbf0010, 0x3e00008, +0xc001da0, 0x0, 0x8fbf0010, 0x3e00008, 0x27bd0018, 0x3e00008, 0x0, 0x27bdffd8, 0xafbf0020, 0x8f43002c, 0x8f420038, 0x10620059, 0x0, 0x3c020001, 0x571021, 0x904240f0, @@ -5220,8 +5221,8 @@ 0xafa30014, 0xafa80018, 0x8f42010c, 0x40f809, 0x24c6001c, 0x14400011, 0x24020001, 0x3c010001, 0x370821, 0xa02240f0, 0x8f820124, 0xafa20010, -0x8f820128, 0x3c040001, 0x248461b8, 0xafa20014, -0x8f46002c, 0x8f870120, 0x3c050009, 0xc002b17, +0x8f820128, 0x3c040001, 0x24846128, 0xafa20014, +0x8f46002c, 0x8f870120, 0x3c050009, 0xc002b3b, 0x34a50900, 0x1000005c, 0x0, 0x8f420300, 0x24420001, 0xaf420300, 0x8f420300, 0x8f42002c, 0xa34005c1, 0x10000027, 0xaf420038, 0x8f440170, @@ -5230,8 +5231,8 @@ 0x8f42010c, 0x40f809, 0x24c6001c, 0x14400011, 0x24020001, 0x3c010001, 0x370821, 0xa02240f1, 0x8f820124, 0xafa20010, 0x8f820128, 0x3c040001, -0x248461c4, 0xafa20014, 0x8f46002c, 0x8f870120, -0x3c050009, 0xc002b17, 0x34a51100, 0x10000036, +0x24846134, 0xafa20014, 0x8f46002c, 0x8f870120, +0x3c050009, 0xc002b3b, 0x34a51100, 0x10000036, 0x0, 0x8f420300, 0x8f43002c, 0x24420001, 0xaf420300, 0x8f420300, 0x24020001, 0xa34205c1, 0xaf430038, 0x3c010001, 0x370821, 0xa02040f1, @@ -5259,8 +5260,8 @@ 0xafa80018, 0x8f42010c, 0x40f809, 0x24c6001c, 0x14400011, 0x24020001, 0x3c010001, 0x370821, 0xa02240f2, 0x8f820124, 0xafa20010, 0x8f820128, -0x3c040001, 0x248461cc, 0xafa20014, 0x8f460044, -0x8f870120, 0x3c050009, 0xc002b17, 0x34a51300, +0x3c040001, 0x2484613c, 0xafa20014, 0x8f460044, +0x8f870120, 0x3c050009, 0xc002b3b, 0x34a51300, 0x1000000f, 0x0, 0x8f420304, 0x24420001, 0xaf420304, 0x8f420304, 0x8f420044, 0xaf42007c, 0x3c010001, 0x370821, 0xa02040f2, 0x10000004, @@ -5272,20 +5273,20 @@ 0x431024, 0xaf820060, 0x8f420000, 0x10400003, 0x0, 0x10000002, 0xaf80004c, 0xaf800048, 0x8fbf0020, 0x3e00008, 0x27bd0028, 0x3e00008, -0x0, 0x3c020001, 0x8c426e28, 0x27bdffa8, +0x0, 0x3c020001, 0x8c426da8, 0x27bdffa8, 0xafbf0050, 0xafbe004c, 0xafb50048, 0xafb30044, 0xafb20040, 0xafb1003c, 0xafb00038, 0x104000d5, 0x8f900044, 0x8f4200d0, 0x24430001, 0x2842000b, 0x144000e4, 0xaf4300d0, 0x8f420004, 0x30420002, 0x1440009c, 0xaf4000d0, 0x8f420004, 0x3c030001, -0x8c636e18, 0x34420002, 0xaf420004, 0x24020001, +0x8c636d98, 0x34420002, 0xaf420004, 0x24020001, 0x14620003, 0x3c020600, 0x10000002, 0x34423000, 0x34421000, 0xafa20020, 0x8f4a0018, 0xafaa0034, 0x27aa0020, 0xafaa002c, 0x8faa0034, 0x240200ff, 0x11420002, 0x1821, 0x25430001, 0x8c020228, 0x609821, 0x1662000e, 0x3c050009, 0x8f42033c, 0x24420001, 0xaf42033c, 0x8f42033c, 0x8c020228, -0x8fa70034, 0x3c040001, 0x2484619c, 0xafa00014, +0x8fa70034, 0x3c040001, 0x2484610c, 0xafa00014, 0xafa20010, 0x8fa60020, 0x10000070, 0x34a50500, 0x8faa0034, 0xa38c0, 0xf71021, 0x8fa30020, 0x8fa40024, 0xac4304c0, 0xac4404c4, 0x8f830054, @@ -5300,7 +5301,7 @@ 0x32a200ff, 0x54400018, 0xaf530018, 0x8f420378, 0x24420001, 0xaf420378, 0x8f420378, 0x8f820120, 0x8faa002c, 0x8fa70034, 0xafa20010, 0x8f820124, -0x3c040001, 0x248461a8, 0xafa20014, 0x8d460000, +0x3c040001, 0x24846118, 0xafa20014, 0x8d460000, 0x3c050009, 0x10000035, 0x34a50600, 0x8f420308, 0x24150001, 0x24420001, 0xaf420308, 0x8f420308, 0x1000001e, 0x32a200ff, 0x8f830054, 0x8f820054, @@ -5313,8 +5314,8 @@ 0x1440ffee, 0x0, 0x32a200ff, 0x14400011, 0x3c050009, 0x8f420378, 0x24420001, 0xaf420378, 0x8f420378, 0x8f820120, 0x8faa002c, 0x8fa70034, -0xafa20010, 0x8f820124, 0x3c040001, 0x248461b0, -0xafa20014, 0x8d460000, 0x34a50700, 0xc002b17, +0xafa20010, 0x8f820124, 0x3c040001, 0x24846120, +0xafa20014, 0x8d460000, 0x34a50700, 0xc002b3b, 0x0, 0x8f4202ec, 0x24420001, 0xaf4202ec, 0x8f4202ec, 0x8f420004, 0x30420001, 0x50400029, 0x36100040, 0x3c020400, 0x2c21024, 0x10400013, @@ -5337,19 +5338,19 @@ 0x8fbf0050, 0x8fbe004c, 0x8fb50048, 0x8fb30044, 0x8fb20040, 0x8fb1003c, 0x8fb00038, 0x3e00008, 0x27bd0058, 0x3e00008, 0x0, 0x3c020001, -0x8c426e28, 0x27bdffb0, 0xafbf0048, 0xafbe0044, +0x8c426da8, 0x27bdffb0, 0xafbf0048, 0xafbe0044, 0xafb50040, 0xafb3003c, 0xafb20038, 0xafb10034, 0x104000c7, 0xafb00030, 0x8f4200d0, 0x24430001, 0x2842000b, 0x144000da, 0xaf4300d0, 0x8f420004, 0x30420002, 0x14400097, 0xaf4000d0, 0x8f420004, -0x3c030001, 0x8c636e18, 0x34420002, 0xaf420004, +0x3c030001, 0x8c636d98, 0x34420002, 0xaf420004, 0x24020001, 0x14620003, 0x3c020600, 0x10000002, 0x34423000, 0x34421000, 0xafa20020, 0x1821, 0x8f5e0018, 0x27aa0020, 0x240200ff, 0x13c20002, 0xafaa002c, 0x27c30001, 0x8c020228, 0x609021, 0x1642000e, 0x1e38c0, 0x8f42033c, 0x24420001, 0xaf42033c, 0x8f42033c, 0x8c020228, 0x3c040001, -0x2484619c, 0x3c050009, 0xafa00014, 0xafa20010, +0x2484610c, 0x3c050009, 0xafa00014, 0xafa20010, 0x8fa60020, 0x1000006d, 0x34a50500, 0xf71021, 0x8fa30020, 0x8fa40024, 0xac4304c0, 0xac4404c4, 0x8f830054, 0x8f820054, 0x247003e8, 0x2021023, @@ -5363,7 +5364,7 @@ 0x0, 0x326200ff, 0x54400017, 0xaf520018, 0x8f420378, 0x24420001, 0xaf420378, 0x8f420378, 0x8f820120, 0x8faa002c, 0xafa20010, 0x8f820124, -0x3c040001, 0x248461a8, 0x3c050009, 0xafa20014, +0x3c040001, 0x24846118, 0x3c050009, 0xafa20014, 0x8d460000, 0x10000035, 0x34a50600, 0x8f420308, 0x24130001, 0x24420001, 0xaf420308, 0x8f420308, 0x1000001e, 0x326200ff, 0x8f830054, 0x8f820054, @@ -5376,43 +5377,43 @@ 0x1440ffee, 0x0, 0x326200ff, 0x14400011, 0x0, 0x8f420378, 0x24420001, 0xaf420378, 0x8f420378, 0x8f820120, 0x8faa002c, 0xafa20010, -0x8f820124, 0x3c040001, 0x248461b0, 0x3c050009, -0xafa20014, 0x8d460000, 0x34a50700, 0xc002b17, +0x8f820124, 0x3c040001, 0x24846120, 0x3c050009, +0xafa20014, 0x8d460000, 0x34a50700, 0xc002b3b, 0x3c03821, 0x8f4202ec, 0x24420001, 0xaf4202ec, 0x8f4202ec, 0x8f420004, 0x30420001, 0x10400018, 0x24040001, 0x8f420250, 0x8f430254, 0x8f4501b4, -0x3c010001, 0x14650006, 0xa0246d71, 0x8f420270, +0x3c010001, 0x14650006, 0xa0246cf1, 0x8f420270, 0x8f430274, 0x8f4401b8, 0x10640021, 0x0, -0x8f420250, 0x8f430254, 0x3c040001, 0x90846d70, +0x8f420250, 0x8f430254, 0x3c040001, 0x90846cf0, 0x8f460270, 0x8f470274, 0x38840001, 0xaf4301b4, -0xaf4701b8, 0x3c010001, 0x10000025, 0xa0246d70, -0x8f4200d4, 0x3c010001, 0xa0206d70, 0x24430001, +0xaf4701b8, 0x3c010001, 0x10000025, 0xa0246cf0, +0x8f4200d4, 0x3c010001, 0xa0206cf0, 0x24430001, 0x28420033, 0x1440001e, 0xaf4300d4, 0x3c020001, -0x90426d71, 0xaf4000d4, 0x10000017, 0x38420001, +0x90426cf1, 0xaf4000d4, 0x10000017, 0x38420001, 0x8f420004, 0x30420001, 0x10400008, 0x0, -0xc00567e, 0x2021, 0x3c010001, 0xa0206d71, -0x3c010001, 0x1000000e, 0xa0206d70, 0x8f4200d4, -0x3c010001, 0xa0206d70, 0x24430001, 0x284201f5, -0x14400007, 0xaf4300d4, 0x3c020001, 0x90426d71, -0xaf4000d4, 0x421026, 0x3c010001, 0xa0226d71, -0x3c030001, 0x8c636e18, 0x24020002, 0x1462000c, -0x3c030002, 0x3c030001, 0x90636d71, 0x24020001, -0x5462001f, 0x2021, 0x3c020001, 0x90426d70, +0xc00565a, 0x2021, 0x3c010001, 0xa0206cf1, +0x3c010001, 0x1000000e, 0xa0206cf0, 0x8f4200d4, +0x3c010001, 0xa0206cf0, 0x24430001, 0x284201f5, +0x14400007, 0xaf4300d4, 0x3c020001, 0x90426cf1, +0xaf4000d4, 0x421026, 0x3c010001, 0xa0226cf1, +0x3c030001, 0x8c636d98, 0x24020002, 0x1462000c, +0x3c030002, 0x3c030001, 0x90636cf1, 0x24020001, +0x5462001f, 0x2021, 0x3c020001, 0x90426cf0, 0x1443001b, 0x24040005, 0x10000019, 0x24040006, -0x3c020002, 0x8c429074, 0x431024, 0x1040000b, -0x24020001, 0x3c030001, 0x90636d71, 0x54620010, -0x2021, 0x3c020001, 0x90426d70, 0x1443000c, +0x3c020002, 0x8c428ff4, 0x431024, 0x1040000b, +0x24020001, 0x3c030001, 0x90636cf1, 0x54620010, +0x2021, 0x3c020001, 0x90426cf0, 0x1443000c, 0x24040003, 0x1000000a, 0x24040004, 0x3c030001, -0x90636d71, 0x14620006, 0x2021, 0x3c020001, -0x90426d70, 0x24040001, 0x50440001, 0x24040002, -0xc00567e, 0x0, 0x2402ff7f, 0x282a024, +0x90636cf1, 0x14620006, 0x2021, 0x3c020001, +0x90426cf0, 0x24040001, 0x50440001, 0x24040002, +0xc00565a, 0x0, 0x2402ff7f, 0x282a024, 0x8fbf0048, 0x8fbe0044, 0x8fb50040, 0x8fb3003c, 0x8fb20038, 0x8fb10034, 0x8fb00030, 0x3e00008, 0x27bd0050, 0x3e00008, 0x0, 0x3c020001, -0x8c426e28, 0x27bdffb0, 0xafbf0048, 0xafbe0044, +0x8c426da8, 0x27bdffb0, 0xafbf0048, 0xafbe0044, 0xafb50040, 0xafb3003c, 0xafb20038, 0xafb10034, 0x104000de, 0xafb00030, 0x8f4200d0, 0x3c040001, -0x8c846e18, 0x24430001, 0x2842000b, 0xaf4400e8, +0x8c846d98, 0x24430001, 0x2842000b, 0xaf4400e8, 0x144000fe, 0xaf4300d0, 0x8f420004, 0x30420002, 0x14400095, 0xaf4000d0, 0x8f420004, 0x34420002, 0xaf420004, 0x24020001, 0x14820003, 0x3c020600, @@ -5421,7 +5422,7 @@ 0x13c20002, 0xafaa002c, 0x27c30001, 0x8c020228, 0x609021, 0x1642000e, 0x1e38c0, 0x8f42033c, 0x24420001, 0xaf42033c, 0x8f42033c, 0x8c020228, -0x3c040001, 0x2484619c, 0x3c050009, 0xafa00014, +0x3c040001, 0x2484610c, 0x3c050009, 0xafa00014, 0xafa20010, 0x8fa60020, 0x1000006d, 0x34a50500, 0xf71021, 0x8fa30020, 0x8fa40024, 0xac4304c0, 0xac4404c4, 0x8f830054, 0x8f820054, 0x247003e8, @@ -5435,7 +5436,7 @@ 0x1440ffe9, 0x0, 0x326200ff, 0x54400017, 0xaf520018, 0x8f420378, 0x24420001, 0xaf420378, 0x8f420378, 0x8f820120, 0x8faa002c, 0xafa20010, -0x8f820124, 0x3c040001, 0x248461a8, 0x3c050009, +0x8f820124, 0x3c040001, 0x24846118, 0x3c050009, 0xafa20014, 0x8d460000, 0x10000035, 0x34a50600, 0x8f420308, 0x24130001, 0x24420001, 0xaf420308, 0x8f420308, 0x1000001e, 0x326200ff, 0x8f830054, @@ -5448,9 +5449,9 @@ 0x2c4203e9, 0x1440ffee, 0x0, 0x326200ff, 0x14400011, 0x0, 0x8f420378, 0x24420001, 0xaf420378, 0x8f420378, 0x8f820120, 0x8faa002c, -0xafa20010, 0x8f820124, 0x3c040001, 0x248461b0, +0xafa20010, 0x8f820124, 0x3c040001, 0x24846120, 0x3c050009, 0xafa20014, 0x8d460000, 0x34a50700, -0xc002b17, 0x3c03821, 0x8f4202ec, 0x24420001, +0xc002b3b, 0x3c03821, 0x8f4202ec, 0x24420001, 0xaf4202ec, 0x8f4202ec, 0x8f420004, 0x30420001, 0x10400033, 0x3c020400, 0x2c21024, 0x10400017, 0x0, 0x934205c0, 0x8f440250, 0x8f450254, @@ -5480,7 +5481,7 @@ 0x8f4300e8, 0x3042007f, 0xa34205c0, 0x24020001, 0x14620005, 0x0, 0x934405c0, 0x42102, 0x10000003, 0x348400f0, 0x934405c0, 0x3484000f, -0xc005664, 0x0, 0x2402ff7f, 0x282a024, +0xc005640, 0x0, 0x2402ff7f, 0x282a024, 0x8fbf0048, 0x8fbe0044, 0x8fb50040, 0x8fb3003c, 0x8fb20038, 0x8fb10034, 0x8fb00030, 0x3e00008, 0x27bd0050, 0x3e00008, 0x0, 0x27bdffb0, @@ -5533,7 +5534,7 @@ 0xafaa002c, 0x27c30001, 0x8c020228, 0x609021, 0x1642000e, 0x1e38c0, 0x8f42033c, 0x24420001, 0xaf42033c, 0x8f42033c, 0x8c020228, 0x3c040001, -0x2484619c, 0x3c050009, 0xafa00014, 0xafa20010, +0x2484610c, 0x3c050009, 0xafa00014, 0xafa20010, 0x8fa60020, 0x1000006b, 0x34a50500, 0xf71021, 0x8fa30020, 0x8fa40024, 0xac4304c0, 0xac4404c4, 0x8f830054, 0x8f820054, 0x247003e8, 0x2021023, @@ -5547,7 +5548,7 @@ 0x0, 0x326200ff, 0x54400017, 0xaf520018, 0x8f420378, 0x24420001, 0xaf420378, 0x8f420378, 0x8f820120, 0x8faa002c, 0xafa20010, 0x8f820124, -0x3c040001, 0x248461a8, 0x3c050009, 0xafa20014, +0x3c040001, 0x24846118, 0x3c050009, 0xafa20014, 0x8d460000, 0x10000033, 0x34a50600, 0x8f420308, 0x24130001, 0x24420001, 0xaf420308, 0x8f420308, 0x1000001c, 0x326200ff, 0x8f830054, 0x8f820054, @@ -5560,13 +5561,13 @@ 0x326200ff, 0x54400012, 0x24020001, 0x8f420378, 0x24420001, 0xaf420378, 0x8f420378, 0x8f820120, 0x8faa002c, 0xafa20010, 0x8f820124, 0x3c040001, -0x248461b0, 0x3c050009, 0xafa20014, 0x8d460000, -0x34a50700, 0xc002b17, 0x3c03821, 0x1021, +0x24846120, 0x3c050009, 0xafa20014, 0x8d460000, +0x34a50700, 0xc002b3b, 0x3c03821, 0x1021, 0x1440005b, 0x24020001, 0x10000065, 0x0, 0x8f510018, 0x240200ff, 0x12220002, 0x8021, 0x26300001, 0x8c020228, 0x1602000e, 0x1130c0, 0x8f42033c, 0x24420001, 0xaf42033c, 0x8f42033c, -0x8c020228, 0x3c040001, 0x24846184, 0x3c050009, +0x8c020228, 0x3c040001, 0x248460f4, 0x3c050009, 0xafa00014, 0xafa20010, 0x8fa60020, 0x1000003f, 0x34a50100, 0xd71021, 0x8fa30020, 0x8fa40024, 0xac4304c0, 0xac4404c4, 0xc01821, 0x8f440178, @@ -5575,15 +5576,15 @@ 0xafa80018, 0x8f48010c, 0x24070008, 0xa32821, 0xa3482b, 0x822021, 0x100f809, 0x892021, 0x1440000b, 0x24070008, 0x8f820120, 0xafa20010, -0x8f820124, 0x3c040001, 0x2484618c, 0x3c050009, +0x8f820124, 0x3c040001, 0x248460fc, 0x3c050009, 0xafa20014, 0x8fa60020, 0x1000001c, 0x34a50200, 0x8f440160, 0x8f450164, 0x8f43000c, 0xaf500018, 0x8f860120, 0x24020010, 0xafa20010, 0xafb00014, 0xafa30018, 0x8f42010c, 0x40f809, 0x24c6001c, 0x54400011, 0x24020001, 0x8f420340, 0x24420001, 0xaf420340, 0x8f420340, 0x8f820120, 0xafa20010, -0x8f820124, 0x3c040001, 0x24846194, 0x3c050009, -0xafa20014, 0x8fa60020, 0x34a50300, 0xc002b17, +0x8f820124, 0x3c040001, 0x24846104, 0x3c050009, +0xafa20014, 0x8fa60020, 0x34a50300, 0xc002b3b, 0x2203821, 0x1021, 0x1040000d, 0x24020001, 0x8f4202e8, 0xa34005c6, 0xaf4001b0, 0x24420001, 0xaf4202e8, 0x8f4202e8, 0x8ee20150, 0x24420001, @@ -5603,11 +5604,11 @@ 0x14620005, 0x0, 0x8f430130, 0x8f8200b4, 0x10620010, 0x0, 0x8f820104, 0xaf420128, 0x8f8200b4, 0x8f430128, 0xaf420130, 0xafa30010, -0x8f420130, 0x3c040001, 0x248461d4, 0xafa20014, +0x8f420130, 0x3c040001, 0x24846144, 0xafa20014, 0x8f86011c, 0x8f8700b0, 0x3c050005, 0x10000031, 0x34a50900, 0x8f420128, 0xafa20010, 0x8f420130, -0x3c040001, 0x248461e0, 0xafa20014, 0x8f86011c, -0x8f8700b0, 0x3c050005, 0xc002b17, 0x34a51000, +0x3c040001, 0x24846150, 0xafa20014, 0x8f86011c, +0x8f8700b0, 0x3c050005, 0xc002b3b, 0x34a51000, 0x8f82011c, 0x34420002, 0xaf82011c, 0x8f830104, 0x8f8200b0, 0x34420001, 0xaf8200b0, 0x24020008, 0xaf830104, 0xafa20010, 0xafa00014, 0x8f42000c, @@ -5615,9 +5616,9 @@ 0x26e60028, 0x40f809, 0x24070400, 0x8f82011c, 0x2403fffd, 0x431024, 0xaf82011c, 0x8ee201dc, 0x24420001, 0xaee201dc, 0x8ee201dc, 0x8f420128, -0xafa20010, 0x8f420130, 0x3c040001, 0x248461ec, +0xafa20010, 0x8f420130, 0x3c040001, 0x2484615c, 0xafa20014, 0x8f86011c, 0x8f8700b0, 0x3c050005, -0x34a51100, 0xc002b17, 0x0, 0x8f8200a0, +0x34a51100, 0xc002b3b, 0x0, 0x8f8200a0, 0x30420004, 0x10400069, 0x0, 0x8f43012c, 0x8f820124, 0x14620005, 0x0, 0x8f430134, 0x8f8200a4, 0x10620006, 0x0, 0x8f820124, @@ -5630,21 +5631,21 @@ 0x0, 0x8f430134, 0x8f8200a4, 0x10620010, 0x0, 0x8f820124, 0xaf42012c, 0x8f8200a4, 0x8f43012c, 0xaf420134, 0xafa30010, 0x8f420134, -0x3c040001, 0x248461f8, 0xafa20014, 0x8f86011c, +0x3c040001, 0x24846168, 0xafa20014, 0x8f86011c, 0x8f8700a0, 0x3c050005, 0x10000032, 0x34a51200, 0x8f42012c, 0xafa20010, 0x8f420134, 0x3c040001, -0x24846204, 0xafa20014, 0x8f86011c, 0x8f8700a0, -0x3c050005, 0xc002b17, 0x34a51300, 0x8f82011c, +0x24846174, 0xafa20014, 0x8f86011c, 0x8f8700a0, +0x3c050005, 0xc002b3b, 0x34a51300, 0x8f82011c, 0x34420002, 0xaf82011c, 0x8f830124, 0x8f8200a0, 0x34420001, 0xaf8200a0, 0x24020080, 0xaf830124, 0xafa20010, 0xafa00014, 0x8f420014, 0x8c040208, 0x8c05020c, 0xafa20018, 0x8f420108, 0x3c060001, -0x24c66f54, 0x40f809, 0x24070004, 0x8f82011c, +0x24c66ed8, 0x40f809, 0x24070004, 0x8f82011c, 0x2403fffd, 0x431024, 0xaf82011c, 0x8ee201dc, 0x24420001, 0xaee201dc, 0x8ee201dc, 0x8f42012c, -0xafa20010, 0x8f420134, 0x3c040001, 0x24846210, +0xafa20010, 0x8f420134, 0x3c040001, 0x24846180, 0xafa20014, 0x8f86011c, 0x8f8700a0, 0x3c050005, -0x34a51400, 0xc002b17, 0x0, 0x8fbf0020, +0x34a51400, 0xc002b3b, 0x0, 0x8fbf0020, 0x3e00008, 0x27bd0028, 0x3c081000, 0x24070001, 0x3c060080, 0x3c050100, 0x8f820070, 0x481024, 0x1040fffd, 0x0, 0x8f820054, 0x24420005, @@ -5712,8 +5713,8 @@ 0xaf80004c, 0x1000006a, 0xaf800048, 0x30c20001, 0x10400004, 0x24020001, 0xaf820064, 0x10000064, 0x0, 0x30c20002, 0x1440000b, 0x3c050003, -0x3c040001, 0x248462d4, 0x34a50500, 0x3821, -0xafa00010, 0xc002b17, 0xafa00014, 0x2402ffc0, +0x3c040001, 0x24846244, 0x34a50500, 0x3821, +0xafa00010, 0xc002b3b, 0xafa00014, 0x2402ffc0, 0x10000057, 0xaf820064, 0x8c05022c, 0x8c02010c, 0x10a20048, 0x51080, 0x8c460300, 0x24a20001, 0x3045003f, 0x24020003, 0xac05022c, 0x61e02, @@ -5732,7 +5733,7 @@ 0xaf800048, 0x8f820048, 0x1040fffd, 0x0, 0x8f820060, 0x34420100, 0xaf820060, 0x8f420000, 0x10400003, 0x0, 0x10000006, 0xaf80004c, -0x10000004, 0xaf800048, 0xc00217e, 0xc02021, +0x10000004, 0xaf800048, 0xc002196, 0xc02021, 0x402821, 0x8c02010c, 0x14a20002, 0x24020002, 0xaf820064, 0x8f820064, 0x30420002, 0x14400004, 0x0, 0x8c02010c, 0x14a2ffac, 0x0, @@ -5740,196 +5741,199 @@ 0x0, 0x27bdffa0, 0xafb00040, 0x808021, 0x101602, 0x2442ffff, 0x304300ff, 0x2c620013, 0xafbf0058, 0xafbe0054, 0xafb50050, 0xafb3004c, -0xafb20048, 0xafb10044, 0x104001ec, 0xafa50034, -0x31080, 0x3c010001, 0x220821, 0x8c226318, +0xafb20048, 0xafb10044, 0x104001f3, 0xafa50034, +0x31080, 0x3c010001, 0x220821, 0x8c226288, 0x400008, 0x0, 0x101302, 0x30440fff, -0x24020001, 0x10820005, 0x24020002, 0x1082000a, -0x2402fffe, 0x10000021, 0x3c050003, 0x8f430004, -0x3c020001, 0x8c426f80, 0xaf440200, 0xaf440204, -0x10000007, 0x34630001, 0x8f430004, 0xaf440200, -0xaf440204, 0x621824, 0x3c020001, 0x2442c9c8, +0x24020001, 0x10820005, 0x24020002, 0x1082000c, +0x2402fffe, 0x10000024, 0x3c050003, 0x8f430004, +0x3c020001, 0x8c426f04, 0xaf440200, 0xaf440204, +0x3c040001, 0x8c846e80, 0x10000009, 0x34630001, +0x8f430004, 0xaf440200, 0xaf440204, 0x3c040001, +0x8c846e80, 0x621824, 0x3c020001, 0x2442ca28, 0x21100, 0x21182, 0xaf430004, 0x3c030800, -0x431025, 0x3c010000, 0xac224138, 0x8f840054, -0x41442, 0x41c82, 0x431021, 0x41cc2, -0x431023, 0x41d02, 0x431021, 0x41d42, -0x431023, 0x10000009, 0xaf420208, 0x3c040001, -0x248462e0, 0x34a51000, 0x2003021, 0x3821, -0xafa00010, 0xc002b17, 0xafa00014, 0x8f4202a0, -0x24420001, 0xaf4202a0, 0x1000021b, 0x8f4202a0, -0x27b00028, 0x2002021, 0x24050210, 0xc002b9b, -0x24060008, 0xc0024f4, 0x2002021, 0x10000212, -0x0, 0x8faa0034, 0x27a40028, 0xa1880, -0x25420001, 0x3042003f, 0xafa20034, 0x8c650300, -0x8faa0034, 0x21080, 0x8c430300, 0x25420001, -0x3042003f, 0xafa20034, 0xac02022c, 0xafa50028, -0xc0024f4, 0xafa3002c, 0x100001ff, 0x0, -0x27b00028, 0x2002021, 0x24050210, 0xc002b9b, -0x24060008, 0xc002633, 0x2002021, 0x100001f6, -0x0, 0x8faa0034, 0x27a40028, 0xa1880, -0x25420001, 0x3042003f, 0xafa20034, 0x8c650300, -0x8faa0034, 0x21080, 0x8c430300, 0x25420001, -0x3042003f, 0xafa20034, 0xac02022c, 0xafa50028, -0xc002633, 0xafa3002c, 0x100001e3, 0x0, -0x101302, 0x30430fff, 0x24020001, 0x10620005, -0x24020002, 0x1062001e, 0x3c020002, 0x10000033, -0x3c050003, 0x3c030002, 0x2c31024, 0x54400037, -0x2c3b025, 0x8f820228, 0x3c010001, 0x370821, -0xac2238d8, 0x8f82022c, 0x3c010001, 0x370821, -0xac2238dc, 0x8f820230, 0x3c010001, 0x370821, -0xac2238e0, 0x8f820234, 0x3c010001, 0x370821, -0xac2238e4, 0x2402ffff, 0xaf820228, 0xaf82022c, -0xaf820230, 0xaf820234, 0x10000020, 0x2c3b025, -0x2c21024, 0x10400012, 0x3c02fffd, 0x3c020001, -0x571021, 0x8c4238d8, 0xaf820228, 0x3c020001, -0x571021, 0x8c4238dc, 0xaf82022c, 0x3c020001, -0x571021, 0x8c4238e0, 0xaf820230, 0x3c020001, -0x571021, 0x8c4238e4, 0xaf820234, 0x3c02fffd, -0x3442ffff, 0x10000009, 0x2c2b024, 0x3c040001, -0x248462ec, 0x34a51100, 0x2003021, 0x3821, -0xafa00010, 0xc002b17, 0xafa00014, 0x8f4202cc, -0x24420001, 0xaf4202cc, 0x1000019b, 0x8f4202cc, -0x101302, 0x30450fff, 0x24020001, 0x10a20005, -0x24020002, 0x10a2000d, 0x3c0408ff, 0x10000014, -0x3c050003, 0x3c0208ff, 0x3442ffff, 0x8f830220, -0x3c040004, 0x2c4b025, 0x621824, 0x34630008, -0xaf830220, 0x10000012, 0xaf450298, 0x3484fff7, -0x3c03fffb, 0x8f820220, 0x3463ffff, 0x2c3b024, -0x441024, 0xaf820220, 0x10000009, 0xaf450298, -0x3c040001, 0x248462f8, 0x34a51200, 0x2003021, -0x3821, 0xafa00010, 0xc002b17, 0xafa00014, -0x8f4202bc, 0x24420001, 0xaf4202bc, 0x10000172, -0x8f4202bc, 0x27840208, 0x24050200, 0xc002b9b, -0x24060008, 0x27440224, 0x24050200, 0xc002b9b, -0x24060008, 0x8f4202c4, 0x24420001, 0xaf4202c4, -0x10000165, 0x8f4202c4, 0x101302, 0x30430fff, -0x24020001, 0x10620011, 0x28620002, 0x50400005, -0x24020002, 0x10600007, 0x0, 0x10000017, -0x0, 0x1062000f, 0x0, 0x10000013, -0x0, 0x8c060248, 0x2021, 0xc005134, -0x24050004, 0x10000007, 0x0, 0x8c060248, -0x2021, 0xc005134, 0x24050004, 0x10000010, -0x0, 0x8c06024c, 0x2021, 0xc005134, -0x24050001, 0x1000000a, 0x0, 0x3c040001, -0x24846304, 0x3c050003, 0x34a51300, 0x2003021, -0x3821, 0xafa00010, 0xc002b17, 0xafa00014, -0x8f4202c0, 0x24420001, 0xaf4202c0, 0x10000136, -0x8f4202c0, 0xc002407, 0x0, 0x10000132, -0x0, 0x24020001, 0xa34205c5, 0x24100100, -0x8f4401a8, 0x8f4501ac, 0xafb00010, 0xafa00014, -0x8f420014, 0xafa20018, 0x8f420108, 0x26e60028, -0x40f809, 0x24070400, 0x1040fff5, 0x0, -0x10000121, 0x0, 0x3c02ffff, 0x34427fff, -0x2c2b024, 0x1821, 0x3c020900, 0xaf400058, -0xaf40005c, 0xaf400060, 0xaf400064, 0xaf400360, -0xafa20020, 0x8f5e0018, 0x27aa0020, 0x240200ff, -0x13c20002, 0xafaa003c, 0x27c30001, 0x8c020228, -0x609021, 0x1642000e, 0x1e38c0, 0x8f42033c, -0x24420001, 0xaf42033c, 0x8f42033c, 0x8c020228, -0x3c040001, 0x2484629c, 0x3c050009, 0xafa00014, -0xafa20010, 0x8fa60020, 0x1000006b, 0x34a50500, -0xf71021, 0x8fa30020, 0x8fa40024, 0xac4304c0, -0xac4404c4, 0x8f830054, 0x8f820054, 0x247003e8, -0x2021023, 0x2c4203e9, 0x1040001b, 0x9821, -0xe08821, 0x263504c0, 0x8f440178, 0x8f45017c, -0x2201821, 0x240a0004, 0xafaa0010, 0xafb20014, -0x8f48000c, 0x1021, 0x2f53021, 0xafa80018, -0x8f48010c, 0x24070008, 0xa32821, 0xa3482b, -0x822021, 0x100f809, 0x892021, 0x54400006, -0x24130001, 0x8f820054, 0x2021023, 0x2c4203e9, -0x1440ffe9, 0x0, 0x326200ff, 0x54400017, -0xaf520018, 0x8f420378, 0x24420001, 0xaf420378, -0x8f420378, 0x8f820120, 0x8faa003c, 0xafa20010, -0x8f820124, 0x3c040001, 0x248462a8, 0x3c050009, -0xafa20014, 0x8d460000, 0x10000033, 0x34a50600, -0x8f420308, 0x24130001, 0x24420001, 0xaf420308, -0x8f420308, 0x1000001c, 0x326200ff, 0x8f830054, -0x8f820054, 0x247003e8, 0x2021023, 0x2c4203e9, -0x10400014, 0x9821, 0x24110010, 0x8f42000c, -0x8f440160, 0x8f450164, 0x8f860120, 0xafb10010, -0xafb20014, 0xafa20018, 0x8f42010c, 0x24070008, -0x40f809, 0x24c6001c, 0x1440ffe5, 0x0, -0x8f820054, 0x2021023, 0x2c4203e9, 0x1440ffef, -0x0, 0x326200ff, 0x14400011, 0x0, +0x431025, 0xac820038, 0x8f840054, 0x41442, +0x41c82, 0x431021, 0x41cc2, 0x431023, +0x41d02, 0x431021, 0x41d42, 0x431023, +0x10000009, 0xaf420208, 0x3c040001, 0x24846250, +0x34a51000, 0x2003021, 0x3821, 0xafa00010, +0xc002b3b, 0xafa00014, 0x8f4202a0, 0x24420001, +0xaf4202a0, 0x1000021f, 0x8f4202a0, 0x27b00028, +0x2002021, 0x24050210, 0xc002bbf, 0x24060008, +0xc002518, 0x2002021, 0x10000216, 0x0, +0x8faa0034, 0x27a40028, 0xa1880, 0x25420001, +0x3042003f, 0xafa20034, 0x8c650300, 0x8faa0034, +0x21080, 0x8c430300, 0x25420001, 0x3042003f, +0xafa20034, 0xac02022c, 0xafa50028, 0xc002518, +0xafa3002c, 0x10000203, 0x0, 0x27b00028, +0x2002021, 0x24050210, 0xc002bbf, 0x24060008, +0xc002657, 0x2002021, 0x100001fa, 0x0, +0x8faa0034, 0x27a40028, 0xa1880, 0x25420001, +0x3042003f, 0xafa20034, 0x8c650300, 0x8faa0034, +0x21080, 0x8c430300, 0x25420001, 0x3042003f, +0xafa20034, 0xac02022c, 0xafa50028, 0xc002657, +0xafa3002c, 0x100001e7, 0x0, 0x101302, +0x30430fff, 0x24020001, 0x10620005, 0x24020002, +0x1062001e, 0x3c020002, 0x10000033, 0x3c050003, +0x3c030002, 0x2c31024, 0x54400037, 0x2c3b025, +0x8f820228, 0x3c010001, 0x370821, 0xac2238d8, +0x8f82022c, 0x3c010001, 0x370821, 0xac2238dc, +0x8f820230, 0x3c010001, 0x370821, 0xac2238e0, +0x8f820234, 0x3c010001, 0x370821, 0xac2238e4, +0x2402ffff, 0xaf820228, 0xaf82022c, 0xaf820230, +0xaf820234, 0x10000020, 0x2c3b025, 0x2c21024, +0x10400012, 0x3c02fffd, 0x3c020001, 0x571021, +0x8c4238d8, 0xaf820228, 0x3c020001, 0x571021, +0x8c4238dc, 0xaf82022c, 0x3c020001, 0x571021, +0x8c4238e0, 0xaf820230, 0x3c020001, 0x571021, +0x8c4238e4, 0xaf820234, 0x3c02fffd, 0x3442ffff, +0x10000009, 0x2c2b024, 0x3c040001, 0x2484625c, +0x34a51100, 0x2003021, 0x3821, 0xafa00010, +0xc002b3b, 0xafa00014, 0x8f4202cc, 0x24420001, +0xaf4202cc, 0x1000019f, 0x8f4202cc, 0x101302, +0x30450fff, 0x24020001, 0x10a20005, 0x24020002, +0x10a2000d, 0x3c0408ff, 0x10000014, 0x3c050003, +0x3c0208ff, 0x3442ffff, 0x8f830220, 0x3c040004, +0x2c4b025, 0x621824, 0x34630008, 0xaf830220, +0x10000012, 0xaf450298, 0x3484fff7, 0x3c03fffb, +0x8f820220, 0x3463ffff, 0x2c3b024, 0x441024, +0xaf820220, 0x10000009, 0xaf450298, 0x3c040001, +0x24846268, 0x34a51200, 0x2003021, 0x3821, +0xafa00010, 0xc002b3b, 0xafa00014, 0x8f4202bc, +0x24420001, 0xaf4202bc, 0x10000176, 0x8f4202bc, +0x27840208, 0x24050200, 0xc002bbf, 0x24060008, +0x27440224, 0x24050200, 0xc002bbf, 0x24060008, +0x8f4202c4, 0x24420001, 0xaf4202c4, 0x10000169, +0x8f4202c4, 0x101302, 0x30430fff, 0x24020001, +0x10620011, 0x28620002, 0x50400005, 0x24020002, +0x10600007, 0x0, 0x10000017, 0x0, +0x1062000f, 0x0, 0x10000013, 0x0, +0x8c060248, 0x2021, 0xc005104, 0x24050004, +0x10000007, 0x0, 0x8c060248, 0x2021, +0xc005104, 0x24050004, 0x10000010, 0x0, +0x8c06024c, 0x2021, 0xc005104, 0x24050001, +0x1000000a, 0x0, 0x3c040001, 0x24846274, +0x3c050003, 0x34a51300, 0x2003021, 0x3821, +0xafa00010, 0xc002b3b, 0xafa00014, 0x8f4202c0, +0x24420001, 0xaf4202c0, 0x1000013a, 0x8f4202c0, +0xc002426, 0x0, 0x10000136, 0x0, +0x24020001, 0xa34205c5, 0x24100100, 0x8f4401a8, +0x8f4501ac, 0xafb00010, 0xafa00014, 0x8f420014, +0xafa20018, 0x8f420108, 0x26e60028, 0x40f809, +0x24070400, 0x1040fff5, 0x0, 0x10000125, +0x0, 0x3c03ffff, 0x34637fff, 0x8f420368, +0x8f440360, 0x2c3b024, 0x1821, 0xaf400058, +0xaf40005c, 0xaf400060, 0xaf400064, 0x441023, +0xaf420368, 0x3c020900, 0xaf400360, 0xafa20020, +0x8f5e0018, 0x27aa0020, 0x240200ff, 0x13c20002, +0xafaa003c, 0x27c30001, 0x8c020228, 0x609021, +0x1642000e, 0x1e38c0, 0x8f42033c, 0x24420001, +0xaf42033c, 0x8f42033c, 0x8c020228, 0x3c040001, +0x2484620c, 0x3c050009, 0xafa00014, 0xafa20010, +0x8fa60020, 0x1000006b, 0x34a50500, 0xf71021, +0x8fa30020, 0x8fa40024, 0xac4304c0, 0xac4404c4, +0x8f830054, 0x8f820054, 0x247003e8, 0x2021023, +0x2c4203e9, 0x1040001b, 0x9821, 0xe08821, +0x263504c0, 0x8f440178, 0x8f45017c, 0x2201821, +0x240a0004, 0xafaa0010, 0xafb20014, 0x8f48000c, +0x1021, 0x2f53021, 0xafa80018, 0x8f48010c, +0x24070008, 0xa32821, 0xa3482b, 0x822021, +0x100f809, 0x892021, 0x54400006, 0x24130001, +0x8f820054, 0x2021023, 0x2c4203e9, 0x1440ffe9, +0x0, 0x326200ff, 0x54400017, 0xaf520018, 0x8f420378, 0x24420001, 0xaf420378, 0x8f420378, 0x8f820120, 0x8faa003c, 0xafa20010, 0x8f820124, -0x3c040001, 0x248462b0, 0x3c050009, 0xafa20014, -0x8d460000, 0x34a50700, 0xc002b17, 0x3c03821, -0x8f4202b0, 0x24420001, 0xaf4202b0, 0x8f4202b0, -0x8f4202f8, 0x24420001, 0xaf4202f8, 0x1000008a, -0x8f4202f8, 0x8c02025c, 0x27440224, 0xaf4201f0, -0x8c020260, 0x24050200, 0x24060008, 0xc002b9b, -0xaf4201f8, 0x8f820220, 0x30420008, 0x14400002, -0x24020001, 0x24020002, 0xaf420298, 0x8f4202ac, -0x24420001, 0xaf4202ac, 0x10000077, 0x8f4202ac, -0x3c0200ff, 0x3442ffff, 0x2021824, 0x32c20180, -0x14400006, 0x3402fffb, 0x43102b, 0x14400003, -0x0, 0x1000006c, 0xaf4300bc, 0x3c040001, -0x24846310, 0x3c050003, 0x34a51500, 0x2003021, -0x3821, 0xafa00010, 0xc002b17, 0xafa00014, -0x3c020700, 0x34421000, 0x101e02, 0x621825, -0xafa30020, 0x8f510018, 0x240200ff, 0x12220002, -0x8021, 0x26300001, 0x8c020228, 0x1602000e, -0x1130c0, 0x8f42033c, 0x24420001, 0xaf42033c, -0x8f42033c, 0x8c020228, 0x3c040001, 0x24846284, -0x3c050009, 0xafa00014, 0xafa20010, 0x8fa60020, -0x1000003f, 0x34a50100, 0xd71021, 0x8fa30020, -0x8fa40024, 0xac4304c0, 0xac4404c4, 0xc01821, -0x8f440178, 0x8f45017c, 0x1021, 0x24070004, -0xafa70010, 0xafb00014, 0x8f48000c, 0x24c604c0, -0x2e63021, 0xafa80018, 0x8f48010c, 0x24070008, -0xa32821, 0xa3482b, 0x822021, 0x100f809, -0x892021, 0x1440000b, 0x24070008, 0x8f820120, -0xafa20010, 0x8f820124, 0x3c040001, 0x2484628c, -0x3c050009, 0xafa20014, 0x8fa60020, 0x1000001c, -0x34a50200, 0x8f440160, 0x8f450164, 0x8f43000c, -0xaf500018, 0x8f860120, 0x24020010, 0xafa20010, -0xafb00014, 0xafa30018, 0x8f42010c, 0x40f809, -0x24c6001c, 0x14400010, 0x0, 0x8f420340, -0x24420001, 0xaf420340, 0x8f420340, 0x8f820120, -0xafa20010, 0x8f820124, 0x3c040001, 0x24846294, -0x3c050009, 0xafa20014, 0x8fa60020, 0x34a50300, -0xc002b17, 0x2203821, 0x8f4202e0, 0x24420001, -0xaf4202e0, 0x8f4202e0, 0x8f4202f0, 0x24420001, -0xaf4202f0, 0x8f4202f0, 0x8fa20034, 0x8fbf0058, -0x8fbe0054, 0x8fb50050, 0x8fb3004c, 0x8fb20048, -0x8fb10044, 0x8fb00040, 0x3e00008, 0x27bd0060, -0x27bdfff8, 0x2408ffff, 0x10a00014, 0x4821, -0x3c0aedb8, 0x354a8320, 0x90870000, 0x24840001, -0x3021, 0x1071026, 0x30420001, 0x10400002, -0x81842, 0x6a1826, 0x604021, 0x24c60001, -0x2cc20008, 0x1440fff7, 0x73842, 0x25290001, -0x125102b, 0x1440fff0, 0x0, 0x1001021, -0x3e00008, 0x27bd0008, 0x27bdffb8, 0xafbf0040, -0xafbe003c, 0xafb50038, 0xafb30034, 0xafb20030, -0xafb1002c, 0xafb00028, 0x8f870220, 0xafa7001c, -0x8f870200, 0xafa70024, 0x8f820220, 0x3c0308ff, -0x3463ffff, 0x431024, 0x34420004, 0xaf820220, -0x8f820200, 0x3c03c0ff, 0x3463ffff, 0x431024, -0x34420004, 0xaf820200, 0x8f53035c, 0x8f550360, -0x8f5e0364, 0x8f470368, 0xafa70014, 0x8f4202d0, -0x274401c0, 0x24420001, 0xaf4202d0, 0x8f5002d0, -0x8f510204, 0x8f520200, 0xc002b84, 0x24050400, -0xaf53035c, 0xaf550360, 0xaf5e0364, 0x8fa70014, -0xaf470368, 0xaf5002d0, 0xaf510204, 0xaf520200, +0x3c040001, 0x24846218, 0x3c050009, 0xafa20014, +0x8d460000, 0x10000033, 0x34a50600, 0x8f420308, +0x24130001, 0x24420001, 0xaf420308, 0x8f420308, +0x1000001c, 0x326200ff, 0x8f830054, 0x8f820054, +0x247003e8, 0x2021023, 0x2c4203e9, 0x10400014, +0x9821, 0x24110010, 0x8f42000c, 0x8f440160, +0x8f450164, 0x8f860120, 0xafb10010, 0xafb20014, +0xafa20018, 0x8f42010c, 0x24070008, 0x40f809, +0x24c6001c, 0x1440ffe5, 0x0, 0x8f820054, +0x2021023, 0x2c4203e9, 0x1440ffef, 0x0, +0x326200ff, 0x14400011, 0x0, 0x8f420378, +0x24420001, 0xaf420378, 0x8f420378, 0x8f820120, +0x8faa003c, 0xafa20010, 0x8f820124, 0x3c040001, +0x24846220, 0x3c050009, 0xafa20014, 0x8d460000, +0x34a50700, 0xc002b3b, 0x3c03821, 0x8f4202b0, +0x24420001, 0xaf4202b0, 0x8f4202b0, 0x8f4202f8, +0x24420001, 0xaf4202f8, 0x1000008a, 0x8f4202f8, 0x8c02025c, 0x27440224, 0xaf4201f0, 0x8c020260, -0x24050200, 0x24060008, 0xaf4201f8, 0x24020006, -0xc002b9b, 0xaf4201f4, 0x3c023b9a, 0x3442ca00, -0xaf4201fc, 0x240203e8, 0x24040002, 0x24030001, -0xaf420294, 0xaf440290, 0xaf43029c, 0x8f820220, -0x30420008, 0x10400004, 0x0, 0xaf430298, -0x10000003, 0x3021, 0xaf440298, 0x3021, -0x3c030001, 0x661821, 0x90636d80, 0x3461021, -0x24c60001, 0xa043022c, 0x2cc2000f, 0x1440fff8, -0x3461821, 0x24c60001, 0x8f820040, 0x24040080, -0x24050080, 0x21702, 0x24420030, 0xa062022c, -0x3461021, 0xc002b84, 0xa040022c, 0x8fa7001c, -0x30e20004, 0x14400006, 0x0, 0x8f820220, -0x3c0308ff, 0x3463fffb, 0x431024, 0xaf820220, -0x8fa70024, 0x30e20004, 0x14400006, 0x0, -0x8f820200, 0x3c03c0ff, 0x3463fffb, 0x431024, -0xaf820200, 0x8fbf0040, 0x8fbe003c, 0x8fb50038, -0x8fb30034, 0x8fb20030, 0x8fb1002c, 0x8fb00028, -0x3e00008, 0x27bd0048, 0x0, 0xaf400104, +0x24050200, 0x24060008, 0xc002bbf, 0xaf4201f8, +0x8f820220, 0x30420008, 0x14400002, 0x24020001, +0x24020002, 0xaf420298, 0x8f4202ac, 0x24420001, +0xaf4202ac, 0x10000077, 0x8f4202ac, 0x3c0200ff, +0x3442ffff, 0x2021824, 0x32c20180, 0x14400006, +0x3402fffb, 0x43102b, 0x14400003, 0x0, +0x1000006c, 0xaf4300bc, 0x3c040001, 0x24846280, +0x3c050003, 0x34a51500, 0x2003021, 0x3821, +0xafa00010, 0xc002b3b, 0xafa00014, 0x3c020700, +0x34421000, 0x101e02, 0x621825, 0xafa30020, +0x8f510018, 0x240200ff, 0x12220002, 0x8021, +0x26300001, 0x8c020228, 0x1602000e, 0x1130c0, +0x8f42033c, 0x24420001, 0xaf42033c, 0x8f42033c, +0x8c020228, 0x3c040001, 0x248461f4, 0x3c050009, +0xafa00014, 0xafa20010, 0x8fa60020, 0x1000003f, +0x34a50100, 0xd71021, 0x8fa30020, 0x8fa40024, +0xac4304c0, 0xac4404c4, 0xc01821, 0x8f440178, +0x8f45017c, 0x1021, 0x24070004, 0xafa70010, +0xafb00014, 0x8f48000c, 0x24c604c0, 0x2e63021, +0xafa80018, 0x8f48010c, 0x24070008, 0xa32821, +0xa3482b, 0x822021, 0x100f809, 0x892021, +0x1440000b, 0x24070008, 0x8f820120, 0xafa20010, +0x8f820124, 0x3c040001, 0x248461fc, 0x3c050009, +0xafa20014, 0x8fa60020, 0x1000001c, 0x34a50200, +0x8f440160, 0x8f450164, 0x8f43000c, 0xaf500018, +0x8f860120, 0x24020010, 0xafa20010, 0xafb00014, +0xafa30018, 0x8f42010c, 0x40f809, 0x24c6001c, +0x14400010, 0x0, 0x8f420340, 0x24420001, +0xaf420340, 0x8f420340, 0x8f820120, 0xafa20010, +0x8f820124, 0x3c040001, 0x24846204, 0x3c050009, +0xafa20014, 0x8fa60020, 0x34a50300, 0xc002b3b, +0x2203821, 0x8f4202e0, 0x24420001, 0xaf4202e0, +0x8f4202e0, 0x8f4202f0, 0x24420001, 0xaf4202f0, +0x8f4202f0, 0x8fa20034, 0x8fbf0058, 0x8fbe0054, +0x8fb50050, 0x8fb3004c, 0x8fb20048, 0x8fb10044, +0x8fb00040, 0x3e00008, 0x27bd0060, 0x27bdfff8, +0x2408ffff, 0x10a00014, 0x4821, 0x3c0aedb8, +0x354a8320, 0x90870000, 0x24840001, 0x3021, +0x1071026, 0x30420001, 0x10400002, 0x81842, +0x6a1826, 0x604021, 0x24c60001, 0x2cc20008, +0x1440fff7, 0x73842, 0x25290001, 0x125102b, +0x1440fff0, 0x0, 0x1001021, 0x3e00008, +0x27bd0008, 0x27bdffb0, 0xafbf0048, 0xafbe0044, +0xafb50040, 0xafb3003c, 0xafb20038, 0xafb10034, +0xafb00030, 0x8f870220, 0xafa70024, 0x8f870200, +0xafa7002c, 0x8f820220, 0x3c0308ff, 0x3463ffff, +0x431024, 0x34420004, 0xaf820220, 0x8f820200, +0x3c03c0ff, 0x3463ffff, 0x431024, 0x34420004, +0xaf820200, 0x8f530358, 0x8f55035c, 0x8f5e0360, +0x8f470364, 0xafa70014, 0x8f470368, 0xafa7001c, +0x8f4202d0, 0x274401c0, 0x24420001, 0xaf4202d0, +0x8f5002d0, 0x8f510204, 0x8f520200, 0xc002ba8, +0x24050400, 0xaf530358, 0xaf55035c, 0xaf5e0360, +0x8fa70014, 0xaf470364, 0x8fa7001c, 0xaf470368, +0xaf5002d0, 0xaf510204, 0xaf520200, 0x8c02025c, +0x27440224, 0xaf4201f0, 0x8c020260, 0x24050200, +0x24060008, 0xaf4201f8, 0x24020006, 0xc002bbf, +0xaf4201f4, 0x3c023b9a, 0x3442ca00, 0xaf4201fc, +0x240203e8, 0x24040002, 0x24030001, 0xaf420294, +0xaf440290, 0xaf43029c, 0x8f820220, 0x30420008, +0x10400004, 0x0, 0xaf430298, 0x10000003, +0x3021, 0xaf440298, 0x3021, 0x3c030001, +0x661821, 0x90636d00, 0x3461021, 0x24c60001, +0xa043022c, 0x2cc2000f, 0x1440fff8, 0x3461821, +0x24c60001, 0x8f820040, 0x24040080, 0x24050080, +0x21702, 0x24420030, 0xa062022c, 0x3461021, +0xc002ba8, 0xa040022c, 0x8fa70024, 0x30e20004, +0x14400006, 0x0, 0x8f820220, 0x3c0308ff, +0x3463fffb, 0x431024, 0xaf820220, 0x8fa7002c, +0x30e20004, 0x14400006, 0x0, 0x8f820200, +0x3c03c0ff, 0x3463fffb, 0x431024, 0xaf820200, +0x8fbf0048, 0x8fbe0044, 0x8fb50040, 0x8fb3003c, +0x8fb20038, 0x8fb10034, 0x8fb00030, 0x3e00008, +0x27bd0050, 0x0, 0x0, 0xaf400104, 0x24040001, 0x410c0, 0x2e21821, 0x24820001, 0x3c010001, 0x230821, 0xa42234d0, 0x402021, 0x2c820080, 0x1440fff8, 0x410c0, 0x24020001, @@ -5946,7 +5950,7 @@ 0x2c450001, 0xa01021, 0x14400009, 0x24840008, 0x86102b, 0x1440fff0, 0x1021, 0x304200ff, 0x14400030, 0x24020001, 0x1000002e, 0x1021, -0x1000fffa, 0x24020001, 0x2002021, 0xc0023ed, +0x1000fffa, 0x24020001, 0x2002021, 0xc00240c, 0x24050006, 0x3042007f, 0x218c0, 0x2e31021, 0x3c010001, 0x220821, 0x942230d0, 0x1040fff2, 0x2e31021, 0x3c060001, 0xc23021, 0x94c630d0, @@ -5961,7 +5965,7 @@ 0x27bd0018, 0x3e00008, 0x0, 0x27bdffb0, 0x801021, 0xafb00030, 0x24500002, 0x2002021, 0x24050006, 0xafb10034, 0x408821, 0xafbf0048, -0xafbe0044, 0xafb50040, 0xafb3003c, 0xc0023ed, +0xafbe0044, 0xafb50040, 0xafb3003c, 0xc00240c, 0xafb20038, 0x3047007f, 0x710c0, 0x2e21021, 0x3c050001, 0xa22821, 0x94a530d0, 0x50a0001c, 0xa03021, 0x3c090001, 0x352934d2, 0x96280002, @@ -5974,15 +5978,15 @@ 0x10c00014, 0x610c0, 0x571821, 0x3c010001, 0x230821, 0x8c2334d0, 0x571021, 0xafa30010, 0x3c010001, 0x220821, 0x8c2234d4, 0x3c040001, -0x24846424, 0xafa20014, 0x8e260000, 0x8e270004, -0x3c050004, 0xc002b17, 0x34a50400, 0x10000063, +0x24846394, 0xafa20014, 0x8e260000, 0x8e270004, +0x3c050004, 0xc002b3b, 0x34a50400, 0x10000063, 0x3c020800, 0x8f450100, 0x10a00006, 0x510c0, 0x2e21021, 0x3c010001, 0x220821, 0x942234d0, 0xaf420100, 0xa03021, 0x14c00011, 0x628c0, 0x710c0, 0x2e21021, 0xafa70010, 0x3c010001, -0x220821, 0x942230d0, 0x3c040001, 0x24846430, +0x220821, 0x942230d0, 0x3c040001, 0x248463a0, 0xafa20014, 0x8e260000, 0x8e270004, 0x3c050004, -0xc002b17, 0x34a50500, 0x10000048, 0x3c020800, +0xc002b3b, 0x34a50500, 0x10000048, 0x3c020800, 0xb71821, 0x3c020001, 0x96040000, 0x344234d2, 0x621821, 0xa4640000, 0x8e020002, 0x720c0, 0xac620002, 0x2e41021, 0x3c030001, 0x621821, @@ -6005,7 +6009,7 @@ 0x240200ff, 0x13c20002, 0xafaa002c, 0x27c30001, 0x8c020228, 0x609021, 0x1642000e, 0x1e38c0, 0x8f42033c, 0x24420001, 0xaf42033c, 0x8f42033c, -0x8c020228, 0x3c040001, 0x248463ec, 0x3c050009, +0x8c020228, 0x3c040001, 0x2484635c, 0x3c050009, 0xafa00014, 0xafa20010, 0x8fa60020, 0x1000006b, 0x34a50500, 0xf71021, 0x8fa30020, 0x8fa40024, 0xac4304c0, 0xac4404c4, 0x8f830054, 0x8f820054, @@ -6019,7 +6023,7 @@ 0x2c4203e9, 0x1440ffe9, 0x0, 0x326200ff, 0x54400017, 0xaf520018, 0x8f420378, 0x24420001, 0xaf420378, 0x8f420378, 0x8f820120, 0x8faa002c, -0xafa20010, 0x8f820124, 0x3c040001, 0x248463f8, +0xafa20010, 0x8f820124, 0x3c040001, 0x24846368, 0x3c050009, 0xafa20014, 0x8d460000, 0x10000033, 0x34a50600, 0x8f420308, 0x24130001, 0x24420001, 0xaf420308, 0x8f420308, 0x1000001c, 0x326200ff, @@ -6032,8 +6036,8 @@ 0x1440ffef, 0x0, 0x326200ff, 0x14400011, 0x0, 0x8f420378, 0x24420001, 0xaf420378, 0x8f420378, 0x8f820120, 0x8faa002c, 0xafa20010, -0x8f820124, 0x3c040001, 0x24846400, 0x3c050009, -0xafa20014, 0x8d460000, 0x34a50700, 0xc002b17, +0x8f820124, 0x3c040001, 0x24846370, 0x3c050009, +0xafa20014, 0x8d460000, 0x34a50700, 0xc002b3b, 0x3c03821, 0x8f4202b4, 0x24420001, 0xaf4202b4, 0x8f4202b4, 0x8f4202f4, 0x24420001, 0xaf4202f4, 0x8f4202f4, 0x8fbf0048, 0x8fbe0044, 0x8fb50040, @@ -6041,7 +6045,7 @@ 0x3e00008, 0x27bd0050, 0x27bdffa0, 0x801021, 0xafb00040, 0x24500002, 0x2002021, 0x24050006, 0xafb10044, 0x408821, 0xafbf0058, 0xafbe0054, -0xafb50050, 0xafb3004c, 0xc0023ed, 0xafb20048, +0xafb50050, 0xafb3004c, 0xc00240c, 0xafb20048, 0x3048007f, 0x810c0, 0x2e21021, 0x3c060001, 0xc23021, 0x94c630d0, 0x10c0001c, 0x3821, 0x3c0a0001, 0x354a34d2, 0x96290002, 0x610c0, @@ -6053,8 +6057,8 @@ 0x94c634d0, 0x14c0ffea, 0x610c0, 0x14c00011, 0xafa70028, 0x810c0, 0x2e21021, 0xafa80010, 0x3c010001, 0x220821, 0x942230d0, 0x3c040001, -0x2484643c, 0xafa20014, 0x8e260000, 0x8e270004, -0x3c050004, 0xc002b17, 0x34a50900, 0x10000075, +0x248463ac, 0xafa20014, 0x8e260000, 0x8e270004, +0x3c050004, 0xc002b3b, 0x34a50900, 0x10000075, 0x3c020800, 0x10e0000c, 0x610c0, 0x2e21021, 0x3c030001, 0x621821, 0x946334d0, 0x710c0, 0x2e21021, 0x3c010001, 0x220821, 0xa42334d0, @@ -6089,7 +6093,7 @@ 0xafab0034, 0x27c30001, 0x8c020228, 0x609021, 0x1642000e, 0x1e38c0, 0x8f42033c, 0x24420001, 0xaf42033c, 0x8f42033c, 0x8c020228, 0x3c040001, -0x248463ec, 0x3c050009, 0xafa00014, 0xafa20010, +0x2484635c, 0x3c050009, 0xafa00014, 0xafa20010, 0x8fa60020, 0x1000006b, 0x34a50500, 0xf71021, 0x8fa30020, 0x8fa40024, 0xac4304c0, 0xac4404c4, 0x8f830054, 0x8f820054, 0x247003e8, 0x2021023, @@ -6103,7 +6107,7 @@ 0x0, 0x326200ff, 0x54400017, 0xaf520018, 0x8f420378, 0x24420001, 0xaf420378, 0x8f420378, 0x8f820120, 0x8fab0034, 0xafa20010, 0x8f820124, -0x3c040001, 0x248463f8, 0x3c050009, 0xafa20014, +0x3c040001, 0x24846368, 0x3c050009, 0xafa20014, 0x8d660000, 0x10000033, 0x34a50600, 0x8f420308, 0x24130001, 0x24420001, 0xaf420308, 0x8f420308, 0x1000001c, 0x326200ff, 0x8f830054, 0x8f820054, @@ -6116,14 +6120,14 @@ 0x326200ff, 0x14400011, 0x0, 0x8f420378, 0x24420001, 0xaf420378, 0x8f420378, 0x8f820120, 0x8fab0034, 0xafa20010, 0x8f820124, 0x3c040001, -0x24846400, 0x3c050009, 0xafa20014, 0x8d660000, -0x34a50700, 0xc002b17, 0x3c03821, 0x8f4202b8, +0x24846370, 0x3c050009, 0xafa20014, 0x8d660000, +0x34a50700, 0xc002b3b, 0x3c03821, 0x8f4202b8, 0x24420001, 0xaf4202b8, 0x8f4202b8, 0x8f4202f4, 0x24420001, 0xaf4202f4, 0x8f4202f4, 0x8fbf0058, 0x8fbe0054, 0x8fb50050, 0x8fb3004c, 0x8fb20048, 0x8fb10044, 0x8fb00040, 0x3e00008, 0x27bd0060, 0x0, 0x0, 0x0, 0x27bdffe0, -0x27644000, 0xafbf0018, 0xc002b84, 0x24051000, +0x27644000, 0xafbf0018, 0xc002ba8, 0x24051000, 0x3c030001, 0x34632cc0, 0x3c040001, 0x34842ec8, 0x24020020, 0xaf82011c, 0x2e31021, 0xaf800100, 0xaf800104, 0xaf800108, 0xaf800110, 0xaf800114, @@ -6132,15 +6136,15 @@ 0x2e31021, 0xaf4200f0, 0x2e41021, 0xaf4200f4, 0x2e41021, 0xaf4200f8, 0x3c020001, 0x571021, 0x904240f4, 0x1440001c, 0x3c050001, 0x8f82011c, -0x3c040001, 0x24846500, 0x3c050001, 0x34420001, +0x3c040001, 0x24846470, 0x3c050001, 0x34420001, 0xaf82011c, 0xafa00010, 0xafa00014, 0x8f86011c, -0x34a50100, 0xc002b17, 0x3821, 0x8c020218, +0x34a50100, 0xc002b3b, 0x3821, 0x8c020218, 0x30420040, 0x10400014, 0x0, 0x8f82011c, -0x3c040001, 0x2484650c, 0x3c050001, 0x34420004, +0x3c040001, 0x2484647c, 0x3c050001, 0x34420004, 0xaf82011c, 0xafa00010, 0xafa00014, 0x8f86011c, -0x10000007, 0x34a50200, 0x3c040001, 0x24846514, +0x10000007, 0x34a50200, 0x3c040001, 0x24846484, 0xafa00010, 0xafa00014, 0x8f86011c, 0x34a50300, -0xc002b17, 0x3821, 0x8fbf0018, 0x3e00008, +0xc002b3b, 0x3821, 0x8fbf0018, 0x3e00008, 0x27bd0020, 0x8fa90010, 0x8f83012c, 0x8faa0014, 0x8fab0018, 0x1060000a, 0x27624fe0, 0x14620002, 0x24680020, 0x27684800, 0x8f820128, 0x11020004, @@ -6181,55 +6185,55 @@ 0x2e21021, 0x402021, 0x24020001, 0xaf4400ec, 0xac890000, 0xac820004, 0x24020001, 0x3e00008, 0x0, 0x3e00008, 0x0, 0x27bdffd8, -0x3c040001, 0x2484651c, 0x3c050001, 0xafbf0024, +0x3c040001, 0x2484648c, 0x3c050001, 0xafbf0024, 0xafb20020, 0xafb1001c, 0xafb00018, 0x8f900104, 0x8f9100b0, 0x8f92011c, 0x34a52500, 0x8f820100, -0x2403021, 0x2203821, 0xafa20010, 0xc002b17, +0x2403021, 0x2203821, 0xafa20010, 0xc002b3b, 0xafb00014, 0x8e020008, 0xafa20010, 0x8e02000c, -0x3c040001, 0x24846528, 0xafa20014, 0x8e060000, -0x8e070004, 0x3c050001, 0xc002b17, 0x34a52510, +0x3c040001, 0x24846498, 0xafa20014, 0x8e060000, +0x8e070004, 0x3c050001, 0xc002b3b, 0x34a52510, 0x8e020018, 0xafa20010, 0x8e02001c, 0x3c040001, -0x24846534, 0xafa20014, 0x8e060010, 0x8e070014, -0x3c050001, 0xc002b17, 0x34a52520, 0x3c027f00, +0x248464a4, 0xafa20014, 0x8e060010, 0x8e070014, +0x3c050001, 0xc002b3b, 0x34a52520, 0x3c027f00, 0x2221024, 0x3c030800, 0x54430016, 0x3c030200, 0x8f82009c, 0x3042ffff, 0x14400012, 0x3c030200, -0x3c040001, 0x24846540, 0x3c050002, 0x34a5f030, +0x3c040001, 0x248464b0, 0x3c050002, 0x34a5f030, 0x3021, 0x3821, 0x36420002, 0xaf82011c, 0x36220001, 0xaf8200b0, 0xaf900104, 0xaf92011c, -0xafa00010, 0xc002b17, 0xafa00014, 0x10000024, +0xafa00010, 0xc002b3b, 0xafa00014, 0x10000024, 0x0, 0x2c31024, 0x1040000d, 0x2231024, 0x1040000b, 0x36420002, 0xaf82011c, 0x36220001, 0xaf8200b0, 0xaf900104, 0xaf92011c, 0x8f420330, 0x24420001, 0xaf420330, 0x10000015, 0x8f420330, -0x3c040001, 0x24846548, 0x240202a9, 0xafa20010, -0xafa00014, 0x8f860144, 0x3c070001, 0x24e76550, -0xc002b17, 0x3405dead, 0x8f82011c, 0x34420002, +0x3c040001, 0x248464b8, 0x240202a9, 0xafa20010, +0xafa00014, 0x8f860144, 0x3c070001, 0x24e764c0, +0xc002b3b, 0x3405dead, 0x8f82011c, 0x34420002, 0xaf82011c, 0x8f820220, 0x34420004, 0xaf820220, 0x8f820140, 0x3c030001, 0x431025, 0xaf820140, 0x8fbf0024, 0x8fb20020, 0x8fb1001c, 0x8fb00018, 0x3e00008, 0x27bd0028, 0x27bdffd8, 0x3c040001, -0x24846578, 0x3c050001, 0xafbf0024, 0xafb20020, +0x248464e8, 0x3c050001, 0xafbf0024, 0xafb20020, 0xafb1001c, 0xafb00018, 0x8f900124, 0x8f9100a0, 0x8f92011c, 0x34a52600, 0x8f820120, 0x2403021, -0x2203821, 0xafa20010, 0xc002b17, 0xafb00014, +0x2203821, 0xafa20010, 0xc002b3b, 0xafb00014, 0x8e020008, 0xafa20010, 0x8e02000c, 0x3c040001, -0x24846584, 0xafa20014, 0x8e060000, 0x8e070004, -0x3c050001, 0xc002b17, 0x34a52610, 0x8e020018, -0xafa20010, 0x8e02001c, 0x3c040001, 0x24846590, +0x248464f4, 0xafa20014, 0x8e060000, 0x8e070004, +0x3c050001, 0xc002b3b, 0x34a52610, 0x8e020018, +0xafa20010, 0x8e02001c, 0x3c040001, 0x24846500, 0xafa20014, 0x8e060010, 0x8e070014, 0x3c050001, -0xc002b17, 0x34a52620, 0x3c027f00, 0x2221024, +0xc002b3b, 0x34a52620, 0x3c027f00, 0x2221024, 0x3c030800, 0x54430016, 0x3c030200, 0x8f8200ac, 0x3042ffff, 0x14400012, 0x3c030200, 0x3c040001, -0x2484659c, 0x3c050001, 0x34a5f030, 0x3021, +0x2484650c, 0x3c050001, 0x34a5f030, 0x3021, 0x3821, 0x36420002, 0xaf82011c, 0x36220001, 0xaf8200a0, 0xaf900124, 0xaf92011c, 0xafa00010, -0xc002b17, 0xafa00014, 0x10000024, 0x0, +0xc002b3b, 0xafa00014, 0x10000024, 0x0, 0x2c31024, 0x1040000d, 0x2231024, 0x1040000b, 0x36420002, 0xaf82011c, 0x36220001, 0xaf8200a0, 0xaf900124, 0xaf92011c, 0x8f42032c, 0x24420001, 0xaf42032c, 0x10000015, 0x8f42032c, 0x3c040001, -0x24846548, 0x240202e2, 0xafa20010, 0xafa00014, -0x8f860144, 0x3c070001, 0x24e76550, 0xc002b17, +0x248464b8, 0x240202e2, 0xafa20010, 0xafa00014, +0x8f860144, 0x3c070001, 0x24e764c0, 0xc002b3b, 0x3405dead, 0x8f82011c, 0x34420002, 0xaf82011c, 0x8f820220, 0x34420004, 0xaf820220, 0x8f820140, 0x3c030001, 0x431025, 0xaf820140, 0x8fbf0024, @@ -6238,24 +6242,24 @@ 0x2821, 0x6821, 0x4821, 0x7821, 0x7021, 0x8f880124, 0x8f870104, 0x1580002e, 0x8f8b011c, 0x11a00014, 0x31620800, 0x8f820120, -0x10460029, 0x0, 0x3c040001, 0x8c846f60, +0x10460029, 0x0, 0x3c040001, 0x8c846ee4, 0x8cc20000, 0x8cc30004, 0xac820000, 0xac830004, 0x8cc20008, 0xac820008, 0x94c2000e, 0xa482000e, 0x8cc20010, 0x240c0001, 0xac820010, 0x8cc20014, 0x10000012, 0x24c60020, 0x10400017, 0x0, -0x3c040001, 0x8c846f60, 0x8d020000, 0x8d030004, +0x3c040001, 0x8c846ee4, 0x8d020000, 0x8d030004, 0xac820000, 0xac830004, 0x8d020008, 0xac820008, 0x9502000e, 0xa482000e, 0x8d020010, 0x25060020, 0xac820010, 0x8d020014, 0x240c0001, 0xc01821, 0xac820014, 0x27624fe0, 0x43102b, 0x54400001, 0x27634800, 0x603021, 0x1540002f, 0x31620100, 0x11200014, 0x31628000, 0x8f820100, 0x1045002a, -0x31620100, 0x3c040001, 0x8c846f5c, 0x8ca20000, +0x31620100, 0x3c040001, 0x8c846ee0, 0x8ca20000, 0x8ca30004, 0xac820000, 0xac830004, 0x8ca20008, 0xac820008, 0x94a2000e, 0xa482000e, 0x8ca20010, 0x240a0001, 0xac820010, 0x8ca20014, 0x10000012, 0x24a50020, 0x10400018, 0x31620100, 0x3c040001, -0x8c846f5c, 0x8ce20000, 0x8ce30004, 0xac820000, +0x8c846ee0, 0x8ce20000, 0x8ce30004, 0xac820000, 0xac830004, 0x8ce20008, 0xac820008, 0x94e2000e, 0xa482000e, 0x8ce20010, 0x24e50020, 0xac820010, 0x8ce20014, 0x240a0001, 0xa01821, 0xac820014, @@ -6264,7 +6268,7 @@ 0x11a00009, 0x31a20800, 0x10400004, 0x25020020, 0x8f8200a8, 0xa5e20000, 0x25020020, 0xaf820124, 0x8f880124, 0x6821, 0x11800011, 0x31621000, -0x3c040001, 0x8c846f60, 0x8c820000, 0x8c830004, +0x3c040001, 0x8c846ee4, 0x8c820000, 0x8c830004, 0xaf820080, 0xaf830084, 0x8c820008, 0xaf8200a4, 0x9482000e, 0xaf8200ac, 0x8c820010, 0x6021, 0xaf8200a0, 0x8c8d0010, 0x8c8f0014, 0x31621000, @@ -6273,7 +6277,7 @@ 0x3c020002, 0x1221024, 0x10400004, 0x24e20020, 0x8f8200b4, 0xaf8200d4, 0x24e20020, 0xaf820104, 0x8f870104, 0x4821, 0x1140ff70, 0x0, -0x3c040001, 0x8c846f5c, 0x8c820000, 0x8c830004, +0x3c040001, 0x8c846ee0, 0x8c820000, 0x8c830004, 0xaf820090, 0xaf830094, 0x8c820008, 0xaf8200b4, 0x9482000e, 0xaf82009c, 0x8c820010, 0x5021, 0xaf8200b0, 0x8c890010, 0x1000ff60, 0x8c8e0014, @@ -6282,11 +6286,11 @@ 0x7821, 0x7021, 0x8f880124, 0x8f870104, 0x3c180100, 0x1580002e, 0x8f89011c, 0x11a00014, 0x31220800, 0x8f820120, 0x10460029, 0x0, -0x3c040001, 0x8c846f60, 0x8cc20000, 0x8cc30004, +0x3c040001, 0x8c846ee4, 0x8cc20000, 0x8cc30004, 0xac820000, 0xac830004, 0x8cc20008, 0xac820008, 0x94c2000e, 0xa482000e, 0x8cc20010, 0x240c0001, 0xac820010, 0x8cc20014, 0x10000012, 0x24c60020, -0x10400017, 0x0, 0x3c040001, 0x8c846f60, +0x10400017, 0x0, 0x3c040001, 0x8c846ee4, 0x8d020000, 0x8d030004, 0xac820000, 0xac830004, 0x8d020008, 0xac820008, 0x9502000e, 0xa482000e, 0x8d020010, 0x25060020, 0xac820010, 0x8d020014, @@ -6294,11 +6298,11 @@ 0x43102b, 0x54400001, 0x27634800, 0x603021, 0x1560002f, 0x31220100, 0x11400014, 0x31228000, 0x8f820100, 0x1045002a, 0x31220100, 0x3c040001, -0x8c846f5c, 0x8ca20000, 0x8ca30004, 0xac820000, +0x8c846ee0, 0x8ca20000, 0x8ca30004, 0xac820000, 0xac830004, 0x8ca20008, 0xac820008, 0x94a2000e, 0xa482000e, 0x8ca20010, 0x240b0001, 0xac820010, 0x8ca20014, 0x10000012, 0x24a50020, 0x10400018, -0x31220100, 0x3c040001, 0x8c846f5c, 0x8ce20000, +0x31220100, 0x3c040001, 0x8c846ee0, 0x8ce20000, 0x8ce30004, 0xac820000, 0xac830004, 0x8ce20008, 0xac820008, 0x94e2000e, 0xa482000e, 0x8ce20010, 0x24e50020, 0xac820010, 0x8ce20014, 0x240b0001, @@ -6307,7 +6311,7 @@ 0x5440001d, 0x31221000, 0x11a00009, 0x31a20800, 0x10400004, 0x25020020, 0x8f8200a8, 0xa5e20000, 0x25020020, 0xaf820124, 0x8f880124, 0x6821, -0x11800011, 0x31221000, 0x3c040001, 0x8c846f60, +0x11800011, 0x31221000, 0x3c040001, 0x8c846ee4, 0x8c820000, 0x8c830004, 0xaf820080, 0xaf830084, 0x8c820008, 0xaf8200a4, 0x9482000e, 0xaf8200ac, 0x8c820010, 0x6021, 0xaf8200a0, 0x8c8d0010, @@ -6316,7 +6320,7 @@ 0x8f8200b8, 0xa5c20000, 0x3c020002, 0x1421024, 0x10400004, 0x24e20020, 0x8f8200b4, 0xaf8200d4, 0x24e20020, 0xaf820104, 0x8f870104, 0x5021, -0x11600010, 0x0, 0x3c040001, 0x8c846f5c, +0x11600010, 0x0, 0x3c040001, 0x8c846ee0, 0x8c820000, 0x8c830004, 0xaf820090, 0xaf830094, 0x8c820008, 0xaf8200b4, 0x9482000e, 0xaf82009c, 0x8c820010, 0x5821, 0xaf8200b0, 0x8c8a0010, @@ -6345,37 +6349,37 @@ 0x8f420000, 0x10400003, 0x0, 0x1000ff05, 0xaf80004c, 0x1000ff03, 0xaf800048, 0x3e00008, 0x0, 0x0, 0x0, 0x3c020001, -0x8c426da8, 0x27bdffe8, 0xafbf0014, 0x14400012, -0xafb00010, 0x3c100001, 0x26107010, 0x2002021, -0xc002b84, 0x24052000, 0x26021fe0, 0x3c010001, -0xac226f68, 0x3c010001, 0xac226f64, 0xac020250, +0x8c426d28, 0x27bdffe8, 0xafbf0014, 0x14400012, +0xafb00010, 0x3c100001, 0x26106f90, 0x2002021, +0xc002ba8, 0x24052000, 0x26021fe0, 0x3c010001, +0xac226eec, 0x3c010001, 0xac226ee8, 0xac020250, 0x24022000, 0xac100254, 0xac020258, 0x24020001, -0x3c010001, 0xac226da8, 0x8fbf0014, 0x8fb00010, -0x3e00008, 0x27bd0018, 0x3c090001, 0x8d296f68, +0x3c010001, 0xac226d28, 0x8fbf0014, 0x8fb00010, +0x3e00008, 0x27bd0018, 0x3c090001, 0x8d296eec, 0x8c820000, 0x8fa30010, 0x8fa80014, 0xad220000, 0x8c820004, 0xad250008, 0xad220004, 0x8f820054, 0xad260010, 0xad270014, 0xad230018, 0xad28001c, -0xad22000c, 0x2529ffe0, 0x3c020001, 0x24427010, +0xad22000c, 0x2529ffe0, 0x3c020001, 0x24426f90, 0x122102b, 0x10400003, 0x0, 0x3c090001, -0x8d296f64, 0x3c020001, 0x8c426d90, 0xad220000, -0x3c020001, 0x8c426d90, 0x3c010001, 0xac296f68, +0x8d296ee8, 0x3c020001, 0x8c426d10, 0xad220000, +0x3c020001, 0x8c426d10, 0x3c010001, 0xac296eec, 0xad220004, 0xac090250, 0x3e00008, 0x0, -0x27bdffd0, 0xafb00010, 0x3c100001, 0x8e106f68, -0x3c020001, 0x8c426d90, 0xafb10014, 0x808821, +0x27bdffd0, 0xafb00010, 0x3c100001, 0x8e106eec, +0x3c020001, 0x8c426d10, 0xafb10014, 0x808821, 0xafbe0024, 0x8fbe0040, 0x8fa40048, 0xafb20018, 0xa09021, 0xafbf0028, 0xafb50020, 0xafb3001c, -0xae020000, 0x3c020001, 0x8c426d90, 0xc09821, +0xae020000, 0x3c020001, 0x8c426d10, 0xc09821, 0xe0a821, 0x10800006, 0xae020004, 0x26050008, -0xc002b8f, 0x24060018, 0x10000005, 0x2610ffe0, -0x26040008, 0xc002b84, 0x24050018, 0x2610ffe0, -0x3c030001, 0x24637010, 0x203102b, 0x10400003, -0x0, 0x3c100001, 0x8e106f64, 0x8e220000, +0xc002bb3, 0x24060018, 0x10000005, 0x2610ffe0, +0x26040008, 0xc002ba8, 0x24050018, 0x2610ffe0, +0x3c030001, 0x24636f90, 0x203102b, 0x10400003, +0x0, 0x3c100001, 0x8e106ee8, 0x8e220000, 0xae020000, 0x8e220004, 0xae120008, 0xae020004, 0x8f820054, 0xae130010, 0xae150014, 0xae1e0018, 0x8fa80044, 0xae08001c, 0xae02000c, 0x2610ffe0, 0x203102b, 0x10400003, 0x0, 0x3c100001, -0x8e106f64, 0x3c020001, 0x8c426d90, 0xae020000, -0x3c020001, 0x8c426d90, 0x3c010001, 0xac306f68, +0x8e106ee8, 0x3c020001, 0x8c426d10, 0xae020000, +0x3c020001, 0x8c426d10, 0x3c010001, 0xac306eec, 0xae020004, 0xac100250, 0x8fbf0028, 0x8fbe0024, 0x8fb50020, 0x8fb3001c, 0x8fb20018, 0x8fb10014, 0x8fb00010, 0x3e00008, 0x27bd0030, 0x851821, @@ -6390,28 +6394,36 @@ 0x3e00008, 0x0, 0x63080, 0x861821, 0x83102b, 0x10400006, 0x0, 0xac850000, 0x24840004, 0x83102b, 0x5440fffd, 0xac850000, -0x3e00008, 0x0, 0x0, 0x3c0208ff, -0x3442ffff, 0x3c03c0ff, 0x8f850220, 0x3463ffff, -0x8f860200, 0xa21024, 0x34420004, 0xc31824, -0x34630004, 0xaf820220, 0xaf830200, 0x8c820214, -0xac020084, 0x8c820218, 0xac020088, 0x8c82021c, -0xac02008c, 0x8c820220, 0xac020090, 0x8c820224, -0xac020094, 0x8c820228, 0xac020098, 0x8c82022c, -0xac02009c, 0x8c820230, 0xac0200a0, 0x8c820234, -0xac0200a4, 0x8c820238, 0xac0200a8, 0x8c82023c, -0xac0200ac, 0x8c820240, 0xac0200b0, 0x8c820244, -0xac0200b4, 0x8c820248, 0xac0200b8, 0x8c82024c, -0xac0200bc, 0x8c82001c, 0xac020080, 0x8c820018, -0xac0200c0, 0x8c820020, 0xac0200cc, 0x8c820024, -0xac0200d0, 0x8c8201d0, 0xac0200e0, 0x8c8201d4, -0xac0200e4, 0x8c8201d8, 0xac0200e8, 0x8c8201dc, -0xac0200ec, 0x8c8201e0, 0xac0200f0, 0x8c820098, -0x8c83009c, 0xac0300fc, 0x8c8200a8, 0x8c8300ac, -0xac0300f4, 0x8c8200a0, 0x8c8300a4, 0x30a50004, -0xac0300f8, 0x14a00007, 0x30c20004, 0x8f820220, -0x3c0308ff, 0x3463fffb, 0x431024, 0xaf820220, -0x30c20004, 0x14400006, 0x0, 0x8f820200, -0x3c03c0ff, 0x3463fffb, 0x431024, 0xaf820200, +0x3e00008, 0x0, 0x0, 0x26e50028, +0xa03021, 0x274301c0, 0x8f4d0358, 0x8f47035c, +0x8f480360, 0x8f490364, 0x8f4a0368, 0x8f4b0204, +0x8f4c0200, 0x24640400, 0x64102b, 0x10400008, +0x3c0208ff, 0x8cc20000, 0xac620000, 0x24630004, +0x64102b, 0x1440fffb, 0x24c60004, 0x3c0208ff, +0x3442ffff, 0x3c03c0ff, 0xaf4d0358, 0xaf47035c, +0xaf480360, 0xaf490364, 0xaf4a0368, 0xaf4b0204, +0xaf4c0200, 0x8f840220, 0x3463ffff, 0x8f860200, +0x821024, 0x34420004, 0xc31824, 0x34630004, +0xaf820220, 0xaf830200, 0x8ca20214, 0xac020084, +0x8ca20218, 0xac020088, 0x8ca2021c, 0xac02008c, +0x8ca20220, 0xac020090, 0x8ca20224, 0xac020094, +0x8ca20228, 0xac020098, 0x8ca2022c, 0xac02009c, +0x8ca20230, 0xac0200a0, 0x8ca20234, 0xac0200a4, +0x8ca20238, 0xac0200a8, 0x8ca2023c, 0xac0200ac, +0x8ca20240, 0xac0200b0, 0x8ca20244, 0xac0200b4, +0x8ca20248, 0xac0200b8, 0x8ca2024c, 0xac0200bc, +0x8ca2001c, 0xac020080, 0x8ca20018, 0xac0200c0, +0x8ca20020, 0xac0200cc, 0x8ca20024, 0xac0200d0, +0x8ca201d0, 0xac0200e0, 0x8ca201d4, 0xac0200e4, +0x8ca201d8, 0xac0200e8, 0x8ca201dc, 0xac0200ec, +0x8ca201e0, 0xac0200f0, 0x8ca20098, 0x8ca3009c, +0xac0300fc, 0x8ca200a8, 0x8ca300ac, 0xac0300f4, +0x8ca200a0, 0x8ca300a4, 0x30840004, 0xac0300f8, +0x14800007, 0x30c20004, 0x8f820220, 0x3c0308ff, +0x3463fffb, 0x431024, 0xaf820220, 0x30c20004, +0x14400006, 0x0, 0x8f820200, 0x3c03c0ff, +0x3463fffb, 0x431024, 0xaf820200, 0x8f4202dc, +0xa34005c5, 0x24420001, 0xaf4202dc, 0x8f4202dc, 0x3e00008, 0x0, 0x27bdffd8, 0xafbf0024, 0xafb00020, 0x8f430024, 0x8f420020, 0x10620038, 0x0, 0x8f430020, 0x8f420024, 0x622023, @@ -6443,7 +6455,7 @@ 0x8e040000, 0x8e050004, 0x96120008, 0x8f420090, 0x9611000a, 0x3246ffff, 0x46102a, 0x10400017, 0x0, 0x8f8200d8, 0x8f430098, 0x431023, -0x2442fff8, 0xaf420090, 0x8f420090, 0x2842fff9, +0x2442dcbe, 0xaf420090, 0x8f420090, 0x2842dcbf, 0x10400005, 0x0, 0x8f420090, 0x8f430144, 0x431021, 0xaf420090, 0x8f420090, 0x46102a, 0x10400006, 0x0, 0x8f420348, 0x24420001, @@ -6513,7 +6525,7 @@ 0x8e040000, 0x8e050004, 0x96110008, 0x8f420090, 0x9607000a, 0x3226ffff, 0x46102a, 0x10400017, 0x0, 0x8f8200d8, 0x8f430098, 0x431023, -0x2442ff80, 0xaf420090, 0x8f420090, 0x2842ff81, +0x2442dc46, 0xaf420090, 0x8f420090, 0x2842dc47, 0x10400005, 0x0, 0x8f420090, 0x8f430144, 0x431021, 0xaf420090, 0x8f420090, 0x46102a, 0x10400006, 0x0, 0x8f420348, 0x24420001, @@ -6575,15 +6587,15 @@ 0x30a20001, 0x8c82001c, 0x8f430040, 0x8f440034, 0x24420001, 0x2463ffff, 0x431024, 0x862021, 0xaf42002c, 0x30a20030, 0x14400006, 0xaf440034, -0x8f420034, 0x8c03023c, 0x43102b, 0x144000ca, +0x8f420034, 0x8c03023c, 0x43102b, 0x144000b4, 0x0, 0x32c20010, 0x10400028, 0x24070008, 0x8f440170, 0x8f450174, 0x8f43002c, 0x8f48000c, 0x8f860120, 0x24020080, 0xafa20010, 0xafa30014, 0xafa80018, 0x8f42010c, 0x40f809, 0x24c6001c, 0x14400011, 0x24020001, 0x3c010001, 0x370821, 0xa02240f1, 0x8f820124, 0xafa20010, 0x8f820128, -0x3c040001, 0x24846854, 0xafa20014, 0x8f46002c, -0x8f870120, 0x3c050009, 0xc002b17, 0x34a51100, +0x3c040001, 0x248467c4, 0xafa20014, 0x8f46002c, +0x8f870120, 0x3c050009, 0xc002b3b, 0x34a51100, 0x10000036, 0x0, 0x8f420300, 0x8f43002c, 0x24420001, 0xaf420300, 0x8f420300, 0x24020001, 0xa34205c1, 0x10000026, 0xaf430038, 0x8f440170, @@ -6592,13 +6604,13 @@ 0x8f42010c, 0x40f809, 0x24c6001c, 0x14400011, 0x24020001, 0x3c010001, 0x370821, 0xa02240f0, 0x8f820124, 0xafa20010, 0x8f820128, 0x3c040001, -0x24846848, 0xafa20014, 0x8f46002c, 0x8f870120, -0x3c050009, 0xc002b17, 0x34a50900, 0x1000000f, +0x248467b8, 0xafa20014, 0x8f46002c, 0x8f870120, +0x3c050009, 0xc002b3b, 0x34a50900, 0x1000000f, 0x0, 0x8f420300, 0x24420001, 0xaf420300, 0x8f420300, 0x8f42002c, 0xa34005c1, 0xaf420038, 0x3c010001, 0x370821, 0xa02040f1, 0x3c010001, 0x370821, 0xa02040f0, 0xaf400034, 0x8f420314, -0x24420001, 0xaf420314, 0x1000006f, 0x8f420314, +0x24420001, 0xaf420314, 0x10000059, 0x8f420314, 0x10400022, 0x30a27000, 0x8c85001c, 0x8f420028, 0xa22023, 0x4810003, 0x0, 0x8f420040, 0x822021, 0x8f420358, 0x8f430000, 0xaf450028, @@ -6606,8 +6618,8 @@ 0x8f82004c, 0x1040fffd, 0x0, 0x10000005, 0x0, 0xaf800048, 0x8f820048, 0x1040fffd, 0x0, 0x8f820060, 0x34420008, 0xaf820060, -0x8f420000, 0x10400003, 0x0, 0x1000004e, -0xaf80004c, 0x1000004c, 0xaf800048, 0x1040002f, +0x8f420000, 0x10400003, 0x0, 0x10000038, +0xaf80004c, 0x10000036, 0xaf800048, 0x1040002f, 0x30a21000, 0x1040000c, 0x30a24000, 0x8c83001c, 0x8f420050, 0x622023, 0x4820001, 0x24840200, 0x8f42035c, 0x441021, 0xaf42035c, 0x8f420368, @@ -6618,190 +6630,179 @@ 0x3c020800, 0x8c83001c, 0x8f420060, 0x622023, 0x4820001, 0x24840100, 0x8f420360, 0x441021, 0xaf420360, 0x8f420368, 0xaf430060, 0x441021, -0xaf420368, 0x3c020800, 0x2c21024, 0x5040001e, -0x36940040, 0x1000001c, 0x0, 0x30a20100, -0x10400019, 0x0, 0x3c020001, 0x8c426d44, -0x1040000d, 0x274301c0, 0x24650400, 0x65102b, -0x10400007, 0x26e40028, 0x8c820000, 0xac620000, -0x24630004, 0x65102b, 0x1440fffb, 0x24840004, -0x10000002, 0x274401c0, 0x26e40028, 0xc002bb4, -0x0, 0x8f4202dc, 0xa34005c5, 0x24420001, -0xaf4202dc, 0x8f4202dc, 0x8fbf0020, 0x3e00008, -0x27bd0028, 0x3e00008, 0x0, 0x27bdffa8, -0xafbf0050, 0xafbe004c, 0xafb50048, 0xafb30044, -0xafb20040, 0xafb1003c, 0xafb00038, 0x8f910108, -0x26220020, 0xaf820108, 0x8e320018, 0xa821, -0x32420024, 0x104001ba, 0xf021, 0x8e26001c, -0x8f43001c, 0x61100, 0x621821, 0x8c70000c, -0x9604000c, 0x962d0016, 0x9473000a, 0x2c8305dd, -0x38828870, 0x2c420001, 0x621825, 0x10600015, -0x2821, 0x32c20040, 0x10400015, 0x24020800, -0x96030014, 0x14620012, 0x3402aaaa, 0x9603000e, -0x14620007, 0x2021, 0x96030010, 0x24020300, -0x14620004, 0x801021, 0x96020012, 0x2c440001, -0x801021, 0x54400006, 0x24050016, 0x10000004, -0x0, 0x24020800, 0x50820001, 0x2405000e, -0x934205c3, 0x14400008, 0x5821, 0x240b0001, -0x32620180, 0xaf4500a8, 0xaf5000a0, 0x10400002, -0xaf4600a4, 0xa34b05c3, 0x10a00085, 0x2054021, -0x91020000, 0x3821, 0x3042000f, 0x25080, -0x32c20002, 0x10400012, 0x10a1821, 0x32620002, -0x10400010, 0x32c20001, 0x1002021, 0x94820000, -0x24840002, 0xe23821, 0x83102b, 0x1440fffb, -0x30e2ffff, 0x71c02, 0x623821, 0x71c02, -0x30e2ffff, 0x623821, 0x71027, 0xa502000a, -0x32c20001, 0x1040006a, 0x32620001, 0x10400068, -0x0, 0x8f4200a8, 0x10400065, 0x0, -0x8f4200a0, 0x8f4300a8, 0x431021, 0x904c0009, -0x318900ff, 0x39230006, 0x3182b, 0x39220011, -0x2102b, 0x621824, 0x1060000c, 0x3c050006, -0x8f4200a4, 0x3c040001, 0x24846864, 0xafa20010, -0x8f4200a0, 0x34a54600, 0x1203821, 0xc002b17, -0xafa20014, 0x1000004e, 0x0, 0x32c20004, -0x14400013, 0x2821, 0x316200ff, 0x14400004, -0x0, 0x95020002, 0x1000000d, 0x4a2823, -0x9505000c, 0x9502000e, 0x95030010, 0xa22821, -0xa32821, 0x95030012, 0x91040009, 0x95020002, -0xa32821, 0xa42821, 0x4a1023, 0xa22821, -0x2002021, 0x94820000, 0x24840002, 0xe23821, -0x88102b, 0x1440fffb, 0x71c02, 0x30e2ffff, +0xaf420368, 0x3c020800, 0x2c21024, 0x50400008, +0x36940040, 0x10000006, 0x0, 0x30a20100, +0x10400003, 0x0, 0xc002bd8, 0x0, +0x8fbf0020, 0x3e00008, 0x27bd0028, 0x3e00008, +0x0, 0x27bdffa8, 0xafbf0050, 0xafbe004c, +0xafb50048, 0xafb30044, 0xafb20040, 0xafb1003c, +0xafb00038, 0x8f910108, 0x26220020, 0xaf820108, +0x8e320018, 0xa821, 0x32420024, 0x104001ba, +0xf021, 0x8e26001c, 0x8f43001c, 0x61100, +0x621821, 0x8c70000c, 0x9604000c, 0x962d0016, +0x9473000a, 0x2c8305dd, 0x38828870, 0x2c420001, +0x621825, 0x10600015, 0x2821, 0x32c20040, +0x10400015, 0x24020800, 0x96030014, 0x14620012, +0x3402aaaa, 0x9603000e, 0x14620007, 0x2021, +0x96030010, 0x24020300, 0x14620004, 0x801021, +0x96020012, 0x2c440001, 0x801021, 0x54400006, +0x24050016, 0x10000004, 0x0, 0x24020800, +0x50820001, 0x2405000e, 0x934205c3, 0x14400008, +0x5821, 0x240b0001, 0x32620180, 0xaf4500a8, +0xaf5000a0, 0x10400002, 0xaf4600a4, 0xa34b05c3, +0x10a00085, 0x2054021, 0x91020000, 0x3821, +0x3042000f, 0x25080, 0x32c20002, 0x10400012, +0x10a1821, 0x32620002, 0x10400010, 0x32c20001, +0x1002021, 0x94820000, 0x24840002, 0xe23821, +0x83102b, 0x1440fffb, 0x30e2ffff, 0x71c02, 0x623821, 0x71c02, 0x30e2ffff, 0x623821, -0x1a52821, 0x51c02, 0x30a2ffff, 0x622821, -0x51c02, 0x30a2ffff, 0x622821, 0xa72823, -0x51402, 0xa22821, 0x30a5ffff, 0x50a00001, -0x3405ffff, 0x316200ff, 0x14400008, 0x318300ff, -0x8f4300a0, 0x8f4200a8, 0x624021, 0x91020000, -0x3042000f, 0x25080, 0x318300ff, 0x24020006, -0x14620003, 0x10a1021, 0x10000002, 0x24440010, -0x24440006, 0x316200ff, 0x14400006, 0x0, -0x94820000, 0xa22821, 0x51c02, 0x30a2ffff, -0x622821, 0x934205c3, 0x10400003, 0x32620100, -0x50400003, 0xa4850000, 0x52827, 0xa4850000, -0x9622000e, 0x8f43009c, 0x621821, 0x32a200ff, -0x10400007, 0xaf43009c, 0x3c024000, 0x2021025, -0xafa20020, 0x8f42009c, 0x10000003, 0x5e1025, -0xafb00020, 0x8f42009c, 0xafa20024, 0x32620080, -0x10400010, 0x32620100, 0x8f4200b4, 0x24430001, -0x210c0, 0x571021, 0xaf4300b4, 0x8fa30020, -0x8fa40024, 0x3c010001, 0x220821, 0xac2338e8, -0x3c010001, 0x220821, 0xac2438ec, 0x100000a5, -0x32c20020, 0x10400064, 0x0, 0x8f4200b4, -0x24430001, 0x210c0, 0x571021, 0xaf4300b4, -0x8fa30020, 0x8fa40024, 0x3c010001, 0x220821, -0xac2338e8, 0x3c010001, 0x220821, 0xac2438ec, -0x8f4200b4, 0x10400051, 0x3821, 0x3c090001, -0x352938e8, 0x3c08001f, 0x3508ffff, 0x240bffff, -0x340affff, 0x710c0, 0x571021, 0x491021, -0x8c430000, 0x8c440004, 0xafa30028, 0xafa4002c, -0x8f8200fc, 0x8fa30028, 0x8fa4002c, 0xac430000, -0xac440004, 0x24420008, 0xaf8200f0, 0x8f42008c, -0x2442ffff, 0xaf42008c, 0x97a2002e, 0x8f440270, -0x8f450274, 0x401821, 0x1021, 0xa32821, -0xa3302b, 0x822021, 0x862021, 0xaf440270, -0xaf450274, 0x8fa20028, 0x481024, 0x90430000, -0x30630001, 0x1460000b, 0x402021, 0x8f420278, -0x8f43027c, 0x24630001, 0x2c640001, 0x441021, -0xaf420278, 0xaf43027c, 0x8f420278, 0x1000001a, -0x8f43027c, 0x8c820000, 0x144b000e, 0x0, -0x94820004, 0x144a000b, 0x0, 0x8f420288, -0x8f43028c, 0x24630001, 0x2c640001, 0x441021, -0xaf420288, 0xaf43028c, 0x8f420288, 0x1000000a, -0x8f43028c, 0x8f420280, 0x8f430284, 0x24630001, -0x2c640001, 0x441021, 0xaf420280, 0xaf430284, -0x8f420280, 0x8f430284, 0x8f4200b4, 0x24e70001, -0xe2102b, 0x1440ffb8, 0x710c0, 0xa34005c3, -0x1000003f, 0xaf4000b4, 0x8f8200fc, 0x8fa30020, -0x8fa40024, 0xac430000, 0xac440004, 0x24420008, -0xaf8200f0, 0x8f42009c, 0x8f46008c, 0x8f440270, -0x8f450274, 0x401821, 0x1021, 0x24c6ffff, -0xaf46008c, 0xa32821, 0xa3302b, 0x822021, -0x862021, 0xaf440270, 0xaf450274, 0x92020000, -0x30420001, 0x1440000c, 0x2402ffff, 0x8f420278, -0x8f43027c, 0x24630001, 0x2c640001, 0x441021, -0xaf420278, 0xaf43027c, 0x8f420278, 0x8f43027c, -0x1000001c, 0x32c20020, 0x8e030000, 0x1462000f, -0x3402ffff, 0x96030004, 0x1462000c, 0x0, -0x8f420288, 0x8f43028c, 0x24630001, 0x2c640001, -0x441021, 0xaf420288, 0xaf43028c, 0x8f420288, -0x8f43028c, 0x1000000b, 0x32c20020, 0x8f420280, +0x71027, 0xa502000a, 0x32c20001, 0x1040006a, +0x32620001, 0x10400068, 0x0, 0x8f4200a8, +0x10400065, 0x0, 0x8f4200a0, 0x8f4300a8, +0x431021, 0x904c0009, 0x318900ff, 0x39230006, +0x3182b, 0x39220011, 0x2102b, 0x621824, +0x1060000c, 0x3c050006, 0x8f4200a4, 0x3c040001, +0x248467d4, 0xafa20010, 0x8f4200a0, 0x34a54600, +0x1203821, 0xc002b3b, 0xafa20014, 0x1000004e, +0x0, 0x32c20004, 0x14400013, 0x2821, +0x316200ff, 0x14400004, 0x0, 0x95020002, +0x1000000d, 0x4a2823, 0x9505000c, 0x9502000e, +0x95030010, 0xa22821, 0xa32821, 0x95030012, +0x91040009, 0x95020002, 0xa32821, 0xa42821, +0x4a1023, 0xa22821, 0x2002021, 0x94820000, +0x24840002, 0xe23821, 0x88102b, 0x1440fffb, +0x71c02, 0x30e2ffff, 0x623821, 0x71c02, +0x30e2ffff, 0x623821, 0x1a52821, 0x51c02, +0x30a2ffff, 0x622821, 0x51c02, 0x30a2ffff, +0x622821, 0xa72823, 0x51402, 0xa22821, +0x30a5ffff, 0x50a00001, 0x3405ffff, 0x316200ff, +0x14400008, 0x318300ff, 0x8f4300a0, 0x8f4200a8, +0x624021, 0x91020000, 0x3042000f, 0x25080, +0x318300ff, 0x24020006, 0x14620003, 0x10a1021, +0x10000002, 0x24440010, 0x24440006, 0x316200ff, +0x14400006, 0x0, 0x94820000, 0xa22821, +0x51c02, 0x30a2ffff, 0x622821, 0x934205c3, +0x10400003, 0x32620100, 0x50400003, 0xa4850000, +0x52827, 0xa4850000, 0x9622000e, 0x8f43009c, +0x621821, 0x32a200ff, 0x10400007, 0xaf43009c, +0x3c024000, 0x2021025, 0xafa20020, 0x8f42009c, +0x10000003, 0x5e1025, 0xafb00020, 0x8f42009c, +0xafa20024, 0x32620080, 0x10400010, 0x32620100, +0x8f4200b4, 0x24430001, 0x210c0, 0x571021, +0xaf4300b4, 0x8fa30020, 0x8fa40024, 0x3c010001, +0x220821, 0xac2338e8, 0x3c010001, 0x220821, +0xac2438ec, 0x100000a5, 0x32c20020, 0x10400064, +0x0, 0x8f4200b4, 0x24430001, 0x210c0, +0x571021, 0xaf4300b4, 0x8fa30020, 0x8fa40024, +0x3c010001, 0x220821, 0xac2338e8, 0x3c010001, +0x220821, 0xac2438ec, 0x8f4200b4, 0x10400051, +0x3821, 0x3c090001, 0x352938e8, 0x3c08001f, +0x3508ffff, 0x240bffff, 0x340affff, 0x710c0, +0x571021, 0x491021, 0x8c430000, 0x8c440004, +0xafa30028, 0xafa4002c, 0x8f8200fc, 0x8fa30028, +0x8fa4002c, 0xac430000, 0xac440004, 0x24420008, +0xaf8200f0, 0x8f42008c, 0x2442ffff, 0xaf42008c, +0x97a2002e, 0x8f440270, 0x8f450274, 0x401821, +0x1021, 0xa32821, 0xa3302b, 0x822021, +0x862021, 0xaf440270, 0xaf450274, 0x8fa20028, +0x481024, 0x90430000, 0x30630001, 0x1460000b, +0x402021, 0x8f420278, 0x8f43027c, 0x24630001, +0x2c640001, 0x441021, 0xaf420278, 0xaf43027c, +0x8f420278, 0x1000001a, 0x8f43027c, 0x8c820000, +0x144b000e, 0x0, 0x94820004, 0x144a000b, +0x0, 0x8f420288, 0x8f43028c, 0x24630001, +0x2c640001, 0x441021, 0xaf420288, 0xaf43028c, +0x8f420288, 0x1000000a, 0x8f43028c, 0x8f420280, 0x8f430284, 0x24630001, 0x2c640001, 0x441021, 0xaf420280, 0xaf430284, 0x8f420280, 0x8f430284, -0x32c20020, 0x10400005, 0xaf40009c, 0x8f420358, +0x8f4200b4, 0x24e70001, 0xe2102b, 0x1440ffb8, +0x710c0, 0xa34005c3, 0x1000003f, 0xaf4000b4, +0x8f8200fc, 0x8fa30020, 0x8fa40024, 0xac430000, +0xac440004, 0x24420008, 0xaf8200f0, 0x8f42009c, +0x8f46008c, 0x8f440270, 0x8f450274, 0x401821, +0x1021, 0x24c6ffff, 0xaf46008c, 0xa32821, +0xa3302b, 0x822021, 0x862021, 0xaf440270, +0xaf450274, 0x92020000, 0x30420001, 0x1440000c, +0x2402ffff, 0x8f420278, 0x8f43027c, 0x24630001, +0x2c640001, 0x441021, 0xaf420278, 0xaf43027c, +0x8f420278, 0x8f43027c, 0x1000001c, 0x32c20020, +0x8e030000, 0x1462000f, 0x3402ffff, 0x96030004, +0x1462000c, 0x0, 0x8f420288, 0x8f43028c, +0x24630001, 0x2c640001, 0x441021, 0xaf420288, +0xaf43028c, 0x8f420288, 0x8f43028c, 0x1000000b, +0x32c20020, 0x8f420280, 0x8f430284, 0x24630001, +0x2c640001, 0x441021, 0xaf420280, 0xaf430284, +0x8f420280, 0x8f430284, 0x32c20020, 0x10400005, +0xaf40009c, 0x8f420358, 0x2442ffff, 0xaf420358, +0x8f420358, 0x8e22001c, 0x8f430040, 0x24420001, +0x2463ffff, 0x431024, 0xaf42002c, 0x32420060, +0x14400008, 0x32c20010, 0x8f420034, 0x24420001, +0xaf420034, 0x8c03023c, 0x43102b, 0x14400102, +0x32c20010, 0x10400018, 0x24070008, 0x8f440170, +0x8f450174, 0x8f43002c, 0x8f48000c, 0x8f860120, +0x24020080, 0xafa20010, 0xafa30014, 0xafa80018, +0x8f42010c, 0x40f809, 0x24c6001c, 0x10400047, +0x24020001, 0x8f420300, 0x8f43002c, 0x24420001, +0xaf420300, 0x8f420300, 0x24020001, 0xa34205c1, +0x1000007c, 0xaf430038, 0x8f440170, 0x8f450174, +0x8f43002c, 0x8f48000c, 0x8f860120, 0x24020020, +0xafa20010, 0xafa30014, 0xafa80018, 0x8f42010c, +0x40f809, 0x24c6001c, 0x10400057, 0x24020001, +0x10000065, 0x0, 0x32420012, 0x10400075, +0x32420001, 0x9622000e, 0x8f43009c, 0x621821, +0x32c20020, 0x10400005, 0xaf43009c, 0x8f420358, 0x2442ffff, 0xaf420358, 0x8f420358, 0x8e22001c, 0x8f430040, 0x24420001, 0x2463ffff, 0x431024, -0xaf42002c, 0x32420060, 0x14400008, 0x32c20010, +0xaf42002c, 0x32420010, 0x14400008, 0x32c20010, 0x8f420034, 0x24420001, 0xaf420034, 0x8c03023c, -0x43102b, 0x14400118, 0x32c20010, 0x10400018, +0x43102b, 0x144000bc, 0x32c20010, 0x10400028, 0x24070008, 0x8f440170, 0x8f450174, 0x8f43002c, 0x8f48000c, 0x8f860120, 0x24020080, 0xafa20010, 0xafa30014, 0xafa80018, 0x8f42010c, 0x40f809, -0x24c6001c, 0x10400047, 0x24020001, 0x8f420300, +0x24c6001c, 0x14400011, 0x24020001, 0x3c010001, +0x370821, 0xa02240f1, 0x8f820124, 0xafa20010, +0x8f820128, 0x3c040001, 0x248467c4, 0xafa20014, +0x8f46002c, 0x8f870120, 0x3c050009, 0xc002b3b, +0x34a51100, 0x10000036, 0x0, 0x8f420300, 0x8f43002c, 0x24420001, 0xaf420300, 0x8f420300, -0x24020001, 0xa34205c1, 0x1000007c, 0xaf430038, +0x24020001, 0xa34205c1, 0x10000026, 0xaf430038, 0x8f440170, 0x8f450174, 0x8f43002c, 0x8f48000c, 0x8f860120, 0x24020020, 0xafa20010, 0xafa30014, 0xafa80018, 0x8f42010c, 0x40f809, 0x24c6001c, -0x10400057, 0x24020001, 0x10000065, 0x0, -0x32420012, 0x10400075, 0x32420001, 0x9622000e, -0x8f43009c, 0x621821, 0x32c20020, 0x10400005, -0xaf43009c, 0x8f420358, 0x2442ffff, 0xaf420358, -0x8f420358, 0x8e22001c, 0x8f430040, 0x24420001, -0x2463ffff, 0x431024, 0xaf42002c, 0x32420010, -0x14400008, 0x32c20010, 0x8f420034, 0x24420001, -0xaf420034, 0x8c03023c, 0x43102b, 0x144000d2, -0x32c20010, 0x10400028, 0x24070008, 0x8f440170, -0x8f450174, 0x8f43002c, 0x8f48000c, 0x8f860120, -0x24020080, 0xafa20010, 0xafa30014, 0xafa80018, -0x8f42010c, 0x40f809, 0x24c6001c, 0x14400011, -0x24020001, 0x3c010001, 0x370821, 0xa02240f1, -0x8f820124, 0xafa20010, 0x8f820128, 0x3c040001, -0x24846854, 0xafa20014, 0x8f46002c, 0x8f870120, -0x3c050009, 0xc002b17, 0x34a51100, 0x10000036, -0x0, 0x8f420300, 0x8f43002c, 0x24420001, -0xaf420300, 0x8f420300, 0x24020001, 0xa34205c1, -0x10000026, 0xaf430038, 0x8f440170, 0x8f450174, -0x8f43002c, 0x8f48000c, 0x8f860120, 0x24020020, -0xafa20010, 0xafa30014, 0xafa80018, 0x8f42010c, -0x40f809, 0x24c6001c, 0x14400011, 0x24020001, -0x3c010001, 0x370821, 0xa02240f0, 0x8f820124, -0xafa20010, 0x8f820128, 0x3c040001, 0x24846848, -0xafa20014, 0x8f46002c, 0x8f870120, 0x3c050009, -0xc002b17, 0x34a50900, 0x1000000f, 0x0, -0x8f420300, 0x24420001, 0xaf420300, 0x8f420300, -0x8f42002c, 0xa34005c1, 0xaf420038, 0x3c010001, -0x370821, 0xa02040f1, 0x3c010001, 0x370821, -0xa02040f0, 0xaf400034, 0x8f420314, 0x24420001, -0xaf420314, 0x10000078, 0x8f420314, 0x10400022, -0x32427000, 0x8e25001c, 0x8f420028, 0xa22023, -0x4810003, 0x0, 0x8f420040, 0x822021, -0x8f420358, 0x8f430000, 0xaf450028, 0x441021, -0x10600007, 0xaf420358, 0xaf80004c, 0x8f82004c, -0x1040fffd, 0x0, 0x10000005, 0x0, -0xaf800048, 0x8f820048, 0x1040fffd, 0x0, -0x8f820060, 0x34420008, 0xaf820060, 0x8f420000, -0x10400003, 0x0, 0x10000057, 0xaf80004c, -0x10000055, 0xaf800048, 0x1040002f, 0x32421000, -0x1040000c, 0x32424000, 0x8e23001c, 0x8f420050, -0x622023, 0x4820001, 0x24840200, 0x8f42035c, -0x441021, 0xaf42035c, 0x8f420368, 0x1000001a, -0xaf430050, 0x1040000c, 0x32c28000, 0x8e23001c, -0x8f420070, 0x622023, 0x4820001, 0x24840400, -0x8f420364, 0x441021, 0xaf420364, 0x8f420368, -0x1000000d, 0xaf430070, 0x1040000e, 0x3c020800, -0x8e23001c, 0x8f420060, 0x622023, 0x4820001, -0x24840100, 0x8f420360, 0x441021, 0xaf420360, -0x8f420368, 0xaf430060, 0x441021, 0xaf420368, -0x3c020800, 0x2c21024, 0x50400027, 0x36940040, -0x10000025, 0x0, 0x32420048, 0x10400007, -0x24150001, 0x8e22001c, 0x3c03ffff, 0x43f024, -0x3042ffff, 0x1000fd75, 0xae22001c, 0x32420100, -0x10400019, 0x0, 0x3c020001, 0x8c426d44, -0x1040000d, 0x274301c0, 0x24650400, 0x65102b, -0x10400007, 0x26e40028, 0x8c820000, 0xac620000, -0x24630004, 0x65102b, 0x1440fffb, 0x24840004, -0x10000002, 0x274401c0, 0x26e40028, 0xc002bb4, -0x0, 0x8f4202dc, 0xa34005c5, 0x24420001, -0xaf4202dc, 0x8f4202dc, 0x8fbf0050, 0x8fbe004c, +0x14400011, 0x24020001, 0x3c010001, 0x370821, +0xa02240f0, 0x8f820124, 0xafa20010, 0x8f820128, +0x3c040001, 0x248467b8, 0xafa20014, 0x8f46002c, +0x8f870120, 0x3c050009, 0xc002b3b, 0x34a50900, +0x1000000f, 0x0, 0x8f420300, 0x24420001, +0xaf420300, 0x8f420300, 0x8f42002c, 0xa34005c1, +0xaf420038, 0x3c010001, 0x370821, 0xa02040f1, +0x3c010001, 0x370821, 0xa02040f0, 0xaf400034, +0x8f420314, 0x24420001, 0xaf420314, 0x10000062, +0x8f420314, 0x10400022, 0x32427000, 0x8e25001c, +0x8f420028, 0xa22023, 0x4810003, 0x0, +0x8f420040, 0x822021, 0x8f420358, 0x8f430000, +0xaf450028, 0x441021, 0x10600007, 0xaf420358, +0xaf80004c, 0x8f82004c, 0x1040fffd, 0x0, +0x10000005, 0x0, 0xaf800048, 0x8f820048, +0x1040fffd, 0x0, 0x8f820060, 0x34420008, +0xaf820060, 0x8f420000, 0x10400003, 0x0, +0x10000041, 0xaf80004c, 0x1000003f, 0xaf800048, +0x1040002f, 0x32421000, 0x1040000c, 0x32424000, +0x8e23001c, 0x8f420050, 0x622023, 0x4820001, +0x24840200, 0x8f42035c, 0x441021, 0xaf42035c, +0x8f420368, 0x1000001a, 0xaf430050, 0x1040000c, +0x32c28000, 0x8e23001c, 0x8f420070, 0x622023, +0x4820001, 0x24840400, 0x8f420364, 0x441021, +0xaf420364, 0x8f420368, 0x1000000d, 0xaf430070, +0x1040000e, 0x3c020800, 0x8e23001c, 0x8f420060, +0x622023, 0x4820001, 0x24840100, 0x8f420360, +0x441021, 0xaf420360, 0x8f420368, 0xaf430060, +0x441021, 0xaf420368, 0x3c020800, 0x2c21024, +0x50400011, 0x36940040, 0x1000000f, 0x0, +0x32420048, 0x10400007, 0x24150001, 0x8e22001c, +0x3c03ffff, 0x43f024, 0x3042ffff, 0x1000fd75, +0xae22001c, 0x32420100, 0x10400003, 0x0, +0xc002bd8, 0x0, 0x8fbf0050, 0x8fbe004c, 0x8fb50048, 0x8fb30044, 0x8fb20040, 0x8fb1003c, 0x8fb00038, 0x3e00008, 0x27bd0058, 0x3e00008, 0x0, 0x0, 0x0, 0x8f8300e4, @@ -6818,7 +6819,7 @@ 0x10400003, 0x0, 0x8f420148, 0x621821, 0x94a20006, 0x24420050, 0x62102b, 0x1440000f, 0xa01021, 0xafa40010, 0xafa30014, 0x8ca60000, -0x8ca70004, 0x3c040001, 0xc002b17, 0x24846924, +0x8ca70004, 0x3c040001, 0xc002b3b, 0x24846894, 0x8f42020c, 0x24420001, 0xaf42020c, 0x8f42020c, 0x1021, 0xaf9000e8, 0xaf9000e4, 0x8fbf001c, 0x8fb00018, 0x3e00008, 0x27bd0020, 0x3e00008, @@ -6840,15 +6841,15 @@ 0x8f4b00c4, 0xafab0064, 0x8f4a00c0, 0xafaa006c, 0x8f4b00cc, 0xafab0074, 0x8f4a00c8, 0x10000129, 0xafaa007c, 0x8f420114, 0x40f809, 0x0, -0x403021, 0x10c0033f, 0x0, 0x8cc20000, +0x403021, 0x10c0034f, 0x0, 0x8cc20000, 0x8cc30004, 0xafa20020, 0xafa30024, 0x8fab0024, 0x8faa0020, 0x3162ffff, 0x2442fffc, 0xafa2006c, 0x3c020006, 0x2c21024, 0xafab007c, 0x14400015, 0xafaa0064, 0x91420000, 0x30420001, 0x10400011, 0x2402ffff, 0x8d430000, 0x14620004, 0x3402ffff, -0x95430004, 0x1062000b, 0x0, 0xc002497, +0x95430004, 0x1062000b, 0x0, 0xc0024bb, 0x8fa40064, 0x304200ff, 0x14400006, 0x0, -0x8f420118, 0x40f809, 0x0, 0x1000031d, +0x8f420118, 0x40f809, 0x0, 0x1000032d, 0x0, 0x8fa20024, 0x3c03ffbf, 0x3463ffff, 0x431024, 0x3c03ffff, 0x431824, 0x14600003, 0xafa20024, 0x10000040, 0x1821, 0x3c020080, @@ -6871,13 +6872,13 @@ 0x4b102b, 0x10400014, 0x307000ff, 0x8f4201e8, 0x24420001, 0xaf4201e8, 0x8f4201e8, 0x8faa007c, 0x8f8200e0, 0x354a0100, 0xafaa007c, 0xafa20010, -0x8f8200e4, 0x24100001, 0x3c040001, 0x24846930, +0x8f8200e4, 0x24100001, 0x3c040001, 0x248468a0, 0xafa20014, 0x8fa60020, 0x8fa70024, 0x3c050007, -0xc002b17, 0x34a50800, 0x12000010, 0x3c020080, +0xc002b3b, 0x34a50800, 0x12000010, 0x3c020080, 0x2c21024, 0x1440000e, 0x32c20400, 0x8fab007c, 0x3c020080, 0x34420100, 0x1621024, 0x10400005, 0x0, 0x8f42020c, 0x24420001, 0xaf42020c, -0x8f42020c, 0x100002a0, 0x8fa3006c, 0x32c20400, +0x8f42020c, 0x100002b0, 0x8fa3006c, 0x32c20400, 0x10400015, 0x34028100, 0x8faa0064, 0x9543000c, 0x14620012, 0x3c020100, 0x240b0200, 0xa7ab008e, 0x9542000e, 0x8d430008, 0x8d440004, 0x8d450000, @@ -6892,66 +6893,66 @@ 0x10400056, 0x32c28000, 0x1040005e, 0x240a0003, 0x32c21000, 0x1040005b, 0xafaa005c, 0x10000058, 0x240b0004, 0x8f420350, 0x2403ffbf, 0x283a024, -0x24420001, 0xaf420350, 0x1000023f, 0x8f420350, +0x24420001, 0xaf420350, 0x1000024f, 0x8f420350, 0x2c2b025, 0x2402ffbf, 0x282a024, 0x8f830128, -0x3c040001, 0x24846960, 0x26620001, 0xafa20014, +0x3c040001, 0x248468d0, 0x26620001, 0xafa20014, 0xafa30010, 0x8f860120, 0x8f870124, 0x3c050007, -0xc002b17, 0x34a52250, 0x1000022f, 0x0, +0xc002b3b, 0x34a52250, 0x1000023f, 0x0, 0x2c2b025, 0x2402ffbf, 0x282a024, 0x8f830128, -0x3c040001, 0x24846960, 0x24020002, 0xafa20014, +0x3c040001, 0x248468d0, 0x24020002, 0xafa20014, 0xafa30010, 0x8f860120, 0x8f870124, 0x3c050007, -0xc002b17, 0x34a52450, 0x1000021f, 0x0, -0x8ea20000, 0x8ea30004, 0x3c040001, 0x24846978, +0xc002b3b, 0x34a52450, 0x1000022f, 0x0, +0x8ea20000, 0x8ea30004, 0x3c040001, 0x248468e8, 0xafb00010, 0xafbe0014, 0x8ea70018, 0x34a52800, -0xc002b17, 0x603021, 0x10000213, 0x0, -0xa6b1000a, 0x8f820124, 0x3c040001, 0x24846980, +0xc002b3b, 0x603021, 0x10000223, 0x0, +0xa6b1000a, 0x8f820124, 0x3c040001, 0x248468f0, 0xafbe0014, 0xafa20010, 0x8f460044, 0x8f870120, -0x3c050007, 0xc002b17, 0x34a53000, 0x10000206, +0x3c050007, 0xc002b3b, 0x34a53000, 0x10000216, 0x0, 0xa6b1000a, 0xa6b2000e, 0x8f820124, -0x3c040001, 0x2484698c, 0xafbe0014, 0xafa20010, -0x8f460044, 0x8f870120, 0x3c050007, 0xc002b17, -0x34a53200, 0x100001f8, 0x0, 0x8f420084, +0x3c040001, 0x248468fc, 0xafbe0014, 0xafa20010, +0x8f460044, 0x8f870120, 0x3c050007, 0xc002b3b, +0x34a53200, 0x10000208, 0x0, 0x8f420084, 0x8faa006c, 0x4a102b, 0x14400007, 0x3c020001, 0x2c21024, 0x10400004, 0x0, 0x240b0002, -0xafab005c, 0x8faa006c, 0x1140020b, 0x27ab0020, +0xafab005c, 0x8faa006c, 0x1140021b, 0x27ab0020, 0xafab00a4, 0x3c0a001f, 0x354affff, 0xafaa009c, -0x8fab005c, 0x240a0001, 0x156a0021, 0x24020002, +0x8fab005c, 0x240a0001, 0x556a0021, 0x240a0002, 0x8f430054, 0x8f420050, 0x1062000b, 0x274b0054, 0x8f5e0054, 0x3403ecc0, 0xafab004c, 0x27c20001, 0x304201ff, 0xafa20054, 0x1e1140, 0x431021, 0x1000006b, 0x2e2a821, 0x8f420044, 0x8faa006c, -0x3c040001, 0x2484693c, 0xafaa0014, 0xafa20010, -0x8f460054, 0x8f470050, 0x3c050007, 0xc002b17, +0x3c040001, 0x248468ac, 0xafaa0014, 0xafa20010, +0x8f460054, 0x8f470050, 0x3c050007, 0xc002b3b, 0x34a51300, 0x8f430350, 0x2402ffbf, 0x282a024, -0x24630001, 0xaf430350, 0x100001c3, 0x8f420350, -0x1562001d, 0x0, 0x8f430074, 0x8f420070, -0x1062000a, 0x274a0074, 0x8f5e0074, 0xafaa004c, +0x24630001, 0xaf430350, 0x100001d3, 0x8f420350, +0x156a001d, 0x0, 0x8f430074, 0x8f420070, +0x1062000a, 0x274b0074, 0x8f5e0074, 0xafab004c, 0x27c20001, 0x304203ff, 0xafa20054, 0x1e1140, 0x24426cc0, 0x1000004a, 0x2e2a821, 0x8f420044, -0x8fab006c, 0x3c040001, 0x24846948, 0x3c050007, -0xafab0014, 0xafa20010, 0x8f460074, 0x8f470070, -0x34a51500, 0x240a0001, 0xc002b17, 0xafaa005c, +0x8faa006c, 0x3c040001, 0x248468b8, 0x3c050007, +0xafaa0014, 0xafa20010, 0x8f460074, 0x8f470070, +0x34a51500, 0x240b0001, 0xc002b3b, 0xafab005c, 0x1000ffc3, 0x0, 0x8f430064, 0x8f420060, -0x1062001a, 0x274b0064, 0x8f5e0064, 0x8faa005c, -0xafab004c, 0x27c20001, 0x304200ff, 0xafa20054, -0x24020004, 0x1542000e, 0x1e1140, 0x1e1180, +0x1062001a, 0x274a0064, 0x8f5e0064, 0x8fab005c, +0xafaa004c, 0x27c20001, 0x304200ff, 0xafa20054, +0x24020004, 0x1562000e, 0x1e1140, 0x1e1180, 0x24420cc0, 0x2e21021, 0xafa20044, 0x9442002a, -0x8fab0044, 0x8faa006c, 0x4a102b, 0x10400024, -0x25750020, 0x240b0001, 0x10000021, 0xa3ab0097, +0x8faa0044, 0x8fab006c, 0x4b102b, 0x10400024, +0x25550020, 0x240a0001, 0x10000021, 0xa3aa0097, 0x24424cc0, 0x1000001e, 0x2e2a821, 0x8f420044, -0x8faa006c, 0x3c040001, 0x24846954, 0xafaa0014, +0x8fab006c, 0x3c040001, 0x248468c4, 0xafab0014, 0xafa20010, 0x8f460064, 0x8f470060, 0x3c050007, -0xc002b17, 0x34a51800, 0x3c020008, 0x2c21024, -0x1440ff34, 0x0, 0x8f420370, 0x240b0001, -0xafab005c, 0x24420001, 0xaf420370, 0x1000ff90, +0xc002b3b, 0x34a51800, 0x3c020008, 0x2c21024, +0x1440ff34, 0x0, 0x8f420370, 0x240a0001, +0xafaa005c, 0x24420001, 0xaf420370, 0x1000ff90, 0x8f420370, 0x27a30036, 0x131040, 0x621821, 0x94620000, 0x441021, 0x10000020, 0xa4620000, -0x8faa0064, 0xaeaa0018, 0x93a20097, 0x10400072, -0x9821, 0x8fab0044, 0x8fa4006c, 0x8fa300a4, -0x25620020, 0xafa20028, 0x25620008, 0xafa20030, -0x25620010, 0xafab002c, 0xafa20034, 0x9562002a, -0xa7a20038, 0x95620018, 0xa7a2003a, 0x9562001a, -0xa7a2003c, 0x9562001c, 0xa7a2003e, 0x94620018, +0x8fab0064, 0xaeab0018, 0x93a20097, 0x10400072, +0x9821, 0x8faa0044, 0x8fa4006c, 0x8fa300a4, +0x25420020, 0xafa20028, 0x25420008, 0xafa20030, +0x25420010, 0xafaa002c, 0xafa20034, 0x9542002a, +0xa7a20038, 0x95420018, 0xa7a2003a, 0x9542001a, +0xa7a2003c, 0x9542001c, 0xa7a2003e, 0x94620018, 0x24630002, 0x822023, 0x1880ffde, 0x26730001, 0x2e620004, 0x1440fff9, 0x0, 0x8f4200fc, 0x26650001, 0xa2102a, 0x1440002b, 0x24030001, @@ -6960,20 +6961,20 @@ 0x8f820128, 0x431023, 0x21943, 0x58600001, 0x24630040, 0x64102a, 0x54400001, 0x602021, 0xaf4400fc, 0x8f4200fc, 0xa2102a, 0x10400011, -0x24030001, 0x10000015, 0x306200ff, 0x8faa0064, -0x96070018, 0xafaa0010, 0x8e220008, 0x3c040001, -0x2484696c, 0x8c430004, 0x8c420000, 0x34a52400, -0x2403021, 0xc002b17, 0xafa30014, 0x1000002b, +0x24030001, 0x10000015, 0x306200ff, 0x8fab0064, +0x96070018, 0xafab0010, 0x8e220008, 0x3c040001, +0x248468dc, 0x8c430004, 0x8c420000, 0x34a52400, +0x2403021, 0xc002b3b, 0xafa30014, 0x1000002b, 0x0, 0x8f420334, 0x1821, 0x24420001, 0xaf420334, 0x8f420334, 0x306200ff, 0x5040fedc, 0x3c020800, 0x12600021, 0x9021, 0x8fb100a4, 0x2208021, 0x8e220008, 0x96070018, 0x8fa60064, -0x8c440000, 0x8c450004, 0x240b0001, 0xafab0010, +0x8c440000, 0x8c450004, 0x240a0001, 0xafaa0010, 0xafbe0014, 0x8f420008, 0xafa20018, 0x8f42010c, 0x40f809, 0x0, 0x1040ffd8, 0x3c050007, -0x96020018, 0x8faa0064, 0x8fab009c, 0x1425021, -0x16a102b, 0x10400004, 0xafaa0064, 0x8f420148, -0x1425023, 0xafaa0064, 0x26100002, 0x26520001, +0x96020018, 0x8fab0064, 0x8faa009c, 0x1625821, +0x14b102b, 0x10400004, 0xafab0064, 0x8f420148, +0x1625823, 0xafab0064, 0x26100002, 0x26520001, 0x253102b, 0x1440ffe3, 0x26310004, 0x8fb0006c, 0x10000036, 0x97b10038, 0x8f4200fc, 0x24050002, 0xa2102a, 0x1440001b, 0x24030001, 0x8f83012c, @@ -6986,42 +6987,42 @@ 0x8f420334, 0x306200ff, 0x1040fea5, 0x3c020800, 0x96b1000a, 0x8fb0006c, 0x3223ffff, 0x70102b, 0x54400001, 0x608021, 0x8ea40000, 0x8ea50004, -0x240a0001, 0xafaa0010, 0xafbe0014, 0x8f420008, +0x240b0001, 0xafab0010, 0xafbe0014, 0x8f420008, 0x8fa60064, 0xafa20018, 0x8f42010c, 0x40f809, 0x2003821, 0x1040fea2, 0x3c050007, 0x96a3000e, -0x97ab008e, 0x11600007, 0x609021, 0x934205c4, -0x14400004, 0x0, 0x97aa0086, 0x6b1825, -0xa6aa0016, 0x8fab007c, 0x3c02ffff, 0x1621024, -0x10400003, 0xb1402, 0x34630400, 0xa6a20014, -0x8faa006c, 0x560a0072, 0xa6a3000e, 0x34620004, -0xa6a2000e, 0x8fab0074, 0x14b1021, 0xa6a2000a, +0x97aa008e, 0x11400007, 0x609021, 0x934205c4, +0x14400004, 0x0, 0x97ab0086, 0x6a1825, +0xa6ab0016, 0x8faa007c, 0x3c02ffff, 0x1421024, +0x10400003, 0xa1402, 0x34630400, 0xa6a20014, +0x8fab006c, 0x560b0072, 0xa6a3000e, 0x34620004, +0xa6a2000e, 0x8faa0074, 0x16a1021, 0xa6a2000a, 0x8f430044, 0x8f4401a0, 0x8f4501a4, 0x34028000, 0xafa20010, 0x8f420044, 0x2a03021, 0x24070020, 0xafa20014, 0x8f42000c, 0x31940, 0x604821, 0xafa20018, 0x8f42010c, 0x4021, 0xa92821, 0xa9182b, 0x882021, 0x40f809, 0x832021, 0x5040fe7f, 0xa6b2000e, 0x8f420368, 0xafa0006c, -0xa34005c4, 0x2442ffff, 0xaf420368, 0x8faa005c, -0x240b0001, 0x8f420368, 0x154b0006, 0x24020002, +0xa34005c4, 0x2442ffff, 0xaf420368, 0x8fab005c, +0x240a0001, 0x8f420368, 0x156a0006, 0x240a0002, 0x8f42035c, 0x2442ffff, 0xaf42035c, 0x1000000c, -0x8f42035c, 0x15420006, 0x0, 0x8f420364, +0x8f42035c, 0x156a0006, 0x0, 0x8f420364, 0x2442ffff, 0xaf420364, 0x10000005, 0x8f420364, 0x8f420360, 0x2442ffff, 0xaf420360, 0x8f420360, 0x8faa0054, 0x8fab004c, 0xad6a0000, 0x8f420044, 0x8f440088, 0x8f430078, 0x24420001, 0x441024, 0x24630001, 0xaf420044, 0xaf430078, 0x8c020240, -0x62182b, 0x14600065, 0x24070008, 0x8f440168, +0x62182b, 0x14600075, 0x24070008, 0x8f440168, 0x8f45016c, 0x8f430044, 0x8f48000c, 0x8f860120, 0x24020040, 0xafa20010, 0xafa30014, 0xafa80018, 0x8f42010c, 0x40f809, 0x24c6001c, 0x14400011, 0x240b0001, 0x3c010001, 0x370821, 0xa02b40f2, 0x8f820124, 0xafa20010, 0x8f820128, 0x3c040001, -0x2484691c, 0xafa20014, 0x8f460044, 0x8f870120, -0x3c050009, 0xc002b17, 0x34a51300, 0x1000000b, +0x2484688c, 0xafa20014, 0x8f460044, 0x8f870120, +0x3c050009, 0xc002b3b, 0x34a51300, 0x1000000b, 0x0, 0x8f420304, 0x24420001, 0xaf420304, 0x8f420304, 0x8f420044, 0xaf42007c, 0x3c010001, 0x370821, 0xa02040f2, 0xaf400078, 0x8f420318, -0x24420001, 0xaf420318, 0x10000038, 0x8f420318, +0x24420001, 0xaf420318, 0x10000048, 0x8f420318, 0xa6b0000a, 0x8f430044, 0x8f4401a0, 0x8f4501a4, 0x34028000, 0xafa20010, 0x8f420044, 0x2a03021, 0x24070020, 0xafa20014, 0x8f42000c, 0x31940, @@ -7031,12 +7032,16 @@ 0x8fab006c, 0x8faa0064, 0x1705823, 0xafab006c, 0x8fab009c, 0x1505021, 0x16a102b, 0x10400004, 0xafaa0064, 0x8f420148, 0x1425023, 0xafaa0064, -0x8f420368, 0x2442ffff, 0xaf420368, 0x8f420368, -0x8f42035c, 0x2442ffff, 0xaf42035c, 0x8fab0054, -0x8faa004c, 0x8f42035c, 0xad4b0000, 0x8f420044, +0x8f420368, 0x2442ffff, 0xaf420368, 0x8faa005c, +0x240b0001, 0x8f420368, 0x154b0006, 0x240b0002, +0x8f42035c, 0x2442ffff, 0xaf42035c, 0x1000000c, +0x8f42035c, 0x114b0006, 0x0, 0x8f420360, +0x2442ffff, 0xaf420360, 0x10000005, 0x8f420360, +0x8f420364, 0x2442ffff, 0xaf420364, 0x8f420364, +0x8fab0054, 0x8faa004c, 0xad4b0000, 0x8f420044, 0x8f440088, 0x8f430078, 0x24420001, 0x441024, 0x24630001, 0xaf420044, 0xaf430078, 0x8faa006c, -0x1540fe1b, 0x0, 0x8fab006c, 0x1160001e, +0x1540fe0b, 0x0, 0x8fab006c, 0x1160001e, 0x0, 0x934205c4, 0x10400009, 0x0, 0x8faa0064, 0xaf4a00c4, 0xaf4b00c0, 0x8fab007c, 0xaf4b00c8, 0x8faa0074, 0x1000000e, 0xaf4a00cc, @@ -7063,7 +7068,7 @@ 0xafa20064, 0x3c020006, 0x2c21024, 0x14400015, 0xafac006c, 0x93c20000, 0x30420001, 0x10400011, 0x2402ffff, 0x8fc30000, 0x14620004, 0x3402ffff, -0x97c30004, 0x1062000b, 0x0, 0xc002497, +0x97c30004, 0x1062000b, 0x0, 0xc0024bb, 0x3c02021, 0x304200ff, 0x14400006, 0x0, 0x8f420118, 0x40f809, 0x0, 0x10000280, 0x0, 0x8fa20024, 0x3c03ffbf, 0x3463ffff, @@ -7088,9 +7093,9 @@ 0x4b102b, 0x10400015, 0x320200ff, 0x8f4201e8, 0x24420001, 0xaf4201e8, 0x8f4201e8, 0x8fac006c, 0x8f8200e0, 0x358c0100, 0xafac006c, 0xafa20010, -0x8f8200e4, 0x24100001, 0x3c040001, 0x24846930, +0x8f8200e4, 0x24100001, 0x3c040001, 0x248468a0, 0xafa20014, 0x8fa60020, 0x8fa70024, 0x3c050007, -0xc002b17, 0x34a53600, 0x320200ff, 0x10400010, +0xc002b3b, 0x34a53600, 0x320200ff, 0x10400010, 0x3c020080, 0x2c21024, 0x1440000e, 0x32c20400, 0x8fab006c, 0x3c020080, 0x34420100, 0x1621024, 0x10400005, 0x0, 0x8f42020c, 0x24420001, @@ -7115,8 +7120,8 @@ 0x2c420001, 0x621825, 0x10600004, 0x3c020100, 0x94820002, 0x453821, 0x3c020100, 0x2c21024, 0x5040000e, 0xafa70064, 0x8fac0064, 0x10ec0008, -0x3c050007, 0x3c040001, 0x24846998, 0x8fa60064, -0x34a54000, 0xafa00010, 0xc002b17, 0xafa00014, +0x3c050007, 0x3c040001, 0x24846908, 0x8fa60064, +0x34a54000, 0xafa00010, 0xc002b3b, 0xafa00014, 0x8fab0064, 0x256b0004, 0xafab0064, 0x8f420080, 0x8fac0064, 0x4c102b, 0x1040002c, 0x32c28000, 0x10400034, 0x240b0003, 0x32c21000, 0x10400031, @@ -7124,11 +7129,11 @@ 0x2403ffbf, 0x283a024, 0x24420001, 0xaf420350, 0x10000173, 0x8f420350, 0x3c020800, 0x2c2b025, 0x2402ffbf, 0x282a024, 0x8f830128, 0x3c040001, -0x24846960, 0x26620001, 0xafa20014, 0xafa30010, -0x8f860120, 0x8f870124, 0x3c050007, 0xc002b17, +0x248468d0, 0x26620001, 0xafa20014, 0xafa30010, +0x8f860120, 0x8f870124, 0x3c050007, 0xc002b3b, 0x34a55300, 0x10000162, 0x0, 0x8ea20000, -0x8ea30004, 0x3c040001, 0x24846978, 0xafb00010, -0xafb10014, 0x8ea70018, 0x34a55900, 0xc002b17, +0x8ea30004, 0x3c040001, 0x248468e8, 0xafb00010, +0xafb10014, 0x8ea70018, 0x34a55900, 0xc002b3b, 0x603021, 0x10000156, 0x0, 0x8f420084, 0x8fab0064, 0x4b102b, 0x14400007, 0x3c020001, 0x2c21024, 0x10400004, 0x0, 0x240c0002, @@ -7138,17 +7143,17 @@ 0x274b0054, 0x8f510054, 0x3403ecc0, 0xafab004c, 0x26220001, 0x304201ff, 0xafa20054, 0x111140, 0x431021, 0x1000006b, 0x2e2a821, 0x8f420044, -0x8fac0064, 0x3c040001, 0x2484693c, 0xafac0014, +0x8fac0064, 0x3c040001, 0x248468ac, 0xafac0014, 0xafa20010, 0x8f460054, 0x8f470050, 0x3c050007, -0xc002b17, 0x34a54300, 0x8f430350, 0x2402ffbf, +0xc002b3b, 0x34a54300, 0x8f430350, 0x2402ffbf, 0x282a024, 0x24630001, 0xaf430350, 0x10000124, 0x8f420350, 0x156c001d, 0x0, 0x8f430074, 0x8f420070, 0x1062000a, 0x274b0074, 0x8f510074, 0xafab004c, 0x26220001, 0x304203ff, 0xafa20054, 0x111140, 0x24426cc0, 0x1000004a, 0x2e2a821, -0x8f420044, 0x8fac0064, 0x3c040001, 0x24846948, +0x8f420044, 0x8fac0064, 0x3c040001, 0x248468b8, 0x3c050007, 0xafac0014, 0xafa20010, 0x8f460074, -0x8f470070, 0x34a54500, 0x240b0001, 0xc002b17, +0x8f470070, 0x34a54500, 0x240b0001, 0xc002b3b, 0xafab005c, 0x1000ffc3, 0x0, 0x8f430064, 0x8f420060, 0x1062001a, 0x274c0064, 0x8f510064, 0x8fab005c, 0xafac004c, 0x26220001, 0x304200ff, @@ -7157,9 +7162,9 @@ 0x9442002a, 0x8fac0044, 0x8fab0064, 0x4b102b, 0x10400024, 0x25950020, 0x240c0001, 0x10000021, 0xa3ac0087, 0x24424cc0, 0x1000001e, 0x2e2a821, -0x8f420044, 0x8fab0064, 0x3c040001, 0x24846954, +0x8f420044, 0x8fab0064, 0x3c040001, 0x248468c4, 0xafab0014, 0xafa20010, 0x8f460064, 0x8f470060, -0x3c050007, 0xc002b17, 0x34a54800, 0x3c020008, +0x3c050007, 0xc002b3b, 0x34a54800, 0x3c020008, 0x2c21024, 0x1440ff61, 0x0, 0x8f420370, 0x240c0001, 0xafac005c, 0x24420001, 0xaf420370, 0x1000ff90, 0x8f420370, 0x27a30036, 0x131040, @@ -7180,9 +7185,9 @@ 0x8f4200fc, 0x262102a, 0x10400016, 0x24030001, 0x1000001a, 0x306200ff, 0x8fac008c, 0x101040, 0x4c1021, 0x94470018, 0x101080, 0x4c1021, -0xafbe0010, 0x8c420008, 0x3c040001, 0x2484696c, +0xafbe0010, 0x8c420008, 0x3c040001, 0x248468dc, 0x3c050007, 0x8c430004, 0x8c420000, 0x34a55500, -0x2003021, 0xc002b17, 0xafa30014, 0x10000039, +0x2003021, 0xc002b3b, 0xafa30014, 0x10000039, 0x0, 0x8f420334, 0x1821, 0x24420001, 0xaf420334, 0x8f420334, 0x306200ff, 0x1040ff06, 0x8021, 0x8f430008, 0x2402fbff, 0x1260002d, @@ -7399,7 +7404,7 @@ 0x822023, 0x94820000, 0x2028021, 0x3c020100, 0x2c21024, 0x1040000e, 0x0, 0x8faa002c, 0x31420004, 0x1040000a, 0x0, 0x9504000e, -0x2642021, 0xc003ec4, 0x2484fffc, 0x3042ffff, +0x2642021, 0xc003eec, 0x2484fffc, 0x3042ffff, 0x2228821, 0x111c02, 0x3222ffff, 0x628821, 0x8faa0024, 0x1518823, 0x111402, 0x2228821, 0x2308821, 0x111402, 0x2228821, 0x3231ffff, @@ -7412,8 +7417,8 @@ 0xafa80018, 0x8f48010c, 0x1021, 0xa32821, 0xa3482b, 0x822021, 0x100f809, 0x892021, 0x1440000b, 0x0, 0x8f820128, 0x3c040001, -0x248469a4, 0xafbe0014, 0xafa20010, 0x8f860124, -0x8f870120, 0x3c050007, 0xc002b17, 0x34a59920, +0x24846914, 0xafbe0014, 0xafa20010, 0x8f860124, +0x8f870120, 0x3c050007, 0xc002b3b, 0x34a59920, 0x8f420368, 0x2442ffff, 0xaf420368, 0x8f420044, 0x8f430088, 0x24420001, 0x431024, 0xaf420044, 0x8faa0034, 0x8f440368, 0x24020001, 0x15420006, @@ -7430,9 +7435,9 @@ 0xafa20010, 0xafa30014, 0xafa80018, 0x8f42010c, 0x40f809, 0x24c6001c, 0x14400011, 0x24020001, 0x3c010001, 0x370821, 0xa02240f2, 0x8f820124, -0xafa20010, 0x8f820128, 0x3c040001, 0x2484691c, +0xafa20010, 0x8f820128, 0x3c040001, 0x2484688c, 0xafa20014, 0x8f460044, 0x8f870120, 0x3c050009, -0xc002b17, 0x34a51300, 0x1000000b, 0x0, +0xc002b3b, 0x34a51300, 0x1000000b, 0x0, 0x8f420304, 0x24420001, 0xaf420304, 0x8f420304, 0x8f420044, 0xaf42007c, 0x3c010001, 0x370821, 0xa02040f2, 0xaf400078, 0x8f420318, 0x24420001, @@ -7444,32 +7449,32 @@ 0xaf8200c8, 0x8f420138, 0xaf8200d0, 0x8f420138, 0xaf8200d4, 0x8f420138, 0x3e00008, 0xaf8200d8, 0x27bdffe0, 0x27840208, 0x24050200, 0xafbf0018, -0xc002b9b, 0x24060008, 0x8c020204, 0xc003fea, -0xaf820210, 0x3c020001, 0x8c426e14, 0x30420002, +0xc002bbf, 0x24060008, 0x8c020204, 0xc004012, +0xaf820210, 0x3c020001, 0x8c426d94, 0x30420002, 0x1040000e, 0x2021, 0x8c060248, 0x24020002, -0x3c010001, 0xac226e18, 0xc005134, 0x24050002, +0x3c010001, 0xac226d98, 0xc005104, 0x24050002, 0x2021, 0x8c060248, 0x24020001, 0x3c010001, -0xac226e18, 0x10000011, 0x24050001, 0x8c060248, -0x24020004, 0x3c010001, 0xac226e18, 0xc005134, -0x24050004, 0x3c020001, 0x8c426e14, 0x30420001, -0x10400008, 0x24020001, 0x3c010001, 0xac226e18, -0x2021, 0x24050001, 0x3c06601b, 0xc005134, -0x0, 0x3c040001, 0x24846a60, 0x8f420150, +0xac226d98, 0x10000011, 0x24050001, 0x8c060248, +0x24020004, 0x3c010001, 0xac226d98, 0xc005104, +0x24050004, 0x3c020001, 0x8c426d94, 0x30420001, +0x10400008, 0x24020001, 0x3c010001, 0xac226d98, +0x2021, 0x24050001, 0x3c06601b, 0xc005104, +0x0, 0x3c040001, 0x248469d0, 0x8f420150, 0x8f430154, 0x3c050008, 0x8f460158, 0x21640, 0x31940, 0x34630403, 0x431025, 0x633c0, 0x461025, 0xaf82021c, 0xafa00010, 0xafa00014, -0x8f86021c, 0x34a50200, 0xc002b17, 0x3821, -0x3c010001, 0xac206e10, 0x3c010001, 0xac206e28, +0x8f86021c, 0x34a50200, 0xc002b3b, 0x3821, +0x3c010001, 0xac206d90, 0x3c010001, 0xac206da8, 0x8fbf0018, 0x3e00008, 0x27bd0020, 0x27bdffe0, 0x3c050008, 0x34a50300, 0xafbf0018, 0xafa00010, -0xafa00014, 0x8f860200, 0x3c040001, 0x24846a6c, -0xc002b17, 0x3821, 0x8f420410, 0x24420001, +0xafa00014, 0x8f860200, 0x3c040001, 0x248469dc, +0xc002b3b, 0x3821, 0x8f420410, 0x24420001, 0xaf420410, 0x8f420410, 0x8fbf0018, 0x3e00008, 0x27bd0020, 0x27bdffd8, 0xafbf0020, 0xafb1001c, 0xafb00018, 0x8f4203a4, 0x24420001, 0xaf4203a4, 0x8f4203a4, 0x8f900220, 0x8f8200e0, 0xafa20010, 0x8f8200e4, 0xafa20014, 0x8f8600c4, 0x8f8700c8, -0x3c040001, 0x24846a78, 0xc002b17, 0x2002821, +0x3c040001, 0x248469e8, 0xc002b3b, 0x2002821, 0x3c044000, 0x2041024, 0x504000b4, 0x3c040100, 0x8f4203bc, 0x24420001, 0xaf4203bc, 0x8f4203bc, 0x8f8700c4, 0x8f8300c8, 0x8f420148, 0x671823, @@ -7518,26 +7523,26 @@ 0xaf4303cc, 0x10000039, 0x8f4203cc, 0x2041024, 0x1040000e, 0x3c110200, 0x8f4203a8, 0x24420001, 0xaf4203a8, 0x8f4203a8, 0x8f820220, 0x3c0308ff, -0x3463ffff, 0x431024, 0x441025, 0xc003d87, +0x3463ffff, 0x431024, 0x441025, 0xc003daf, 0xaf820220, 0x10000029, 0x0, 0x2111024, 0x50400008, 0x3c110400, 0x8f4203ac, 0x24420001, -0xaf4203ac, 0xc003d87, 0x8f4203ac, 0x10000019, +0xaf4203ac, 0xc003daf, 0x8f4203ac, 0x10000019, 0x0, 0x2111024, 0x1040001c, 0x0, 0x8f830224, 0x24021402, 0x14620009, 0x3c050008, -0x3c040001, 0x24846a84, 0xafa00010, 0xafa00014, -0x8f860224, 0x34a50500, 0xc002b17, 0x3821, +0x3c040001, 0x248469f4, 0xafa00010, 0xafa00014, +0x8f860224, 0x34a50500, 0xc002b3b, 0x3821, 0x8f4203b0, 0x24420001, 0xaf4203b0, 0x8f4203b0, -0x8f820220, 0x2002021, 0x34420002, 0xc004ecc, +0x8f820220, 0x2002021, 0x34420002, 0xc004e9c, 0xaf820220, 0x8f820220, 0x3c0308ff, 0x3463ffff, 0x431024, 0x511025, 0xaf820220, 0x8fbf0020, 0x8fb1001c, 0x8fb00018, 0x3e00008, 0x27bd0028, -0x3e00008, 0x0, 0x3c020001, 0x8c426e28, +0x3e00008, 0x0, 0x3c020001, 0x8c426da8, 0x27bdffb0, 0xafbf0048, 0xafbe0044, 0xafb50040, 0xafb3003c, 0xafb20038, 0xafb10034, 0x1040000f, -0xafb00030, 0x3c040001, 0x24846a90, 0x3c050008, +0xafb00030, 0x3c040001, 0x24846a00, 0x3c050008, 0xafa00010, 0xafa00014, 0x8f860220, 0x34a50600, -0x24020001, 0x3c010001, 0xac206e28, 0x3c010001, -0xac226e1c, 0xc002b17, 0x3821, 0x3c037fff, +0x24020001, 0x3c010001, 0xac206da8, 0x3c010001, +0xac226d9c, 0xc002b3b, 0x3821, 0x3c037fff, 0x8c020268, 0x3463ffff, 0x3c04fdff, 0x431024, 0xac020268, 0x8f420004, 0x3484ffff, 0x30420002, 0x10400092, 0x284a024, 0x3c040600, 0x34842000, @@ -7546,7 +7551,7 @@ 0x240200ff, 0x13c20002, 0xafaa002c, 0x27c50001, 0x8c020228, 0xa09021, 0x1642000e, 0x1e38c0, 0x8f42033c, 0x24420001, 0xaf42033c, 0x8f42033c, -0x8c020228, 0x3c040001, 0x24846a28, 0x3c050009, +0x8c020228, 0x3c040001, 0x24846998, 0x3c050009, 0xafa00014, 0xafa20010, 0x8fa60020, 0x1000006d, 0x34a50500, 0xf71021, 0x8fa30020, 0x8fa40024, 0xac4304c0, 0xac4404c4, 0x8f830054, 0x8f820054, @@ -7560,7 +7565,7 @@ 0x2c4203e9, 0x1440ffe9, 0x0, 0x326200ff, 0x54400017, 0xaf520018, 0x8f420378, 0x24420001, 0xaf420378, 0x8f420378, 0x8f820120, 0x8faa002c, -0xafa20010, 0x8f820124, 0x3c040001, 0x24846a34, +0xafa20010, 0x8f820124, 0x3c040001, 0x248469a4, 0x3c050009, 0xafa20014, 0x8d460000, 0x10000035, 0x34a50600, 0x8f420308, 0x24130001, 0x24420001, 0xaf420308, 0x8f420308, 0x1000001e, 0x326200ff, @@ -7574,21 +7579,21 @@ 0x326200ff, 0x14400011, 0x0, 0x8f420378, 0x24420001, 0xaf420378, 0x8f420378, 0x8f820120, 0x8faa002c, 0xafa20010, 0x8f820124, 0x3c040001, -0x24846a3c, 0x3c050009, 0xafa20014, 0x8d460000, -0x34a50700, 0xc002b17, 0x3c03821, 0x8f4202ec, +0x248469ac, 0x3c050009, 0xafa20014, 0x8d460000, +0x34a50700, 0xc002b3b, 0x3c03821, 0x8f4202ec, 0x24420001, 0xaf4202ec, 0x8f4202ec, 0x8fbf0048, 0x8fbe0044, 0x8fb50040, 0x8fb3003c, 0x8fb20038, 0x8fb10034, 0x8fb00030, 0x3e00008, 0x27bd0050, -0x3c020001, 0x8c426e28, 0x27bdffe0, 0x1440000d, -0xafbf0018, 0x3c040001, 0x24846a9c, 0x3c050008, +0x3c020001, 0x8c426da8, 0x27bdffe0, 0x1440000d, +0xafbf0018, 0x3c040001, 0x24846a0c, 0x3c050008, 0xafa00010, 0xafa00014, 0x8f860220, 0x34a50700, -0x24020001, 0x3c010001, 0xac226e28, 0xc002b17, +0x24020001, 0x3c010001, 0xac226da8, 0xc002b3b, 0x3821, 0x3c020004, 0x2c21024, 0x10400007, 0x0, 0x8f820220, 0x3c0308ff, 0x3463ffff, 0x431024, 0x34420008, 0xaf820220, 0x3c050001, -0x8ca56e18, 0x24020001, 0x14a20007, 0x2021, -0xc0052c7, 0x24050001, 0xac02026c, 0x8c03026c, -0x10000006, 0x3c020007, 0xc0052c7, 0x2021, +0x8ca56d98, 0x24020001, 0x14a20007, 0x2021, +0xc00529b, 0x24050001, 0xac02026c, 0x8c03026c, +0x10000006, 0x3c020007, 0xc00529b, 0x2021, 0xac020268, 0x8c030268, 0x3c020007, 0x621824, 0x3c020002, 0x5062000d, 0x3c0205f5, 0x43102b, 0x14400006, 0x3c020004, 0x3c020001, 0x10620009, @@ -7636,7 +7641,7 @@ 0x90a20000, 0x822021, 0x41c02, 0x3082ffff, 0x622021, 0x41c02, 0x3082ffff, 0x622021, 0x3e00008, 0x3082ffff, 0x0, 0x8f820220, -0x34420002, 0xaf820220, 0x3c020002, 0x8c429078, +0x34420002, 0xaf820220, 0x3c020002, 0x8c428ff8, 0x30424000, 0x10400054, 0x24040001, 0x8f820200, 0x24067fff, 0x8f830200, 0x30450002, 0x2402fffd, 0x621824, 0xaf830200, 0xaf840204, 0x8f830054, @@ -7683,1091 +7688,1069 @@ 0x43102b, 0x14400006, 0x3c026000, 0x3c024000, 0x10620008, 0x24020800, 0x10000008, 0x0, 0x10620004, 0x24020800, 0x10000004, 0x0, -0x24020700, 0x3c010001, 0xac226e2c, 0x3e00008, -0x0, 0x3c020001, 0x8c426e3c, 0x27bdffc8, -0xafbf0034, 0xafb20030, 0xafb1002c, 0xafb00028, -0x3c010001, 0x10400005, 0xac206e14, 0xc004dd1, -0x0, 0x3c010001, 0xac206e3c, 0x8f830054, +0x24020700, 0x3c010001, 0xac226dac, 0x3e00008, +0x0, 0x3c020001, 0x8c426dbc, 0x27bdffd0, +0xafbf002c, 0xafb20028, 0xafb10024, 0xafb00020, +0x3c010001, 0x10400005, 0xac206d94, 0xc004d9e, +0x0, 0x3c010001, 0xac206dbc, 0x8f830054, 0x8f820054, 0x10000002, 0x24630064, 0x8f820054, 0x621023, 0x2c420065, 0x1440fffc, 0x0, -0xc004dec, 0x0, 0x24040001, 0x2821, -0x27a60020, 0x34028000, 0xc00450e, 0xa7a20020, +0xc004db9, 0x0, 0x24040001, 0x2821, +0x27a60018, 0x34028000, 0xc0045be, 0xa7a20018, 0x8f830054, 0x8f820054, 0x10000002, 0x24630064, 0x8f820054, 0x621023, 0x2c420065, 0x1440fffc, -0x24040001, 0x24050001, 0xc0044cc, 0x27a60020, +0x24040001, 0x24050001, 0xc00457c, 0x27a60018, 0x8f830054, 0x8f820054, 0x10000002, 0x24630064, 0x8f820054, 0x621023, 0x2c420065, 0x1440fffc, -0x24040001, 0x24050001, 0xc0044cc, 0x27a60020, +0x24040001, 0x24050001, 0xc00457c, 0x27a60018, 0x8f830054, 0x8f820054, 0x10000002, 0x24630064, 0x8f820054, 0x621023, 0x2c420065, 0x1440fffc, -0x24040001, 0x24050002, 0xc0044cc, 0x27a60018, -0x8f830054, 0x8f820054, 0x10000002, 0x24630064, -0x8f820054, 0x621023, 0x2c420065, 0x1440fffc, -0x24040001, 0x24050003, 0xc0044cc, 0x27a6001a, -0x3c040001, 0x24846b70, 0x97a60020, 0x97a70018, -0x97a2001a, 0x3c05000d, 0x34a50100, 0xafa00014, -0xc002b17, 0xafa20010, 0x97a20020, 0x10400046, -0x24036040, 0x97a2001a, 0x3042fff0, 0x1443000b, -0x24020020, 0x97a30018, 0x1462000a, 0x24027830, -0x24020003, 0x3c010001, 0xac226e14, 0x24020005, -0x3c010001, 0x10000039, 0xac226fac, 0x97a30018, -0x24027830, 0x1462000b, 0x24030010, 0x97a2001a, -0x3042fff0, 0x14430007, 0x24020003, 0x3c010001, -0xac226e14, 0x24020006, 0x3c010001, 0x1000002b, -0xac226fac, 0x3c020001, 0x8c426e14, 0x97a30018, -0x34420001, 0x3c010001, 0xac226e14, 0x24020015, -0x1462000a, 0x0, 0x97a2001a, 0x3042fff0, -0x3843f420, 0x2c630001, 0x3842f430, 0x2c420001, -0x621825, 0x14600019, 0x24020003, 0x97a30018, -0x24027810, 0x14620015, 0x24020002, 0x97a2001a, -0x3042fff0, 0x14400011, 0x24020002, 0x1000000f, -0x24020004, 0x3c020001, 0x8c426e14, 0x34420008, -0x3c010001, 0xac226e14, 0x1000005e, 0x24020004, -0x3c020001, 0x8c426e14, 0x34420004, 0x3c010001, -0x100000af, 0xac226e14, 0x24020001, 0x3c010001, -0xac226fb8, 0x3c020001, 0x8c426e14, 0x30420002, -0x144000b2, 0x3c09fff0, 0x24020e00, 0xaf820238, -0x8f840054, 0x8f820054, 0x24030008, 0x3c010001, -0xac236e18, 0x10000002, 0x248401f4, 0x8f820054, -0x821023, 0x2c4201f5, 0x1440fffc, 0x3c0200c8, -0x344201fb, 0xaf820238, 0x8f830054, 0x8f820054, -0x10000002, 0x246301f4, 0x8f820054, 0x621023, -0x2c4201f5, 0x1440fffc, 0x8021, 0x24120001, -0x24110009, 0xc0043d3, 0x0, 0x3c010001, -0xac326e34, 0xc004498, 0x0, 0x3c020001, -0x8c426e34, 0x1451fffb, 0x3c0200c8, 0x344201f6, +0x24040001, 0x3c060001, 0x24c66f24, 0xc00457c, +0x24050002, 0x8f830054, 0x8f820054, 0x10000002, +0x24630064, 0x8f820054, 0x621023, 0x2c420065, +0x1440fffc, 0x24040001, 0x24050003, 0x3c100001, +0x26106f26, 0xc00457c, 0x2003021, 0x97a60018, +0x3c070001, 0x94e76f24, 0x3c040001, 0x24846ae0, +0xafa00014, 0x96020000, 0x3c05000d, 0x34a50100, +0xc002b3b, 0xafa20010, 0x97a20018, 0x1040004d, +0x24036040, 0x96020000, 0x3042fff0, 0x1443000c, +0x24020020, 0x3c030001, 0x94636f24, 0x1462000b, +0x24027830, 0x24020003, 0x3c010001, 0xac226d94, +0x24020005, 0x3c010001, 0x1000003f, 0xac226f34, +0x3c030001, 0x94636f24, 0x24027830, 0x1462000c, +0x24030010, 0x3c020001, 0x94426f26, 0x3042fff0, +0x14430007, 0x24020003, 0x3c010001, 0xac226d94, +0x24020006, 0x3c010001, 0x1000002f, 0xac226f34, +0x3c020001, 0x8c426d94, 0x3c030001, 0x94636f24, +0x34420001, 0x3c010001, 0xac226d94, 0x24020015, +0x1462000b, 0x0, 0x3c020001, 0x94426f26, +0x3042fff0, 0x3843f420, 0x2c630001, 0x3842f430, +0x2c420001, 0x621825, 0x1460001b, 0x24020003, +0x3c030001, 0x94636f24, 0x24027810, 0x14620016, +0x24020002, 0x3c020001, 0x94426f26, 0x3042fff0, +0x14400011, 0x24020002, 0x1000000f, 0x24020004, +0x3c020001, 0x8c426d94, 0x34420008, 0x3c010001, +0xac226d94, 0x1000005e, 0x24020004, 0x3c020001, +0x8c426d94, 0x34420004, 0x3c010001, 0x100000af, +0xac226d94, 0x24020001, 0x3c010001, 0xac226f40, +0x3c020001, 0x8c426d94, 0x30420002, 0x144000b2, +0x3c09fff0, 0x24020e00, 0xaf820238, 0x8f840054, +0x8f820054, 0x24030008, 0x3c010001, 0xac236d98, +0x10000002, 0x248401f4, 0x8f820054, 0x821023, +0x2c4201f5, 0x1440fffc, 0x3c0200c8, 0x344201fb, 0xaf820238, 0x8f830054, 0x8f820054, 0x10000002, -0x2463000a, 0x8f820054, 0x621023, 0x2c42000b, -0x1440fffc, 0x0, 0x8f820220, 0x24040001, -0x34420002, 0xaf820220, 0x8f830200, 0x24057fff, -0x2402fffd, 0x621824, 0xaf830200, 0xaf840204, -0x8f830054, 0x8f820054, 0x10000002, 0x24630001, -0x8f820054, 0x621023, 0x2c420002, 0x1440fffc, -0x0, 0x8f820224, 0x14440005, 0x34028000, -0x42040, 0xa4102b, 0x1040fff0, 0x34028000, -0x1082ffa0, 0x26100001, 0x2e020014, 0x1440ffcd, -0x24020004, 0x3c010001, 0xac226e18, 0x8021, -0x24120009, 0x3c11ffff, 0x36313f7f, 0xc0043d3, -0x0, 0x24020001, 0x3c010001, 0xac226e34, -0xc004498, 0x0, 0x3c020001, 0x8c426e34, -0x1452fffb, 0x0, 0x8f820044, 0x511024, -0x34425080, 0xaf820044, 0x8f830054, 0x8f820054, -0x10000002, 0x2463000a, 0x8f820054, 0x621023, -0x2c42000b, 0x1440fffc, 0x0, 0x8f820044, -0x511024, 0x3442f080, 0xaf820044, 0x8f830054, -0x8f820054, 0x10000002, 0x2463000a, 0x8f820054, -0x621023, 0x2c42000b, 0x1440fffc, 0x0, -0x8f820220, 0x3c03f700, 0x431025, 0xaf820220, -0x8f830054, 0x8f820054, 0x10000002, 0x24630064, -0x8f820054, 0x621023, 0x2c420065, 0x1440fffc, +0x246301f4, 0x8f820054, 0x621023, 0x2c4201f5, +0x1440fffc, 0x8021, 0x24120001, 0x24110009, +0xc004482, 0x0, 0x3c010001, 0xac326db4, +0xc004547, 0x0, 0x3c020001, 0x8c426db4, +0x1451fffb, 0x3c0200c8, 0x344201f6, 0xaf820238, +0x8f830054, 0x8f820054, 0x10000002, 0x2463000a, +0x8f820054, 0x621023, 0x2c42000b, 0x1440fffc, 0x0, 0x8f820220, 0x24040001, 0x34420002, 0xaf820220, 0x8f830200, 0x24057fff, 0x2402fffd, 0x621824, 0xaf830200, 0xaf840204, 0x8f830054, 0x8f820054, 0x10000002, 0x24630001, 0x8f820054, 0x621023, 0x2c420002, 0x1440fffc, 0x0, 0x8f820224, 0x14440005, 0x34028000, 0x42040, -0xa4102b, 0x1040fff0, 0x34028000, 0x1082ff50, -0x26100001, 0x2e020064, 0x1440ffb0, 0x0, -0x3c020001, 0x8c426e14, 0x30420004, 0x14400007, -0x3c09fff0, 0x8f820044, 0x3c03ffff, 0x34633f7f, -0x431024, 0xaf820044, 0x3c09fff0, 0x3529bdc0, -0x8f830054, 0x3c060001, 0x8cc66e14, 0x3c070001, -0x8ce76fb8, 0x97a80018, 0x3c040001, 0x24846b70, -0x24020001, 0x3c010001, 0xac226e1c, 0xafa80010, -0x97a2001a, 0x3c05000d, 0x34a50100, 0x3c010001, -0xac206e18, 0x691821, 0x3c010001, 0xac236fa8, -0xc002b17, 0xafa20014, 0x8fbf0034, 0x8fb20030, -0x8fb1002c, 0x8fb00028, 0x3e00008, 0x27bd0038, -0x27bdffe8, 0x3c050001, 0x8ca56e18, 0x24060004, -0x24020001, 0x14a20014, 0xafbf0010, 0x3c020002, -0x8c42907c, 0x30428000, 0x10400005, 0x3c04000f, -0x3c030001, 0x8c636fb8, 0x10000005, 0x34844240, -0x3c040004, 0x3c030001, 0x8c636fb8, 0x348493e0, -0x24020005, 0x14620016, 0x0, 0x3c04003d, -0x10000013, 0x34840900, 0x3c020002, 0x8c429078, -0x30428000, 0x10400005, 0x3c04001e, 0x3c030001, -0x8c636fb8, 0x10000005, 0x34848480, 0x3c04000f, -0x3c030001, 0x8c636fb8, 0x34844240, 0x24020005, -0x14620003, 0x0, 0x3c04007a, 0x34841200, -0x3c020001, 0x8c426fa8, 0x8f830054, 0x441021, -0x431023, 0x44102b, 0x1440004b, 0x0, -0x3c020001, 0x8c426e20, 0x14400047, 0x0, -0x3c010001, 0x10c00025, 0xac206e30, 0x3c090001, -0x8d296e14, 0x24070001, 0x3c044000, 0x3c080002, -0x2508907c, 0x250afffc, 0x52842, 0x14a00002, -0x24c6ffff, 0x24050008, 0xa91024, 0x10400010, -0x0, 0x14a70008, 0x0, 0x8d020000, -0x441024, 0x1040000a, 0x0, 0x3c010001, -0x10000007, 0xac256e30, 0x8d420000, 0x441024, -0x10400003, 0x0, 0x3c010001, 0xac276e30, -0x3c020001, 0x8c426e30, 0x6182b, 0x2c420001, -0x431024, 0x5440ffe5, 0x52842, 0x8f820054, -0x3c030001, 0x8c636e30, 0x3c010001, 0xac226fa8, -0x1060003a, 0x24020005, 0x3c030001, 0x8c636fb8, -0x3c010001, 0xac256e18, 0x14620011, 0x24020001, -0x3c020002, 0x8c429078, 0x3c032000, 0x431024, -0x14400006, 0x24020001, 0x3c010001, 0xac206f98, -0x3c010001, 0xac226e18, 0x24020001, 0x3c010001, -0xac226ea4, 0x3c010001, 0xac226e24, 0x24020001, -0x3c010001, 0xac226e1c, 0x3c020001, 0x8c426e30, -0x1040001e, 0x0, 0x3c020001, 0x8c426e1c, -0x10400008, 0x24020001, 0x3c010001, 0xac206e1c, -0xaee204b8, 0x3c010001, 0xac206e9c, 0x3c010001, -0xac226e54, 0x8ee304b8, 0x24020008, 0x10620005, -0x24020001, 0xc004203, 0x0, 0x1000000b, -0x0, 0x3c030001, 0x8c636e18, 0x10620007, -0x2402000e, 0x3c030002, 0x8c639010, 0x10620003, -0x0, 0xc004ecc, 0x8f840220, 0x8fbf0010, -0x3e00008, 0x27bd0018, 0x27bdffe0, 0x3c03fdff, -0x3c040001, 0x8c846e18, 0x3c020001, 0x8c426e40, -0x3463ffff, 0x283a024, 0xafbf001c, 0x14820006, -0xafb00018, 0x8ee304b8, 0x3c020001, 0x8c426e44, -0x10620006, 0x0, 0x8ee204b8, 0x3c010001, -0xac246e40, 0x3c010001, 0xac226e44, 0x3c030001, -0x8c636e18, 0x24020002, 0x10620167, 0x2c620003, -0x10400005, 0x24020001, 0x1062000a, 0x0, -0x100001ab, 0x0, 0x24020004, 0x10620081, -0x24020008, 0x106200d5, 0x24020001, 0x100001a4, -0x0, 0x8ee204b8, 0x2443ffff, 0x2c620008, -0x104001a1, 0x31080, 0x3c010001, 0x220821, -0x8c226b88, 0x400008, 0x0, 0x3c030001, -0x8c636fb8, 0x24020005, 0x14620010, 0x0, -0x3c020001, 0x8c426e24, 0x10400008, 0x24020003, -0xc0043d3, 0x0, 0x24020002, 0xaee204b8, -0x3c010001, 0x10000002, 0xac206e24, 0xaee204b8, -0x3c010001, 0x10000188, 0xac206db0, 0xc0043d3, -0x0, 0x3c020001, 0x8c426e24, 0x3c010001, -0xac206db0, 0x14400145, 0x24020002, 0x10000163, -0x24020007, 0x24020001, 0x3c010001, 0xc00454f, -0xac226e50, 0x3c030001, 0x8c636e50, 0x10000144, -0x24020011, 0x3c020001, 0x8c426fb8, 0x24100005, -0x10500007, 0x0, 0x3c050001, 0x8ca56e18, -0x3c060002, 0x8cc6907c, 0xc005134, 0x2021, -0x3c010001, 0xac206e24, 0x10000167, 0xaef004b8, -0x3c040001, 0x24846b7c, 0x3c05000f, 0x34a50100, -0x3021, 0x3821, 0xafa00010, 0xc002b17, -0xafa00014, 0x1000015c, 0x0, 0x8f820220, -0x3c030004, 0x431024, 0x1440013c, 0x24020007, -0x8f830054, 0x3c020001, 0x8c426fa0, 0x2463d8f0, -0x431023, 0x2c422710, 0x1440014f, 0x24020001, -0x1000014b, 0x0, 0x3c050001, 0x8ca56e18, -0xc0052c7, 0x2021, 0xc00553d, 0x2021, -0x3c030002, 0x8c639074, 0x4610141, 0x24020001, -0x3c020008, 0x621024, 0x10400006, 0x0, -0x8f820214, 0x3c03ffff, 0x431024, 0x10000005, -0x3442251f, 0x8f820214, 0x3c03ffff, 0x431024, -0x3442241f, 0xaf820214, 0x8f820220, 0x3c030200, -0x283a025, 0x34420002, 0xaf820220, 0x24020008, -0xc003e45, 0xaee204b8, 0x3c010001, 0x1000012a, -0xac206ea0, 0x8ee204b8, 0x2443ffff, 0x2c620008, -0x10400125, 0x31080, 0x3c010001, 0x220821, -0x8c226ba8, 0x400008, 0x0, 0xc004498, -0x0, 0x3c030001, 0x8c636e34, 0x100000e8, -0x24020009, 0x3c020002, 0x8c429078, 0x30424000, -0x10400004, 0x0, 0x8f820044, 0x10000006, -0x3442f080, 0x8f820044, 0x3c03ffff, 0x34633f7f, -0x431024, 0x3442a080, 0xaf820044, 0x8f830054, -0x100000ea, 0x24020004, 0x8f830054, 0x3c020001, -0x8c426fa0, 0x2463d8f0, 0x431023, 0x2c422710, -0x14400101, 0x24020005, 0x100000d8, 0x0, +0xa4102b, 0x1040fff0, 0x34028000, 0x1082ffa0, +0x26100001, 0x2e020014, 0x1440ffcd, 0x24020004, +0x3c010001, 0xac226d98, 0x8021, 0x24120009, +0x3c11ffff, 0x36313f7f, 0xc004482, 0x0, +0x24020001, 0x3c010001, 0xac226db4, 0xc004547, +0x0, 0x3c020001, 0x8c426db4, 0x1452fffb, +0x0, 0x8f820044, 0x511024, 0x34425080, +0xaf820044, 0x8f830054, 0x8f820054, 0x10000002, +0x2463000a, 0x8f820054, 0x621023, 0x2c42000b, +0x1440fffc, 0x0, 0x8f820044, 0x511024, +0x3442f080, 0xaf820044, 0x8f830054, 0x8f820054, +0x10000002, 0x2463000a, 0x8f820054, 0x621023, +0x2c42000b, 0x1440fffc, 0x0, 0x8f820220, +0x3c03f700, 0x431025, 0xaf820220, 0x8f830054, +0x8f820054, 0x10000002, 0x24630064, 0x8f820054, +0x621023, 0x2c420065, 0x1440fffc, 0x0, +0x8f820220, 0x24040001, 0x34420002, 0xaf820220, +0x8f830200, 0x24057fff, 0x2402fffd, 0x621824, +0xaf830200, 0xaf840204, 0x8f830054, 0x8f820054, +0x10000002, 0x24630001, 0x8f820054, 0x621023, +0x2c420002, 0x1440fffc, 0x0, 0x8f820224, +0x14440005, 0x34028000, 0x42040, 0xa4102b, +0x1040fff0, 0x34028000, 0x1082ff50, 0x26100001, +0x2e020064, 0x1440ffb0, 0x0, 0x3c020001, +0x8c426d94, 0x30420004, 0x14400007, 0x3c09fff0, +0x8f820044, 0x3c03ffff, 0x34633f7f, 0x431024, +0xaf820044, 0x3c09fff0, 0x3529bdc0, 0x3c060001, +0x8cc66d94, 0x3c040001, 0x24846ae0, 0x24020001, +0x3c010001, 0xac226d9c, 0x8f820054, 0x3c070001, +0x8ce76f40, 0x3c030001, 0x94636f24, 0x3c080001, +0x95086f26, 0x3c05000d, 0x34a50100, 0x3c010001, +0xac206d98, 0x491021, 0x3c010001, 0xac226f30, +0xafa30010, 0xc002b3b, 0xafa80014, 0x8fbf002c, +0x8fb20028, 0x8fb10024, 0x8fb00020, 0x3e00008, +0x27bd0030, 0x27bdffe8, 0x3c050001, 0x8ca56d98, +0x24060004, 0x24020001, 0x14a20014, 0xafbf0010, +0x3c020002, 0x8c428ffc, 0x30428000, 0x10400005, +0x3c04000f, 0x3c030001, 0x8c636f40, 0x10000005, +0x34844240, 0x3c040004, 0x3c030001, 0x8c636f40, +0x348493e0, 0x24020005, 0x14620016, 0x0, +0x3c04003d, 0x10000013, 0x34840900, 0x3c020002, +0x8c428ff8, 0x30428000, 0x10400005, 0x3c04001e, +0x3c030001, 0x8c636f40, 0x10000005, 0x34848480, +0x3c04000f, 0x3c030001, 0x8c636f40, 0x34844240, +0x24020005, 0x14620003, 0x0, 0x3c04007a, +0x34841200, 0x3c020001, 0x8c426f30, 0x8f830054, +0x441021, 0x431023, 0x44102b, 0x1440004c, +0x0, 0x3c020001, 0x8c426da0, 0x14400048, +0x0, 0x3c010001, 0x10c00025, 0xac206db0, +0x3c090001, 0x8d296d94, 0x24070001, 0x3c044000, +0x3c080002, 0x25088ffc, 0x250afffc, 0x52842, +0x14a00002, 0x24c6ffff, 0x24050008, 0xa91024, +0x10400010, 0x0, 0x14a70008, 0x0, +0x8d020000, 0x441024, 0x1040000a, 0x0, +0x3c010001, 0x10000007, 0xac256db0, 0x8d420000, +0x441024, 0x10400003, 0x0, 0x3c010001, +0xac276db0, 0x3c020001, 0x8c426db0, 0x6182b, +0x2c420001, 0x431024, 0x5440ffe5, 0x52842, +0x8f820054, 0x3c030001, 0x8c636db0, 0x3c010001, +0xac226f30, 0x1060003b, 0x24020005, 0x3c030001, +0x8c636f40, 0x3c010001, 0xac256d98, 0x14620012, +0x24020001, 0x3c020002, 0x8c428ff8, 0x3c032000, +0x34635000, 0x431024, 0x14400006, 0x24020001, +0x3c010001, 0xac206f1c, 0x3c010001, 0xac226d98, +0x24020001, 0x3c010001, 0xac226e24, 0x3c010001, +0xac226da4, 0x24020001, 0x3c010001, 0xac226d9c, +0x3c020001, 0x8c426db0, 0x1040001e, 0x0, +0x3c020001, 0x8c426d9c, 0x10400008, 0x24020001, +0x3c010001, 0xac206d9c, 0xaee204b8, 0x3c010001, +0xac206e1c, 0x3c010001, 0xac226dd4, 0x8ee304b8, +0x24020008, 0x10620005, 0x24020001, 0xc004239, +0x0, 0x1000000b, 0x0, 0x3c030001, +0x8c636d98, 0x10620007, 0x2402000e, 0x3c030002, +0x8c638f90, 0x10620003, 0x0, 0xc004e9c, +0x8f840220, 0x8fbf0010, 0x3e00008, 0x27bd0018, +0x27bdffe0, 0x3c03fdff, 0x3c040001, 0x8c846d98, +0x3c020001, 0x8c426dc0, 0x3463ffff, 0x283a024, +0x14820006, 0xafbf0018, 0x8ee304b8, 0x3c020001, +0x8c426dc4, 0x10620006, 0x0, 0x8ee204b8, +0x3c010001, 0xac246dc0, 0x3c010001, 0xac226dc4, +0x3c030001, 0x8c636d98, 0x24020002, 0x1062019c, +0x2c620003, 0x10400005, 0x24020001, 0x1062000a, +0x0, 0x10000226, 0x0, 0x24020004, +0x106200b6, 0x24020008, 0x1062010a, 0x24020001, +0x1000021f, 0x0, 0x8ee204b8, 0x2443ffff, +0x2c620008, 0x1040021c, 0x31080, 0x3c010001, +0x220821, 0x8c226af8, 0x400008, 0x0, +0x3c030001, 0x8c636f40, 0x24020005, 0x14620010, +0x0, 0x3c020001, 0x8c426da4, 0x10400008, +0x24020003, 0xc004482, 0x0, 0x24020002, +0xaee204b8, 0x3c010001, 0x10000002, 0xac206da4, +0xaee204b8, 0x3c010001, 0x10000203, 0xac206d30, +0xc004482, 0x0, 0x3c020001, 0x8c426da4, +0x3c010001, 0xac206d30, 0x1440017a, 0x24020002, +0x1000019d, 0x24020007, 0x3c030001, 0x8c636f40, +0x24020005, 0x14620003, 0x24020001, 0x3c010001, +0xac226dd0, 0xc0045ff, 0x0, 0x3c030001, +0x8c636dd0, 0x10000174, 0x24020011, 0x3c050001, +0x8ca56d98, 0x3c060002, 0x8cc68ffc, 0xc005104, +0x2021, 0x24020005, 0x3c010001, 0xac206da4, +0x100001e1, 0xaee204b8, 0x3c040001, 0x24846aec, +0x3c05000f, 0x34a50100, 0x3021, 0x3821, +0xafa00010, 0xc002b3b, 0xafa00014, 0x100001d6, +0x0, 0x8f820220, 0x3c030004, 0x431024, +0x14400175, 0x24020007, 0x8f830054, 0x3c020001, +0x8c426f28, 0x2463d8f0, 0x431023, 0x2c422710, +0x14400003, 0x24020001, 0x3c010001, 0xac226d9c, +0x3c020002, 0x8c428ffc, 0x30425000, 0x104001c2, +0x0, 0x8f820220, 0x30428000, 0x1040017d, +0x0, 0x10000175, 0x0, 0x3c050001, +0x8ca56d98, 0xc00529b, 0x2021, 0xc00551b, +0x2021, 0x3c030002, 0x8c638ff4, 0x46101b0, +0x24020001, 0x3c020008, 0x621024, 0x10400006, +0x0, 0x8f820214, 0x3c03ffff, 0x431024, +0x10000005, 0x3442251f, 0x8f820214, 0x3c03ffff, +0x431024, 0x3442241f, 0xaf820214, 0x8f820220, +0x3c030200, 0x34420002, 0xaf820220, 0x24020008, +0xaee204b8, 0x8f820220, 0x283a025, 0x3c030004, +0x431024, 0x14400016, 0x0, 0x3c020002, +0x8c428ffc, 0x30425000, 0x1040000d, 0x0, +0x8f820220, 0x30428000, 0x10400006, 0x0, +0x8f820220, 0x3c03ffff, 0x34637fff, 0x10000003, +0x431024, 0x8f820220, 0x34428000, 0xaf820220, 0x8f820220, 0x3c03f700, 0x431025, 0xaf820220, -0xaf800204, 0x3c010002, 0x100000d6, 0xac209060, -0x8f830054, 0x3c020001, 0x8c426fa0, 0x2463fff6, -0x431023, 0x2c42000a, 0x144000ef, 0x24020007, -0x100000d2, 0x0, 0xc003f28, 0x0, -0x104000e7, 0x24020001, 0x8f820214, 0x3c03ffff, -0x3c040001, 0x8c846f98, 0x431024, 0x3442251f, -0xaf820214, 0x24020008, 0x10800005, 0xaee204b8, -0x3c020001, 0x8c426ec4, 0x10400064, 0x24020001, -0x8f820220, 0x3c030008, 0x431024, 0x1040006a, -0x3c020200, 0x10000078, 0x0, 0x8ee204b8, -0x2443ffff, 0x2c620007, 0x104000cf, 0x31080, -0x3c010001, 0x220821, 0x8c226bc8, 0x400008, -0x0, 0xc003d87, 0x0, 0x3c010001, -0xac206e1c, 0xaf800204, 0x3c010002, 0xc0043d3, -0xac209060, 0x24020001, 0x3c010001, 0xac226e34, -0x24020002, 0x100000bc, 0xaee204b8, 0xc004498, -0x0, 0x3c030001, 0x8c636e34, 0x10000084, -0x24020009, 0x3c020002, 0x8c429078, 0x30424000, -0x10400003, 0x3c0200c8, 0x10000002, 0x344201f6, -0x344201fe, 0xaf820238, 0x8f830054, 0x1000008b, -0x24020004, 0x8f830054, 0x3c020001, 0x8c426fa0, -0x2463d8f0, 0x431023, 0x2c422710, 0x144000a2, -0x24020005, 0x10000079, 0x0, 0x8f820220, -0x3c03f700, 0x431025, 0xaf820220, 0xaf800204, -0x3c010002, 0x10000077, 0xac209060, 0x8f830054, -0x3c020001, 0x8c426fa0, 0x2463fff6, 0x431023, -0x2c42000a, 0x14400090, 0x24020007, 0x10000073, -0x0, 0xc003f28, 0x0, 0x10400088, -0x24020001, 0x8f820214, 0x3c03ffff, 0x3c040001, -0x8c846f98, 0x431024, 0x3442251f, 0xaf820214, -0x24020008, 0x1080000f, 0xaee204b8, 0x3c020001, -0x8c426ec4, 0x1440000b, 0x0, 0x8f820220, -0x34420002, 0xaf820220, 0x24020001, 0x3c010002, -0xac229010, 0xc004ecc, 0x8f840220, 0x10000016, -0x0, 0x8f820220, 0x3c030008, 0x431024, -0x14400011, 0x3c020200, 0x282a025, 0x2402000e, -0x3c010002, 0xac229010, 0xc00553d, 0x2021, -0x8f820220, 0x34420002, 0xc003e45, 0xaf820220, -0x3c050001, 0x8ca56e18, 0xc0052c7, 0x2021, -0x1000005d, 0x0, 0x3c020001, 0x8c426ec4, -0x10400059, 0x0, 0x3c020001, 0x8c426ec0, -0x2442ffff, 0x3c010001, 0xac226ec0, 0x14400052, -0x24020002, 0x3c010001, 0xac206ec4, 0x3c010001, -0x1000004d, 0xac226ec0, 0x8ee204b8, 0x2443ffff, -0x2c620007, 0x10400048, 0x31080, 0x3c010001, -0x220821, 0x8c226be8, 0x400008, 0x0, -0x3c020001, 0x8c426e24, 0x10400024, 0x24020007, -0xc0043d3, 0x0, 0x24020002, 0xaee204b8, -0x3c010001, 0x10000038, 0xac206e24, 0xc0048b3, -0x0, 0x3c030001, 0x8c636e54, 0x24020006, -0x14620031, 0x24020003, 0x1000002f, 0xaee204b8, -0x3c050001, 0x8ca56e18, 0x3c060002, 0x8cc69078, -0xc005134, 0x2021, 0x24020005, 0x10000026, -0xaee204b8, 0x8f820220, 0x3c03f700, 0x431025, -0xaf820220, 0x8f830054, 0x24020006, 0xaee204b8, -0x3c010001, 0x1000001c, 0xac236fa0, 0x1000001a, -0xaee204b8, 0x3c050001, 0x8ca56e18, 0xc0052c7, -0x2021, 0xc00553d, 0x2021, 0x3c020002, -0x8c429070, 0x441000e, 0x24020001, 0x8f820214, +0x3c030001, 0x8c636f40, 0x24020005, 0x1462000a, +0x0, 0x3c020001, 0x94426f26, 0x24429fbc, +0x2c420004, 0x10400004, 0x24040018, 0x24050002, +0xc004ddb, 0x24060020, 0xc003e6d, 0x0, +0x3c010001, 0x10000170, 0xac206e20, 0x8ee204b8, +0x2443ffff, 0x2c620008, 0x1040016b, 0x31080, +0x3c010001, 0x220821, 0x8c226b18, 0x400008, +0x0, 0xc004547, 0x0, 0x3c030001, +0x8c636db4, 0x100000e8, 0x24020009, 0x3c020002, +0x8c428ff8, 0x30424000, 0x10400004, 0x0, +0x8f820044, 0x10000006, 0x3442f080, 0x8f820044, +0x3c03ffff, 0x34633f7f, 0x431024, 0x3442a080, +0xaf820044, 0x8f830054, 0x100000ea, 0x24020004, +0x8f830054, 0x3c020001, 0x8c426f28, 0x2463d8f0, +0x431023, 0x2c422710, 0x14400147, 0x24020005, +0x100000d8, 0x0, 0x8f820220, 0x3c03f700, +0x431025, 0xaf820220, 0xaf800204, 0x3c010002, +0x100000d6, 0xac208fe0, 0x8f830054, 0x3c020001, +0x8c426f28, 0x2463fff6, 0x431023, 0x2c42000a, +0x14400135, 0x24020007, 0x100000d7, 0x0, +0xc003f50, 0x0, 0x1040012d, 0x24020001, +0x8f820214, 0x3c03ffff, 0x3c040001, 0x8c846f1c, +0x431024, 0x3442251f, 0xaf820214, 0x24020008, +0x10800005, 0xaee204b8, 0x3c020001, 0x8c426e44, +0x10400064, 0x24020001, 0x8f820220, 0x3c030008, +0x431024, 0x1040006a, 0x3c020200, 0x10000078, +0x0, 0x8ee204b8, 0x2443ffff, 0x2c620007, +0x10400115, 0x31080, 0x3c010001, 0x220821, +0x8c226b38, 0x400008, 0x0, 0xc003daf, +0x0, 0x3c010001, 0xac206d9c, 0xaf800204, +0x3c010002, 0xc004482, 0xac208fe0, 0x24020001, +0x3c010001, 0xac226db4, 0x24020002, 0x10000102, +0xaee204b8, 0xc004547, 0x0, 0x3c030001, +0x8c636db4, 0x10000084, 0x24020009, 0x3c020002, +0x8c428ff8, 0x30424000, 0x10400003, 0x3c0200c8, +0x10000002, 0x344201f6, 0x344201fe, 0xaf820238, +0x8f830054, 0x1000008b, 0x24020004, 0x8f830054, +0x3c020001, 0x8c426f28, 0x2463d8f0, 0x431023, +0x2c422710, 0x144000e8, 0x24020005, 0x10000079, +0x0, 0x8f820220, 0x3c03f700, 0x431025, +0xaf820220, 0xaf800204, 0x3c010002, 0x10000077, +0xac208fe0, 0x8f830054, 0x3c020001, 0x8c426f28, +0x2463fff6, 0x431023, 0x2c42000a, 0x144000d6, +0x24020007, 0x10000078, 0x0, 0xc003f50, +0x0, 0x104000ce, 0x24020001, 0x8f820214, +0x3c03ffff, 0x3c040001, 0x8c846f1c, 0x431024, +0x3442251f, 0xaf820214, 0x24020008, 0x1080000f, +0xaee204b8, 0x3c020001, 0x8c426e44, 0x1440000b, +0x0, 0x8f820220, 0x34420002, 0xaf820220, +0x24020001, 0x3c010002, 0xac228f90, 0xc004e9c, +0x8f840220, 0x10000016, 0x0, 0x8f820220, +0x3c030008, 0x431024, 0x14400011, 0x3c020200, +0x282a025, 0x2402000e, 0x3c010002, 0xac228f90, +0xc00551b, 0x2021, 0x8f820220, 0x34420002, +0xc003e6d, 0xaf820220, 0x3c050001, 0x8ca56d98, +0xc00529b, 0x2021, 0x100000a3, 0x0, +0x3c020001, 0x8c426e44, 0x1040009f, 0x0, +0x3c020001, 0x8c426e40, 0x2442ffff, 0x3c010001, +0xac226e40, 0x14400098, 0x24020002, 0x3c010001, +0xac206e44, 0x3c010001, 0x10000093, 0xac226e40, +0x8ee204b8, 0x2443ffff, 0x2c620007, 0x1040008e, +0x31080, 0x3c010001, 0x220821, 0x8c226b58, +0x400008, 0x0, 0x3c020001, 0x8c426da4, +0x10400018, 0x24020005, 0xc004482, 0x0, +0x24020002, 0xaee204b8, 0x3c010001, 0x1000007e, +0xac206da4, 0xc004963, 0x0, 0x3c030001, +0x8c636dd4, 0x24020006, 0x14620077, 0x24020003, +0x10000075, 0xaee204b8, 0x3c050001, 0x8ca56d98, +0x3c060002, 0x8cc68ff8, 0xc005104, 0x2021, +0x24020005, 0x1000006c, 0xaee204b8, 0x8f820220, +0x3c03f700, 0x431025, 0xaf820220, 0x8f830054, +0x24020006, 0xaee204b8, 0x3c010001, 0x10000062, +0xac236f28, 0x8f820220, 0x3c030004, 0x431024, +0x10400003, 0x24020007, 0x1000005b, 0xaee204b8, +0x8f830054, 0x3c020001, 0x8c426f28, 0x2463d8f0, +0x431023, 0x2c422710, 0x14400003, 0x24020001, +0x3c010001, 0xac226d9c, 0x3c020002, 0x8c428ff8, +0x30425000, 0x1040004c, 0x0, 0x8f820220, +0x30428000, 0x10400007, 0x0, 0x8f820220, +0x3c03ffff, 0x34637fff, 0x431024, 0x10000042, +0xaf820220, 0x8f820220, 0x34428000, 0x1000003e, +0xaf820220, 0x3c050001, 0x8ca56d98, 0xc00529b, +0x2021, 0xc00551b, 0x2021, 0x3c020002, +0x8c428ff0, 0x4410032, 0x24020001, 0x8f820214, 0x3c03ffff, 0x431024, 0x3442251f, 0xaf820214, 0x24020008, 0xaee204b8, 0x8f820220, 0x34420002, -0xc003e45, 0xaf820220, 0x10000003, 0x0, -0x3c010001, 0xac226e1c, 0x8fbf001c, 0x8fb00018, -0x3e00008, 0x27bd0020, 0x8f820200, 0x8f820220, -0x8f820220, 0x34420004, 0xaf820220, 0x8f820200, -0x3c050001, 0x8ca56e18, 0x34420004, 0xaf820200, -0x24020002, 0x10a2004b, 0x2ca20003, 0x10400005, -0x24020001, 0x10a2000a, 0x0, 0x100000b1, -0x0, 0x24020004, 0x10a20072, 0x24020008, -0x10a20085, 0x3c02f0ff, 0x100000aa, 0x0, +0xaf820220, 0x8f820220, 0x3c030004, 0x431024, +0x14400016, 0x0, 0x3c020002, 0x8c428ff8, +0x30425000, 0x1040000d, 0x0, 0x8f820220, +0x30428000, 0x10400006, 0x0, 0x8f820220, +0x3c03ffff, 0x34637fff, 0x10000003, 0x431024, +0x8f820220, 0x34428000, 0xaf820220, 0x8f820220, +0x3c03f700, 0x431025, 0xaf820220, 0x3c020001, +0x94426f26, 0x24429fbc, 0x2c420004, 0x10400004, +0x24040018, 0x24050002, 0xc004ddb, 0x24060020, +0xc003e6d, 0x0, 0x10000003, 0x0, +0x3c010001, 0xac226d9c, 0x8fbf0018, 0x3e00008, +0x27bd0020, 0x8f820200, 0x8f820220, 0x8f820220, +0x34420004, 0xaf820220, 0x8f820200, 0x3c050001, +0x8ca56d98, 0x34420004, 0xaf820200, 0x24020002, +0x10a2004b, 0x2ca20003, 0x10400005, 0x24020001, +0x10a2000a, 0x0, 0x100000b1, 0x0, +0x24020004, 0x10a20072, 0x24020008, 0x10a20085, +0x3c02f0ff, 0x100000aa, 0x0, 0x8f830050, +0x3c02f0ff, 0x3442ffff, 0x3c040001, 0x8c846f40, +0x621824, 0x3c020700, 0x621825, 0x24020e00, +0x2484fffb, 0x2c840002, 0xaf830050, 0xaf850200, +0xaf850220, 0x14800006, 0xaf820238, 0x8f820044, +0x3c03ffff, 0x34633f7f, 0x431024, 0xaf820044, +0x3c030001, 0x8c636f40, 0x24020005, 0x14620004, +0x0, 0x8f820044, 0x34425000, 0xaf820044, +0x3c020001, 0x8c426d88, 0x3c030001, 0x8c636f40, +0x34420022, 0x2463fffc, 0x2c630002, 0x1460000c, +0xaf820200, 0x3c020001, 0x8c426dac, 0x3c030001, +0x8c636d90, 0x3c040001, 0x8c846d8c, 0x34428000, +0x621825, 0x641825, 0x1000000a, 0x34620002, +0x3c020001, 0x8c426d90, 0x3c030001, 0x8c636dac, +0x3c040001, 0x8c846d8c, 0x431025, 0x441025, +0x34420002, 0xaf820220, 0x1000002f, 0x24020001, +0x24020e01, 0xaf820238, 0x8f830050, 0x3c02f0ff, +0x3442ffff, 0x3c040001, 0x8c846f1c, 0x621824, +0x3c020d00, 0x621825, 0x24020001, 0xaf830050, +0xaf820200, 0xaf820220, 0x10800005, 0x3c033f00, +0x3c020001, 0x8c426d80, 0x10000004, 0x34630070, +0x3c020001, 0x8c426d80, 0x34630072, 0x431025, +0xaf820200, 0x3c030001, 0x8c636d84, 0x3c02f700, +0x621825, 0x3c020001, 0x8c426d90, 0x3c040001, +0x8c846dac, 0x3c050001, 0x8ca56f40, 0x431025, +0x441025, 0xaf820220, 0x24020005, 0x14a20006, +0x24020001, 0x8f820044, 0x2403afff, 0x431024, +0xaf820044, 0x24020001, 0x1000003d, 0xaf820238, 0x8f830050, 0x3c02f0ff, 0x3442ffff, 0x3c040001, -0x8c846fb8, 0x621824, 0x3c020700, 0x621825, -0x24020e00, 0x2484fffb, 0x2c840002, 0xaf830050, -0xaf850200, 0xaf850220, 0x14800006, 0xaf820238, -0x8f820044, 0x3c03ffff, 0x34633f7f, 0x431024, -0xaf820044, 0x3c030001, 0x8c636fb8, 0x24020005, -0x14620004, 0x0, 0x8f820044, 0x34425000, -0xaf820044, 0x3c020001, 0x8c426e08, 0x3c030001, -0x8c636fb8, 0x34420022, 0x2463fffc, 0x2c630002, -0x1460000c, 0xaf820200, 0x3c020001, 0x8c426e2c, -0x3c030001, 0x8c636e10, 0x3c040001, 0x8c846e0c, -0x34428000, 0x621825, 0x641825, 0x1000000a, -0x34620002, 0x3c020001, 0x8c426e10, 0x3c030001, -0x8c636e2c, 0x3c040001, 0x8c846e0c, 0x431025, -0x441025, 0x34420002, 0xaf820220, 0x1000002f, -0x24020001, 0x24020e01, 0xaf820238, 0x8f830050, -0x3c02f0ff, 0x3442ffff, 0x3c040001, 0x8c846f98, -0x621824, 0x3c020d00, 0x621825, 0x24020001, -0xaf830050, 0xaf820200, 0xaf820220, 0x10800005, -0x3c033f00, 0x3c020001, 0x8c426e00, 0x10000004, -0x34630070, 0x3c020001, 0x8c426e00, 0x34630072, -0x431025, 0xaf820200, 0x3c030001, 0x8c636e04, -0x3c02f700, 0x621825, 0x3c020001, 0x8c426e10, -0x3c040001, 0x8c846e2c, 0x3c050001, 0x8ca56fb8, -0x431025, 0x441025, 0xaf820220, 0x24020005, -0x14a20006, 0x24020001, 0x8f820044, 0x2403afff, -0x431024, 0xaf820044, 0x24020001, 0x1000003d, -0xaf820238, 0x8f830050, 0x3c02f0ff, 0x3442ffff, -0x3c040001, 0x8c846f98, 0x621824, 0x3c020a00, -0x621825, 0x24020001, 0xaf830050, 0xaf820200, -0x1080001e, 0xaf820220, 0x3c020001, 0x8c426ec4, -0x1440001a, 0x3c033f00, 0x3c020001, 0x8c426e00, -0x1000001a, 0x346300e0, 0x8f830050, 0x3c040001, -0x8c846f98, 0x3442ffff, 0x621824, 0x1080000f, -0xaf830050, 0x3c020001, 0x8c426ec4, 0x1440000b, -0x3c043f00, 0x3c030001, 0x8c636e00, 0x348400e0, -0x24020001, 0xaf820200, 0xaf820220, 0x641825, -0xaf830200, 0x10000008, 0x3c05f700, 0x3c020001, -0x8c426e00, 0x3c033f00, 0x346300e2, 0x431025, -0xaf820200, 0x3c05f700, 0x34a58000, 0x3c030001, -0x8c636e04, 0x3c020001, 0x8c426e10, 0x3c040001, -0x8c846e2c, 0x651825, 0x431025, 0x441025, -0xaf820220, 0x3e00008, 0x0, 0x3c030001, -0x8c636e34, 0x3c020001, 0x8c426e38, 0x10620003, -0x24020002, 0x3c010001, 0xac236e38, 0x1062001d, -0x2c620003, 0x10400025, 0x24020001, 0x14620023, -0x24020004, 0x3c030001, 0x8c636e18, 0x10620006, -0x24020008, 0x1462000c, 0x3c0200c8, 0x344201fb, -0x10000009, 0xaf820238, 0x24020e01, 0xaf820238, -0x8f820044, 0x3c03ffff, 0x34633f7f, 0x431024, -0x34420080, 0xaf820044, 0x8f830054, 0x24020002, -0x3c010001, 0xac226e34, 0x3c010001, 0x1000000b, -0xac236fa4, 0x8f830054, 0x3c020001, 0x8c426fa4, -0x2463d8f0, 0x431023, 0x2c422710, 0x14400003, -0x24020009, 0x3c010001, 0xac226e34, 0x3e00008, +0x8c846f1c, 0x621824, 0x3c020a00, 0x621825, +0x24020001, 0xaf830050, 0xaf820200, 0x1080001e, +0xaf820220, 0x3c020001, 0x8c426e44, 0x1440001a, +0x3c033f00, 0x3c020001, 0x8c426d80, 0x1000001a, +0x346300e0, 0x8f830050, 0x3c040001, 0x8c846f1c, +0x3442ffff, 0x621824, 0x1080000f, 0xaf830050, +0x3c020001, 0x8c426e44, 0x1440000b, 0x3c043f00, +0x3c030001, 0x8c636d80, 0x348400e0, 0x24020001, +0xaf820200, 0xaf820220, 0x641825, 0xaf830200, +0x10000008, 0x3c05f700, 0x3c020001, 0x8c426d80, +0x3c033f00, 0x346300e2, 0x431025, 0xaf820200, +0x3c05f700, 0x34a58000, 0x3c030001, 0x8c636d84, +0x3c020001, 0x8c426d90, 0x3c040001, 0x8c846dac, +0x651825, 0x431025, 0x441025, 0xaf820220, +0x3e00008, 0x0, 0x3c030001, 0x8c636db4, +0x3c020001, 0x8c426db8, 0x10620003, 0x24020002, +0x3c010001, 0xac236db8, 0x1062001d, 0x2c620003, +0x10400025, 0x24020001, 0x14620023, 0x24020004, +0x3c030001, 0x8c636d98, 0x10620006, 0x24020008, +0x1462000c, 0x3c0200c8, 0x344201fb, 0x10000009, +0xaf820238, 0x24020e01, 0xaf820238, 0x8f820044, +0x3c03ffff, 0x34633f7f, 0x431024, 0x34420080, +0xaf820044, 0x8f830054, 0x24020002, 0x3c010001, +0xac226db4, 0x3c010001, 0x1000000b, 0xac236f2c, +0x8f830054, 0x3c020001, 0x8c426f2c, 0x2463d8f0, +0x431023, 0x2c422710, 0x14400003, 0x24020009, +0x3c010001, 0xac226db4, 0x3e00008, 0x0, 0x0, 0x0, 0x0, 0x27bdffd8, 0xafb20018, 0x809021, 0xafb3001c, 0xa09821, 0xafb10014, 0xc08821, 0xafb00010, 0x8021, -0xafbf0020, 0xa6200000, 0xc004dab, 0x24040001, +0xafbf0020, 0xa6200000, 0xc004d78, 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, 0x0, -0xc004dab, 0x2021, 0xc004dab, 0x24040001, -0xc004dab, 0x24040001, 0xc004dab, 0x2021, +0xc004d78, 0x2021, 0xc004d78, 0x24040001, +0xc004d78, 0x24040001, 0xc004d78, 0x2021, 0x24100010, 0x2501024, 0x10400002, 0x2021, -0x24040001, 0xc004dab, 0x108042, 0x1600fffa, +0x24040001, 0xc004d78, 0x108042, 0x1600fffa, 0x2501024, 0x24100010, 0x2701024, 0x10400002, -0x2021, 0x24040001, 0xc004dab, 0x108042, -0x1600fffa, 0x2701024, 0xc004dec, 0x34108000, -0xc004dec, 0x0, 0xc004d8b, 0x0, +0x2021, 0x24040001, 0xc004d78, 0x108042, +0x1600fffa, 0x2701024, 0xc004db9, 0x34108000, +0xc004db9, 0x0, 0xc004d58, 0x0, 0x50400005, 0x108042, 0x96220000, 0x501025, 0xa6220000, 0x108042, 0x1600fff7, 0x0, -0xc004dec, 0x0, 0x8fbf0020, 0x8fb3001c, +0xc004db9, 0x0, 0x8fbf0020, 0x8fb3001c, 0x8fb20018, 0x8fb10014, 0x8fb00010, 0x3e00008, 0x27bd0028, 0x27bdffd8, 0xafb10014, 0x808821, 0xafb20018, 0xa09021, 0xafb3001c, 0xc09821, -0xafb00010, 0x8021, 0xafbf0020, 0xc004dab, +0xafb00010, 0x8021, 0xafbf0020, 0xc004d78, 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, -0x0, 0xc004dab, 0x2021, 0xc004dab, -0x24040001, 0xc004dab, 0x2021, 0xc004dab, +0x0, 0xc004d78, 0x2021, 0xc004d78, +0x24040001, 0xc004d78, 0x2021, 0xc004d78, 0x24040001, 0x24100010, 0x2301024, 0x10400002, -0x2021, 0x24040001, 0xc004dab, 0x108042, +0x2021, 0x24040001, 0xc004d78, 0x108042, 0x1600fffa, 0x2301024, 0x24100010, 0x2501024, -0x10400002, 0x2021, 0x24040001, 0xc004dab, -0x108042, 0x1600fffa, 0x2501024, 0xc004dab, -0x24040001, 0xc004dab, 0x2021, 0x34108000, +0x10400002, 0x2021, 0x24040001, 0xc004d78, +0x108042, 0x1600fffa, 0x2501024, 0xc004d78, +0x24040001, 0xc004d78, 0x2021, 0x34108000, 0x96620000, 0x501024, 0x10400002, 0x2021, -0x24040001, 0xc004dab, 0x108042, 0x1600fff8, -0x0, 0xc004dec, 0x0, 0x8fbf0020, +0x24040001, 0xc004d78, 0x108042, 0x1600fff8, +0x0, 0xc004db9, 0x0, 0x8fbf0020, 0x8fb3001c, 0x8fb20018, 0x8fb10014, 0x8fb00010, -0x3e00008, 0x27bd0028, 0x3c040001, 0x8c846e50, -0x3c020001, 0x8c426e98, 0x27bdffd8, 0xafbf0020, +0x3e00008, 0x27bd0028, 0x3c040001, 0x8c846dd0, +0x3c020001, 0x8c426e18, 0x27bdffd8, 0xafbf0020, 0xafb1001c, 0x10820003, 0xafb00018, 0x3c010001, -0xac246e98, 0x3c030001, 0x8c636fb8, 0x24020005, -0x14620005, 0x2483ffff, 0xc0048b3, 0x0, +0xac246e18, 0x3c030001, 0x8c636f40, 0x24020005, +0x14620005, 0x2483ffff, 0xc004963, 0x0, 0x1000034c, 0x0, 0x2c620013, 0x10400349, -0x31080, 0x3c010001, 0x220821, 0x8c226c10, -0x400008, 0x0, 0xc004dec, 0x8021, -0x34028000, 0xa7a20010, 0x27b10010, 0xc004dab, +0x31080, 0x3c010001, 0x220821, 0x8c226b80, +0x400008, 0x0, 0xc004db9, 0x8021, +0x34028000, 0xa7a20010, 0x27b10010, 0xc004d78, 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, -0x0, 0xc004dab, 0x2021, 0xc004dab, -0x24040001, 0xc004dab, 0x2021, 0xc004dab, +0x0, 0xc004d78, 0x2021, 0xc004d78, +0x24040001, 0xc004d78, 0x2021, 0xc004d78, 0x24040001, 0x24100010, 0x32020001, 0x10400002, -0x2021, 0x24040001, 0xc004dab, 0x108042, -0x1600fffa, 0x32020001, 0x24100010, 0xc004dab, +0x2021, 0x24040001, 0xc004d78, 0x108042, +0x1600fffa, 0x32020001, 0x24100010, 0xc004d78, 0x2021, 0x108042, 0x1600fffc, 0x0, -0xc004dab, 0x24040001, 0xc004dab, 0x2021, +0xc004d78, 0x24040001, 0xc004d78, 0x2021, 0x34108000, 0x96220000, 0x501024, 0x10400002, -0x2021, 0x24040001, 0xc004dab, 0x108042, -0x1600fff8, 0x0, 0xc004dec, 0x0, +0x2021, 0x24040001, 0xc004d78, 0x108042, +0x1600fff8, 0x0, 0xc004db9, 0x0, 0x1000030e, 0x24020002, 0x27b10010, 0xa7a00010, -0x8021, 0xc004dab, 0x24040001, 0x26100001, -0x2e020020, 0x1440fffb, 0x0, 0xc004dab, -0x2021, 0xc004dab, 0x24040001, 0xc004dab, -0x24040001, 0xc004dab, 0x2021, 0x24100010, +0x8021, 0xc004d78, 0x24040001, 0x26100001, +0x2e020020, 0x1440fffb, 0x0, 0xc004d78, +0x2021, 0xc004d78, 0x24040001, 0xc004d78, +0x24040001, 0xc004d78, 0x2021, 0x24100010, 0x32020001, 0x10400002, 0x2021, 0x24040001, -0xc004dab, 0x108042, 0x1600fffa, 0x32020001, -0x24100010, 0xc004dab, 0x2021, 0x108042, -0x1600fffc, 0x0, 0xc004dec, 0x34108000, -0xc004dec, 0x0, 0xc004d8b, 0x0, +0xc004d78, 0x108042, 0x1600fffa, 0x32020001, +0x24100010, 0xc004d78, 0x2021, 0x108042, +0x1600fffc, 0x0, 0xc004db9, 0x34108000, +0xc004db9, 0x0, 0xc004d58, 0x0, 0x50400005, 0x108042, 0x96220000, 0x501025, 0xa6220000, 0x108042, 0x1600fff7, 0x0, -0xc004dec, 0x0, 0x97a20010, 0x30428000, +0xc004db9, 0x0, 0x97a20010, 0x30428000, 0x144002dc, 0x24020003, 0x100002d8, 0x0, 0x24021200, 0xa7a20010, 0x27b10010, 0x8021, -0xc004dab, 0x24040001, 0x26100001, 0x2e020020, -0x1440fffb, 0x0, 0xc004dab, 0x2021, -0xc004dab, 0x24040001, 0xc004dab, 0x2021, -0xc004dab, 0x24040001, 0x24100010, 0x32020001, -0x10400002, 0x2021, 0x24040001, 0xc004dab, +0xc004d78, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d78, 0x2021, +0xc004d78, 0x24040001, 0xc004d78, 0x2021, +0xc004d78, 0x24040001, 0x24100010, 0x32020001, +0x10400002, 0x2021, 0x24040001, 0xc004d78, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, -0xc004dab, 0x2021, 0x108042, 0x1600fffc, -0x0, 0xc004dab, 0x24040001, 0xc004dab, +0xc004d78, 0x2021, 0x108042, 0x1600fffc, +0x0, 0xc004d78, 0x24040001, 0xc004d78, 0x2021, 0x34108000, 0x96220000, 0x501024, -0x10400002, 0x2021, 0x24040001, 0xc004dab, -0x108042, 0x1600fff8, 0x0, 0xc004dec, +0x10400002, 0x2021, 0x24040001, 0xc004d78, +0x108042, 0x1600fff8, 0x0, 0xc004db9, 0x0, 0x8f830054, 0x10000296, 0x24020004, -0x8f830054, 0x3c020001, 0x8c426fb4, 0x2463ff9c, +0x8f830054, 0x3c020001, 0x8c426f3c, 0x2463ff9c, 0x431023, 0x2c420064, 0x1440029e, 0x24020002, -0x3c030001, 0x8c636fb8, 0x10620297, 0x2c620003, +0x3c030001, 0x8c636f40, 0x10620297, 0x2c620003, 0x14400296, 0x24020011, 0x24020003, 0x10620005, 0x24020004, 0x10620291, 0x2402000f, 0x1000028f, 0x24020011, 0x1000028d, 0x24020005, 0x24020014, -0xa7a20010, 0x27b10010, 0x8021, 0xc004dab, +0xa7a20010, 0x27b10010, 0x8021, 0xc004d78, 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, -0x0, 0xc004dab, 0x2021, 0xc004dab, -0x24040001, 0xc004dab, 0x2021, 0xc004dab, +0x0, 0xc004d78, 0x2021, 0xc004d78, +0x24040001, 0xc004d78, 0x2021, 0xc004d78, 0x24040001, 0x24100010, 0x32020001, 0x10400002, -0x2021, 0x24040001, 0xc004dab, 0x108042, +0x2021, 0x24040001, 0xc004d78, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020012, -0x10400002, 0x2021, 0x24040001, 0xc004dab, -0x108042, 0x1600fffa, 0x32020012, 0xc004dab, -0x24040001, 0xc004dab, 0x2021, 0x34108000, +0x10400002, 0x2021, 0x24040001, 0xc004d78, +0x108042, 0x1600fffa, 0x32020012, 0xc004d78, +0x24040001, 0xc004d78, 0x2021, 0x34108000, 0x96220000, 0x501024, 0x10400002, 0x2021, -0x24040001, 0xc004dab, 0x108042, 0x1600fff8, -0x0, 0xc004dec, 0x0, 0x8f830054, +0x24040001, 0xc004d78, 0x108042, 0x1600fff8, +0x0, 0xc004db9, 0x0, 0x8f830054, 0x10000248, 0x24020006, 0x8f830054, 0x3c020001, -0x8c426fb4, 0x2463ff9c, 0x431023, 0x2c420064, +0x8c426f3c, 0x2463ff9c, 0x431023, 0x2c420064, 0x14400250, 0x24020007, 0x1000024c, 0x0, 0x24020006, 0xa7a20010, 0x27b10010, 0x8021, -0xc004dab, 0x24040001, 0x26100001, 0x2e020020, -0x1440fffb, 0x0, 0xc004dab, 0x2021, -0xc004dab, 0x24040001, 0xc004dab, 0x2021, -0xc004dab, 0x24040001, 0x24100010, 0x32020001, -0x10400002, 0x2021, 0x24040001, 0xc004dab, +0xc004d78, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d78, 0x2021, +0xc004d78, 0x24040001, 0xc004d78, 0x2021, +0xc004d78, 0x24040001, 0x24100010, 0x32020001, +0x10400002, 0x2021, 0x24040001, 0xc004d78, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020013, 0x10400002, 0x2021, 0x24040001, -0xc004dab, 0x108042, 0x1600fffa, 0x32020013, -0xc004dab, 0x24040001, 0xc004dab, 0x2021, +0xc004d78, 0x108042, 0x1600fffa, 0x32020013, +0xc004d78, 0x24040001, 0xc004d78, 0x2021, 0x34108000, 0x96220000, 0x501024, 0x10400002, -0x2021, 0x24040001, 0xc004dab, 0x108042, -0x1600fff8, 0x0, 0xc004dec, 0x0, +0x2021, 0x24040001, 0xc004d78, 0x108042, +0x1600fff8, 0x0, 0xc004db9, 0x0, 0x8f830054, 0x10000207, 0x24020008, 0x8f830054, -0x3c020001, 0x8c426fb4, 0x2463ff9c, 0x431023, +0x3c020001, 0x8c426f3c, 0x2463ff9c, 0x431023, 0x2c420064, 0x1440020f, 0x24020009, 0x1000020b, 0x0, 0x27b10010, 0xa7a00010, 0x8021, -0xc004dab, 0x24040001, 0x26100001, 0x2e020020, -0x1440fffb, 0x0, 0xc004dab, 0x2021, -0xc004dab, 0x24040001, 0xc004dab, 0x24040001, -0xc004dab, 0x2021, 0x24100010, 0x32020001, -0x10400002, 0x2021, 0x24040001, 0xc004dab, +0xc004d78, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d78, 0x2021, +0xc004d78, 0x24040001, 0xc004d78, 0x24040001, +0xc004d78, 0x2021, 0x24100010, 0x32020001, +0x10400002, 0x2021, 0x24040001, 0xc004d78, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020018, 0x10400002, 0x2021, 0x24040001, -0xc004dab, 0x108042, 0x1600fffa, 0x32020018, -0xc004dec, 0x34108000, 0xc004dec, 0x0, -0xc004d8b, 0x0, 0x50400005, 0x108042, +0xc004d78, 0x108042, 0x1600fffa, 0x32020018, +0xc004db9, 0x34108000, 0xc004db9, 0x0, +0xc004d58, 0x0, 0x50400005, 0x108042, 0x96220000, 0x501025, 0xa6220000, 0x108042, -0x1600fff7, 0x0, 0xc004dec, 0x8021, +0x1600fff7, 0x0, 0xc004db9, 0x8021, 0x97a20010, 0x27b10010, 0x34420001, 0xa7a20010, -0xc004dab, 0x24040001, 0x26100001, 0x2e020020, -0x1440fffb, 0x0, 0xc004dab, 0x2021, -0xc004dab, 0x24040001, 0xc004dab, 0x2021, -0xc004dab, 0x24040001, 0x24100010, 0x32020001, -0x10400002, 0x2021, 0x24040001, 0xc004dab, +0xc004d78, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d78, 0x2021, +0xc004d78, 0x24040001, 0xc004d78, 0x2021, +0xc004d78, 0x24040001, 0x24100010, 0x32020001, +0x10400002, 0x2021, 0x24040001, 0xc004d78, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020018, 0x10400002, 0x2021, 0x24040001, -0xc004dab, 0x108042, 0x1600fffa, 0x32020018, -0xc004dab, 0x24040001, 0xc004dab, 0x2021, +0xc004d78, 0x108042, 0x1600fffa, 0x32020018, +0xc004d78, 0x24040001, 0xc004d78, 0x2021, 0x34108000, 0x96220000, 0x501024, 0x10400002, -0x2021, 0x24040001, 0xc004dab, 0x108042, -0x1600fff8, 0x0, 0xc004dec, 0x0, +0x2021, 0x24040001, 0xc004d78, 0x108042, +0x1600fff8, 0x0, 0xc004db9, 0x0, 0x8f830054, 0x10000193, 0x2402000a, 0x8f830054, -0x3c020001, 0x8c426fb4, 0x2463ff9c, 0x431023, +0x3c020001, 0x8c426f3c, 0x2463ff9c, 0x431023, 0x2c420064, 0x1440019b, 0x2402000b, 0x10000197, 0x0, 0x27b10010, 0xa7a00010, 0x8021, -0xc004dab, 0x24040001, 0x26100001, 0x2e020020, -0x1440fffb, 0x0, 0xc004dab, 0x2021, -0xc004dab, 0x24040001, 0xc004dab, 0x24040001, -0xc004dab, 0x2021, 0x24100010, 0x32020001, -0x10400002, 0x2021, 0x24040001, 0xc004dab, +0xc004d78, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d78, 0x2021, +0xc004d78, 0x24040001, 0xc004d78, 0x24040001, +0xc004d78, 0x2021, 0x24100010, 0x32020001, +0x10400002, 0x2021, 0x24040001, 0xc004d78, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020017, 0x10400002, 0x2021, 0x24040001, -0xc004dab, 0x108042, 0x1600fffa, 0x32020017, -0xc004dec, 0x34108000, 0xc004dec, 0x0, -0xc004d8b, 0x0, 0x50400005, 0x108042, +0xc004d78, 0x108042, 0x1600fffa, 0x32020017, +0xc004db9, 0x34108000, 0xc004db9, 0x0, +0xc004d58, 0x0, 0x50400005, 0x108042, 0x96220000, 0x501025, 0xa6220000, 0x108042, -0x1600fff7, 0x0, 0xc004dec, 0x8021, +0x1600fff7, 0x0, 0xc004db9, 0x8021, 0x97a20010, 0x27b10010, 0x34420700, 0xa7a20010, -0xc004dab, 0x24040001, 0x26100001, 0x2e020020, -0x1440fffb, 0x0, 0xc004dab, 0x2021, -0xc004dab, 0x24040001, 0xc004dab, 0x2021, -0xc004dab, 0x24040001, 0x24100010, 0x32020001, -0x10400002, 0x2021, 0x24040001, 0xc004dab, +0xc004d78, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d78, 0x2021, +0xc004d78, 0x24040001, 0xc004d78, 0x2021, +0xc004d78, 0x24040001, 0x24100010, 0x32020001, +0x10400002, 0x2021, 0x24040001, 0xc004d78, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020017, 0x10400002, 0x2021, 0x24040001, -0xc004dab, 0x108042, 0x1600fffa, 0x32020017, -0xc004dab, 0x24040001, 0xc004dab, 0x2021, +0xc004d78, 0x108042, 0x1600fffa, 0x32020017, +0xc004d78, 0x24040001, 0xc004d78, 0x2021, 0x34108000, 0x96220000, 0x501024, 0x10400002, -0x2021, 0x24040001, 0xc004dab, 0x108042, -0x1600fff8, 0x0, 0xc004dec, 0x0, +0x2021, 0x24040001, 0xc004d78, 0x108042, +0x1600fff8, 0x0, 0xc004db9, 0x0, 0x8f830054, 0x1000011f, 0x2402000c, 0x8f830054, -0x3c020001, 0x8c426fb4, 0x2463ff9c, 0x431023, +0x3c020001, 0x8c426f3c, 0x2463ff9c, 0x431023, 0x2c420064, 0x14400127, 0x24020012, 0x10000123, 0x0, 0x27b10010, 0xa7a00010, 0x8021, -0xc004dab, 0x24040001, 0x26100001, 0x2e020020, -0x1440fffb, 0x0, 0xc004dab, 0x2021, -0xc004dab, 0x24040001, 0xc004dab, 0x24040001, -0xc004dab, 0x2021, 0x24100010, 0x32020001, -0x10400002, 0x2021, 0x24040001, 0xc004dab, +0xc004d78, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d78, 0x2021, +0xc004d78, 0x24040001, 0xc004d78, 0x24040001, +0xc004d78, 0x2021, 0x24100010, 0x32020001, +0x10400002, 0x2021, 0x24040001, 0xc004d78, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020014, 0x10400002, 0x2021, 0x24040001, -0xc004dab, 0x108042, 0x1600fffa, 0x32020014, -0xc004dec, 0x34108000, 0xc004dec, 0x0, -0xc004d8b, 0x0, 0x50400005, 0x108042, +0xc004d78, 0x108042, 0x1600fffa, 0x32020014, +0xc004db9, 0x34108000, 0xc004db9, 0x0, +0xc004d58, 0x0, 0x50400005, 0x108042, 0x96220000, 0x501025, 0xa6220000, 0x108042, -0x1600fff7, 0x0, 0xc004dec, 0x8021, +0x1600fff7, 0x0, 0xc004db9, 0x8021, 0x97a20010, 0x27b10010, 0x34420010, 0xa7a20010, -0xc004dab, 0x24040001, 0x26100001, 0x2e020020, -0x1440fffb, 0x0, 0xc004dab, 0x2021, -0xc004dab, 0x24040001, 0xc004dab, 0x2021, -0xc004dab, 0x24040001, 0x24100010, 0x32020001, -0x10400002, 0x2021, 0x24040001, 0xc004dab, +0xc004d78, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d78, 0x2021, +0xc004d78, 0x24040001, 0xc004d78, 0x2021, +0xc004d78, 0x24040001, 0x24100010, 0x32020001, +0x10400002, 0x2021, 0x24040001, 0xc004d78, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020014, 0x10400002, 0x2021, 0x24040001, -0xc004dab, 0x108042, 0x1600fffa, 0x32020014, -0xc004dab, 0x24040001, 0xc004dab, 0x2021, +0xc004d78, 0x108042, 0x1600fffa, 0x32020014, +0xc004d78, 0x24040001, 0xc004d78, 0x2021, 0x34108000, 0x96220000, 0x501024, 0x10400002, -0x2021, 0x24040001, 0xc004dab, 0x108042, -0x1600fff8, 0x0, 0xc004dec, 0x0, +0x2021, 0x24040001, 0xc004d78, 0x108042, +0x1600fff8, 0x0, 0xc004db9, 0x0, 0x8f830054, 0x100000ab, 0x24020013, 0x8f830054, -0x3c020001, 0x8c426fb4, 0x2463ff9c, 0x431023, +0x3c020001, 0x8c426f3c, 0x2463ff9c, 0x431023, 0x2c420064, 0x144000b3, 0x2402000d, 0x100000af, 0x0, 0x27b10010, 0xa7a00010, 0x8021, -0xc004dab, 0x24040001, 0x26100001, 0x2e020020, -0x1440fffb, 0x0, 0xc004dab, 0x2021, -0xc004dab, 0x24040001, 0xc004dab, 0x24040001, -0xc004dab, 0x2021, 0x24100010, 0x32020001, -0x10400002, 0x2021, 0x24040001, 0xc004dab, +0xc004d78, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d78, 0x2021, +0xc004d78, 0x24040001, 0xc004d78, 0x24040001, +0xc004d78, 0x2021, 0x24100010, 0x32020001, +0x10400002, 0x2021, 0x24040001, 0xc004d78, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020018, 0x10400002, 0x2021, 0x24040001, -0xc004dab, 0x108042, 0x1600fffa, 0x32020018, -0xc004dec, 0x34108000, 0xc004dec, 0x0, -0xc004d8b, 0x0, 0x50400005, 0x108042, +0xc004d78, 0x108042, 0x1600fffa, 0x32020018, +0xc004db9, 0x34108000, 0xc004db9, 0x0, +0xc004d58, 0x0, 0x50400005, 0x108042, 0x96220000, 0x501025, 0xa6220000, 0x108042, -0x1600fff7, 0x0, 0xc004dec, 0x8021, +0x1600fff7, 0x0, 0xc004db9, 0x8021, 0x97a20010, 0x27b10010, 0x3042fffe, 0xa7a20010, -0xc004dab, 0x24040001, 0x26100001, 0x2e020020, -0x1440fffb, 0x0, 0xc004dab, 0x2021, -0xc004dab, 0x24040001, 0xc004dab, 0x2021, -0xc004dab, 0x24040001, 0x24100010, 0x32020001, -0x10400002, 0x2021, 0x24040001, 0xc004dab, +0xc004d78, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d78, 0x2021, +0xc004d78, 0x24040001, 0xc004d78, 0x2021, +0xc004d78, 0x24040001, 0x24100010, 0x32020001, +0x10400002, 0x2021, 0x24040001, 0xc004d78, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020018, 0x10400002, 0x2021, 0x24040001, -0xc004dab, 0x108042, 0x1600fffa, 0x32020018, -0xc004dab, 0x24040001, 0xc004dab, 0x2021, +0xc004d78, 0x108042, 0x1600fffa, 0x32020018, +0xc004d78, 0x24040001, 0xc004d78, 0x2021, 0x34108000, 0x96220000, 0x501024, 0x10400002, -0x2021, 0x24040001, 0xc004dab, 0x108042, -0x1600fff8, 0x0, 0xc004dec, 0x0, +0x2021, 0x24040001, 0xc004d78, 0x108042, +0x1600fff8, 0x0, 0xc004db9, 0x0, 0x8f830054, 0x10000037, 0x2402000e, 0x24020840, -0xa7a20010, 0x27b10010, 0x8021, 0xc004dab, +0xa7a20010, 0x27b10010, 0x8021, 0xc004d78, 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, -0x0, 0xc004dab, 0x2021, 0xc004dab, -0x24040001, 0xc004dab, 0x2021, 0xc004dab, +0x0, 0xc004d78, 0x2021, 0xc004d78, +0x24040001, 0xc004d78, 0x2021, 0xc004d78, 0x24040001, 0x24100010, 0x32020001, 0x10400002, -0x2021, 0x24040001, 0xc004dab, 0x108042, +0x2021, 0x24040001, 0xc004d78, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020013, -0x10400002, 0x2021, 0x24040001, 0xc004dab, -0x108042, 0x1600fffa, 0x32020013, 0xc004dab, -0x24040001, 0xc004dab, 0x2021, 0x34108000, +0x10400002, 0x2021, 0x24040001, 0xc004d78, +0x108042, 0x1600fffa, 0x32020013, 0xc004d78, +0x24040001, 0xc004d78, 0x2021, 0x34108000, 0x96220000, 0x501024, 0x10400002, 0x2021, -0x24040001, 0xc004dab, 0x108042, 0x1600fff8, -0x0, 0xc004dec, 0x0, 0x8f830054, -0x24020010, 0x3c010001, 0xac226e50, 0x3c010001, -0x1000000c, 0xac236fb4, 0x8f830054, 0x3c020001, -0x8c426fb4, 0x2463ff9c, 0x431023, 0x2c420064, +0x24040001, 0xc004d78, 0x108042, 0x1600fff8, +0x0, 0xc004db9, 0x0, 0x8f830054, +0x24020010, 0x3c010001, 0xac226dd0, 0x3c010001, +0x1000000c, 0xac236f3c, 0x8f830054, 0x3c020001, +0x8c426f3c, 0x2463ff9c, 0x431023, 0x2c420064, 0x14400004, 0x0, 0x24020011, 0x3c010001, -0xac226e50, 0x8fbf0020, 0x8fb1001c, 0x8fb00018, -0x3e00008, 0x27bd0028, 0x3c030001, 0x8c636e18, +0xac226dd0, 0x8fbf0020, 0x8fb1001c, 0x8fb00018, +0x3e00008, 0x27bd0028, 0x3c030001, 0x8c636d98, 0x27bdffc8, 0x24020002, 0xafbf0034, 0xafb20030, 0xafb1002c, 0x14620004, 0xafb00028, 0x3c120002, -0x10000003, 0x8e529078, 0x3c120002, 0x8e52907c, -0x3c030001, 0x8c636e54, 0x3c020001, 0x8c426e9c, -0x50620004, 0x2463ffff, 0x3c010001, 0xac236e9c, -0x2463ffff, 0x2c620006, 0x104004b9, 0x31080, -0x3c010001, 0x220821, 0x8c226c68, 0x400008, -0x0, 0x2021, 0x2821, 0xc004e0e, +0x10000003, 0x8e528ff8, 0x3c120002, 0x8e528ffc, +0x3c030001, 0x8c636dd4, 0x3c020001, 0x8c426e1c, +0x50620004, 0x2463ffff, 0x3c010001, 0xac236e1c, +0x2463ffff, 0x2c620006, 0x10400377, 0x31080, +0x3c010001, 0x220821, 0x8c226bd8, 0x400008, +0x0, 0x2021, 0x2821, 0xc004ddb, 0x34068000, 0x24040010, 0x24050002, 0x24060002, -0x24020002, 0xc004e0e, 0xa7a20018, 0x24020002, -0x3c010001, 0x100004a6, 0xac226e54, 0x27b10018, -0xa7a00018, 0x8021, 0xc004dab, 0x24040001, +0x24020002, 0xc004ddb, 0xa7a20018, 0x24020002, +0x3c010001, 0x10000364, 0xac226dd4, 0x27b10018, +0xa7a00018, 0x8021, 0xc004d78, 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, 0x0, -0xc004dab, 0x2021, 0xc004dab, 0x24040001, -0xc004dab, 0x24040001, 0xc004dab, 0x2021, +0xc004d78, 0x2021, 0xc004d78, 0x24040001, +0xc004d78, 0x24040001, 0xc004d78, 0x2021, 0x24100010, 0x32020001, 0x10400002, 0x2021, -0x24040001, 0xc004dab, 0x108042, 0x1600fffa, -0x32020001, 0x24100010, 0xc004dab, 0x2021, -0x108042, 0x1600fffc, 0x0, 0xc004dec, -0x34108000, 0xc004dec, 0x0, 0xc004d8b, +0x24040001, 0xc004d78, 0x108042, 0x1600fffa, +0x32020001, 0x24100010, 0xc004d78, 0x2021, +0x108042, 0x1600fffc, 0x0, 0xc004db9, +0x34108000, 0xc004db9, 0x0, 0xc004d58, 0x0, 0x50400005, 0x108042, 0x96220000, 0x501025, 0xa6220000, 0x108042, 0x1600fff7, -0x0, 0xc004dec, 0x0, 0x97a20018, +0x0, 0xc004db9, 0x0, 0x97a20018, 0x30428000, 0x14400004, 0x24020003, 0x3c010001, -0xac226e54, 0x24020003, 0x3c010001, 0x1000046c, -0xac226e54, 0x24040010, 0x24050002, 0x24060002, -0x24020002, 0xc004e0e, 0xa7a20018, 0x3c030001, -0x8c636ea0, 0x24020001, 0x146201e2, 0x0, -0x27b10018, 0xa7a00018, 0x8021, 0xc004dab, -0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, -0x0, 0xc004dab, 0x2021, 0xc004dab, -0x24040001, 0xc004dab, 0x24040001, 0xc004dab, -0x2021, 0x24100010, 0x32020001, 0x10400002, -0x2021, 0x24040001, 0xc004dab, 0x108042, -0x1600fffa, 0x32020001, 0x24100010, 0x32020018, -0x10400002, 0x2021, 0x24040001, 0xc004dab, -0x108042, 0x1600fffa, 0x32020018, 0xc004dec, -0x34108000, 0xc004dec, 0x0, 0xc004d8b, -0x0, 0x50400005, 0x108042, 0x96220000, -0x501025, 0xa6220000, 0x108042, 0x1600fff7, -0x0, 0xc004dec, 0x8021, 0x27b10018, -0xa7a00018, 0xc004dab, 0x24040001, 0x26100001, -0x2e020020, 0x1440fffb, 0x0, 0xc004dab, -0x2021, 0xc004dab, 0x24040001, 0xc004dab, -0x24040001, 0xc004dab, 0x2021, 0x24100010, +0xac226dd4, 0x24020003, 0x3c010001, 0x1000032a, +0xac226dd4, 0x24040010, 0x24050002, 0x24060002, +0x24020002, 0xc004ddb, 0xa7a20018, 0x3c030001, +0x8c636e20, 0x24020001, 0x146201e1, 0x8021, +0x27b10018, 0xa7a00018, 0xc004d78, 0x24040001, +0x26100001, 0x2e020020, 0x1440fffb, 0x0, +0xc004d78, 0x2021, 0xc004d78, 0x24040001, +0xc004d78, 0x24040001, 0xc004d78, 0x2021, +0x24100010, 0x32020001, 0x10400002, 0x2021, +0x24040001, 0xc004d78, 0x108042, 0x1600fffa, +0x32020001, 0x24100010, 0x32020018, 0x10400002, +0x2021, 0x24040001, 0xc004d78, 0x108042, +0x1600fffa, 0x32020018, 0xc004db9, 0x34108000, +0xc004db9, 0x0, 0xc004d58, 0x0, +0x50400005, 0x108042, 0x96220000, 0x501025, +0xa6220000, 0x108042, 0x1600fff7, 0x0, +0xc004db9, 0x8021, 0x27b10018, 0xa7a00018, +0xc004d78, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d78, 0x2021, +0xc004d78, 0x24040001, 0xc004d78, 0x24040001, +0xc004d78, 0x2021, 0x24100010, 0x32020001, +0x10400002, 0x2021, 0x24040001, 0xc004d78, +0x108042, 0x1600fffa, 0x32020001, 0x24100010, +0x32020018, 0x10400002, 0x2021, 0x24040001, +0xc004d78, 0x108042, 0x1600fffa, 0x32020018, +0xc004db9, 0x34108000, 0xc004db9, 0x0, +0xc004d58, 0x0, 0x50400005, 0x108042, +0x96220000, 0x501025, 0xa6220000, 0x108042, +0x1600fff7, 0x0, 0xc004db9, 0x8021, +0x24040018, 0x2821, 0xc004ddb, 0x24060404, +0xa7a0001a, 0xc004d78, 0x24040001, 0x26100001, +0x2e020020, 0x1440fffb, 0x0, 0xc004d78, +0x2021, 0xc004d78, 0x24040001, 0xc004d78, +0x24040001, 0xc004d78, 0x2021, 0x24100010, 0x32020001, 0x10400002, 0x2021, 0x24040001, -0xc004dab, 0x108042, 0x1600fffa, 0x32020001, +0xc004d78, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020018, 0x10400002, 0x2021, -0x24040001, 0xc004dab, 0x108042, 0x1600fffa, -0x32020018, 0xc004dec, 0x34108000, 0xc004dec, -0x0, 0xc004d8b, 0x0, 0x50400005, -0x108042, 0x96220000, 0x501025, 0xa6220000, -0x108042, 0x1600fff7, 0x0, 0xc004dec, -0x8021, 0x24040018, 0x2821, 0xc004e0e, -0x24060404, 0xa7a0001a, 0xc004dab, 0x24040001, +0x24040001, 0xc004d78, 0x108042, 0x1600fffa, +0x32020018, 0xc004db9, 0x34108000, 0xc004db9, +0x0, 0xc004d58, 0x0, 0x50400005, +0x108042, 0x97a2001a, 0x501025, 0xa7a2001a, +0x108042, 0x1600fff7, 0x0, 0xc004db9, +0x8021, 0xa7a0001a, 0xc004d78, 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, 0x0, -0xc004dab, 0x2021, 0xc004dab, 0x24040001, -0xc004dab, 0x24040001, 0xc004dab, 0x2021, +0xc004d78, 0x2021, 0xc004d78, 0x24040001, +0xc004d78, 0x24040001, 0xc004d78, 0x2021, 0x24100010, 0x32020001, 0x10400002, 0x2021, -0x24040001, 0xc004dab, 0x108042, 0x1600fffa, +0x24040001, 0xc004d78, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020018, 0x10400002, -0x2021, 0x24040001, 0xc004dab, 0x108042, -0x1600fffa, 0x32020018, 0xc004dec, 0x34108000, -0xc004dec, 0x0, 0xc004d8b, 0x0, +0x2021, 0x24040001, 0xc004d78, 0x108042, +0x1600fffa, 0x32020018, 0xc004db9, 0x34108000, +0xc004db9, 0x0, 0xc004d58, 0x0, 0x50400005, 0x108042, 0x97a2001a, 0x501025, 0xa7a2001a, 0x108042, 0x1600fff7, 0x0, -0xc004dec, 0x8021, 0xa7a0001a, 0xc004dab, +0xc004db9, 0x8021, 0xa7a0001c, 0xc004d78, 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, -0x0, 0xc004dab, 0x2021, 0xc004dab, -0x24040001, 0xc004dab, 0x24040001, 0xc004dab, -0x2021, 0x24100010, 0x32020001, 0x10400002, -0x2021, 0x24040001, 0xc004dab, 0x108042, -0x1600fffa, 0x32020001, 0x24100010, 0x32020018, -0x10400002, 0x2021, 0x24040001, 0xc004dab, -0x108042, 0x1600fffa, 0x32020018, 0xc004dec, -0x34108000, 0xc004dec, 0x0, 0xc004d8b, -0x0, 0x50400005, 0x108042, 0x97a2001a, -0x501025, 0xa7a2001a, 0x108042, 0x1600fff7, -0x0, 0xc004dec, 0x8021, 0xa7a0001c, -0xc004dab, 0x24040001, 0x26100001, 0x2e020020, -0x1440fffb, 0x0, 0xc004dab, 0x2021, -0xc004dab, 0x24040001, 0xc004dab, 0x24040001, -0xc004dab, 0x2021, 0x24100010, 0xc004dab, +0x0, 0xc004d78, 0x2021, 0xc004d78, +0x24040001, 0xc004d78, 0x24040001, 0xc004d78, +0x2021, 0x24100010, 0xc004d78, 0x2021, +0x108042, 0x1600fffc, 0x0, 0x24100010, +0x3202001e, 0x10400002, 0x2021, 0x24040001, +0xc004d78, 0x108042, 0x1600fffa, 0x3202001e, +0xc004db9, 0x34108000, 0xc004db9, 0x0, +0xc004d58, 0x0, 0x50400005, 0x108042, +0x97a2001c, 0x501025, 0xa7a2001c, 0x108042, +0x1600fff7, 0x0, 0xc004db9, 0x8021, +0xa7a0001c, 0xc004d78, 0x24040001, 0x26100001, +0x2e020020, 0x1440fffb, 0x0, 0xc004d78, +0x2021, 0xc004d78, 0x24040001, 0xc004d78, +0x24040001, 0xc004d78, 0x2021, 0x24100010, +0xc004d78, 0x2021, 0x108042, 0x1600fffc, +0x0, 0x24100010, 0x3202001e, 0x10400002, +0x2021, 0x24040001, 0xc004d78, 0x108042, +0x1600fffa, 0x3202001e, 0xc004db9, 0x34108000, +0xc004db9, 0x0, 0xc004d58, 0x0, +0x50400005, 0x108042, 0x97a2001c, 0x501025, +0xa7a2001c, 0x108042, 0x1600fff7, 0x0, +0xc004db9, 0x8021, 0x24020002, 0xa7a2001e, +0xc004d78, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d78, 0x2021, +0xc004d78, 0x24040001, 0xc004d78, 0x2021, +0xc004d78, 0x24040001, 0x24100010, 0xc004d78, 0x2021, 0x108042, 0x1600fffc, 0x0, 0x24100010, 0x3202001e, 0x10400002, 0x2021, -0x24040001, 0xc004dab, 0x108042, 0x1600fffa, -0x3202001e, 0xc004dec, 0x34108000, 0xc004dec, -0x0, 0xc004d8b, 0x0, 0x50400005, -0x108042, 0x97a2001c, 0x501025, 0xa7a2001c, -0x108042, 0x1600fff7, 0x0, 0xc004dec, -0x8021, 0xa7a0001c, 0xc004dab, 0x24040001, +0x24040001, 0xc004d78, 0x108042, 0x1600fffa, +0x3202001e, 0xc004d78, 0x24040001, 0xc004d78, +0x2021, 0x34108000, 0x97a2001e, 0x501024, +0x10400002, 0x2021, 0x24040001, 0xc004d78, +0x108042, 0x1600fff8, 0x0, 0xc004db9, +0x8021, 0xa7a00020, 0xc004d78, 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, 0x0, -0xc004dab, 0x2021, 0xc004dab, 0x24040001, -0xc004dab, 0x24040001, 0xc004dab, 0x2021, -0x24100010, 0xc004dab, 0x2021, 0x108042, +0xc004d78, 0x2021, 0xc004d78, 0x24040001, +0xc004d78, 0x24040001, 0xc004d78, 0x2021, +0x24100010, 0xc004d78, 0x2021, 0x108042, 0x1600fffc, 0x0, 0x24100010, 0x3202001e, -0x10400002, 0x2021, 0x24040001, 0xc004dab, -0x108042, 0x1600fffa, 0x3202001e, 0xc004dec, -0x34108000, 0xc004dec, 0x0, 0xc004d8b, -0x0, 0x50400005, 0x108042, 0x97a2001c, -0x501025, 0xa7a2001c, 0x108042, 0x1600fff7, -0x0, 0xc004dec, 0x8021, 0x24020002, -0xa7a2001e, 0xc004dab, 0x24040001, 0x26100001, -0x2e020020, 0x1440fffb, 0x0, 0xc004dab, -0x2021, 0xc004dab, 0x24040001, 0xc004dab, -0x2021, 0xc004dab, 0x24040001, 0x24100010, -0xc004dab, 0x2021, 0x108042, 0x1600fffc, -0x0, 0x24100010, 0x3202001e, 0x10400002, -0x2021, 0x24040001, 0xc004dab, 0x108042, -0x1600fffa, 0x3202001e, 0xc004dab, 0x24040001, -0xc004dab, 0x2021, 0x34108000, 0x97a2001e, -0x501024, 0x10400002, 0x2021, 0x24040001, -0xc004dab, 0x108042, 0x1600fff8, 0x0, -0xc004dec, 0x8021, 0xa7a00020, 0xc004dab, -0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, -0x0, 0xc004dab, 0x2021, 0xc004dab, -0x24040001, 0xc004dab, 0x24040001, 0xc004dab, -0x2021, 0x24100010, 0xc004dab, 0x2021, -0x108042, 0x1600fffc, 0x0, 0x24100010, -0x3202001e, 0x10400002, 0x2021, 0x24040001, -0xc004dab, 0x108042, 0x1600fffa, 0x3202001e, -0xc004dec, 0x34108000, 0xc004dec, 0x0, -0xc004d8b, 0x0, 0x50400005, 0x108042, -0x97a20020, 0x501025, 0xa7a20020, 0x108042, -0x1600fff7, 0x0, 0xc004dec, 0x8021, -0xa7a00020, 0xc004dab, 0x24040001, 0x26100001, -0x2e020020, 0x1440fffb, 0x0, 0xc004dab, -0x2021, 0xc004dab, 0x24040001, 0xc004dab, -0x24040001, 0xc004dab, 0x2021, 0x24100010, -0xc004dab, 0x2021, 0x108042, 0x1600fffc, -0x0, 0x24100010, 0x3202001e, 0x10400002, -0x2021, 0x24040001, 0xc004dab, 0x108042, -0x1600fffa, 0x3202001e, 0xc004dec, 0x34108000, -0xc004dec, 0x0, 0xc004d8b, 0x0, -0x50400005, 0x108042, 0x97a20020, 0x501025, -0xa7a20020, 0x108042, 0x1600fff7, 0x0, -0xc004dec, 0x8021, 0xa7a00022, 0xc004dab, -0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, -0x0, 0xc004dab, 0x2021, 0xc004dab, -0x24040001, 0xc004dab, 0x2021, 0xc004dab, -0x24040001, 0x24100010, 0xc004dab, 0x2021, -0x108042, 0x1600fffc, 0x0, 0x24100010, -0xc004dab, 0x2021, 0x108042, 0x1600fffc, -0x0, 0xc004dab, 0x24040001, 0xc004dab, -0x2021, 0x34108000, 0x97a20022, 0x501024, -0x10400002, 0x2021, 0x24040001, 0xc004dab, -0x108042, 0x1600fff8, 0x0, 0xc004dec, -0x0, 0x24040018, 0x24050002, 0xc004e0e, -0x24060004, 0x3c030001, 0x8c636ea4, 0x24020001, -0x146200fc, 0x3c024000, 0x3c010001, 0xac206ea4, -0x2421024, 0x10400276, 0x3c022000, 0x2421024, -0x10400004, 0x0, 0x3c010001, 0x10000003, -0xac236f98, 0x3c010001, 0xac206f98, 0x3c030001, -0x8c636fac, 0x24020005, 0x146200ea, 0x0, -0x3c020001, 0x8c426f98, 0x1040005f, 0x3c020004, -0x2421024, 0x10400011, 0xa7a00018, 0x3c020008, -0x2421024, 0x10400002, 0x24020200, 0xa7a20018, -0x3c020010, 0x2421024, 0x10400004, 0x0, -0x97a20018, 0x34420100, 0xa7a20018, 0x97a60018, -0x24040009, 0x10000004, 0x2821, 0x24040009, -0x2821, 0x3021, 0xc004e0e, 0x0, -0x24020001, 0xa7a2001a, 0x3c020008, 0x2421024, -0x1040000c, 0x3c020002, 0x2421024, 0x10400002, -0x24020101, 0xa7a2001a, 0x3c020001, 0x2421024, -0x10400005, 0x3c020010, 0x97a2001a, 0x34420040, -0xa7a2001a, 0x3c020010, 0x2421024, 0x1040000e, -0x3c020002, 0x2421024, 0x10400005, 0x3c020001, -0x97a2001a, 0x34420080, 0xa7a2001a, 0x3c020001, -0x2421024, 0x10400005, 0x3c0300a0, 0x97a2001a, -0x34420020, 0xa7a2001a, 0x3c0300a0, 0x2431024, -0x54430004, 0x3c020020, 0x97a2001a, 0x1000000c, -0x34420400, 0x2421024, 0x50400004, 0x3c020080, -0x97a2001a, 0x10000006, 0x34420800, 0x2421024, -0x10400004, 0x0, 0x97a2001a, 0x34420c00, -0xa7a2001a, 0x97a6001a, 0x24040004, 0xc004e0e, -0x2821, 0x32424000, 0x10400003, 0xa7a0001c, -0x24024000, 0xa7a2001c, 0x97a6001c, 0x2021, -0x2821, 0x34c61200, 0xc004e0e, 0xa7a6001c, -0x10000088, 0x0, 0x32424000, 0x10400003, -0xa7a00018, 0x24024000, 0xa7a20018, 0x3c020010, +0x10400002, 0x2021, 0x24040001, 0xc004d78, +0x108042, 0x1600fffa, 0x3202001e, 0xc004db9, +0x34108000, 0xc004db9, 0x0, 0xc004d58, +0x0, 0x50400005, 0x108042, 0x97a20020, +0x501025, 0xa7a20020, 0x108042, 0x1600fff7, +0x0, 0xc004db9, 0x8021, 0xa7a00020, +0xc004d78, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d78, 0x2021, +0xc004d78, 0x24040001, 0xc004d78, 0x24040001, +0xc004d78, 0x2021, 0x24100010, 0xc004d78, +0x2021, 0x108042, 0x1600fffc, 0x0, +0x24100010, 0x3202001e, 0x10400002, 0x2021, +0x24040001, 0xc004d78, 0x108042, 0x1600fffa, +0x3202001e, 0xc004db9, 0x34108000, 0xc004db9, +0x0, 0xc004d58, 0x0, 0x50400005, +0x108042, 0x97a20020, 0x501025, 0xa7a20020, +0x108042, 0x1600fff7, 0x0, 0xc004db9, +0x8021, 0xa7a00022, 0xc004d78, 0x24040001, +0x26100001, 0x2e020020, 0x1440fffb, 0x0, +0xc004d78, 0x2021, 0xc004d78, 0x24040001, +0xc004d78, 0x2021, 0xc004d78, 0x24040001, +0x24100010, 0xc004d78, 0x2021, 0x108042, +0x1600fffc, 0x0, 0x24100010, 0xc004d78, +0x2021, 0x108042, 0x1600fffc, 0x0, +0xc004d78, 0x24040001, 0xc004d78, 0x2021, +0x34108000, 0x97a20022, 0x501024, 0x10400002, +0x2021, 0x24040001, 0xc004d78, 0x108042, +0x1600fff8, 0x0, 0xc004db9, 0x0, +0x24040018, 0x24050002, 0xc004ddb, 0x24060004, +0x3c100001, 0x8e106e24, 0x24020001, 0x1602011d, +0x0, 0x3c020001, 0x94426f26, 0x3c010001, +0xac206e24, 0x24429fbc, 0x2c420004, 0x1040000c, +0x24040009, 0x24050001, 0xc004ddb, 0x24060400, +0x24040018, 0x24050001, 0xc004ddb, 0x24060020, +0x24040018, 0x24050001, 0xc004ddb, 0x24062000, +0x3c024000, 0x2421024, 0x10400123, 0x3c022000, +0x2421024, 0x10400004, 0x0, 0x3c010001, +0x10000003, 0xac306f1c, 0x3c010001, 0xac206f1c, +0x3c030001, 0x8c636f34, 0x24020005, 0x146200f9, +0x0, 0x3c020001, 0x8c426f1c, 0x10400067, +0x3c020004, 0x2421024, 0x10400011, 0xa7a00018, +0x3c020008, 0x2421024, 0x10400002, 0x24020200, +0xa7a20018, 0x3c020010, 0x2421024, 0x10400004, +0x0, 0x97a20018, 0x34420100, 0xa7a20018, +0x97a60018, 0x24040009, 0x10000004, 0x2821, +0x24040009, 0x2821, 0x3021, 0xc004ddb, +0x0, 0x24020001, 0xa7a2001a, 0x3c020008, +0x2421024, 0x1040000c, 0x3c020002, 0x2421024, +0x10400002, 0x24020101, 0xa7a2001a, 0x3c020001, +0x2421024, 0x10400005, 0x3c020010, 0x97a2001a, +0x34420040, 0xa7a2001a, 0x3c020010, 0x2421024, +0x1040000e, 0x3c020002, 0x2421024, 0x10400005, +0x3c020001, 0x97a2001a, 0x34420080, 0xa7a2001a, +0x3c020001, 0x2421024, 0x10400005, 0x3c0300a0, +0x97a2001a, 0x34420020, 0xa7a2001a, 0x3c0300a0, +0x2431024, 0x54430004, 0x3c020020, 0x97a2001a, +0x1000000c, 0x34420400, 0x2421024, 0x50400004, +0x3c020080, 0x97a2001a, 0x10000006, 0x34420800, +0x2421024, 0x10400004, 0x0, 0x97a2001a, +0x34420c00, 0xa7a2001a, 0x97a6001a, 0x24040004, +0xc004ddb, 0x2821, 0x3c020004, 0x2421024, +0x10400004, 0xa7a0001c, 0x32425000, 0x14400004, +0x0, 0x32424000, 0x10400005, 0x2021, +0xc004cf9, 0x2402021, 0x10000096, 0x0, +0x97a6001c, 0x2821, 0x34c61200, 0xc004ddb, +0xa7a6001c, 0x1000008f, 0x0, 0x2421024, +0x10400004, 0xa7a00018, 0x32425000, 0x14400004, +0x0, 0x32424000, 0x10400005, 0x3c020010, +0xc004cf9, 0x2402021, 0x10000019, 0xa7a0001a, 0x2421024, 0x10400004, 0x0, 0x97a20018, 0x10000004, 0xa7a20018, 0x97a20018, 0x34420100, 0xa7a20018, 0x3c020001, 0x2421024, 0x10400004, 0x0, 0x97a20018, 0x10000004, 0xa7a20018, -0x97a20018, 0x34422000, 0xa7a20018, 0x2021, -0x97a60018, 0x2821, 0xc004e0e, 0x8021, -0xa7a0001a, 0xc004dab, 0x24040001, 0x26100001, -0x2e020020, 0x1440fffb, 0x0, 0xc004dab, -0x2021, 0xc004dab, 0x24040001, 0xc004dab, -0x24040001, 0xc004dab, 0x2021, 0x24100010, +0x97a20018, 0x34422000, 0xa7a20018, 0x97a60018, +0x2021, 0xc004ddb, 0x2821, 0xa7a0001a, +0x8021, 0xc004d78, 0x24040001, 0x26100001, +0x2e020020, 0x1440fffb, 0x0, 0xc004d78, +0x2021, 0xc004d78, 0x24040001, 0xc004d78, +0x24040001, 0xc004d78, 0x2021, 0x24100010, 0x32020001, 0x10400002, 0x2021, 0x24040001, -0xc004dab, 0x108042, 0x1600fffa, 0x32020001, -0x24100010, 0xc004dab, 0x2021, 0x108042, -0x1600fffc, 0x0, 0xc004dec, 0x34108000, -0xc004dec, 0x0, 0xc004d8b, 0x0, +0xc004d78, 0x108042, 0x1600fffa, 0x32020001, +0x24100010, 0xc004d78, 0x2021, 0x108042, +0x1600fffc, 0x0, 0xc004db9, 0x34108000, +0xc004db9, 0x0, 0xc004d58, 0x0, 0x50400005, 0x108042, 0x97a2001a, 0x501025, 0xa7a2001a, 0x108042, 0x1600fff7, 0x0, -0xc004dec, 0x8021, 0xa7a0001a, 0xc004dab, +0xc004db9, 0x8021, 0xa7a0001a, 0xc004d78, 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, -0x0, 0xc004dab, 0x2021, 0xc004dab, -0x24040001, 0xc004dab, 0x24040001, 0xc004dab, +0x0, 0xc004d78, 0x2021, 0xc004d78, +0x24040001, 0xc004d78, 0x24040001, 0xc004d78, 0x2021, 0x24100010, 0x32020001, 0x10400002, -0x2021, 0x24040001, 0xc004dab, 0x108042, -0x1600fffa, 0x32020001, 0x24100010, 0xc004dab, +0x2021, 0x24040001, 0xc004d78, 0x108042, +0x1600fffa, 0x32020001, 0x24100010, 0xc004d78, 0x2021, 0x108042, 0x1600fffc, 0x0, -0xc004dec, 0x34108000, 0xc004dec, 0x0, -0xc004d8b, 0x0, 0x50400005, 0x108042, +0xc004db9, 0x34108000, 0xc004db9, 0x0, +0xc004d58, 0x0, 0x50400005, 0x108042, 0x97a2001a, 0x501025, 0xa7a2001a, 0x108042, -0x1600fff7, 0x0, 0xc004dec, 0x0, -0x3c040001, 0x24846c5c, 0x97a60018, 0x97a7001a, -0x3c020001, 0x8c426e18, 0x3c030001, 0x8c636f98, -0x3c05000d, 0x34a50205, 0xafa20010, 0xc002b17, +0x1600fff7, 0x0, 0xc004db9, 0x0, +0x3c040001, 0x24846bcc, 0x97a60018, 0x97a7001a, +0x3c020001, 0x8c426d98, 0x3c030001, 0x8c636f1c, +0x3c05000d, 0x34a50205, 0xafa20010, 0xc002b3b, 0xafa30014, 0x8f830054, 0x24020004, 0x3c010001, -0xac226e54, 0x3c010001, 0x10000179, 0xac236fb0, -0x8f830054, 0x3c020001, 0x8c426fb0, 0x2463ff9c, -0x431023, 0x2c420064, 0x14400009, 0x27b10018, -0x8f820220, 0x24030005, 0x3c010001, 0xac236e54, -0x3c03f700, 0x431025, 0xaf820220, 0x27b10018, -0xa7a00018, 0x8021, 0xc004dab, 0x24040001, -0x26100001, 0x2e020020, 0x1440fffb, 0x0, -0xc004dab, 0x2021, 0xc004dab, 0x24040001, -0xc004dab, 0x24040001, 0xc004dab, 0x2021, -0x24100010, 0x32020001, 0x10400002, 0x2021, -0x24040001, 0xc004dab, 0x108042, 0x1600fffa, -0x32020001, 0x24100010, 0xc004dab, 0x2021, -0x108042, 0x1600fffc, 0x0, 0xc004dec, -0x34108000, 0xc004dec, 0x0, 0xc004d8b, -0x0, 0x50400005, 0x108042, 0x96220000, -0x501025, 0xa6220000, 0x108042, 0x1600fff7, -0x0, 0xc004dec, 0x8021, 0xa7a0001a, -0xc004dab, 0x24040001, 0x26100001, 0x2e020020, -0x1440fffb, 0x0, 0xc004dab, 0x2021, -0xc004dab, 0x24040001, 0xc004dab, 0x24040001, -0xc004dab, 0x2021, 0x24100010, 0x32020001, -0x10400002, 0x2021, 0x24040001, 0xc004dab, -0x108042, 0x1600fffa, 0x32020001, 0x24100010, -0x32020001, 0x10400002, 0x2021, 0x24040001, -0xc004dab, 0x108042, 0x1600fffa, 0x32020001, -0xc004dec, 0x34108000, 0xc004dec, 0x0, -0xc004d8b, 0x0, 0x50400005, 0x108042, -0x97a2001a, 0x501025, 0xa7a2001a, 0x108042, -0x1600fff7, 0x0, 0xc004dec, 0x8021, -0xa7a0001a, 0xc004dab, 0x24040001, 0x26100001, -0x2e020020, 0x1440fffb, 0x0, 0xc004dab, -0x2021, 0xc004dab, 0x24040001, 0xc004dab, -0x24040001, 0xc004dab, 0x2021, 0x24100010, -0x32020001, 0x10400002, 0x2021, 0x24040001, -0xc004dab, 0x108042, 0x1600fffa, 0x32020001, -0x24100010, 0x32020001, 0x10400002, 0x2021, -0x24040001, 0xc004dab, 0x108042, 0x1600fffa, -0x32020001, 0xc004dec, 0x34108000, 0xc004dec, -0x0, 0xc004d8b, 0x0, 0x50400005, -0x108042, 0x97a2001a, 0x501025, 0xa7a2001a, -0x108042, 0x1600fff7, 0x0, 0xc004dec, -0x8021, 0xa7a0001c, 0xc004dab, 0x24040001, -0x26100001, 0x2e020020, 0x1440fffb, 0x0, -0xc004dab, 0x2021, 0xc004dab, 0x24040001, -0xc004dab, 0x24040001, 0xc004dab, 0x2021, -0x24100010, 0x32020001, 0x10400002, 0x2021, -0x24040001, 0xc004dab, 0x108042, 0x1600fffa, -0x32020001, 0x24100010, 0x32020004, 0x10400002, -0x2021, 0x24040001, 0xc004dab, 0x108042, -0x1600fffa, 0x32020004, 0xc004dec, 0x34108000, -0xc004dec, 0x0, 0xc004d8b, 0x0, -0x50400005, 0x108042, 0x97a2001c, 0x501025, -0xa7a2001c, 0x108042, 0x1600fff7, 0x0, -0xc004dec, 0x8021, 0xa7a0001c, 0xc004dab, -0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, -0x0, 0xc004dab, 0x2021, 0xc004dab, -0x24040001, 0xc004dab, 0x24040001, 0xc004dab, -0x2021, 0x24100010, 0x32020001, 0x10400002, -0x2021, 0x24040001, 0xc004dab, 0x108042, -0x1600fffa, 0x32020001, 0x24100010, 0x32020004, -0x10400002, 0x2021, 0x24040001, 0xc004dab, -0x108042, 0x1600fffa, 0x32020004, 0xc004dec, -0x34108000, 0xc004dec, 0x0, 0xc004d8b, -0x0, 0x50400005, 0x108042, 0x97a2001c, -0x501025, 0xa7a2001c, 0x108042, 0x1600fff7, -0x0, 0xc004dec, 0x8021, 0xa7a00020, -0xc004dab, 0x24040001, 0x26100001, 0x2e020020, -0x1440fffb, 0x0, 0xc004dab, 0x2021, -0xc004dab, 0x24040001, 0xc004dab, 0x24040001, -0xc004dab, 0x2021, 0x24100010, 0x32020001, -0x10400002, 0x2021, 0x24040001, 0xc004dab, -0x108042, 0x1600fffa, 0x32020001, 0x24100010, -0x32020019, 0x10400002, 0x2021, 0x24040001, -0xc004dab, 0x108042, 0x1600fffa, 0x32020019, -0xc004dec, 0x34108000, 0xc004dec, 0x0, -0xc004d8b, 0x0, 0x50400005, 0x108042, -0x97a20020, 0x501025, 0xa7a20020, 0x108042, -0x1600fff7, 0x0, 0xc004dec, 0x8021, -0xa7a00020, 0xc004dab, 0x24040001, 0x26100001, -0x2e020020, 0x1440fffb, 0x0, 0xc004dab, -0x2021, 0xc004dab, 0x24040001, 0xc004dab, -0x24040001, 0xc004dab, 0x2021, 0x24100010, -0x32020001, 0x10400002, 0x2021, 0x24040001, -0xc004dab, 0x108042, 0x1600fffa, 0x32020001, -0x24100010, 0x32020019, 0x10400002, 0x2021, -0x24040001, 0xc004dab, 0x108042, 0x1600fffa, -0x32020019, 0xc004dec, 0x34108000, 0xc004dec, -0x0, 0xc004d8b, 0x0, 0x50400005, -0x108042, 0x97a20020, 0x501025, 0xa7a20020, -0x108042, 0x1600fff7, 0x0, 0xc004dec, -0x0, 0x97a60018, 0x97a7001a, 0x97a2001c, -0x3c040001, 0x24846c5c, 0xafa20010, 0x97a20020, -0x3c05000d, 0x34a50204, 0xc002b17, 0xafa20014, -0x10000007, 0x0, 0x24020006, 0x3c010001, -0xac226e54, 0x24020011, 0x3c010001, 0xac226e50, -0x8fbf0034, 0x8fb20030, 0x8fb1002c, 0x8fb00028, -0x3e00008, 0x27bd0038, 0x8f850044, 0x8f820044, -0x3c030001, 0x431025, 0x3c030008, 0xaf820044, -0x8f840054, 0x8f820054, 0xa32824, 0x10000002, -0x24840001, 0x8f820054, 0x821023, 0x2c420002, -0x1440fffc, 0x0, 0x8f820044, 0x3c03fffe, -0x3463ffff, 0x431024, 0xaf820044, 0x8f830054, -0x8f820054, 0x10000002, 0x24630001, 0x8f820054, -0x621023, 0x2c420002, 0x1440fffc, 0x0, -0x3e00008, 0xa01021, 0x8f830044, 0x3c02fff0, -0x3442ffff, 0x42480, 0x621824, 0x3c020002, -0x822025, 0x641825, 0xaf830044, 0x8f820044, +0xac226dd4, 0x3c010001, 0x10000017, 0xac236f38, +0x8f830054, 0x3c020001, 0x8c426f38, 0x2463ff9c, +0x431023, 0x2c420064, 0x1440000f, 0x0, +0x8f820220, 0x24030005, 0x3c010001, 0xac236dd4, +0x3c03f700, 0x431025, 0x10000007, 0xaf820220, +0x24020006, 0x3c010001, 0xac226dd4, 0x24020011, +0x3c010001, 0xac226dd0, 0x8fbf0034, 0x8fb20030, +0x8fb1002c, 0x8fb00028, 0x3e00008, 0x27bd0038, +0x27bdffd8, 0xafb00018, 0x808021, 0xafb1001c, +0x8821, 0x32024000, 0x10400013, 0xafbf0020, +0x3c020010, 0x2021024, 0x2c420001, 0x21023, +0x30434100, 0x3c020001, 0x2021024, 0x14400006, +0x34714000, 0x3c020002, 0x2021024, 0x14400002, +0x34716000, 0x34714040, 0x2021, 0x2821, +0x10000036, 0x2203021, 0x32021000, 0x10400035, +0x2021, 0x2821, 0xc004ddb, 0x24060040, +0x24040018, 0x2821, 0xc004ddb, 0x24060c00, +0x24040017, 0x2821, 0xc004ddb, 0x24060400, +0x24040016, 0x2821, 0xc004ddb, 0x24060006, +0x24040017, 0x2821, 0xc004ddb, 0x24062500, +0x24040016, 0x2821, 0xc004ddb, 0x24060006, +0x24040017, 0x2821, 0xc004ddb, 0x24064600, +0x24040016, 0x2821, 0xc004ddb, 0x24060006, +0x24040017, 0x2821, 0xc004ddb, 0x24066700, +0x24040016, 0x2821, 0xc004ddb, 0x24060006, +0x2404001f, 0x2821, 0xc004ddb, 0x24060010, +0x24040009, 0x2821, 0xc004ddb, 0x24061500, +0x24040009, 0x2821, 0x24061d00, 0xc004ddb, +0x0, 0x3c040001, 0x24846bf0, 0x3c05000e, +0x34a50100, 0x2003021, 0x2203821, 0xafa00010, +0xc002b3b, 0xafa00014, 0x8fbf0020, 0x8fb1001c, +0x8fb00018, 0x3e00008, 0x27bd0028, 0x8f850044, +0x8f820044, 0x3c030001, 0x431025, 0x3c030008, +0xaf820044, 0x8f840054, 0x8f820054, 0xa32824, +0x10000002, 0x24840001, 0x8f820054, 0x821023, +0x2c420002, 0x1440fffc, 0x0, 0x8f820044, 0x3c03fffe, 0x3463ffff, 0x431024, 0xaf820044, 0x8f830054, 0x8f820054, 0x10000002, 0x24630001, 0x8f820054, 0x621023, 0x2c420002, 0x1440fffc, -0x0, 0x8f820044, 0x3c030001, 0x431025, +0x0, 0x3e00008, 0xa01021, 0x8f830044, +0x3c02fff0, 0x3442ffff, 0x42480, 0x621824, +0x3c020002, 0x822025, 0x641825, 0xaf830044, +0x8f820044, 0x3c03fffe, 0x3463ffff, 0x431024, 0xaf820044, 0x8f830054, 0x8f820054, 0x10000002, 0x24630001, 0x8f820054, 0x621023, 0x2c420002, -0x1440fffc, 0x0, 0x3e00008, 0x0, -0x8f820044, 0x2403ff7f, 0x431024, 0xaf820044, -0x8f830054, 0x8f820054, 0x10000002, 0x24630001, -0x8f820054, 0x621023, 0x2c420002, 0x1440fffc, -0x0, 0x8f820044, 0x34420080, 0xaf820044, -0x8f830054, 0x8f820054, 0x10000002, 0x24630001, -0x8f820054, 0x621023, 0x2c420002, 0x1440fffc, -0x0, 0x3e00008, 0x0, 0x8f820044, -0x3c03fff0, 0x3463ffff, 0x431024, 0xaf820044, -0x8f820044, 0x3c030001, 0x431025, 0xaf820044, -0x8f830054, 0x8f820054, 0x10000002, 0x24630001, -0x8f820054, 0x621023, 0x2c420002, 0x1440fffc, -0x0, 0x8f820044, 0x3c03fffe, 0x3463ffff, -0x431024, 0xaf820044, 0x8f830054, 0x8f820054, +0x1440fffc, 0x0, 0x8f820044, 0x3c030001, +0x431025, 0xaf820044, 0x8f830054, 0x8f820054, 0x10000002, 0x24630001, 0x8f820054, 0x621023, 0x2c420002, 0x1440fffc, 0x0, 0x3e00008, -0x0, 0x27bdffc8, 0xafb30024, 0x809821, -0xafbe002c, 0xa0f021, 0xafb20020, 0xc09021, -0x33c2ffff, 0xafbf0030, 0xafb50028, 0xafb1001c, -0xafb00018, 0x14400034, 0xa7b20010, 0x3271ffff, -0x27b20010, 0x8021, 0xc004dab, 0x24040001, -0x26100001, 0x2e020020, 0x1440fffb, 0x0, -0xc004dab, 0x2021, 0xc004dab, 0x24040001, -0xc004dab, 0x2021, 0xc004dab, 0x24040001, -0x24100010, 0x32020001, 0x10400002, 0x2021, -0x24040001, 0xc004dab, 0x108042, 0x1600fffa, -0x32020001, 0x24100010, 0x2301024, 0x10400002, -0x2021, 0x24040001, 0xc004dab, 0x108042, -0x1600fffa, 0x2301024, 0xc004dab, 0x24040001, -0xc004dab, 0x2021, 0x34108000, 0x96420000, -0x501024, 0x10400002, 0x2021, 0x24040001, -0xc004dab, 0x108042, 0x12000075, 0x0, -0x1000fff6, 0x0, 0x3275ffff, 0x27b10010, -0xa7a00010, 0x8021, 0xc004dab, 0x24040001, -0x26100001, 0x2e020020, 0x1440fffb, 0x0, -0xc004dab, 0x2021, 0xc004dab, 0x24040001, -0xc004dab, 0x24040001, 0xc004dab, 0x2021, -0x24100010, 0x32020001, 0x10400002, 0x2021, -0x24040001, 0xc004dab, 0x108042, 0x1600fffa, -0x32020001, 0x24100010, 0x2b01024, 0x10400002, -0x2021, 0x24040001, 0xc004dab, 0x108042, -0x1600fffa, 0x2b01024, 0xc004dec, 0x34108000, -0xc004dec, 0x0, 0xc004d8b, 0x0, -0x50400005, 0x108042, 0x96220000, 0x501025, -0xa6220000, 0x108042, 0x1600fff7, 0x0, -0xc004dec, 0x0, 0x33c5ffff, 0x24020001, -0x54a20004, 0x24020002, 0x97a20010, 0x10000006, -0x521025, 0x14a20006, 0x3271ffff, 0x97a20010, -0x121827, 0x431024, 0xa7a20010, 0x3271ffff, -0x27b20010, 0x8021, 0xc004dab, 0x24040001, -0x26100001, 0x2e020020, 0x1440fffb, 0x0, -0xc004dab, 0x2021, 0xc004dab, 0x24040001, -0xc004dab, 0x2021, 0xc004dab, 0x24040001, -0x24100010, 0x32020001, 0x10400002, 0x2021, -0x24040001, 0xc004dab, 0x108042, 0x1600fffa, -0x32020001, 0x24100010, 0x2301024, 0x10400002, -0x2021, 0x24040001, 0xc004dab, 0x108042, -0x1600fffa, 0x2301024, 0xc004dab, 0x24040001, -0xc004dab, 0x2021, 0x34108000, 0x96420000, -0x501024, 0x10400002, 0x2021, 0x24040001, -0xc004dab, 0x108042, 0x1600fff8, 0x0, -0xc004dec, 0x0, 0x8fbf0030, 0x8fbe002c, -0x8fb50028, 0x8fb30024, 0x8fb20020, 0x8fb1001c, -0x8fb00018, 0x3e00008, 0x27bd0038, 0x27bdffe8, +0x0, 0x8f820044, 0x2403ff7f, 0x431024, +0xaf820044, 0x8f830054, 0x8f820054, 0x10000002, +0x24630001, 0x8f820054, 0x621023, 0x2c420002, +0x1440fffc, 0x0, 0x8f820044, 0x34420080, +0xaf820044, 0x8f830054, 0x8f820054, 0x10000002, +0x24630001, 0x8f820054, 0x621023, 0x2c420002, +0x1440fffc, 0x0, 0x3e00008, 0x0, +0x8f820044, 0x3c03fff0, 0x3463ffff, 0x431024, +0xaf820044, 0x8f820044, 0x3c030001, 0x431025, +0xaf820044, 0x8f830054, 0x8f820054, 0x10000002, +0x24630001, 0x8f820054, 0x621023, 0x2c420002, +0x1440fffc, 0x0, 0x8f820044, 0x3c03fffe, +0x3463ffff, 0x431024, 0xaf820044, 0x8f830054, +0x8f820054, 0x10000002, 0x24630001, 0x8f820054, +0x621023, 0x2c420002, 0x1440fffc, 0x0, +0x3e00008, 0x0, 0x27bdffc8, 0xafb30024, +0x809821, 0xafbe002c, 0xa0f021, 0xafb20020, +0xc09021, 0x33c2ffff, 0xafbf0030, 0xafb50028, +0xafb1001c, 0xafb00018, 0x14400034, 0xa7b20010, +0x3271ffff, 0x27b20010, 0x8021, 0xc004d78, +0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, +0x0, 0xc004d78, 0x2021, 0xc004d78, +0x24040001, 0xc004d78, 0x2021, 0xc004d78, +0x24040001, 0x24100010, 0x32020001, 0x10400002, +0x2021, 0x24040001, 0xc004d78, 0x108042, +0x1600fffa, 0x32020001, 0x24100010, 0x2301024, +0x10400002, 0x2021, 0x24040001, 0xc004d78, +0x108042, 0x1600fffa, 0x2301024, 0xc004d78, +0x24040001, 0xc004d78, 0x2021, 0x34108000, +0x96420000, 0x501024, 0x10400002, 0x2021, +0x24040001, 0xc004d78, 0x108042, 0x12000075, +0x0, 0x1000fff6, 0x0, 0x3275ffff, +0x27b10010, 0xa7a00010, 0x8021, 0xc004d78, +0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, +0x0, 0xc004d78, 0x2021, 0xc004d78, +0x24040001, 0xc004d78, 0x24040001, 0xc004d78, +0x2021, 0x24100010, 0x32020001, 0x10400002, +0x2021, 0x24040001, 0xc004d78, 0x108042, +0x1600fffa, 0x32020001, 0x24100010, 0x2b01024, +0x10400002, 0x2021, 0x24040001, 0xc004d78, +0x108042, 0x1600fffa, 0x2b01024, 0xc004db9, +0x34108000, 0xc004db9, 0x0, 0xc004d58, +0x0, 0x50400005, 0x108042, 0x96220000, +0x501025, 0xa6220000, 0x108042, 0x1600fff7, +0x0, 0xc004db9, 0x0, 0x33c5ffff, +0x24020001, 0x54a20004, 0x24020002, 0x97a20010, +0x10000006, 0x521025, 0x14a20006, 0x3271ffff, +0x97a20010, 0x121827, 0x431024, 0xa7a20010, +0x3271ffff, 0x27b20010, 0x8021, 0xc004d78, +0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, +0x0, 0xc004d78, 0x2021, 0xc004d78, +0x24040001, 0xc004d78, 0x2021, 0xc004d78, +0x24040001, 0x24100010, 0x32020001, 0x10400002, +0x2021, 0x24040001, 0xc004d78, 0x108042, +0x1600fffa, 0x32020001, 0x24100010, 0x2301024, +0x10400002, 0x2021, 0x24040001, 0xc004d78, +0x108042, 0x1600fffa, 0x2301024, 0xc004d78, +0x24040001, 0xc004d78, 0x2021, 0x34108000, +0x96420000, 0x501024, 0x10400002, 0x2021, +0x24040001, 0xc004d78, 0x108042, 0x1600fff8, +0x0, 0xc004db9, 0x0, 0x8fbf0030, +0x8fbe002c, 0x8fb50028, 0x8fb30024, 0x8fb20020, +0x8fb1001c, 0x8fb00018, 0x3e00008, 0x27bd0038, +0x0, 0x0, 0x0, 0x27bdffe8, 0xafbf0010, 0x8ee304b8, 0x24020008, 0x146201e0, -0x0, 0x3c020001, 0x8c426f98, 0x14400005, -0x0, 0xc003d87, 0x8f840224, 0x100001d8, +0x0, 0x3c020001, 0x8c426f1c, 0x14400005, +0x0, 0xc003daf, 0x8f840224, 0x100001d8, 0x0, 0x8f820220, 0x3c030008, 0x431024, 0x10400026, 0x24020001, 0x8f840224, 0x8f820220, 0x3c030400, 0x431024, 0x10400006, 0x0, -0x3c010002, 0xac209020, 0x3c010002, 0x1000000b, -0xac209040, 0x3c030002, 0x24639020, 0x8c620000, +0x3c010002, 0xac208fa0, 0x3c010002, 0x1000000b, +0xac208fc0, 0x3c030002, 0x24638fa0, 0x8c620000, 0x24420001, 0xac620000, 0x2c420002, 0x14400003, -0x24020001, 0x3c010002, 0xac229040, 0x3c020002, -0x8c429040, 0x10400006, 0x30820040, 0x10400004, -0x24020001, 0x3c010002, 0x10000003, 0xac229044, -0x3c010002, 0xac209044, 0x3c010002, 0xac24901c, -0x3c010002, 0x1000000b, 0xac209050, 0x3c010002, -0xac229050, 0x3c010002, 0xac209040, 0x3c010002, -0xac209020, 0x3c010002, 0xac209044, 0x3c010002, -0xac20901c, 0x3c030002, 0x8c639010, 0x3c020002, -0x8c429014, 0x50620004, 0x2463ffff, 0x3c010002, -0xac239014, 0x2463ffff, 0x2c62000e, 0x10400194, -0x31080, 0x3c010001, 0x220821, 0x8c226c80, +0x24020001, 0x3c010002, 0xac228fc0, 0x3c020002, +0x8c428fc0, 0x10400006, 0x30820040, 0x10400004, +0x24020001, 0x3c010002, 0x10000003, 0xac228fc4, +0x3c010002, 0xac208fc4, 0x3c010002, 0xac248f9c, +0x3c010002, 0x1000000b, 0xac208fd0, 0x3c010002, +0xac228fd0, 0x3c010002, 0xac208fc0, 0x3c010002, +0xac208fa0, 0x3c010002, 0xac208fc4, 0x3c010002, +0xac208f9c, 0x3c030002, 0x8c638f90, 0x3c020002, +0x8c428f94, 0x50620004, 0x2463ffff, 0x3c010002, +0xac238f94, 0x2463ffff, 0x2c62000e, 0x10400194, +0x31080, 0x3c010001, 0x220821, 0x8c226c00, 0x400008, 0x0, 0x24020002, 0x3c010002, -0xac209040, 0x3c010002, 0xac209020, 0x3c010002, -0xac20901c, 0x3c010002, 0xac209044, 0x3c010002, -0xac209038, 0x3c010002, 0xac209030, 0xaf800224, -0x3c010002, 0xac229010, 0x3c020002, 0x8c429050, -0x1440004f, 0x3c02fdff, 0x3442ffff, 0xc003d87, +0xac208fc0, 0x3c010002, 0xac208fa0, 0x3c010002, +0xac208f9c, 0x3c010002, 0xac208fc4, 0x3c010002, +0xac208fb8, 0x3c010002, 0xac208fb0, 0xaf800224, +0x3c010002, 0xac228f90, 0x3c020002, 0x8c428fd0, +0x1440004f, 0x3c02fdff, 0x3442ffff, 0xc003daf, 0x282a024, 0xaf800204, 0x8f820200, 0x2403fffd, -0x431024, 0xaf820200, 0x3c010002, 0xac209060, -0x8f830054, 0x3c020002, 0x8c429038, 0x24040001, -0x3c010002, 0xac24904c, 0x24420001, 0x3c010002, -0xac229038, 0x2c420004, 0x3c010002, 0xac239034, -0x14400006, 0x24020003, 0x3c010001, 0xac246e1c, -0x3c010002, 0x1000015e, 0xac209038, 0x3c010002, -0x1000015b, 0xac229010, 0x8f830054, 0x3c020002, -0x8c429034, 0x2463d8f0, 0x431023, 0x2c422710, -0x14400003, 0x24020004, 0x3c010002, 0xac229010, -0x3c020002, 0x8c429050, 0x14400021, 0x3c02fdff, +0x431024, 0xaf820200, 0x3c010002, 0xac208fe0, +0x8f830054, 0x3c020002, 0x8c428fb8, 0x24040001, +0x3c010002, 0xac248fcc, 0x24420001, 0x3c010002, +0xac228fb8, 0x2c420004, 0x3c010002, 0xac238fb4, +0x14400006, 0x24020003, 0x3c010001, 0xac246d9c, +0x3c010002, 0x1000015e, 0xac208fb8, 0x3c010002, +0x1000015b, 0xac228f90, 0x8f830054, 0x3c020002, +0x8c428fb4, 0x2463d8f0, 0x431023, 0x2c422710, +0x14400003, 0x24020004, 0x3c010002, 0xac228f90, +0x3c020002, 0x8c428fd0, 0x14400021, 0x3c02fdff, 0x3442ffff, 0x1000014a, 0x282a024, 0x3c040001, -0x8c846f9c, 0x3c010002, 0xc0050b4, 0xac209028, -0x3c020002, 0x8c42905c, 0xaf820204, 0x3c020002, -0x8c429050, 0x14400012, 0x3c03fdff, 0x8f820204, +0x8c846f20, 0x3c010002, 0xc005084, 0xac208fa8, +0x3c020002, 0x8c428fdc, 0xaf820204, 0x3c020002, +0x8c428fd0, 0x14400012, 0x3c03fdff, 0x8f820204, 0x3463ffff, 0x30420030, 0x1440012f, 0x283a024, -0x3c030002, 0x8c63905c, 0x24020005, 0x3c010002, -0xac229010, 0x3c010002, 0x10000131, 0xac239060, -0x3c020002, 0x8c429050, 0x10400010, 0x3c02fdff, -0x3c020001, 0x8c426ebc, 0x24420001, 0x3c010001, -0xac226ebc, 0x2c420002, 0x14400125, 0x24020001, -0x3c010001, 0xac226ec4, 0x3c010001, 0xac206ebc, -0x3c010001, 0x1000011e, 0xac226e1c, 0x3c030002, -0x8c639040, 0x3442ffff, 0x10600119, 0x282a024, -0x3c020002, 0x8c42901c, 0x10400115, 0x0, -0x3c010002, 0xac229048, 0x24020003, 0x3c010002, -0xac229020, 0x100000b8, 0x24020006, 0x3c010002, -0xac209028, 0x8f820204, 0x34420040, 0xaf820204, -0x3c020002, 0x8c429060, 0x24030007, 0x3c010002, -0xac239010, 0x34420040, 0x3c010002, 0xac229060, -0x3c020002, 0x8c429040, 0x10400005, 0x0, -0x3c020002, 0x8c42901c, 0x104000f0, 0x24020002, -0x3c050002, 0x24a59020, 0x8ca20000, 0x2c424e21, -0x104000ea, 0x24020002, 0x3c020002, 0x8c429044, -0x104000ef, 0x2404ffbf, 0x3c020002, 0x8c42901c, -0x3c030002, 0x8c639048, 0x441024, 0x641824, +0x3c030002, 0x8c638fdc, 0x24020005, 0x3c010002, +0xac228f90, 0x3c010002, 0x10000131, 0xac238fe0, +0x3c020002, 0x8c428fd0, 0x10400010, 0x3c02fdff, +0x3c020001, 0x8c426e3c, 0x24420001, 0x3c010001, +0xac226e3c, 0x2c420002, 0x14400125, 0x24020001, +0x3c010001, 0xac226e44, 0x3c010001, 0xac206e3c, +0x3c010001, 0x1000011e, 0xac226d9c, 0x3c030002, +0x8c638fc0, 0x3442ffff, 0x10600119, 0x282a024, +0x3c020002, 0x8c428f9c, 0x10400115, 0x0, +0x3c010002, 0xac228fc8, 0x24020003, 0x3c010002, +0xac228fa0, 0x100000b8, 0x24020006, 0x3c010002, +0xac208fa8, 0x8f820204, 0x34420040, 0xaf820204, +0x3c020002, 0x8c428fe0, 0x24030007, 0x3c010002, +0xac238f90, 0x34420040, 0x3c010002, 0xac228fe0, +0x3c020002, 0x8c428fc0, 0x10400005, 0x0, +0x3c020002, 0x8c428f9c, 0x104000f0, 0x24020002, +0x3c050002, 0x24a58fa0, 0x8ca20000, 0x2c424e21, +0x104000ea, 0x24020002, 0x3c020002, 0x8c428fc4, +0x104000ef, 0x2404ffbf, 0x3c020002, 0x8c428f9c, +0x3c030002, 0x8c638fc8, 0x441024, 0x641824, 0x10430004, 0x24020001, 0x3c010002, 0x100000e4, -0xac229010, 0x24020003, 0xaca20000, 0x24020008, -0x3c010002, 0xac229010, 0x3c020002, 0x8c42904c, -0x1040000c, 0x24020001, 0x3c040002, 0xc0050c1, -0x8c84901c, 0x3c020002, 0x8c429068, 0x14400005, -0x24020001, 0x3c020002, 0x8c429064, 0x10400006, -0x24020001, 0x3c010001, 0xac226e1c, 0x3c010002, -0x100000cb, 0xac209038, 0x3c020002, 0x8c429030, -0x3c030002, 0x8c63901c, 0x2c420001, 0x210c0, -0x30630008, 0x3c010002, 0xac229030, 0x3c010002, -0xac23902c, 0x8f830054, 0x24020009, 0x3c010002, -0xac229010, 0x3c010002, 0x100000b9, 0xac239034, -0x8f830054, 0x3c020002, 0x8c429034, 0x2463d8f0, +0xac228f90, 0x24020003, 0xaca20000, 0x24020008, +0x3c010002, 0xac228f90, 0x3c020002, 0x8c428fcc, +0x1040000c, 0x24020001, 0x3c040002, 0xc005091, +0x8c848f9c, 0x3c020002, 0x8c428fe8, 0x14400005, +0x24020001, 0x3c020002, 0x8c428fe4, 0x10400006, +0x24020001, 0x3c010001, 0xac226d9c, 0x3c010002, +0x100000cb, 0xac208fb8, 0x3c020002, 0x8c428fb0, +0x3c030002, 0x8c638f9c, 0x2c420001, 0x210c0, +0x30630008, 0x3c010002, 0xac228fb0, 0x3c010002, +0xac238fac, 0x8f830054, 0x24020009, 0x3c010002, +0xac228f90, 0x3c010002, 0x100000b9, 0xac238fb4, +0x8f830054, 0x3c020002, 0x8c428fb4, 0x2463d8f0, 0x431023, 0x2c422710, 0x1440009f, 0x0, -0x3c020002, 0x8c429040, 0x10400005, 0x0, -0x3c020002, 0x8c42901c, 0x104000a0, 0x24020002, -0x3c030002, 0x24639020, 0x8c620000, 0x2c424e21, -0x1040009a, 0x24020002, 0x3c020002, 0x8c42904c, -0x1040000e, 0x0, 0x3c020002, 0x8c42901c, -0x3c010002, 0xac20904c, 0x30420080, 0x1040002f, +0x3c020002, 0x8c428fc0, 0x10400005, 0x0, +0x3c020002, 0x8c428f9c, 0x104000a0, 0x24020002, +0x3c030002, 0x24638fa0, 0x8c620000, 0x2c424e21, +0x1040009a, 0x24020002, 0x3c020002, 0x8c428fcc, +0x1040000e, 0x0, 0x3c020002, 0x8c428f9c, +0x3c010002, 0xac208fcc, 0x30420080, 0x1040002f, 0x2402000c, 0x8f820204, 0x30420080, 0x1440000c, 0x24020003, 0x10000029, 0x2402000c, 0x3c020002, -0x8c42901c, 0x30420080, 0x14400005, 0x24020003, +0x8c428f9c, 0x30420080, 0x14400005, 0x24020003, 0x8f820204, 0x30420080, 0x1040001f, 0x24020003, -0xac620000, 0x2402000a, 0x3c010002, 0xac229010, -0x3c040002, 0x24849058, 0x8c820000, 0x3c030002, -0x8c639030, 0x431025, 0xaf820204, 0x8c830000, -0x3c040002, 0x8c849030, 0x2402000b, 0x3c010002, -0xac229010, 0x641825, 0x3c010002, 0xac239060, -0x3c050002, 0x24a59020, 0x8ca20000, 0x2c424e21, -0x10400066, 0x24020002, 0x3c020002, 0x8c429050, +0xac620000, 0x2402000a, 0x3c010002, 0xac228f90, +0x3c040002, 0x24848fd8, 0x8c820000, 0x3c030002, +0x8c638fb0, 0x431025, 0xaf820204, 0x8c830000, +0x3c040002, 0x8c848fb0, 0x2402000b, 0x3c010002, +0xac228f90, 0x641825, 0x3c010002, 0xac238fe0, +0x3c050002, 0x24a58fa0, 0x8ca20000, 0x2c424e21, +0x10400066, 0x24020002, 0x3c020002, 0x8c428fd0, 0x10400005, 0x0, 0x2402000c, 0x3c010002, -0x10000067, 0xac229010, 0x3c020002, 0x8c429040, -0x10400063, 0x0, 0x3c040002, 0x8c84901c, -0x10800055, 0x30820008, 0x3c030002, 0x8c63902c, -0x1062005b, 0x24020003, 0x3c010002, 0xac249048, +0x10000067, 0xac228f90, 0x3c020002, 0x8c428fc0, +0x10400063, 0x0, 0x3c040002, 0x8c848f9c, +0x10800055, 0x30820008, 0x3c030002, 0x8c638fac, +0x1062005b, 0x24020003, 0x3c010002, 0xac248fc8, 0xaca20000, 0x24020006, 0x3c010002, 0x10000054, -0xac229010, 0x8f820200, 0x34420002, 0xaf820200, -0x8f830054, 0x2402000d, 0x3c010002, 0xac229010, -0x3c010002, 0xac239034, 0x8f830054, 0x3c020002, -0x8c429034, 0x2463d8f0, 0x431023, 0x2c422710, -0x14400031, 0x0, 0x3c020002, 0x8c429050, -0x10400020, 0x2402000e, 0x3c030002, 0x8c639064, -0x3c010002, 0x14600015, 0xac229010, 0xc003e45, -0x0, 0x3c050001, 0x8ca56e18, 0xc0052c7, -0x2021, 0x3c030001, 0x8c636e18, 0x24020004, -0x14620005, 0x2403fffb, 0x3c020001, 0x8c426e14, -0x10000003, 0x2403fff7, 0x3c020001, 0x8c426e14, -0x431024, 0x3c010001, 0xac226e14, 0x8f830224, -0x3c020200, 0x3c010002, 0xac23906c, 0x10000020, -0x282a025, 0x3c020002, 0x8c429040, 0x10400005, -0x0, 0x3c020002, 0x8c42901c, 0x1040000f, -0x24020002, 0x3c020002, 0x8c429020, 0x2c424e21, -0x1040000a, 0x24020002, 0x3c020002, 0x8c429040, -0x1040000f, 0x0, 0x3c020002, 0x8c42901c, +0xac228f90, 0x8f820200, 0x34420002, 0xaf820200, +0x8f830054, 0x2402000d, 0x3c010002, 0xac228f90, +0x3c010002, 0xac238fb4, 0x8f830054, 0x3c020002, +0x8c428fb4, 0x2463d8f0, 0x431023, 0x2c422710, +0x14400031, 0x0, 0x3c020002, 0x8c428fd0, +0x10400020, 0x2402000e, 0x3c030002, 0x8c638fe4, +0x3c010002, 0x14600015, 0xac228f90, 0xc003e6d, +0x0, 0x3c050001, 0x8ca56d98, 0xc00529b, +0x2021, 0x3c030001, 0x8c636d98, 0x24020004, +0x14620005, 0x2403fffb, 0x3c020001, 0x8c426d94, +0x10000003, 0x2403fff7, 0x3c020001, 0x8c426d94, +0x431024, 0x3c010001, 0xac226d94, 0x8f830224, +0x3c020200, 0x3c010002, 0xac238fec, 0x10000020, +0x282a025, 0x3c020002, 0x8c428fc0, 0x10400005, +0x0, 0x3c020002, 0x8c428f9c, 0x1040000f, +0x24020002, 0x3c020002, 0x8c428fa0, 0x2c424e21, +0x1040000a, 0x24020002, 0x3c020002, 0x8c428fc0, +0x1040000f, 0x0, 0x3c020002, 0x8c428f9c, 0x1440000b, 0x0, 0x24020002, 0x3c010002, -0x10000007, 0xac229010, 0x3c020002, 0x8c429040, -0x10400003, 0x0, 0xc003d87, 0x0, +0x10000007, 0xac228f90, 0x3c020002, 0x8c428fc0, +0x10400003, 0x0, 0xc003daf, 0x0, 0x8f820220, 0x3c03f700, 0x431025, 0xaf820220, 0x8fbf0010, 0x3e00008, 0x27bd0018, 0x3c030002, -0x24639068, 0x8c620000, 0x10400005, 0x34422000, -0x3c010002, 0xac22905c, 0x10000003, 0xac600000, -0x3c010002, 0xac24905c, 0x3e00008, 0x0, +0x24638fe8, 0x8c620000, 0x10400005, 0x34422000, +0x3c010002, 0xac228fdc, 0x10000003, 0xac600000, +0x3c010002, 0xac248fdc, 0x3e00008, 0x0, 0x27bdffe0, 0x30820030, 0xafbf0018, 0x3c010002, -0xac229064, 0x14400067, 0x3c02ffff, 0x34421f0e, +0xac228fe4, 0x14400067, 0x3c02ffff, 0x34421f0e, 0x821024, 0x14400061, 0x24020030, 0x30822000, 0x1040005d, 0x30838000, 0x31a02, 0x30820001, -0x21200, 0x3c040001, 0x8c846f9c, 0x621825, -0x331c2, 0x3c030001, 0x24636ec8, 0x30828000, +0x21200, 0x3c040001, 0x8c846f20, 0x621825, +0x331c2, 0x3c030001, 0x24636e48, 0x30828000, 0x21202, 0x30840001, 0x42200, 0x441025, 0x239c2, 0x61080, 0x431021, 0x471021, 0x90430000, 0x24020001, 0x10620025, 0x0, @@ -8775,354 +8758,357 @@ 0x1062002c, 0x3c05000f, 0x10000037, 0x0, 0x8f820200, 0x2403feff, 0x431024, 0xaf820200, 0x8f820220, 0x3c03fffe, 0x3463ffff, 0x431024, -0xaf820220, 0x3c010002, 0xac209084, 0x3c010002, -0x10000034, 0xac20908c, 0x8f820200, 0x34420100, +0xaf820220, 0x3c010002, 0xac209004, 0x3c010002, +0x10000034, 0xac20900c, 0x8f820200, 0x34420100, 0xaf820200, 0x8f820220, 0x3c03fffe, 0x3463ffff, 0x431024, 0xaf820220, 0x24020100, 0x3c010002, -0xac229084, 0x3c010002, 0x10000026, 0xac20908c, +0xac229004, 0x3c010002, 0x10000026, 0xac20900c, 0x8f820200, 0x2403feff, 0x431024, 0xaf820200, 0x8f820220, 0x3c030001, 0x431025, 0xaf820220, -0x3c010002, 0xac209084, 0x3c010002, 0x10000019, -0xac23908c, 0x8f820200, 0x34420100, 0xaf820200, +0x3c010002, 0xac209004, 0x3c010002, 0x10000019, +0xac23900c, 0x8f820200, 0x34420100, 0xaf820200, 0x8f820220, 0x3c030001, 0x431025, 0xaf820220, -0x24020100, 0x3c010002, 0xac229084, 0x3c010002, -0x1000000c, 0xac23908c, 0x34a5ffff, 0x3c040001, -0x24846cb8, 0xafa30010, 0xc002b17, 0xafa00014, +0x24020100, 0x3c010002, 0xac229004, 0x3c010002, +0x1000000c, 0xac23900c, 0x34a5ffff, 0x3c040001, +0x24846c38, 0xafa30010, 0xc002b3b, 0xafa00014, 0x10000004, 0x0, 0x24020030, 0x3c010002, -0xac229068, 0x8fbf0018, 0x3e00008, 0x27bd0020, +0xac228fe8, 0x8fbf0018, 0x3e00008, 0x27bd0020, 0x0, 0x0, 0x0, 0x27bdffc8, 0xafb20028, 0x809021, 0xafb3002c, 0xa09821, -0xafb00020, 0xc08021, 0x3c040001, 0x24846cd0, -0x3c050009, 0x3c020001, 0x8c426e18, 0x34a59001, +0xafb00020, 0xc08021, 0x3c040001, 0x24846c50, +0x3c050009, 0x3c020001, 0x8c426d98, 0x34a59001, 0x2403021, 0x2603821, 0xafbf0030, 0xafb10024, -0xa7a0001a, 0xafb00014, 0xc002b17, 0xafa20010, -0x24020002, 0x1262007f, 0x2e620003, 0x10400005, -0x24020001, 0x1262000a, 0x0, 0x1000016f, -0x0, 0x24020004, 0x126200f4, 0x24020008, -0x126200f3, 0x3c02ffec, 0x10000168, 0x0, -0x3c020001, 0x8c426e14, 0x30420002, 0x14400004, +0xa7a0001a, 0xafb00014, 0xc002b3b, 0xafa20010, +0x24020002, 0x12620083, 0x2e620003, 0x10400005, +0x24020001, 0x1262000a, 0x0, 0x10000173, +0x0, 0x24020004, 0x126200f8, 0x24020008, +0x126200f7, 0x3c02ffec, 0x1000016c, 0x0, +0x3c020001, 0x8c426d94, 0x30420002, 0x14400004, 0x128940, 0x3c02fffb, 0x3442ffff, 0x2028024, -0x3c010002, 0x310821, 0xac30907c, 0x3c024000, -0x2021024, 0x1040004a, 0x1023c2, 0x30840030, -0x101382, 0x3042001c, 0x3c030001, 0x24636e58, +0x3c010002, 0x310821, 0xac308ffc, 0x3c024000, +0x2021024, 0x1040004e, 0x1023c2, 0x30840030, +0x101382, 0x3042001c, 0x3c030001, 0x24636dd8, 0x431021, 0x823821, 0x3c020020, 0x2021024, 0x10400006, 0x24020100, 0x3c010002, 0x310821, -0xac229080, 0x10000005, 0x3c020080, 0x3c010002, -0x310821, 0xac209080, 0x3c020080, 0x2021024, +0xac229000, 0x10000005, 0x3c020080, 0x3c010002, +0x310821, 0xac209000, 0x3c020080, 0x2021024, 0x10400006, 0x121940, 0x3c020001, 0x3c010002, -0x230821, 0x10000005, 0xac229088, 0x121140, -0x3c010002, 0x220821, 0xac209088, 0x94e30000, -0x32024000, 0x10400003, 0xa7a30018, 0x34624000, +0x230821, 0x10000005, 0xac229008, 0x121140, +0x3c010002, 0x220821, 0xac209008, 0x94e40000, +0x3c030001, 0x8c636f40, 0x24020005, 0x10620010, +0xa7a40018, 0x32024000, 0x10400002, 0x34824000, 0xa7a20018, 0x24040001, 0x94e20002, 0x24050004, -0x24e60002, 0x34420001, 0xc00450e, 0xa4e20002, -0x24040001, 0x2821, 0xc00450e, 0x27a60018, -0x3c020001, 0x8c426e18, 0x24110001, 0x3c010001, -0xac316e24, 0x14530004, 0x32028000, 0xc003d87, +0x24e60002, 0x34420001, 0xc0045be, 0xa4e20002, +0x24040001, 0x2821, 0xc0045be, 0x27a60018, +0x3c020001, 0x8c426d98, 0x24110001, 0x3c010001, +0xac316da4, 0x14530004, 0x32028000, 0xc003daf, 0x0, 0x32028000, 0x1040011c, 0x0, -0xc003d87, 0x0, 0x3c030001, 0x8c636fb8, +0xc003daf, 0x0, 0x3c030001, 0x8c636f40, 0x24020005, 0x10620115, 0x24020002, 0x3c010001, -0xac316e1c, 0x3c010001, 0x10000110, 0xac226e18, -0x24040001, 0x24050004, 0x27b0001a, 0xc00450e, -0x2003021, 0x24040001, 0x2821, 0xc00450e, -0x2003021, 0x3c020002, 0x511021, 0x8c429074, -0x3c040001, 0x8c846e18, 0x3c03bfff, 0x3463ffff, -0x3c010001, 0xac336e24, 0x431024, 0x3c010002, -0x310821, 0x109300f7, 0xac229074, 0x100000f7, +0xac316d9c, 0x3c010001, 0x10000110, 0xac226d98, +0x24040001, 0x24050004, 0x27b0001a, 0xc0045be, +0x2003021, 0x24040001, 0x2821, 0xc0045be, +0x2003021, 0x3c020002, 0x511021, 0x8c428ff4, +0x3c040001, 0x8c846d98, 0x3c03bfff, 0x3463ffff, +0x3c010001, 0xac336da4, 0x431024, 0x3c010002, +0x310821, 0x109300f7, 0xac228ff4, 0x100000f7, 0x0, 0x3c022000, 0x2021024, 0x10400005, -0x24020001, 0x3c010001, 0xac226f98, 0x10000004, -0x128940, 0x3c010001, 0xac206f98, 0x128940, -0x3c010002, 0x310821, 0xac309078, 0x3c024000, +0x24020001, 0x3c010001, 0xac226f1c, 0x10000004, +0x128940, 0x3c010001, 0xac206f1c, 0x128940, +0x3c010002, 0x310821, 0xac308ff8, 0x3c024000, 0x2021024, 0x14400014, 0x0, 0x3c020001, -0x8c426f98, 0x10400006, 0x24040004, 0x24050001, -0xc004e0e, 0x24062000, 0x24020001, 0xaee204b8, -0x3c020002, 0x511021, 0x8c429070, 0x3c03bfff, +0x8c426f1c, 0x10400006, 0x24040004, 0x24050001, +0xc004ddb, 0x24062000, 0x24020001, 0xaee204b8, +0x3c020002, 0x511021, 0x8c428ff0, 0x3c03bfff, 0x3463ffff, 0x431024, 0x3c010002, 0x310821, -0x100000d0, 0xac229070, 0x3c020001, 0x8c426f98, +0x100000d0, 0xac228ff0, 0x3c020001, 0x8c426f1c, 0x10400028, 0x3c0300a0, 0x2031024, 0x5443000d, -0x3c020020, 0x3c020001, 0x8c426f9c, 0x24030100, -0x3c010002, 0x310821, 0xac239084, 0x3c030001, -0x3c010002, 0x310821, 0xac23908c, 0x10000015, +0x3c020020, 0x3c020001, 0x8c426f20, 0x24030100, +0x3c010002, 0x310821, 0xac239004, 0x3c030001, +0x3c010002, 0x310821, 0xac23900c, 0x10000015, 0x34420400, 0x2021024, 0x10400008, 0x24030100, -0x3c020001, 0x8c426f9c, 0x3c010002, 0x310821, -0xac239084, 0x1000000b, 0x34420800, 0x3c020080, +0x3c020001, 0x8c426f20, 0x3c010002, 0x310821, +0xac239004, 0x1000000b, 0x34420800, 0x3c020080, 0x2021024, 0x1040002e, 0x3c030001, 0x3c020001, -0x8c426f9c, 0x3c010002, 0x310821, 0xac23908c, -0x34420c00, 0x3c010001, 0xac226f9c, 0x10000025, +0x8c426f20, 0x3c010002, 0x310821, 0xac23900c, +0x34420c00, 0x3c010001, 0xac226f20, 0x10000025, 0x24040001, 0x3c020020, 0x2021024, 0x10400006, -0x24020100, 0x3c010002, 0x310821, 0xac229084, +0x24020100, 0x3c010002, 0x310821, 0xac229004, 0x10000005, 0x3c020080, 0x3c010002, 0x310821, -0xac209084, 0x3c020080, 0x2021024, 0x10400007, +0xac209004, 0x3c020080, 0x2021024, 0x10400007, 0x121940, 0x3c020001, 0x3c010002, 0x230821, -0xac22908c, 0x10000006, 0x24040001, 0x121140, -0x3c010002, 0x220821, 0xac20908c, 0x24040001, -0x2821, 0x27b0001e, 0xc0044cc, 0x2003021, -0x24040001, 0x2821, 0xc0044cc, 0x2003021, -0x24040001, 0x24050001, 0x27b0001c, 0xc0044cc, -0x2003021, 0x24040001, 0x24050001, 0xc0044cc, +0xac22900c, 0x10000006, 0x24040001, 0x121140, +0x3c010002, 0x220821, 0xac20900c, 0x24040001, +0x2821, 0x27b0001e, 0xc00457c, 0x2003021, +0x24040001, 0x2821, 0xc00457c, 0x2003021, +0x24040001, 0x24050001, 0x27b0001c, 0xc00457c, +0x2003021, 0x24040001, 0x24050001, 0xc00457c, 0x2003021, 0x10000077, 0x0, 0x3c02ffec, 0x3442ffff, 0x2028024, 0x3c020008, 0x2028025, -0x121140, 0x3c010002, 0x220821, 0xac309078, +0x121140, 0x3c010002, 0x220821, 0xac308ff8, 0x3c022000, 0x2021024, 0x10400009, 0x0, -0x3c020001, 0x8c426ec4, 0x14400005, 0x24020001, -0x3c010001, 0xac226f98, 0x10000004, 0x3c024000, -0x3c010001, 0xac206f98, 0x3c024000, 0x2021024, -0x1440001d, 0x24020e01, 0x3c030001, 0x8c636f98, -0xaf820238, 0x3c010001, 0xac206e30, 0x10600005, -0x24022020, 0x3c010001, 0xac226f9c, 0x24020001, +0x3c020001, 0x8c426e44, 0x14400005, 0x24020001, +0x3c010001, 0xac226f1c, 0x10000004, 0x3c024000, +0x3c010001, 0xac206f1c, 0x3c024000, 0x2021024, +0x1440001d, 0x24020e01, 0x3c030001, 0x8c636f1c, +0xaf820238, 0x3c010001, 0xac206db0, 0x10600005, +0x24022020, 0x3c010001, 0xac226f20, 0x24020001, 0xaee204b8, 0x3c04bfff, 0x121940, 0x3c020002, -0x431021, 0x8c429070, 0x3c050001, 0x8ca56e18, +0x431021, 0x8c428ff0, 0x3c050001, 0x8ca56d98, 0x3484ffff, 0x441024, 0x3c010002, 0x230821, -0xac229070, 0x24020001, 0x10a20044, 0x0, -0x10000040, 0x0, 0x3c020001, 0x8c426f98, -0x1040001c, 0x24022000, 0x3c010001, 0xac226f9c, +0xac228ff0, 0x24020001, 0x10a20044, 0x0, +0x10000040, 0x0, 0x3c020001, 0x8c426f1c, +0x1040001c, 0x24022000, 0x3c010001, 0xac226f20, 0x3c0300a0, 0x2031024, 0x14430005, 0x121140, -0x3402a000, 0x3c010001, 0x1000002d, 0xac226f9c, -0x3c030002, 0x621821, 0x8c639078, 0x3c020020, +0x3402a000, 0x3c010001, 0x1000002d, 0xac226f20, +0x3c030002, 0x621821, 0x8c638ff8, 0x3c020020, 0x621024, 0x10400004, 0x24022001, 0x3c010001, -0x10000023, 0xac226f9c, 0x3c020080, 0x621024, +0x10000023, 0xac226f20, 0x3c020080, 0x621024, 0x1040001f, 0x3402a001, 0x3c010001, 0x1000001c, -0xac226f9c, 0x3c020020, 0x2021024, 0x10400007, +0xac226f20, 0x3c020020, 0x2021024, 0x10400007, 0x121940, 0x24020100, 0x3c010002, 0x230821, -0xac229084, 0x10000006, 0x3c020080, 0x121140, -0x3c010002, 0x220821, 0xac209084, 0x3c020080, +0xac229004, 0x10000006, 0x3c020080, 0x121140, +0x3c010002, 0x220821, 0xac209004, 0x3c020080, 0x2021024, 0x10400006, 0x121940, 0x3c020001, -0x3c010002, 0x230821, 0x10000005, 0xac22908c, -0x121140, 0x3c010002, 0x220821, 0xac20908c, -0x3c030001, 0x8c636e18, 0x24020001, 0x10620003, -0x0, 0xc003d87, 0x0, 0x8fbf0030, +0x3c010002, 0x230821, 0x10000005, 0xac22900c, +0x121140, 0x3c010002, 0x220821, 0xac20900c, +0x3c030001, 0x8c636d98, 0x24020001, 0x10620003, +0x0, 0xc003daf, 0x0, 0x8fbf0030, 0x8fb3002c, 0x8fb20028, 0x8fb10024, 0x8fb00020, -0x3e00008, 0x27bd0038, 0x27bdffb8, 0xafbe003c, -0x80f021, 0xafb30034, 0x9821, 0xafb20030, -0x9021, 0xafb1002c, 0x8821, 0x24020002, -0xafbf0040, 0xafb50038, 0xafb00028, 0xa7a00020, -0xa7a00018, 0xa7a0001a, 0xa7a0001c, 0xa7a0001e, -0x10a20142, 0xa7a00022, 0x2ca20003, 0x10400005, -0x24020001, 0x10a2000a, 0x1ea940, 0x10000253, -0x2201021, 0x24020004, 0x10a20203, 0x24020008, -0x10a20202, 0x1e2940, 0x1000024c, 0x2201021, -0x3c030002, 0x751821, 0x8c63907c, 0x3c024000, -0x621024, 0x14400009, 0x24040001, 0x3c027fff, -0x3442ffff, 0x628824, 0x3c010002, 0x350821, -0xac319074, 0x1000023d, 0x2201021, 0x2821, -0xc0044cc, 0x27a60018, 0x24040001, 0x2821, -0xc0044cc, 0x27a60018, 0x24040001, 0x24050001, -0x27b0001a, 0xc0044cc, 0x2003021, 0x24040001, -0x24050001, 0xc0044cc, 0x2003021, 0x24040001, -0x24050004, 0x27b0001c, 0xc0044cc, 0x2003021, -0x24040001, 0x24050004, 0xc0044cc, 0x2003021, -0x24040001, 0x24050005, 0x27b0001e, 0xc0044cc, -0x2003021, 0x24040001, 0x24050005, 0xc0044cc, -0x2003021, 0x24040001, 0x24050009, 0xc0044cc, -0x2003021, 0x24040001, 0x24050009, 0xc0044cc, -0x2003021, 0x24040001, 0x24050001, 0xc0044cc, -0x27a60018, 0x24040001, 0x24050001, 0xc0044cc, -0x27a60018, 0x97a20018, 0x30420004, 0x104000ba, -0x3c114000, 0x3c020001, 0x8c426fb8, 0x2443ffff, -0x2c620006, 0x104000ba, 0x31080, 0x3c010001, -0x220821, 0x8c226ce8, 0x400008, 0x0, -0x24040001, 0x24050011, 0x27b00020, 0xc0044cc, -0x2003021, 0x24040001, 0x24050011, 0xc0044cc, -0x2003021, 0x97a30020, 0x30624000, 0x10400002, -0x3c120010, 0x3c120008, 0x3c130001, 0x30628000, -0x54400098, 0x3c130002, 0x10000097, 0x3c028000, -0x24040001, 0x24050014, 0x27b00020, 0xc0044cc, -0x2003021, 0x24040001, 0x24050014, 0xc0044cc, -0x2003021, 0x97a30020, 0x30621000, 0x10400002, -0x3c120010, 0x3c120008, 0x3c130001, 0x1000ffec, -0x30620800, 0x24040001, 0x24050019, 0x27b00022, -0xc0044cc, 0x2003021, 0x24040001, 0x24050019, -0xc0044cc, 0x2003021, 0x97a20022, 0x30430700, -0x24020400, 0x10620027, 0x28620401, 0x1040000e, -0x24020200, 0x1062001f, 0x28620201, 0x10400005, -0x24020100, 0x5062001e, 0x3c130001, 0x1000001e, -0x24040001, 0x24020300, 0x50620019, 0x3c130002, -0x10000019, 0x24040001, 0x24020600, 0x1062000d, -0x28620601, 0x10400005, 0x24020500, 0x5062000b, -0x3c130002, 0x10000010, 0x24040001, 0x24020700, -0x1462000d, 0x24040001, 0x3c130004, 0x1000000a, -0x3c120008, 0x10000006, 0x3c130004, 0x10000005, -0x3c120008, 0x3c130001, 0x10000002, 0x3c120008, -0x3c120010, 0x24040001, 0x24050010, 0x27b0001c, -0xc0044cc, 0x2003021, 0x24040001, 0x24050010, -0xc0044cc, 0x2003021, 0x3c020004, 0x16620010, -0x3c020001, 0x8f840054, 0x24030001, 0x24020002, -0x3c010001, 0xac236e1c, 0x3c010001, 0xac226e18, -0x3c010001, 0xac236e24, 0x3c010001, 0xac236ea4, -0x3c010001, 0xac246fa8, 0x10000041, 0x2538825, -0x16620035, 0x3c028000, 0x3c020001, 0x8c426ea0, -0x1440001e, 0x24040018, 0x2021, 0x2821, -0xc004e0e, 0x34068000, 0x8f830054, 0x8f820054, -0x2538825, 0x10000002, 0x24630032, 0x8f820054, -0x621023, 0x2c420033, 0x1440fffc, 0x0, -0x8f830054, 0x24020001, 0x3c010001, 0xac226ea0, -0x3c010001, 0xac226e1c, 0x3c010001, 0xac226e18, -0x3c010001, 0xac226e24, 0x3c010001, 0xac226ea4, -0x3c010001, 0x1000001e, 0xac236fa8, 0x2821, -0xc004e0e, 0x24060404, 0x2021, 0x2405001e, -0x27a60018, 0x24020002, 0xc00450e, 0xa7a20018, -0x2021, 0x2821, 0x27a60018, 0xc00450e, -0xa7a00018, 0x24040018, 0x24050002, 0xc004e0e, -0x24060004, 0x3c028000, 0x2221025, 0x2721825, -0x10000007, 0x438825, 0x3c110002, 0x2358821, -0x8e31907c, 0x3c027fff, 0x3442ffff, 0x2228824, -0x3c020001, 0x8c426e28, 0x1040001c, 0x0, -0x3c020001, 0x8c426f98, 0x10400002, 0x3c022000, -0x2228825, 0x1e1140, 0x3c010002, 0x220821, -0x8c229080, 0x10400003, 0x3c020020, 0x10000004, +0x3e00008, 0x27bd0038, 0x27bdffb0, 0xafb3003c, +0x9821, 0xafb50040, 0xa821, 0xafb10034, +0x8821, 0x24020002, 0xafbf0048, 0xafbe0044, +0xafb20038, 0xafb00030, 0xafa4002c, 0xa7a0001a, +0xa7a00018, 0xa7a00020, 0xa7a0001e, 0xa7a00022, +0x10a20130, 0xa7a0001c, 0x2ca20003, 0x10400005, +0x24020001, 0x10a2000a, 0x3c024000, 0x1000025d, +0x2201021, 0x24020004, 0x10a2020a, 0x24020008, +0x10a20208, 0x2201021, 0x10000256, 0x0, +0x8fa8002c, 0x88140, 0x3c030002, 0x701821, +0x8c638ffc, 0x621024, 0x14400009, 0x24040001, +0x3c027fff, 0x3442ffff, 0x628824, 0x3c010002, +0x300821, 0xac318ff4, 0x10000246, 0x2201021, +0x24050001, 0xc00457c, 0x27a60018, 0x24040001, +0x24050001, 0xc00457c, 0x27a60018, 0x97a20018, +0x30420004, 0x104000d9, 0x3c114000, 0x3c020001, +0x8c426f40, 0x2443ffff, 0x2c620006, 0x104000d9, +0x31080, 0x3c010001, 0x220821, 0x8c226c68, +0x400008, 0x0, 0x24040001, 0x24050011, +0x27b0001a, 0xc00457c, 0x2003021, 0x24040001, +0x24050011, 0xc00457c, 0x2003021, 0x97a3001a, +0x30624000, 0x10400002, 0x3c150010, 0x3c150008, +0x30628000, 0x104000aa, 0x3c130001, 0x100000a8, +0x3c130002, 0x24040001, 0x24050014, 0x27b0001a, +0xc00457c, 0x2003021, 0x24040001, 0x24050014, +0xc00457c, 0x2003021, 0x97a3001a, 0x30621000, +0x10400002, 0x3c150010, 0x3c150008, 0x30620800, +0x10400097, 0x3c130001, 0x10000095, 0x3c130002, +0x24040001, 0x24050019, 0x27b0001c, 0xc00457c, +0x2003021, 0x24040001, 0x24050019, 0xc00457c, +0x2003021, 0x97a2001c, 0x30430700, 0x24020400, +0x10620027, 0x28620401, 0x1040000e, 0x24020200, +0x1062001f, 0x28620201, 0x10400005, 0x24020100, +0x5062001e, 0x3c130001, 0x1000001e, 0x24040001, +0x24020300, 0x50620019, 0x3c130002, 0x10000019, +0x24040001, 0x24020600, 0x1062000d, 0x28620601, +0x10400005, 0x24020500, 0x5062000b, 0x3c130002, +0x10000010, 0x24040001, 0x24020700, 0x1462000d, +0x24040001, 0x3c130004, 0x1000000a, 0x3c150008, +0x10000006, 0x3c130004, 0x10000005, 0x3c150008, +0x3c130001, 0x10000002, 0x3c150008, 0x3c150010, +0x24040001, 0x24050018, 0x27b0001e, 0xc00457c, +0x2003021, 0x24040001, 0x24050018, 0xc00457c, +0x2003021, 0x8fa8002c, 0x97a7001e, 0x81140, +0x3c060002, 0xc23021, 0x8cc68ff4, 0x97a20022, +0x3c100001, 0x26106c5c, 0x2002021, 0xafa20010, +0x97a2001c, 0x3c05000c, 0x34a50303, 0xc002b3b, +0xafa20014, 0x3c020004, 0x16620010, 0x3c020001, +0x8f840054, 0x24030001, 0x24020002, 0x3c010001, +0xac236d9c, 0x3c010001, 0xac226d98, 0x3c010001, +0xac236da4, 0x3c010001, 0xac236e24, 0x3c010001, +0xac246f30, 0x1000004f, 0x2b38825, 0x16620039, +0x3c028000, 0x3c020001, 0x8c426e20, 0x1440001e, +0x24040018, 0x2021, 0x2821, 0xc004ddb, +0x34068000, 0x8f830054, 0x8f820054, 0x2b38825, +0x10000002, 0x24630032, 0x8f820054, 0x621023, +0x2c420033, 0x1440fffc, 0x0, 0x8f830054, +0x24020001, 0x3c010001, 0xac226e20, 0x3c010001, +0xac226d9c, 0x3c010001, 0xac226d98, 0x3c010001, +0xac226da4, 0x3c010001, 0xac226e24, 0x3c010001, +0x1000002c, 0xac236f30, 0x2821, 0xc004ddb, +0x24060404, 0x2021, 0x2405001e, 0x27a60018, +0x24020002, 0xc0045be, 0xa7a20018, 0x2021, +0x2821, 0x27a60018, 0xc0045be, 0xa7a00018, +0x24040018, 0x24050002, 0xc004ddb, 0x24060004, +0x3c028000, 0x2221025, 0x2b31825, 0x10000015, +0x438825, 0x2221025, 0x2751825, 0x438825, +0x2002021, 0x97a6001c, 0x3c070001, 0x8ce76d98, +0x3c05000c, 0x34a50326, 0xafb30010, 0xc002b3b, +0xafb10014, 0x10000007, 0x0, 0x3c110002, +0x2308821, 0x8e318ffc, 0x3c027fff, 0x3442ffff, +0x2228824, 0x3c020001, 0x8c426da8, 0x1040001e, +0x0, 0x3c020001, 0x8c426f1c, 0x10400002, +0x3c022000, 0x2228825, 0x8fa8002c, 0x81140, +0x3c010002, 0x220821, 0x8c229000, 0x10400003, +0x3c020020, 0x10000005, 0x2228825, 0x3c02ffdf, +0x3442ffff, 0x2228824, 0x8fa8002c, 0x81140, +0x3c010002, 0x220821, 0x8c229008, 0x10400003, +0x3c020080, 0x10000004, 0x2228825, 0x3c02ff7f, +0x3442ffff, 0x2228824, 0x8fa8002c, 0x81140, +0x3c010002, 0x220821, 0xac318ff4, 0x10000135, +0x2201021, 0x8fa8002c, 0x8f140, 0x3c030002, +0x7e1821, 0x8c638ff8, 0x3c024000, 0x621024, +0x14400009, 0x24040001, 0x3c027fff, 0x3442ffff, +0x628824, 0x3c010002, 0x3e0821, 0xac318ff0, +0x10000124, 0x2201021, 0x2821, 0xc00457c, +0x27a60018, 0x24040001, 0x2821, 0xc00457c, +0x27a60018, 0x24040001, 0x24050001, 0x27b20020, +0xc00457c, 0x2403021, 0x24040001, 0x24050001, +0xc00457c, 0x2403021, 0x24040001, 0x24050004, +0x27b1001e, 0xc00457c, 0x2203021, 0x24040001, +0x24050004, 0xc00457c, 0x2203021, 0x24040001, +0x24050005, 0x27b00022, 0xc00457c, 0x2003021, +0x24040001, 0x24050005, 0xc00457c, 0x2003021, +0x24040001, 0x24050010, 0xc00457c, 0x27a60018, +0x24040001, 0x24050010, 0xc00457c, 0x27a60018, +0x24040001, 0x2405000a, 0xc00457c, 0x2403021, +0x24040001, 0x2405000a, 0xc00457c, 0x2403021, +0x24040001, 0x24050018, 0xc00457c, 0x2203021, +0x24040001, 0x24050018, 0xc00457c, 0x2203021, +0x24040001, 0x24050001, 0xc00457c, 0x27a60018, +0x24040001, 0x24050001, 0xc00457c, 0x27a60018, +0x97a20018, 0x30420004, 0x10400066, 0x3c114000, +0x3c030001, 0x8c636f34, 0x24020005, 0x14620067, +0x24040001, 0x24050019, 0x27b0001c, 0xc00457c, +0x2003021, 0x24040001, 0x24050019, 0xc00457c, +0x2003021, 0x97a2001c, 0x30430700, 0x24020400, +0x10620027, 0x28620401, 0x1040000e, 0x24020200, +0x1062001f, 0x28620201, 0x10400005, 0x24020100, +0x5062001e, 0x3c130001, 0x1000001e, 0x3c020004, +0x24020300, 0x50620019, 0x3c130002, 0x10000019, +0x3c020004, 0x24020600, 0x1062000d, 0x28620601, +0x10400005, 0x24020500, 0x5062000b, 0x3c130002, +0x10000010, 0x3c020004, 0x24020700, 0x1462000d, +0x3c020004, 0x3c130004, 0x1000000a, 0x3c150008, +0x10000006, 0x3c130004, 0x10000005, 0x3c150008, +0x3c130001, 0x10000002, 0x3c150008, 0x3c150010, +0x3c020004, 0x12620017, 0x3c028000, 0x8f820054, +0x24100001, 0x3c010001, 0xac306d9c, 0x3c010001, +0xac306d98, 0x3c010001, 0xac306da4, 0x3c010001, +0xac306e24, 0x3c010001, 0xac226f30, 0x3c020001, +0x16620022, 0x2758825, 0x2021, 0x2821, +0xc004ddb, 0x34068000, 0x3c010001, 0x1000001b, +0xac306e20, 0x2221025, 0x2b31825, 0x438825, +0x97a6001c, 0x3c020001, 0x8c426f1c, 0x3c070001, +0x8ce76d98, 0x3c040001, 0x24846c5c, 0xafa20010, +0x97a2001e, 0x3c05000c, 0x34a50323, 0x3c010001, +0xac206e20, 0xc002b3b, 0xafa20014, 0x10000007, +0x0, 0x3c110002, 0x23e8821, 0x8e318ff0, +0x3c027fff, 0x3442ffff, 0x2228824, 0x3c020001, +0x8c426da8, 0x10400069, 0x0, 0x3c020001, +0x8c426f1c, 0x10400002, 0x3c022000, 0x2228825, +0x8fa8002c, 0x81140, 0x3c010002, 0x220821, +0x8c229004, 0x10400003, 0x3c020020, 0x10000005, 0x2228825, 0x3c02ffdf, 0x3442ffff, 0x2228824, -0x1e1140, 0x3c010002, 0x220821, 0x8c229088, -0x10400003, 0x3c020080, 0x10000004, 0x2228825, -0x3c02ff7f, 0x3442ffff, 0x2228824, 0x3c040001, -0x24846cdc, 0x3c05000c, 0x97a60022, 0x3c070001, -0x8ce76e18, 0x34a50326, 0x1e1140, 0x3c010002, -0x220821, 0xac319074, 0xafb30010, 0xc002b17, -0xafb10014, 0x10000119, 0x2201021, 0x1ea940, -0x3c030002, 0x751821, 0x8c639078, 0x3c024000, -0x621024, 0x14400009, 0x24040001, 0x3c027fff, -0x3442ffff, 0x628824, 0x3c010002, 0x350821, -0xac319070, 0x10000109, 0x2201021, 0x2821, -0xc0044cc, 0x27a60018, 0x24040001, 0x2821, -0xc0044cc, 0x27a60018, 0x24040001, 0x24050001, -0x27b1001a, 0xc0044cc, 0x2203021, 0x24040001, -0x24050001, 0xc0044cc, 0x2203021, 0x24040001, -0x24050004, 0x27b0001c, 0xc0044cc, 0x2003021, -0x24040001, 0x24050004, 0xc0044cc, 0x2003021, -0x24040001, 0x24050005, 0x27b0001e, 0xc0044cc, -0x2003021, 0x24040001, 0x24050005, 0xc0044cc, -0x2003021, 0x24040001, 0x24050010, 0xc0044cc, -0x27a60018, 0x24040001, 0x24050010, 0xc0044cc, -0x27a60018, 0x24040001, 0x2405000a, 0xc0044cc, -0x2203021, 0x24040001, 0x2405000a, 0xc0044cc, -0x2203021, 0x24040001, 0x24050001, 0xc0044cc, -0x27a60018, 0x24040001, 0x24050001, 0xc0044cc, -0x27a60018, 0x97a20018, 0x30420004, 0x10400058, -0x3c114000, 0x3c030001, 0x8c636fac, 0x24020005, -0x14620059, 0x24040001, 0x24050019, 0x27b00022, -0xc0044cc, 0x2003021, 0x24040001, 0x24050019, -0xc0044cc, 0x2003021, 0x97a20022, 0x30430700, -0x24020400, 0x10620027, 0x28620401, 0x1040000e, -0x24020200, 0x1062001f, 0x28620201, 0x10400005, -0x24020100, 0x5062001e, 0x3c130001, 0x1000001e, -0x3c020004, 0x24020300, 0x50620019, 0x3c130002, -0x10000019, 0x3c020004, 0x24020600, 0x1062000d, -0x28620601, 0x10400005, 0x24020500, 0x5062000b, -0x3c130002, 0x10000010, 0x3c020004, 0x24020700, -0x1462000d, 0x3c020004, 0x3c130004, 0x1000000a, -0x3c120008, 0x10000006, 0x3c130004, 0x10000005, -0x3c120008, 0x3c130001, 0x10000002, 0x3c120008, -0x3c120010, 0x3c020004, 0x12620017, 0x3c028000, -0x8f820054, 0x24100001, 0x3c010001, 0xac306e1c, -0x3c010001, 0xac306e18, 0x3c010001, 0xac306e24, -0x3c010001, 0xac306ea4, 0x3c010001, 0xac226fa8, -0x3c020001, 0x16620014, 0x2728825, 0x2021, -0x2821, 0xc004e0e, 0x34068000, 0x3c010001, -0x1000000d, 0xac306ea0, 0x2221025, 0x2531825, -0x3c010001, 0xac206ea0, 0x10000007, 0x438825, -0x3c110002, 0x2358821, 0x8e319070, 0x3c027fff, -0x3442ffff, 0x2228824, 0x3c020001, 0x8c426e28, -0x10400066, 0x1e1140, 0x3c020001, 0x8c426f98, -0x10400002, 0x3c022000, 0x2228825, 0x1e1140, -0x3c010002, 0x220821, 0x8c229084, 0x10400003, -0x3c020020, 0x10000004, 0x2228825, 0x3c02ffdf, -0x3442ffff, 0x2228824, 0x1e1140, 0x3c010002, -0x220821, 0x8c22908c, 0x10400003, 0x3c020080, -0x1000004d, 0x2228825, 0x3c02ff7f, 0x3442ffff, -0x10000049, 0x2228824, 0x1e2940, 0x3c030002, -0x651821, 0x8c639078, 0x3c024000, 0x621024, +0x8fa8002c, 0x81140, 0x3c010002, 0x220821, +0x8c22900c, 0x10400003, 0x3c020080, 0x1000004f, +0x2228825, 0x3c02ff7f, 0x3442ffff, 0x1000004b, +0x2228824, 0x8fa8002c, 0x82940, 0x3c030002, +0x651821, 0x8c638ff8, 0x3c024000, 0x621024, 0x14400008, 0x3c027fff, 0x3442ffff, 0x628824, -0x3c010002, 0x250821, 0xac319070, 0x1000003f, -0x2201021, 0x3c020001, 0x8c426e28, 0x10400033, -0x3c11c00c, 0x3c020001, 0x8c426ec4, 0x3c04c00c, -0x34842000, 0x3c030001, 0x8c636f98, 0x2102b, +0x3c010002, 0x250821, 0xac318ff0, 0x10000041, +0x2201021, 0x3c020001, 0x8c426da8, 0x10400034, +0x3c11c00c, 0x3c020001, 0x8c426e44, 0x3c04c00c, +0x34842000, 0x3c030001, 0x8c636f1c, 0x2102b, 0x21023, 0x441024, 0x10600003, 0x518825, 0x3c022000, 0x2228825, 0x3c020002, 0x451021, -0x8c429084, 0x10400003, 0x3c020020, 0x10000004, +0x8c429004, 0x10400003, 0x3c020020, 0x10000004, 0x2228825, 0x3c02ffdf, 0x3442ffff, 0x2228824, -0x1e1140, 0x3c010002, 0x220821, 0x8c22908c, -0x10400003, 0x3c020080, 0x10000004, 0x2228825, -0x3c02ff7f, 0x3442ffff, 0x2228824, 0x3c020001, -0x8c426eb0, 0x10400002, 0x3c020800, 0x2228825, -0x3c020001, 0x8c426eb4, 0x10400002, 0x3c020400, -0x2228825, 0x3c020001, 0x8c426eb8, 0x10400006, -0x3c020100, 0x10000004, 0x2228825, 0x3c027fff, -0x3442ffff, 0x628824, 0x1e1140, 0x3c010002, -0x220821, 0xac319070, 0x2201021, 0x8fbf0040, -0x8fbe003c, 0x8fb50038, 0x8fb30034, 0x8fb20030, -0x8fb1002c, 0x8fb00028, 0x3e00008, 0x27bd0048, -0x27bdffd0, 0xafb20028, 0x809021, 0xafbf002c, -0xafb10024, 0xafb00020, 0x8f840200, 0x3c100001, -0x8e106e18, 0x8f860220, 0x24020002, 0x1202005c, -0x2e020003, 0x10400005, 0x24020001, 0x1202000a, -0x121940, 0x1000010c, 0x0, 0x24020004, -0x120200bf, 0x24020008, 0x120200be, 0x128940, -0x10000105, 0x0, 0x3c050002, 0xa32821, -0x8ca5907c, 0x3c100002, 0x2038021, 0x8e109074, -0x3c024000, 0xa21024, 0x10400038, 0x3c020008, -0x2021024, 0x10400020, 0x34840002, 0x3c020002, -0x431021, 0x8c429080, 0x10400005, 0x34840020, -0x34840100, 0x3c020020, 0x10000006, 0x2028025, -0x2402feff, 0x822024, 0x3c02ffdf, 0x3442ffff, -0x2028024, 0x121140, 0x3c010002, 0x220821, -0x8c229088, 0x10400005, 0x3c020001, 0xc23025, -0x3c020080, 0x10000016, 0x2028025, 0x3c02fffe, -0x3442ffff, 0xc23024, 0x3c02ff7f, 0x3442ffff, -0x1000000f, 0x2028024, 0x2402fedf, 0x822024, -0x3c02fffe, 0x3442ffff, 0xc23024, 0x3c02ff5f, -0x3442ffff, 0x2028024, 0x3c010002, 0x230821, -0xac209080, 0x3c010002, 0x230821, 0xac209088, -0xaf840200, 0xaf860220, 0x8f820220, 0x34420002, -0xaf820220, 0x1000000a, 0x121140, 0x3c02bfff, -0x3442ffff, 0x8f830200, 0x2028024, 0x2402fffd, -0x621824, 0xc003d87, 0xaf830200, 0x121140, -0x3c010002, 0x220821, 0x100000b7, 0xac309074, -0x3c020001, 0x8c426f98, 0x10400069, 0x24050004, -0x24040001, 0xc0044cc, 0x27a60018, 0x24040001, -0x24050005, 0xc0044cc, 0x27a6001a, 0x97a30018, -0x97a2001a, 0x3c040001, 0x24846ec8, 0x30630c00, -0x31a82, 0x30420c00, 0x21282, 0xa7a2001a, -0x21080, 0x441021, 0x431021, 0xa7a30018, -0x90480000, 0x24020001, 0x3103ffff, 0x10620029, -0x28620002, 0x10400005, 0x0, 0x10600009, -0x0, 0x1000003d, 0x0, 0x10700013, -0x24020003, 0x1062002c, 0x0, 0x10000037, -0x0, 0x8f820200, 0x2403feff, 0x431024, -0xaf820200, 0x8f820220, 0x3c03fffe, 0x3463ffff, -0x431024, 0xaf820220, 0x3c010002, 0xac209084, -0x3c010002, 0x10000032, 0xac20908c, 0x8f820200, -0x34420100, 0xaf820200, 0x8f820220, 0x3c03fffe, -0x3463ffff, 0x431024, 0xaf820220, 0x24020100, -0x3c010002, 0xac229084, 0x3c010002, 0x10000024, -0xac20908c, 0x8f820200, 0x2403feff, 0x431024, -0xaf820200, 0x8f820220, 0x3c030001, 0x431025, -0xaf820220, 0x3c010002, 0xac209084, 0x3c010002, -0x10000017, 0xac23908c, 0x8f820200, 0x34420100, -0xaf820200, 0x8f820220, 0x3c030001, 0x431025, -0xaf820220, 0x24020100, 0x3c010002, 0xac229084, -0x3c010002, 0x1000000a, 0xac23908c, 0x3c040001, -0x24846d00, 0x97a6001a, 0x97a70018, 0x3c050001, -0x34a5ffff, 0xafa80010, 0xc002b17, 0xafa00014, -0x8f820200, 0x34420002, 0x1000004b, 0xaf820200, -0x128940, 0x3c050002, 0xb12821, 0x8ca59078, -0x3c100002, 0x2118021, 0x8e109070, 0x3c024000, -0xa21024, 0x14400010, 0x0, 0x3c020001, -0x8c426f98, 0x14400005, 0x3c02bfff, 0x8f820200, -0x34420002, 0xaf820200, 0x3c02bfff, 0x3442ffff, -0xc003d87, 0x2028024, 0x3c010002, 0x310821, -0x10000031, 0xac309070, 0x3c020001, 0x8c426f98, -0x10400005, 0x3c020020, 0x3c020001, 0x8c426ec4, -0x10400025, 0x3c020020, 0xa21024, 0x10400007, -0x34840020, 0x24020100, 0x3c010002, 0x310821, -0xac229084, 0x10000006, 0x34840100, 0x3c010002, -0x310821, 0xac209084, 0x2402feff, 0x822024, -0x3c020080, 0xa21024, 0x10400007, 0x121940, -0x3c020001, 0x3c010002, 0x230821, 0xac22908c, -0x10000008, 0xc23025, 0x121140, 0x3c010002, -0x220821, 0xac20908c, 0x3c02fffe, 0x3442ffff, -0xc23024, 0xaf840200, 0xaf860220, 0x8f820220, -0x34420002, 0xaf820220, 0x121140, 0x3c010002, -0x220821, 0xac309070, 0x8fbf002c, 0x8fb20028, -0x8fb10024, 0x8fb00020, 0x3e00008, 0x27bd0030, -0x0, 0x0, 0x0, 0x1821, +0x8fa8002c, 0x81140, 0x3c010002, 0x220821, +0x8c22900c, 0x10400003, 0x3c020080, 0x10000004, +0x2228825, 0x3c02ff7f, 0x3442ffff, 0x2228824, +0x3c020001, 0x8c426e30, 0x10400002, 0x3c020800, +0x2228825, 0x3c020001, 0x8c426e34, 0x10400002, +0x3c020400, 0x2228825, 0x3c020001, 0x8c426e38, +0x10400006, 0x3c020100, 0x10000004, 0x2228825, +0x3c027fff, 0x3442ffff, 0x628824, 0x8fa8002c, +0x81140, 0x3c010002, 0x220821, 0xac318ff0, +0x2201021, 0x8fbf0048, 0x8fbe0044, 0x8fb50040, +0x8fb3003c, 0x8fb20038, 0x8fb10034, 0x8fb00030, +0x3e00008, 0x27bd0050, 0x27bdffd0, 0xafb20028, +0x809021, 0xafbf002c, 0xafb10024, 0xafb00020, +0x8f840200, 0x3c100001, 0x8e106d98, 0x8f860220, +0x24020002, 0x1202005c, 0x2e020003, 0x10400005, +0x24020001, 0x1202000a, 0x121940, 0x1000010c, +0x0, 0x24020004, 0x120200bf, 0x24020008, +0x120200be, 0x128940, 0x10000105, 0x0, +0x3c050002, 0xa32821, 0x8ca58ffc, 0x3c100002, +0x2038021, 0x8e108ff4, 0x3c024000, 0xa21024, +0x10400038, 0x3c020008, 0x2021024, 0x10400020, +0x34840002, 0x3c020002, 0x431021, 0x8c429000, +0x10400005, 0x34840020, 0x34840100, 0x3c020020, +0x10000006, 0x2028025, 0x2402feff, 0x822024, +0x3c02ffdf, 0x3442ffff, 0x2028024, 0x121140, +0x3c010002, 0x220821, 0x8c229008, 0x10400005, +0x3c020001, 0xc23025, 0x3c020080, 0x10000016, +0x2028025, 0x3c02fffe, 0x3442ffff, 0xc23024, +0x3c02ff7f, 0x3442ffff, 0x1000000f, 0x2028024, +0x2402fedf, 0x822024, 0x3c02fffe, 0x3442ffff, +0xc23024, 0x3c02ff5f, 0x3442ffff, 0x2028024, +0x3c010002, 0x230821, 0xac209000, 0x3c010002, +0x230821, 0xac209008, 0xaf840200, 0xaf860220, +0x8f820220, 0x34420002, 0xaf820220, 0x1000000a, +0x121140, 0x3c02bfff, 0x3442ffff, 0x8f830200, +0x2028024, 0x2402fffd, 0x621824, 0xc003daf, +0xaf830200, 0x121140, 0x3c010002, 0x220821, +0x100000b7, 0xac308ff4, 0x3c020001, 0x8c426f1c, +0x10400069, 0x24050004, 0x24040001, 0xc00457c, +0x27a60018, 0x24040001, 0x24050005, 0xc00457c, +0x27a6001a, 0x97a30018, 0x97a2001a, 0x3c040001, +0x24846e48, 0x30630c00, 0x31a82, 0x30420c00, +0x21282, 0xa7a2001a, 0x21080, 0x441021, +0x431021, 0xa7a30018, 0x90480000, 0x24020001, +0x3103ffff, 0x10620029, 0x28620002, 0x10400005, +0x0, 0x10600009, 0x0, 0x1000003d, +0x0, 0x10700013, 0x24020003, 0x1062002c, +0x0, 0x10000037, 0x0, 0x8f820200, +0x2403feff, 0x431024, 0xaf820200, 0x8f820220, +0x3c03fffe, 0x3463ffff, 0x431024, 0xaf820220, +0x3c010002, 0xac209004, 0x3c010002, 0x10000032, +0xac20900c, 0x8f820200, 0x34420100, 0xaf820200, +0x8f820220, 0x3c03fffe, 0x3463ffff, 0x431024, +0xaf820220, 0x24020100, 0x3c010002, 0xac229004, +0x3c010002, 0x10000024, 0xac20900c, 0x8f820200, +0x2403feff, 0x431024, 0xaf820200, 0x8f820220, +0x3c030001, 0x431025, 0xaf820220, 0x3c010002, +0xac209004, 0x3c010002, 0x10000017, 0xac23900c, +0x8f820200, 0x34420100, 0xaf820200, 0x8f820220, +0x3c030001, 0x431025, 0xaf820220, 0x24020100, +0x3c010002, 0xac229004, 0x3c010002, 0x1000000a, +0xac23900c, 0x3c040001, 0x24846c80, 0x97a6001a, +0x97a70018, 0x3c050001, 0x34a5ffff, 0xafa80010, +0xc002b3b, 0xafa00014, 0x8f820200, 0x34420002, +0x1000004b, 0xaf820200, 0x128940, 0x3c050002, +0xb12821, 0x8ca58ff8, 0x3c100002, 0x2118021, +0x8e108ff0, 0x3c024000, 0xa21024, 0x14400010, +0x0, 0x3c020001, 0x8c426f1c, 0x14400005, +0x3c02bfff, 0x8f820200, 0x34420002, 0xaf820200, +0x3c02bfff, 0x3442ffff, 0xc003daf, 0x2028024, +0x3c010002, 0x310821, 0x10000031, 0xac308ff0, +0x3c020001, 0x8c426f1c, 0x10400005, 0x3c020020, +0x3c020001, 0x8c426e44, 0x10400025, 0x3c020020, +0xa21024, 0x10400007, 0x34840020, 0x24020100, +0x3c010002, 0x310821, 0xac229004, 0x10000006, +0x34840100, 0x3c010002, 0x310821, 0xac209004, +0x2402feff, 0x822024, 0x3c020080, 0xa21024, +0x10400007, 0x121940, 0x3c020001, 0x3c010002, +0x230821, 0xac22900c, 0x10000008, 0xc23025, +0x121140, 0x3c010002, 0x220821, 0xac20900c, +0x3c02fffe, 0x3442ffff, 0xc23024, 0xaf840200, +0xaf860220, 0x8f820220, 0x34420002, 0xaf820220, +0x121140, 0x3c010002, 0x220821, 0xac308ff0, +0x8fbf002c, 0x8fb20028, 0x8fb10024, 0x8fb00020, +0x3e00008, 0x27bd0030, 0x0, 0x1821, 0x308400ff, 0x2405ffdf, 0x2406ffbf, 0x641007, 0x30420001, 0x10400004, 0x0, 0x8f820044, 0x10000003, 0x34420040, 0x8f820044, 0x461024, @@ -9131,7 +9117,7 @@ 0x28620008, 0x5440ffee, 0x641007, 0x3e00008, 0x0, 0x2c820008, 0x1040001b, 0x0, 0x2405ffdf, 0x2406ffbf, 0x41880, 0x3c020001, -0x24426ee0, 0x621821, 0x24640004, 0x90620000, +0x24426e60, 0x621821, 0x24640004, 0x90620000, 0x10400004, 0x0, 0x8f820044, 0x10000003, 0x34420040, 0x8f820044, 0x461024, 0xaf820044, 0x8f820044, 0x34420020, 0xaf820044, 0x8f820044, @@ -9180,7 +9166,7 @@ 0x74460000, 0x4d516576, 0x505f4600, 0x5173436f, 0x6e495f46, 0x0, 0x5173436f, 0x6e734600, 0x51725072, 0x6f644600, 0x6261644d, 0x656d537a, -0x0, 0x68774677, 0x56657200, 0x62616448, +0x0, 0x68775665, 0x72000000, 0x62616448, 0x77566572, 0x0, 0x2a2a4441, 0x574e5f41, 0x0, 0x74785278, 0x4266537a, 0x0, 0x62664174, 0x6e4d726b, 0x0, 0x7265645a, @@ -9276,12 +9262,12 @@ 0x0, 0x3f636d64, 0x48737453, 0x0, 0x3f636d64, 0x4d634d64, 0x0, 0x3f636d64, 0x50726f6d, 0x0, 0x3f636d64, 0x4c696e6b, -0x0, 0x3f636d64, 0x45727200, 0x864c, -0x8de0, 0x8de0, 0x8d68, 0x8b0c, -0x8db4, 0x8de0, 0x8724, 0x8794, -0x8924, 0x89fc, 0x89c8, 0x8de0, -0x8804, 0x8ab8, 0x8de0, 0x8ac8, -0x8748, 0x87b8, 0x0, 0x0, +0x0, 0x3f636d64, 0x45727200, 0x86ac, +0x8e5c, 0x8e5c, 0x8de4, 0x8b78, +0x8e30, 0x8e5c, 0x8790, 0x8800, +0x8990, 0x8a68, 0x8a34, 0x8e5c, +0x8870, 0x8b24, 0x8e5c, 0x8b34, +0x87b4, 0x8824, 0x0, 0x0, 0x0, 0x24486561, 0x6465723a, 0x202f7072, 0x6f6a6563, 0x74732f72, 0x63732f73, 0x772f6765, 0x2f2e2f6e, 0x69632f66, 0x77322f63, 0x6f6d6d6f, @@ -9332,10 +9318,10 @@ 0x2e313220, 0x31393939, 0x2f30312f, 0x32302031, 0x393a3439, 0x3a353120, 0x73687561, 0x6e672045, 0x78702024, 0x0, 0x46575f56, 0x45525349, -0x4f4e3a20, 0x23312053, 0x61742044, 0x65632031, -0x31203136, 0x3a30353a, 0x30332050, 0x53542031, -0x39393900, 0x46575f43, 0x4f4d5049, 0x4c455f54, -0x494d453a, 0x2031363a, 0x30353a30, 0x33000000, +0x4f4e3a20, 0x23312046, 0x72692041, 0x70722037, +0x2031373a, 0x35373a35, 0x32205044, 0x54203230, +0x30300000, 0x46575f43, 0x4f4d5049, 0x4c455f54, +0x494d453a, 0x2031373a, 0x35373a35, 0x32000000, 0x46575f43, 0x4f4d5049, 0x4c455f42, 0x593a2064, 0x65767263, 0x73000000, 0x46575f43, 0x4f4d5049, 0x4c455f48, 0x4f53543a, 0x20636f6d, 0x70757465, @@ -9343,7 +9329,7 @@ 0x4f4d4149, 0x4e3a2065, 0x6e672e61, 0x6374656f, 0x6e2e636f, 0x6d000000, 0x46575f43, 0x4f4d5049, 0x4c45523a, 0x20676363, 0x20766572, 0x73696f6e, -0x20322e37, 0x2e320000, 0x0, 0x12040100, +0x20322e37, 0x2e320000, 0x0, 0x12041100, 0x0, 0x24486561, 0x6465723a, 0x202f7072, 0x6f6a6563, 0x74732f72, 0x63732f73, 0x772f6765, 0x2f2e2f6e, 0x69632f66, 0x77322f63, 0x6f6d6d6f, @@ -9411,31 +9397,32 @@ 0x6e495f46, 0x0, 0x5173436f, 0x6e734600, 0x51725072, 0x6f644600, 0x0, 0x0, 0x0, 0x50726f62, 0x65506879, 0x0, -0x6c6e6b41, 0x53535254, 0x0, 0x108d0, -0x10948, 0x10968, 0x109a4, 0x10ea8, -0x109d0, 0x10a0c, 0x10f3c, 0x10c18, -0x10ac0, 0x10ad8, 0x10b1c, 0x10b44, -0x10b64, 0x10b8c, 0x10f3c, 0x10c18, -0x10c50, 0x10c68, 0x10c98, 0x10cc0, -0x10ce0, 0x10d08, 0x0, 0x10e34, -0x10e60, 0x10e84, 0x10f3c, 0x10ea8, -0x109d0, 0x10ed8, 0x0, 0x0, -0x0, 0x115ac, 0x1167c, 0x11754, -0x11824, 0x11880, 0x1195c, 0x11984, -0x11a60, 0x11a88, 0x11c30, 0x11c58, -0x11e00, 0x11ff8, 0x1228c, 0x121a0, -0x1228c, 0x122b8, 0x11e28, 0x11fd0, -0x7273745f, 0x676d6969, 0x0, 0x12348, -0x12380, 0x12468, 0x13034, 0x135fc, -0x13614, 0x13c7c, 0x13cbc, 0x13d4c, -0x13d90, 0x13df4, 0x13e80, 0x13eb4, -0x13f3c, 0x13fd4, 0x140a4, 0x140e4, -0x14168, 0x1418c, 0x1429c, 0x646f4261, +0x6c6e6b41, 0x53535254, 0x0, 0x109a4, +0x10a1c, 0x10a50, 0x10a7c, 0x11050, +0x10aa8, 0x10b10, 0x111fc, 0x10dc0, +0x10c68, 0x10c80, 0x10cc4, 0x10cec, +0x10d0c, 0x10d34, 0x111fc, 0x10dc0, +0x10df8, 0x10e10, 0x10e40, 0x10e68, +0x10e88, 0x10eb0, 0x0, 0x10fdc, +0x11008, 0x1102c, 0x111fc, 0x11050, +0x11078, 0x11108, 0x0, 0x0, +0x0, 0x1186c, 0x1193c, 0x11a14, +0x11ae4, 0x11b40, 0x11c1c, 0x11c44, +0x11d20, 0x11d48, 0x11ef0, 0x11f18, +0x120c0, 0x122b8, 0x1254c, 0x12460, +0x1254c, 0x12578, 0x120e8, 0x12290, +0x7273745f, 0x676d6969, 0x0, 0x12608, +0x12640, 0x12728, 0x13374, 0x133b4, +0x133cc, 0x7365746c, 0x6f6f7000, 0x0, +0x0, 0x13bbc, 0x13bfc, 0x13c8c, +0x13cd0, 0x13d34, 0x13dc0, 0x13df4, +0x13e7c, 0x13f14, 0x13fe4, 0x14024, +0x140a8, 0x140cc, 0x141dc, 0x646f4261, 0x73655067, 0x0, 0x0, 0x0, 0x0, 0x73746d61, 0x634c4e4b, 0x0, -0x6765746d, 0x636c6e6b, 0x0, 0x14fb4, -0x14fb4, 0x14ce4, 0x14d34, 0x14d78, -0x14fb4, 0x7365746d, 0x61636163, 0x74000000, +0x6765746d, 0x636c6e6b, 0x0, 0x14ed8, +0x14ed8, 0x14b8c, 0x14bd8, 0x14c24, +0x14ed8, 0x7365746d, 0x61636163, 0x74000000, 0x0, 0x0 }; u32 tigon2FwData[(MAX_DATA_LEN/4) + 1] __initdata = { 0x1, Index: oldkernel/linux/drivers/net/dgrs.c diff -u linux/drivers/net/dgrs.c:1.1.1.1 linux/drivers/net/dgrs.c:1.2 --- linux/drivers/net/dgrs.c:1.1.1.1 Wed May 31 12:33:50 2000 +++ linux/drivers/net/dgrs.c Fri Jul 7 15:36:43 2000 @@ -861,6 +861,8 @@ return -EFAULT; return (0); case DGRS_SETFILTER: + if (!suser()) + return -EPERM; if (ioc.port > privN->bcomm->bc_nports) return -EINVAL; if (ioc.filter >= NFILTERS) @@ -1197,8 +1199,11 @@ priv->intrcnt = 0; for (i = jiffies + 2*HZ + HZ/2; time_after(i, jiffies); ) + { + rmb(); /* gcc 2.95 needs this */ if (priv->intrcnt >= 2) break; + } if (priv->intrcnt < 2) { printk("%s: Not interrupting on IRQ %d (%d)\n", Index: oldkernel/linux/drivers/net/eepro100.c diff -u linux/drivers/net/eepro100.c:1.5 linux/drivers/net/eepro100.c:1.6 --- linux/drivers/net/eepro100.c:1.5 Thu Jun 1 17:15:50 2000 +++ linux/drivers/net/eepro100.c Fri Jul 7 15:36:43 2000 @@ -24,11 +24,24 @@ The driver also contains updates by different kernel developers. This driver clone is maintained by Andrey V. Savochkin . Please use this email address and linux-kernel mailing list for bug reports. + + Modification history: + + 2000 May 9 Dragan Stancevic + Added the ability to change the driver debug + level on the fly. + + 2000 May 4 Dragan Stancevic + Added more detailed device recognition. + + 2000 Mar 24 Dragan Stancevic + Disabled FC and ER, to avoid lockups when when we get FCP interrupts. + Dragan Stancevic March 24th, 2000. */ static const char *version = "eepro100.c:v1.09j-t 9/29/99 Donald Becker http://cesdis.gsfc.nasa.gov/linux/drivers/eepro100.html\n" -"eepro100.c: $Revision: 1.1.2.1 $ 2000/03/02 Modified by Andrey V. Savochkin and others\n"; +"eepro100.c: $Revision: 1.20.2.5 $ 2000/03/28 Modified by Andrey V. Savochkin and others\n"; /* A few user-configurable values that apply to all boards. First set is undocumented and spelled per Intel recommendations. */ @@ -103,17 +116,8 @@ #include #include #include -#ifdef HAS_PCI_NETIF -#include "pci-netif.h" -#else #include -#endif -#include -#if LINUX_VERSION_CODE >= 0x20312 -#include -#else #include -#endif #include #include @@ -144,21 +148,18 @@ #define virt_to_le32desc(addr) cpu_to_le32(virt_to_bus(addr)) #define le32desc_to_virt(addr) bus_to_virt(le32_to_cpu(addr)) -#if LINUX_VERSION_CODE < 0x020314 #define net_device device #define pci_base_address(p, n) (p)->base_address[n] -#else -#define pci_base_address(p, n) (p)->resource[n].start -#endif #define dev_free_skb(skb) dev_kfree_skb(skb); -#if ! defined(HAS_NETIF_QUEUE) #define netif_wake_queue(dev) do { \ clear_bit(0, (void*)&dev->tbusy); \ mark_bh(NET_BH); \ } while(0) #define netif_start_queue(dev) clear_bit(0, (void*)&dev->tbusy) #define netif_stop_queue(dev) set_bit(0, (void*)&dev->tbusy) +#ifndef PCI_DEVICE_ID_INTEL_82559ER +#define PCI_DEVICE_ID_INTEL_82559ER 0x1209 #endif /* The total I/O port extent of the board. @@ -282,7 +283,8 @@ */ /* This table drives the PCI probe routines. */ -static struct net_device *speedo_found1(int pci_bus, int pci_devfn, long ioaddr, int irq, int chip_idx, int fnd_cnt); +static struct net_device *speedo_found1(int pci_bus, int pci_devfn, + long ioaddr, int irq, int chip_idx, int fnd_cnt, int dev_id, unsigned char rev_id); #ifdef USE_IO #define SPEEDO_IOTYPE PCI_USES_MASTER|PCI_USES_IO|PCI_ADDR1 @@ -308,7 +310,8 @@ const char *name; u16 vendor_id, device_id, device_id_mask, flags; int io_size; - struct net_device *(*probe1)(int pci_bus, int pci_devfn, long ioaddr, int irq, int chip_idx, int fnd_cnt); + struct net_device *(*probe1)(int pci_bus, int pci_devfn, long ioaddr, + int irq, int chip_idx, int fnd_cnt, int dev_id, unsigned char rev_id); } static pci_tbl[] = { { "Intel PCI EtherExpress Pro100", 0x8086, 0x1229, 0xffff, PCI_USES_IO|PCI_USES_MASTER, 32, speedo_found1 }, @@ -316,21 +319,6 @@ }; #endif -struct eepro_revision_info { - const char *name; - unsigned char revision; -} static eepro_revisions [] = { - { "82557 (A-Step)", 0x1}, - { "82557 (B-Step)", 0x2}, - { "82557 (C-Step)", 0x3}, - { "82558 (A-Step)", 0x4}, - { "82558 (B-Step)", 0x5}, - { "82559 (A-Step)", 0x6}, - { "82559 (B-Step)", 0x7}, - { "82559 (C-Step)", 0x8}, - { "82559ER (A-Step)", 0x9}, -}; - #ifndef USE_IO #undef inb #undef inw @@ -350,7 +338,7 @@ Typically this takes 0 ticks. */ static inline void wait_for_cmd_done(long cmd_ioaddr) { - int wait = 100; + int wait = 1000; do ; while(inb(cmd_ioaddr) && --wait >= 0); } @@ -381,7 +369,7 @@ #if defined(__LITTLE_ENDIAN) #define clear_suspend(cmd) ((__u16 *)&(cmd)->cmd_status)[1] &= ~0x4000 #elif defined(__BIG_ENDIAN) -#define clear_suspend(cmd) ((__u16 *)&(cmd)->cmd_status)[0] &= ~0x4000 +#define clear_suspend(cmd) ((__u16 *)&(cmd)->cmd_status)[1] &= ~0x0040 #else #error Unsupported byteorder #endif @@ -521,7 +509,7 @@ const char i82558_config_cmd[22] = { 22, 0x08, 0, 1, 0, 0, 0x22, 0x03, 1, /* 1=Use MII 0=Use AUI */ 0, 0x2E, 0, 0x60, 0x08, 0x88, - 0x68, 0, 0x40, 0xf2, 0xBD, /* 0xBD->0xFD=Force full-duplex */ + 0x68, 0, 0x40, 0xf2, 0x84, /* Disable FC */ 0x31, 0x05, }; /* PHY media interface chips. */ @@ -535,6 +523,13 @@ static const char is_mii[] = { 0, 1, 1, 0, 1, 1, 0, 1 }; #define EE_READ_CMD (6) +/* Device specific Revision IDs */ +#define REV_ID_82558_A 0x4 +#define REV_ID_82558_B 0x5 +#define REV_ID_82559_B 0x8 +#define REV_ID_82559_C 0x9 + + static int do_eeprom_cmd(long ioaddr, int cmd, int cmd_len); static int mdio_read(long ioaddr, int phy_id, int location); static int mdio_write(long ioaddr, int phy_id, int location, int value); @@ -576,7 +571,7 @@ return cards_found; for (; pci_index < 8; pci_index++) { - unsigned char pci_bus, pci_device_fn, pci_latency; + unsigned char pci_bus, pci_device_fn, pci_latency, rev_id; unsigned long pciaddr; long ioaddr; int irq; @@ -607,9 +602,22 @@ pciaddr); continue; } - if (speedo_debug > 2) - printk("Found Intel i82557 PCI Speedo at I/O %#lx, IRQ %d.\n", - ioaddr, irq); + /* Read the device revision ID */ + pcibios_read_config_byte(pci_bus, pci_device_fn, + PCI_REVISION_ID, &rev_id); + + /* Display device version */ + if (speedo_debug > 2){ + printk("Found Intel i"); + if(rev_id < REV_ID_82558_A) + printk("82557"); + else if(rev_id < REV_ID_82559_B) + printk("82558"); + else if(rev_id >= REV_ID_82559_B) + printk("82559"); + printk(" PCI Speedo at I/O %#lx, IRQ %d, Rev. ID 0x%x.\n", + ioaddr, irq, rev_id); + } /* Get and check the bus-master and latency values. */ pcibios_read_config_word(pci_bus, pci_device_fn, @@ -632,12 +640,13 @@ } else if (speedo_debug > 1) printk(" PCI latency timer (CFLT) is %#x.\n", pci_latency); - if (speedo_found1(pci_bus, pci_device_fn, ioaddr, irq, 0, cards_found)) + if (speedo_found1(pci_bus, pci_device_fn, ioaddr, irq, 0, cards_found, + PCI_DEVICE_ID_INTEL_82557, rev_id)) cards_found++; } for (; pci_index < 8; pci_index++) { - unsigned char pci_bus, pci_device_fn, pci_latency; + unsigned char pci_bus, pci_device_fn, pci_latency, rev_id; long ioaddr; int irq; @@ -655,10 +664,16 @@ } /* Remove I/O space marker in bit 0. */ ioaddr &= ~3; + + /* Read the device revision ID */ + pcibios_read_config_byte(pci_bus, pci_device_fn, + PCI_REVISION_ID, &rev_id); + + /* Display device version */ if (speedo_debug > 2) - printk("Found Intel i82559ER PCI Speedo at I/O %#lx, IRQ %d.\n", - ioaddr, irq); - + printk("Found Intel i82559ER PCI Speedo at I/O %#lx, IRQ %d," + " Rev. ID 0x%x.\n", ioaddr, irq, rev_id); + /* Get and check the bus-master and latency values. */ pcibios_read_config_word(pci_bus, pci_device_fn, PCI_COMMAND, &pci_command); @@ -680,7 +695,8 @@ } else if (speedo_debug > 1) printk(" PCI latency timer (CFLT) is %#x.\n", pci_latency); - if(speedo_found1(pci_bus, pci_device_fn, ioaddr, irq, 0, cards_found)) + if(speedo_found1(pci_bus, pci_device_fn, ioaddr, irq, 0, cards_found, + PCI_DEVICE_ID_INTEL_82559ER, rev_id)) cards_found++; } @@ -689,21 +705,20 @@ #endif static struct net_device *speedo_found1(int pci_bus, int pci_devfn, - long ioaddr, int irq, int chip_idx, int card_idx) + long ioaddr, int irq, int chip_idx, int card_idx, int dev_id, unsigned char rev_id) { struct net_device *dev; struct speedo_private *sp; - const char *product; + char *product; int i, option; u16 eeprom[0x100]; int acpi_idle_state = 0; - unsigned char revision; #ifndef MODULE static int did_version = 0; /* Already printed version info. */ if (speedo_debug > 0 && did_version++ == 0) printk(version); #endif - + product = kmalloc(33, GFP_KERNEL); dev = init_etherdev(NULL, sizeof(struct speedo_private)); if (dev->mem_start > 0) @@ -758,33 +773,51 @@ action. */ outl(PortReset, ioaddr + SCBPort); - if (eeprom[3] & 0x0100) - product = "OEM i82557/i82558 10/100 Ethernet"; - else - product = pci_tbl[chip_idx].name; + /* Device is an OEM */ + if (eeprom[3] & 0x0100){ + if(dev_id == PCI_DEVICE_ID_INTEL_82559ER){ + sprintf(product, "OEM Ethernet (82559ER)" + " Rev:%x", rev_id); + } else { + char temp[6]; + + if(rev_id < REV_ID_82558_A) + strcpy(temp,"82557"); + else if(rev_id < REV_ID_82559_B) + strcpy(temp, "82558"); + else if(rev_id >= REV_ID_82559_B) + strcpy(temp, "82559"); + sprintf(product, "OEM Ethernet (%s)" + " Rev:%x", temp, rev_id); + } + + /* It's an Intel device */ + } else { + if(dev_id == PCI_DEVICE_ID_INTEL_82559ER){ + sprintf(product, "Intel EEPro 100 (82559ER)" + " Rev:%x", rev_id); + } else { + char temp[6]; + + if(rev_id < REV_ID_82558_A) + strcpy(temp,"82557"); + else if(rev_id < REV_ID_82559_B) + strcpy(temp, "82558"); + else if(rev_id >= REV_ID_82559_B) + strcpy(temp, "82559"); + sprintf(product, "Intel EEPro 100 (%s)" + " Rev:%x", temp, rev_id); + } + + } - printk(KERN_INFO "%s: %s at %#3lx, ", dev->name, product, ioaddr); + printk(KERN_INFO "%s: PCI %s at %#3lx, ", dev->name, + product, ioaddr); for (i = 0; i < 5; i++) printk("%2.2X:", dev->dev_addr[i]); printk("%2.2X, IRQ %d.\n", dev->dev_addr[i], irq); - /* Get the chip revision. */ - pcibios_read_config_byte(pci_bus, pci_devfn, - PCI_REVISION_ID, &revision); - for (i = 0; - i < sizeof (eepro_revisions) / sizeof (eepro_revisions [0]); - i++) { - if (eepro_revisions [i].revision == revision) - break; - } - if (i < sizeof (eepro_revisions) / sizeof (eepro_revisions [0])) - printk(KERN_INFO " %s LAN controller\n", - eepro_revisions [i].name); - else - printk(KERN_INFO " Pro100 (0x%x) LAN controller\n", - revision); - #if 1 || defined(kernel_bloat) /* OK, this is pure kernel bloat. I don't like it when other drivers waste non-pageable kernel space to emit similar messages, but I need @@ -861,7 +894,7 @@ #endif /* We do a request_region() only to register /proc/ioports info. */ - request_region(ioaddr, SPEEDO3_TOTAL_SIZE, "Intel Speedo3 Ethernet"); + request_region(ioaddr, SPEEDO3_TOTAL_SIZE, product); dev->base_addr = ioaddr; dev->irq = irq; @@ -876,6 +909,7 @@ sp->next_module = root_speedo_dev; root_speedo_dev = dev; + sp->product_name = product; sp->pci_bus = pci_bus; sp->pci_devfn = pci_devfn; sp->chip_id = chip_idx; @@ -1046,7 +1080,7 @@ sp->advertising = mdio_read(ioaddr, sp->phy[0] & 0x1f, 4); if (speedo_debug > 2) { - printk(KERN_DEBUG "%s: Done speedo_open(), status %4.4x.\n", + printk(KERN_DEBUG "%s: Done speedo_open(), status %8.8x.\n", dev->name, inw(ioaddr + SCBStatus)); } @@ -1122,7 +1156,9 @@ wait_for_cmd_done(ioaddr + SCBCmd); outl(virt_to_bus(&sp->tx_ring[sp->dirty_tx % TX_RING_SIZE]), ioaddr + SCBPointer); - outw(CUStart, ioaddr + SCBCmd); + /* We are not ACK-ing FCP and ER in the interrupt handler yet so they should + remain masked --Dragan */ + outw(CUStart | SCBMaskEarlyRx | SCBMaskFlowCtl, ioaddr + SCBCmd); } /* Media monitoring and control. */ @@ -1221,7 +1257,6 @@ int i; sp->cur_rx = 0; - sp->rx_ring_state = 0; for (i = 0; i < RX_RING_SIZE; i++) { struct sk_buff *skb; @@ -1520,13 +1555,15 @@ do { status = inw(ioaddr + SCBStatus); /* Acknowledge all of the current interrupt sources ASAP. */ - outw(status & 0xfd00, ioaddr + SCBStatus); + /* Will change from 0xfc00 to 0xff00 when we start handling + FCP and ER interrupts --Dragan */ + outw(status & 0xfc00, ioaddr + SCBStatus); if (speedo_debug > 4) printk(KERN_DEBUG "%s: interrupt status=%#4.4x.\n", dev->name, status); - if ((status & 0xfd00) == 0) + if ((status & 0xfc00) == 0) break; /* Always check if all rx buffers are allocated. --SAW */ @@ -1541,9 +1578,9 @@ spin_lock(&sp->lock); if ((status & 0x003c) == 0x0028) { /* No more Rx buffers. */ struct RxFD *rxf; - printk(KERN_WARNING "%s: card reports no RX buffers, status=%#4.4x, flow control=%s.\n", - dev->name, status, - sp->flow_ctrl ? "on" : "off"); + if (speedo_debug > 2) + printk(KERN_WARNING "%s: card reports no RX buffers.\n", + dev->name); rxf = sp->rx_ringp[sp->cur_rx % RX_RING_SIZE]; if (rxf == NULL) { if (speedo_debug > 2) @@ -1561,9 +1598,9 @@ outb(RxResumeNoResources, ioaddr + SCBCmd); } else if ((status & 0x003c) == 0x0008) { /* No resources. */ struct RxFD *rxf; - printk(KERN_WARNING "%s: card reports no resources, status=%#4.4x, flow control=%s.\n", - dev->name, status, - sp->flow_ctrl ? "on" : "off"); + if (speedo_debug > 1) + printk(KERN_WARNING "%s: card reports no resources.\n", + dev->name); rxf = sp->rx_ringp[sp->cur_rx % RX_RING_SIZE]; if (rxf == NULL) { if (speedo_debug > 2) @@ -1621,7 +1658,9 @@ printk(KERN_ERR "%s: Too much work at interrupt, status=0x%4.4x.\n", dev->name, status); /* Clear all interrupt sources. */ - outw(0xfd00, ioaddr + SCBStatus); + /* Will change from 0xfc00 to 0xff00 when we start handling + FCP and ER interrupts --Dragan */ + outl(0xfc00, ioaddr + SCBStatus); break; } } while (1); @@ -1961,6 +2000,13 @@ mdio_write(ioaddr, data[0], data[1], data[2]); #endif return 0; + + case SIOCDEVPRIVATE+5: /* Change the debug level of the driver */ + speedo_debug = *(int *)rq->ifr_data; + printk(KERN_DEBUG "%s: set debug level to [%d].\n", + dev->name, speedo_debug); + return 0; + default: return -EOPNOTSUPP; } @@ -2022,16 +2068,10 @@ config_cmd_data[4] = rxdmacount; config_cmd_data[5] = txdmacount + 0x80; config_cmd_data[15] |= (new_rx_mode & 2) ? 1 : 0; - if (sp->flow_ctrl) { - config_cmd_data[16] = 0x1f; - config_cmd_data[17] = 0x01; - config_cmd_data[19] = 0xb8; - } - else { - config_cmd_data[16] = 0; - config_cmd_data[17] = 0x40; - config_cmd_data[19] = 0x84; - } + /* 0x80 doesn't disable FC 0x84 does. + Disable Flow control since we are not ACK-ing any FC interrupts + for now. --Dragan */ + config_cmd_data[19] = 0x84; config_cmd_data[19] |= sp->full_duplex ? 0x40 : 0; config_cmd_data[21] = (new_rx_mode & 1) ? 0x0D : 0x05; if (sp->phy[0] & 0x8000) { /* Use the AUI port instead. */ @@ -2212,6 +2252,7 @@ next_dev = sp->next_module; if (sp->priv_addr) kfree(sp->priv_addr); + kfree(sp->product_name); kfree(root_speedo_dev); root_speedo_dev = next_dev; } Index: oldkernel/linux/drivers/net/plip.c diff -u linux/drivers/net/plip.c:1.2 linux/drivers/net/plip.c:1.3 --- linux/drivers/net/plip.c:1.2 Thu Jun 1 15:38:25 2000 +++ linux/drivers/net/plip.c Fri Jul 7 15:36:43 2000 @@ -1198,6 +1198,8 @@ pc->nibble = nl->nibble; break; case PLIP_SET_TIMEOUT: + if(!capable(CAP_NET_ADMIN)) + return -EPERM; nl->trigger = pc->trigger; nl->nibble = pc->nibble; break; Index: oldkernel/linux/drivers/net/rcpci45.c diff -u linux/drivers/net/rcpci45.c:1.1.1.1 linux/drivers/net/rcpci45.c:1.2 --- linux/drivers/net/rcpci45.c:1.1.1.1 Wed May 31 12:33:50 2000 +++ linux/drivers/net/rcpci45.c Fri Jul 7 15:36:43 2000 @@ -1152,6 +1152,9 @@ printk("RCioctl: cmd = 0x%x\n", cmd); #endif + if(!capable(CAP_NET_ADMIN)) + return -EPERM; + switch (cmd) { case RCU_PROTOCOL_REV: @@ -1165,17 +1168,8 @@ case RCU_COMMAND: { -#ifdef LINUX_2_1 if(copy_from_user(&RCuser, rq->ifr_data, sizeof(RCuser))) return -EFAULT; -#else - int error; - error=verify_area(VERIFY_WRITE, rq->ifr_data, sizeof(RCuser)); - if (error) { - return error; - } - memcpy_fromfs(&RCuser, rq->ifr_data, sizeof(RCuser)); -#endif #ifdef RCDEBUG printk("RCioctl: RCuser_cmd = 0x%x\n", RCuser.cmd); @@ -1284,11 +1278,8 @@ RCUD_DEFAULT -> rc = 0x11223344; break; } -#ifdef LINUX_2_1 - copy_to_user(rq->ifr_data, &RCuser, sizeof(RCuser)); -#else - memcpy_tofs(rq->ifr_data, &RCuser, sizeof(RCuser)); -#endif + if(copy_to_user(rq->ifr_data, &RCuser, sizeof(RCuser))) + return -EFAULT; break; } /* RCU_COMMAND */ Index: oldkernel/linux/drivers/net/sbni.c diff -u linux/drivers/net/sbni.c:1.1.1.1 linux/drivers/net/sbni.c:1.2 --- linux/drivers/net/sbni.c:1.1.1.1 Wed May 31 12:33:50 2000 +++ linux/drivers/net/sbni.c Fri Jul 7 15:36:43 2000 @@ -1223,6 +1223,8 @@ } case SIOCDEVRESINSTATS: { + if(!capable(CAP_NET_ADMIN)) + return -EPERM; DP( printk("%s: SIOCDEVRESINSTATS\n",dev->name); ) lp->in_stats.all_rx_number = 0; lp->in_stats.bad_rx_number = 0; Index: oldkernel/linux/drivers/net/hamradio/baycom_epp.c diff -u linux/drivers/net/hamradio/baycom_epp.c:1.1.1.1 linux/drivers/net/hamradio/baycom_epp.c:1.2 --- linux/drivers/net/hamradio/baycom_epp.c:1.1.1.1 Wed May 31 12:33:50 2000 +++ linux/drivers/net/hamradio/baycom_epp.c Fri Jul 7 15:36:43 2000 @@ -1308,6 +1308,8 @@ break; case HDLCDRVCTL_CALIBRATE: + if (!suser()) + return -EACCES; bc->hdlctx.calibrate = hi.data.calibrate * bc->bitrate / 8; return 0; Index: oldkernel/linux/drivers/net/hamradio/hdlcdrv.c diff -u linux/drivers/net/hamradio/hdlcdrv.c:1.1.1.1 linux/drivers/net/hamradio/hdlcdrv.c:1.2 --- linux/drivers/net/hamradio/hdlcdrv.c:1.1.1.1 Wed May 31 12:33:50 2000 +++ linux/drivers/net/hamradio/hdlcdrv.c Fri Jul 7 15:36:43 2000 @@ -701,6 +701,8 @@ break; case HDLCDRVCTL_CALIBRATE: + if(!suser()) + return -EPERM; s->hdlctx.calibrate = bi.data.calibrate * s->par.bitrate / 16; return 0; Index: oldkernel/linux/drivers/pci/oldproc.c diff -u linux/drivers/pci/oldproc.c:1.3 linux/drivers/pci/oldproc.c:1.4 --- linux/drivers/pci/oldproc.c:1.3 Thu Jun 1 14:11:18 2000 +++ linux/drivers/pci/oldproc.c Fri Jul 7 15:36:43 2000 @@ -1,5 +1,5 @@ /* - * $Id: oldproc.c,v 1.2 2000/05/31 21:56:52 ccr Exp $ + * $Id: oldproc.c,v 1.24 1998/10/11 15:13:04 mj Exp $ * * Backward-compatible procfs interface for PCI. * @@ -224,9 +224,11 @@ DEVICE( X, X_AGX016, "ITT AGX016"), DEVICE( PICOP, PICOP_PT86C52X, "PT86C52x Vesuvius"), DEVICE( PICOP, PICOP_PT80C524, "PT80C524 Nile"), - DEVICE( MYLEX, MYLEX_DAC960P_V2,"DAC960P V2"), - DEVICE( MYLEX, MYLEX_DAC960P_V3,"DAC960P V3"), - DEVICE( MYLEX, MYLEX_DAC960P_V4,"DAC960P V4"), + DEVICE( MYLEX, MYLEX_DAC960_P, "DAC960 P Series"), + DEVICE( MYLEX, MYLEX_DAC960_PD,"DAC960 PD Series"), + DEVICE( MYLEX, MYLEX_DAC960_PG,"DAC960 PG Series"), + DEVICE( MYLEX, MYLEX_DAC960_LP,"DAC960 LP Series"), + DEVICE( MYLEX, MYLEX_DAC960_BA,"DAC960 BA Series"), DEVICE( APPLE, APPLE_BANDIT, "Bandit"), DEVICE( APPLE, APPLE_GC, "Grand Central"), DEVICE( APPLE, APPLE_HYDRA, "Hydra"), @@ -518,6 +520,7 @@ DEVICE( INTEL, INTEL_82430, "82430ZX Aries"), DEVICE( INTEL, INTEL_82434, "82434LX Mercury/Neptune"), DEVICE( INTEL, INTEL_I960, "i960"), + DEVICE( INTEL, INTEL_I960RN, "i960 RN"), DEVICE( INTEL, INTEL_82092AA_0,"82092AA PCMCIA bridge"), DEVICE( INTEL, INTEL_82092AA_1,"82092AA EIDE"), DEVICE( INTEL, INTEL_7116, "SAA7116"), Index: oldkernel/linux/drivers/pci/pci.c diff -u linux/drivers/pci/pci.c:1.2 linux/drivers/pci/pci.c:1.3 --- linux/drivers/pci/pci.c:1.2 Thu Jun 1 14:11:18 2000 +++ linux/drivers/pci/pci.c Fri Jul 7 15:36:43 2000 @@ -1,5 +1,5 @@ /* - * $Id: pci.c,v 1.1.1.1 2000/05/31 19:33:52 ccr Exp $ + * $Id: pci.c,v 1.91 1999/01/21 13:34:01 davem Exp $ * * PCI Bus Services, see include/linux/pci.h for further explanation. * Index: oldkernel/linux/drivers/sbus/char/sab82532.c diff -u linux/drivers/sbus/char/sab82532.c:1.1.1.1 linux/drivers/sbus/char/sab82532.c:1.2 --- linux/drivers/sbus/char/sab82532.c:1.1.1.1 Wed May 31 12:33:52 2000 +++ linux/drivers/sbus/char/sab82532.c Fri Jul 7 15:36:43 2000 @@ -2063,7 +2063,7 @@ done: if (off >= len+begin) return 0; - *start = page + (begin-off); + *start = page + (off-begin); return ((count < begin+len-off) ? count : begin+len-off); } Index: oldkernel/linux/drivers/sbus/char/su.c diff -u linux/drivers/sbus/char/su.c:1.1.1.1 linux/drivers/sbus/char/su.c:1.2 --- linux/drivers/sbus/char/su.c:1.1.1.1 Wed May 31 12:33:52 2000 +++ linux/drivers/sbus/char/su.c Fri Jul 7 15:36:43 2000 @@ -2205,7 +2205,7 @@ done: if (off >= len+begin) return 0; - *start = page + (begin-off); + *start = page + (off-begin); return ((count < begin+len-off) ? count : begin+len-off); } Index: oldkernel/linux/drivers/sbus/char/sunkbd.c diff -u linux/drivers/sbus/char/sunkbd.c:1.2 linux/drivers/sbus/char/sunkbd.c:1.3 --- linux/drivers/sbus/char/sunkbd.c:1.2 Thu Jun 1 15:08:24 2000 +++ linux/drivers/sbus/char/sunkbd.c Fri Jul 7 15:36:43 2000 @@ -550,7 +550,7 @@ #ifdef CONFIG_MAGIC_SYSRQ /* Handle the SysRq hack */ if (l1a_state.l1_down) { - if (!up_flag) + if (!up_flag && sysrq_enabled) handle_sysrq(sun_sysrq_xlate[keycode], pt_regs, kbd, tty); goto out; } Index: oldkernel/linux/drivers/scsi/ChangeLog.ncr53c8xx diff -u linux/drivers/scsi/ChangeLog.ncr53c8xx:1.1.1.1 linux/drivers/scsi/ChangeLog.ncr53c8xx:1.2 --- linux/drivers/scsi/ChangeLog.ncr53c8xx:1.1.1.1 Wed May 31 12:33:51 2000 +++ linux/drivers/scsi/ChangeLog.ncr53c8xx Fri Jul 7 15:36:43 2000 @@ -1,12 +1,34 @@ -Wed Jul 21 1999 23:00 Gerard Roudier (groudier@club-internet.fr) - * revision 3.2a-2 - - merge of driver 3.2a-1 with linux-2.3.11-pre3 +Tue Jan 11 14:00 2000 Pam Delaney (pam.delaney@lsil.com) + * revision 3.31 + - Added support for mounting disks on wide-narrow-wide + scsi configurations. -Sun May 9 15:00 1999 Gerard Roudier (groudier@club-internet.fr) - * revision 3.2a-1 - - Fix the misdetection of SYM53C875E (was detected as a 876). - - Set the actual host ID used for each host in the scsi host data - structure. The mid-layer SCSI driver needs this information. +Mon Jan 10 13:30 2000 Pam Delaney (pam.delaney@lsil.com) + * revision 3.30 + - Added capability to use the integrity checking code + in the kernel (optional). + - Disabled support for the 53C1010. + +Sat Sep 11 18:00 1999 Gerard Roudier (groudier@club-internet.fr) + * revision 3.2c + - Handle correctly (hopefully) jiffies wrap-around. + - Restore the entry used to detect 875 until revision 0xff. + (I removed it inadvertently, it seems :) ) + - Replace __initfunc() which is deprecated stuff by __init which + is not yet so. ;-) + - Add support of some 'resource handling' for linux-2.3.13. + Basically the BARs have been changed to something more complex + in the pci_dev structure. + - Remove some deprecated code. + +Sat May 10 11:00 1999 Gerard Roudier (groudier@club-internet.fr) + * revision pre-3.2b-1 + - Support for the 53C895A by Pamela Delaney + The 53C895A contains all of the features of the 896 but has only + one channel and has a 32 bit PCI bus. It does 64 bit PCI addressing + using dual cycle PCI data transfers. + - Miscellaneous minor fixes. + - Some additions to the README.ncr53c8xx file. Sun Apr 11 10:00 1999 Gerard Roudier (groudier@club-internet.fr) * revision 3.2a Index: oldkernel/linux/drivers/scsi/ChangeLog.sym53c8xx diff -u linux/drivers/scsi/ChangeLog.sym53c8xx:1.1.1.1 linux/drivers/scsi/ChangeLog.sym53c8xx:1.2 --- linux/drivers/scsi/ChangeLog.sym53c8xx:1.1.1.1 Wed May 31 12:33:52 2000 +++ linux/drivers/scsi/ChangeLog.sym53c8xx Fri Jul 7 15:36:43 2000 @@ -1,23 +1,140 @@ -Sat Jul 24 12:00 1999 Gerard Roudier (groudier@club-internet.fr) - * version sym53c8xx-1.3g - - merge of driver 1.3f with linux-2.2.11-pre3 - - remove the broken testing of the chip being connected to SCSI - from the SCSI interrupt handling code. +Tue Jan 11 14:00 2000 Pam Delaney (pam.delaney@lsil.com) + * version sym53c8xx-1.61 + - Added support for mounting disks on wide-narrow-wide + scsi configurations. + - Modified offset to be a maximum of 31 in ST mode, + 62 in DT mode. -Sun May 9 15:00 1999 Gerard Roudier (groudier@club-internet.fr) - * version sym53c8xx-1.3f +Mon Jan 10 10:00 2000 Pam Delaney (pam.delaney@lsil.com) + * version sym53c8xx-1.60 + - Added capability to use the integrity checking code + in the kernel (optional). + - Added PPR negotiation. + - Added support for 53C1010 Ultra 3 part. + +Sun Oct 3 19:00 1999 Gerard Roudier (groudier@club-internet.fr) + * version sym53c8xx-1.5f + - Change the way the driver checks the PCI clock frequency, so + that overclocked PCI BUS up to 48 MHz will not be refused. + The more the BUS is overclocked, the less the driver will + guarantee that its measure of the SCSI clock is correct. + - Backport some minor improvements of SCRIPTS from the sym_hipd + driver. + - Backport the code rewrite of the START QUEUE dequeuing (on + bad scsi status received) from the sym_hipd driver. + +Sat Sep 11 11:00 1999 Gerard Roudier (groudier@club-internet.fr) + * version sym53c8xx-1.5e + - New linux-2.3.13 __setup scheme support added. + - Cleanup of the extended error status handling: + Use 1 bit per error type. + - Also save the extended error status prior to auto-sense. + - Add the FE_DIFF chip feature bit to indicate support of + diff probing from GPIO3 (825/825A/876/875). + - Remove the quirk handling that has been useless since day one. + - Work-around PCI chips being reported twice on some platforms. + - Add some redundant PCI reads in order to deal with common + bridge misbehaviour regarding posted write flushing. + - Add some other conditionnal code for people who have to deal + with really broken bridges (they will have to edit a source + file to try these options). + - Handle correctly (hopefully) jiffies wrap-around. + - Restore the entry used to detect 875 until revision 0xff. + (I removed it inadvertently, it seems :) ) + - Replace __initfunc() which is deprecated stuff by __init which + is not yet so. ;-) + - Rewrite the MESSAGE IN scripts more generic by using a MOVE + table indirect. Extended messages of any size are accepted now. + (Size is limited to 8 for now, but a constant is just to be + increased if necessary) + - Fix some bug in the fully untested MDP handling:) and share + some code between MDP handling and residual calculation. + - Calculate the data transfer residual as the 2's complement + integer (A positive value in returned on data overrun, and + a negative one on underrun). + - Add support of some 'resource handling' for linux-2.3.13. + Basically the BARs have been changed to something more complex + in the pci_dev structure. + - Remove some deprecated code. + +Sat Jun 5 11:00 1999 Gerard Roudier (groudier@club-internet.fr) + * version sym53c8xx-1.5c + - Donnot negotiate on auto-sense if we are currently using 8 bit + async transfer for the target. + - Only check for SISL/RAID on i386 platforms. + (A problem has been reported on PPC with that code). + - On MSG REJECT for a negotiation, the driver attempted to restart + the SCRIPT processor when this one was already running. + +Sat May 29 12:00 1999 Gerard Roudier (groudier@club-internet.fr) + * version sym53c8xx-1.5b + - Force negotiation prior auto-sense. + This ensures that the driver will be able to grab the sense data + from a device that has received a BUS DEVICE RESET message from + another initiator. + - Complete all disconnected CCBs for a logical UNIT if we are told + about a UNIT ATTENTION for a RESET condition by this target. + - Add the control command 'cleardev' that allows to send a ABORT + message to a logical UNIT (for test purpose). + +Tue May 25 23:00 1999 Gerard Roudier (groudier@club-internet.fr) + * version sym53c8xx-1.5a + - Add support for task abort and bus device reset SCSI message + and implement proper synchonisation with SCRIPTS to handle + correctly task abortion without races. + - Send an ABORT message (if untagged) or ABORT TAG message (if tagged) + when the driver is told to abort a command that is disconnected and + complete the command with appropriate error. + If the aborted command is not yet started, remove it from the start + queue and complete it with error. + - Add the control command 'resetdev' that allows to send a BUS + DEVICE RESET message to a target (for test purpose). + - Clean-up some unused or useless code. + +Fri May 21 23:00 1999 Gerard Roudier (groudier@club-internet.fr) + * version sym53c8xx-1.5 + - Add support for CHMOV with Wide controllers. + - Handling of the SWIDE (low byte residue at the end of a CHMOV + in DATA IN phase with WIDE transfer when the byte count gets odd). + - Handling of the IGNORE WIDE RESIDUE message. + Handled from SCRIPTS as possible with some optimizations when both + a wide device and the controller are odd at the same time (SWIDE + present and IGNORE WIDE RESIDUE message on the BUS at the same time). + - Check against data OVERRUN/UNDERRUN condition at the end of a data + transfer, whatever a SWIDE is present (OVERRUN in DATA IN phase) + or the SODL is full (UNDERRUN in DATA out phase). + - Handling of the MODIFY DATA POINTER message. + This one cannot be handled from SCRIPTS, but hopefully it will not + happen very often. :) + - Large rewrite of the SCSI MESSAGE handling. + +Sun May 9 11:00 1999 Gerard Roudier (groudier@club-internet.fr) + * version sym53c8xx-1.4 + - Support for IMMEDIATE ARBITRATION. + See the README file for detailed information about this feature. + Requires both a compile option and a boot option. + - Minor SCRIPTS optimization in reselection pattern for LUN 0. + - Simpler algorithm to deal with SCSI command starvation. + Just use 2 tag counters in flip/flop and switch to the other + one every 3 seconds. + - Do some work in SCRIPTS after the SELECT instruction and prior + to testing for a PHASE. SYMBIOS say this feature is working fine. + (Btw, only problems with Toshiba 3401B had been reported). + - Measure the PCI clock speed and donnot attach controllers if + result is greater than 37 MHz. Since the precision of the + algorithm (from Stefan Esser) is better than 2%, this should + be fine. - Fix the misdetection of SYM53C875E (was detected as a 876). - Fix the misdetection of SYM53C810 not A (was detected as a 810A). + - Support for up to 256 TAGS per LUN (CMD_PER_LUN). + Currently limited to 255 due to Linux limitation. :) + - Support for up to 508 active commands (CAN_QUEUE). - Support for the 53C895A by Pamela Delaney The 53C895A contains all of the features of the 896 but has only one channel and has a 32 bit PCI bus. It does 64 bit PCI addressing using dual cycle PCI data transfers. - - Call request_region() event if MMIO is used and not normal IO. - This allows sym and the ncr driver to be loaded in any order - without any risk of attaching the same device. - - Set the actual host ID used for each host in the scsi host data - structure. The mid-layer SCSI driver needs this information. - Miscellaneous minor fixes. + - Some additions to the README.ncr53c8xx file. Tue Apr 15 10:00 1999 Gerard Roudier (groudier@club-internet.fr) * version sym53c8xx-1.3e Index: oldkernel/linux/drivers/scsi/Config.in diff -u linux/drivers/scsi/Config.in:1.1.1.1 linux/drivers/scsi/Config.in:1.2 --- linux/drivers/scsi/Config.in:1.1.1.1 Wed May 31 12:33:51 2000 +++ linux/drivers/scsi/Config.in Fri Jul 7 15:36:43 2000 @@ -95,11 +95,13 @@ bool ' use normal IO' CONFIG_SCSI_NCR53C8XX_IOMAPPED if [ "$CONFIG_SCSI_SYM53C8XX" != "n" ]; then bool ' include support for the NCR PQS/PDS SCSI card' CONFIG_SCSI_NCR53C8XX_PQS_PDS + bool ' enable immediate arbitration' CONFIG_SCSI_NCR53C8XX_IARB fi if [ "$CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS" = "0" ]; then bool ' not allow targets to disconnect' CONFIG_SCSI_NCR53C8XX_NO_DISCONNECT fi if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then + bool ' perform integrity check' CONFIG_SCSI_NCR53C8XX_INTEGRITY_CHECK bool ' assume boards are SYMBIOS compatible' CONFIG_SCSI_NCR53C8XX_SYMBIOS_COMPAT fi fi Index: oldkernel/linux/drivers/scsi/README.ncr53c8xx diff -u linux/drivers/scsi/README.ncr53c8xx:1.1.1.1 linux/drivers/scsi/README.ncr53c8xx:1.2 --- linux/drivers/scsi/README.ncr53c8xx:1.1.1.1 Wed May 31 12:33:51 2000 +++ linux/drivers/scsi/README.ncr53c8xx Fri Jul 7 15:36:43 2000 @@ -1,10 +1,10 @@ -The Linux NCR53C8XX driver README file +The Linux NCR53C8XX/SYM53C8XX drivers README file Written by Gerard Roudier 21 Rue Carnot 95170 DEUIL LA BARRE - FRANCE -9 May 1999 +29 May 1999 =============================================================================== 1. Introduction @@ -25,14 +25,39 @@ 8.6 Clear profile counters 8.7 Set flag (no_disc) 8.8 Set verbose level + 8.9 Reset all logical units of a target + 8.10 Abort all tasks of all logical units of a target 9. Configuration parameters 10. Boot setup commands 10.1 Syntax 10.2 Available arguments + 10.2.1 Master parity checking + 10.2.2 Scsi parity checking + 10.2.3 Scsi disconnections + 10.2.4 Special features + 10.2.5 Ultra SCSI support + 10.2.6 Default number of tagged commands + 10.2.7 Default synchronous period factor + 10.2.8 Negotiate synchronous with all devices + 10.2.9 Verbosity level + 10.2.10 Debug mode + 10.2.11 Burst max + 10.2.12 LED support + 10.2.13 Max wide + 10.2.14 Differential mode + 10.2.15 IRQ mode + 10.2.16 Reverse probe + 10.2.17 Fix up PCI configuration space + 10.2.18 Serial NVRAM + 10.2.19 Check SCSI BUS + 10.2.20 Exclude a host from being attached + 10.2.21 Suggest a default SCSI id for hosts + 10.2.22 Enable use of IMMEDIATE ARBITRATION 10.3 Advised boot setup commands 10.4 PCI configuration fix-up boot option 10.5 Serial NVRAM support boot option 10.6 SCSI BUS checking boot option + 10.7 IMMEDIATE ARBITRATION boot option 11. Some constants and flags of the ncr53c8xx.h header file 12. Installation 13. Architecture dependent features @@ -43,6 +68,8 @@ 14.4 Possible data corruption during a Memory Write and Invalidate 14.5 IRQ sharing problems 15. SCSI problem troubleshooting + 15.1 Problem tracking + 15.2 Understanding hardware error reports 16. Synchonous transfer negotiation tables 16.1 Synchronous timings for 53C875 and 53C860 Ultra-SCSI controllers 16.2 Synchronous timings for fast SCSI-2 53C8XX controllers @@ -69,11 +96,12 @@ It is now available as a bundle of 2 drivers: - ncr53c8xx generic driver that supports all the SYM53C8XX family including - the ealiest 810 rev. 1 and the latest 896 2 channels LVD SCSI controller. + the ealiest 810 rev. 1, the latest 896 (2 channel LVD SCSI controller) and + the new 895A (1 channel LVD SCSI controller). - sym53c8xx enhanced driver (a.k.a. 896 drivers) that drops support of oldest chips in order to gain advantage of new features, as LOAD/STORE intructions available since the 810A and hardware phase mismatch available with the - latest 896. + 896 and the 895A. You can find technical information about the NCR 8xx family in the PCI-HOWTO written by Michael Will and in the SCSI-HOWTO written by @@ -95,15 +123,17 @@ These tools are not ALPHA but quite clean and work quite well. It is essential you have the 'scsiinfo' package. -This short documentation only describes the features of the NCR53C8XX -driver, configuration parameters and control commands available -through the proc SCSI file system read / write operations. +This short documentation describes the features of the generic and enhanced +drivers, configuration parameters and control commands available through +the proc SCSI file system read / write operations. This driver has been tested OK with linux/i386, Linux/Alpha and Linux/PPC. Latest driver version and patches are available at: ftp://ftp.tux.org/pub/people/gerard-roudier +or + ftp://ftp.symbios.com/mirror/ftp.tux.org/pub/tux/roudier/drivers I am not a native speaker of English and there are probably lots of mistakes in this README file. Any help will be welcome. @@ -136,6 +166,7 @@ 875 Y Y FAST20 40 MB/s Y Y 876 Y Y FAST20 40 MB/s Y Y 895 Y Y FAST40 80 MB/s Y Y +895A Y Y FAST40 80 MB/s Y Y 896 Y Y FAST40 80 MB/s Y Y @@ -156,21 +187,25 @@ 3.1 Optimized SCSI SCRIPTS. -The 810A, 825A, 875, 895 and newest 896 support new SCSI SCRIPTS instructions -named LOAD and STORE that allow to move 1 DWORD from/to an IO register to/from -memory much faster that the MOVE MEMORY instruction that is supported by the -53c7xx and 53c8xx family. The LOAD/STORE instructions support absolute and -DSA relative addressing modes. The SCSI SCRIPTS had been entirely rewritten -using LOAD/STORE instead of MOVE MEMORY instructions. +The 810A, 825A, 875, 895, 896 and 895A support new SCSI SCRIPTS instructions +named LOAD and STORE that allow to move up to 1 DWORD from/to an IO register +to/from memory much faster that the MOVE MEMORY instruction that is supported +by the 53c7xx and 53c8xx family. +The LOAD/STORE instructions support absolute and DSA relative addressing +modes. The SCSI SCRIPTS had been entirely rewritten using LOAD/STORE instead +of MOVE MEMORY instructions. 3.2 New features of the SYM53C896 (64 bit PCI dual LVD SCSI controller) -The 896 allows to handle the phase mismatch context saving from SCRIPTS -(avoids the phase mismatch interrupt that stops the SCSI processor +The 896 and the 895A allows handling of the phase mismatch context from +SCRIPTS (avoids the phase mismatch interrupt that stops the SCSI processor until the C code has saved the context of the transfer). Implementing this without using LOAD/STORE instructions would be painfull -and I did'nt even try it. This chip also supports 64 bit PCI transactions -and addressing. The SCRIPTS processor is not true 64 bit, but uses segment +and I did'nt even want to try it. + +The 896 chip supports 64 bit PCI transactions and addressing, while the +895A supports 32 bit PCI transactions and 64 bit addressing. +The SCRIPTS processor of these chips is not true 64 bit, but uses segment registers for bit 32-63. Another interesting feature is that LOAD/STORE instructions that address the on-chip RAM (8k) remain internal to the chip. @@ -219,9 +254,13 @@ is currently set to 8 by default. This value is suitable for most SCSI disks. With large SCSI disks (>= 2GB, cache >= 512KB, average seek time <= 10 ms), using a larger value may give better performances. -The driver supports up to 64 commands per device, but using more than -32 is generally not worth it, unless you are using a very large disk -or disk array. + +The sym53c8xx driver supports up to 255 commands per device, and the +generic ncr53c8xx driver supports up to 64, but using more than 32 is +generally not worth-while, unless you are using a very large disk or disk +array. It is noticeable that most of recent hard disks seem not to accept +more than 64 simultaneous commands. So, using more than 64 queued commands +is probably just resource wasting. If your controller does not have NVRAM or if it is managed by the SDMS BIOS/SETUP, you can configure tagged queueing feature and device queue @@ -491,6 +530,24 @@ The driver default verbose level is 1. This command allows to change th driver verbose level after boot-up. +8.9 Reset all logical units of a target + + resetdev + + target: target number + The driver will try to send a BUS DEVICE RESET message to the target. + (Only supported by the SYM53C8XX driver and provided for test purpose) + +8.10 Abort all tasks of all logical units of a target + + cleardev + + target: target number + The driver will try to send a ABORT message to all the logical units + of the target. + (Only supported by the SYM53C8XX driver and provided for test purpose) + + 9. Configuration parameters If the firmware of all your devices is perfect enough, all the @@ -566,10 +623,11 @@ Setup commands can be passed to the driver either at boot time or as a string variable using 'insmod'. -A boot setup command for the ncr53c8xx driver begins with the driver name -"ncr53c8xx=". The kernel syntax parser then expects an optionnal list of -integers separated with comma followed by an optionnal list of comma- -separated strings. Example of boot setup command under lilo prompt: +A boot setup command for the ncr53c8xx (sym53c8xx) driver begins with the +driver name "ncr53c8xx="(sym53c8xx). The kernel syntax parser then expects +an optionnal list of integers separated with comma followed by an optional +list of comma-separated strings. Example of boot setup command under lilo +prompt: lilo: linux root=/dev/hda2 ncr53c8xx=tags:4,sync:10,debug:0x200 @@ -582,7 +640,7 @@ The following command will install driver module with the same options as above. -insmod ncr53c8xx.o ncr53c8xx="tags:4 sync:10 debug:0x200" + insmod ncr53c8xx.o ncr53c8xx="tags:4 sync:10 debug:0x200" For the moment, the integer list of arguments is discarded by the driver. It will be used in the future in order to allow a per controller setup. @@ -590,40 +648,53 @@ Each string argument must be specified as "keyword:value". Only lower-case characters and digits are allowed. +In a system that contains multiple 53C8xx adapters insmod will install the +specified driver on each adapter. To exclude a chip use the 'excl' keyword. + +The sequence of commands, + + insmod sym53c8xx sym53c8xx=excl:0x1400 + insmod ncr53c8xx + +installs the sym53c8xx driver on all adapters except the one at IO port +address 0x1400 and then installs the ncr53c8xx driver to the adapter at IO +port address 0x1400. + + 10.2 Available arguments -Master parity checking - mpar:y enabled - mpar:n disabled - -Scsi parity checking - spar:y enabled - spar:n disabled - -Scsi disconnections - disc:y enabled - disc:n disabled +10.2.1 Master parity checking + mpar:y enabled + mpar:n disabled + +10.2.2 Scsi parity checking + spar:y enabled + spar:n disabled + +10.2.3 Scsi disconnections + disc:y enabled + disc:n disabled -Special features +10.2.4 Special features Only apply to 810A, 825A, 860, 875 and 895 controllers. Have no effect with other ones. - specf:y (or 1) enabled - specf:n (or 0) disabled - specf:3 enabled except Memory Write And Invalidate + specf:y (or 1) enabled + specf:n (or 0) disabled + specf:3 enabled except Memory Write And Invalidate The default driver setup is 'specf:3'. As a consequence, option 'specf:y' must be specified in the boot setup command to enable Memory Write And Invalidate. -Ultra SCSI support +10.2.5 Ultra SCSI support Only apply to 860, 875 and 895 controllers. Have no effect with other ones. - ultra:2 Ultra2 enabled - ultra:1 Ultra enabled - ultra:n disabled - -Default number of tagged commands - tags:0 (or tags:1 ) tagged command queuing disabled - tags:#tags (#tags > 1) tagged command queuing enabled + ultra:2 Ultra2 enabled + ultra:1 Ultra enabled + ultra:n disabled + +10.2.6 Default number of tagged commands + tags:0 (or tags:1 ) tagged command queuing disabled + tags:#tags (#tags > 1) tagged command queuing enabled #tags will be truncated to the max queued commands configuration parameter. This option also allows to specify a command queue depth for each device that support tagged command queueing. @@ -635,9 +706,9 @@ - controller #1 target #1 logical unit #2 -> 32 commands, - all other logical units (all targets, all controllers) -> 10 commands. -Default synchronous period factor - sync:255 disabled (asynchronous transfer mode) - sync:#factor +10.2.7 Default synchronous period factor + sync:255 disabled (asynchronous transfer mode) + sync:#factor #factor = 10 Ultra-2 SCSI 40 Mega-transfers / second #factor = 11 Ultra-2 SCSI 33 Mega-transfers / second #factor < 25 Ultra SCSI 20 Mega-transfers / second @@ -646,19 +717,19 @@ In all cases, the driver will use the minimum transfer period supported by controllers according to NCR53C8XX chip type. -Negotiate synchronous with all devices - (force sync nego) - fsn:y enabled - fsn:n disabled - -Verbosity level - verb:0 minimal - verb:1 normal - verb:2 too much - -Debug mode - debug:0 clear debug flags - debug:#x set debug flags +10.2.8 Negotiate synchronous with all devices + (force sync nego) + fsn:y enabled + fsn:n disabled + +10.2.9 Verbosity level + verb:0 minimal + verb:1 normal + verb:2 too much + +10.2.10 Debug mode + debug:0 clear debug flags + debug:#x set debug flags #x is an integer value combining the following power-of-2 values: DEBUG_ALLOC 0x1 DEBUG_PHASE 0x2 @@ -677,10 +748,10 @@ You can play safely with DEBUG_NEGO. However, some of these flags may generate bunches of syslog messages. -Burst max - burst:0 burst disabled - burst:255 get burst length from initial IO register settings. - burst:#x burst enabled (1<<#x burst transfers max) +10.2.11 Burst max + burst:0 burst disabled + burst:255 get burst length from initial IO register settings. + burst:#x burst enabled (1<<#x burst transfers max) #x is an integer value which is log base 2 of the burst transfers max. The NCR53C875 and NCR53C825A support up to 128 burst transfers (#x = 7). Other chips only support up to 16 (#x = 4). @@ -688,42 +759,42 @@ and revision ids. By default the driver uses the maximum value supported by the chip. -LED support - led:1 enable LED support - led:0 disable LED support +10.2.12 LED support + led:1 enable LED support + led:0 disable LED support Donnot enable LED support if your scsi board does not use SDMS BIOS. (See 'Configuration parameters') -Max wide - wide:1 wide scsi enabled - wide:0 wide scsi disabled +10.2.13 Max wide + wide:1 wide scsi enabled + wide:0 wide scsi disabled Some scsi boards use a 875 (ultra wide) and only supply narrow connectors. If you have connected a wide device with a 50 pins to 68 pins cable converter, any accepted wide negotiation will break further data transfers. In such a case, using "wide:0" in the bootup command will be helpfull. -Differential mode - diff:0 never set up diff mode - diff:1 set up diff mode if BIOS set it - diff:2 always set up diff mode - diff:3 set diff mode if GPIO3 is not set - -IRQ mode - irqm:0 always open drain - irqm:1 same as initial settings (assumed BIOS settings) - irqm:2 always totem pole - irqm:0x10 driver will not use SA_SHIRQ flag when requesting irq - irqm:0x20 driver will not use SA_INTERRUPT flag when requesting irq +10.2.14 Differential mode + diff:0 never set up diff mode + diff:1 set up diff mode if BIOS set it + diff:2 always set up diff mode + diff:3 set diff mode if GPIO3 is not set + +10.2.15 IRQ mode + irqm:0 always open drain + irqm:1 same as initial settings (assumed BIOS settings) + irqm:2 always totem pole + irqm:0x10 driver will not use SA_SHIRQ flag when requesting irq + irqm:0x20 driver will not use SA_INTERRUPT flag when requesting irq (Bits 0x10 and 0x20 can be combined with hardware irq mode option) -Reverse probe - revprob:n probe chip ids from the PCI configuration in this order: - 810, 815, 820, 860, 875, 885, 895, 896 - revprob:y probe chip ids in the reverse order. +10.2.16 Reverse probe + revprob:n probe chip ids from the PCI configuration in this order: + 810, 815, 820, 860, 875, 885, 895, 896 + revprob:y probe chip ids in the reverse order. -Fix up PCI configuration space - pcifix: